harperdb 4.5.23 → 4.5.24

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.
@@ -19,8 +19,8 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
19
19
  `},"serialize"),compressible:!1,q:.8});$r.set("application/x-www-form-urlencoded",{deserialize(e){let t=Buffer.isBuffer(e)?e.toString("utf8"):e,r={};for(let[n,s]of new URLSearchParams(t))if(r.hasOwnProperty(n)){let i=r[n];Array.isArray(i)?i.push(s):r.key=[i,s]}else r[n]=s;return r},serialize(e){let t=new URLSearchParams;for(let r in e)t.set(r,e);return t.toString()}});ML={type:"application/json",serializeStream:Af,serialize:wf,deserialize:r3,q:.5};$r.set("*/*",ML);$r.set("",ML);a(r3,"tryJSONParse");a(Cf,"registerContentHandlers");n3=require("fastify-plugin"),s3=n3(function(e,t,r){e.addHook("preSerialization",async(n,s)=>{if(s.raw.getHeader("content-type"))return;let{serializer:o,type:c}=pm(n.raw);s.type(c),s.serializer(function(l){let u;if(typeof l=="object"&&l&&(l[Symbol.iterator]||l[Symbol.asyncIterator])&&o.serializeStream){if(l.mapError){let f=l.getColumns;l=l.mapError(d=>(d.toJSON=()=>({error:d.name,message:d.message,...d.partialObject}),d)),l.getColumns=f}u=o.serializeStream}else u=o.serialize;return u(l,{headers:{set:a((f,d)=>{s.header(f,d)},"set")}})})}),r()},{name:"content-type-negotiation"});a(pm,"findBestSerializer");IL=ZA.default.get(B.HTTP_COMPRESSIONTHRESHOLD);a(Pf,"serialize");a(aa,"serializeMessage");a(JA,"asyncSerialization");a(XA,"hasAsyncSerialization");a(i3,"streamToBuffer");o3=["ascii","utf8","utf-8","utf16le","utf-16le","ucs2","ucs-2","base64","base64url","latin1","binary","hex"];a(a3,"isBufferEncoding");a(c3,"parseContentType");a(no,"getDeserializer");a(l3,"deserializerUnknownType");a(u3,"transformIterable");a(hm,"toCsvStream")});var sR={};Be(sR,{start:()=>S3});function d3(e){if(e.kind!==ve.Kind.OPERATION_DEFINITION&&e.kind!==ve.Kind.FRAGMENT_DEFINITION)throw new yr(`Unexpected non-executable definition type ${e.kind}.`)}function UL(e){if(typeof e!="object"||e===null)throw new Ti("Request body must be an object.");if(!("query"in e))throw new Ti("Request body must contain a `query` field.");if(typeof e.query!="string")throw new Ti("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new Ti("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new Ti("Request body `operationName` field must be a string.")}function nR(e){return parseInt(e.value,10)}function BL(e){return parseFloat(e.value)}function HL(e,t,r){let n=r.get(e.name.value);return kL(n)?FL(n,t):{attribute:t,value:n}}function kL(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function FL(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],kL(n)?FL(n,t):{attribute:t,value:n}))}function f3(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case ve.Kind.NULL:return{attribute:t,value:null};case ve.Kind.INT:return{attribute:t,value:nR(e.value)};case ve.Kind.FLOAT:return{attribute:t,value:BL(e.value)};case ve.Kind.BOOLEAN:case ve.Kind.STRING:return{attribute:t,value:e.value.value};case ve.Kind.VARIABLE:return HL(e.value,t,r);case ve.Kind.OBJECT:return GL(e.value,t,r);case ve.Kind.LIST:case ve.Kind.ENUM:default:throw new yr(`Value type, ${e.value.kind}, is not supported.`)}}function GL(e,t,r){return e.fields.flatMap(n=>f3(n,t,r))}function _3(e,t){switch(e.value.kind){case ve.Kind.NULL:return{attribute:e.name.value,value:null};case ve.Kind.INT:return{attribute:e.name.value,value:nR(e.value)};case ve.Kind.FLOAT:return{attribute:e.name.value,value:BL(e.value)};case ve.Kind.BOOLEAN:case ve.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case ve.Kind.VARIABLE:return HL(e.value,e.name.value,t);case ve.Kind.OBJECT:return GL(e.value,[e.name.value],t);case ve.Kind.LIST:case ve.Kind.ENUM:default:throw new yr(`Argument type, ${e.value.kind}, is not supported.`)}}function h3(e,t){return e.flatMap(r=>_3(r,t))}function mm(e,t){return e.selections.flatMap(r=>{switch(r.kind){case ve.Kind.FIELD:return r;case ve.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new yr(`Fragment \`${n}\` not found.`);return mm(s.selectionSet,t)}case ve.Kind.INLINE_FRAGMENT:return mm(r.selectionSet,t)}})}function qL(e,t){return mm(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:qL(r.selectionSet,t)}:r.name.value)}async function p3(e,t,r,n){let s=ds.getMatch(e.name.value,"graphql");if(s===void 0)throw new yr(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,o={select:qL(e.selectionSet,r),conditions:h3(e.arguments,t)},c=[];n.authorize=!0;for await(let l of i.search(o,n))c.push(l);return[e.name.value,c]}function $L(e){switch(e.kind){case ve.Kind.NULL:return null;case ve.Kind.INT:return nR(e);case ve.Kind.FLOAT:return parseFloat(e.value);case ve.Kind.STRING:case ve.Kind.BOOLEAN:return e.value;case ve.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:$L(r.value),...t}),{});case ve.Kind.LIST:case ve.Kind.ENUM:default:throw new yr(`Value type, ${e.kind}, is not supported.`)}}function m3(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=$L(n.defaultValue)),n.type.kind===ve.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new yr(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function E3(e,t,r,n){if(e.operation===ve.OperationTypeNode.SUBSCRIPTION)throw new yr("Subscriptions are not supported.");if(e.operation===ve.OperationTypeNode.MUTATION)throw new yr("Mutations are not supported yet.");let s=m3(e.variableDefinitions,t),i=await Promise.all(mm(e.selectionSet,r).map(c=>p3(c,s,r,n))),o={data:{}};for(let[c,l]of i)o.data[c]=l;return o}async function xL({query:e,variables:t={},operationName:r},n){let s=ve.parse(e),i=new Map,o=new Map;for(let u of s.definitions)if(d3(u),u.kind===ve.Kind.FRAGMENT_DEFINITION)o.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new yr("Unnamed operations are only allowed when there is a single operation in the document.");let f=u.name?.value??"Unnamed Query";if(i.has(f))throw new yr(`Duplicate operation definition: ${f}`);i.set(f,u)}let c;if(r==null)if(i.size===1)c=i.entries().next().value[1];else throw new yr("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new yr(`Operation \`${r}\` not found.`);let l=await E3(c,t,o,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function g3(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 UL(r),xL(r,e)}case"POST":{let r=await no(e.headers.get("content-type"),!0)(e._nodeRequest);return UL(r),xL(r,e)}default:throw new Ti("Method Not Allowed",405,{Allow:"GET, POST"})}}function S3(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await g3(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof Ti)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof ve.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof yr)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 Ti)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof ve.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof yr)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 ve,yr,Ti,VL=be(()=>{ve=M(require("graphql"));eo();Xl();a(d3,"assertExecutableDefinitionNode");a(UL,"assertRequestParams");a(nR,"processIntValueNode");a(BL,"processFloatValueNode");a(HL,"processVariableNode");a(kL,"isObject");a(FL,"transformObjectIntoQueryCondition");a(f3,"processObjectFieldNode");a(GL,"processObjectValueNode");a(_3,"processArgumentNode");a(h3,"buildConditionsQuery");a(mm,"fillInFragments");a(qL,"buildSelectQuery");a(p3,"processFieldNode");a($L,"processConstValueNode");a(m3,"resolveVariables");a(E3,"executeOperation");a(xL,"resolver");yr=class extends Error{static{a(this,"GraphQLQueryingError")}},Ti=class extends Error{static{a(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};a(g3,"graphqlQueryingHandler");a(S3,"start")});var Ri=P((mRe,WL)=>{"use strict";var YL=oe(),KL=(G(),D($)),tu=/^[\x20-\x2E|\x30-\x5F|\x61-\x7E]*$/,Ai=require("joi"),ca={schema_format:{pattern:tu,message:"names cannot include backticks or forward slashes"},schema_length:{minimum:1,maximum:250,tooLong:"cannot exceed 250 characters"}},T3=Ai.alternatives(Ai.string().min(1).max(ca.schema_length.maximum).pattern(tu).messages({"string.pattern.base":"{:#label} "+ca.schema_format.message}),Ai.number(),Ai.array()).required(),A3=Ai.alternatives(Ai.string().min(1).max(ca.schema_length.maximum).pattern(tu).messages({"string.pattern.base":"{:#label} "+ca.schema_format.message}),Ai.number()),R3=Ai.alternatives(Ai.string().min(1).max(ca.schema_length.maximum).pattern(tu).messages({"string.pattern.base":"{:#label} "+ca.schema_format.message}),Ai.number()).required();function y3(e,t){return t?typeof t!="string"?`'${e}' must be a string`:t.length?t.length>ca.schema_length.maximum?`'${e}' maximum of 250 characters`:tu.test(t)?"":`'${e}' has illegal characters`:`'${e}' must be at least one character`:`'${e}' is required`}a(y3,"checkValidTable");function b3(e,t){return YL.doesSchemaExist(e)?e:t.message(`Database '${e}' does not exist`)}a(b3,"validateSchemaExists");function O3(e,t){let r=t.state.ancestors[0].schema;return YL.doesTableExist(r,e)?e:t.message(`Table '${e}' does not exist`)}a(O3,"validateTableExists");function N3(e,t){return e.toLowerCase()===KL.SYSTEM_SCHEMA_NAME?t.message(`'subscriptions[${t.state.path[1]}]' invalid database name, '${KL.SYSTEM_SCHEMA_NAME}' name is reserved`):e}a(N3,"validateSchemaName");WL.exports={common_validators:ca,schema_regex:tu,hdb_schema_table:T3,validateSchemaExists:b3,validateTableExists:O3,validateSchemaName:N3,checkValidTable:y3,hdb_database:A3,hdb_table:R3}});var oR=P((gRe,jL)=>{var{hdb_table:w3,hdb_database:zL}=Ri(),I3=st(),iR=require("joi"),C3={undefined:"undefined",null:"null"},P3=a((e,t)=>{let r=Object.keys(e),n=r.length,s;for(let i=0;i<n;i++){let o=r[i];(!o||o.length===0||C3[o]!==void 0)&&(s===void 0?s=`Invalid attribute name: '${o}'`:s+=`. Invalid attribute name: '${o}'`)}return s?t.message(s):e},"custom_records_val"),D3=iR.object({database:zL,schema:zL,table:w3,records:iR.array().items(iR.object().custom(P3)).required()});jL.exports=function(e){return I3.validateBySchema(e,D3)}});var JL=P((TRe,QL)=>{"use strict";var aR=class{static{a(this,"BridgeMethods")}createSchema(){throw new Error("createSchema bridge method is not defined")}dropSchema(){throw new Error("dropSchema bridge method is not defined")}createTable(){throw new Error("createTable bridge method is not defined")}dropTable(){throw new Error("dropTable bridge method is not defined")}createRecords(){throw new Error("createRecords bridge method is not defined")}updateRecords(){throw new Error("updateRecords bridge method is not defined")}async upsertRecords(){throw new Error("upsertRecords bridge method is not defined")}deleteRecords(){throw new Error("deleteRecords bridge method is not defined")}createAttribute(){throw new Error("createAttribute bridge method is not defined")}dropAttribute(){throw new Error("dropAttribute bridge method is not defined")}searchByConditions(){throw new Error("searchByConditions bridge method is not defined")}searchByHash(){throw new Error("searchByHash bridge method is not defined")}searchByValue(){throw new Error("searchByValue bridge method is not defined")}getDataByHash(){throw new Error("getDataByHash bridge method is not defined")}getDataByValue(){throw new Error("getDataByValue bridge method is not defined")}deleteRecordsBefore(){throw new Error("deleteRecordsBefore bridge method is not defined")}deleteAuditLogsBefore(){throw new Error("deleteAuditLogsBefore bridge method is not defined")}async readAuditLog(){throw new Error("readAuditLog bridge method is not defined")}};QL.exports=aR});var ZL=P((RRe,XL)=>{"use strict";var cR=class{static{a(this,"DBIDefinition")}constructor(t=!1,r=!1){this.dup_sort=t,this.is_hash_attribute=r,this.useVersions=r}};XL.exports=cR});var sM={};Be(sM,{HAS_EXPIRATION:()=>Sm,HAS_RESIDENCY_ID:()=>pR,HAS_STRUCTURE_UPDATE:()=>Am,LAST_TIMESTAMP_PLACEHOLDER:()=>vf,LOCAL_TIMESTAMP:()=>L3,METADATA:()=>bc,NEW_TIMESTAMP_PLACEHOLDER:()=>tM,NO_TIMESTAMP:()=>lR,PENDING_LOCAL_TIME:()=>mR,PREVIOUS_TIMESTAMP_PLACEHOLDER:()=>hR,RecordEncoder:()=>_R,TIMESTAMP_ASSIGN_LAST:()=>v3,TIMESTAMP_ASSIGN_NEW:()=>rM,TIMESTAMP_ASSIGN_PREVIOUS:()=>nM,TIMESTAMP_PLACEHOLDER:()=>Em,TIMESTAMP_RECORD_PREVIOUS:()=>uR,handleLocalTimeForGets:()=>Rm,recordUpdater:()=>ER,removeEntry:()=>Nc});function x3(){return Mf[0]=Mf[0]^64,M3.getFloat64(0)}function Rm(e,t){let r=e.getEntry;e.readCount=0,e.cachePuts=!1,e.rootStore=t,e.encoder.rootStore=t,e.getEntry=function(o,c){e.readCount++;let l=r.call(this,o,c),u=l?.value,f=u?.[bc];return f>=0&&(l.metadataFlags=f,l.localTime=u.localTime,l.value=u.value,l.residencyId=u.residencyId,u.expiresAt>=0&&(l.expiresAt=u.expiresAt)),l&&(l.key=o),l};let n=e.get;e.get=function(o,c){let l=n.call(this,o,c);return l?.[bc]>=0?l.value:l};let s=e.getRange;e.getRange=function(o){let c=s.call(this,o);return o.valuesForKey?c.map(l=>l?.value):o.values===!1||o.onlyCount?c:c.map(l=>{let u=l.value,f=u[bc];return f>=0&&(l.metadataFlags=f,l.localTime=u.localTime,l.value=u.value,l.residencyId=u.residencyId,u.expiresAt>=0&&(l.expiresAt=u.expiresAt)),l})};let i=e.useReadTransaction();if(i.done(),!i.done.isTracked){let o=i.constructor,c=i.use,l=i.done;o.prototype.use=function(){this.timerTracked||(this.timerTracked=!0,yc.push(new WeakRef(this))),c.call(this)},o.prototype.done=function(){if(l.call(this),this.isDone)for(let u=0;u<yc.length;u++){let f=yc[u].deref();(!f||f.isDone||f.isCommitted)&&yc.splice(u--,1)}},o.prototype.done.isTracked=!0}return e}function ER(e,t,r){return function(n,s,i,o,c=-1,l,u,f="put",d,h){d||l==null?ru=i?.localTime?uR|nM:lR:ru=l?i?.localTime?uR|16384:rM|16384:lR;let _=u?.expiresAt;if(_>=0&&(c|=Sm),Lf=c,dR=_,i?.version===o&&l===!1)throw new Error("Must retain local time if version is not changed");let p={version:o,instructedWrite:ru>0},S,g=0;try{let R=i?.residencyId,E=u?.residencyId;E&&(fR=E,Lf|=pR,g|=wc),R!==E&&(g|=Ic,R||(R=0)),c&Sm&&(g|=xf),u?.originatingOperation&&(g|=Uf),d&&(p.ifVersion=S=i?.version??null),i&&i.value&&i.metadataFlags&pn&&(r.getBinaryFast(i.localTime)||oa(i.value));let T;if(s!==void 0&&(T=dm(()=>e.put(n,s,p),n,e.rootStore),Sc&&(g|=pn)),l){let O=u?.user?.username;if(h&&(dm(()=>e.encoder.encode(h),n,e.rootStore),Sc&&(g|=pn)),e.encoder.hasStructureUpdate&&(g|=Am,e.encoder.hasStructureUpdate=!1),d&&i?.localTime){let v=i?.localTime,F=r.get(v);if(F){let q=Pt(F).previousLocalTime;return T=r.put(v,Oc(o,t,n,q,u?.nodeId??server.replication.getThisNodeId(r)??0,O,f,Df,g,E,R,_),{ifVersion:S}),T}}T=r.put(s===void 0?tM:vf,Oc(o,t,n,i?.localTime?1:0,u?.nodeId??server.replication?.getThisNodeId(r)??0,O,f,Df,g,E,R,_,u?.originatingOperation),{append:f!=="invalidate",instructedWrite:!0,ifVersion:S})}return T}catch(R){throw R.message+=" id: "+n+" options: "+p,R}}}function Nc(e,t,r){if(t)return t.value&&t.metadataFlags&pn&&!e.auditStore.getBinaryFast(t.localTime)&&oa(t.value),e.remove(t.key,r)}var eM,gm,Em,vf,hR,tM,L3,bc,Mf,M3,lR,rM,v3,nM,uR,Sm,pR,mR,Am,U3,Df,ru,Lf,dR,fR,_R,yc,nu=be(()=>{eM=require("msgpackr");so();gm=M(X());_s();_s();Em=new Uint8Array([1,1,1,1,4,64,0,0]),vf=new Uint8Array([1,1,1,1,1,0,0,0]),hR=new Uint8Array([1,1,1,1,3,64,0,0]),tM=new Uint8Array([1,1,1,1,0,64,0,0]),L3=Symbol("local-timestamp"),bc=Symbol("metadata"),Mf=new Uint8Array(8),M3=new DataView(Mf.buffer,0,8),lR=0,rM=0,v3=1,nM=3,uR=4,Sm=16,pR=32,mR=1,Am=256,ru=0,Lf=-1,dR=-1,fR=0,_R=class extends eM.Encoder{static{a(this,"RecordEncoder")}constructor(t){t.useBigIntExtension=!0,super(t);let r=this.encode;this.encode=function(s,i){if(ru||Lf>=0){let o=0,c=ru;c&&(o+=8,ru=0);let l=Lf,u=dR,f=fR;l>=0&&(o+=4,Lf=-1,u>=0&&(o+=8,dR=-1),f&&(o+=4,fR=0));let d=U3=r.call(this,s,i|2048|o);Df=d.subarray((d.start||0)+o,d.end);let h=d.start||0;return c&&(Em[4]=c,Em[5]=c>>8,d.set(Em,h),h+=8),Sc&&(l|=pn),l>=0&&((d.dataView||(d.dataView=new DataView(d.buffer,d.byteOffset,d.byteLength))).setUint32(h,l|Tm<<24),h+=4,u>=0&&((d.dataView||(d.dataView=new DataView(d.buffer,d.byteOffset,d.byteLength))).setFloat64(h,u),h+=8),f&&(d.dataView||(d.dataView=new DataView(d.buffer,d.byteOffset,d.byteLength))).setUint32(h,f)),d}else return Df=r.call(this,s,i),Df};let n=this.saveStructures;this.saveStructures=function(s,i){let o=n.call(this,s,i);return this.hasStructureUpdate=!0,o}}decode(t,r){let n=r?.start||0,s=r>-1?r:r?.end||t.length,i=t[n],o=0;try{if(i<32&&s>2){let c=n,l;if(i===2){if(t.copy)t.copy(Mf,0,c),c+=8;else for(let h=0;h<8;h++)Mf[h]=t[c++];l=x3(),i=t[c]}let u,f;i<32&&(i===Tm?(o=(t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).getUint32(c),c+=4):(o=i|t[c+1]<<5,c+=2),o&Sm&&(u=(t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).getFloat64(c),c+=8),o&pR&&(f=(t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).getUint32(c),c+=4));let d=Tc(()=>r?.valueAsBuffer?t.subarray(c,s):super.decode(t.subarray(c,s),s-c),this.rootStore);return{localTime:l,value:d,[bc]:o,expiresAt:u,residencyId:f}}return r?.valueAsBuffer?t:Tc(()=>super.decode(t,r),this.rootStore)}catch(c){return gm.error("Error decoding record",c,"data: "+t.slice(0,40).toString("hex")),null}}};a(x3,"getTimestamp");a(Rm,"handleLocalTimeForGets");yc=[];setInterval(()=>{for(let e=0;e<yc.length;e++){let t=yc[e].deref();!t||t.isDone||t.isCommitted?yc.splice(e--,1):t.notCurrent&&(t.openTimer?(t.openTimer>3&&(t.openTimer>60?(gm.error("Read transaction detected that has been open too long (over 15 minutes), ending transaction",t),t.done()):gm.error("Read transaction detected that has been open too long (over one minute), make sure read transactions are quickly closed",t)),t.openTimer++):t.openTimer=1)}},15e3).unref();a(ER,"recordUpdater");a(Nc,"removeEntry")});var Bf=P((IRe,oM)=>{"use strict";var iM=ce(),B3=(G(),D($)),{RecordEncoder:H3}=(nu(),D(sM));iM.initSync();var k3=iM.get(B3.CONFIG_PARAMS.STORAGE_CACHING)!==!1,gR=class{static{a(this,"OpenDBIObject")}constructor(t,r=!1){this.dupSort=t===!0,this.encoding=t?"ordered-binary":"msgpack",this.useVersions=r,this.sharedStructuresKey=Symbol.for("structures"),r&&(this.cache=k3&&{validated:!0},this.randomAccessStructure=!0,this.freezeData=!0,this.encoder={Encoder:H3})}};oM.exports=gR});var Hf=P((PRe,aM)=>{"use strict";var Hn=ce(),hs=(G(),D($));Hn.initSync();var ym=class{static{a(this,"OpenEnvironmentObject")}constructor(t,r=!1){this.path=t,this.mapSize=1073741824,this.maxDbs=1e4,this.maxReaders=2048,this.sharedStructuresKey=Symbol.for("structures"),this.readOnly=r,this.trackMetrics=!0,this.eventTurnBatching=!1,this.noSync=Hn.get(hs.CONFIG_PARAMS.STORAGE_WRITEASYNC)===!0||Hn.get(hs.CONFIG_PARAMS.STORAGE_WRITEASYNC)==="true"||Hn.get(hs.CONFIG_PARAMS.STORAGE_WRITEASYNC)==="TRUE",Hn.get(hs.CONFIG_PARAMS.STORAGE_OVERLAPPINGSYNC)!==void 0&&(this.overlappingSync=Hn.get(hs.CONFIG_PARAMS.STORAGE_OVERLAPPINGSYNC)),Hn.get(hs.CONFIG_PARAMS.STORAGE_MAXFREESPACETOLOAD)&&(this.maxFreeSpaceToLoad=Hn.get(hs.CONFIG_PARAMS.STORAGE_MAXFREESPACETOLOAD)),Hn.get(hs.CONFIG_PARAMS.STORAGE_MAXFREESPACETORETAIN)&&(this.maxFreeSpaceToRetain=Hn.get(hs.CONFIG_PARAMS.STORAGE_MAXFREESPACETORETAIN)),Hn.get(hs.CONFIG_PARAMS.STORAGE_PAGESIZE)&&(this.pageSize=Hn.get(hs.CONFIG_PARAMS.STORAGE_PAGESIZE)),this.noReadAhead=Hn.get(hs.CONFIG_PARAMS.STORAGE_NOREADAHEAD)}};aM.exports=ym;ym.MAX_DBS=1e4});var ht=P((LRe,EM)=>{"use strict";var TR=require("lmdb"),Fs=require("fs-extra"),kn=require("path"),bm=ln(),uM=X(),mn=Ln().LMDB_ERRORS_ENUM,Om=ZL(),AR=Bf(),dM=Hf(),la=Ft(),cM=(G(),D($)),{table:F3,resetDatabases:G3}=(Ue(),D(ct)),lM=ce(),Gs=la.INTERNAL_DBIS_NAME,fM=la.DBI_DEFINITION_NAME,q3="data.mdb",$3="lock.mdb",kf=".mdb",V3="-lock",SR=class{static{a(this,"TransactionCursor")}constructor(t,r,n=!1){this.dbi=ps(t,r),this.key_type=this.dbi[la.DBI_DEFINITION_NAME].key_type,this.is_hash_attribute=this.dbi[la.DBI_DEFINITION_NAME].is_hash_attribute,this.txn=t.beginTxn({readOnly:n===!1}),this.cursor=new TR.Cursor(this.txn,this.dbi)}close(){this.cursor.close(),this.txn.abort()}commit(){this.cursor.close(),this.txn.commit()}};function Nm(e,t){if(e===void 0)throw new Error(mn.BASE_PATH_REQUIRED);if(t===void 0)throw new Error(mn.ENV_NAME_REQUIRED)}a(Nm,"pathEnvNameValidation");async function RR(e,t,r=!0){try{await Fs.access(e)}catch(n){throw n.code==="ENOENT"?new Error(mn.INVALID_BASE_PATH):n}try{let n=kn.join(e,t+kf);return await Fs.access(n,Fs.constants.R_OK|Fs.constants.F_OK),n}catch(n){if(n.code==="ENOENT")if(r)try{return await Fs.access(kn.join(e,t,q3),Fs.constants.R_OK|Fs.constants.F_OK),kn.join(e,t)}catch(s){if(s.code==="ENOENT")throw new Error(mn.INVALID_ENVIRONMENT)}else throw new Error(mn.INVALID_ENVIRONMENT);throw n}}a(RR,"validateEnvironmentPath");function wm(e,t){if(bm.validateEnv(e),t===void 0)throw new Error(mn.DBI_NAME_REQUIRED)}a(wm,"validateEnvDBIName");async function K3(e,t,r=!1,n=!1){Nm(e,t);let s=kn.basename(e);t=t.toString();let i=lM.get(cM.CONFIG_PARAMS.DATABASES);i||lM.setProperty(cM.CONFIG_PARAMS.DATABASES,i={}),i[s]||(i[s]={}),i[s].path=e;try{return await RR(e,t,n),_M(e,t,r)}catch(o){if(o.message===mn.INVALID_ENVIRONMENT){let c=kn.join(e,t);await Fs.mkdirp(n?c:e);let l=new dM(n?c:c+kf,!1),u=TR.open(l);u.dbis=Object.create(null);let f=new AR(!1);u.openDB(Gs,f),global.lmdb_map===void 0&&(global.lmdb_map=Object.create(null));let d=yR(e,t,r);return u[la.ENVIRONMENT_NAME_KEY]=d,global.lmdb_map[d]=u,u}throw o}}a(K3,"createEnvironment");async function Y3(e,t,r,n=!0){Nm(e,t),t=t.toString();let s=kn.join(e,t);return F3({table:t,database:kn.parse(e).name,path:s,attributes:[{name:"id",isPrimaryKey:!0}]})}a(Y3,"copyEnvironment");async function _M(e,t,r=!1){Nm(e,t),t=t.toString();let n=yR(e,t,r);if(global.lmdb_map===void 0&&(global.lmdb_map=Object.create(null)),global.lmdb_map[n]!==void 0)return global.lmdb_map[n];let s=await RR(e,t),i=kn.join(e,t+kf),o=s!=i,c=new dM(s,o),l=TR.open(c);l.dbis=Object.create(null);let u=pM(l);for(let f=0;f<u.length;f++)ps(l,u[f]);return l[la.ENVIRONMENT_NAME_KEY]=n,global.lmdb_map[n]=l,l}a(_M,"openEnvironment");async function W3(e,t,r=!1){Nm(e,t),t=t.toString();let n=kn.join(e,t+kf),s=await RR(e,t);if(global.lmdb_map!==void 0){let i=yR(e,t,r);if(global.lmdb_map[i]){let o=global.lmdb_map[i];await hM(o),delete global.lmdb_map[i]}}await Fs.remove(s),await Fs.remove(s===n?s+V3:kn.join(kn.dirname(s),$3))}a(W3,"deleteEnvironment");async function hM(e){bm.validateEnv(e);let t=e[la.ENVIRONMENT_NAME_KEY];await e.close(),t!==void 0&&global.lmdb_map!==void 0&&delete global.lmdb_map[t]}a(hM,"closeEnvironment");function yR(e,t,r=!1){let s=`${kn.basename(e)}.${t}`;return r===!0&&(s=`txn.${s}`),s}a(yR,"getCachedEnvironmentName");function z3(e){bm.validateEnv(e);let t=Object.create(null),r=ps(e,Gs);for(let{key:n,value:s}of r.getRange({start:!1}))if(n!==Gs)try{t[n]=Object.assign(new Om,s)}catch{uM.warn(`an internal error occurred: unable to parse DBI Definition for ${n}`)}return t}a(z3,"listDBIDefinitions");function pM(e){bm.validateEnv(e);let t=[],r=ps(e,Gs);for(let{key:n}of r.getRange({start:!1}))n!==Gs&&t.push(n);return t}a(pM,"listDBIs");function j3(e,t){let n=ps(e,Gs).getEntry(t),s=new Om;if(n!==void 0){try{s=Object.assign(s,n.value)}catch{uM.warn(`an internal error occurred: unable to parse DBI Definition for ${n}`)}return s}}a(j3,"getDBIDefinition");function mM(e,t,r,n=!r){if(wm(e,t),t=t.toString(),t===Gs)throw new Error(mn.CANNOT_CREATE_INTERNAL_DBIS_NAME);try{return ps(e,t)}catch(s){if(s.message===mn.DBI_DOES_NOT_EXIST){let i=new AR(r,n===!0),o=e.openDB(t,i),c=new Om(r===!0,n);return o[fM]=c,ps(e,Gs).putSync(t,c),e.dbis[t]=o,o}throw s}}a(mM,"createDBI");function ps(e,t){if(wm(e,t),t=t.toString(),e.dbis[t]!==void 0)return e.dbis[t];let r;if(t!==Gs?r=j3(e,t):r=new Om,r===void 0)throw new Error(mn.DBI_DOES_NOT_EXIST);let n;try{let s=new AR(r.dup_sort,r.useVersions);if(n=e.openDB(t,s),n.db===void 0)throw new Error("MDB_NOTFOUND")}catch(s){throw s.message.includes("MDB_NOTFOUND")===!0?new Error(mn.DBI_DOES_NOT_EXIST):s}return n[fM]=r,e.dbis[t]=n,n}a(ps,"openDBI");function Q3(e,t){wm(e,t),t=t.toString();let r=ps(e,t),n=r.getStats();return r[la.DBI_DEFINITION_NAME].is_hash_attribute&&n.entryCount>0&&n.entryCount--,n}a(Q3,"statDBI");async function J3(e,t){try{let r=kn.join(e,t+kf);return(await Fs.stat(r)).size}catch{throw new Error(mn.INVALID_ENVIRONMENT)}}a(J3,"environmentDataSize");function X3(e,t){if(wm(e,t),t=t.toString(),t===Gs)throw new Error(mn.CANNOT_DROP_INTERNAL_DBIS_NAME);ps(e,t).dropSync(),e.dbis!==void 0&&delete e.dbis[t],ps(e,Gs).removeSync(t)}a(X3,"dropDBI");function Z3(e,t,r){let n;for(let s=0;s<r.length;s++){let i=r[s];if(!e.dbis[i])try{ps(e,i)}catch(o){if(o.message===mn.DBI_DOES_NOT_EXIST)mM(e,i,i!==t,i===t),n=!0;else throw o}}n&&G3()}a(Z3,"initializeDBIs");EM.exports={openDBI:ps,openEnvironment:_M,createEnvironment:K3,listDBIs:pM,listDBIDefinitions:z3,createDBI:mM,dropDBI:X3,statDBI:Q3,deleteEnvironment:W3,initializeDBIs:Z3,TransactionCursor:SR,environmentDataSize:J3,copyEnvironment:Y3,closeEnvironment:hM}});var SM=P((vRe,gM)=>{"use strict";var bR=class{static{a(this,"InsertRecordsResponseObject")}constructor(t=[],r=[],n=void 0){this.written_hashes=t,this.skipped_hashes=r,this.txn_time=n}};gM.exports=bR});var AM=P((xRe,TM)=>{"use strict";var OR=class{static{a(this,"UpdateRecordsResponseObject")}constructor(t=[],r=[],n=void 0,s=[]){this.written_hashes=t,this.skipped_hashes=r,this.txn_time=n,this.original_records=s}};TM.exports=OR});var yM=P((HRe,RM)=>{"use strict";var NR=class{static{a(this,"UpsertRecordsResponseObject")}constructor(t=[],r=void 0,n=[]){this.written_hashes=t,this.txn_time=r,this.original_records=n}};RM.exports=NR});var Pc=P(($Re,NM)=>{"use strict";var eX=ht(),tX=SM(),rX=AM(),nX=yM(),yi=ln(),Ff=Ln().LMDB_ERRORS_ENUM,sX=Ft(),io=(G(),D($)),iX=oe(),oX=require("uuid"),FRe=require("lmdb"),{handleHDBError:aX,hdb_errors:cX}=he(),{OVERFLOW_MARKER:GRe,MAX_SEARCH_KEY_LENGTH:qRe}=sX,bM=ce();bM.initSync();var Im=bM.get(io.CONFIG_PARAMS.STORAGE_PREFETCHWRITES),wR=io.TIME_STAMP_NAMES_ENUM.CREATED_TIME,Cc=io.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function lX(e,t,r,n,s=yi.getNextMonotonicTime()){DR(e,t,r,n),IR(e,t,r);let i=new tX,o=[],c=[];for(let l=0;l<n.length;l++){let u=n[l];OM(u,!0,s);let f=uX(e,t,r,u),d=u[t];o.push(f),c.push(d)}return CR(o,c,n,i,s)}a(lX,"insertRecords");function uX(e,t,r,n){let s=n[t];return e.dbis[t].ifNoExists(s,()=>{for(let i=0;i<r.length;i++){let o=r[i];if(o===t||n.hasOwnProperty(o)===!1)continue;let c=n[o];if(typeof c=="function"){let f=c([[{}]]);Array.isArray(f)&&(c=f[0][io.FUNC_VAL],n[o]=c)}let l=yi.getIndexedValues(c),u=e.dbis[o];if(l){Im&&u.prefetch(l.map(f=>({key:f,value:s})),Cm);for(let f=0,d=l.length;f<d;f++)u.put(l[f],s)}}Im&&e.dbis[t].prefetch([s],Cm),e.dbis[t].put(s,n,n[Cc])})}a(uX,"insertRecord");function dX(e,t=[]){let r=0;for(let n=0;n<t.length;n++){let s=t[n];e.splice(s-r,1),r++}}a(dX,"removeSkippedRecords");function OM(e,t,r){let n=r>0;(n||!Number.isInteger(e[Cc]))&&(e[Cc]=r||(r=yi.getNextMonotonicTime())),t===!0?(n||!Number.isInteger(e[wR]))&&(e[wR]=r||yi.getNextMonotonicTime()):delete e[wR]}a(OM,"setTimestamps");function IR(e,t,r){r.indexOf(io.TIME_STAMP_NAMES_ENUM.CREATED_TIME)<0&&r.push(io.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.indexOf(io.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)<0&&r.push(io.TIME_STAMP_NAMES_ENUM.UPDATED_TIME),eX.initializeDBIs(e,t,r)}a(IR,"initializeTransaction");async function fX(e,t,r,n,s=yi.getNextMonotonicTime()){DR(e,t,r,n),IR(e,t,r);let i=new rX,o=[],c=[],l=[];for(let u=0;u<n.length;u++){let f=n[u],d=f[t],h;try{h=PR(e,t,f,d,i,!0,s)}catch{i.skipped_hashes.push(d),o.push(u);continue}c.push(h),l.push(d)}return CR(c,l,n,i,s,o)}a(fX,"updateRecords");async function _X(e,t,r,n,s=yi.getNextMonotonicTime()){try{DR(e,t,r,n)}catch(l){throw aX(l,l.message,cX.HTTP_STATUS_CODES.BAD_REQUEST)}IR(e,t,r);let i=new nX,o=[],c=[];for(let l=0;l<n.length;l++){let u=n[l],f;iX.isEmpty(u[t])?(f=oX.v4(),u[t]=f):f=u[t];let d=PR(e,t,u,f,i,!1,s);o.push(d),c.push(f)}return CR(o,c,n,i,s)}a(_X,"upsertRecords");async function CR(e,t,r,n,s,i=[]){let o=await Promise.all(e);for(let c=0,l=o.length;c<l;c++)o[c]===!0?n.written_hashes.push(t[c]):(n.skipped_hashes.push(t[c]),i.push(c));return n.txn_time=s||yi.getNextMonotonicTime(),dX(r,i),n}a(CR,"finalizeWrite");function PR(e,t,r,n,s,i=!1,o){let c=e.dbis[t],l=c.getEntry(n),u=l?.value,f=u;if(!u){if(i)return!1;u={}}if(OM(r,!f,o),Number.isInteger(r[Cc])&&u[Cc]>r[Cc])return!1;f&&s.original_records.push(u);let d,h=a(()=>{for(let p in r){if(!r.hasOwnProperty(p)||p===t)continue;let S=r[p],g=e.dbis[p];if(g===void 0)continue;let R=u[p];if(typeof S=="function"){let T=S([[u]]);Array.isArray(T)&&(S=T[0][io.FUNC_VAL],r[p]=S)}if(S===R)continue;let E=yi.getIndexedValues(R);if(E){Im&&g.prefetch(E.map(T=>({key:T,value:n})),Cm);for(let T=0,O=E.length;T<O;T++)g.remove(E[T],n)}if(E=yi.getIndexedValues(S),E){Im&&g.prefetch(E.map(T=>({key:T,value:n})),Cm);for(let T=0,O=E.length;T<O;T++)g.put(E[T],n)}}let _={...u,...r};c.put(n,_,_[Cc])},"do_put");return l?d=c.ifVersion(n,l.version,h):d=c.ifNoExists(n,h),d.then(_=>_?!0:PR(e,t,r,n,s,i,o))}a(PR,"updateUpsertRecord");function hX(e,t,r){if(yi.validateEnv(e),t===void 0)throw new Error(Ff.HASH_ATTRIBUTE_REQUIRED);if(!Array.isArray(r))throw r===void 0?new Error(Ff.WRITE_ATTRIBUTES_REQUIRED):new Error(Ff.WRITE_ATTRIBUTES_MUST_BE_ARRAY)}a(hX,"validateBasic");function DR(e,t,r,n){if(hX(e,t,r),!Array.isArray(n))throw n===void 0?new Error(Ff.RECORDS_REQUIRED):new Error(Ff.RECORDS_MUST_BE_ARRAY)}a(DR,"validateWrite");function Cm(){}a(Cm,"noop");NM.exports={insertRecords:lX,updateRecords:fX,upsertRecords:_X}});var oo=P((KRe,pX)=>{pX.exports={hdb_user:{hash_attribute:"username",name:"hdb_user",schema:"system",residence:["*"],attributes:[{attribute:"username"},{attribute:"password"},{attribute:"role"},{attribute:"active"},{attribute:"hash"},{attribute:"refresh_token"},{attribute:"hash_function"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]},hdb_role:{hash_attribute:"id",name:"hdb_role",schema:"system",attributes:[{attribute:"id"},{attribute:"role"},{attribute:"permission"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}],residence:["*"]},hdb_job:{hash_attribute:"id",name:"hdb_job",schema:"system",attributes:[{attribute:"id"},{attribute:"user"},{attribute:"type"},{attribute:"status"},{attribute:"start_datetime"},{attribute:"end_datetime"},{attribute:"message"},{attribute:"created_datetime"},{attribute:"request"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]},hdb_license:{hash_attribute:"license_key",name:"hdb_license",schema:"system",attributes:[{attribute:"license_key"},{attribute:"company"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]},hdb_info:{hash_attribute:"info_id",name:"hdb_info",schema:"system",attributes:[{attribute:"info_id"},{attribute:"data_version_num"},{attribute:"hdb_version_num"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]},hdb_nodes:{hash_attribute:"name",name:"hdb_nodes",schema:"system",attributes:[{attribute:"name"},{attribute:"subscriptions"},{attribute:"system_info"},{attribute:"url"},{attribute:"routes"},{attribute:"revoked_certificates"},{attribute:"shard"}]},hdb_certificate:{hash_attribute:"name",name:"hdb_certificate",schema:"system",attributes:[{attribute:"name"},{attribute:"uses"},{attribute:"certificate"},{attribute:"is_authority"},{attribute:"private_key_name"},{attribute:"details"},{attribute:"is_self_signed"},{attribute:"__updatedtime__"}]},hdb_analytics:{hash_attribute:"id",name:"hdb_analytics",schema:"system",audit:!1,attributes:[{attribute:"id"},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]},hdb_raw_analytics:{hash_attribute:"id",name:"hdb_raw_analytics",schema:"system",audit:!1,attributes:[{attribute:"id"},{attribute:"time"},{attribute:"metrics"}]},hdb_temp:{hash_attribute:"id",name:"hdb_temp",schema:"system",attributes:[{attribute:"id"}]},hdb_durable_session:{hash_attribute:"id",name:"hdb_durable_session",schema:"system",attributes:[{attribute:"id"}]},hdb_session_will:{hash_attribute:"id",name:"hdb_session_will",schema:"system",attributes:[{attribute:"id"}]}}});var IM=P((YRe,wM)=>{"use strict";var mX=require("uuid"),LR=class{static{a(this,"CreateAttributeObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.attribute=n,this.id=s||mX.v4(),this.schema_table=`${this.schema}.${this.table}`}};wM.exports=LR});var Pm=P((zRe,CM)=>{"use strict";var EX=IM(),MR=class extends EX{static{a(this,"LMDBCreateAttributeObject")}constructor(t,r,n,s,i=!0,o=!1){super(t,r,n,s),this.dup_sort=i,this.is_hash_attribute=o}};CM.exports=MR});var DM=P((QRe,PM)=>{"use strict";PM.exports=SX;var gX="inserted";function SX(e,t,r,n){let s={message:`${e} ${t.length} of ${r.records.length} records`,skipped_hashes:n};return e===gX?(s.inserted_hashes=t,s):(s.update_hashes=t,s)}a(SX,"returnObject")});var Dm=P((ZRe,MM)=>{"use strict";var TX=(G(),D($)),vR=ht(),AX=Pc(),{getSystemSchemaPath:RX,getSchemaPath:yX}=gt(),XRe=oo(),{validateBySchema:bX}=st(),Gf=require("joi"),OX=Pm(),NX=DM(),{handleHDBError:wX,hdb_errors:IX,ClientError:CX}=he(),LM=oe(),{HTTP_STATUS_CODES:PX}=IX,DX="inserted";MM.exports=LX;async function LX(e){let t=bX(e,Gf.object({database:Gf.string(),schema:Gf.string(),table:Gf.string().required(),attribute:Gf.string().required()}));if(t)throw new CX(t.message);let r=!e.skip_table_check&&LM.checkGlobalSchemaTable(e.schema,e.table);if(r)throw wX(new Error,r,PX.NOT_FOUND);e.is_hash_attribute=e.is_hash_attribute=="true",e.dup_sort=LM.isEmpty(e.dup_sort)||e.dup_sort=="true";let n=[];if(global.hdb_schema[e.schema]&&global.hdb_schema[e.schema][e.table]&&(n=global.hdb_schema[e.schema][e.table].attributes),Array.isArray(n)&&n.length>0){for(let i of n)if(i.attribute===e.attribute)throw new Error(`attribute '${i.attribute}' already exists in ${e.schema}.${e.table}`)}let s=new OX(e.schema,e.table,e.attribute,e.id);try{let i=await vR.openEnvironment(yX(e.schema,e.table),e.table);if(i.dbis[e.attribute]!==void 0)throw new Error(`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`);vR.createDBI(i,e.attribute,e.dup_sort,e.is_hash_attribute);let o=await vR.openEnvironment(RX(),TX.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),{written_hashes:c,skipped_hashes:l}=await AX.insertRecords(o,HDB_TABLE_INFO.hash_attribute,hdb_attribute_attributes,[s]);return NX(DX,c,{records:[s]},l)}catch(i){throw i}}a(LX,"lmdbCreateAttribute")});var qf=P((rye,UM)=>{"use strict";var ao=oe(),vM=X(),tye=oR(),{getDatabases:MX}=(Ue(),D(ct)),{ClientError:Dc}=he();UM.exports=vX;function vX(e){if(ao.isEmpty(e))throw new Dc("invalid update parameters defined.");if(ao.isEmptyOrZeroLength(e.schema))throw new Dc("invalid schema specified.");if(ao.isEmptyOrZeroLength(e.table))throw new Dc("invalid table specified.");if(!Array.isArray(e.records))throw new Dc("records must be an array");let t=MX()[e.schema]?.[e.table];if(ao.isEmpty(t))throw new Dc(`could not retrieve schema:${e.schema} and table ${e.table}`);let r=t.primaryKey,n=new Set,s={},i=!1;return e.operation==="update"&&(i=!0),e.records.forEach(o=>{if(i&&ao.isEmptyOrZeroLength(o[r]))throw vM.error("a valid hash attribute must be provided with update record:",o),new Dc("a valid hash attribute must be provided with update record, check log for more info");if(!ao.isEmptyOrZeroLength(o[r])&&(o[r]==="null"||o[r]==="undefined"))throw vM.error(`a valid hash value must be provided with ${e.operation} record:`,o),new Dc(`Invalid hash value: '${o[r]}' is not a valid hash attribute value, check log for more info`);!ao.isEmpty(o[r])&&o[r]!==""&&n.has(ao.autoCast(o[r]))&&(o.skip=!0),n.add(ao.autoCast(o[r]));for(let c in o)s[c]=1}),s[r]=1,{schema_table:t,hashes:Array.from(n),attributes:Object.keys(s)}}a(vX,"insertUpdateValidate")});var BM=P((sye,xM)=>{"use strict";var UR=class{static{a(this,"ITCEventObject")}constructor(t,r){this.type=t,this.message=r}};xM.exports=UR});var FM=P((oye,kM)=>{"use strict";var xR=ht(),UX=X(),HM=Ln().LMDB_ERRORS_ENUM;kM.exports=xX;async function xX(e){try{if(global.lmdb_map!==void 0&&e.operation!==void 0){let t=Object.keys(global.lmdb_map),r;switch(e.operation){case"drop_schema":for(let i=0;i<t.length;i++){let o=t[i];if(o.startsWith(`${e.schema}.`)||o.startsWith(`txn.${e.schema}.`))try{await xR.closeEnvironment(global.lmdb_map[o])}catch(c){if(c.message!==HM.ENV_REQUIRED)throw c}}break;case"drop_table":let n=`${e.schema}.${e.table}`,s=`txn.${n}`;try{await xR.closeEnvironment(global.lmdb_map[n]),await xR.closeEnvironment(global.lmdb_map[s])}catch(i){if(i.message!==HM.ENV_REQUIRED)throw i}break;case"drop_attribute":r=global.lmdb_map[`${e.schema}.${e.table}`],r!==void 0&&typeof r.dbis=="object"&&r.dbis[`${e.attribute}`]!==void 0&&delete r.dbis[`${e.attribute}`];break;default:break}}}catch(t){UX.error(t)}}a(xX,"cleanLMDBMap")});var ZM=P((lye,XM)=>{"use strict";var BR=require("recursive-iterator"),BX=require("alasql"),HR=require("clone"),GM=oe(),{handleHDBError:qM,hdb_errors:HX}=he(),{HDB_ERROR_MSGS:$M,HTTP_STATUS_CODES:VM}=HX,{getDatabases:kX}=(Ue(),D(ct)),FX=["DISTINCT_ARRAY"],KM=Symbol("validateTables"),kR=Symbol("validateTable"),cye=Symbol("getAllColumns"),YM=Symbol("validateAllColumns"),Lm=Symbol("findColumn"),WM=Symbol("validateOrderBy"),$f=Symbol("validateSegment"),FR=Symbol("validateColumn"),zM=Symbol("setColumnsForTable"),jM=Symbol("checkColumnsForAsterisk"),QM=Symbol("validateGroupBy"),JM=Symbol("hasColumns"),GR=class{static{a(this,"SelectValidator")}constructor(t){this.statement=t,this.attributes=[]}validate(){if(!this.statement)throw new Error("invalid sql statement");this[KM](),this[jM](),this[YM]()}[KM](){if(this[JM]()){if(!this.statement.from||this.statement.from.length===0)throw"no from clause";this.statement.from.forEach(t=>{this[kR](t)}),this.statement.joins&&this.statement.joins.forEach(t=>{t.table.as=t.as,this[kR](t.table)})}}[JM](){let t=!1,r=new BR(this.statement);for(let{node:n,path:s}of r)if(n&&n.columnid){t=!0;break}return t}[kR](t){if(!t.databaseid)throw`schema not defined for table ${t.tableid}`;let r=kX();if(!r[t.databaseid])throw qM(new Error,$M.SCHEMA_NOT_FOUND(t.databaseid),VM.NOT_FOUND);if(!r[t.databaseid][t.tableid])throw qM(new Error,$M.TABLE_NOT_FOUND(t.databaseid,t.tableid),VM.NOT_FOUND);r[t.databaseid][t.tableid].attributes.forEach(s=>{let i=HR(s);i.table=HR(t),this.attributes.push(i)})}[Lm](t){return this.attributes.filter(r=>t.tableid?(r.table.as===t.tableid||r.table.tableid===t.tableid)&&r.attribute===t.columnid:r.attribute===t.columnid)}[jM](){let t=new BR(this.statement.columns);for(let{node:r,path:n}of t)r&&r.columnid==="*"&&n.indexOf("expression")<0&&this[zM](r.tableid)}[zM](t){this.attributes.forEach(r=>{(!t||t&&(r.table.tableid===t||r.table.as===t))&&!r.relation&&this.statement.columns.push(new BX.yy.Column({columnid:r.attribute,tableid:r.table.as?r.table.as:r.table.tableid}))})}[YM](){this[$f](this.statement.columns,!1),this[$f](this.statement.joins,!1),this[$f](this.statement.where,!1),this[QM](this.statement.group,!1),this[$f](this.statement.order,!0)}[$f](t,r){if(!t)return;let n=new BR(t),s=[];for(let{node:i,path:o}of n)!GM.isEmpty(i)&&!GM.isEmpty(i.columnid)&&i.columnid!=="*"&&(r?this[WM](i):s.push(this[FR](i)));return s}[QM](t){if(!t)return;let r=[];if(this.statement.columns.forEach(n=>{if(!(n.funcid&&FX.indexOf(n.funcid.toUpperCase())>=0)){if(!n.aggregatorid&&!n.columnid){let s=HR(n);delete s.as,r.push(s)}else if(n.columnid){let s=this[Lm](n)[0];s&&r.push(s)}}}),this.statement.group.forEach(n=>{let s=null;if(!n.columnid)r.forEach((i,o)=>{if(i.toString()===n.toString()){s=i,r.splice(o,1);return}});else{let i=this[Lm](n);if(!i||i.length===0)throw`unknown column '${n.toString()}' in group by`;if(i.length>1)throw`ambiguously defined column '${n.toString()}' in group by`;r.forEach((o,c)=>{if(o.attribute===i[0].attribute&&o.table.tableid===i[0].table.tableid){s=o,r.splice(c,1);return}})}if(!s)throw`group by column '${n.toString()}' must be in select`}),r.length>0)throw`select column '${r[0].attribute?r[0].attribute:r[0].toString()}' must be in group by`}[WM](t){let r=this.statement.columns.filter(n=>n.as===t.columnid);if(r.length>1)throw`ambiguous column reference ${(t.tableid?t.tableid+".":"")+t.columnid} in order by`;r.length===0&&this[FR](t)}[FR](t){let r=this[Lm](t),n=(t.tableid?t.tableid+".":"")+t.columnid;if(r.length===0)throw`unknown column ${n}`;if(r.length>1)throw`ambiguous column reference ${n}`;return r[0]}};XM.exports=GR});var nv=P((dye,rv)=>{"use strict";var ev=require("lodash"),Vf=require("mathjs"),GX=require("jsonata"),tv=oe();rv.exports={distinct_array:a(e=>Array.isArray(e)&&e.length>1?ev.uniqWith(e,ev.isEqual):e,"distinct_array"),searchJSON:qX,mad:Kf.bind(null,Vf.mad),mean:Kf.bind(null,Vf.mean),mode:Kf.bind(null,Vf.mode),prod:Kf.bind(null,Vf.prod),median:Kf.bind(null,Vf.median)};function Kf(e,t,r,n){return n===1?t==null?[]:[t]:n===2?(t!=null&&r.push(t),r):r!=null&&r.length>0?e(r):null}a(Kf,"aggregateFunction");function qX(e,t){if(typeof e!="string"||e.length===0)throw new Error("search json expression must be a non-empty string");let r="__"+e+"__";if(tv.isEmpty(this.__ala__.res)&&(this.__ala__.res={}),tv.isEmpty(this.__ala__.res[r])){let n=GX(e);this.__ala__.res[r]=n}return this.__ala__.res[r].evaluate(t)}a(qX,"searchJSON")});var iv=P((_ye,sv)=>{"use strict";var rr=require("moment"),qR="YYYY-MM-DDTHH:mm:ss.SSSZZ";rr.suppressDeprecationWarnings=!0;sv.exports={current_date:a(()=>rr().utc().format("YYYY-MM-DD"),"current_date"),current_time:a(()=>rr().utc().format("HH:mm:ss.SSS"),"current_time"),extract:a((e,t)=>{switch(t.toLowerCase()){case"year":return rr(e).utc().format("YYYY");case"month":return rr(e).utc().format("MM");case"day":return rr(e).utc().format("DD");case"hour":return rr(e).utc().format("HH");case"minute":return rr(e).utc().format("mm");case"second":return rr(e).utc().format("ss");case"millisecond":return rr(e).utc().format("SSS");default:break}},"extract"),date:a(e=>rr(e).utc().format(qR),"date"),date_format:a((e,t)=>rr(e).utc().format(t),"date_format"),date_add:a((e,t,r)=>rr(e).utc().add(t,r).valueOf(),"date_add"),date_sub:a((e,t,r)=>rr(e).utc().subtract(t,r).valueOf(),"date_sub"),date_diff:a((e,t,r)=>{let n=rr(e).utc(),s=rr(t).utc();return r?n.diff(s,r,!0):n.diff(s)},"date_diff"),now:a(()=>rr().utc().valueOf(),"now"),get_server_time:a(()=>rr().format(qR),"get_server_time"),offset_utc:a((e,t)=>rr(e).utc().utcOffset(t).format(qR),"offset_utc")}});var lv=P((pye,cv)=>{"use strict";var $X=require("@turf/area"),VX=require("@turf/length"),KX=require("@turf/circle"),YX=require("@turf/difference"),WX=require("@turf/distance"),zX=require("@turf/boolean-contains"),jX=require("@turf/boolean-equal"),QX=require("@turf/boolean-disjoint"),JX=require("@turf/helpers"),ov=(G(),D($)),$e=oe(),co=X();cv.exports={geoArea:XX,geoLength:ZX,geoCircle:e6,geoDifference:t6,geoDistance:av,geoNear:r6,geoContains:n6,geoEqual:s6,geoCrosses:i6,geoConvert:o6};function XX(e){if($e.isEmpty(e))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e));try{return $X.default(e)}catch(t){return co.trace(t,e),NaN}}a(XX,"geoArea");function ZX(e,t){if($e.isEmpty(e))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e));try{return VX.default(e,{units:t||"kilometers"})}catch(r){return co.trace(r,e),NaN}}a(ZX,"geoLength");function e6(e,t,r){if($e.isEmpty(e))return NaN;if($e.isEmpty(t))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e));try{return KX.default(e,t,{units:r||"kilometers"})}catch(n){return co.trace(n,e,t),NaN}}a(e6,"geoCircle");function t6(e,t){if($e.isEmpty(e))return NaN;if($e.isEmpty(t))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t));try{return YX(e,t)}catch(r){return co.trace(r,e,t),NaN}}a(t6,"geoDifference");function av(e,t,r){if($e.isEmpty(e))return NaN;if($e.isEmpty(t))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t));try{return WX.default(e,t,{units:r||"kilometers"})}catch(n){return co.trace(n,e,t),NaN}}a(av,"geoDistance");function r6(e,t,r,n){if($e.isEmpty(e)||$e.isEmpty(t))return!1;if($e.isEmpty(r))throw new Error("distance is required");if(typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t)),isNaN(r))throw new Error("distance must be a number");try{return av(e,t,n)<=r}catch(s){return co.trace(s,e,t),!1}}a(r6,"geoNear");function n6(e,t){if($e.isEmpty(e)||$e.isEmpty(t)||e.coordinates&&e.coordinates.includes?.(null)||t.coordinates&&t.coordinates.includes?.(null))return!1;typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t));try{return zX.default(e,t)}catch(r){return co.trace(r,e,t),!1}}a(n6,"geoContains");function s6(e,t){if($e.isEmpty(e)||$e.isEmpty(t)||e.coordinates&&e.coordinates.includes?.(null)||t.coordinates&&t.coordinates.includes?.(null))return!1;typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t));try{return jX.default(e,t)}catch(r){return co.trace(r,e,t),!1}}a(s6,"geoEqual");function i6(e,t){if($e.isEmpty(e)||$e.isEmpty(t)||e.coordinates&&e.coordinates.includes?.(null)||t.coordinates&&t.coordinates.includes?.(null))return!1;typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t));try{return!QX.default(e,t)}catch(r){return co.trace(r,e,t),!1}}a(i6,"geoCrosses");function o6(e,t,r){if($e.isEmptyOrZeroLength(e))throw new Error("coordinates is required");if($e.isEmpty(t))throw new Error("geo_type is required");if($e.isEmpty(ov.GEO_CONVERSION_ENUM[t]))throw new Error(`geo_type of ${t} is invalid please use one of the following types: ${Object.keys(ov.GEO_CONVERSION_ENUM).join(",")}`);return typeof e=="string"&&(e=$e.autoCastJSON(e)),JX[t](e,r)}a(o6,"geoConvert")});var Mm=P((Eye,uv)=>{var Lc=nv(),Fn=iv(),bi=lv();uv.exports=e=>{e.aggr.mad=e.aggr.MAD=Lc.mad,e.aggr.mean=e.aggr.MEAN=Lc.mean,e.aggr.mode=e.aggr.MODE=Lc.mode,e.aggr.prod=e.aggr.PROD=Lc.prod,e.aggr.median=e.aggr.MEDIAN=Lc.median,e.fn.distinct_array=e.fn.DISTINCT_ARRAY=Lc.distinct_array,e.fn.search_json=e.fn.SEARCH_JSON=Lc.searchJSON,e.fn.__ala__=e,e.fn.current_date=e.fn.CURRENT_DATE=Fn.current_date,e.fn.current_time=e.fn.CURRENT_TIME=Fn.current_time,e.fn.extract=e.fn.EXTRACT=Fn.extract,e.fn.date=e.fn.DATE=Fn.date,e.fn.date_format=e.fn.DATE_FORMAT=Fn.date_format,e.fn.date_add=e.fn.DATE_ADD=Fn.date_add,e.fn.date_sub=e.fn.DATE_SUB=Fn.date_sub,e.fn.date_diff=e.fn.DATE_DIFF=e.fn.datediff=e.fn.DATEDIFF=Fn.date_diff,e.fn.now=e.fn.NOW=Fn.now,e.fn.offset_utc=e.fn.OFFSET_UTC=Fn.offset_utc,e.fn.get_server_time=e.fn.GET_SERVER_TIME=Fn.get_server_time,e.fn.getdate=e.fn.GETDATE=Fn.now,e.fn.current_timestamp=e.fn.CURRENT_TIMESTAMP=Fn.now,e.fn.geoarea=e.fn.GEOAREA=e.fn.geoArea=bi.geoArea,e.fn.geocircle=e.fn.GEOCIRCLE=e.fn.geoCircle=bi.geoCircle,e.fn.geocontains=e.fn.GEOCONTAINS=e.fn.geoContains=bi.geoContains,e.fn.geoconvert=e.fn.GEOCONVERT=e.fn.geoConvert=bi.geoConvert,e.fn.geocrosses=e.fn.GEOCROSSES=e.fn.geoCrosses=bi.geoCrosses,e.fn.geodifference=e.fn.GEODIFFERENCE=e.fn.geoDifference=bi.geoDifference,e.fn.geodistance=e.fn.GEODISTANCE=e.fn.geoDistance=bi.geoDistance,e.fn.geoequal=e.fn.GEOEQUAL=e.fn.geoEqual=bi.geoEqual,e.fn.geolength=e.fn.GEOLENGTH=e.fn.geoLength=bi.geoLength,e.fn.geonear=e.fn.GEONEAR=e.fn.geoNear=bi.geoNear}});var hv=P((gye,_v)=>{"use strict";var Yf=require("lodash"),En=require("alasql");En.options.cache=!1;var a6=Mm(),dv=require("clone"),vm=require("recursive-iterator"),He=X(),Xe=oe(),su=Gn(),c6=(G(),D($)),{hdb_errors:l6}=he(),{getDatabases:fv}=(Ue(),D(ct)),u6="IS NULL",qs="There was a problem performing this search. Please check the logs and try again.";a6(En);var $R=class{static{a(this,"SQLSearch")}constructor(t,r){if(Xe.isEmpty(t))throw He.error("AST statement for SQL select process cannot be empty"),"statement cannot be null";this.statement=t,this.columns={},this.all_table_attributes=r,this.fetch_attributes=[],this.exact_search_values={},this.comparator_search_values={},this.tables=[],this.data={},this.has_aggregator=!1,this.has_ordinal=!1,this.has_outer_join=!1,this._getColumns(),this._getTables(),this._conditionsToFetchAttributeValues(),this._setAliasesForColumns(),Xe.backtickASTSchemaItems(this.statement)}async search(){let t;try{let n=await this._checkEmptySQL();if(!Xe.isEmptyOrZeroLength(n))return He.trace("No results returned from checkEmptySQL SQLSearch method."),n}catch(n){throw He.error("Error thrown from checkEmptySQL in SQLSearch class method search."),He.error(n),new Error(qs)}try{let n=await this._getFetchAttributeValues();if(n)return n}catch(n){throw He.error("Error thrown from getFetchAttributeValues in SQLSearch class method search."),He.error(n),new Error(qs)}if(Object.keys(this.data).length===0)return He.trace('SQLSearch class field: "data" is empty.'),[];let r;try{r=await this._processJoins()}catch(n){throw He.error("Error thrown from processJoins in SQLSearch class method search."),He.error(n),new Error(qs)}try{await this._getFinalAttributeData(r.existing_attributes,r.joined_length)}catch(n){throw He.error("Error thrown from getFinalAttributeData in SQLSearch class method search."),He.error(n),new Error(qs)}try{return t=await this._finalSQL(),t}catch(n){throw He.error("Error thrown from finalSQL in SQLSearch class method search."),He.error(n),new Error(qs)}}_getColumns(){let t=new vm(this.statement);for(let{node:r,path:n}of t)r&&r.columnid&&(this.columns[n[0]]||(this.columns[n[0]]=[]),this.columns[n[0]].push(dv(r)))}_getTables(){let t=[];this.all_table_attributes.forEach(r=>{t.push(r.table)}),this.tables=Yf.uniqBy(t,r=>[r.databaseid,r.tableid,r.as].join()),this.tables.forEach(r=>{let n=`${r.databaseid}_${r.as?r.as:r.tableid}`;this.data[n]={},this.data[n].__hash_name=fv()[r.databaseid][r.tableid].primaryKey,this.data[n].__merged_data={},this.data[n].__merged_attributes=[],this.data[n].__merged_attr_map={}})}_conditionsToFetchAttributeValues(){if(Xe.isEmpty(this.statement.where)){He.trace('AST "where" statement is empty.');return}let t=!1;for(let{node:r}of new vm(this.statement.where))if(r&&r.op&&r.op==="OR"&&(t=!0),!Xe.isEmpty(r)&&r.right)if(Xe.isNotEmptyAndHasValue(r.right.value)){let n=Xe.autoCast(r.right.value);[!0,!1].indexOf(n)>=0&&(r.right=new En.yy.LogicValue({value:n}))}else Array.isArray(r.right)&&r.right.forEach((n,s)=>{let i=Xe.autoCast(n.value);[!0,!1].indexOf(i)>=0?r.right[s]=new En.yy.LogicValue({value:i}):n instanceof En.yy.StringValue&&Xe.autoCasterIsNumberCheck(i.toString())&&(r.right[s]=new En.yy.NumValue({value:i}))});if(t){He.trace('Where clause contains "OR", exact match search not performed on attributes.');return}for(let{node:r}of new vm(this.statement.where))if(r&&r.left&&r.right&&(r.left.columnid||r.right.value)&&r.op){let n=new Set,s=r.left.columnid?r.left:r.right,i=this._findColumn(s);if(!i)continue;let o=[i.table.databaseid,i.table.tableid,i.attribute].join("/");if(!Xe.isEmpty(c6.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[r.op])){if(Xe.isEmpty(this.comparator_search_values[o])&&(this.comparator_search_values[o]={ignore:!1,comparators:[]}),!this.comparator_search_values[o].ignore){if(Xe.isEmptyOrZeroLength(r.left.columnid)||Xe.isEmptyOrZeroLength(r.right.value)){this.comparator_search_values[o].ignore=!0,this.comparator_search_values[o].comparators=[];continue}this.comparator_search_values[o].comparators.push({attribute:r.left.columnid,operation:r.op,search_value:r.right.value})}continue}if(Xe.isEmpty(this.exact_search_values[o])&&(this.exact_search_values[o]={ignore:!1,values:new Set}),!this.exact_search_values[o].ignore){let c=!1;switch(r.op){case"=":!Xe.isEmpty(r.right.value)||!Xe.isEmpty(r.left.value)?n.add(Xe.isEmpty(r.right.value)?r.left.value:r.right.value):c=!0;break;case"IN":let l=Array.isArray(r.right)?r.right:r.left;for(let u=0;u<l.length;u++)if(l[u].value)n.add(l[u].value);else{c=!0;break}break;default:c=!0;break}this.exact_search_values[o].ignore=c,c?this.exact_search_values[o].values=new Set:this.exact_search_values[o].values=new Set([...this.exact_search_values[o].values,...n])}}}_setAliasesForColumns(){if(Xe.isEmptyOrZeroLength(this.all_table_attributes)&&Xe.isEmptyOrZeroLength(this.statement.from)&&Xe.isEmptyOrZeroLength(this.columns.columns))return;let t=[],r={};this.statement.columns.forEach((n,s)=>{if(n.columnid==="*"){t.push(s);return}if(n.aggregatorid&&(this.has_aggregator=!0),!n.aggregatorid&&!n.funcid)if(n.as_orig=n.as?n.as:n.columnid,this.statement.joins)if(r[n.as_orig]>=0){let i=r[n.as_orig]+1;n.as=`[${n.as_orig+i}]`,r[n.as_orig]=i}else n.as=`[${n.as_orig}]`,r[n.as_orig]=0;else n.as=`[${n.as_orig}]`;!n.aggregatorid&&n.funcid&&n.args&&(n.as_orig=n.as?n.as:n.toString().replace(/'/g,'"'),n.as=`[${n.as_orig}]`),n.aggregatorid&&n.expression.columnid!=="*"&&(n.as_orig=n.as?n.as:n.expression.tableid?`${n.aggregatorid}(${n.expression.tableid}.${n.expression.columnid})`:`${n.aggregatorid}(${n.expression.columnid})`,n.as=`[${n.as_orig}]`)}),this.statement.columns.length>1&&t.length>0&&Yf.pullAt(this.statement.columns,t)}_findColumn(t){let r=this.all_table_attributes.filter(n=>{if(t.columnid_orig&&t.tableid_orig)return(n.table.as===t.tableid_orig||n.table.tableid===t.tableid_orig)&&n.attribute===t.columnid_orig;if(t.tableid)return(n.table.as===t.tableid||n.table.tableid===t.tableid)&&n.attribute===t.columnid;let s=t.columnid_orig?t.columnid_orig:t.columnid;return n.attribute===s});if(Xe.isEmptyOrZeroLength(r)){let n=this.columns.columns.filter(s=>s.as?t.columnid===s.as:!1);Xe.isEmptyOrZeroLength(n)||(r=this.all_table_attributes.filter(s=>s.attribute===n[0].columnid&&n[0].tableid&&n[0].tableid===(s.table.as?s.table.as:s.table.tableid)))}return r[0]}async _checkEmptySQL(){let t=[];if(Xe.isEmptyOrZeroLength(this.all_table_attributes)&&!Xe.isEmptyOrZeroLength(this.columns.columns))return t;if(Xe.isEmptyOrZeroLength(this.all_table_attributes)&&Xe.isEmptyOrZeroLength(this.statement.from))try{let r=this._buildSQL(!1);t=await En.promise(r)}catch(r){throw He.error("Error thrown from AlaSQL in SQLSearch class method checkEmptySQL."),He.error(r),new Error("There was a problem with the SQL statement")}return t}_addFetchColumns(t){t&&t.length>0&&t.forEach(r=>{let n=this._findColumn(r);n&&this.fetch_attributes.push(dv(n))})}_addColumnToMergedAttributes(t,r){this.data[t].__merged_attributes.push(r),this.data[t].__merged_attr_map[r]=this.data[t].__merged_attributes.length-1}_setMergedHashAttribute(t,r){this.data[t].__merged_data[r].splice(0,1,r)}_updateMergedAttribute(t,r,n,s){let i=this.data[t].__merged_attr_map[n];this.data[t].__merged_data[r].splice(i,1,s)}async _getFetchAttributeValues(){if(Xe.isEmptyOrZeroLength(Object.keys(this.columns)))return[];this._addFetchColumns(this.columns.joins);let t=null;try{t=this.statement.where?this.statement.where.toString():""}catch{throw new Error("Could not generate proper where clause")}this.columns.where&&this._addFetchColumns(this.columns.where);let r=this._isSimpleSelect();if(r?this._addFetchColumns(this.columns.columns):(!this.columns.where&&this.fetch_attributes.length===0)|t.indexOf(u6)>-1&&this.tables.forEach(s=>{let i={columnid:fv()[s.databaseid][s.tableid].primaryKey,tableid:s.tableid};this._addFetchColumns([i])}),this.statement.order&&(this._updateOrderByToAliases(),this._addNonAggregatorsToFetchColumns()),this.fetch_attributes=Yf.uniqBy(this.fetch_attributes,s=>[s.table.databaseid,s.table.as?s.table.as:s.table.tableid,s.attribute].join()),r)return await this._simpleSQLQuery();let n=this.fetch_attributes.reduce((s,i)=>{let o=`${i.table.databaseid}_${i.table.as?i.table.as:i.table.tableid}`,c=this.data[o].__hash_name;return s[o]||(s[o]=[],s[o].push(null),this._addColumnToMergedAttributes(o,c)),i.attribute!==c&&(s[o].push(null),this._addColumnToMergedAttributes(o,i.attribute)),s},{});for(let s of this.fetch_attributes){let i=`${s.table.databaseid}_${s.table.as?s.table.as:s.table.tableid}`,o=this.data[i].__hash_name,c={schema:s.table.databaseid,table:s.table.tableid,get_attributes:[s.attribute]},l=!1,u=[s.table.databaseid,s.table.tableid,s.attribute].join("/");if(s.attribute===o&&(l=!0),!Xe.isEmpty(this.exact_search_values[u])&&!this.exact_search_values[u].ignore&&!Xe.isEmptyOrZeroLength(this.exact_search_values[u].values))if(l)try{c.hash_values=Array.from(this.exact_search_values[u].values);let f=await su.getDataByHash(c);for(let d of c.hash_values)f.get(d)&&!this.data[i].__merged_data[d]&&(this.data[i].__merged_data[d]=[...n[i]],this._setMergedHashAttribute(i,d))}catch(f){throw He.error("Error thrown from getDataByHash function in SQLSearch class method getFetchAttributeValues exact match."),He.error(f),new Error(qs)}else try{c.search_attribute=s.attribute,await Promise.all(Array.from(this.exact_search_values[u].values).map(async f=>{let d={...c};d.search_value=f;let h=await su.getDataByValue(d);for(let[_,p]of h)this.data[i].__merged_data[_]?this._updateMergedAttribute(i,_,s.attribute,p[s.attribute]):(this.data[i].__merged_data[_]=[...n[i]],this._updateMergedAttribute(i,_,s.attribute,p[s.attribute]),this._setMergedHashAttribute(i,_))}))}catch(f){throw He.error("Error thrown from getDataByValue function in SQLSearch class method getFetchAttributeValues exact match."),He.error(f),new Error(qs)}else if(!Xe.isEmpty(this.comparator_search_values[u])&&!this.comparator_search_values[u].ignore&&!Xe.isEmptyOrZeroLength(this.comparator_search_values[u].comparators))try{let f=this.comparator_search_values[u].comparators;for(let d=0,h=f.length;d<h;d++){let _=f[d];c.search_attribute=_.attribute,c.search_value=_.search_value;let p=await su.getDataByValue(c,_.operation);if(l)for(let[S]of p)this.data[i].__merged_data[S]||(this.data[i].__merged_data[S]=[...n[i]],this._setMergedHashAttribute(i,S));else for(let[S,g]of p)this.data[i].__merged_data[S]?this._updateMergedAttribute(i,S,s.attribute,g[s.attribute]):(this.data[i].__merged_data[S]=[...n[i]],this._updateMergedAttribute(i,S,s.attribute,g[s.attribute]),this._setMergedHashAttribute(i,S))}}catch(f){throw He.error("Error thrown from getDataByValue function in SQLSearch class method getFetchAttributeValues comparator search values."),He.error(f),new Error(qs)}else try{c.search_attribute=s.attribute,c.search_value="*";let f=await su.getDataByValue(c);if(l)for(let[d]of f)this.data[i].__merged_data[d]||(this.data[i].__merged_data[d]=[...n[i]],this._setMergedHashAttribute(i,d));else for(let[d,h]of f)this.data[i].__merged_data[d]?this._updateMergedAttribute(i,d,s.attribute,h[s.attribute]):(this.data[i].__merged_data[d]=[...n[i]],this._updateMergedAttribute(i,d,s.attribute,h[s.attribute]),this._setMergedHashAttribute(i,d))}catch(f){throw He.error("Error thrown from getDataByValue function in SQLSearch class method getFetchAttributeValues no comparator search values."),He.error(f),new Error(qs)}}}_isSimpleSelect(){let t=!0;return Object.keys(this.statement).length!==2||!this.statement.columns||!this.statement.from||this.statement.from.length!==1?(t=!1,t):(this.statement.columns.forEach(r=>{r instanceof En.yy.Column||(t=!1)}),t)}_updateOrderByToAliases(){this.statement.order.forEach(t=>{if(t.expression.aggregatorid){t.is_aggregator=!0;return}if(t.expression.value){t.is_ordinal=!0,this.has_ordinal=!0;return}else t.is_ordinal=!1;let r=this.statement.columns.filter(s=>{let i=s.aggregatorid?s.expression:s,o=s.aggregatorid?s.as_orig:i.as_orig;return t.expression.tableid?i.columnid_orig===t.expression.columnid_orig&&i.tableid_orig===t.expression.tableid_orig:i.columnid_orig===t.expression.columnid_orig||t.expression.columnid_orig===o});r[0]||r.push(this._findColumn(t.expression));let n=r[0];if(t.is_func=!!n.funcid,t.is_aggregator=!!n.aggregatorid,n.as)if(n.as&&!t.expression.tableid)t.expression.columnid=n.as,t.expression.columnid_orig=n.as_orig;else{let s=new En.yy.Column;s.columnid=n.as,s.columnid_orig=n.as_orig,t.expression=s}else{t.initial_select_column=Object.assign(new En.yy.Column,t.expression),t.initial_select_column.as=`[${t.expression.columnid_orig}]`,t.expression.columnid=t.initial_select_column.as;return}if(!t.is_aggregator){let s=t.is_func?new En.yy.FuncValue:new En.yy.Column;t.initial_select_column=Object.assign(s,n)}})}_addNonAggregatorsToFetchColumns(){let r=this.statement.order.filter(n=>!n.is_aggregator&&!n.is_ordinal).map(n=>n.is_func?{columnid:n.initial_select_column.args.filter(i=>!!i.columnid_orig)[0].columnid_orig}:{columnid:n.expression.columnid_orig});this._addFetchColumns(r)}async _processJoins(){let t=[],r=[],n=this.statement.from[0],s=[n],i=["? "+(n.as?" AS "+n.as:n.tableid)];t.push(Object.values(this.data[`${n.databaseid_orig}_${n.as?n.as_orig:n.tableid_orig}`].__merged_data)),this.statement.joins&&this.statement.joins.forEach(_=>{_.joinmode&&_.joinmode!=="INNER"&&(this.has_outer_join=!0),s.push(_.table);let p=_.joinmode+" JOIN ? AS "+(_.as?_.as:_.table.tableid);_.on&&(p+=" ON "+_.on.toString()),i.push(p),t.push(Object.values(this.data[`${_.table.databaseid_orig}_${_.table.as?_.table.as_orig:_.table.tableid_orig}`].__merged_data))});let o=[],c={};s.forEach(_=>{let p=this.data[`${_.databaseid_orig}_${_.as?_.as_orig:_.tableid_orig}`].__hash_name,S=_.as?_.as_orig:_.tableid_orig;o.push({key:`'${S}.${p}'`,schema:_.databaseid_orig,table:_.as?_.as_orig:_.tableid_orig,keys:new Set}),r.push(`${_.as?_.as:_.tableid}.\`${p}\` AS "${S}.${p}"`),c[_.as?_.as_orig:_.tableid_orig]=this.data[`${_.databaseid_orig}_${_.as?_.as_orig:_.tableid_orig}`].__merged_attributes});let l=this.statement.where?"WHERE "+this.statement.where:"";l=l.replace(/NOT\(NULL\)/g,"NOT NULL");let u="";this.statement.order&&!this.has_ordinal&&!this.has_aggregator&&!this.statement.group&&this.statement.limit&&(u="ORDER BY "+this.statement.order.toString(),this.statement.order.forEach(_=>{_.is_func?r.push(_.initial_select_column.toString()):_.initial_select_column.tableid?r.push(`${_.initial_select_column.tableid}.${_.initial_select_column.columnid} AS ${_.expression.columnid}`):r.push(`${_.initial_select_column.columnid} AS ${_.expression.columnid}`)}));let f="",d="";!this.has_aggregator&&!this.statement.group&&!this.has_ordinal&&!this.statement.joins&&(f=this.statement.limit?"LIMIT "+this.statement.limit:"",d=this.statement.offset?"OFFSET "+this.statement.offset:"");let h=[];try{let _=`SELECT ${r.join(", ")} FROM ${i.join(" ")} ${l} ${u} ${f} ${d}`,p=this._convertColumnsToIndexes(_,s);h=await En.promise(p,t),t=null}catch(_){throw He.error("Error thrown from AlaSQL in SQLSearch class method processJoins."),He.error(_),new Error("There was a problem processing the data.")}if(h&&h.length>0){for(let _=0,p=h.length;_<p;_++){let S=h[_];o.forEach(g=>{S[g.key]!==null&&S[g.key]!==void 0&&g.keys.add(S[g.key])})}o.forEach(_=>{let p=Object.keys(this.data[`${_.schema}_${_.table}`].__merged_data),S=Yf.difference(p,[..._.keys].map(g=>g.toString()));for(let g=0,R=S.length;g<R;g++){let E=S[g];delete this.data[`${_.schema}_${_.table}`].__merged_data[E]}})}return{existing_attributes:c,joined_length:h?h.length:0}}async _getFinalAttributeData(t,r){if(r===0)return;let n=[],s=new vm(this.columns);for(let{node:i}of s)if(i&&i.columnid){let o=this._findColumn(i);if(o){let c=o.table.as?o.table.as:o.table.tableid;(!t[c]||t[c].indexOf(o.attribute)<0)&&n.push(o)}}n=Yf.uniqBy(n,i=>[i.table.databaseid,i.table.as?i.table.as:i.table.tableid,i.attribute].join());try{await this._getData(n)}catch(i){throw He.error("Error thrown from getData in SQLSearch class method getFinalAttributeData."),He.error(i),new Error(qs)}}async _getData(t){try{let r=t.reduce((n,s)=>{let i=`${s.table.databaseid}_${s.table.as?s.table.as:s.table.tableid}`;return n[i]?n[i].columns.push(s.attribute):n[i]={schema:s.table.databaseid,table:s.table.tableid,columns:[s.attribute]},n},{});for(let n in r){let s=r[n],i=this.data[n].__merged_data,o=[];for(let f in i)o.push(i[f][0]);this.data[n].__merged_attributes.push(...s.columns);let c={schema:s.schema,table:s.table,hash_values:o,get_attributes:s.columns},l=await su.getDataByHash(c),u=s.columns.length;for(let f=0,d=o.length;f<d;f++){let h=o[f],_=l.get(h);for(let p=0;p<u;p++){let S=s.columns[p],g=_[S]===void 0?null:_[S];this.data[n].__merged_data[h].push(g)}}}}catch(r){throw He.error("Error thrown from getDataByHash function in SQLSearch class method getData."),He.error(r),r}}async _finalSQL(){let t=[],r=this.statement.from[0];t.push(Object.values(this.data[`${r.databaseid_orig}_${r.as?r.as_orig:r.tableid_orig}`].__merged_data)),r.as=r.as?r.as:r.tableid,r.databaseid="",r.tableid="?",this.statement.joins&&this.statement.joins.forEach(s=>{s.as=s.as?s.as:s.table.tableid,t.push(Object.values(this.data[`${s.table.databaseid_orig}_${s.table.as?s.table.as_orig:s.table.tableid_orig}`].__merged_data)),s.table.databaseid="",s.table.tableid="?"}),this.statement.order&&this.statement.order.forEach(s=>{if(s.is_ordinal)return;this.statement.columns.filter(o=>{let c=o.aggregatorid?o.expression:o,l=o.aggregatorid?o.as_orig:c.as_orig;return s.expression.tableid?c.columnid_orig===s.expression.columnid_orig&&c.tableid_orig===s.expression.tableid_orig:c.columnid_orig===s.expression.columnid_orig||s.expression.columnid_orig===l}).length===0&&(s.expression.columnid=s.initial_select_column.columnid)}),!this.has_aggregator&&!this.statement.group&&!this.has_ordinal&&this.statement.limit&&!this.statement.joins&&(delete this.statement.limit,delete this.statement.offset);let n;try{let s=this._buildSQL();He.trace(`Final SQL: ${s}`),n=await En.promise(s,t),this.has_outer_join&&(n=this._translateUndefinedValues(n)),He.trace(`Final AlaSQL results data included ${n.length} rows`)}catch(s){throw He.error("Error thrown from AlaSQL in SQLSearch class method finalSQL."),He.error(s),new Error("There was a problem running the generated sql.")}return n}_translateUndefinedValues(t){try{let r=[];for(let n of t){let s=Object.create(null);Object.keys(n).forEach(i=>{n[i]===void 0?s[i]=null:s[i]=n[i]}),r.push(s)}return r}catch(r){return He.error(l6.HDB_ERROR_MSGS.OUTER_JOIN_TRANSLATION_ERROR),He.trace(r.stack),t}}_buildSQL(t=!0){let r=this.statement.toString();return r=r.replace(/NOT\(NULL\)/g,"NOT NULL"),this.statement.columns.forEach(n=>{if(n.funcid&&n.as){let s=n.toString().replace(" AS "+n.as,"");r=r.replace(n.toString(),s)}}),t===!0?this._convertColumnsToIndexes(r,this.tables):r}_convertColumnsToIndexes(t,r){let n=t,s={};r.forEach(i=>{i.databaseid_orig?s[`${i.databaseid_orig}_${i.as?i.as_orig:i.tableid_orig}`]=i.as?i.as:i.tableid:s[`${i.databaseid}_${i.as?i.as:i.tableid}`]=`\`${i.as?i.as:i.tableid}\``});for(let i in this.data)this.data[i].__merged_attributes.forEach((o,c)=>{let l=s[i],u=new RegExp(`${l}.\`${o}\``,"g"),f=`${l}.[${c}]`;n=n.replace(u,f)});for(let i in this.data)this.data[i].__merged_attributes.forEach((o,c)=>{let l=new RegExp(`\`${o}\``,"g"),u=`[${c}]`;n=n.replace(l,u)});return n}async _simpleSQLQuery(){let t=this.statement.columns.reduce((n,s)=>(s.as_orig&&s.as_orig!=s.columnid_orig?n[s.columnid_orig]=s.as_orig:n[s.columnid_orig]||(n[s.columnid_orig]=s.columnid_orig),n),{}),r=this.fetch_attributes.reduce((n,s)=>{let i=`${s.table.databaseid}_${s.table.as?s.table.as:s.table.tableid}`;return n[i]||(n[i]={}),n[i][t[s.attribute]]=null,n},{});for(let n of this.fetch_attributes){let s=`${n.table.databaseid}_${n.table.as?n.table.as:n.table.tableid}`,i={schema:n.table.databaseid,table:n.table.tableid,get_attributes:[n.attribute]};try{i.search_attribute=n.attribute,i.search_value="*";let o=await su.getDataByValue(i);for(let[c,l]of o)this.data[s].__merged_data[c]||(l[n.attribute]===void 0&&(l[n.attribute]=null),this.data[s].__merged_data[c]={...r[s]}),this.data[s].__merged_data[c][t[n.attribute]]=l[n.attribute]??null}catch(o){throw He.error("There was an error when processing this SQL operation. Check your logs"),He.error(o),new Error(qs)}}return Object.values(Object.values(this.data)[0].__merged_data)}};_v.exports=$R});var Vr=P((Tye,pv)=>{"use strict";var d6=ZM();pv.exports={searchByConditions:_6,searchByHash:h6,searchByValue:p6,search:m6};var VR=Gn(),{transformReq:KR}=oe(),f6=hv();async function _6(e){return KR(e),VR.searchByConditions(e)}a(_6,"searchByConditions");async function h6(e){KR(e),e.ids&&(e.hash_values=e.ids);let t=[];for await(let r of VR.searchByHash(e))r&&t.push(r);return t}a(h6,"searchByHash");async function p6(e){KR(e),e.hasOwnProperty("desc")===!0&&(e.reverse=e.desc);let t=[];for await(let r of VR.searchByValue(e))t.push(r);return t}a(p6,"searchByValue");function m6(e,t){try{let r=new d6(e);r.validate(),new f6(r.statement,r.attributes).search().then(s=>{t(null,s)}).catch(s=>{t(s,null)})}catch(r){return t(r)}}a(m6,"search")});var lo=P((Rye,Sv)=>{"use strict";var Wf=require("crypto"),E6=ce(),{CONFIG_PARAMS:g6}=(G(),D($)),Ev="aes-256-cbc",S6=32,T6=16,YR=64,gv=32,A6=YR+gv,mv=new Map;Sv.exports={encrypt:R6,decrypt:y6,createNatsTableStreamName:b6};function R6(e){let t=Wf.randomBytes(S6),r=Wf.randomBytes(T6),n=Wf.createCipheriv(Ev,Buffer.from(t),r),s=n.update(e);s=Buffer.concat([s,n.final()]);let i=t.toString("hex"),o=r.toString("hex"),c=s.toString("hex");return i+o+c}a(R6,"encrypt");function y6(e){let t=e.substr(0,YR),r=e.substr(YR,gv),n=e.substr(A6,e.length),s=Buffer.from(r,"hex"),i=Buffer.from(n,"hex"),o=Wf.createDecipheriv(Ev,Buffer.from(t,"hex"),s),c=o.update(i);return c=Buffer.concat([c,o.final()]),c.toString()}a(y6,"decrypt");function b6(e,t){let r=E6.get(g6.CLUSTERING_DATABASELEVEL)?e:`${e}.${t}`,n=mv.get(r);return n||(n=Wf.createHash("md5").update(r).digest("hex"),mv.set(r,n)),n}a(b6,"createNatsTableStreamName")});var uo=P((Oye,yv)=>{"use strict";var bye=Vr(),zf=X(),{validateBySchema:Tv}=st(),Mc=require("joi"),O6=lo(),Um=oe(),{handleHDBError:xm,hdb_errors:N6,ClientError:Av}=he(),{HDB_ERROR_MSGS:Bm,HTTP_STATUS_CODES:WR}=N6,Rv=ce();Rv.initSync();var{getDatabases:zR}=(Ue(),D(ct)),w6=require("fs-extra"),I6=(G(),D($));yv.exports={describeAll:C6,describeTable:Hm,describeSchema:P6};async function C6(e={}){try{let t=Um.isEmptyOrZeroLength(e),r=!!e.bypass_auth,n,s;!t&&!r&&(n=e.hdb_user?.role?.permission,s=n?.super_user||n?.cluster_user);let i=zR(),o={},c={},l=[],u=e?.exact_count;for(let d in i){o[d]=!0,!t&&!s&&!r&&(c[d]=e.hdb_user?.role?.permission[d]?.describe);let h=i[d];for(let _ in h)try{let p;if(t||s||r)p=await Hm({schema:d,table:_,exact_count:u});else if(n&&n[d].describe&&n[d].tables[_].describe){let S=n[d].tables[_].attribute_permissions;p=await Hm({schema:d,table:_,exact_count:u},S)}p&&l.push(p)}catch(p){zf.error(p)}}let f={};for(let d in l)t||s||r?(f[l[d].schema]==null&&(f[l[d].schema]={}),f[l[d].schema][l[d].name]=l[d],o[l[d].schema]&&delete o[l[d].schema]):c[l[d].schema]&&(f[l[d].schema]==null&&(f[l[d].schema]={}),f[l[d].schema][l[d].name]=l[d],o[l[d].schema]&&delete o[l[d].schema]);for(let d in o)t||s||r?f[d]={}:c[d]&&(f[d]={});return f}catch(t){return zf.error("Got an error in describeAll"),zf.error(t),xm(new Error,Bm.DESCRIBE_ALL_ERR)}}a(C6,"describeAll");async function Hm(e,t){Um.transformReq(e);let{schema:r,table:n}=e;r=r?.toString(),n=n?.toString();let s=t;e.hdb_user&&!e.hdb_user?.role?.permission?.super_user&&(s=e.hdb_user?.role?.permission[r]?.tables[n]?.attribute_permissions);let i=Tv(e,Mc.object({database:Mc.string(),table:Mc.string().required(),exact_count:Mc.boolean().strict()}));if(i)throw new Av(i.message);let c=zR()[r];if(!c)throw xm(new Error,Bm.SCHEMA_NOT_FOUND(e.schema),WR.NOT_FOUND);let l=c[n];if(!l)throw xm(new Error,Bm.TABLE_NOT_FOUND(e.schema,e.table),WR.NOT_FOUND);function u(_){f.push({attribute:_.attribute,type:_.type,elements:_.elements?.type,indexed:_.indexed,is_primary_key:_.isPrimaryKey,assigned_created_time:_.assignCreatedTime,assigned_updated_time:_.assignUpdatedTime,nullable:_.nullable,properties:_.properties?_.properties.map(p=>({type:p.type,name:p.name})):void 0})}a(u,"pushAtt");let f=[];if(s){let _={};s.forEach(p=>{p.describe&&(_[p.attribute_name]=!0)}),l.attributes.forEach(p=>{_[p.name]&&u(p)})}else l.attributes?.forEach(_=>u(_));let d;try{d=(await w6.stat(l.primaryStore.env.path)).size}catch(_){zf.warn("unable to get database size",_)}let h={schema:r,name:l.tableName,hash_attribute:l.attributes.find(_=>_.isPrimaryKey||_.is_hash_attribute)?.name,audit:l.audit,schema_defined:l.schemaDefined,attributes:f,db_size:d};l.replicate!==void 0&&(h.replicate=l.replicate),l.expirationMS!==void 0&&(h.expiration=l.expirationMS/1e3+"s"),l.sealed!==void 0&&(h.sealed=l.sealed),l.sources?.length>0&&(h.sources=l.sources.map(_=>_.name).filter(_=>_&&_!=="NATSReplicator"&&_!=="Replicator")),Rv.get(I6.CONFIG_PARAMS.CLUSTERING_ENABLED)&&(h.clustering_stream_name=O6.createNatsTableStreamName(h.schema,h.name));try{let _=await l.getRecordCount({exactCount:!!e.exact_count});h.record_count=_.recordCount,h.table_size=l.getSize(),h.db_audit_size=l.getAuditSize(),h.estimated_record_range=_.estimatedRange;let p=l.auditStore;if(p)for(let S of p.getKeys({reverse:!0,limit:1}))h.last_updated_record=S[0];if(!h.last_updated_record&&l.indices.__updatedtime__)for(let S of l.indices.__updatedtime__.getKeys({reverse:!0,limit:1}))h.last_updated_record=S}catch(_){zf.warn(`unable to stat table dbi due to ${_}`)}return h}a(Hm,"descTable");async function P6(e){Um.transformReq(e);let t=Tv(e,Mc.object({database:Mc.string(),exact_count:Mc.boolean().strict()}));if(t)throw new Av(t.message);let r;e.hdb_user&&!e.hdb_user?.role?.permission?.super_user&&(r=e.hdb_user?.role?.permission[e.schema]);let n=e.schema.toString(),i=zR()[n];if(!i)throw xm(new Error,Bm.SCHEMA_NOT_FOUND(e.schema),WR.NOT_FOUND);let o={};for(let c in i){let l;if(r&&r.tables[c]&&(l=r.tables[c]),Um.isEmpty(l)||l.describe){let u=await Hm({schema:e.schema,table:c,exact_count:e.exact_count},l?l.attribute_permissions:null);u&&(o[u.name]=u)}}return o}a(P6,"describeSchema")});var $s=P((Cye,Iv)=>{var D6=oo(),{callbackify:Ov,promisify:L6}=require("util"),{getDatabases:Nv}=(Ue(),D(ct));Iv.exports={setSchemaDataToGlobal:bv,getTableSchema:M6,getSystemSchema:v6,setSchemaDataToGlobalAsync:L6(bv)};var wv=uo(),wye=Ov(wv.describeAll),Iye=Ov(wv.describeTable);function bv(e){global.hdb_schema=Nv(),e&&e()}a(bv,"setSchemaDataToGlobal");function M6(e,t,r){let n=Nv()[e];if(!n)return r(`schema ${e} does not exist`);let s=n[t];return s?r(null,{schema:e,name:t,hash_attribute:s.primaryKey}):r(`table ${e}.${t} does not exist`)}a(M6,"getTableSchema");function v6(){return D6}a(v6,"getSystemSchema")});var QR=P((Dye,Dv)=>{var U6=st(),jR=require("joi"),{hdb_table:x6,hdb_database:Cv}=Ri(),Pv={schema:Cv,database:Cv,table:x6},B6={date:jR.date().iso().required()},H6={timestamp:jR.date().timestamp().required().messages({"date.format":"'timestamp' is invalid"})};Dv.exports=function(e,t){let r=t==="timestamp"?{...Pv,...H6}:{...Pv,...B6},n=jR.object(r);return U6.validateBySchema(e,n)}});var vv=P((Lye,Mv)=>{var k6=st(),JR=require("joi"),{hdb_table:F6,hdb_database:Lv}=Ri(),G6=JR.object({schema:Lv,database:Lv,table:F6,hash_values:JR.array().required(),ids:JR.array()});Mv.exports=function(e){return k6.validateBySchema(e,G6)}});var ty=P((Mye,Uv)=>{"use strict";var XR=class{static{a(this,"InsertObject")}constructor(t,r,n,s,i){this.operation=t,this.schema=r,this.table=n,this.hash_attribute=s,this.records=i}},ZR=class{static{a(this,"NoSQLSeachObject")}constructor(t,r,n,s,i,o){this.schema=t,this.table=r,this.search_attribute=n,this.hash_attribute=s,this.get_attributes=i,this.search_value=o}},ey=class{static{a(this,"DeleteResponseObject")}constructor(){this.message=void 0,this.deleted_hashes=[],this.skipped_hashes=[]}};Uv.exports={InsertObject:XR,NoSQLSeachObject:ZR,DeleteResponseObject:ey}});var xc=P((Uye,Fv)=>{"use strict";var Bv=QR(),q6=vv(),vc=oe(),xv=require("moment"),Hv=X(),{promisify:$6,callbackify:V6}=require("util"),Uc=(G(),D($)),K6=$s(),ry=$6(K6.getTableSchema),ny=Gn(),{DeleteResponseObject:Y6}=ty(),{handleHDBError:ua,hdb_errors:W6}=he(),{HDB_ERROR_MSGS:km,HTTP_STATUS_CODES:da}=W6,z6="records successfully deleted",j6=V6(kv);Fv.exports={delete:j6,deleteRecord:kv,deleteFilesBefore:Q6,deleteAuditLogsBefore:J6};async function Q6(e){let t=Bv(e,"date");if(t)throw ua(t,t.message,da.BAD_REQUEST,void 0,void 0,!0);if(vc.transformReq(e),!xv(e.date,xv.ISO_8601).isValid())throw ua(new Error,km.INVALID_DATE,da.BAD_REQUEST,Uc.LOG_LEVELS.ERROR,km.INVALID_DATE,!0);let n=vc.checkSchemaTableExist(e.schema,e.table);if(n)throw ua(new Error,n,da.NOT_FOUND,Uc.LOG_LEVELS.ERROR,n,!0);let s=await ny.deleteRecordsBefore(e);if(await ry(e.schema,e.table),Hv.info(`Finished deleting files before ${e.date}`),s&&s.message)return s.message}a(Q6,"deleteFilesBefore");async function J6(e){let t=Bv(e,"timestamp");if(t)throw ua(t,t.message,da.BAD_REQUEST,void 0,void 0,!0);if(vc.transformReq(e),isNaN(e.timestamp))throw ua(new Error,km.INVALID_VALUE("Timestamp"),da.BAD_REQUEST,Uc.LOG_LEVELS.ERROR,km.INVALID_VALUE("Timestamp"),!0);let r=vc.checkSchemaTableExist(e.schema,e.table);if(r)throw ua(new Error,r,da.NOT_FOUND,Uc.LOG_LEVELS.ERROR,r,!0);let n=await ny.deleteAuditLogsBefore(e);return await ry(e.schema,e.table),Hv.info(`Finished deleting audit logs before ${e.timestamp}`),n}a(J6,"deleteAuditLogsBefore");async function kv(e){e.ids&&(e.hash_values=e.ids);let t=q6(e);if(t)throw ua(t,t.message,da.BAD_REQUEST,void 0,void 0,!0);vc.transformReq(e);let r=vc.checkSchemaTableExist(e.schema,e.table);if(r)throw ua(new Error,r,da.NOT_FOUND,Uc.LOG_LEVELS.ERROR,r,!0);try{await ry(e.schema,e.table);let n=await ny.deleteRecords(e);return vc.isEmptyOrZeroLength(n.message)&&(n.message=`${n.deleted_hashes.length} of ${e.hash_values.length} ${z6}`),n}catch(n){if(n.message===Uc.SEARCH_NOT_FOUND_MESSAGE){let s=new Y6;return s.message=Uc.SEARCH_NOT_FOUND_MESSAGE,s.skipped_hashes=e.hash_values.length,s.deleted_hashes=0,s}throw n}}a(kv,"deleteRecord")});var Fm={};Be(Fm,{HASH_FUNCTION:()=>Jf,hash:()=>oy,validate:()=>ay});function sy(e=Qf){let t="0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";return Array.from(jf.randomBytes(e)).map(r=>t[r%t.length]).join("")}function oy(e,t=Jf[qv?.toUpperCase()]??"sha256"){return iy[t](e)}function ay(e,t,r=Jf[qv?.toUpperCase()]??"sha256"){return e?X6[r](e,t):!1}var jf,iu,Gv,qv,Qf,$v,Jf,iy,X6,Gm=be(()=>{jf=M(require("node:crypto")),iu=M(require("argon2")),Gv=M(ce());G();qv=(0,Gv.get)(B.AUTHENTICATION_HASHFUNCTION)?.toLowerCase(),Qf=16,$v=9,Jf=(n=>(n.MD5="md5",n.SHA256="sha256",n.ARGON2ID="argon2id",n))(Jf||{});a(sy,"generateSalt");iy={md5:a((e,t=void 0)=>{t=t??sy($v);let r=jf.createHash("md5").update(e+t).digest("hex");return t+r},"md5"),sha256:a((e,t=void 0)=>{t=t??sy(Qf);let r=jf.createHash("sha256").update(e+t).digest("hex");return t+r},"sha256"),argon2id:a(async e=>{let t=sy(Qf),r=await iu.hash(e,{type:iu.argon2id,salt:Buffer.from(t)});return t+r},"argon2id")},X6={md5:a((e,t)=>{let r=e.slice(0,$v);return e===iy.md5(t,r)},"md5"),sha256:a((e,t)=>{let r=e.slice(0,Qf);return e===iy.sha256(t,r)},"sha256"),argon2id:a(async(e,t)=>await iu.verify(e.slice(Qf),t),"argon2id")};a(oy,"hash");a(ay,"validate")});var Kv=P((kye,Vv)=>{var cy=st(),Kr={username:{presence:!0,exclusion:{within:["system"],message:"You cannot create tables within the system schema"}},password:{presence:!0},role:{presence:!0,format:"[\\w\\-\\_]+"},active:{presence:!0,inclusion:{within:[!0,!1],message:"must be a boolean"}}};function Z6(e){return Kr.password.presence=!0,Kr.username.presence=!0,Kr.role.presence=!0,Kr.active.presence=!0,cy.validateObject(e,Kr)}a(Z6,"addUserValidation");function eZ(e){return Kr.password.presence=!1,Kr.username.presence=!0,Kr.role.presence=!1,Kr.active.presence=!1,cy.validateObject(e,Kr)}a(eZ,"alterUserValidation");function tZ(e){return Kr.password.presence=!1,Kr.username.presence=!0,Kr.role.presence=!1,Kr.active.presence=!1,cy.validateObject(e,Kr)}a(tZ,"dropUserValidation");Vv.exports={addUserValidation:Z6,alterUserValidation:eZ,dropUserValidation:tZ}});var Dt=P((qye,Wv)=>{"use strict";var{platform:Gye}=require("os"),rZ="nats-server.zip",ly="nats-server",nZ=process.platform==="win32"?`${ly}.exe`:ly,sZ=/^[^\s.,*>]+$/,Yv="__request__",iZ=a(e=>`${e}.${Yv}`,"REQUEST_SUBJECT"),oZ={NATS_MSG_ID:"Nats-Msg-Id",ORIGIN:"origin",TRANSACTED_NODES:"transacted_nodes"},aZ={HUB_SERVER:"hub.json",LEAF_SERVER:"leaf.json"},cZ={HUB:"hub.pid",LEAF:"leaf.pid"},lZ={HUB:"-hub",LEAF:"-leaf",ADMIN:"-admin"},uZ={SUCCESS:"success",ERROR:"error"},dZ={OPEN:"open",CLOSED:"closed",NO_RESPONDERS:"NoResponders",TIMEOUT:"Timeout"},fZ={TXN:"txn",MSGID:"msgid"},ou={ERR:"error",WRN:"warn",INF:"info",DBG:"debug",TRC:"trace"},_Z={[ou.ERR]:1,[ou.WRN]:2,[ou.INF]:3,[ou.DBG]:4,[ou.TRC]:5},hZ={debug:"-D",trace:"-DVV"};Wv.exports={NATS_SERVER_ZIP:rZ,NATS_SERVER_NAME:ly,NATS_BINARY_NAME:nZ,PID_FILES:cZ,NATS_CONFIG_FILES:aZ,SERVER_SUFFIX:lZ,NATS_TERM_CONSTRAINTS_RX:sZ,REQUEST_SUFFIX:Yv,UPDATE_REMOTE_RESPONSE_STATUSES:uZ,CLUSTER_STATUS_STATUSES:dZ,REQUEST_SUBJECT:iZ,SUBJECT_PREFIXES:fZ,MSG_HEADERS:oZ,LOG_LEVELS:ou,LOG_LEVEL_FLAGS:hZ,LOG_LEVEL_HIERARCHY:_Z}});var qn=P((Vye,br)=>{"use strict";var Qv="username is required",Jv="nothing to update, must supply active, role or password to update",Xv="password cannot be an empty string",Zv="If role is specified, it cannot be empty.",eU="active must be true or false";br.exports.addUser=yZ;br.exports.alterUser=bZ;br.exports.dropUser=NZ;br.exports.getSuperUser=DZ;br.exports.userInfo=wZ;br.exports.listUsers=$m;br.exports.listUsersExternal=IZ;br.exports.setUsersWithRolesCache=Bc;br.exports.findAndValidateUser=gy;br.exports.getClusterUser=LZ;br.exports.getUsersWithRolesCache=PZ;br.exports.USERNAME_REQUIRED=Qv;br.exports.ALTERUSER_NOTHING_TO_UPDATE=Jv;br.exports.EMPTY_PASSWORD=Xv;br.exports.EMPTY_ROLE=Zv;br.exports.ACTIVE_BOOLEAN=eU;var tU=gn(),pZ=xc(),Xf=(Gm(),D(Fm)),rU=Kv(),Zf=Vr(),hy=_o(),Oi=oe(),nU=require("validate.js"),py=X(),{promisify:mZ}=require("util"),my=lo(),dy=(G(),D($)),zv=Dt(),EZ=It(),gZ=ce(),SZ=oo(),{hdb_errors:TZ,ClientError:Vs}=he(),{HTTP_STATUS_CODES:fo,AUTHENTICATION_ERROR_MSGS:uy,HDB_ERROR_MSGS:au}=TZ,{UserEventMsg:Ey}=Ks(),fy=require("lodash"),{server:qm}=(Dr(),D($l)),AZ=X();qm.getUser=(e,t)=>gy(e,t,t!=null);qm.authenticateUser=(e,t)=>gy(e,t);var sU={username:!0,active:!0,role:!0,password:!0},jv=new Map,RZ=mZ(pZ.delete),_y=gZ.get(dy.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??Xf.HASH_FUNCTION.SHA256,Ni;async function yZ(e){let t=nU.cleanAttributes(e,sU),r=rU.addUserValidation(t);if(r)throw new Vs(r.message);let n=await Zf.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["id","permission","role"]});if(!n||n.length<1)throw new Vs(au.ROLE_NAME_NOT_FOUND(t.role),fo.NOT_FOUND);if(n.length>1)throw new Vs(au.DUP_ROLES_FOUND(t.role),fo.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=my.encrypt(t.password)),t.password=await Xf.hash(t.password,_y),t.hash_function=_y,t.role=n[0].id;let s=await tU.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(py.debug(s),await Bc(),s.skipped_hashes.length===1)throw new Vs(au.USER_ALREADY_EXISTS(t.username),fo.CONFLICT);return hy.signalUserChange(new Ey(process.pid)),`${t.username} successfully added`}a(yZ,"addUser");async function bZ(e){let t=nU.cleanAttributes(e,sU);if(Oi.isEmptyOrZeroLength(t.username))throw new Error(Qv);if(Oi.isEmptyOrZeroLength(t.password)&&Oi.isEmptyOrZeroLength(t.role)&&Oi.isEmptyOrZeroLength(t.active))throw new Error(Jv);if(!Oi.isEmpty(t.password)&&Oi.isEmptyOrZeroLength(t.password.trim()))throw new Error(Xv);if(!Oi.isEmpty(t.active)&&!Oi.isBoolean(t.active))throw new Error(eU);if(!Oi.isEmpty(t.password)&&!Oi.isEmptyOrZeroLength(t.password.trim())&&(OZ(t.username)&&(t.hash=my.encrypt(t.password)),t.password=await Xf.hash(t.password,_y)),t.role==="")throw new Error(Zv);if(t.role){let n=await Zf.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["*"]});if(!n||n.length===0)throw new Vs(au.ALTER_USER_ROLE_NOT_FOUND(t.role),fo.NOT_FOUND);if(n.length>1)throw new Vs(au.DUP_ROLES_FOUND(t.role),fo.CONFLICT);t.role=n[0].id}let r=await tU.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await Bc(),hy.signalUserChange(new Ey(process.pid)),r}a(bZ,"alterUser");function OZ(e){let t=!1,r=Ni.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}a(OZ,"isClusterUser");async function NZ(e){let t=rU.dropUserValidation(e);if(t)throw new Vs(t.message);if(Ni.get(e.username)===void 0)throw new Vs(au.USER_NOT_EXIST(e.username),fo.NOT_FOUND);let r=await RZ({table:"hdb_user",schema:"system",hash_values:[e.username]});return py.debug(r),await Bc(),hy.signalUserChange(new Ey(process.pid)),`${e.username} successfully deleted`}a(NZ,"dropUser");async function wZ(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=fy.cloneDeep(e.hdb_user);let r=await Zf.searchByHash({schema:"system",table:"hdb_role",hash_values:[t.role.id],get_attributes:["*"]});return t.role=r[0],delete t.password,delete t.refresh_token,delete t.hash,delete t.hash_function,t}a(wZ,"userInfo");async function IZ(){let e=await $m();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}a(IZ,"listUsersExternal");async function $m(){let e=await Zf.searchByValue({schema:"system",table:"hdb_role",search_value:"*",search_attribute:"role",get_attributes:["*"]}),t={};for(let s of e)t[s.id]=fy.cloneDeep(s);if(Object.keys(t).length===0)return null;let r=await Zf.searchByValue({schema:"system",table:"hdb_user",search_value:"*",search_attribute:"username",get_attributes:["*"]}),n=new Map;for(let s of r)s=fy.cloneDeep(s),s.role=t[s.role],CZ(s.role),n.set(s.username,s);return n}a($m,"listUsers");function CZ(e){if(!e){py.error("invalid user role found.");return}e.permission.system||(e.permission.system={}),e.permission.system.tables||(e.permission.system.tables={});for(let t of Object.keys(SZ)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}a(CZ,"appendSystemTablesToRole");async function Bc(e=void 0){e?Ni=e:Ni=await $m()}a(Bc,"setUsersWithRolesCache");async function PZ(){return Ni||await Bc(),Ni}a(PZ,"getUsersWithRolesCache");async function gy(e,t,r=!0){Ni||await Bc();let n=Ni.get(e);if(!n){if(!r)return{username:e};throw new Vs(uy.GENERIC_AUTH_FAIL,fo.UNAUTHORIZED)}if(n&&!n.active)throw new Vs(uy.USER_INACTIVE,fo.UNAUTHORIZED);let s={active:n.active,username:n.username};if(n.refresh_token&&(s.refresh_token=n.refresh_token),n.role&&(s.role=n.role),r===!0){if(jv.get(t)===n.password)return s;{let i=Xf.validate(n.password,t,n.hash_function||Xf.HASH_FUNCTION.MD5);if(i?.then&&(i=await i),i===!0)jv.set(t,n.password);else throw new Vs(uy.GENERIC_AUTH_FAIL,fo.UNAUTHORIZED)}}return s}a(gy,"findAndValidateUser");async function DZ(){Ni||await Bc();for(let[,e]of Ni)if(e.role.role==="super_user")return e}a(DZ,"getSuperUser");async function LZ(){let e=await $m(),t=EZ.getConfigFromFile(dy.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==dy.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=my.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+zv.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+zv.SERVER_SUFFIX.ADMIN,r}a(LZ,"getClusterUser");var iU=[];qm.invalidateUser=function(e){for(let t of iU)try{t(e)}catch(r){AZ.error("Error invalidating user",r)}};qm.onInvalidatedUser=function(e){iU.push(e)}});var t_=P((zye,lU)=>{"use strict";var Hc=X(),$n=(G(),D($)),MZ=FM(),Yye=$s(),Wye=uo(),vZ=qn(),{validateEvent:oU}=Ks(),e_=Gn(),UZ=require("process"),{resetDatabases:xZ}=(Ue(),D(ct)),BZ={[$n.ITC_EVENT_TYPES.SCHEMA]:HZ,[$n.ITC_EVENT_TYPES.USER]:cU};async function HZ(e){let t=oU(e);if(t){Hc.error(t);return}Hc.trace("ITC schemaHandler received schema event:",e),await MZ(e.message),await kZ(e.message)}a(HZ,"schemaHandler");async function kZ(e){try{e_.resetReadTxn($n.SYSTEM_SCHEMA_NAME,$n.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),e_.resetReadTxn($n.SYSTEM_SCHEMA_NAME,$n.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),e_.resetReadTxn($n.SYSTEM_SCHEMA_NAME,$n.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=xZ();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){Hc.error(t)}}a(kZ,"syncSchemaMetadata");var aU=[];async function cU(e){try{try{e_.resetReadTxn($n.SYSTEM_SCHEMA_NAME,$n.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),e_.resetReadTxn($n.SYSTEM_SCHEMA_NAME,$n.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){Hc.warn(r)}let t=oU(e);if(t){Hc.error(t);return}Hc.trace(`ITC userHandler ${$n.HDB_ITC_CLIENT_PREFIX}${UZ.pid} received user event:`,e),await vZ.setUsersWithRolesCache();for(let r of aU)r()}catch(t){Hc.error(t)}}a(cU,"userHandler");cU.addListener=function(e){aU.push(e)};lU.exports=BZ});var Ks=P((ebe,dU)=>{"use strict";var Qye=X(),Sy=oe(),FZ=(G(),D($)),{ITC_ERRORS:r_}=Ln(),{parentPort:Jye,threadId:GZ,isMainThread:qZ,workerData:Xye}=require("worker_threads"),{onMessageFromWorkers:$Z,broadcast:Zye,broadcastWithAcknowledgement:VZ}=it();dU.exports={sendItcEvent:KZ,validateEvent:uU,SchemaEventMsg:YZ,UserEventMsg:WZ};var Vm;$Z(async(e,t)=>{Vm=Vm||t_(),uU(e),Vm[e.type]&&await Vm[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function KZ(e){return!qZ&&e.message&&(e.message.originator=GZ),VZ(e)}a(KZ,"sendItcEvent");function uU(e){if(typeof e!="object")return r_.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||Sy.isEmpty(e.type))return r_.MISSING_TYPE;if(!e.hasOwnProperty("message")||Sy.isEmpty(e.message))return r_.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||Sy.isEmpty(e.message.originator))return r_.MISSING_ORIGIN;if(FZ.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return r_.INVALID_EVENT(e.type)}a(uU,"validateEvent");function YZ(e,t,r,n=void 0,s=void 0){this.originator=e,this.operation=t,this.schema=r,this.table=n,this.attribute=s}a(YZ,"SchemaEventMsg");function WZ(e){this.originator=e}a(WZ,"UserEventMsg")});var _o=P((nbe,pU)=>{"use strict";var fU=(G(),D($)),rbe=oe(),Km=X(),_U=BM(),cu,{sendItcEvent:hU}=Ks();function zZ(e){try{Km.info("signalSchemaChange called with message:",e),cu=cu||t_();let t=new _U(fU.ITC_EVENT_TYPES.SCHEMA,e);return cu.schema(t),hU(t)}catch(t){Km.error(t)}}a(zZ,"signalSchemaChange");function jZ(e){try{Km.trace("signalUserChange called with message:",e),cu=cu||t_();let t=new _U(fU.ITC_EVENT_TYPES.USER,e);return cu.user(t),hU(t)}catch(t){Km.error(t)}}a(jZ,"signalUserChange");pU.exports={signalSchemaChange:zZ,signalUserChange:jZ}});var Ym=P((ibe,EU)=>{"use strict";var mU=oe(),QZ=(G(),D($)),JZ=X(),XZ=Dm(),ZZ=Pm(),e8=_o(),{SchemaEventMsg:t8}=Ks(),r8="already exists in";EU.exports=n8;async function n8(e,t,r){if(mU.isEmptyOrZeroLength(r))return r;let n=[];mU.isEmptyOrZeroLength(t.attributes)||t.attributes.forEach(i=>{n.push(i.attribute)});let s=r.filter(i=>n.indexOf(i)<0);return s.length===0||await Promise.all(s.map(async i=>{await s8(e,t.schema,t.name,i)})),s}a(n8,"lmdbCheckForNewAttributes");async function s8(e,t,r,n){let s=new ZZ(t,r,n,void 0,!0);e&&(s.hdb_auth_header=e);try{await i8(s)}catch(i){if(typeof i=="object"&&i.message!==void 0&&i.message.includes(r8))JZ.warn(`attribute ${t}.${r}.${n} already exists`);else throw i}}a(s8,"createNewAttribute");async function i8(e){let t;return t=await XZ(e),e8.signalSchemaChange(new t8(process.pid,QZ.OPERATIONS_ENUM.CREATE_ATTRIBUTE,e.schema,e.table,e.attribute)),t}a(i8,"createAttribute")});var lu=P((abe,gU)=>{"use strict";var Ty=class{static{a(this,"LMDBTransactionObject")}constructor(t,r,n,s,i=void 0){this.operation=t,this.user_name=r,this.timestamp=n,this.hash_values=s,this.origin=i}};gU.exports=Ty});var TU=P((lbe,SU)=>{"use strict";var o8=lu(),a8=(G(),D($)).OPERATIONS_ENUM,Ay=class extends o8{static{a(this,"LMDBInsertTransactionObject")}constructor(t,r,n,s,i=void 0){super(a8.INSERT,r,n,s,i),this.records=t}};SU.exports=Ay});var RU=P((dbe,AU)=>{"use strict";var c8=lu(),l8=(G(),D($)).OPERATIONS_ENUM,Ry=class extends c8{static{a(this,"LMDBUpdateTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(l8.UPDATE,n,s,i,o),this.records=t,this.original_records=r}};AU.exports=Ry});var bU=P((_be,yU)=>{"use strict";var u8=lu(),d8=(G(),D($)).OPERATIONS_ENUM,yy=class extends u8{static{a(this,"LMDBUpsertTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(d8.UPSERT,n,s,i,o),this.records=t,this.original_records=r}};yU.exports=yy});var NU=P((pbe,OU)=>{"use strict";var f8=lu(),_8=(G(),D($)).OPERATIONS_ENUM,by=class extends f8{static{a(this,"LMDBDeleteTransactionObject")}constructor(t,r,n,s,i=void 0){super(_8.DELETE,n,s,t,i),this.original_records=r}};OU.exports=by});var n_=P((gbe,PU)=>{"use strict";var Ebe=require("path"),wU=ht(),h8=TU(),p8=RU(),m8=bU(),E8=NU(),uu=Ft(),IU=oe(),{CONFIG_PARAMS:g8}=(G(),D($)),CU=ce();CU.initSync();var Wm=(G(),D($)).OPERATIONS_ENUM,{getTransactionAuditStorePath:S8}=gt();PU.exports=T8;async function T8(e,t){if(CU.get(g8.LOGGING_AUDITLOG)===!1)return;let r=S8(e.schema,e.table),n=await wU.openEnvironment(r,e.table,!0),s=A8(e,t);if(!(s===void 0||s.hash_values.length===0)&&n!==void 0){wU.initializeDBIs(n,uu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,uu.TRANSACTIONS_DBIS);let i=s.timestamp;return await n.dbis[uu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].ifNoExists(i,()=>{n.dbis[uu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].put(i,s),IU.isEmpty(s.user_name)||n.dbis[uu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].put(s.user_name,i);for(let o=0;o<s.hash_values.length;o++)n.dbis[uu.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].put(s.hash_values[o],i)})}}a(T8,"writeTransaction");function A8(e,t){let r=IU.isEmpty(e.hdb_user)?void 0:e.hdb_user?.username;if(e.operation===Wm.INSERT)return new h8(e.records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===Wm.UPDATE)return new p8(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===Wm.UPSERT)return new m8(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===Wm.DELETE)return new E8(t.deleted,t.original_records,r,t.txn_time,e.__origin)}a(A8,"createTransactionObject")});var Oy=P((Abe,DU)=>{"use strict";var R8=qf(),Tbe=_f(),s_=(G(),D($)),y8=hf(),b8=Pc().insertRecords,O8=ht(),N8=X(),w8=Ym(),{getSchemaPath:I8}=gt(),C8=n_();DU.exports=P8;async function P8(e){try{let{schema_table:t,attributes:r}=R8(e);y8(e,r,t.hash_attribute),e.schema!==s_.SYSTEM_SCHEMA_NAME&&(r.includes(s_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(s_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(s_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(s_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await w8(e.hdb_auth_header,t,r),s=I8(e.schema,e.table),i=await O8.openEnvironment(s,e.table),o=await b8(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await C8(e,o)}catch(c){N8.error(`unable to write transaction due to ${c.message}`)}return{written_hashes:o.written_hashes,skipped_hashes:o.skipped_hashes,schema_table:t,new_attributes:n,txn_time:o.txn_time}}catch(t){throw t}}a(P8,"lmdbCreateRecords")});var vU=P((ybe,MU)=>{"use strict";var LU=(G(),D($)),D8=Oy(),L8=_f(),M8=require("fs-extra"),{getSchemaPath:v8}=gt();MU.exports=U8;async function U8(e){let t=[{name:e.schema,createddate:Date.now()}],r=new L8(LU.SYSTEM_SCHEMA_NAME,LU.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,void 0,t);await D8(r),await M8.mkdirp(v8(e.schema))}a(U8,"lmdbCreateSchema")});var xU=P((Obe,UU)=>{"use strict";var Ny=class{static{a(this,"DeleteRecordsResponseObject")}constructor(t=[],r=[],n=void 0,s=[]){this.deleted=t,this.skipped=r,this.txn_time=n,this.original_records=s}};UU.exports=Ny});var FU=P((Pbe,kU)=>{"use strict";var BU=ht(),wy=ln(),Iy=Ln().LMDB_ERRORS_ENUM,x8=Ft(),HU=X(),wbe=oe(),B8=require("lmdb"),H8=xU(),k8=(G(),D($)),{OVERFLOW_MARKER:Ibe,MAX_SEARCH_KEY_LENGTH:Cbe}=x8,F8=k8.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function G8(e,t,r,n){if(wy.validateEnv(e),t===void 0)throw new Error(Iy.HASH_ATTRIBUTE_REQUIRED);if(!Array.isArray(r))throw r===void 0?new Error(Iy.IDS_REQUIRED):new Error(Iy.IDS_MUST_BE_ITERABLE);try{let s=BU.listDBIs(e);BU.initializeDBIs(e,t,s);let i=new H8,o,c=[],l=[];for(let h=0,_=r.length;h<_;h++)try{o=r[h];let p=e.dbis[t].get(o);if(!p||n&&p[F8]>n){i.skipped.push(o);continue}let S=e.dbis[t].ifVersion(o,B8.IF_EXISTS,()=>{e.dbis[t].remove(o);for(let g=0;g<s.length;g++){let R=s[g];if(!p.hasOwnProperty(R)||R===t)continue;let E=e.dbis[R],T=p[R];if(T!=null)try{let O=wy.getIndexedValues(T);if(O)for(let v=0,F=O.length;v<F;v++)E.remove(O[v],o)}catch{HU.warn(`cannot delete from attribute: ${R}, ${T}:${o}`)}}});c.push(S),l.push(o),i.original_records.push(p)}catch(p){HU.warn(p),i.skipped.push(o)}let u=[],f=await Promise.all(c);for(let h=0,_=f.length;h<_;h++)f[h]===!0?i.deleted.push(l[h]):(i.skipped.push(l[h]),u.push(h));let d=0;for(let h=0;h<u.length;h++){let _=u[h];i.original_records.splice(_-d,1),d++}return i.txn_time=wy.getNextMonotonicTime(),i}catch(s){throw s}}a(G8,"deleteRecords");kU.exports={deleteRecords:G8}});var i_=P((Lbe,qU)=>{"use strict";var du=oe(),q8=FU(),$8=ht(),{getSchemaPath:V8}=gt(),K8=n_(),Y8=X();qU.exports=W8;async function W8(e,t=!0){let n=global.hdb_schema[e.schema][e.table].hash_attribute;if(du.isEmpty(n))throw new Error(`could not retrieve hash attribute for schema:${e.schema} and table ${e.table}`);try{if(du.isEmptyOrZeroLength(e.hash_values)&&!du.isEmptyOrZeroLength(e.records)){e.hash_values=[];for(let c=0;c<e.records.length;c++){let l=e.records[c][n];du.isEmpty(l)||e.hash_values.push(l)}}if(du.isEmptyOrZeroLength(e.hash_values))return GU([],[]);if(!Array.isArray(e.hash_values))throw new Error("hash_values must be an array");if(du.isEmptyOrZeroLength(e.records)){e.records=[];for(let c=0;c<e.hash_values.length;c++)e.records[c]={[n]:e.hash_values[c]}}let s=V8(e.schema,e.table),i=await $8.openEnvironment(s,e.table),o=await q8.deleteRecords(i,n,e.hash_values,e.__origin?.timestamp);try{t===!0&&await K8(e,o)}catch(c){Y8.error(`unable to write transaction due to ${c.message}`)}return GU(o.deleted,o.skipped,o.txn_time)}catch(s){throw s}}a(W8,"lmdbDeleteRecords");function GU(e,t,r){let n=e.length+t.length,s=n===1?"record":"records";return{message:`${e.length} of ${n} ${s} successfully deleted`,deleted_hashes:e,skipped_hashes:t,txn_time:r}}a(GU,"createDeleteResponse")});var Py=P((Ube,$U)=>{"use strict";var z8=(G(),D($)),vbe=ln();function Cy(e,t){let r=Object.create(null);if(t.length===1&&z8.SEARCH_WILDCARDS.indexOf(t[0])>=0)Object.assign(r,e);else for(let n=0;n<t.length;n++){let s=t[n],i=e[s];r[s]=i===void 0?null:i}return r}a(Cy,"parseRow");function j8(e,t,r,n){let s=Cy(r,e);n.push(s)}a(j8,"searchAll");function Q8(e,t,r,n){let s=Cy(r,e);n[t]=s}a(Q8,"searchAllToMap");function J8(e,t,r){r[e]===void 0&&(r[e]=[]),r[e].push(t)}a(J8,"iterateDBI");function kc(e,t,r,n,s){let i=Object.create(null);i[s]=e;let o;n===s?o=e:(o=t,n!==void 0&&(i[n]=o)),r[0].push(o),r[1].push(i)}a(kc,"pushResults");function X8(e,t,r,n,s,i){t.toString().endsWith(e)&&kc(t,r,n,s,i)}a(X8,"endsWith");function Z8(e,t,r,n,s,i){t.toString().includes(e)&&kc(t,r,n,s,i)}a(Z8,"contains");function e5(e,t,r,n,s,i){t>e&&kc(t,r,n,s,i)}a(e5,"greaterThanCompare");function t5(e,t,r,n,s,i){t>=e&&kc(t,r,n,s,i)}a(t5,"greaterThanEqualCompare");function r5(e,t,r,n,s,i){t<e&&kc(t,r,n,s,i)}a(r5,"lessThanCompare");function n5(e,t,r,n,s,i){t<=e&&kc(t,r,n,s,i)}a(n5,"lessThanEqualCompare");$U.exports={parseRow:Cy,searchAll:j8,searchAllToMap:Q8,iterateDBI:J8,endsWith:X8,contains:Z8,greaterThanCompare:e5,greaterThanEqualCompare:t5,lessThanCompare:r5,lessThanEqualCompare:n5,pushResults:kc}});var fu=P((Fbe,QU)=>{"use strict";var fa=ht(),Bbe=X(),Vn=ln(),zm=Ft(),zt=Ln().LMDB_ERRORS_ENUM,Hbe=oe(),s5=(G(),D($)),jm=Py(),{parseRow:i5}=jm,kbe=require("lmdb"),{OVERFLOW_MARKER:VU,MAX_SEARCH_KEY_LENGTH:o5}=zm;function KU(e,t,r,n=!1,s=void 0,i=void 0){return Fc(e,t,r,(o,c)=>c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}))}a(KU,"iterateFullIndex");function o_(e,t,r,n,s,i=!1,o=void 0,c=void 0,l=!1,u=!1){return Fc(e,t,r,(f,d,h,_)=>{let E={transaction:f,start:i===!0?s:n,end:i===!0?n:s,reverse:i,limit:o,offset:c,inclusiveEnd:i===!0?!l:!u,exclusiveStart:i===!0?u:l};return _===r?(E.values=!1,d.getRange(E).map(T=>({value:T}))):d.getRange(E)})}a(o_,"iterateRangeBetween");function Fc(e,t,r,n){let s=e.database||e,i=fa.openDBI(s,r);i[zm.DBI_DEFINITION_NAME].is_hash_attribute?t=r:t&&fa.openDBI(s,t);let o;e.database?o=e:(o=e.useReadTransaction(),o.database=e);let c=n(o,i,s,t);return c.transaction=o,e.database||(c.onDone=()=>{o.done()}),c}a(Fc,"setupTransaction");function YU(e,t,r,n){let s;return function(i,o){if(typeof i=="string"&&i.endsWith(VU)){if(!s)if(r)s=fa.openDBI(e,r);else{let l=fa.listDBIs(e);for(let u=0,f=l.length;u<f&&(s=fa.openDBI(e,l[u]),!s[zm.DBI_DEFINITION_NAME].is_hash_attribute);u++);}i=s.get(o,{transaction:t,lazy:!0})[n]}return i}}a(YU,"getOverflowCheck");function a5(e,t,r,n=!1,s=void 0,i=void 0){if(Vn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);return Fc(e,t,t,(o,c,l)=>(Qm(r),r=a_(l,r),c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}).map(u=>i5(u.value,r))))}a(a5,"searchAll");function c5(e,t,r,n=!1,s=void 0,i=void 0){if(Vn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);Qm(r),r=a_(e.database||e,r);let o=new Map;for(let{key:c,value:l}of KU(e,t,t,n,s,i))o.set(c,jm.parseRow(l,r));return o}a(c5,"searchAllToMap");function l5(e,t,r=!1,n=void 0,s=void 0){if(Vn.validateEnv(e),t===void 0)throw new Error(zt.ATTRIBUTE_REQUIRED);let i=Object.create(null),o=KU(e,void 0,t,r,n,s),c=o.transaction,l=YU(c.database,c,void 0,t);for(let{key:u,value:f}of o){let d=l(u,f);i[d]===void 0&&(i[d]=[]),i[d].push(f)}return i}a(l5,"iterateDBI");function u5(e,t){if(Vn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);return fa.statDBI(e,t).entryCount}a(u5,"countAll");function d5(e,t,r,n,s=!1,i=void 0,o=void 0){return _a(e,r,n),Fc(e,t,r,(c,l,u,f)=>(n=Vn.convertKeyValueToWrite(n),f===r?l.get(n,{transaction:c,lazy:!0})===void 0?[]:[{key:n,value:n}]:l.getValues(n,{transaction:c,reverse:s,limit:i,offset:o}).map(d=>({key:n,value:d}))))}a(d5,"equals");function f5(e,t,r){return _a(e,t,r),fa.openDBI(e,t).getValuesCount(r)}a(f5,"count");function _5(e,t,r,n,s=!1,i=void 0,o=void 0){return _a(e,r,n),Fc(e,null,r,(c,l)=>{n=Vn.convertKeyValueToWrite(n);let u=!0;typeof n=="number"&&(u=!1);let f;if(s===!0){let d;for(let h of l.getKeys({transaction:c,start:n}))if(!h.startsWith(n)){d=h;break}return d!==void 0&&(Number.isInteger(o)?o++:i++),f=l.getRange({transaction:c,start:d,end:void 0,reverse:s,limit:i,offset:o}).map(h=>{let{key:_}=h;if(_!==d){if(_.toString().startsWith(n))return h;if(u===!0)return f.DONE}}),f.filter(h=>h)}else return f=l.getRange({transaction:c,start:n,reverse:s,limit:i,offset:o}).map(d=>{if(d.key.toString().startsWith(n))return d;if(u===!0)return f.DONE}),u?f:f.filter(d=>d)})}a(_5,"startsWith");function h5(e,t,r,n,s=!1,i=void 0,o=void 0){return WU(e,t,r,n,s,i,o,!0)}a(h5,"endsWith");function WU(e,t,r,n,s=!1,i=void 0,o=void 0,c=!1){return _a(e,r,n),Fc(e,null,r,(l,u,f,d)=>{let h=YU(f,l,d,r);return o=Number.isInteger(o)?o:0,u.getKeys({transaction:l,end:s?!1:void 0,reverse:s}).flatMap(_=>{let p=_.toString();return p.endsWith(VU)?u.getValues(_,{transaction:l}).map(S=>{let g=h(_,S);if(c?g.endsWith(n):g.includes(n))return{key:g,value:S}}).filter(S=>S):(c?p.endsWith(n):p.includes(n))?u[zm.DBI_DEFINITION_NAME].is_hash_attribute?{key:_,value:_}:u.getValues(_,{transaction:l}).map(S=>({key:_,value:S})):[]}).slice(o,i===void 0?void 0:i+(o||0))})}a(WU,"contains");function p5(e,t,r,n,s=!1,i=void 0,o=void 0){_a(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),o_(e,t,r,n,l,s,i,o,!0,!1)}a(p5,"greaterThan");function m5(e,t,r,n,s=!1,i=void 0,o=void 0){_a(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),o_(e,t,r,n,l,s,i,o,!1,!1)}a(m5,"greaterThanEqual");function E5(e,t,r,n,s=!1,i=void 0,o=void 0){_a(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),o_(e,t,r,l,n,s,i,o,!1,!0)}a(E5,"lessThan");function g5(e,t,r,n,s=!1,i=void 0,o=void 0){_a(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),o_(e,t,r,l,n,s,i,o,!1,!1)}a(g5,"lessThanEqual");function S5(e,t,r,n,s,i=!1,o=void 0,c=void 0){if(Vn.validateEnv(e),r===void 0)throw new Error(zt.ATTRIBUTE_REQUIRED);if(n===void 0)throw new Error(zt.START_VALUE_REQUIRED);if(s===void 0)throw new Error(zt.END_VALUE_REQUIRED);if(n=Vn.convertKeyValueToWrite(n),s=Vn.convertKeyValueToWrite(s),n>s)throw new Error(zt.END_VALUE_MUST_BE_GREATER_THAN_START_VALUE);return o_(e,t,r,n,s,i,o,c)}a(S5,"between");function T5(e,t,r,n){Vn.validateEnv(e);let s=e.database||e,i=e.database?e:null;if(t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);if(Qm(r),r=a_(s,r),n===void 0)throw new Error(zt.ID_REQUIRED);let o=null,c=s.dbis[t].get(n,{transaction:i,lazy:r.length<3});return c&&(o=jm.parseRow(c,r)),o}a(T5,"searchByHash");function A5(e,t,r){Vn.validateEnv(e);let n=e.database||e,s=e.database?e:null;if(t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(zt.ID_REQUIRED);let i=!0;return n.dbis[t].get(r,{transaction:s,lazy:!0})===void 0&&(i=!1),i}a(A5,"checkHashExists");function R5(e,t,r,n,s=[]){return jU(e,t,r,n,s),zU(e,t,r,n,s).map(i=>i[1])}a(R5,"batchSearchByHash");function y5(e,t,r,n,s=[]){jU(e,t,r,n,s);let i=new Map;for(let[o,c]of zU(e,t,r,n,s))i.set(o,c);return i}a(y5,"batchSearchByHashToMap");function zU(e,t,r,n,s=[]){return Fc(e,t,t,(i,o,c)=>{r=a_(c,r);let l=r.length<3;return n.map(u=>{let f=c.dbis[t].get(u,{transaction:i,lazy:l});if(f)return[u,jm.parseRow(f,r)];s.push(u)}).filter(u=>u)})}a(zU,"batchHashSearch");function jU(e,t,r,n,s){if(Vn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);if(Qm(r),n==null)throw new Error(zt.IDS_REQUIRED);if(!n[Symbol.iterator])throw new Error(zt.IDS_MUST_BE_ITERABLE)}a(jU,"initializeBatchSearchByHash");function Qm(e){if(!Array.isArray(e))throw e===void 0?new Error(zt.FETCH_ATTRIBUTES_REQUIRED):new Error(zt.FETCH_ATTRIBUTES_MUST_BE_ARRAY)}a(Qm,"validateFetchAttributes");function _a(e,t,r){if(Vn.validateEnv(e),t===void 0)throw new Error(zt.ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(zt.SEARCH_VALUE_REQUIRED);if(r?.length>o5)throw new Error(zt.SEARCH_VALUE_TOO_LARGE)}a(_a,"validateComparisonFunctions");function a_(e,t){return t.length===1&&s5.SEARCH_WILDCARDS.indexOf(t[0])>=0&&(t=fa.listDBIs(e)),t}a(a_,"setGetWholeRowAttributes");QU.exports={searchAll:a5,searchAllToMap:c5,count:f5,countAll:u5,equals:d5,startsWith:_5,endsWith:h5,contains:WU,searchByHash:T5,setGetWholeRowAttributes:a_,batchSearchByHash:R5,batchSearchByHashToMap:y5,checkHashExists:A5,iterateDBI:l5,greaterThan:p5,greaterThanEqual:m5,lessThan:E5,lessThanEqual:g5,between:S5}});var _u=P((qbe,t0)=>{var JU=require("lodash"),XU=st(),Fe=require("joi"),b5=oe(),{hdb_schema_table:c_,checkValidTable:ZU,hdb_table:e0,hdb_database:Jm}=Ri(),{handleHDBError:O5,hdb_errors:N5}=he(),{getDatabases:w5}=(Ue(),D(ct)),{HTTP_STATUS_CODES:I5}=N5,C5=Fe.object({database:Jm,schema:Jm,table:e0,search_attribute:c_,search_value:Fe.any().required(),get_attributes:Fe.array().min(1).items(Fe.alternatives(c_,Fe.object())).optional(),desc:Fe.bool(),limit:Fe.number().integer().min(1),offset:Fe.number().integer().min(0)}),P5=Fe.object({database:Jm,schema:Jm,table:e0,operator:Fe.string().valid("and","or").default("and").lowercase(),offset:Fe.number().integer().min(0),limit:Fe.number().integer().min(1),get_attributes:Fe.array().min(1).items(Fe.alternatives(c_,Fe.object())).optional(),sort:Fe.object({attribute:Fe.alternatives(c_,Fe.array().min(1)),descending:Fe.bool().optional()}).optional(),conditions:Fe.array().min(1).items(Fe.alternatives(Fe.object({operator:Fe.string().valid("and","or").default("and").lowercase(),conditions:Fe.array()}),Fe.object({search_attribute:Fe.alternatives(c_,Fe.array().min(1)),search_type:Fe.string().valid("equals","contains","starts_with","ends_with","greater_than","greater_than_equal","less_than","less_than_equal","between","not_equal").optional(),search_value:Fe.when("search_type",{switch:[{is:"equals",then:Fe.any()},{is:"between",then:Fe.array().items(Fe.alternatives([Fe.string(),Fe.number()])).length(2)}],otherwise:Fe.alternatives(Fe.string(),Fe.number())}).required()}))).required()});t0.exports=function(e,t){let r=null;switch(t){case"value":r=XU.validateBySchema(e,C5);break;case"hashes":let i=function(o){s?s+=". "+o:s=o};var n=i;a(i,"addError");let s;i(ZU("database",e.schema)),i(ZU("table",e.table)),e.hash_values?Array.isArray(e.hash_values)?e.hash_values.every(o=>typeof o=="string"||typeof o=="number")||i("'hash_values' must be strings or numbers"):i("'hash_values' must be an array"):i("'hash_values' is required"),e.get_attributes?Array.isArray(e.get_attributes)?e.get_attributes.length===0?i("'get_attributes' must contain at least 1 item"):e.get_attributes.every(o=>typeof o=="string"||typeof o=="number")||i("'get_attributes' must be strings or numbers"):i("'get_attributes' must be an array"):i("'get_attributes' is required"),s&&(r=new Error(s.trim()));break;case"conditions":r=XU.validateBySchema(e,P5);break;default:throw new Error(`Error validating search, unknown type: ${t}`)}if(!r&&e.schema!=="system"){let s=b5.checkGlobalSchemaTable(e.schema,e.table);if(s)return O5(new Error,s,I5.NOT_FOUND);let o=w5()[e.schema][e.table].attributes,c=e.get_attributes?[...e.get_attributes]:[];t==="value"&&c.push(e.search_attribute);let l=a(f=>{for(let d=0,h=f.conditions.length;d<h;d++){let _=f.conditions[d];_.conditions?l(_):c.push(_.search_attribute)}},"addConditions");t==="conditions"&&l(e);let u=JU.filter(c,f=>f!=="*"&&!f.startsWith?.("$")&&f.attribute!=="*"&&!Array.isArray(f)&&!f.name&&!JU.some(o,d=>d===f||d.attribute===f||d.attribute===f.attribute));if(u&&u.length>0){let f=u.join(", ");return f=f.replace(/,([^,]*)$/," and$1"),new Error(`unknown attribute '${f}'`)}}return r}});var Dy=P((Vbe,r0)=>{"use strict";var D5=ht(),L5=_u(),{getSchemaPath:M5}=gt();r0.exports=v5;function v5(e){let t=L5(e,"hashes");if(t)throw t;let r=M5(e.schema,e.table);return D5.openEnvironment(r,e.table)}a(v5,"initialize")});var Ly=P((Ybe,n0)=>{"use strict";var U5=fu(),x5=Dy();n0.exports=B5;async function B5(e){let t=await x5(e),r=t.useReadTransaction();r.database=t;let n=global.hdb_schema[e.schema][e.table];try{return U5.batchSearchByHashToMap(r,n.hash_attribute,e.get_attributes,e.hash_values)}finally{r.done()}}a(B5,"lmdbGetDataByHash")});var hu=P((zbe,s0)=>{"use strict";var My=class{static{a(this,"SearchByHashObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.hash_values=n,this.get_attributes=s}};s0.exports=My});var o0=P((Jbe,i0)=>{"use strict";var Qbe=hu(),H5=fu(),k5=Dy();i0.exports=F5;async function F5(e){let t=await k5(e),r=global.hdb_schema[e.schema][e.table];return H5.batchSearchByHash(t,r.hash_attribute,e.get_attributes,e.hash_values)}a(F5,"lmdbSearchByHash")});var Ys=P((Zbe,a0)=>{"use strict";var vy=class{static{a(this,"SearchObject")}constructor(t,r,n,s,i,o,c,l=!1,u=void 0,f=void 0){this.schema=t,this.table=r,this.search_attribute=n,this.search_value=s,this.hash_attribute=i,this.get_attributes=o,this.end_value=c,this.reverse=l,this.limit=u,this.offset=f}};a0.exports=vy});var Xm=P((tOe,_0)=>{"use strict";var Yr=fu(),G5=ht(),q5=oe(),Ge=Ft(),Gc=(G(),D($)),$5=oo(),c0=Ln().LMDB_ERRORS_ENUM,{getSchemaPath:V5}=gt(),ho=Gc.SEARCH_WILDCARDS;async function K5(e,t,r){let n;e.schema===Gc.SYSTEM_SCHEMA_NAME?n=$5[e.table]:n=global.hdb_schema[e.schema][e.table];let s=f0(e,n.hash_attribute,r,t);return u0(e,s,n.hash_attribute,r)}a(K5,"prepSearch");async function u0(e,t,r,n){let s=V5(e.schema,e.table),i=await G5.openEnvironment(s,e.table),o=d0(i,e,t,r),c=o.transaction||i;if([Ge.SEARCH_TYPES.BATCH_SEARCH_BY_HASH,Ge.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP,Ge.SEARCH_TYPES.SEARCH_ALL,Ge.SEARCH_TYPES.SEARCH_ALL_TO_MAP].indexOf(t)>=0)return o;if(Y5(e,r)===!1){let f=e.search_attribute;if(f===r)return n?l0(o,()=>!0):o.map(h=>({[r]:h.key}));let d=a(h=>({[r]:h.value,[f]:h.key}),"toObject");return n?l0(o,d):o.map(d)}let u=e.search_attribute===r?o.map(f=>f.key):o.map(f=>f.value);return n===!0?Yr.batchSearchByHashToMap(c,r,e.get_attributes,u):Yr.batchSearchByHash(c,r,e.get_attributes,u)}a(u0,"executeSearch");function d0(e,t,r,n){let s,i=n;t.get_attributes.indexOf(n)<0&&(i=void 0);let{reverse:o,limit:c,offset:l}=t;switch(o=typeof o=="boolean"?o:!1,c=Number.isInteger(c)?c:void 0,l=Number.isInteger(l)?l:void 0,r){case Ge.SEARCH_TYPES.EQUALS:s=Yr.equals(e,i,t.search_attribute,t.search_value,o,c,l);break;case Ge.SEARCH_TYPES.CONTAINS:s=Yr.contains(e,i,t.search_attribute,t.search_value,o,c,l);break;case Ge.SEARCH_TYPES.ENDS_WITH:case Ge.SEARCH_TYPES._ENDS_WITH:s=Yr.endsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case Ge.SEARCH_TYPES.STARTS_WITH:case Ge.SEARCH_TYPES._STARTS_WITH:s=Yr.startsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case Ge.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:return Yr.batchSearchByHash(e,t.search_attribute,t.get_attributes,[t.search_value]);case Ge.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:return Yr.batchSearchByHashToMap(e,t.search_attribute,t.get_attributes,[t.search_value]);case Ge.SEARCH_TYPES.SEARCH_ALL:return Yr.searchAll(e,n,t.get_attributes,o,c,l);case Ge.SEARCH_TYPES.SEARCH_ALL_TO_MAP:return Yr.searchAllToMap(e,n,t.get_attributes,o,c,l);case Ge.SEARCH_TYPES.BETWEEN:s=Yr.between(e,i,t.search_attribute,t.search_value,t.end_value,o,c,l);break;case Ge.SEARCH_TYPES.GREATER_THAN:case Ge.SEARCH_TYPES._GREATER_THAN:s=Yr.greaterThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case Ge.SEARCH_TYPES.GREATER_THAN_EQUAL:case Ge.SEARCH_TYPES._GREATER_THAN_EQUAL:s=Yr.greaterThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;case Ge.SEARCH_TYPES.LESS_THAN:case Ge.SEARCH_TYPES._LESS_THAN:s=Yr.lessThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case Ge.SEARCH_TYPES.LESS_THAN_EQUAL:case Ge.SEARCH_TYPES._LESS_THAN_EQUAL:s=Yr.lessThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;default:return Object.create(null)}return s}a(d0,"searchByType");function l0(e,t){let r=new Map;for(let n of e)r.set(n.value,t(n));return r}a(l0,"createMapFromIterable");function Y5(e,t){if(e.get_attributes.length===1&&e.get_attributes[0]==="*")return!0;let r=[e.search_attribute];e.get_attributes.indexOf(t)>=0&&r.push(t);let n=!1;for(let s=0;s<e.get_attributes.length;s++)if(r.indexOf(e.get_attributes[s])<0){n=!0;break}return n}a(Y5,"checkToFetchMore");function f0(e,t,r,n){if(q5.isEmpty(n)){let s=e.search_value;typeof s=="object"?s=JSON.stringify(s):s=s.toString();let i=s.charAt(0),o=s.charAt(s.length-1),c=!1;if(e.search_attribute===t&&(c=!0),ho.indexOf(s)>-1)return r===!0?Ge.SEARCH_TYPES.SEARCH_ALL_TO_MAP:Ge.SEARCH_TYPES.SEARCH_ALL;if(s.indexOf(ho[0])<0&&s.indexOf(ho[1])<0)return c===!0?r===!0?Ge.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:Ge.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:Ge.SEARCH_TYPES.EQUALS;if(ho.indexOf(i)>=0&&ho.indexOf(o)>=0)return e.search_value=e.search_value.slice(1,-1),Ge.SEARCH_TYPES.CONTAINS;if(ho.indexOf(i)>=0)return e.search_value=e.search_value.substr(1),Ge.SEARCH_TYPES.ENDS_WITH;if(ho.indexOf(o)>=0)return e.search_value=e.search_value.slice(0,-1),Ge.SEARCH_TYPES.STARTS_WITH;if(s.includes(ho[0])||s.includes(ho[1]))return Ge.SEARCH_TYPES.EQUALS;throw new Error(c0.UNKNOWN_SEARCH_TYPE)}else switch(n){case Gc.VALUE_SEARCH_COMPARATORS.BETWEEN:return Ge.SEARCH_TYPES.BETWEEN;case Gc.VALUE_SEARCH_COMPARATORS.GREATER:return Ge.SEARCH_TYPES.GREATER_THAN;case Gc.VALUE_SEARCH_COMPARATORS.GREATER_OR_EQ:return Ge.SEARCH_TYPES.GREATER_THAN_EQUAL;case Gc.VALUE_SEARCH_COMPARATORS.LESS:return Ge.SEARCH_TYPES.LESS_THAN;case Gc.VALUE_SEARCH_COMPARATORS.LESS_OR_EQ:return Ge.SEARCH_TYPES.LESS_THAN_EQUAL;default:throw new Error(c0.UNKNOWN_SEARCH_TYPE)}}a(f0,"createSearchTypeFromSearchObject");_0.exports={executeSearch:u0,createSearchTypeFromSearchObject:f0,prepSearch:K5,searchByType:d0}});var p0=P((sOe,h0)=>{"use strict";var nOe=Ys(),W5=_u(),z5=oe(),j5=(G(),D($)),Q5=Xm();h0.exports=J5;function J5(e,t){if(!z5.isEmpty(t)&&j5.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=W5(e,"value");if(n)throw n;return Q5.prepSearch(e,t,!0)}a(J5,"lmdbGetDataByValue")});var l_=P((aOe,m0)=>{"use strict";var oOe=Ys(),X5=_u(),Z5=oe(),e9=(G(),D($)),t9=Xm();m0.exports=r9;async function r9(e,t){if(!Z5.isEmpty(t)&&e9.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=X5(e,"value");if(n)throw n;return t9.prepSearch(e,t,!1)}a(r9,"lmdbSearchByValue")});var g0=P((uOe,E0)=>{"use strict";var lOe=Ft(),Uy=class{static{a(this,"SearchByConditionsObject")}constructor(t,r,n,s,i=void 0,o=void 0,c="and"){this.schema=t,this.table=r,this.get_attributes=n,this.limit=i,this.offset=o,this.conditions=s,this.operator=c}},xy=class{static{a(this,"SearchCondition")}constructor(t,r,n){this.search_attribute=t,this.search_type=r,this.search_value=n}},By=class{static{a(this,"SortAttribute")}constructor(t,r){this.attribute=t,this.desc=r}};E0.exports={SearchByConditionsObject:Uy,SearchCondition:xy,SortAttribute:By}});var y0=P((hOe,R0)=>{"use strict";var fOe=g0().SearchByConditionsObject,n9=Ys(),s9=_u(),Hy=fu(),Zm=Ft(),{Resource:_Oe}=(sa(),D(BA)),A0=Xm(),i9=Py(),o9=require("lodash"),{getSchemaPath:a9}=gt(),S0=ht(),{handleHDBError:c9,hdb_errors:l9}=he(),{HTTP_STATUS_CODES:u9}=l9,d9=1e8;R0.exports=f9;async function f9(e){let t=s9(e,"conditions");if(t)throw c9(t,t.message,u9.BAD_REQUEST,void 0,void 0,!0);e.operator=e.operator?e.operator.toLowerCase():void 0,e.offset=Number.isInteger(e.offset)?e.offset:0;let r=a9(e.schema,e.table),n=await S0.openEnvironment(r,e.table),s=global.hdb_schema[e.schema][e.table];for(let u of e.conditions)S0.openDBI(n,u.search_attribute);let i=o9.sortBy(e.conditions,u=>{if(u.estimated_count===void 0){let f=u.search_type;f===Zm.SEARCH_TYPES.EQUALS?u.estimated_count=Hy.count(n,u.search_attribute,u.search_value):f===Zm.SEARCH_TYPES.CONTAINS||f===Zm.SEARCH_TYPES.ENDS_WITH?u.estimated_count=1/0:u.estimated_count=d9}return u.estimated_count}),o=n.useReadTransaction();o.database=n;let c=await T0(o,e,i[0],s.hash_attribute),l;if(!e.operator||e.operator.toLowerCase()==="and"){let u=n.dbis[s.hash_attribute],f=i.slice(1).map(A0.filterByType),d=f.length,h=Hy.setGetWholeRowAttributes(n,e.get_attributes);l=c.map(_=>u.get(_,{transaction:o,lazy:!0})),d>0&&(l=l.filter(_=>{for(let p=0;p<d;p++)if(!f[p](_))return!1;return!0})),(e.offset||e.limit!==void 0)&&(l=l.slice(e.offset,e.limit!==void 0?(e.offset||0)+e.limit:void 0)),l=l.map(_=>i9.parseRow(_,h))}else{for(let d=1;d<i.length;d++){let h=i[d],_=await T0(o,e,h,s.hash_attribute);c=c.concat(_)}let u=new Set,f=e.offset||0;c=c.filter(d=>u.has(d)?!1:(u.add(d),!0)).slice(f,e.limit&&e.limit+f),l=Hy.batchSearchByHash(o,s.hash_attribute,e.get_attributes,c)}return l.onDone=()=>{o.done()},l}a(f9,"lmdbSearchByConditions");async function T0(e,t,r,n){let s=new n9(t.schema,t.table,void 0,void 0,n,t.get_attributes),i=r.search_type;return s.search_attribute=r.search_attribute,i===Zm.SEARCH_TYPES.BETWEEN?(s.search_value=r.search_value[0],s.end_value=r.search_value[1]):s.search_value=r.search_value,A0.searchByType(e,s,i,n).map(o=>o.value)}a(T0,"executeConditionSearch")});var u_=P((mOe,b0)=>{"use strict";var _9=(G(),D($)).OPERATIONS_ENUM,ky=class{static{a(this,"DeleteObject")}constructor(t,r,n,s=void 0){this.operation=_9.DELETE,this.schema=t,this.table=r,this.hash_values=n,this.__origin=s}};b0.exports=ky});var Fy=P((gOe,L0)=>{"use strict";var I0=Ys(),C0=u_(),P0=l_(),D0=i_(),Sn=(G(),D($)),O0=oe(),N0=ht(),{getTransactionAuditStorePath:h9,getSchemaPath:p9}=gt(),w0=X();L0.exports=m9;async function m9(e){try{if(O0.isEmpty(global.hdb_schema[e.schema])||O0.isEmpty(global.hdb_schema[e.schema][e.table]))throw new Error(`unknown schema:${e.schema} and table ${e.table}`);await E9(e),await g9(e);let t=p9(e.schema,e.table);try{await N0.deleteEnvironment(t,e.table)}catch(r){if(r.message==="invalid environment")w0.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}try{let r=h9(e.schema,e.table);await N0.deleteEnvironment(r,e.table,!0)}catch(r){if(r.message==="invalid environment")w0.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}}catch(t){throw t}}a(m9,"lmdbDropTable");async function E9(e){let t=new I0(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,Sn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[Sn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r=Array.from(await P0(t)),n=[];for(let i=0;i<r.length;i++){let o=r[i];n.push(o.id)}if(n.length===0)return;let s=new C0(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,n);await D0(s)}a(E9,"deleteAttributesFromSystem");async function g9(e){let t=new I0(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,Sn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,e.table,void 0,[Sn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,Sn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,Sn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r,n;try{r=Array.from(await P0(t))}catch(i){throw i}for(let i=0;i<r.length;i++){let o=r[i];o.name===e.table&&o.schema===e.schema&&(n=o)}if(!n)throw new Error(`${e.schema}.${e.table} was not found`);let s=new C0(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,[n.id]);try{await D0(s)}catch(i){throw i}}a(g9,"dropTableFromSystem")});var v0=P((TOe,M0)=>{"use strict";var S9=require("fs-extra"),T9=Ys(),A9=hu(),R9=u_(),y9=Fy(),b9=i_(),O9=Ly(),N9=l_(),po=(G(),D($)),{getSchemaPath:w9}=gt(),{handleHDBError:I9,hdb_errors:C9}=he(),{HDB_ERROR_MSGS:P9,HTTP_STATUS_CODES:D9}=C9;M0.exports=L9;async function L9(e){let t;try{t=await M9(e.schema);let r=new T9(po.SYSTEM_SCHEMA_NAME,po.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,po.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,t,void 0,[po.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),n=Array.from(await N9(r));for(let o=0;o<n.length;o++){let c={schema:t,table:n[o].name};try{await y9(c)}catch(l){if(l.message!=="invalid environment")throw l}}let s=new R9(po.SYSTEM_SCHEMA_NAME,po.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[t]);await b9(s);let i=w9(t);await S9.remove(i)}catch(r){throw r}}a(L9,"lmdbDropSchema");async function M9(e){let t=new A9(po.SYSTEM_SCHEMA_NAME,po.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[e],[po.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),r,n;try{r=Array.from(await O9(t))}catch(s){throw s}for(let[,s]of r)s.name===e&&(n=e);if(!n)throw I9(new Error,P9.SCHEMA_NOT_FOUND(e),D9.NOT_FOUND,void 0,void 0,!0);return n}a(M9,"validateDropSchema")});var d_=P((ROe,U0)=>{"use strict";var Gy=class{static{a(this,"CreateTableObject")}constructor(t,r,n){this.schema=t,this.table=r,this.hash_attribute=n}};U0.exports=Gy});var $y=P((OOe,x0)=>{"use strict";var v9=require("fs-extra"),eE=ht(),{getTransactionAuditStorePath:U9}=gt(),qy=Ft(),bOe=d_();x0.exports=x9;async function x9(e){let t;try{let r=U9(e.schema,e.table);await v9.mkdirp(r),t=await eE.createEnvironment(r,e.table,!0)}catch(r){throw r.message=`unable to create transactions audit environment for ${e.schema}.${e.table} due to: ${r.message}`,r}try{eE.createDBI(t,qy.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,!1,!0),eE.createDBI(t,qy.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,!0,!1),eE.createDBI(t,qy.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME,!0,!1)}catch(r){throw r.message=`unable to create dbi for ${e.schema}.${e.table} due to: ${r.message}`,r}return t}a(x9,"createTransactionsAuditEnvironment")});var k0=P((IOe,H0)=>{"use strict";var Vy=(G(),D($)),B0=ht(),B9=Pc(),{getSystemSchemaPath:H9,getSchemaPath:k9}=gt(),wOe=oo(),F9=Dm(),Ky=Pm(),G9=X(),q9=$y();H0.exports=$9;async function $9(e,t){let r=k9(t.schema,t.table),n=new Ky(t.schema,t.table,Vy.TIME_STAMP_NAMES_ENUM.CREATED_TIME,void 0,!0),s=new Ky(t.schema,t.table,Vy.TIME_STAMP_NAMES_ENUM.UPDATED_TIME,void 0,!0),i=new Ky(t.schema,t.table,t.hash_attribute,void 0,!1,!0);try{if(await B0.createEnvironment(r,t.table),e!==void 0){let o=await B0.openEnvironment(H9(),Vy.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME);await B9.insertRecords(o,HDB_TABLE_INFO.hash_attribute,hdb_table_attributes,[e]),n.skip_table_check=!0,s.skip_table_check=!0,i.skip_table_check=!0,await Yy(n),await Yy(s),await Yy(i)}await q9(t)}catch(o){throw o}}a($9,"lmdbCreateTable");async function Yy(e){try{await F9(e)}catch(t){G9.warn(`failed to create attribute ${e.attribute} due to ${t.message}`)}}a(Yy,"createAttribute")});var G0=P((POe,F0)=>{"use strict";var V9=qf(),K9=hf(),Y9=Ym(),f_=(G(),D($)),W9=Pc().updateRecords,z9=ht(),{getSchemaPath:j9}=gt(),Q9=n_(),J9=X();F0.exports=X9;async function X9(e){try{let{schema_table:t,attributes:r}=V9(e);K9(e,r,t.hash_attribute),e.schema!==f_.SYSTEM_SCHEMA_NAME&&(r.includes(f_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(f_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(f_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(f_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await Y9(e.hdb_auth_header,t,r),s=j9(e.schema,e.table),i=await z9.openEnvironment(s,e.table),o=await W9(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await Q9(e,o)}catch(c){J9.error(`unable to write transaction due to ${c.message}`)}return{written_hashes:o.written_hashes,skipped_hashes:o.skipped_hashes,schema_table:t,new_attributes:n,txn_time:o.txn_time}}catch(t){throw t}}a(X9,"lmdbUpdateRecords")});var $0=P((LOe,q0)=>{"use strict";var Z9=(G(),D($)).OPERATIONS_ENUM,Wy=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Z9.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};q0.exports=Wy});var K0=P((UOe,V0)=>{"use strict";var vOe=$0(),e7=qf(),t7=hf(),r7=Ym(),__=(G(),D($)),n7=Pc().upsertRecords,s7=ht(),{getSchemaPath:i7}=gt(),o7=n_(),a7=X(),{handleHDBError:c7,hdb_errors:l7}=he();V0.exports=u7;async function u7(e){let t;try{t=e7(e)}catch(l){throw c7(l,l.message,l7.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}let{schema_table:r,attributes:n}=t;t7(e,n,r.hash_attribute),e.schema!==__.SYSTEM_SCHEMA_NAME&&(n.includes(__.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||n.push(__.TIME_STAMP_NAMES_ENUM.CREATED_TIME),n.includes(__.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||n.push(__.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let s=await r7(e.hdb_auth_header,r,n),i=i7(e.schema,e.table),o=await s7.openEnvironment(i,e.table),c=await n7(o,r.hash_attribute,n,e.records,e.__origin?.timestamp);try{await o7(e,c)}catch(l){a7.error(`unable to write transaction due to ${l.message}`)}return{written_hashes:c.written_hashes,schema_table:r,new_attributes:s,txn_time:c.txn_time}}a(u7,"lmdbUpsertRecords")});var W0=P((BOe,Y0)=>{"use strict";var zy=class{static{a(this,"DeleteBeforeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.timestamp=n}};Y0.exports=zy});var j0=P((kOe,z0)=>{"use strict";var jy=class{static{a(this,"DeleteAuditLogsBeforeResults")}constructor(t=void 0,r=void 0,n=0){this.start_timestamp=t,this.end_timestamp=r,this.transactions_deleted=n}};z0.exports=jy});var X0=P((qOe,J0)=>{"use strict";var Qy=ht(),{getTransactionAuditStorePath:d7}=gt(),GOe=W0(),h_=Ft(),f7=oe(),Q0=j0(),_7=require("util").promisify,h7=_7(setTimeout),p7=1e4,m7=100;J0.exports=E7;async function E7(e){let t=d7(e.schema,e.table),r=await Qy.openEnvironment(t,e.table,!0),n=Qy.listDBIs(r);Qy.initializeDBIs(r,h_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s,i=new Q0;do s=await g7(r,e.timestamp),i.start_timestamp===void 0&&(i.start_timestamp=s.start_timestamp),s.end_timestamp!==void 0&&(i.end_timestamp=s.end_timestamp),i.transactions_deleted+=s.transactions_deleted,await h7(m7);while(s.transactions_deleted>0);return i}a(E7,"deleteAuditLogsBefore");async function g7(e,t){let r=new Q0;try{let n=e.dbis[h_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP],s;for(let{key:i,value:o}of n.getRange({start:!1})){if(i>=t)break;r.start_timestamp===void 0&&(r.start_timestamp=i),s=n.remove(i);let c=o[h_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME];f7.isEmpty(c)||(s=e.dbis[h_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].remove(c,i));for(let l=0;l<o.hash_values.length;l++)s=e.dbis[h_.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].remove(o.hash_values[l],i);if(r.transactions_deleted++,r.end_timestamp=i,r.transactions_deleted>p7)break}return await s,r}catch(n){throw n}}a(g7,"deleteTransactions")});var ex=P((VOe,Z0)=>{"use strict";var Jy=class{static{a(this,"DropAttributeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.attribute=n}};Z0.exports=Jy});var rx=P((WOe,tx)=>{"use strict";var S7=Ys(),T7=u_(),YOe=ex(),wi=(G(),D($)),A7=oe(),Xy=ht(),R7=oo(),y7=l_(),b7=i_(),{getSchemaPath:O7}=gt();tx.exports=N7;async function N7(e,t=!0){let r;e.schema===wi.SYSTEM_SCHEMA_NAME?r=R7[e.table]:r=global.hdb_schema[e.schema][e.table];let n=await I7(e),s=O7(e.schema,e.table),i=await Xy.openEnvironment(s,e.table);return t===!0&&await w7(e,i,r.hash_attribute),Xy.dropDBI(i,e.attribute),n}a(N7,"lmdbDropAttribute");async function w7(e,t,r){let n=Xy.openDBI(t,r),s,i=e.attribute;for(let{key:o,value:c,version:l}of n.getRange({start:!1,versions:!0})){let u={};for(let f in c)f!==i&&(u[f]=c[f]);s=t.dbis[r].put(o,u,l)}await s}a(w7,"removeAttributeFromAllObjects");async function I7(e){let t=new S7(wi.SYSTEM_SCHEMA_NAME,wi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,wi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[wi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY,wi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]),n=Array.from(await y7(t)).filter(o=>o[wi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]===e.attribute);if(A7.isEmptyOrZeroLength(n))throw new Error(`Attribute '${e.attribute}' was not found in '${e.schema}.${e.table}'`);let s=n.map(o=>o[wi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),i=new T7(wi.SYSTEM_SCHEMA_NAME,wi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,s);return b7(i)}a(I7,"dropAttributeFromSystem")});var cx=P((QOe,ax)=>{"use strict";var Zy=ht(),pu=Ft(),jOe=ln(),eb=(G(),D($)),nx=oe(),{getTransactionAuditStorePath:C7}=gt(),P7=fu(),tE=lu(),D7=X();ax.exports=L7;async function L7(e){let t=C7(e.schema,e.table),r=await Zy.openEnvironment(t,e.table,!0),n=Zy.listDBIs(r);Zy.initializeDBIs(r,pu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s;switch(e.search_type){case eb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.TIMESTAMP:return sx(r,e.search_values);case eb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:return s=global.hdb_schema[e.schema][e.table].hash_attribute,v7(r,e.search_values,s);case eb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME:return M7(r,e.search_values);default:return sx(r)}}a(L7,"readAuditLog");function sx(e,t=[0,Date.now()]){nx.isEmpty(t[0])&&(t[0]=0),nx.isEmpty(t[1])&&(t[1]=Date.now());let r=e.dbis[pu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP],n;for(let s of r.getKeys({start:t[1]}))if(s!==t[1]){n=s;break}return r.getRange({start:t[0],end:n}).map(({value:s})=>Object.assign(new tE,s))}a(sx,"searchTransactionsByTimestamp");function M7(e,t=[]){let r=new Map;for(let n=0;n<t.length;n++){let s=t[n],i=[];for(let o of e.dbis[pu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].getValues(s))i.push(o);r.set(s,ox(e,i))}return Object.fromEntries(r)}a(M7,"searchTransactionsByUsername");function v7(e,t,r){let n=new Map;for(let c=0,l=t.length;c<l;c++){let u=t[c],f=P7.equals(e,pu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,pu.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,u);for(let{value:d}of f){let h=Number(d);n.has(h)?n.get(h).push(u.toString()):n.set(h,[u.toString()])}}let s=Array.from(n.keys()),i=ox(e,s),o=new Map;for(let c=0;c<i.length;c++){let l=i[c],u=l.timestamp,f=n.get(u);ix(l,"records",r,f,o),ix(l,"original_records",r,f,o)}return Object.fromEntries(o)}a(v7,"searchTransactionsByHashValues");function ix(e,t,r,n,s){let i=e.timestamp;if(e[t])for(let o=0;o<e[t].length;o++){let c=e[t][o],l=c[r].toString();if(n.indexOf(l)>=0)if(s.has(l)){let u=s.get(l),f=u[u.length-1];if(f.timestamp===i)f[t]=[c];else{let d=new tE(e.operation,e.user_name,i,void 0);d[t]=[c],u.push(d)}}else{let u=new tE(e.operation,e.user_name,i,void 0);u[t]=[c],s.set(l,[u])}}}a(ix,"loopRecords");function ox(e,t){let r=[];try{let n=e.dbis[pu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP];for(let s=0;s<t.length;s++)try{let i=n.get(t[s]);if(i){let o=Object.assign(new tE,i);r.push(o)}}catch(i){D7.warn(i)}return r}catch(n){throw n}}a(ox,"batchSearchTransactions")});var ux=P((eNe,lx)=>{"use strict";var{getSchemaPath:XOe}=gt(),ZOe=ht(),{database:U7}=(Ue(),D(ct));lx.exports={writeTransaction:x7};async function x7(e,t,r){return U7({database:e,table:t}).transaction(r)}a(x7,"writeTransaction")});var hx=P((rNe,_x)=>{"use strict";var{getSchemaPath:dx}=gt(),fx=ht();_x.exports={flush:B7,resetReadTxn:H7};async function B7(e,t){return(await fx.openEnvironment(dx(e,t),t.toString())).flushed}a(B7,"flush");async function H7(e,t){try{(await fx.openEnvironment(dx(e,t),t.toString())).resetReadTxn()}catch{}}a(H7,"resetReadTxn")});var gx=P((sNe,Ex)=>{"use strict";var{Readable:k7}=require("stream"),{getDatabases:F7}=(Ue(),D(ct)),{readSync:G7,openSync:q7,createReadStream:px}=require("fs"),{open:$7}=require("lmdb"),mx=Bf(),V7=Hf(),{AUDIT_STORE_OPTIONS:K7}=(so(),D(Sx)),{INTERNAL_DBIS_NAME:Y7,AUDIT_STORE_NAME:W7}=Ft();Ex.exports=j7;var tb=32768,z7=100;async function j7(e){let t=e.database||e.schema||"data",r=F7()[t],n=new Date().toISOString(),s=e.tables||e.table&&[e.table];if(s){let u=r[s[0]];if(!u)throw new Error(`Can not find table ${s[0]}`);let f=u.dbisDB,d=$7({noSync:!0,maxDbs:V7.MAX_DBS}),h,_=d.openDB(Y7,new mx(!1)),p=f.useReadTransaction(),S=0,g=a(async function(E,T){T.encoding="binary",T.encoder=void 0;let O=d.openDB(E,T),v=f.openDB(E,T);for(let{key:F,version:q,value:j}of v.getRange({start:null,transaction:p,versions:v.useVersions}))h=O.put(F,j,q),S++%z7===0&&(await new Promise(te=>setTimeout(te,20)),p.openTimer&&(p.openTimer=0))},"copyDatabase");for(let{key:E,value:T}of f.getRange({transaction:p,start:!1}))if(s.some(O=>E.startsWith?.(O+"/"))){_.put(E,T);let[,O]=E.split("/"),v=!O,F=new mx(!v,v);await g(E,F)}e.include_audit&&await g(W7,{...K7}),await h;let R=px(d.path);return R.headers=l(),R.on("close",()=>{p.done(),d.close()}),R}let o=r[Object.keys(r)[0]].primaryStore,c=q7(o.path);return o.transaction(()=>{let u=Buffer.alloc(tb);G7(c,u,0,tb),o.resetReadTxn();let f=o.useReadTransaction();f.renew();let d=px(null,{fd:c,start:tb}),h=new k7.from(async function*(){yield u;for await(let _ of d)f.openTimer&&(f.openTimer=0),yield _;f.done()}());return h.headers=l(),h});function l(){let u=new Map;return u.set("content-type","application/octet-stream"),u.set("content-disposition",`attachment; filename="${t}"`),u.set("date",n),u}}a(j7,"getBackup")});var Rx=P((oNe,Ax)=>{"use strict";var Q7=X(),{handleHDBError:J7}=he(),X7=JL(),Z7=Dm(),eee=Oy(),tee=vU(),ree=i_(),nee=Ly(),see=o0(),iee=p0(),oee=l_(),aee=y0(),cee=v0(),lee=k0(),uee=G0(),dee=K0(),fee=X0(),_ee=Fy(),hee=rx(),pee=cx(),mee=ux(),Tx=hx(),Eee=gx(),rb=class extends X7{static{a(this,"LMDBBridge")}async searchByConditions(t){return aee(t)}async getDataByHash(t){return await nee(t)}async searchByHash(t){return await see(t)}async getDataByValue(t,r){return await iee(t,r)}async searchByValue(t){return await oee(t)}async createSchema(t){return await tee(t)}async dropSchema(t){return await cee(t)}async createTable(t,r){return await lee(t,r)}async dropTable(t){return await _ee(t)}async createAttribute(t){return await Z7(t)}async createRecords(t){return await eee(t)}async updateRecords(t){return await uee(t)}async upsertRecords(t){try{return await dee(t)}catch(r){throw J7(r,null,null,Q7.ERR,r)}}async deleteRecords(t){return await ree(t)}async dropAttribute(t){return await hee(t)}async deleteAuditLogsBefore(t){return await fee(t)}async readAuditLog(t){return await pee(t)}writeTransaction(t,r,n){return mee.writeTransaction(t,r,n)}flush(t,r){return Tx.flush(t,r)}resetReadTxn(t,r){return Tx.resetReadTxn(t,r)}getBackup(t){return Eee(t)}};Ax.exports=rb});var sb={};Be(sb,{add:()=>rE,applyReverse:()=>yx,getRecordAtTime:()=>nb,rebuildUpdateBefore:()=>nE});function rE(e,t,r){let n=e[t];typeof n=="bigint"?e[t]=n+BigInt(r.value):isNaN(e[t])?e[t]=r.value:e[t]=n+r.value}function nE(e,t,r){let n=null;for(let s in e)if(s in t){let i=t[s];if(i?.__op__){let o=e[s];if(o?.__op__)if(o.__op__===i.__op__)n||(n={}),n[s]=o;else throw new Error("Can not merge updates with different operations");else n||(n={}),n[s]=o,rE(n,s,i)}else r&&(n||(n={}),n[s]=i)}else n||(n={}),n[s]=e[s];return n}function yx(e,t){for(let r in t){let n=t[r];if(n?.__op__){let s=gee[n.__op__]?.reverse;if(s)s(e,r,{value:n.value});else throw new Error(`Unsupported operation ${n.__op__}`)}else e[r]=bx}}function nb(e,t,r){let n=r.rootStore.auditStore,s={...e.value},i=e.localTime;for(;i>t;){let l=n.get(i),u=Pt(l);switch(u.type){case"put":s=u.getValue(r);break;case"patch":yx(s,u.getValue(r));break;case"delete":s=null}i=u.previousLocalTime}let o={},c=0;for(let l in s)s[l]===bx&&(o[l]=!0,c++);for(;c>0&&i>0;){let l=n.get(i),u=Pt(l),f;switch(u.type){case"put":f=u.getValue(r);break;case"patch":f=u.getValue(r);break}for(let d in f)o[d]&&(s[d]=f[d],o[d]=!1,c--);i=u.previousLocalTime}if(c>0)for(let l in o)s[l]=null;return s}var gee,bx,sE=be(()=>{so();a(rE,"add");rE.reverse=function(e,t,r){let n=e[t];typeof n=="bigint"?e[t]=n-BigInt(r.value):isNaN(e[t])||(e[t]=n-r.value)};gee={add:rE};a(nE,"rebuildUpdateBefore");a(yx,"applyReverse");bx={};a(nb,"getRecordAtTime")});function Tn(e){let t=e.getChanges();return t||(t=Object.create(null),e._setChanges(t)),t}function cE(e,t){let r=e.prototype,n={},s=t.attributes||t.properties||[];for(let c of s){let l=c.name,u,f;if(c.resolve)f={get(){return c.resolve(this,this.getContext?.())},set(d){return c.set(this,d)},configurable:!0};else{switch(c.type){case"String":u=a(function(d){if(!(typeof d=="string"||d==null&&c.nullable!==!1))throw new Kn.ClientError(`${l} must be a string, attempt to assign ${d}`);Tn(this)[l]=d},"set");break;case"ID":u=a(function(d){if(!(typeof d=="string"||d?.length>0&&d.every?.(h=>typeof h=="string")||d==null&&c.nullable!==!1))throw new Kn.ClientError(`${l} must be a string, attempt to assign ${d}`);Tn(this)[l]=d},"set");break;case"Float":case"Number":u=a(function(d){let h=d?.__op__?d.value:d;if(!(typeof h=="number"||d==null&&c.nullable!==!1))throw new Kn.ClientError(`${l} must be a number, attempt to assign ${h}`);Tn(this)[l]=d},"set");break;case"Int":u=a(function(d){let h=d?.__op__?d.value:d;if(!(h>>0===h||d==null&&c.nullable!==!1))if(typeof h=="number"&&Math.abs((h>>0)-h)<=1)h=Math.round(h),d?.__op__?d.value=h:d=h;else throw new Kn.ClientError(`${l} must be an integer between -2147483648 and 2147483647, attempt to assign ${d}`);Tn(this)[l]=d},"set");break;case"Long":u=a(function(d){let h=d?.__op__?d.value:d;if(!(Math.round(h)===d&&Math.abs(h)<=9007199254740992||d==null&&c.nullable!==!1))if(typeof h=="number"&&Math.abs(h)<=9007199254740992)h=Math.round(h),d?.__op__?d.value=h:d=h;else throw new Kn.ClientError(`${l} must be an integer between -9007199254740992 and 9007199254740992, attempt to assign ${d}`);Tn(this)[l]=d},"set");break;case"BigInt":u=a(function(d){let h=d?.__op__?d.value:d;if(!(typeof h=="bigint"||d==null&&c.nullable!==!1))if(typeof h=="string"||typeof h=="number")h=BigInt(h),d?.__op__?d.value=h:d=h;else throw new Kn.ClientError(`${l} must be a number, attempt to assign ${d}`);Tn(this)[l]=d},"set");break;case"Boolean":u=a(function(d){if(!(typeof d=="boolean"||d==null&&c.nullable!==!1))throw new Kn.ClientError(`${l} must be a boolean, attempt to assign ${d}`);Tn(this)[l]=d},"set");break;case"Date":u=a(function(d){if(!(d instanceof Date||d==null&&c.nullable!==!1))if(typeof d=="string"||typeof d=="number")d=new Date(d);else throw new Kn.ClientError(`${l} must be a Date, attempt to assign ${d}`);Tn(this)[l]=d},"set");break;case"Bytes":u=a(function(d){if(!(d instanceof Uint8Array||d==null&&c.nullable!==!1))throw new Kn.ClientError(`${l} must be a Buffer or Uint8Array, attempt to assign ${d}`);Tn(this)[l]=d},"set");break;case"Blob":u=a(function(d){if(!(d instanceof gi||d==null&&c.nullable!==!1))throw new Kn.ClientError(`${l} must be a Blob, attempt to assign ${d}`);Tn(this)[l]=d},"set");break;case"Any":case void 0:u=a(function(d){Tn(this)[l]=d},"set");break;default:u=a(function(d){if(!(typeof d=="object"||d==null&&c.nullable!==!1))throw new Kn.ClientError(`${l} must be an object, attempt to assign ${d}`);Tn(this)[l]=d},"set")}f={get(){let d=this.getChanges?.();if(d&&l in d){let _=d[l];if(_?.__op__){let p=this.getRecord()?.[l];return _.update(p)}return _}let h=this.getRecord()?.[l];if(h&&typeof h=="object"){let _=ib(h,c);if(_)return d||this._setChanges(d=Object.create(null)),d[l]=_}return h},set:u,enumerable:!0,configurable:!0}}f.get.isAttribute=!0,n[l]=f,(!(l in r)||Object.getOwnPropertyDescriptor(r,l)?.get?.isAttribute)&&Object.defineProperty(r,l,f)}i("getProperty",function(c){let l=n[c];if(l)return l.get.call(this);let u=this.getChanges();return u?.[c]!==void 0?u[c]:this.getRecord()?.[c]}),i("set",function(c,l){let u=n[c];if(u)return u.set.call(this,l);if(t.sealed)throw new Kn.ClientError("Can not add a property to a sealed table schema");Tn(this)[c]=l}),i("deleteProperty",function(c){Tn(this)[c]=void 0}),i("toJSON",function(){let c=this.getChanges?.(),l;for(let f in c){l||(l={...this.getRecord()});let d=c[f];if(d?.__op__){let h=l[f];d=d.update(h)}l[f]=d}return Object.keys(this).length>0&&(l||(l={...this.getRecord()}),Object.assign(l,this)),l||this.getRecord()}),r.get||i("get",r.getProperty),r.delete||i("delete",r.deleteProperty),r.then||i("then",null);function i(c,l){Object.defineProperty(r,c,{value:l,configurable:!0})}a(i,"setMethod");let o=r;do{let c=Object.getPrototypeOf(o);if(c===Object.prototype){Object.setPrototypeOf(o,Nx);break}o=c}while(o&&o!==Nx)}function ib(e,t){let r;switch(e.constructor){case Object:return t?(r=t.TrackedObject,r||(t.TrackedObject=r=class extends p_{static{a(this,"TrackedObject")}},cE(r,t)),new r(e)):new p_(e);case Array:let n=new oE(e.length,e);for(let s=0,i=e.length;s<i;s++){let o=e[s];o&&typeof o=="object"&&(o=ib(o,t?.elements)),n[s]=o}return n;default:return e}}function lE(e){let t=e.getChanges?.(),r;for(let s in t){r||(r=e.getRecord?{...e.getRecord()}:{});let i=t[s];if(i&&typeof i=="object")if(i.__op__){let o=r[s];i=i.update(o)}else i=lE(i);r[s]=i}return Object.keys(e).length>0&&(r||(r=e.getRecord?{...e.getRecord()}:{}),Object.assign(r,e)),r||e.getRecord?.()||e}function $c(e,t=e.getChanges?.()){let r;if(e.getRecord&&e.constructor===Array&&!Object.isFrozen(e)){r=e;for(let n=0,s=e.length;n<s;n++){let i=e[n];if(i&&typeof i=="object"){let o=$c(i);o!==i&&r===e&&(r=e.slice(0)),i=o}r[n]=i}return Object.freeze(r)}for(let n in t){r||(r={...e.getRecord?.()});let s=t[n];if(s&&typeof s=="object")if(s.__op__){let i=sb[s?.__op__];if(i)i(r,n,s);else throw new Error("Invalid CRDT operation "+s.__op__);continue}else s=$c(s);r[n]=s}if(!Array.isArray(e))for(let n in e)See.call(e,n)&&(r||(r={...e.getRecord?.()}),r[n]=e[n]);return r?Object.freeze(r):e.getRecord?.()??e}function iE(e){let t=e.getRecord?.();if(t===void 0)return!0;if(e.constructor===Array){if(!t||e[qc]||e.length!==t.length)return!0;for(let r=0,n=e.length;r<n;r++){let s=t[r],i=e[r];if(s&&i?.getRecord?.()===s){if(iE(i))return!0}else return!0}}else{let r=e.getChanges?.();if(r&&!t)return!0;for(let n in r){let s=r[n];if(s&&typeof s=="object"){let i=t[n];if(i&&s.getRecord?.()===i){if(iE(s))return!0}else return!0}else return!0}}return!1}var Kn,Ox,Nx,p_,See,qc,oE,aE,ob=be(()=>{Kn=M(he());sE();_s();a(Tn,"getChanges");a(cE,"assignTrackedAccessors");Ox=Object.prototype,Nx=new Proxy({},{get(e,t,r){if(typeof t=="string"){if(t==="then"||t==="getRecord"||t==="getChanges")return;if(Ox[t])return Ox[t];let n=r.getChanges?.();if(n&&t in n)return n[t];let s=r.getRecord?.()?.[t];if(s&&typeof s=="object"){let i=ib(s);if(i)return n||(n=Object.create(null),r._setChanges(n)),n[t]=i,i}return s}}});a(ib,"trackObject");p_=class{static{a(this,"GenericTrackedObject")}#e;#t;constructor(t){if(t?.getRecord)throw new Error("Can not track an already tracked object, check for circular references");this.#e=t}getRecord(){return this.#e}setRecord(t){this.#e=t}getChanges(){return this.#t}_setChanges(t){this.#t=t}};cE(p_,{});a(lE,"collapseData");See=Object.prototype.hasOwnProperty;a($c,"updateAndFreeze");a(iE,"hasChanges");qc=Symbol.for("has-array-changes"),oE=class extends Array{static{a(this,"TrackedArray")}#e;[qc];constructor(t,r){super(t),this.#e=r}getRecord(){return this.#e}splice(...t){return this[qc]=!0,super.splice(...t)}push(...t){return this[qc]=!0,super.push(...t)}pop(){return this[qc]=!0,super.pop()}unshift(...t){return this[qc]=!0,super.unshift(...t)}shift(){return this[qc]=!0,super.shift()}};oE.prototype.constructor=Array;aE=class{constructor(t){this.value=t}static{a(this,"Addition")}__op__="add";update(t){return(+t||0)+this.value}}});var vx={};Be(vx,{ResourceBridge:()=>lb});function ub({get_attributes:e},t){if(e){if(e[0]==="*"){if(t.schemaDefined)return;e=t.attributes.map(r=>r.name)}return e.forceNulls=!0,e}}function Ix(e,t){let r=Ii(e),n=ub(e,r);if(!r)throw new Ws.ClientError(`Table ${e.table} not found`);let s;n&&r.attributes.length-n.length>2&&n.length<5&&(s=!0);let i={user:e.hdb_user,onlyIfCached:e.onlyIfCached,noCacheStore:e.noCacheStore,noCache:e.noCache,replicateFrom:e.replicateFrom},o;Ct(i,()=>new Promise(u=>o=u));let c=e.ids||e.hash_values,l=0;return{[Symbol.asyncIterator](){return{async next(){if(l<c.length){let u=c[l++],f;try{f=await r.get({id:u,lazy:s,select:n},i),f=f&&lE(f)}catch(d){f={message:d.toString()}}return t?{value:{key:u,value:f}}:{value:f}}else return o(),{done:!0}},return(u){return o(),{value:u,done:!0}},throw(u){return o(),{done:!0}}}}}}function Ii(e){let t=e.database||e.schema||Aee,r=Ze()[t];if(!r)throw(0,Ws.handleHDBError)(new Error,Tee.SCHEMA_NOT_FOUND(t),404);return r[e.table]}function Cx(e,t,r){let n=e.length+t.length,s=n===1?"record":"records";return{message:`${e.length} of ${n} ${s} successfully deleted`,deleted_hashes:e,skipped_hashes:t,txn_time:r}}async function*Px(e,t,r,n){let s,i=0;for await(let o of e.getHistory(t,r)){let c=o.operation??o.type;c==="put"&&(c="upsert");let{id:l,version:u,value:f}=o;if(s?.timestamp===u)s.hash_values.push(l),s.records.push(f);else{if(s&&(yield s,i++,n&&n<=i)){s=void 0;break}s={operation:c,user_name:o.user,timestamp:u,hash_values:[l],records:[f]}}}s&&(yield s)}var Dx,uE,Ws,Lx,ab,cb,Mx,Tee,Aee,Ree,yee,wx,lb,Ux=be(()=>{"use strict";Dx=M(Rx()),uE=M(_u()),Ws=M(he());Ue();Lx=M(qf());G();ab=M(_o()),cb=M(Ks()),Mx=M(oe());pc();ob();({HDB_ERROR_MSGS:Tee}=Ws.hdb_errors),Aee="data",Ree=1e4,yee=10,lb=class extends Dx.default{static{a(this,"ResourceBridge")}constructor(t){super(t),wx=this}async searchByConditions(t){t.select!==void 0&&(t.get_attributes=t.select);for(let o of t.conditions||[])o?.attribute!==void 0&&(o.search_attribute=o.attribute),o?.comparator!==void 0&&(o.search_type=o.comparator),o?.value!==void 0&&(o.search_value=o.value);let r=(0,uE.default)(t,"conditions");if(r)throw(0,Ws.handleHDBError)(r,r.message,400,void 0,void 0,!0);let n=Ii(t);if(!n)throw new Ws.ClientError(`Table ${t.table} not found`);let s=t.conditions.map(i);function i(o){return o.conditions?(o.conditions=o.conditions.map(i),o):{attribute:o.search_attribute??o.attribute,comparator:o.search_type??o.comparator,value:o.search_value!==void 0?o.search_value:o.value}}return a(i,"mapCondition"),n.search({conditions:s,operator:t.operator?t.operator.toLowerCase():void 0,limit:t.limit,offset:t.offset,reverse:t.reverse,select:ub(t,n),sort:t.sort,allowFullScan:!0},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async createTable(t,r){let n=r.attributes,s=!!n,i=r.primary_key||r.hash_attribute;if(n)for(let o of n)o.is_primary_key?(o.isPrimaryKey=!0,delete o.is_primary_key):o.name===i&&i&&(o.isPrimaryKey=!0);else{if(!i)throw new Ws.ClientError("A primary key must be specified with a `primary_key` property or with `attributes`");n=[{name:i,isPrimaryKey:!0},{name:"__createdtime__",indexed:!0},{name:"__updatedtime__",indexed:!0}]}_t({database:r.database??r.schema,table:r.table,attributes:n,schemaDefined:s,expiration:r.expiration,audit:r.audit})}async createAttribute(t){return await Ii(t).addAttributes([{name:t.attribute,indexed:t.indexed??!0}]),`attribute ${t.schema}.${t.table}.${t.attribute} successfully created.`}async dropAttribute(t){let r=Ii(t);if(await r.removeAttributes([t.attribute]),!r.schemaDefined){let n=t.attribute,s,i=a((o,c,l)=>(c={...c},delete c[n],r.primaryStore.ifVersion(o,l,()=>r.primaryStore.put(o,c,l)).then(u=>{if(!u){let{value:f,version:d}=r.primaryStore.getEntry(o);return i(o,f,d)}})),"deleteRecord");for(let{key:o,value:c,version:l}of r.primaryStore.getRange({start:!0,versions:!0}))s=i(o,c,l),await new Promise(u=>setImmediate(u));await s}return`successfully deleted ${t.schema}.${t.table}.${t.attribute}`}dropTable(t){Ii(t).dropTable()}createSchema(t){return mu({database:t.schema,table:null}),ab.signalSchemaChange(new cb.SchemaEventMsg(process.pid,Yt.CREATE_SCHEMA,t.schema))}async dropSchema(t){await db(t.schema),ab.signalSchemaChange(new cb.SchemaEventMsg(process.pid,Yt.DROP_SCHEMA,t.schema))}async updateRecords(t){return t.requires_existing=!0,this.upsertRecords(t)}async createRecords(t){return t.requires_no_existing=!0,wx.upsertRecords(t)}async upsertRecords(t){let{schema_table:r,attributes:n}=(0,Lx.default)(t),s,i=Ze()[t.schema][t.table],o={user:t.hdb_user,expiresAt:t.expiresAt,originatingOperation:t.operation};return t.replicateTo&&(o.replicateTo=t.replicateTo),t.replicatedConfirmation&&(o.replicatedConfirmation=t.replicatedConfirmation),Ct(o,async c=>{if(!i.schemaDefined){s=[];for(let f of n)i.attributes.find(h=>h.name==f)||s.push(f);s.length>0&&await i.addAttributes(s.map(f=>({name:f,indexed:!0})))}let l=[],u=[];for(let f of t.records){let d=f[i.primaryKey],h=d!=null&&await i.get(d,o);if(t.requires_existing&&!h||t.requires_no_existing&&h){u.push(f[i.primaryKey]);continue}h&&(h=lE(h));for(let _ in f)if(Object.prototype.hasOwnProperty.call(f,_)){let p=f[_];if(typeof p=="function")try{let S=p([[h]]);Array.isArray(S)&&(p=S[0].func_val,f[_]=p)}catch(S){throw S.message+="Trying to set key "+_+" on object"+JSON.stringify(f),S}}if(h)for(let _ in h)Object.prototype.hasOwnProperty.call(f,_)||(f[_]=h[_]);await(d==null?i.create(f,o):i.put(f,o)),l.push(f[i.primaryKey])}return{txn_time:c.timestamp,written_hashes:l,new_attributes:s,skipped_hashes:u}})}async deleteRecords(t){let r=Ze()[t.schema][t.table],n={user:t.hdb_user};return t.replicateTo&&(n.replicateTo=t.replicateTo),t.replicatedConfirmation&&(n.replicatedConfirmation=t.replicatedConfirmation),Ct(n,async s=>{let i=t.hash_values||t.records.map(l=>l[r.primaryKey]),o=[],c=[];for(let l of i)await r.delete(l,n)?o.push(l):c.push(l);return Cx(o,c,s.timestamp)})}async deleteRecordsBefore(t){let r=Ze()[t.schema][t.table];if(!r.createdTimeProperty)throw new Ws.ClientError("Table must have a '__createdtime__' attribute or @createdTime timestamp defined to perform this operation");let n=await r.search({conditions:[{attribute:r.createdTimeProperty.name,value:Date.parse(t.date),comparator:wp.LESS}]}),s=!1,i=[],o=[],c=0,l=[],u=a(async()=>{let f=await this.deleteRecords({schema:t.schema,table:t.table,hash_values:l});i.push(...f.deleted_hashes),o.push(...f.skipped_hashes),await(0,Mx.async_set_timeout)(yee),l=[],s=!0},"chunkDelete");for await(let f of n)l.push(f[r.primaryKey]),c++,c%Ree===0&&await u();return l.length>0&&await u(),s?Cx(i,o,void 0):{message:"No records found to delete"}}searchByHash(t){t.select!==void 0&&(t.get_attributes=t.select);let r=(0,uE.default)(t,"hashes");if(r)throw r;return Ix(t)}async getDataByHash(t){let r=new Map;t._returnKeyValue=!0;for await(let{key:n,value:s}of Ix(t,!0))r.set(n,s);return r}searchByValue(t,r){if(r&&cA[r]===void 0)throw new Error(`Value search comparator - ${r} - is not valid`);t.select!==void 0&&(t.get_attributes=t.select),t.attribute!==void 0&&(t.search_attribute=condition.attribute),t.value!==void 0&&(t.search_value=condition.value);let n=(0,uE.default)(t,"value");if(n)throw n;let s=Ii(t);if(!s)throw new Ws.ClientError(`Table ${t.table} not found`);let i=t.search_value;i.includes?.("*")&&(i.startsWith("*")?i.endsWith("*")?i!=="*"&&(r="contains",i=i.slice(1,-1)):(r="ends_with",i=i.slice(1)):i.endsWith("*")&&(r="starts_with",i=i.slice(0,-1))),r===wp.BETWEEN&&(i=[i,t.end_value]);let o=i==="*"?[]:[{attribute:t.search_attribute,value:i,comparator:r}];return s.search({conditions:o,allowFullScan:!0,limit:t.limit,offset:t.offset,reverse:t.reverse,sort:t.sort,select:ub(t,s)},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async getDataByValue(t,r){let n=new Map,s=Ii(t);t.get_attributes&&!t.get_attributes.includes(s.primaryKey)&&t.get_attributes[0]!=="*"&&t.get_attributes.push(s.primaryKey);for await(let i of this.searchByValue(t,r))n.set(i[s.primaryKey],i);return n}resetReadTxn(t,r){Ii({schema:t,table:r})?.primaryStore.resetReadTxn()}async deleteAuditLogsBefore(t){return Ii(t).deleteHistory(t.timestamp,t.cleanup_deleted_records)}async readAuditLog(t){let r=Ii(t),n={};switch(t.search_type){case Ip.HASH_VALUE:for(let i of t.search_values)n[i]=(await r.getHistoryOfRecord(i)).map(o=>{let c=o.operation??o.type;return c==="put"&&(c="upsert"),{operation:c,timestamp:o.version,user_name:o.user,hash_values:[i],records:[o.value]}});return n;case Ip.USERNAME:let s=t.search_values;for await(let i of Px(r))s.includes(i.user_name)&&(n[i.user_name]||(n[i.user_name]=[])).push(i);return n;default:return Px(r,t.search_values?.[0],t.search_values?.[1],t.limit)}}};a(ub,"getSelect");a(Ix,"getRecords");a(Ii,"getTable");a(Cx,"createDeleteResponse");a(Px,"groupRecordsInHistory")});var Gn=P((SNe,xx)=>{"use strict";var{ResourceBridge:bee}=(Ux(),D(vx)),Oee=ce();Oee.initSync();var dE;function Nee(){return dE||(dE=new bee,dE)}a(Nee,"getBridge");xx.exports=Nee()});var gn=P((ANe,Fx)=>{"use strict";var _E=oR(),Mr=oe(),wee=require("util"),hE=Gn(),Iee=$s(),Bx=X(),{handleHDBError:Vc,hdb_errors:Cee}=he(),{HTTP_STATUS_CODES:Kc}=Cee,Pee=wee.promisify(Iee.getTableSchema),Dee="updated",Hx="inserted",kx="upserted";Fx.exports={insert:Mee,update:vee,upsert:Uee,validation:Lee,flush:xee};async function Lee(e){if(Mr.isEmpty(e))throw new Error("invalid update parameters defined.");if(Mr.isEmptyOrZeroLength(e.schema))throw new Error("invalid database specified.");if(Mr.isEmptyOrZeroLength(e.table))throw new Error("invalid table specified.");let t=await Pee(e.schema,e.table),r=_E(e);if(r)throw r;if(!Array.isArray(e.records))throw new Error("records must be an array");let n=t.hash_attribute,s=new Set,i={},o=!1;return e.operation==="update"&&(o=!0),e.records.forEach(c=>{if(o&&Mr.isEmptyOrZeroLength(c[n]))throw Bx.error("a valid hash attribute must be provided with update record:",c),new Error("a valid hash attribute must be provided with update record");if(!Mr.isEmptyOrZeroLength(c[n])&&(c[n]==="null"||c[n]==="undefined"))throw Bx.error(`a valid hash value must be provided with ${e.operation} record:`,c),new Error(`"${c[n]}" is not a valid hash attribute value`);!Mr.isEmpty(c[n])&&c[n]!==""&&s.has(Mr.autoCast(c[n]))&&(c.skip=!0),s.add(Mr.autoCast(c[n]));for(let l in c)i[l]=1}),i[n]=1,{schema_table:t,hashes:Array.from(s),attributes:Object.keys(i)}}a(Lee,"validation");async function Mee(e){if(e.operation!=="insert")throw new Error("invalid operation, must be insert");let t=_E(e);if(t)throw Vc(new Error,t.message,Kc.BAD_REQUEST);Mr.transformReq(e);let r=Mr.checkSchemaTableExist(e.schema,e.table);if(r)throw Vc(new Error,r,Kc.BAD_REQUEST);let n=await hE.createRecords(e);return fE(Hx,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time)}a(Mee,"insertData");async function vee(e){if(e.operation!=="update")throw new Error("invalid operation, must be update");let t=_E(e);if(t)throw Vc(new Error,t.message,Kc.BAD_REQUEST);Mr.transformReq(e);let r=Mr.checkSchemaTableExist(e.schema,e.table);if(r)throw Vc(new Error,r,Kc.BAD_REQUEST);let n=await hE.updateRecords(e);return Mr.isEmpty(n.existing_rows)?fE(Dee,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time):fE(n.update_action,[],e,n.hashes,void 0,n.txn_time)}a(vee,"updateData");async function Uee(e){if(e.operation!=="upsert")throw Vc(new Error,"invalid operation, must be upsert",Kc.INTERNAL_SERVER_ERROR);let t=_E(e);if(t)throw Vc(new Error,t.message,Kc.BAD_REQUEST);Mr.transformReq(e);let r=Mr.checkSchemaTableExist(e.schema,e.table);if(r)throw Vc(new Error,r,Kc.BAD_REQUEST);let n=await hE.upsertRecords(e);return fE(kx,n.written_hashes,e,[],n.new_attributes,n.txn_time)}a(Uee,"upsertData");function fE(e,t,r,n,s,i){let o={message:`${e} ${t.length} of ${t.length+n.length} records`,new_attributes:s,txn_time:i};return e===Hx?(o.inserted_hashes=t,o.skipped_hashes=n,o):e===kx?(o.upserted_hashes=t,o):(o.update_hashes=t,o.skipped_hashes=n,o)}a(fE,"returnObject");function xee(e){return Mr.transformReq(e),hE.flush(e.schema,e.table)}a(xee,"flush")});var Yx=P((yNe,Kx)=>{var Eu=require("validate.js"),qx=st(),gu=(G(),D($)),{handleHDBError:Bee,hdb_errors:Hee}=he(),{HDB_ERROR_MSGS:jt,HTTP_STATUS_CODES:kee}=Hee,fb=a(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Fee={STRUCTURE_USER:"structure_user"},Gx=Object.values(gu.ROLE_TYPES_ENUM),Gee="attribute_permissions",qee="attribute_name",{PERMS_CRUD_ENUM:Su}=gu,$ee=[Gee,...Object.values(Su)],$x=[Su.READ,Su.INSERT,Su.UPDATE],Vee=[qee,...$x];function Kee(e){let t=fb();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,Vx(e,t)}a(Kee,"addRoleValidation");function Yee(e){let t=fb();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,Vx(e,t)}a(Yee,"alterRoleValidation");function Wee(e){let t=fb();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,qx.validateObject(e,t)}a(Wee,"dropRoleValidation");var zee=["operation","role","id","permission","hdb_user","access"];function Vx(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let o=0,c=n.length;o<c;o++)zee.includes(n[o])||s.push(n[o]);s.length>0&&nr(jt.INVALID_ROLE_JSON_KEYS(s),r);let i=qx.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{nr(o,r)}),e.permission){let o=jee(e);o&&nr(o,r),Gx.forEach(c=>{e.permission[c]&&!Eu.isBoolean(e.permission[c])&&nr(jt.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let o in e.permission)if(Gx.indexOf(o)<0){if(o===Fee.STRUCTURE_USER){let l=e.permission[o];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,f=l.length;u<f;u++){let d=l[u];global.hdb_schema[d]||nr(jt.SCHEMA_NOT_FOUND(d),r)}continue}nr(jt.STRUCTURE_USER_ROLE_TYPE_ERROR(o),r);continue}let c=e.permission[o];if(!o||!global.hdb_schema[o]){nr(jt.SCHEMA_NOT_FOUND(o),r);continue}if(c.tables)for(let l in c.tables){let u=c.tables[l];if(!l||!global.hdb_schema[o][l]){nr(jt.TABLE_NOT_FOUND(o,l),r);continue}if(Object.keys(u).forEach(f=>{$ee.includes(f)||nr(jt.INVALID_PERM_KEY(f),r,o,l)}),Object.values(Su).forEach(f=>{Eu.isDefined(u[f])?Eu.isBoolean(u[f])||nr(jt.TABLE_PERM_NOT_BOOLEAN(f),r,o,l):nr(jt.TABLE_PERM_MISSING(f),r,o,l)}),u.attribute_permissions===void 0){nr(jt.ATTR_PERMS_ARRAY_MISSING,r,o,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){nr(jt.ATTR_PERMS_NOT_ARRAY,r,o,l);continue}if(u.attribute_permissions){let f=global.hdb_schema[o][l].attributes.map(({attribute:h})=>h),d={read:!1,insert:!1,update:!1};for(let h in u.attribute_permissions){let _=u.attribute_permissions[h];if(Object.keys(_).forEach(S=>{!Vee.includes(S)&&S!==Su.DELETE&&nr(jt.INVALID_ATTR_PERM_KEY(S),r,o,l)}),!Eu.isDefined(_.attribute_name)){nr(jt.ATTR_PERM_MISSING_NAME,r,o,l);continue}let p=_.attribute_name;if(!f.includes(p)){nr(jt.INVALID_ATTRIBUTE_IN_PERMS(p),r,o,l);continue}$x.forEach(S=>{Eu.isDefined(_[S])?Eu.isBoolean(_[S])||nr(jt.ATTR_PERM_NOT_BOOLEAN(S,p),r,o,l):nr(jt.ATTR_PERM_MISSING(S,p),r,o,l)}),!d.read&&_.read===!0&&(d.read=!0),!d.insert&&_.insert===!0&&(d.insert=!0),!d.update&&_.update===!0&&(d.update=!0)}if(u.read===!1&&d.read===!0||u.insert===!1&&d.insert===!0||u.update===!1&&d.update===!0){let h=`${o}.${l}`;nr(jt.MISMATCHED_TABLE_ATTR_PERMS(h),r,o,l)}}}}return Qee(r)}a(Vx,"customValidate");Kx.exports={addRoleValidation:Kee,alterRoleValidation:Yee,dropRoleValidation:Wee};function jee(e){let{operation:t,permission:r}=e;if(t===gu.OPERATIONS_ENUM.ADD_ROLE||t===gu.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 jt.SU_CU_ROLE_COMBINED_ERROR;{let o=r.super_user?gu.ROLE_TYPES_ENUM.SUPER_USER:gu.ROLE_TYPES_ENUM.CLUSTER_USER;return jt.SU_CU_ROLE_NO_PERMS_ALLOWED(o)}}}return null}a(jee,"validateNoSUPerms");function Qee(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:jt.ROLE_PERMS_ERROR,...e};return Bee(new Error,n,kee.BAD_REQUEST)}else return null}a(Qee,"generateRolePermResponse");function nr(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]}}a(nr,"addPermError")});var E_=P((NNe,Qx)=>{"use strict";var Wx=gn(),zx=Vr(),Jee=xc(),hb=Yx(),pb=_o(),ONe=require("uuid").v4,Xee=require("util"),pE=(G(),D($)),Zee=oe(),mb=zx.searchByValue,ete=zx.searchByHash,tte=Xee.promisify(Jee.delete),rte=Ys(),nte=hu(),{hdb_errors:ste,handleHDBError:Yc}=he(),{HDB_ERROR_MSGS:jx,HTTP_STATUS_CODES:m_}=ste,{UserEventMsg:Eb}=Ks();Qx.exports={addRole:ite,alterRole:ote,dropRole:ate,listRoles:cte};function _b(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}a(_b,"scrubRoleDetails");async function ite(e){let t=hb.addRoleValidation(e);if(t)throw t;e=_b(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 mb(r)||[])}catch(i){throw Yc(i)}if(n&&n.length>0)throw Yc(new Error,jx.ROLE_ALREADY_EXISTS(e.role),m_.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 Wx.insert(s),pb.signalUserChange(new Eb(process.pid)),e=_b(e),e}a(ite,"addRole");async function ote(e){let t=hb.alterRoleValidation(e);if(t)throw t;e=_b(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await Wx.update(r)}catch(s){throw Yc(s)}if(n&&n?.message==="updated 0 of 1 records")throw Yc(new Error,"Invalid role id",m_.BAD_REQUEST,void 0,void 0,!0);return await pb.signalUserChange(new Eb(process.pid)),e}a(ote,"alterRole");async function ate(e){let t=hb.dropRoleValidation(e);if(t)throw Yc(new Error,t,m_.BAD_REQUEST,void 0,void 0,!0);let r=new nte(pE.SYSTEM_SCHEMA_NAME,pE.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await ete(r));if(n.length===0)throw Yc(new Error,jx.ROLE_NOT_FOUND,m_.NOT_FOUND,void 0,void 0,!0);let s=new rte(pE.SYSTEM_SCHEMA_NAME,pE.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await mb(s)),o=!1;if(Zee.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){o=!0;break}}if(o===!0)throw Yc(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,m_.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await tte(c),pb.signalUserChange(new Eb(process.pid)),`${n[0].role} successfully deleted`}a(ate,"dropRole");async function cte(){return mb({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}a(cte,"listRoles")});var gb={};Be(gb,{start:()=>Zx,startOnMainThread:()=>dte});function Zx({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,Jx.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 o in i.permission){if(lte.includes(o))continue;let c=i.permission[o];c.tables||(i.permission[o]=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 f=[];for(let d in u.attributes){let h=u.attributes[d];h.attribute_name=d,f.push(h)}u.attribute_permissions=f,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 f of u.attribute_permissions)f.read=!!f.read,f.insert=!!f.insert,f.update=!!f.update}else u.attribute_permissions=null}}i.role=i.id=s,await ute(i)}}}async function ute(e){let t=Ze().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,Xx.isEqual)(i,e)?void 0:(e.id=r.id,(0,mE.alterRole)(e))}return(0,mE.addRole)(e)}var mE,Jx,Xx,lte,dte,eB=be(()=>{Ue();mE=M(E_()),Jx=require("yaml"),Xx=require("lodash"),lte=["super_user","cluster_user","structure_user"];a(Zx,"start");a(ute,"ensureRole");dte=Zx});async function EE(e){let t=(0,nB.pathToFileURL)(e).toString();if(fte)return g_||(g_=_te(pte)),(await(await g_).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function _te(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),g_=new Compartment({console,Math,Date,fetch:hte,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,rB.extname)(r)||(r+=".js"),r)},importHook:a(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){Object.assign(s,{Resource:qr,tables:Yn,databases:Ye})}};let n=await(0,tB.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),g_}function hte(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 pte(){return{Resource:qr,tables:Yn}}var tB,rB,nB,fte,g_,Sb=be(()=>{sa();Ue();tB=require("fs/promises"),rB=require("path"),nB=require("url"),fte=!1;a(EE,"secureImport");a(_te,"getCompartment");a(hte,"secureOnlyFetch");a(pte,"getGlobalVars")});var Ab={};Be(Ab,{handleFile:()=>mte});async function mte(e,t,r,n){let s=new Map,i=await EE(r);c(i.default)&&n.set((0,Tb.dirname)(t),i.default),o(i,(0,Tb.dirname)(t));function o(l,u){for(let f in l){let d=l[f];c(d)?n.set(u+"/"+f,d):typeof d=="object"&&o(d,u+"/"+f)}}a(o,"recurseForResources");function c(l){return typeof l=="function"&&(l.get||l.put||l.post||l.delete)}return a(c,"isResource"),s}var Tb,sB=be(()=>{Sb();Tb=require("path");a(mte,"handleFile")});var yb={};Be(yb,{start:()=>Ete});function Ete({resources:e}){e.set("login",Rb),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var Rb,iB=be(()=>{sa();a(Ete,"start");Rb=class extends qr{static{a(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:o}=r;return{data:await n.login(s,i)}}}});var b_={};Be(b_,{addAnalyticsListener:()=>y_,calculateCPUUtilization:()=>bB,diffResourceUsage:()=>OB,recordAction:()=>Lt,recordActionBinary:()=>Wn,setAnalyticsEnabled:()=>gte});function gte(e){SB=e}function Ste(e,t){if(typeof e=="number"){let r=t.values,n=r.index++;if(n>=r.length){let s=r;t.values=r=new Float32Array(n*2),r.set(s),r.index=n+1}r[n]=e,t.total+=e}else if(typeof e=="boolean")e&&t.total++,t.count++;else if(typeof e=="function")t.count++;else throw new TypeError("Invalid metric value type "+typeof e)}function Tte(e,t,r,n,s,i){let o={};if(typeof t=="number")o.total=t,o.values=new Float32Array(4),o.values.index=1,o.values[0]=t,o.total=t;else if(typeof t=="boolean")o.total=t?1:0,o.count=1;else if(typeof t=="function")o.count=1,o.callback=t;else throw new TypeError("Invalid metric value type "+typeof t);o.description={metric:r,path:n,method:s,type:i},SE.set(e,o)}function Lt(e,t,r,n,s){if(!SB)return;let i=t+(r?"-"+r:"");n!==void 0&&(i+="-"+n),s!==void 0&&(i+="-"+s);let o=SE.get(i);o?Ste(e,o):Tte(i,e,t,r,n,s),gE||Ate()}function Wn(e,t,r,n,s){Lt(!!e,t,r,n,s)}function y_(e){RB.push(e)}function Ate(){gE=performance.now(),setTimeout(async()=>{let e=performance.now()-gE;gE=0;let t=[],r={time:Date.now(),period:e,threadId:Wc.threadId,metrics:t};for(let[s,i]of SE){if(i.values){let o=i.values.subarray(0,i.values.index);o.sort();let c=o.length,l=0,u=[],f;for(let d of yB){let h=Math.floor(c*d),_=o[h-1];if(h>l){let p=h-l;if(_===f){let S=u[u.length-1];typeof S=="number"?u[u.length-1]={value:S,count:1+p}:S.count+=p}else u.push(p>1?{value:_,count:p}:_),f=_;l=h}}t.push(Object.assign(i.description,{mean:i.total/c,distribution:u,count:c}))}else i.callback?t.push(Object.assign(i.description,i.callback(i))):t.push(Object.assign(i.description,{total:i.total,count:i.count}));await NB()}let n=process.memoryUsage();t.push({metric:"memory",threadId:Wc.threadId,byThread:!0,...n});for(let s of RB)s(t);SE=new Map,Wc.parentPort?Wc.parentPort.postMessage({type:AB,report:r}):CB({report:r})},TB).unref()}function TE(e,t,r){let n={id:(0,A_.getNextMonotonicTime)(),metric:t,...r};e.primaryStore.put(n.id,n,{append:!0}).then(s=>{s||e.primaryStore.put(n.id,n)})}function bB(e,t){let r=e.userCPUTime+e.systemCPUTime;return Math.round(r/t*100)/100}function OB(e,t){return{userCPUTime:t.userCPUTime/1e3-(e?.userCPUTime??0),systemCPUTime:t.systemCPUTime/1e3-(e?.systemCPUTime??0),minorPageFault:t.minorPageFault-(e?.minorPageFault??0),majorPageFault:t.majorPageFault-(e?.majorPageFault??0),fsRead:t.fsRead-(e?.fsRead??0),fsWrite:t.fsWrite-(e?.fsWrite??0),voluntaryContextSwitches:t.voluntaryContextSwitches-(e?.voluntaryContextSwitches??0),involuntaryContextSwitches:t.involuntaryContextSwitches-(e?.involuntaryContextSwitches??0)}}function Rte(e,t,r){let n=0;for(let[s,i]of Object.entries(r)){let o=`${t}.${s}`,c=i.getSize(),l={database:t,table:s,size:c};TE(e,"table-size",l),zc.trace?.(`table ${o} size metric: ${JSON.stringify(l)}`),n+=c}return n}function oB(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getAuditSize();if(!i)return;let o=gB.default.statSync(s.primaryStore.env.path).size,c=Rte(e,r,n),l=o-c,u={database:r,size:o,used:c,free:l,audit:i};TE(e,"database-size",u),zc.trace?.(`database ${r} size metric: ${JSON.stringify(u)}`)}catch(s){zc.warn?.("Error getting DB size metrics",s)}}function aB(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getStorageStats();if(!i)return;let o={database:r,...i};TE(e,"storage-volume",o),zc.trace?.(`db ${r} storage volume metrics: ${JSON.stringify(o)}`)}catch(s){zc.warn?.("Error getting DB volume metrics",s)}}async function yte(e,t=6e4){let r=Ob(),n=wB(),s=new Promise(E=>{let T=performance.now();setImmediate(()=>{let O=performance.now();O-T>5e3&&zc.warn?.("Unusually high event queue latency on the main thread of "+Math.round(O-T)+"ms"),T=performance.now()}),n.primaryStore.prefetch([1],()=>{let O=performance.now();O-T>5e3&&zc.warn?.("Unusually high task queue latency on the main thread of "+Math.round(O-T)+"ms"),E(O-T)})}),i;for(let E of n.primaryStore.getRange({start:1/0,end:!1,reverse:!0}))if(E.value?.time){i=E.value.time;break}if(Date.now()-t<i)return;let o,c=new Map,l=new Map,u=[],f;for(let{key:E,value:T}of r.primaryStore.getRange({start:i||!1,exclusiveStart:!0,end:1/0})){if(!T)continue;if(o){if(E>o+t)break}else o=E;f=E;let{metrics:O,threadId:v}=T;for(let F of O||[]){let{path:q,method:j,type:te,metric:se,count:z,total:ne,distribution:le,threads:ie,...Re}=F;z||(z=1);let pe=se+(q?"-"+q:"");j!==void 0&&(pe+="-"+j),te!==void 0&&(pe+="-"+te);let Ae=c.get(pe);if(Ae){if(Ae.threads){let dt=Ae.threads[v];if(dt)Ae=dt;else{Ae.threads[v]={...Re};continue}}Ae.count||(Ae.count=1);let Bt=Ae.count;for(let dt in Re){let Cn=Re[dt];typeof Cn=="number"&&(Ae[dt]=(Ae[dt]*Bt+Cn*z)/(Bt+z))}Ae.count+=z,ne>=0&&(Ae.total+=ne,Ae.ratio=Ae.total/Ae.count)}else Ae={period:t,...F},delete Ae.distribution,c.set(pe,Ae),Ae.byThread&&(Ae.threads=[],Ae.threads[v]={...Re},u.push(Ae));if(le){le=le.map(dt=>typeof dt=="number"?{value:dt,count:1}:dt);let Bt=l.get(pe);Bt?Bt.push(...le):l.set(pe,le)}}await NB()}for(let E of u){let{path:T,method:O,type:v,metric:F,count:q,total:j,distribution:te,threads:se,...z}=E;se=se.filter(ne=>ne);for(let ne in z){if(typeof E[ne]!="number")continue;let le=0;for(let ie of se){let Re=ie[ne];typeof Re=="number"&&(le+=Re)}E[ne]=le}E.count=se.length,delete E.threads,delete E.byThread}for(let[E,T]of l){let O=c.get(E);T.sort((dt,Cn)=>dt.value>Cn.value?1:-1);let v=O.count-1,F=[],q=0,j=0,te;for(let dt of yB){let Cn=v*dt;for(;q<Cn;)te=T[j++],q+=te.count,j===1&&q--;let nn=T[j>1?j-2:0];te||(te=T[0]),F.push(te.value-(te.value-nn.value)*(q-Cn)/te.count)}let[se,z,ne,le,ie,Re,pe,Ae,Bt]=F;Object.assign(O,{p1:se,p10:z,p25:ne,median:le,p75:ie,p90:Re,p95:pe,p99:Ae,p999:Bt})}let d;for(let[E,T]of c)T.id=(0,A_.getNextMonotonicTime)(),T.time=f,n.primaryStore.put(T.id,T,{append:!0}).then(O=>{O||n.primaryStore.put(T.id,T)}),d=!0;let h=Date.now(),{idle:_,active:p}=performance.eventLoopUtilization();if(d||p*10>_){let E=(0,A_.getNextMonotonicTime)(),T={id:E,metric:"main-thread-utilization",idle:_-cB,active:p-lB,taskQueueLatency:await s,time:h,...process.memoryUsage()};n.primaryStore.put(E,T,{append:!0}).then(O=>{O||n.primaryStore.put(E,T)})}cB=_,lB=p;let S=process.resourceUsage(),g=OB(S_,S);g.time=h,g.period=S_.time?h-S_.time:t,g.cpuUtilization=bB(S_,g.period),TE(n,"resource-usage",g),S_=g;let R=Ze();oB(n,R),oB(n,{system:R.system}),aB(n,R),aB(n,{system:R.system})}async function uB(e,t){let r=Date.now()-t;for(let n of e.primaryStore.getKeys({start:!1,end:r}))e.primaryStore.remove(n)}function Ob(){return dB||(dB=_t({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function wB(){return fB||(fB=_t({table:"hdb_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]}))}function Nte(){IB=!0;let e=(0,R_.get)(B.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await yte(TB,e),await uB(Ob(),bte),await uB(wB(),Ote)},Math.min(e/2,2147483647)).unref()}function CB(e,t){let r=e.report;r.threadId=t?.threadId||Wc.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(_B+=n.mean*n.count);r.totalBytesProcessed=_B,t&&(r.metrics.push({metric:"utilization",...t.performance.eventLoopUtilization(hB.get(t))}),hB.set(t,t.performance.eventLoopUtilization())),r.id=(0,A_.getNextMonotonicTime)(),Ob().primaryStore.put(r.id,r),IB||Nte(),wte&&(PB=Cte(r))}async function Cte(e){if(await PB,!ha){let r=(0,T_.dirname)((0,mB.getLogFilePath)());try{ha=await(0,bb.open)((0,T_.join)(r,"analytics.log"),"r+")}catch{ha=await(0,bb.open)((0,T_.join)(r,"analytics.log"),"w+")}}let t=(await ha.stat()).size;if(t>Ite){let r=Buffer.alloc(t);await ha.read(r,{position:0}),r=r.subarray(r.indexOf(10,r.length/2)+1),await ha.write(r,{position:0}),await ha.truncate(r.length),t=r.length}await ha.write(JSON.stringify(e)+`
20
20
  `,t)}var Wc,pB,mB,EB,T_,bb,A_,R_,gB,zc,SE,SB,gE,TB,AB,RB,yB,cB,lB,S_,NB,bte,Ote,dB,fB,IB,_B,hB,wte,PB,ha,Ite,Ci=be(()=>{Wc=require("worker_threads"),pB=M(it());Ue();mB=M(X()),EB=M(mi()),T_=require("path"),bb=require("fs/promises"),A_=M(ln()),R_=M(ce());G();Dr();gB=M(require("node:fs")),zc=(0,EB.loggerWithTag)("analytics");(0,R_.initSync)();SE=new Map,SB=(0,R_.get)(B.ANALYTICS_AGGREGATEPERIOD)>-1;a(gte,"setAnalyticsEnabled");a(Ste,"recordExistingAction");a(Tte,"recordNewAction");a(Lt,"recordAction");Ke.recordAnalytics=Lt;a(Wn,"recordActionBinary");gE=0,TB=1e3,AB="analytics-report",RB=[];a(y_,"addAnalyticsListener");yB=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Ate,"sendAnalytics");a(TE,"storeMetric");a(bB,"calculateCPUUtilization");a(OB,"diffResourceUsage");a(Rte,"storeTableSizeMetrics");a(oB,"storeDBSizeMetrics");a(aB,"storeVolumeMetrics");a(yte,"aggregation");cB=0,lB=0,S_={},NB=a(()=>new Promise(setImmediate),"rest");a(uB,"cleanup");bte=36e5,Ote=31536e6;a(Ob,"getRawAnalyticsTable");a(wB,"getAnalyticsTable");(0,pB.setChildListenerByType)(AB,CB);a(Nte,"startScheduledTasks");_B=0,hB=new Map,wte=!1;a(CB,"recordAnalytics");Ite=1e6;a(Cte,"logAnalytics")});var DB={};Be(DB,{Headers:()=>mo,appendHeader:()=>AE,mergeHeaders:()=>Nb});function AE(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 Nb(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new mo(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 mo,O_=be(()=>{mo=class extends Map{static{a(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 o=i[1];if(n)r=(typeof o=="string"?o:o.join(", "))+", "+r;else if(typeof o=="string")r=[o,r];else{o.push(r);return}}return super.set(s,[t,r])}[Symbol.iterator](){return super.values()[Symbol.iterator]()}};a(AE,"appendHeader");a(Nb,"mergeHeaders")});function xB(e){let t={openapi:Pte,info:{title:"HarperDB HTTP REST interface",version:UB.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:o,primaryKey:c,prototype:l}=n.Resource;if(c=c??"id",!c)continue;let u={},f=[];if(o)for(let{type:T,name:O,elements:v,relationship:F,definition:q}of o){if(F)T==="array"?u[O]={type:"array",items:{$ref:pa+v.type}}:u[O]={$ref:pa+T};else{let j=q??v?.definition;if(j){if(!t.components.schemas[j.type]){let te={};j.properties.forEach(se=>{te[se.name]=new Pb(wb[se.type],se.type)}),t.components.schemas[j.type]=new vB(te)}T==="array"?u[O]={type:"array",items:{$ref:pa+j.type}}:u[O]={$ref:pa+j.type}}else T==="array"?v.type==="Any"||v.type=="ID"?u[O]={type:"array",items:{format:v.type}}:u[O]={type:"array",items:new Pb(wb[v.type],v.type)}:T==="Any"||T=="ID"?u[O]={format:T}:u[O]=new Pb(wb[T],T)}f.push(new Db(O,"query",u[O]))}let d=Object.keys(u),h=new Db(c,"path",{format:"ID"});h.required=!0,h.description="primary key of record";let _=new Db("property","path",{enum:d});_.required=!0,t.components.schemas[i]=new vB(u);let p=l.post!==Resource.prototype.post||l.update,S=typeof l.put=="function",g=typeof l.get=="function",R=typeof l.delete=="function",E="/"+s+"/";p&&(t.paths[E]={},t.paths[E].post=new Dte(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[E]||(t.paths[E]={}),t.paths[E].get=new Ib(f,r,{200:new Cb({$ref:pa+i})},"search for records by the specified property name and value pairs")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new MB(f,r,"delete all the records that match the provided query",{204:new LB})),E="/"+s+"/{"+c+"}",g&&(t.paths[E]={},t.paths[E].get=new Ib([h],r,{200:new Cb({$ref:pa+i})},"retrieve a record by its primary key")),S&&(t.paths[E]||(t.paths[E]={}),t.paths[E].put=new Lte([h],r,i,"create or update the record with the URL path that maps to the record's primary key")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new MB([h],r,"delete a record with the given primary key",{204:new LB})),g&&_.schema.enum.length>0&&(E="/"+s+"/{"+c+"}.{property}",t.paths[E]={},t.paths[E].get=new Ib([h,_],r,{200:new Cb({enum:d})},"used to retrieve the specified property of the specified record"))}return t}function Dte(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:pa+e}}}},this.security=t,this.responses={200:{description:Lb,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function Ib(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function Cb(e){this.description=Lb,this.content={"application/json":{schema:e}}}function LB(){this.description="successfully processed request, no content returned to client"}function Lte(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:pa+r}}}},this.responses={200:{description:Lb}}}function MB(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function vB(e){this.type="object",this.properties=e}function Pb(e,t){this.type=e,this.format=t}function Db(e,t,r){this.name=e,this.in=t,this.schema=r}var UB,Pte,wb,pa,Lb,BB=be(()=>{UB=M(Et()),Pte="3.0.3",wb={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},pa="#/components/schemas/",Lb="successful operation";a(xB,"generateJsonApi");a(Dte,"Post");a(Ib,"Get");a(Cb,"Response200");a(LB,"Response204");a(Lte,"Put");a(MB,"Delete");a(vB,"ResourceSchema");a(Pb,"Type");a(Db,"Parameter")});var kB={};Be(kB,{Request:()=>N_,createReuseportFd:()=>RE});var HB,N_,Mb,vb,RE,yE=be(()=>{HB=require("os"),N_=class{static{a(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 vb(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 Mb(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get isAborted(){return!1}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},Mb=class{static{a(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)}},vb=class{constructor(t){this.asObject=t}static{a(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,HB.platform)()!="win32"&&(RE=require("node-unix-socket").createReuseportFd)});var OE={};Be(OE,{parseHeaderValue:()=>xb,start:()=>Ute});async function vte(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&Jp(e);let i=new mo;try{e.responseHeaders=i;let o=e.url.slice(1),c,l;if(o!==FB){let g=bE.getMatch(o,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new mc(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=xb(g);for(let E of R)switch(E.name){case"max-age":e.expiresAt=E.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=xb(u).map(R=>(R.next?.name==="confirm"&&R.next.value>=0&&(e.replicatedConfirmation=+R.next.value),R.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 d=await Ct(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=no(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new Tu.ClientError(g,400)}if(e.authorize=!0,o===FB&&s==="GET"){if(e?.user?.role?.permission?.super_user)return xB(bE);throw new Tu.ServerError("Forbidden",403)}switch(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 Tu.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Tu.ServerError(`Method ${s} is not recognized`,501)}}),h=200,_;if(d==null)h=s==="GET"||s==="HEAD"?404:204,Ub.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(d.status>0&&d.headers){let g=Nb(d.headers,i);return d.headers!==g&&(d.headers=g),d.data!==void 0&&(d.body=Pf(d.data,e,d)),d}else if(_=e.lastModified){Mte[0]=_;let g=String.fromCharCode(34,(vr[0]&63)+62,(vr[0]>>6)+(vr[1]<<2&63)+62,(vr[1]>>4)+(vr[2]<<4&63)+62,(vr[2]>>2)+62,(vr[3]&63)+62,(vr[3]>>6)+(vr[4]<<2&63)+62,(vr[4]>>4)+(vr[5]<<4&63)+62,(vr[5]>>2)+62,(vr[6]&63)+62,(vr[6]>>6)+(vr[7]<<2&63)+62,34),R=r["if-none-match"];R&&g==R?(d?.onDone&&d.onDone(),h=304,d=void 0):i.setIfNone("ETag",g),Ub.lastModified&&i.setIfNone("Last-Modified",new Date(_).toUTCString())}e.createdResource&&(h=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let p={status:h,headers:i,body:void 0},S=d?.wasLoadedFromSource?.();return S!==void 0&&(p.wasCacheMiss=S,!S&&_&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||_))/1e3))),d!==void 0&&(p.body=Pf(d,e,p),s==="HEAD"&&(p.body=void 0)),p}catch(o){o.statusCode?o.statusCode===500?Pi.warn(o):Pi.info(o):Pi.error(o),o.statusCode===405&&(o.method&&(o.message+=` to handle HTTP method ${o.method.toUpperCase()||""}`),o.allow&&(o.allow.push("trace","head","options"),i.setIfNone("Allow",o.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:o.statusCode||500,headers:i,body:void 0};return c.body=Pf(o.contentType?o:o.toString(),e,c),c}}function Ute(e){Ub=e,e.includeExpensiveRecordCountEstimates&&(N_.prototype.includeExpensiveRecordCountEstimates=!0),!GB&&(GB=!0,bE=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return vte(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{w_++;let s=new Un;qB||(qB=!0,y_(l=>{w_>0&&l.push({metric:"ws-connections",connections:w_,byThread:!0})}));let i;t.on("error",l=>{i=!0,Pi.warn(l)});let o;t.on("message",a(function(u){o||(o=no(r.requestedContentType??r.headers.asObject["content-type"],!1));let f=o(u);Lt(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(f)},"message"));let c;t.on("close",()=>{w_--,Wn(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=bE.getMatch(l,"ws");if(Wn(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,Lt(p=>({count:p.count,total:w_}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let f=new mc(u.relativeURL),d=u.Resource;c=(await Ct(r,()=>d.connect(f,s,r)))[Symbol.asyncIterator]();let _;for(;!(_=await c.next()).done;){let p=await aa(_.value,r);t.send(p),Lt(p.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(S=>t._socket.once("drain",S))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?Pi.warn(l):Pi.info(l):Pi.error(l),t.close(xte[l.statusCode]||1011,l.toString())}t.close()},e))}function xb(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,o]=s.trim().split("=");i=i.trim(),o&&(o=o.trim()),r={name:i.toLowerCase(),value:o,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var Pi,Tu,vr,Mte,Ub,FB,GB,bE,qB,w_,xte,$B=be(()=>{eo();Ci();Pi=M(X()),Tu=M(he());Sf();Yl();pc();O_();BB();Sf();yE();vr=new Uint8Array(8),Mte=new Float64Array(vr.buffer,0,1),Ub={},FB="openapi";a(vte,"http");w_=0;a(Ute,"start");xte={401:3e3,403:3003};a(xb,"parseHeaderValue")});var Bb=P((nwe,KB)=>{var{recordAction:NE,recordActionBinary:VB}=(Ci(),D(b_)),Bte=require("fastify-plugin"),Hte=200;KB.exports=Bte(function(e,t,r){e.addHook("onResponse",async(n,s)=>{let i=s.elapsedTime}),e.addHook("onSend",async(n,s,i)=>{let o=s.elapsedTime,c=performance.now(),l=s.request.routeOptions,u,f,d;l.config?.isOperation?(u=n.body?.operation,f="operation"):(u=l.url,f="fastify-route",d=l.method),NE(o,"duration",u,d,f),VB(s.raw.statusCode<400,"success",u,d,f),VB(1,"response_"+s.raw.statusCode,u,d,f);let h=Hte;i?.pipe?(i.on("data",g=>{h+=g.length}),i.on("end",()=>{NE(performance.now()-c,"transfer",u,d,f),NE(h,"bytes-sent",u,d,f)})):(h+=i?.length||0,NE(h,"bytes-sent",u,d,f));let _=o.toFixed(3),p=s.getHeader("Server-Timing"),S=`db;dur=${_}`;s.header("Server-Timing",p?`${p}, ${S}`:S)}),r()},{name:"hdb-request-time"})});var WB=P((swe,YB)=>{var kte=st(),Fte={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};YB.exports=function(e){return kte.validateObject(e,Fte)}});var wE=P((iwe,zB)=>{"use strict";var Gte=(G(),D($)).OPERATIONS_ENUM,Hb=class{static{a(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=Gte.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};zB.exports=Hb});var P_={};Be(P_,{createTokens:()=>$te,getJWTRSAKeys:()=>LE,refreshOperationToken:()=>Vte,validateOperationToken:()=>Gb,validateRefreshToken:()=>ME});async function LE(){if(IE)return IE;try{let e=I_.default.join(C_.default.getHdbBasePath(),iA),t=await CE.default.readFile(I_.default.join(e,Xd.JWT_PASSPHRASE_NAME),"utf8"),r=await CE.default.readFile(I_.default.join(e,Xd.JWT_PRIVATE_KEY_NAME),"utf8");return IE={publicKey:await CE.default.readFile(I_.default.join(e,Xd.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},IE}catch(e){throw DE.default.error(e),new zs.ClientError(Ru.NO_ENCRYPTION_KEYS,Au.INTERNAL_SERVER_ERROR)}}async function $te(e){let t=(0,kb.validateBySchema)(e,Di.default.object({username:Di.default.string().optional(),password:Di.default.string().optional(),role:Di.default.string().optional(),expires_in:Di.default.alternatives(Di.default.string(),Di.default.number()).optional()}));if(t)throw new zs.ClientError(t.message);let r;try{let d=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,d=!1),r=await(0,Fb.findAndValidateUser)(e.username,e.password,d)}catch(d){throw DE.default.error(d),new zs.ClientError(Ru.INVALID_CREDENTIALS,Au.UNAUTHORIZED)}if(!r)throw new zs.ClientError(Ru.INVALID_CREDENTIALS,Au.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 o=await LE(),c=await yu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:e.expires_in??ZB,algorithm:PE,subject:"operation"}),l=await yu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:qte,algorithm:PE,subject:"refresh"}),u=oy(l,"sha256");if((await(0,jB.update)(new QB.default(Jd,Gl.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new zs.ClientError(Ru.REFRESH_TOKEN_SAVE_FAILED,Au.INTERNAL_SERVER_ERROR);return JB.default.signalUserChange(new XB.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function Vte(e){let t=(0,kb.validateBySchema)(e,Di.default.object({refresh_token:Di.default.string().required()}).required());if(t)throw new zs.ClientError(t.message);let{refresh_token:r}=e;await ME(r);let n=await LE(),s=await yu.default.decode(r);return{operation_token:await yu.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:ZB,algorithm:PE,subject:"operation"})}}async function Gb(e){return eH(e,"operation")}async function ME(e){return eH(e,"refresh")}async function eH(e,t){try{let r=await LE(),n=await yu.default.verify(e,r.publicKey,{algorithms:PE,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,Fb.findAndValidateUser)(n.username,void 0,!1);if(t==="refresh"&&!ay(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw DE.default.warn(r),r?.name==="TokenExpiredError"?new zs.ClientError(Ru.TOKEN_EXPIRED,Au.FORBIDDEN):new zs.ClientError(Ru.INVALID_TOKEN,Au.UNAUTHORIZED)}}var yu,CE,I_,Di,kb,zs,DE,Fb,jB,QB,JB,XB,C_,Au,Ru,ZB,qte,PE,IE,bu=be(()=>{yu=M(require("jsonwebtoken")),CE=M(require("fs-extra")),I_=M(require("node:path")),Di=M(require("joi")),kb=M(st());G();zs=M(he()),DE=M(X());Gm();Fb=M(qn()),jB=M(gn()),QB=M(wE()),JB=M(_o()),XB=M(Ks()),C_=M(ce()),{HTTP_STATUS_CODES:Au,AUTHENTICATION_ERROR_MSGS:Ru}=zs.hdb_errors;C_.default.initSync();ZB=C_.default.get(B.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",qte=C_.default.get(B.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",PE="RS256";a(LE,"getJWTRSAKeys");a($te,"createTokens");a(Vte,"refreshOperationToken");a(Gb,"validateOperationToken");a(ME,"validateRefreshToken");a(eH,"validateToken")});var qb=P((uwe,nH)=>{"use strict";var Kte=WB(),Ou=require("passport"),Yte=require("passport-local").Strategy,Wte=require("passport-http").BasicStrategy,zte=require("util"),jte=qn(),rH=zte.callbackify(jte.findAndValidateUser),lwe=Ln(),Qte=(G(),D($)),tH=(bu(),D(P_));Ou.use(new Yte(function(e,t,r){rH(e,t,r)}));Ou.use(new Wte(function(e,t,r){rH(e,t,r)}));Ou.serializeUser(function(e,t){t(null,e)});Ou.deserializeUser(function(e,t){t(null,e)});function Jte(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let o=e.headers.authorization.split(" ");n=o[0],s=o[1]}function i(o,c){return o?r(o):c?r(null,c):r("Must login")}switch(a(i,"handleResponse"),n){case"Basic":Ou.authenticate("basic",{session:!1},(o,c)=>{i(o,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===Qte.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?tH.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):tH.validateOperationToken(s).then(o=>{r(null,o)}).catch(o=>{r(o)});break;default:Ou.authenticate("local",{session:!1},function(o,c){i(o,c)})(e,t,r);break}}a(Jte,"authorize");function Xte(e,t){let r=Kte(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 o=i[e.schema].tables[e.table].attribute_permissions;for(let c in o)e.attributes.indexOf(o[c].attribute_name)>-1&&!o[c][e.operation]&&(n.authorized=!1,n.messages.push(`Not authorized to ${e.operation} ${o[c].attribute_name} `))}return t(null,n)}a(Xte,"checkPermissions");nH.exports={authorize:Jte,checkPermissions:Xte}});var vE=P((fwe,sH)=>{"use strict";var Zte=Gn();sH.exports={writeTransaction:ere};function ere(e,t,r){return Zte.writeTransaction(e,t,r)}a(ere,"writeTransaction")});var cH=P((pwe,aH)=>{"use strict";var tre=Vr(),rre=$s(),iH=X(),nre=gn(),hwe=vE(),sre=require("clone"),Vb=require("alasql"),ire=Mm(),oH=require("util"),ore=oH.promisify(rre.getTableSchema),are=oH.promisify(tre.search),cre=(G(),D($)),$b=oe();ire(Vb);aH.exports={update:ure};var lre="There was a problem performing this update. Please check the logs and try again.";async function ure({statement:e,hdb_user:t}){let r=await ore(e.table.databaseid,e.table.tableid),n=dre(e.columns);$b.backtickASTSchemaItems(e);let{table:s,where:i}=e,o=sre(s),c=$b.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=Vb.parse(l).statements[0],f=await are(u),d=fre(n,f);return _re(o,d,t)}a(ure,"update");function dre(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=Vb.compile(`SELECT ${r.expression.toString()} AS [${cre.FUNC_VAL}] FROM ?`)}),t}catch(t){throw iH.error(t),new Error(lre)}}a(dre,"createUpdateRecord");function fre(e,t){return $b.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}a(fre,"buildUpdateRecords");async function _re(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await nre.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){iH.error(`Error delete new_attributes from update response: ${i}`)}return s}a(_re,"updateRecords")});var uH=P((Swe,lH)=>{var hre=require("alasql"),pre=Vr(),mre=X(),Ere=Gn(),Yb=require("util"),Kb=oe(),gre=(G(),D($)),Sre=$s(),Ewe=vE(),gwe=gn(),Tre="record",Are="successfully deleted",Rre=Yb.callbackify(Nre),yre=Yb.promisify(pre.search),bre=Yb.promisify(Sre.getTableSchema);lH.exports={convertDelete:Rre};function Ore(e){return`${e.deleted_hashes.length} ${Tre}${e.deleted_hashes.length===1?"":"s"} ${Are}`}a(Ore,"generateReturnMessage");async function Nre({statement:e,hdb_user:t}){let r=await bre(e.table.databaseid,e.table.tableid);Kb.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=Kb.isEmpty(s)?"":` WHERE ${s.toString()}`,o=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=hre.parse(o).statements[0],l={operation:gre.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await yre(c);let u=await Ere.deleteRecords(l);return Kb.isEmptyOrZeroLength(u.message)&&(u.message=Ore(u)),delete u.txn_time,u}catch(u){throw mre.error(u),u.hdb_code?u.message:u}}a(Nre,"convertDelete")});var pH=P((Awe,hH)=>{"use strict";var wre=uo(),{hdb_errors:dH}=he(),{getDatabases:fH}=(Ue(),D(ct));hH.exports={checkSchemaExists:_H,checkSchemaTableExists:Ire,schema_describe:wre};async function _H(e){if(!fH()[e])return dH.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(_H,"checkSchemaExists");async function Ire(e,t){let r=await _H(e);if(r)return r;if(!fH()[e][t])return dH.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(Ire,"checkSchemaTableExists")});var Jb=P((Nwe,wH)=>{"use strict";var{decode:Cre}=require("msgpackr"),{isMainThread:ywe,parentPort:bwe,threadId:Owe}=require("worker_threads"),BE=Er(),Nu=Dt(),jb=(G(),D($)),Wr=X(),zb=ce(),Pre=(G(),D($)),{onMessageByType:Dre}=it(),SH=lo(),{recordAction:mH,recordActionBinary:Lre}=(Ci(),D(b_)),{publishToStream:Mre}=BE,{ConsumerEvents:EH}=require("nats"),vre=Vr(),{promisify:Ure}=require("util"),{decodeBlobsWithWrites:xre}=(_s(),D(_m)),TH=Ure(setTimeout),HE=1e4,kE,xE,Bre,Hre,AH,D_=new Map,wu=new Map;wH.exports={initialize:RH,ingestConsumer:Qb,setSubscription:kre,setIgnoreOrigin:qre,getDatabaseSubscriptions:Gre,updateConsumer:yH};async function RH(){Dre(jb.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,async n=>{await yH(n)}),AH=!0,Wr.notify("Initializing clustering ingest service.");let{connection:e,jsm:t,js:r}=await BE.getNATSReferences();kE=e,xE=e.info.server_name,Bre=t,Hre=r}a(RH,"initialize");async function yH(e){if(e.status==="start"){let{js:t,jsm:r}=await bH(e.node_domain_name);Qb(e.stream_name,t,r,e.node_domain_name)}else if(e.status==="stop"){let t=D_.get(e.stream_name+e.node_domain_name);t&&(Wr.notify("Closing ingest consumer for node:",e.node_domain_name,"stream:",e.stream_name),await t.close?.(),D_.set(e.stream_name+e.node_domain_name,"close")),wu.get(e.node_domain_name)==="failed"&&wu.set(e.node_domain_name,"close")}}a(yH,"updateConsumer");var FE=new Map;function kre(e,t,r){let n=FE.get(e);n||FE.set(e,n=new Map),n.set(t,r),AH||RH().then(Fre)}a(kre,"setSubscription");async function Fre(){let e=await vre.searchByValue({database:"system",table:"hdb_nodes",search_attribute:"name",search_value:"*"});for await(let t of e){let r=t.name+Nu.SERVER_SUFFIX.LEAF,n,s;for(let i of t.subscriptions||[])if(i.subscribe===!0){if(!n&&({js:n,jsm:s}=await bH(r),!n))break;let{schema:o,table:c}=i,l=SH.createNatsTableStreamName(o,c);Qb(l,n,s,r)}}}a(Fre,"accessConsumers");async function bH(e){let t,r,n=1;for(;!r;)try{t=await kE.jetstream({domain:e}),r=await kE.jetstreamManager({domain:e,checkAPI:!1})}catch(s){if(wu.get(e)==="close")break;wu.set(e,"failed"),n%10===1&&Wr.warn("Nats ingest attempting to connect to:",e,"Nats error:",s.message);let i=n++*100<HE?n++*100:HE;await TH(i)}return{js:t,jsm:r}}a(bH,"connectToRemoteJS");function Gre(){return FE}a(Gre,"getDatabaseSubscriptions");var OH;function qre(e){OH=e}a(qre,"setIgnoreOrigin");var NH=100,gH=new Array(NH),UE=0;async function Qb(e,t,r,n){let{connection:s}=await BE.getNATSReferences();kE=s,xE=s.info.server_name;let i,o=1;for(;!i;)try{i=await t.consumers.get(e,xE),Wr.notify("Initializing ingest consumer for node:",n,"stream:",e)}catch(u){if(wu.get(n)==="close")break;o%10===1&&Wr.warn("Nats ingest error getting consumer:",n,"stream:",e,"Nats error:",u.message),u.code==="404"&&(Wr.notify("Nats ingest creating consumer for node:",n,"stream:",e),i=await BE.createConsumer(r,e,xE,new Date(Date.now()).toISOString()));let f=o++*100<HE?o++*100:HE;await TH(f)}let c=!1,l;for(;!c;){if(D_.get(e+n)==="close"||wu.get(n)==="close"){D_.delete(e+n),c=!0;continue}l=await i.consume({max_messages:zb.get(jb.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXCONSUMEMSGS)??100,bind:!0}),D_.set(e+n,l);let u=!1;(async()=>{for await(let f of await l.status())if(f.type===EH.ConsumerDeleted&&(await l.close(),c=!0),f.type===EH.HeartbeatsMissed){let d=f.data;Wr.trace(`${d} clustering ingest consumer heartbeats missed, node: ${n} stream: ${l.consumer.stream}`),d===100&&(Wr.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 f of l)await gH[UE],gH[UE]=$re(f).catch(d=>{Wr.error(d)}),++UE>=NH&&(UE=0)}catch(f){f.message==="consumer deleted"?(Wr.notify("Nats consumer deleted, closing messages for node:",n,"stream:",l.consumer.stream),await l.close(),c=!0):Wr.error("Error consuming clustering ingest, restarting consumer",f)}}}a(Qb,"ingestConsumer");async function $re(e){let t;await xre(()=>{t=Cre(e.data)}),mH(e.data.length,"bytes-received",e.subject,t.operation,"ingest"),Wr.trace("Nats message processor message size:",e?.msg?._msg?.size,"bytes");let r=e.headers,n=!1,s=zb.get(jb.CONFIG_PARAMS.CLUSTERING_NODENAME);r.has(Nu.MSG_HEADERS.TRANSACTED_NODES)&&r.values(Nu.MSG_HEADERS.TRANSACTED_NODES).indexOf(s)>-1&&(n=!0);let i=r.get(Nu.MSG_HEADERS.ORIGIN);if(n||(n=i===s&&!OH),Lre(n,"echo",e.subject,t.operation,"ingest"),n){e.ack();return}r.append(Nu.MSG_HEADERS.TRANSACTED_NODES,s);try{let{operation:o,schema:c,next:l,table:u,records:f,hash_values:d,__origin:h,expiresAt:_}=t;Wr.trace("processing message:",o,c,u,(f?"records: "+f.map(v=>v?.id):"")+(d?"ids: "+d:""),"with sequence:",e.seq),Wr.trace(`messageProcessor nats msg id: ${e.headers.get(Nu.MSG_HEADERS.NATS_MSG_ID)}`);let p;f||(f=d);let S=new Promise(v=>p=v),{timestamp:g,user:R,node_name:E}=h||{},T=FE.get(c)?.get(u);if(!T)throw new Error(`Missing table for replication message: ${u}`);if(o==="define_schema")t.type=o,t.onCommit=p,T.send(t);else if(f.length===1&&!l)T.send({type:Wb(o),value:f[0],id:d?.[0],expiresAt:_,timestamp:g,table:u,onCommit:p,user:R,nodeName:E});else{let v=f.map((F,q)=>({type:Wb(o),value:F,expiresAt:_,id:d?.[q],table:u}));for(;l;)v.push({type:Wb(l.operation),value:l.record,expiresAt:l.expiresAt,id:l.id,table:l.table}),l=l.next;T.send({type:"transaction",writes:v,table:u,timestamp:g,onCommit:p,user:R,nodeName:E})}zb.get(Pre.CONFIG_PARAMS.CLUSTERING_REPUBLISHMESSAGES)!==!1&&Mre(e.subject.split(".").slice(0,-1).join("."),SH.createNatsTableStreamName(c,u),e.headers,e.data),await S;let O=Date.now()-g;g&&mH(O,"replication-latency",e.subject,o,"ingest")}catch(o){Wr.error(o)}e.ack()}a($re,"messageProcessor");function Wb(e){switch(e){case"insert":case"upsert":case"update":return"put"}return e}a(Wb,"convertOperation")});var Er=P((Mwe,VH)=>{"use strict";var Or=ce();Or.initSync();var Vre=require("fs-extra"),Kre=require("semver"),v_=require("path"),{monotonicFactory:Yre}=require("ulidx"),CH=Yre(),Wre=require("util"),PH=require("child_process"),zre=Wre.promisify(PH.exec),jre=PH.spawn,Ur=Dt(),je=(G(),D($)),{packageJson:Qre,PACKAGE_ROOT:Jre}=Et(),GE=oe(),js=X(),qE=lo(),Xre=vE(),L_=It(),{broadcast:Zre,onMessageByType:ene,getWorkerIndex:tne}=it(),{isMainThread:DH}=require("worker_threads"),{Encoder:rne,decode:tO}=require("msgpackr"),LH=new rne,{isEmpty:Xc}=GE,MH=qn(),Iwe=48*36e11;DH&&ene(je.ITC_EVENT_TYPES.RESTART,()=>{zr=void 0,Jc=void 0});var{connect:nne,StorageType:sne,RetentionPolicy:ine,AckPolicy:rO,DeliverPolicy:nO,DiscardPolicy:one,NatsConnection:Cwe,JetStreamManager:Pwe,JetStreamClient:Dwe,StringCodec:Lwe,JSONCodec:ane,createInbox:sO,headers:cne,ErrorCode:IH}=require("nats"),{recordAction:lne}=(Ci(),D(b_)),{encodeBlobsAsBuffers:une}=(_s(),D(_m)),vH=ane(),dne="clustering",fne=Qre.engines[Ur.NATS_SERVER_NAME],_ne=v_.join(Jre,"dependencies"),eO=v_.join(_ne,`${process.platform}-${process.arch}`,Ur.NATS_BINARY_NAME),Xb,Zb,M_,jc,Qc;VH.exports={runCommand:UH,checkNATSServerInstalled:hne,createConnection:iO,getConnection:U_,getJetStreamManager:x_,getJetStream:BH,getNATSReferences:Li,getServerList:mne,createLocalStream:oO,listStreams:HH,deleteLocalStream:Ene,getServerConfig:Iu,listRemoteStreams:gne,viewStream:Sne,viewStreamIterator:Tne,publishToStream:Ane,request:bne,reloadNATS:aO,reloadNATSHub:One,reloadNATSLeaf:Nne,extractServerName:yne,requestErrorHandler:wne,createLocalTableStream:qH,createTableStreams:Pne,purgeTableStream:$H,purgeSchemaTableStreams:Dne,getStreamInfo:Lne,updateLocalStreams:vne,closeConnection:pne,getJsmServerName:$E,addNatsMsgHeader:kH,clearClientCache:xH,updateRemoteConsumer:Ine,createConsumer:FH,updateConsumerIterator:Cne};async function UH(e,t=void 0){let{stdout:r,stderr:n}=await zre(e,{cwd:t});if(n)throw new Error(n.replace(`
21
21
  `,""));return r.replace(`
22
- `,"")}a(UH,"runCommand");async function hne(){try{await Vre.access(eO)}catch{return!1}let e=await UH(`${eO} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return Kre.eq(t,fne)}a(hne,"checkNATSServerInstalled");async function iO(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await MH.getClusterUser();if(Xc(o))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=o.username,r=o.decrypt_hash}js.trace("create nats connection called");let i=await nne({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:Or.get(je.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:Or.get(je.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:Or.get(je.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),js.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(o=>{o&&js.error("Error with Nats client connection, connection closed",o),i===zr&&xH()}),i}a(iO,"createConnection");function xH(){zr=void 0,jc=void 0,Qc=void 0,Jc=void 0}a(xH,"clearClientCache");async function pne(){zr&&(await zr.drain(),zr=void 0,jc=void 0,Qc=void 0,Jc=void 0)}a(pne,"closeConnection");var zr,Jc;async function U_(){return Jc||(Jc=iO(Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),zr=await Jc),zr||Jc}a(U_,"getConnection");async function x_(){if(jc)return jc;Xc(zr)&&await U_();let{domain:e}=Iu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Xc(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return jc=await zr.jetstreamManager({domain:e,timeout:6e4}),jc}a(x_,"getJetStreamManager");async function BH(){if(Qc)return Qc;Xc(zr)&&await U_();let{domain:e}=Iu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Xc(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Qc=zr.jetstream({domain:e,timeout:6e4}),Qc}a(BH,"getJetStream");async function Li(){let e=zr||await U_(),t=jc||await x_(),r=Qc||await BH();return{connection:e,jsm:t,js:r}}a(Li,"getNATSReferences");async function mne(e){let t=Or.get(je.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await MH.getClusterUser(),s=await iO(t,r,n),i=sO(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=vH.decode(f.data);d.response_time=Date.now()-l,c.push(d)}})();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 GE.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(mne,"getServerList");async function oO(e,t){let{jsm:r}=await Li(),n=Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:sne.File,retention:ine.Limits,subjects:t,discard:one.Old,max_msgs:s,max_bytes:i,max_age:n})}a(oO,"createLocalStream");async function HH(){let{jsm:e}=await Li(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(HH,"listStreams");async function Ene(e){let{jsm:t}=await Li();await t.streams.delete(e)}a(Ene,"deleteLocalStream");async function gne(e){let{connection:t}=await Li(),r=[],n=sO(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(vH.decode(o.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}a(gne,"listRemoteStreams");async function Sne(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Li(),i=CH(),o={durable_name:i,ack_policy:rO.Explicit};t&&(o.deliver_policy=nO.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);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 f of l){let d=tO(f.data),h={nats_timestamp:f.info.timestampNanos,nats_sequence:f.info.streamSequence,entry:d};if(f.headers&&(h.origin=f.headers.get(Ur.MSG_HEADERS.ORIGIN)),u.push(h),f.ack(),f.info.pending===0)break}return await c.delete(),u}a(Sne,"viewStream");async function*Tne(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Li(),i=CH(),o={durable_name:i,ack_policy:rO.Explicit};t&&(o.deliver_policy=nO.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);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 f=tO(u.data);f[0]||(f=[f]);for(let d of f){let h={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:d};u.headers&&(h.origin=u.headers.get(Ur.MSG_HEADERS.ORIGIN)),yield h}if(u.ack(),u.info.pending===0)break}await c.delete()}a(Tne,"viewStreamIterator");async function Ane(e,t,r,n){js.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=kH(n,r);let{js:s}=await Li(),i=await $E(),o=`${e}.${i}`,c=await une(()=>n instanceof Uint8Array?n:LH.encode(n));try{js.trace(`publishToStream publishing to subject: ${o}`),lne(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(o,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return GH(async()=>{try{await s.publish(o,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){js.trace(`publishToStream creating stream: ${t}`);let f=o.split(".");f[2]="*",await oO(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(Ane,"publishToStream");function kH(e,t){t===void 0&&(t=cne());let r=Or.get(je.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(Ur.MSG_HEADERS.ORIGIN)&&r&&t.append(Ur.MSG_HEADERS.ORIGIN,r),t}a(kH,"addNatsMsgHeader");function Iu(e){e=e.toLowerCase();let t=v_.join(Or.get(je.CONFIG_PARAMS.ROOTPATH),dne);if(e===je.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return Xc(Zb)&&(Zb={port:L_.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:L_.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_NODENAME)+Ur.SERVER_SUFFIX.HUB,config_file:Ur.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:v_.join(t,Ur.PID_FILES.HUB),hdb_nats_path:t}),Zb;if(e===je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return Xc(Xb)&&(Xb={port:L_.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:L_.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_NODENAME)+Ur.SERVER_SUFFIX.LEAF,config_file:Ur.NATS_CONFIG_FILES.LEAF_SERVER,domain:L_.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_NODENAME)+Ur.SERVER_SUFFIX.LEAF,pid_file_path:v_.join(t,Ur.PID_FILES.LEAF),hdb_nats_path:t}),Xb;js.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a(Iu,"getServerConfig");async function FH(e,t,r,n){try{await e.consumers.add(t,{ack_policy:rO.Explicit,durable_name:r,deliver_policy:nO.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a(FH,"createConsumer");async function Rne(e,t,r){await e.consumers.delete(t,r)}a(Rne,"removeConsumer");function yne(e){return e.split(".")[1]}a(yne,"extractServerName");async function bne(e,t,r=6e4,n=sO()){if(!GE.isObject(t))throw new Error("data param must be an object");let s=LH.encode(t),{connection:i}=await Li(),o={timeout:r};n&&(o.reply=n,o.noMux=!0);let c=await i.request(e,s,o);return tO(c.data)}a(bne,"request");function aO(e){return new Promise(async(t,r)=>{let n=jre(eO,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",o=>{r(o)}),n.stdout.on("data",o=>{i+=o.toString()}),n.stderr.on("data",o=>{s+=o.toString()}),n.stderr.on("close",o=>{s&&r(s),t(i)})})}a(aO,"reloadNATS");async function One(){let{pid_file_path:e}=Iu(je.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await aO(e)}a(One,"reloadNATSHub");async function Nne(){let{pid_file_path:e}=Iu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await aO(e)}a(Nne,"reloadNATSLeaf");function wne(e,t,r){let n;switch(e.code){case IH.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case IH.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(wne,"requestErrorHandler");async function Ine(e,t){let r=t+Ur.SERVER_SUFFIX.LEAF,{connection:n}=await Li(),{jsm:s}=await xne(r),{schema:i,table:o}=e,c=qE.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await GH(async()=>{if(e.subscribe===!0)await FH(s,c,n.info.server_name,l);else try{await Rne(s,c,n.info.server_name)}catch(u){js.trace(u)}})}a(Ine,"updateRemoteConsumer");async function Cne(e,t,r,n){let s=qE.createNatsTableStreamName(e,t),i=r+Ur.SERVER_SUFFIX.LEAF,o={type:je.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!DH&&tne()<Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=Jb();await c(o)}await Zre(o),n==="stop"&&await GE.async_set_timeout(1e3)}a(Cne,"updateConsumerIterator");function GH(e){return Xre.writeTransaction(je.SYSTEM_SCHEMA_NAME,je.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(GH,"exclusiveLock");async function qH(e,t){let r=qE.createNatsTableStreamName(e,t),n=await $E(),s=Mne(e,t,n);await oO(r,[s])}a(qH,"createLocalTableStream");async function Pne(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await qH(n,s)}}a(Pne,"createTableStreams");async function $H(e,t,r=void 0){if(Or.get(je.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=qE.createNatsTableStreamName(e,t),{domain:s}=Iu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await U_()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")js.warn(n);else throw n}}a($H,"purgeTableStream");async function Dne(e,t){if(Or.get(je.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await $H(e,t[r])}a(Dne,"purgeSchemaTableStreams");async function Lne(e){return(await x_()).streams.info(e)}a(Lne,"getStreamInfo");function Mne(e,t,r){return`${Ur.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(Mne,"createSubjectName");async function $E(){if(M_)return M_;if(M_=(await x_())?.nc?.info?.server_name,M_===void 0)throw new Error("Unable to get jetstream manager server name");return M_}a($E,"getJsmServerName");async function vne(){let e=await x_(),t=await $E(),r=await HH();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=Une(n),c=i.split(".");if(c[c.length-1]===t&&!o||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let f=u.join(".");js.trace(`Updating stream subject name from: ${i} to: ${f}`),s.subjects[0]=f,await e.streams.update(s.name,s)}}a(vne,"updateLocalStreams");function Une(e){let{config:t}=e,r=!1,n=Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=Or.get(je.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}a(Une,"updateStreamLimits");async function xne(e){let t,r;try{t=await zr.jetstream({domain:e}),r=await zr.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw js.error("Unable to connect to:",e),n}return{js:t,jsm:r}}a(xne,"connectToRemoteJS")});function cO(e){let t=e.get(VE),r=t?(0,Cu.unpack)(t):null;r||(r={remoteNameToId:{}});let n=tt(),s=!1;r.nodeName=tt();let i=r.remoteNameToId;if(i[n]!==0){let o=0,c;for(let l in i){let u=i[l];u===0?c=l:u>o&&(o=u)}if(c){o++,i[c]=o;let l=[Symbol.for("seq"),o];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:H_(e)??1,nodes:[]})})}i[n]=0,e.putSync(VE,(0,Cu.pack)(r))}return r}function B_(e){return cO(e).remoteNameToId}function YH(e,t){let r=cO(t),n=r.remoteNameToId,s=new Map,i=!1;for(let o in e){let c=e[o],l=n[o];if(l==null){let u=0;for(let f in n){let d=n[f];d>u&&(u=d)}l=u+1,n[o]=l,i=!0}s.set(c,l)}return i&&t.putSync(VE,(0,Cu.pack)(r)),s}function KE(e,t){let r=cO(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let o in n){let c=n[o];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(VE,(0,Cu.pack)(r))}return KH.trace?.("The remote node name map",e,n,s),s}var KH,Cu,VE,lO=be(()=>{KH=M(mi());ms();Cu=require("msgpackr"),VE=Symbol.for("remote-ids");a(cO,"getIdMappingRecord");a(B_,"exportIdMapping");a(YH,"remoteToLocalNodeId");a(KE,"getIdOfRemoteNode")});var uO={};Be(uO,{commits_awaiting_replication:()=>Du,getHDBNodeTable:()=>sr,getReplicationSharedStatus:()=>YE,iterateRoutes:()=>F_,shouldReplicateToNode:()=>k_,subscribeToNodeUpdates:()=>Lu});function sr(){return WH||(WH=_t({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 YE(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Lu(e){sr().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;JH.debug?.("adding node",n,"on node",tt()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==tt()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of sr().search({}))if(i.shard!=null){let o=s.get(i.shard);o||s.set(i.shard,o=[]),o.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function k_(e,t){return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&sr().primaryStore.get(tt())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function Bne(){Lu(e=>{ma({},(t,r)=>{let n=e.name,s=zH.get(n);if(s||zH.set(n,s=new Map),s.has(r))return;let i;for(let o in t)if(i=t[o].auditStore,i)break;if(i){let o=YE(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of Du.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*F_(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=Pu.default.get(B.REPLICATION_SECUREPORT)??(!Pu.default.get(B.REPLICATION_PORT)&&Pu.default.get(B.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||Pu.default.get(B.REPLICATION_PORT)||Pu.default.get(B.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){jH.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,start_time:t.startTime,revoked_certificates:t.revokedCertificates}}}var jH,QH,Pu,JH,WH,zH,Du,Zc=be(()=>{Ue();ms();zp();jH=require("worker_threads"),QH=M(he()),Pu=M(ce());G();JH=M(mi());server.nodes=[];a(sr,"getHDBNodeTable");a(YE,"getReplicationSharedStatus");a(Lu,"subscribeToNodeUpdates");a(k_,"shouldReplicateToNode");zH=new Map;WD((e,t,r)=>{if(r>server.nodes.length)throw new QH.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);Du||(Du=new Map,Bne());let n=Du.get(e);return n||(n=[],Du.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(Bne,"startSubscriptionToReplications");a(F_,"iterateRoutes")});var ek={};Be(ek,{connectedToNode:()=>el,disconnectedFromNode:()=>vu,ensureNode:()=>Eo,requestClusterStatus:()=>ZH,startOnMainThread:()=>_O});async function _O(e){let t=0,r=Ze();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){WE.set(i,H_(l.auditStore));break}}}vi.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes?.search([])||[])i.push(o);for(let o of F_(e))try{let c=!o.subscriptions;if(c){let u=tt(),f=sr().primaryStore.get(u);if(f!==null){let d=e.url??Ea();(f===void 0||f.url!==d||f.shard!==e.shard)&&await Eo(u,{name:u,url:d,shard:e.shard,replicates:!0})}}let l=o.trusted!==!1;if(c&&o.replicates==null&&(o.replicates=!0),i.find(u=>u.url===o.url))continue;s(o)}catch(c){console.error(c)}Lu(s)});let n;function s(i,o=i?.name){let c=tt()&&o===tt()||Ea()&&i?.url===Ea();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let h of sr().search([]))h.replicates&&h.name!==o&&s(h,h.name);n=d}if(nt.trace("Setting up node replication for",i),!i){for(let[d,h]of Mi){let _;for(let[p,{worker:S,nodes:g}]of h){let R=g[0];if(R&&R.name==o){_=!0;for(let[E,{worker:T}]of h)h.delete(E),nt.warn("Node was deleted, unsubscribing from node",o,E,d),T?.postMessage({type:"unsubscribe-from-node",node:o,database:E,url:d});break}}if(_){Mi.get(d).iterator.remove(),Mi.delete(d);return}}return}if(c)return;if(!i.url){nt.info(`Node ${i.name} is missing url`);return}let l=Mi.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(nt.info(`Added node ${i.name} at ${i.url} for process ${tt()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[d,h]of Mu)if(i.url===h.url){Mu.delete(d);break}Mu.set(i.name,i)}let u=Ze();if(l||(l=new Map,Mi.set(i.url,l)),l.iterator=ma(e,(d,h,_)=>{_?f(h,!0):f(h,!1)}),i.subscriptions)for(let d of i.subscriptions){let h=d.database||d.schema;u[h]||(nt.warn(`Database ${h} not found for node ${i.name}, making a subscription anyway`),f(h,!1))}function f(d,h){nt.trace("Setting up replication for database",d,"on node",i.name);let _=l.get(d),p,S=[{replicateByDefault:h,...i}];WE.has(d)&&(S.push({replicateByDefault:h,name:tt(),start_time:WE.get(d),end_time:Date.now(),replicates:!0}),WE.delete(d));let g=k_(i,d),R=vi.workers.filter(E=>E.name==="http");if(_?(p=_.worker,_.nodes=S):g&&(t=t%R.length,p=R[t++],l.set(d,{worker:p,nodes:S,url:i.url}),p?.on("exit",()=>{l.get(d)?.worker===p&&(l.delete(d),f(d,h))})),g)setTimeout(()=>{let E={type:"subscribe-to-node",database:d,nodes:S};p?p.postMessage(E):G_(E)},Hne);else{nt.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],sr().primaryStore.get(tt())?.replicates),sr().primaryStore.get(tt())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};p?p.postMessage(E):jE(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),vu=a(function(i){try{if(fO.default.get(B.REPLICATION_FAILOVER)===!1)return;nt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(Mu.keys()),c=o.sort(),l=c.indexOf(i.name||Qs(i.url));if(l===-1){nt.warn("Disconnected node not found in node map",i.name,o);return}let u=Mi.get(i.url),f=u?.get(i.database);if(!f){nt.warn("Disconnected node not found in replication map",i.database,u);return}if(f.connected=!1,i.finished)return;let d=f.nodes[0];if(!(d.replicates===!0||d.replicates?.sends||d.subscriptions?.length))return;let h=d.shard,_=(l+1)%c.length;for(;l!==_;){let p=c[_],S=Mu.get(p);u=Mi.get(S.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==h){_=(_+1)%c.length;continue}let{worker:R,nodes:E}=g,T=!1;for(let O of f.nodes){if(E.some(v=>v.name===O.name)){nt.info(`Disconnected node is already failing over to ${p} for ${i.database}`);continue}O.end_time<Date.now()||(E.push(O),T=!0)}if(f.nodes=[f.nodes[0]],!T){nt.info(`Disconnected node ${i.name} has no nodes to fail over to ${p}`);return}nt.info(`Failing over ${i.database} from ${i.name} to ${p}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:E}):G_({database:i.database,nodes:E});return}nt.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){nt.error("Error failing over node",o)}},"disconnectedFromNode"),el=a(function(i){let o=Mi.get(i.url),c=o?.get(i.database);if(!c){nt.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){nt.info("Connected node has no nodes",i.database,c);return}if(!l.name){nt.debug("Connected node is not named yet",i.database,c);return}c.nodes=[l];let u=!1;for(let f of Mi.values()){let d=f.get(i.database);if(!d||d==c)continue;let{worker:h,nodes:_,connected:p}=d;if(_)if(p===!1&&_[0].shard===l.shard)u=!0,c.nodes.push(_[0]);else{let S=_.filter(g=>g.name!==l.name);S.length<_.length&&(d.nodes=S,h.postMessage({type:"subscribe-to-node",database:i.database,nodes:_}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,vi.onMessageByType)("disconnected-from-node",vu),(0,vi.onMessageByType)("connected-to-node",el),(0,vi.onMessageByType)("request-cluster-status",ZH)}function ZH(e,t){let r=[];for(let[n,s]of Mu)try{let i=Mi.get(s.url);nt.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let o=[];if(i){for(let[l,{worker:u,connected:f,nodes:d,latency:h}]of i)o.push({database:l,connected:f,latency:h,thread_id:u?.threadId,nodes:d.filter(_=>!(_.end_time<Date.now())).map(_=>_.name)});let c=(0,dO.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){nt.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Eo(e,t){let r=sr();e=e??Qs(t.url),t.name=e;try{if(t.ca){let s=new XH.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subject_alt_name:s.subjectAltName,serial_number:s.serialNumber,valid_from:s.validFrom,valid_to:s.validTo}}}catch(s){nt.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(nt.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!fO.default.get(B.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],o=(0,dO.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of o)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=[...o,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}nt.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var vi,zE,nt,dO,fO,XH,Hne,Mi,vu,el,Mu,WE,q_=be(()=>{Ue();vi=M(it());ms();zE=require("worker_threads");Zc();nt=M(X()),dO=require("lodash"),fO=M(ce());G();XH=require("crypto"),Hne=200,Mi=new Map,Mu=new Map,WE=new Map;a(_O,"startOnMainThread");a(ZH,"requestClusterStatus");zE.parentPort&&(vu=a(e=>{zE.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),el=a(e=>{zE.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,vi.onMessageByType)("subscribe-to-node",e=>{G_(e)}),(0,vi.onMessageByType)("unsubscribe-from-node",e=>{jE(e)}));a(Eo,"ensureNode")});var Zs=P(yk=>{"use strict";var ir=require("path"),{watch:kne}=require("chokidar"),An=require("fs-extra"),Uu=require("node-forge"),ok=require("net"),{generateKeyPair:pO,X509Certificate:go,createPrivateKey:ak}=require("crypto"),Fne=require("util");pO=Fne.promisify(pO);var yt=Uu.pki,Js=require("joi"),{v4:ck}=require("uuid"),{validateBySchema:SO}=st(),St=X(),zn=ce(),Es=(G(),D($)),{CONFIG_PARAMS:rl}=Es,Xs=SA(),{ClientError:Sa}=he(),QE=require("node:tls"),{relative:lk,join:Gne}=require("node:path"),{CERT_PREFERENCE_APP:Qwe,CERTIFICATE_VALUES:tk}=Xs,qne=uc(),mO=It(),{table:$ne,getDatabases:Vne,databases:hO}=(Ue(),D(ct)),{getJWTRSAKeys:rk}=(bu(),D(P_));Object.assign(yk,{generateKeys:RO,updateConfigCert:Ek,createCsr:Jne,signCertificate:Xne,setCertTable:xu,loadCertificates:hk,reviewSelfSignedCert:bO,createTLSSelector:Sk,listCertificates:Ak,addCertificate:sse,removeCertificate:ose,createNatsCerts:tse,generateCertsKeys:ese,getReplicationCert:V_,getReplicationCertAuth:Qne,renewSelfSigned:rse,hostnamesFromCert:OO,getKey:ase});var{urlToNodeName:uk,getThisNodeUrl:Kne,getThisNodeName:XE,clearThisNodeName:Yne}=(ms(),D(Ra)),{readFileSync:Wne,statSync:dk}=require("node:fs"),Jwe=ce(),{getTicketKeys:zne,onMessageFromWorkers:jne}=it(),ga=X(),{isMainThread:fk}=require("worker_threads"),{TLSSocket:_k,createSecureContext:Xwe}=require("node:tls"),TO=3650,$_=["127.0.0.1","localhost","::1"],AO=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];jne(async e=>{e.type===Es.ITC_EVENT_TYPES.RESTART&&(zn.initSync(!0),await bO())});var xr;function Aa(){return xr||(xr=Vne().system.hdb_certificate,xr||(xr=$ne({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__"}]}))),xr}a(Aa,"getCertTable");async function V_(){let e=Sk("operations-api"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(XE());if(!r)return;let n=new go(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(V_,"getReplicationCert");async function Qne(){Aa();let e=(await V_()).options.cert,r=new go(e).issuer.match(/CN=(.*)/)?.[1];return xr.get(r)}a(Qne,"getReplicationCertAuth");var nk,Ta=new Map;function hk(){if(nk)return;nk=!0;let e=[{configKey:rl.TLS},{configKey:rl.OPERATIONSAPI_TLS}];Aa();let t=ir.dirname(mO.getConfigFilePath()),r;for(let{configKey:n}of e){let s=mO.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&lk(Gne(t,"keys"),o);c&&sk(o,l=>{Ta.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&fk){let f;sk(u,d=>{if(tk.cert===d)return;let h=i.hostname??i.hostnames??i.host??i.hosts;h&&!Array.isArray(h)&&(h=[h]);let _=gk(u),p=new go(_),S;try{S=Rk(p)}catch(T){logger.error("error extracting host name from certificate",T);return}if(S==null){logger.error("No host name found on certificate");return}if(p.checkIssued(new go(tk.cert)))return;let g=xr.primaryStore.get(S),R=dk(u).mtimeMs,E=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&R<=E){R<E&&St.info(`Certificate ${S} at ${u} is older (${new Date(R)}) than the certificate in the database (${E>1?new Date(E):"only self signed certificate available"})`);return}r=xr.put({name:S,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:_,private_key_name:c,is_authority:l,hostnames:h,file_timestamp:R,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}a(hk,"loadCertificates");function sk(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&fk&&St.warn(`Reloading ${r}:`,i),n=c,t(gk(i)))}catch(c){St.error(`Error loading ${r}:`,i,c)}},"loadFile");An.existsSync(e)?s(e,dk(e)):St.error(`${r} file not found:`,e),kne(e,{persistent:!1}).on("change",s)}a(sk,"loadAndWatch");function EO(){let e=Kne();if(e==null){let t=$_[0];return St.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return uk(e)}a(EO,"getHost");function JE(){let e=XE();if(e==null){let t=$_[0];return St.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(JE,"getCommonName");async function Jne(){let e=await V_(),t=yt.certificateFromPem(e.options.cert),r=yt.privateKeyFromPem(e.options.key);St.info("Creating CSR with cert named:",e.name);let n=yt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:JE()},...AO];St.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:pk()}];return St.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Uu.pki.certificationRequestToPem(n)}a(Jne,"createCsr");function pk(){let e=$_.includes(JE())?$_:[...$_,JE()];return e.includes(EO())||e.push(EO()),[{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=>ok.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(pk,"certExtensions");async function Xne(e){let t={},r=ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Aa();for await(let f of xr.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if(Ta.has(f.private_key_name)){n=Ta.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await An.exists(ir.join(r,f.private_key_name))){n=An.readFile(ir.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await gO();s=f.ca,n=f.private_key}n=yt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=yt.certificateFromPem(s.certificate);St.info("Signing CSR with cert named",s.name);let o=yt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return St.error(f),new Error("Error verifying CSR: "+f.message)}let c=Uu.pki.createCertificate();c.serialNumber=Math.random().toString().slice(2,10),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+TO),St.info("sign cert setting validity:",c.validity),St.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),St.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;St.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,Uu.md.sha256.create()),t.certificate=yt.certificateToPem(c)}else St.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(Xne,"signCertificate");async function Zne(e,t){await xu({name:XE(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await xu({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:yt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}a(Zne,"createCertificateTable");async function xu(e){let t=new go(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},Aa(),await xr.patch(e)}a(xu,"setCertTable");async function RO(){let e=await pO("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{public_key:yt.publicKeyFromPem(e.publicKey),private_key:yt.privateKeyFromPem(e.privateKey)}}a(RO,"generateKeys");async function yO(e,t,r){let n=yt.createCertificate();if(!t){let o=await V_();t=yt.certificateFromPem(o.options.cert).publicKey}n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+TO);let i=[{name:"commonName",value:JE()},...AO];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(pk()),n.sign(e,Uu.md.sha256.create()),yt.certificateToPem(n)}a(yO,"generateCertificates");async function gO(){let e=await Ak(),t;for(let r of e){if(!r.is_authority)continue;let n=await Tk(r.private_key_name);if(r.private_key_name&&n&&new go(r.certificate).checkPrivateKey(ak(n))){St.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;St.trace("No CA found with matching private key")}a(gO,"getCertAuthority");async function mk(e,t,r=!0){let n=yt.createCertificate();n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+TO);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${zn.get(rl.REPLICATION_HOSTNAME)??uk(zn.get(rl.REPLICATION_URL))??ck().split("-")[0]}`},...AO];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Uu.md.sha256.create());let o=ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=ir.join(o,Xs.PRIVATEKEY_PEM_NAME);return r&&await An.writeFile(c,yt.privateKeyToPem(e)),n}a(mk,"generateCertAuthority");async function ese(){let{private_key:e,public_key:t}=await RO(),r=await mk(e,t),n=await yO(e,t,r);await Zne(n,r),Ek()}a(ese,"generateCertsKeys");async function tse(){let e=await yO(yt.privateKeyFromPem(Xs.CERTIFICATE_VALUES.key),void 0,yt.certificateFromPem(Xs.CERTIFICATE_VALUES.cert)),t=ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=ir.join(t,Xs.NATS_CERTIFICATE_PEM_NAME);await An.exists(r)||await An.writeFile(r,e);let n=ir.join(t,Xs.NATS_CA_PEM_NAME);await An.exists(n)||await An.writeFile(n,Xs.CERTIFICATE_VALUES.cert)}a(tse,"createNatsCerts");async function rse(){Aa();for await(let e of xr.search([{attribute:"is_self_signed",value:!0}]))await xr.delete(e.name);await bO()}a(rse,"renewSelfSigned");async function bO(){Yne(),await hk(),Aa();let e=await gO();if(!e){St.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=a(u=>{try{return{key:yt.privateKeyFromPem(An.readFileSync(u)),keyPath:u}}catch(f){return St.warn(`Failed to parse private key from ${u}:`,f.message),{key:null,keyPath:u}}},"tryToParseKey"),n=zn.get(rl.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let f=r(u.privateKey);if(s=f.key,i=f.keyPath,f.key)break}}else{let u=zn.get(rl.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=lk(o,i);s||(St.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{private_key:s}=await RO(),An.existsSync(ir.join(o,Xs.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${ck().split("-")[0]}.pem`),await An.writeFile(ir.join(o,c),yt.privateKeyToPem(s)));let l=await mk(s,yt.setRsaPublicKey(s.n,s.e),!1);await xu({name:l.subject.getField("CN").value,uses:["https"],certificate:yt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await V_()){let r=XE();St.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await gO();let n=yt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await yO(yt.privateKeyFromPem(e.private_key),s,n);await xu({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(bO,"reviewSelfSignedCert");function Ek(){let e=qne(Object.keys(Es.CONFIG_PARAM_MAP),!0),t=ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=ir.join(t,Xs.PRIVATEKEY_PEM_NAME),n=ir.join(t,Xs.NATS_CERTIFICATE_PEM_NAME),s=ir.join(t,Xs.NATS_CA_PEM_NAME),i=Es.CONFIG_PARAMS,o={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(o[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(o[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,o[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,o[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),mO.updateConfigValue(void 0,void 0,o,!1,!0)}a(Ek,"updateConfigCert");function gk(e){return e.startsWith("-----BEGIN")?e:Wne(e,"utf8")}a(gk,"readPEM");var ik=QE.createSecureContext;QE.createSecureContext=function(e){if(!e.cert||!e.key)return ik(e);let t={...e};delete t.key,delete t.cert;let r=ik(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var nse=_k.prototype._init;_k.prototype._init=function(e,t){nse.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,o)=>{this.sni_context=o?.context||o,this.certCbDone()})}};var tl=new Map;function Sk(e,t){let r=new Map,n,s=!1;return i.initialize=o=>i.ready?i.ready:(o&&(o.secureContexts=r,o.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),tl.clear();let f=0;for await(let d of hO.system.hdb_certificate.search([])){let h=d.certificate,_=new go(h);d.is_authority&&(_.asString=h,tl.set(_.subject,h))}for await(let d of hO.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let h=e==="operations-api",_=d.is_self_signed?1:2;h&&d.uses?.includes?.("operations")&&(_+=1);let p=await Tk(d.private_key_name),S=d.certificate,g=new go(S);if(tl.has(g.issuer)&&(S+=`
23
- `+tl.get(g.issuer)),!p||!S)throw new Error("Missing private key or certificate for secure server");let R={ciphers:d.ciphers,ticketKeys:zne(),availableCAs:tl,ca:t&&Array.from(tl.values()),cert:S,key:p,key_file:d.private_key_name,is_self_signed:d.is_self_signed};o&&(R.sessionIdContext=o.sessionIdContext);let E=QE.createSecureContext(R);E.name=d.name,E.options=R,E.quality=_,E.certificateAuthorities=Array.from(tl),E.certStart=S.toString().slice(0,100);let T=d.hostnames??OO(g);Array.isArray(T)||(T=[T]);let O;for(let v of T)if(v){v[0]==="*"&&(s=!0,v=v.slice(1)),v===EO()&&(_+=2),ok.isIP(v)&&(O=!0);let F=r.get(v)?.quality??0;_>F&&r.set(v,E)}else ga.error("No hostname found for certificate at",QE.certificate);ga.trace("Adding TLS",E.name,"for",o.ports||"client","cert named",d.name,"hostnames",T,"quality",_,"best quality",f),_>f&&(i.defaultContext=n=E,f=_,o&&(o.defaultContext=E))}catch(h){ga.error("Error applying TLS for",d.name,h)}o?.secureContextsListeners.forEach(d=>d()),c(n)}catch(f){l(f)}}a(u,"updateTLS"),hO.system.hdb_certificate.subscribe({listener:a(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(o,c){ga.info("TLS requested for",o||"(no SNI)");let l=o;for(;;){let f=r.get(l);if(f)return ga.debug("Found certificate for",o,f.certStart),f.updatedContext&&(f=f.updatedContext),c(null,f);if(s&&l){let d=l.indexOf(".",1);d<0?l="":l=l.slice(d)}else break}o?ga.debug("No certificate found to match",o,"using the default certificate"):ga.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):ga.info("No default certificate found"),c(null,u)}a(i,"SNICallback")}a(Sk,"createTLSSelector");async function Tk(e){let t=Ta.get(e);return!t&&e?await An.readFile(ir.join(zn.get(rl.ROOTPATH),Es.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(Tk,"getPrivateKeyByName");async function Ak(){Aa();let e=[];for await(let t of xr.search([]))e.push(t);return e}a(Ak,"listCertificates");async function sse(e){let t=SO(e,Js.object({name:Js.string().required(),certificate:Js.string().required(),is_authority:Js.boolean().required(),private_key:Js.string(),hosts:Js.array(),uses:Js.array()}));if(t)throw new Sa(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,o=new go(n),c=!1,l=!1,u;for(let[_,p]of Ta)!s&&!c&&o.checkPrivateKey(ak(p))&&(c=!0,u=_),s&&s===p&&(l=!0,u=_);if(!i&&!s&&!c)throw new Sa("A suitable private key was not found for this certificate");let f;if(!r){try{f=Rk(o)}catch(_){St.error(_)}if(f==null)throw new Sa("Error extracting certificate common name, please provide a name parameter")}let d=ise(r??f);s&&!c&&!l&&(await An.writeFile(ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME,d+".pem"),s),Ta.set(d,s));let h={name:r??f,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(h.private_key_name=u??d+".pem"),e.ciphers&&(h.ciphers=e.ciphers),await xu(h),"Successfully added certificate: "+d}a(sse,"addCertificate");function ise(e){return e.replace(/[^a-z0-9\.]/gi,"-")}a(ise,"sanitizeName");async function ose(e){let t=SO(e,Js.object({name:Js.string().required()}));if(t)throw new Sa(t.message);let{name:r}=e;Aa();let n=await xr.get(r);if(!n)throw new Sa(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await xr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(St.info("Removing private key named",s),await An.remove(ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME,s)))}return await xr.delete(r),"Successfully removed "+r}a(ose,"removeCertificate");function Rk(e){let t=e.subject.match(/CN=(.*)/)?.[1];return t||OO(e)[0]}a(Rk,"getPrimaryHostName");function OO(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]:[]}a(OO,"hostnamesFromCert");async function ase(e){if(e.bypass_auth!==!0)throw new Sa("Unauthorized","401");let t=SO(e,Js.object({name:Js.string().required()}));if(t)throw new Sa(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await rk()).privateKey;if(r===".jwtPublic")return(await rk()).publicKey;if(Ta.get(r))return Ta.get(e.name);throw new Sa("Key not found")}a(ase,"getKey")});var Kk={};Be(Kk,{CONFIRMATION_STATUS_POSITION:()=>qk,NodeReplicationConnection:()=>Hu,OPERATION_REQUEST:()=>CO,RECEIVED_TIME_POSITION:()=>DO,RECEIVED_VERSION_POSITION:()=>PO,RECEIVING_STATUS_POSITION:()=>LO,RECEIVING_STATUS_RECEIVING:()=>Vk,RECEIVING_STATUS_WAITING:()=>$k,SENDING_TIME_POSITION:()=>K_,createWebSocket:()=>og,database_subscriptions:()=>ba,replicateOverWS:()=>Y_,table_update_listeners:()=>vO});async function og(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=tt(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!wO){let l=(0,Hk.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),wO=u.secureContexts}if(i=wO.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 o={};r&&(o.Authorization=r);let c={headers:o,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,Fk.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(sg?.caCount!==So.size&&(sg=kk.createSecureContext({...i.options,ca:[...So,...i.options.availableCAs.values()]}),sg.caCount=So.size),c.secureContext=sg),new xk.WebSocket(e,"harperdb-replication-v1",c)}function Y_(e,t,r){let n=t.port||t.securePort,s=nl.pid%1e3+"-"+Bk.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3),i=0,o=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(o.buffer,0,1024),u=t.database,f=t.databaseSubscriptions||ba,d,h,_=!1,p=t.subscription;p?.then&&p.then(A=>p=A);let S=t.tables||u&&Ze()[u];if(!r){ae.error?.("No authorization provided"),sn(1008,"Unauthorized");return}let g=new Map,R=[],E=r.name;E&&t.connection&&(t.connection.nodeName=E);let T,O,v,F,q,j,te,se=6e4,z,ne=0,le=0,ie=0,Re=Uk.default.get(B.REPLICATION_BLOBTIMEOUT)??12e4,pe=new Map,Ae=[],Bt=0,dt;if(t.url){let A=a(()=>{q&&le===e._socket?.bytesRead&&ie===e._socket?.bytesWritten?e.terminate():(q=performance.now(),e.ping(),le=e._socket?.bytesRead,ie=e._socket?.bytesWritten)},"send_ping");v=setInterval(A,Mk).unref(),A()}else Cn();e._socket?.setMaxListeners(200);function Cn(){clearTimeout(F),le=e._socket?.bytesRead,ie=e._socket?.bytesWritten,F=setTimeout(()=>{le===e._socket?.bytesRead&&ie===e._socket?.bytesWritten&&(ae.warn?.(`Timeout waiting for ping from ${E}, terminating connection and reconnecting`),e.terminate())},Mk*2).unref()}a(Cn,"resetPingTimer");function nn(){return h||(h=YE(d,u,E)),h}a(nn,"getSharedStatus"),u&&zo(u);let wr,Fd,nc=[],WT=[],zT,Ht=[],Gd=[],qd=[],jT=150,Sp=25,$d=0,De=0,Vd=!1,Wi,Ir,Pn,sc;e.on("message",A=>{ne=performance.now();try{let w=A.dataView=new sl(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let N=(0,et.decode)(A),[H,U,Q]=N;switch(H){case Ok:{if(U){if(E){if(E!==U){ae.error?.(s,`Node name mismatch, expecting to connect to ${E}, but peer reported name as ${U}, disconnecting`),e.send((0,et.encode)([Bu])),sn(1008,"Node name mismatch");return}}else if(E=U,t.connection?.tentativeNode){let Y=t.connection.tentativeNode;Y.name=E,t.connection.tentativeNode=null,Eo(E,Y)}if(t.connection&&(t.connection.nodeName=E),ae.debug?.(s,"received node name:",E,"db:",u),!u)try{zo(u=N[2]),u==="system"&&(wr=ma(t,(Y,V)=>{Wo(V)&&Wd(V)}),e.on("close",()=>{wr?.remove()}))}catch(Y){ae.warn?.(s,"Error setting database",Y),e.send((0,et.encode)([Bu])),sn(1008,Y.message);return}Yo()}break}case Dk:{ae.debug?.(s,"Received table definitions for",U.map(Y=>Y.table));for(let Y of U){let V=N[2];Y.database=V;let ue;Wo(V)&&(V==="system"?Ye[V]?.[Y.table]||(ue=C(Y,Ye[V]?.[Y.table])):ue=C(Y,Ye[V]?.[Y.table]),d||(d=ue?.auditStore),S||(S=Ze()?.[V]))}break}case Bu:sn();break;case CO:try{let Y=r?.replicates||r?.subscribers||r?.name;server.operation(U,{user:r},!Y).then(V=>{Array.isArray(V)&&(V={results:V}),V.requestId=U.requestId,e.send((0,et.encode)([eg,V]))},V=>{e.send((0,et.encode)([eg,{requestId:U.requestId,error:V instanceof Error?V.toString():V}]))})}catch(Y){e.send((0,et.encode)([eg,{requestId:U.requestId,error:Y instanceof Error?Y.toString():Y}]))}break;case eg:let{resolve:J,reject:k}=g.get(U.requestId);U.error?k(new Error(U.error)):J(U),g.delete(U.requestId);break;case NO:let Ce=N[3];S||(u?ae.error?.(s,"No tables found for",u):ae.error?.(s,"Database name never received"));let de=S[Ce];de=C({table:Ce,database:u,attributes:U.attributes,schemaDefined:U.schemaDefined},de),nc[Q]={name:Ce,decoder:new et.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:U.typedStructs,structures:U.structures}),getEntry(Y){return de.primaryStore.getEntry(Y)},rootStore:de.primaryStore.rootStore};break;case Nk:sc=d?YH(U,d):new Map,zT=N[2],ae.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${zT}`);break;case wk:let ye=Q;qd[ye]=U;break;case Pk:nn()[qk]=U,ae.trace?.(s,"received and broadcasting committed update",U),nn().buffer.notify();break;case Ck:T=U,p.send({type:"end_txn",localTime:T,remoteNodeIds:R});break;case tg:{let Y=N[1],{fileId:V,size:ue,finished:_e,error:me}=Y,Te=pe.get(V);ae.debug?.("Received blob",V,"has stream",!!Te,"connectedToBlob",!!Te?.connectedToBlob,"length",N[2].length,"finished",_e),Te||(Te=new IO.PassThrough,Te.expectedSize=ue,pe.set(V,Te)),Te.lastChunk=Date.now();let Pe=N[2];Lt(Pe.byteLength,"bytes-received",`${E}.${u}`,"replication","blob");try{_e?(me?(Te.on("error",()=>{}),Te.destroy(new Error("Blob error: "+me+" for record "+(Te.recordId??"unknown")+" from "+E))):Te.end(Pe),Te.connectedToBlob&&pe.delete(V)):Te.write(Pe)}catch(Ve){ae.error?.(`Error receiving blob for ${Te.recordId} from ${E} and streaming to storage`,Ve),pe.delete(V)}break}case Ik:{let Y=U,V;try{let ue=N[3],_e=WT[Q]||(WT[Q]=S[N[4]]);if(!_e)return ae.warn?.("Unknown table id trying to handle record request",Q);let me=_e.primaryStore.getBinaryFast(Symbol.for("structures")),Te=me?.length;if(Te>0&&Te!==De){De=Te;let Ve=(0,et.decode)(me);e.send((0,et.encode)([NO,{typedStructs:Ve.typed,structures:Ve.named},Q,_e.tableName]))}let Pe=_e.primaryStore.getBinaryFast(ue);if(Pe){let Ve=_e.primaryStore.decoder.decode(Pe,{valueAsBuffer:!0}),We=Ve.value;Ve[bc]&pn&&(We=Buffer.from(We),Nf(()=>_e.primaryStore.decoder.decode(Pe),Dn=>ic(Dn,ue),_e.primaryStore.rootStore)),V=(0,et.encode)([ZE,Y,{value:We,expiresAt:Ve.expiresAt,version:Ve.version,residencyId:Ve.residencyId,nodeId:Ve.nodeId,user:Ve.user}])}else V=(0,et.encode)([ZE,Y])}catch(ue){V=(0,et.encode)([ZE,Y,{error:ue.message}])}e.send(V);break}case ZE:{let{resolve:Y,reject:V,tableId:ue,key:_e}=g.get(N[1]),me=N[2];if(me?.error)V(new Error(me.error));else if(me){let Te;fm(()=>{let Pe=nc[ue].decoder.decode(me.value);me.value=Pe,me.key=_e,Y(me)||Te&&setTimeout(()=>Te.forEach(lm),6e4).unref()},Pe=>{let Ve=Kd(Pe,_e);return Te||(Te=[]),Te.push(Ve),Ve})}else Y();g.delete(N[1]);break}case bk:{Pn=U;let Y,V,ue=!1;if(p){if(u!==p.databaseName&&!p.then){ae.error?.("Subscription request for wrong database",u,p.databaseName);return}}else p=f.get(u);if(ae.debug?.(s,"received subscription request for",u,"at",Pn),!p){let we;p=new Promise(kt=>{ae.debug?.("Waiting for subscription to database "+u),we=kt}),p.ready=we,ba.set(u,p)}if(r.name)V=sr().subscribe(r.name),V.then(async we=>{Y=we;for await(let kt of Y){let Ot=kt.value;if(!(Ot?.replicates===!0||Ot?.replicates?.receives||Ot?.subscriptions?.some(Rr=>(Rr.database||Rr.schema)===u&&Rr.publish!==!1))){ue=!0,e.send((0,et.encode)([Bu])),sn(1008,`Unauthorized database subscription to ${u}`);return}}},we=>{ae.error?.(s,"Error subscribing to HDB nodes",we)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,et.encode)([Bu])),sn(1008,`Unauthorized database subscription to ${u}`);return}if(Ir&&(ae.debug?.(s,"stopping previous subscription",u),Ir.emit("close")),Pn.length===0)return;let _e=Pn[0],me=a(we=>{if(we&&(_e.replicateByDefault?!_e.tables.includes(we.tableName):_e.tables.includes(we.tableName)))return{table:we}},"tableToTableEntry"),Te={txnTime:0},Pe,Ve,We=1/0,Dn,os=a((we,kt)=>{if(we.type==="end_txn"){Te.txnTime&&(o[i]!==66&&ae.error?.("Invalid encoding of message"),K(9),K(ig),y(Dn=kt),Ap()),i=c,Te.txnTime=0;return}let Ot=we.nodeId,Rr=we.tableId,At=Ve[Rr];if(!At&&(At=Ve[Rr]=me(p.tableById[Rr]),!At))return ae.debug?.("Not subscribed to table",Rr);let as=At.table,Nt=as.primaryStore,vs=Nt.encoder;(we.extendedType&Am||!vs.typedStructs)&&(vs._mergeStructures(vs.getStructures()),vs.typedStructs&&(vs.lastTypedStructuresLength=vs.typedStructs.length));let Fl=Pe[Ot];if(!(Fl&&Fl.startTime<kt&&(!Fl.endTime||Fl.endTime>kt)))return ng&&ae.trace?.(s,"skipping replication update",we.recordId,"to:",E,"from:",Ot,"subscribed:",Pe),iP();ng&&ae.trace?.(s,"sending replication update",we.recordId,"to:",E,"from:",Ot,"subscribed:",Pe);let QT=we.version;Te.txnTime!==QT&&(Te.txnTime&&(ng&&ae.trace?.(s,"new txn time, sending queued txn",Te.txnTime),o[i]!==66&&ae.error?.("Invalid encoding of message"),Ap()),Te.txnTime=QT,i=c,y(QT));let cc=we.residencyId,JT=Yd(cc,as),Rp;if(JT&&!JT.includes(E)){let Us=Yd(we.previousResidencyId,as);if(Us&&!Us.includes(E)&&(we.type==="put"||we.type==="patch")||as.getResidencyById)return iP();let zd=we.recordId;ae.trace?.(s,"sending invalidation",zd,E,"from",Ot);let jd=0;cc&&(jd|=wc),we.previousResidencyId&&(jd|=Ic);let eA,yp=null;for(let oP in as.indices){if(!yp){if(eA=we.getValue(Nt,!0),!eA)break;yp={}}yp[oP]=eA[oP]}Rp=Oc(we.version,Rr,zd,null,Ot,we.user,we.type==="put"||we.type==="patch"?"invalidate":we.type,vs.encode(yp),jd,cc,we.previousResidencyId,we.expiresAt)}function iP(){return ae.trace?.(s,"skipping audit record",we.recordId),j||(j=setTimeout(()=>{j=null,(Dn||0)+Lk/2<We&&(ng&&ae.trace?.(s,"sending skipped sequence update",We),e.send((0,et.encode)([Ck,We])))},Lk).unref()),new Promise(setImmediate)}a(iP,"skipAuditRecord");let XT=vs.typedStructs,ZT=vs.structures;if((XT?.length!=At.typed_length||ZT?.length!=At.structure_length)&&(At.typed_length=XT?.length,At.structure_length=ZT.length,ae.debug?.(s,"send table struct",At.typed_length,At.structure_length),At.sentName||(At.sentName=!0),e.send((0,et.encode)([NO,{typedStructs:XT,structures:ZT,attributes:as.attributes,schemaDefined:as.schemaDefined},Rr,At.table.tableName]))),cc&&!Gd[cc]&&(e.send((0,et.encode)([wk,JT,cc])),Gd[cc]=!0),Rp)K(Rp.length),m(Rp);else{let Us=we.encoded;we.extendedType&pn&&Nf(()=>we.getValue(Nt),jd=>ic(jd,we.recordId),Nt.rootStore);let zd=Us[0]===66?8:0;K(Us.length-zd),m(Us,zd),ae.trace?.("wrote record",we.recordId,"length:",Us.length)}return e._socket.writableNeedDrain?new Promise(Us=>{ae.debug?.(`Waiting for remote node ${E} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Us)}):Bt>Sp?new Promise(Us=>{dt=Us}):new Promise(setImmediate)},"sendAuditRecord"),Ap=a(()=>{c-i>8?(e.send(o.subarray(i,c)),ae.debug?.(s,"Sent message, size:",c-i),Lt(c-i,"bytes-sent",`${E}.${u}`,"replication","egress")):ae.debug?.(s,"skipping empty transaction")},"sendQueuedData");Ir=new MO.EventEmitter,Ir.once("close",()=>{ue=!0,Y?.end()});for(let{startTime:we}of Pn)we<We&&(We=we);(V||Promise.resolve()).then(async()=>{p=await p,d=p.auditStore,Ve=p.tableById.map(me),Pe=[];for(let{name:kt,startTime:Ot,endTime:Rr}of Pn){let At=KE(kt,d);ae.debug?.("subscription to",kt,"using local id",At,"starting",Ot),Pe[At]={startTime:Ot,endTime:Rr}}Wd(u),wr||(wr=il(kt=>{kt.databaseName===u&&Wd(u)}),Fd=W_(kt=>{kt===u&&(e.send((0,et.encode)([Bu])),sn())}),e.on("close",()=>{wr?.remove(),Fd?.remove()})),e.send((0,et.encode)([Nk,B_(p.auditStore),Pn.map(({name:kt})=>kt)]));let we=!0;do{isFinite(We)||(ae.warn?.("Invalid sequence id "+We),sn(1008,"Invalid sequence id"+We));let kt;if(we&&!ue&&(we=!1,We===0)){let Ot=We,Rr=ag(d);for(let At in S){if(!me(At))continue;let as=S[At];ae.warn?.(`Fully copying ${At} table to ${E}`);for(let Nt of as.primaryStore.getRange({snapshot:!1,versions:!0})){if(ue)return;if(Nt.localTime>=We){ae.trace?.(s,"Copying record from",u,At,Nt.key,Nt.localTime),Ot=Math.max(Nt.localTime,Ot),kt=!0,nn()[K_]=1;let vs=Oc(Nt.version,as.tableId,Nt.key,null,Rr,null,"put",Nf(()=>as.primaryStore.encoder.encode(Nt.value),Fl=>ic(Fl,Nt.key)),Nt.metadataFlags&-256,Nt.residencyId,null,Nt.expiresAt);await os({recordId:Nt.key,tableId:as.tableId,type:"put",getValue(){return Nt.value},encoded:vs,version:Nt.version,residencyId:Nt.residencyId,nodeId:Rr,extendedType:Nt.metadataFlags},Nt.localTime)}}}kt&&os({type:"end_txn"},We),nn()[K_]=0,We=Ot}for(let{key:Ot,value:Rr}of d.getRange({start:We||1,exclusiveStart:!0,snapshot:!1})){if(ue)return;let At=Pt(Rr);ae.debug?.("sending audit record",new Date(Ot)),nn()[K_]=Ot,We=Ot,await os(At,Ot),Ir.startTime=Ot,kt=!0}kt&&os({type:"end_txn"},We),nn()[K_]=0,await Yk(d)}while(!ue)}).catch(we=>{ae.error?.(s,"Error handling subscription to node",we),sn(1008,"Error handling subscription to node")});break}}return}w.position=8;let b=!0,I,x;do{nn();let N=w.readInt();if(N===9&&w.getUint8(w.position)==ig){w.position++,T=x=w.readFloat64(),h[PO]=T,h[DO]=Date.now(),h[LO]=$k,ae.trace?.("received remote sequence update",T,u);break}let H=w.position,U=Pt(A,H,H+N),Q=nc[U.tableId];Q||ae.error?.(`No table found with an id of ${U.tableId}`);let J;U.residencyId&&(J=qd[U.residencyId],ae.trace?.(s,"received residency list",J,U.type,U.recordId));try{let k=U.recordId;fm(()=>{I={table:Q.name,id:k,type:U.type,nodeId:sc.get(U.nodeId),residencyList:J,timestamp:U.version,value:U.getValue(Q),user:U.user,beginTxn:b,expiresAt:U.expiresAt}},Ce=>Kd(Ce,k))}catch(k){throw k.message+="typed structures for current decoder"+JSON.stringify(Q.decoder.typedStructs),k}b=!1,ae.trace?.(s,"received replication message",U.type,"id",I.id,"version",new Date(U.version),"nodeId",I.nodeId),h[PO]=U.version,h[DO]=Date.now(),h[LO]=Vk,p.send(I),w.position=H+N}while(w.position<A.byteLength);$d++,Lt(A.byteLength,"bytes-received",`${E}.${u}.${I?.table||"unknown_table"}`,"replication","ingest"),$d>jT&&!Vd&&(Vd=!0,e.pause(),ae.debug?.(`Commit backlog causing replication back-pressure, requesting that ${E} pause replication`)),p.send({type:"end_txn",localTime:T,remoteNodeIds:R,async onCommit(){if(I){let N=Date.now()-I.timestamp;Lt(N,"replication-latency",E+"."+u+"."+I.table,I.type,"ingest")}$d--,Vd&&(Vd=!1,e.resume(),ae.debug?.(`Replication resuming ${E}`)),Ae.length>0&&await Promise.all(Ae),ae.trace?.("All blobs finished"),!O&&x&&(ae.trace?.(s,"queuing confirmation of a commit at",x),setTimeout(()=>{e.send((0,et.encode)([Pk,O])),ae.trace?.(s,"sent confirmation of a commit at",O),O=null},lse)),O=x,ae.debug?.("last sequence committed",new Date(x),u)}})}catch(w){ae.error?.(s,"Error handling incoming replication message",w)}}),e.on("ping",Cn),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-q,t.isSubscriptionConnection&&el({name:E,database:u,url:t.url,latency:t.connection.latency})),q=null}),e.on("close",(A,w)=>{clearInterval(v),clearTimeout(F),clearInterval(te),Ir&&Ir.emit("close"),Wi&&Wi.end();for(let[b,{reject:I}]of g)I(new Error(`Connection closed ${w?.toString()} ${A}`));ae.debug?.(s,"closed",A,w?.toString())});function sn(A,w){e.isFinished=!0,e.close(A,w),t.connection?.emit("finished")}a(sn,"close");let Cr=new Set;async function ic(A,w){let b=um(A);if(Cr.has(b)){ae.debug?.("Blob already being sent",b);return}Cr.add(b);try{let I;Bt++;for await(let x of A.stream())I&&(ae.debug?.("Sending blob chunk",b,"length",I.length),e.send((0,et.encode)([tg,{fileId:b,size:A.size},I]))),I=x,e._socket.writableNeedDrain&&(ae.debug?.("draining",b),await new Promise(N=>e._socket.once("drain",N)),ae.debug?.("drained",b)),Lt(x.length,"bytes-sent",`${E}.${u}`,"replication","blob");ae.debug?.("Sending final blob chunk",b,"length",I.length),e.send((0,et.encode)([tg,{fileId:b,size:A.size,finished:!0},I]))}catch(I){ae.warn?.("Error sending blob",I,"blob id",b,"for record",w),e.send((0,et.encode)([tg,{fileId:b,finished:!0,error:I.toString()},Buffer.alloc(0)]))}finally{Cr.delete(b),Bt--,Bt<Sp&&dt?.()}}a(ic,"sendBlobs");function Kd(A,w){let b=um(A),I=pe.get(b);ae.debug?.("Received transaction for record",w,"with blob",b,"has stream",!!I,"ended",!!I?.writableEnded),I?I.writableEnded&&pe.delete(b):(I=new IO.PassThrough,pe.set(b,I)),I.connectedToBlob=!0,I.lastChunk=Date.now(),I.recordId=w,A.size===void 0&&I.expectedSize&&(A.size=I.expectedSize);let x=I.blob??createBlob(I,A);I.blob=x;let N=x.save({primaryStore:p.auditStore});return N&&(N.blobId=b,Ae.push(N),N.finally(()=>{ae.debug?.(`Finished receiving blob stream ${b}`),Ae.splice(Ae.indexOf(N),1)})),x}a(Kd,"receiveBlobs");function Yo(){if(_||(_=!0,t.connection?.on("subscriptions-updated",Yo)),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let A=new Map;d||(d=p?.auditStore);try{for(let I of p?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let x of I.value.nodes||[])x.lastTxnTime>(A.get(x.id)??0)&&A.set(x.id,x.lastTxnTime)}catch(I){if(!I.message.includes("Can not re"))throw I}let w=t.connection?.nodeSubscriptions?.[0];R=[];let b=t.connection?.nodeSubscriptions?.map((I,x)=>{let N=[],{replicateByDefault:H}=I;if(I.subscriptions){for(let k of I.subscriptions)if(k.subscribe&&(k.schema||k.database)===u){let Ce=k.table;S?.[Ce]?.replicate!==!1&&N.push(Ce)}H=!1}else for(let k in S)(H?S[k].replicate===!1:S[k].replicate)&&N.push(k);let U=d&&KE(I.name,d),Q=p?.dbisDB?.get([Symbol.for("seq"),U])??1,J=Math.max(Q?.seqId??1,(typeof I.start_time=="string"?new Date(I.start_time).getTime():I.start_time)??1);if(ae.debug?.("Starting time recorded in db",I.name,U,u,Q?.seqId,"start time:",J,new Date(J)),w!==I){let k=d&&KE(w.name,d),Ce=p?.dbisDB?.get([Symbol.for("seq"),k])??1;for(let de of Ce?.nodes||[])de.name===I.name&&(J=de.seqId,ae.debug?.("Using sequence id from proxy node",w.name,J))}if(U===void 0?ae.warn("Starting subscription request from node",I,"but no node id found"):R.push(U),A.get(U)>J&&(J=A.get(U),ae.debug?.("Updating start time from more recent txn recorded",w.name,J)),J===1&&rg)try{new URL(rg).hostname===I.name&&E===I.name?(ae.warn?.(`Requesting full copy of database ${u} from ${rg}`),J=0):J=Date.now()-6e4}catch(k){ae.error?.("Error parsing leader URL",rg,k)}return ae.trace?.(s,"defining subscription request",I.name,u,new Date(J)),{name:I.name,replicateByDefault:H,tables:N,startTime:J,endTime:I.end_time}});if(b)if(ae.debug?.(s,"sending subscription request",b,p?.dbisDB?.path),clearTimeout(z),b.length>0)e.send((0,et.encode)([bk,b]));else{let I=a(()=>{let x=performance.now();z=setTimeout(()=>{ne<=x?sn(1008,"Connection has no subscriptions and is no longer used"):I()},se).unref()},"schedule_close");I()}}a(Yo,"sendSubscriptionRequestUpdate");function Yd(A,w){if(!A)return;let b=Ht[A];return b||(b=w.getResidencyRecord(A),Ht[A]=b),b}a(Yd,"getResidence");function Wo(A){return!(ya&&ya!="*"&&!ya[A]&&!ya.includes?.(A)&&!ya.some?.(w=>w.name===A))}a(Wo,"checkDatabaseAccess");function zo(A){if(p=p||f.get(A),!Wo(A))throw new Error(`Access to database "${A}" is not permitted`);p||ae.warn?.(`No database named "${A}" was declared and registered`),d=p?.auditStore,S||(S=Ze()?.[A]);let w=tt();if(w===E)throw w?new Error("Should not connect to self",w):new Error("Node name not defined");return Tp(w,A),!0}a(zo,"setDatabase");function Tp(A,w){let b=Ze()?.[w],I=[];for(let x in b){let N=b[x];I.push({table:x,schemaDefined:N.schemaDefined,attributes:N.attributes.map(H=>({name:H.name,type:H.type,isPrimaryKey:H.isPrimaryKey}))})}ae.trace?.("Sending database info for node",A,"database name",w),e.send((0,et.encode)([Ok,A,w,I]))}a(Tp,"sendNodeDBName");function Wd(A){let w=Ze()?.[A],b=[];for(let I in w){if(Pn&&!Pn.some(N=>N.replicateByDefault?!N.tables.includes(I):N.tables.includes(I)))continue;let x=w[I];b.push({table:I,schemaDefined:x.schemaDefined,attributes:x.attributes.map(N=>({name:N.name,type:N.type,isPrimaryKey:N.isPrimaryKey}))})}e.send((0,et.encode)([Dk,b,A]))}a(Wd,"sendDBSchema"),te=setInterval(()=>{for(let[A,w]of pe)w.lastChunk+Re<Date.now()&&(ae.warn?.(`Timeout waiting for blob stream to finish ${A} for record ${w.recordId??"unknown"} from ${E}`),pe.delete(A),w.end())},Re).unref();let oc=1,ac=[];return{end(){Wi&&Wi.end(),Ir&&Ir.emit("close")},getRecord(A){let w=oc++;return new Promise((b,I)=>{let x=[Ik,w,A.table.tableId,A.id];ac[A.table.tableId]||(x.push(A.table.tableName),ac[A.table.tableId]=!0),e.send((0,et.encode)(x)),ne=performance.now(),g.set(w,{tableId:A.table.tableId,key:A.id,resolve(N){let{table:H,entry:U}=A;if(b(N),N)return H._recordRelocate(U,N)},reject:I})})},sendOperation(A){let w=oc++;return A.requestId=w,e.send((0,et.encode)([CO,A])),new Promise((b,I)=>{g.set(w,{resolve:b,reject:I})})}};function K(A){L(5),A<128?o[c++]=A:A<16384?(l.setUint16(c,A|32768),c+=2):A<1056964608?(l.setUint32(c,A|3221225472),c+=4):(o[c]=255,l.setUint32(c+1,A),c+=5)}function m(A,w=0,b=A.length){let I=b-w;L(I),A.copy(o,c,w,b),c+=I}function y(A){L(8),l.setFloat64(c,A),c+=8}function L(A){if(A+16>o.length-c){let w=Buffer.allocUnsafeSlow(c+A-i+65536>>10<<11);o.copy(w,0,i,c),c=c-i,i=0,o=w,l=new DataView(o.buffer,0,o.length)}}function C(A,w){let b=A.database??"data";if(b!=="data"&&!Ye[b]){ae.warn?.("Database not found",A.database);return}w||(w={});let I=w.schemaDefined,x=!1,N=A.schemaDefined,H=w.attributes||[];for(let U=0;U<A.attributes?.length;U++){let Q=A.attributes[U],J=H.find(k=>k.name===Q.name);(!J||J.type!==Q.type)&&(I?ae.error?.(`Schema for '${u}.${A.table}' is defined locally, but attribute '${Q.name}: ${Q.type}' from '${E}' does not match local attribute ${J?"'"+J.name+": "+J.type+"'":"which does not exist"}`):(x=!0,N||(Q.indexed=!0),J?H[H.indexOf(J)]=Q:H.push(Q)))}return x?(ae.debug?.("(Re)creating",A),_t({table:A.table,database:A.database,schemaDefined:A.schemaDefined,attributes:H,...w})):w}}var Uk,et,xk,Bk,ae,MO,Hk,kk,nl,Fk,IO,Gk,bk,Ok,Nk,Bu,wk,NO,Ik,ZE,CO,eg,Ck,Pk,Dk,tg,qk,PO,DO,K_,LO,$k,Vk,cse,rg,vO,ba,ng,Lk,lse,Mk,wO,sg,vk,Hu,UO=be(()=>{Ue();so();lO();xO();ms();Uk=M(ce());G();nu();et=require("msgpackr"),xk=require("ws"),Bk=require("worker_threads"),ae=M(mi());q_();MO=require("events"),Hk=M(Zs()),kk=M(require("node:tls"));Zc();nl=M(require("node:process")),Fk=require("node:net");Ci();_s();IO=require("node:stream"),Gk=M(require("minimist")),bk=129,Ok=140,Nk=141,Bu=142,wk=130,NO=132,Ik=133,ZE=134,CO=136,eg=137,Ck=143,Pk=144,Dk=145,tg=146,qk=0,PO=1,DO=2,K_=3,LO=4,$k=0,Vk=1,cse=(0,Gk.default)(nl.argv),rg=cse.HDB_LEADER_URL??nl.env.HDB_LEADER_URL,vO=new Map,ba=new Map,ng=!0,Lk=300,lse=2,Mk=3e4;a(og,"createWebSocket");vk=500,Hu=class extends MO.EventEmitter{constructor(r,n,s,i,o){super();this.url=r;this.subscription=n;this.databaseName=s;this.nodeName=i;this.authorization=o;this.nodeName=this.nodeName??Qs(r)}static{a(this,"NodeReplicationConnection")}socket;startTime;retryTime=vk;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await og(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;ae.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${nl.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=vk,this.nodeSubscriptions&&el({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,n=Y_(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(n)}),this.socket.on("error",s=>{s.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}`),s.isHandled=!0):s.code!=="ECONNREFUSED"&&(s.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 ${s.message}`)),this.sessionReject(s)}),this.socket.on("close",(s,i)=>{if(this.isConnected&&(this.nodeSubscriptions&&vu({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,n?.end(),this.emit("finished");return}if(++this.retries%20===1){let o=i?.toString();ae.warn?.(`${n?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${o?'"'+o+'" ':""}(code: ${s})`)}n=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((r,n)=>{this.sessionResolve=r,this.sessionReject=n})}subscribe(r,n){this.nodeSubscriptions=r,this.replicateTablesByDefault=n,this.emit("subscriptions-updated",r)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(r){return this.session.then(n=>n.getRecord(r))}};a(Y_,"replicateOverWS")});var Ra={};Be(Ra,{clearThisNodeName:()=>gse,disableReplication:()=>_se,enabled_databases:()=>ya,forEachReplicatedDatabase:()=>ma,getThisNodeId:()=>ag,getThisNodeName:()=>tt,getThisNodeUrl:()=>Ea,hostnameToUrl:()=>fg,lastTimeInAuditStore:()=>H_,monitorNodeCAs:()=>eF,replicateOperation:()=>Tse,replication_certificate_authorities:()=>So,sendOperationToNode:()=>z_,servers:()=>dse,setReplicator:()=>rF,start:()=>fse,startOnMainThread:()=>_O,subscribeToNode:()=>G_,unsubscribeFromNode:()=>jE,urlToNodeName:()=>Qs});function fse(e){if(e.port||(e.port=gs.default.get(B.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=gs.default.get(B.OPERATIONSAPI_NETWORK_SECUREPORT)),!tt())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of F_(e))t.set(Qs(s.url),s);hse(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=Ke.ws(async(s,i,o,c)=>{if(i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,o);await o,s._socket.unref(),Y_(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&or.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Ke.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){!s.authorized&&s._nodeRequest.socket.authorizationError&&or.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 o=sr().primaryStore;if(s.authorized&&s.peerCertificate.subject){let c=s.peerCertificate.subject,l=c&&(o.get(c.CN)||t.get(c.CN));if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){or.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else or.warn(`No node found for certificate common name ${c.CN}, available nodes are ${Array.from(o.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=o.get(s.ip)||t.get(s.ip);c?s.user=c:or.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...o.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=a(()=>{let o=new Set(s.secureContexts.values());s.defaultContext&&o.add(s.defaultContext);for(let c of o)try{let l=Array.from(So);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=dg.createSecureContext(u)}catch(l){or.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),gs.default.get(B.REPLICATION_ENABLEROOTCAS)!==!1&&i()}eF(()=>{for(let s of n)s()})}function eF(e){let t=0;Lu(r=>{r?.ca&&(So.add(r.ca),So.size!==t&&(t=So.size,e?.()))})}function _se(e=!0){Zk=e}function hse(e){Zk||(Ze(),ya=e.databases,ma(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||ba;for(let[s,i]of lg){let o=i.get(r);o&&(o.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];rF(r,s,e),vO.get(s)?.forEach(i=>i(s))}}))}function rF(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 tF extends qr{static{a(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||ba,o=i.get(e),c=o?.tableById||[];c[t.tableId]=t;let l=o?.ready;if(or.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new Un,i.set(e,o),o.tableById=c,o.auditStore=t.auditStore,o.dbisDB=t.dbisDB,o.databaseName=e,l&&l(o),o;this.subscription=o}static subscribeOnThisThread(i,o){return!0}static async load(i){if(i){let o=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),o]);if(c){let l,u=new Set;do{let f;for(let h of c){if(h===Ke.hostname)continue;let _=mse(h,tF.subscription,e);_?.isConnected&&!u.has(_)&&(!f||_.latency<f.latency)&&(f=_)}if(!f)throw l||new Jk.ServerError("No connection to any other nodes are available",502);let d={requestId:use++,table:t,entry:i,id:i.key};u.add(f);try{return await f.getRecord(d)}catch(h){if(f.isConnected)throw h;or.warn("Error in load from node",ug,h),l||(l=h)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function pse(e,t,r,n,s){let i=lg.get(e);i||(i=new Map,lg.set(e,i));let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new Hu(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function mse(e,t,r){let n=Wk.get(e);n||(n=new Map,Wk.set(e,n));let s=n.get(r);if(s)return s;let i=sr().primaryStore.get(e);return i?.url&&(s=new Hu(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function z_(e,t,r){r||(r={}),r.serverName=e.name;let n=await og(e.url,r),s=Y_(n,{},{});return new Promise((i,o)=>{n.on("open",()=>{i(s.sendOperation(t))}),n.on("error",c=>{o(c)}),n.on("close",c=>{or.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function G_(e){try{Xk.isMainThread&&or.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=ba.get(e.database);if(!t){let n;t=new Promise(s=>{or.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,ba.set(e.database,t)}let r=pse(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=>k_(n,e.database)),e.replicateByDefault)}catch(t){or.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function jE({name:e,url:t,database:r}){or.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(sr().primaryStore.getRange({})));let n=lg.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Ese(){if(BO!==void 0)return BO;let e=gs.default.get(B.OPERATIONSAPI_TLS_CERTIFICATE)||gs.default.get(B.TLS_CERTIFICATE);if(e)return BO=new jk.X509Certificate((0,Qk.readFileSync)(e)).subject.match(/CN=(.*)/)?.[1]??null}function tt(){return ug||(ug=gs.default.get("replication_hostname")??Qs(gs.default.get("replication_url"))??Ese()??zk("operationsapi_network_secureport")??zk("operationsapi_network_port")??"127.0.0.1")}function gse(){ug=void 0}function zk(e){let t=gs.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function cg(e){let t=gs.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function ag(e){return B_(e)?.[tt()]}function Ea(){let e=gs.default.get("replication_url");return e||fg(tt())}function fg(e){let t=cg("replication_port");if(t)return`ws://${e}:${t}`;if(t=cg("replication_secureport"),t)return`wss://${e}:${t}`;if(t=cg("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=cg("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function Qs(e){if(e)return new URL(e).hostname}function ma(e,t){for(let n of Object.getOwnPropertyNames(Ye))r(n);return W_(n=>{r(n)}),il((n,s)=>{r(n.databaseName)});function r(n){let s=Ye[n];or.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):Sse(n)&&t(s,n,!1)}a(r,"forDatabase")}function Sse(e){let t=Ye[e];for(let r in t)if(t[r].replicate)return!0}function H_(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function Tse(e){let t={message:""};if(e.replicated){e.replicated=!1,or.trace?.("Replicating operation",e.operation,"to nodes",Ke.nodes.map(n=>n.name));let r=await Promise.allSettled(Ke.nodes.map(n=>z_(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Ke.nodes[s]?.name,i})}return t}var gs,or,jk,Qk,dg,Jk,Xk,Zk,use,dse,So,ya,lg,Wk,BO,ug,ms=be(()=>{Ue();sa();Yl();UO();Dr();gs=M(ce()),or=M(X()),jk=require("crypto"),Qk=require("fs");q_();Zc();G();lO();dg=M(require("node:tls")),Jk=M(he()),Xk=require("worker_threads"),use=1,dse=[],So=gs.default.get(B.REPLICATION_ENABLEROOTCAS)!==!1?new Set(dg.rootCertificates):new Set;a(fse,"start");a(eF,"monitorNodeCAs");a(_se,"disableReplication");a(hse,"assignReplicationSource");a(rF,"setReplicator");lg=new Map;a(pse,"getSubscriptionConnection");Wk=new Map;a(mse,"getRetrievalConnectionByName");a(z_,"sendOperationToNode");a(G_,"subscribeToNode");a(jE,"unsubscribeFromNode");a(Ese,"getCommonNameFromCert");a(tt,"getThisNodeName");a(gse,"clearThisNodeName");Object.defineProperty(Ke,"hostname",{get(){return tt()}});a(zk,"getHostFromListeningPort");a(cg,"getPortFromListeningPort");a(ag,"getThisNodeId");Ke.replication={getThisNodeId:ag,exportIdMapping:B_};a(Ea,"getThisNodeUrl");a(fg,"hostnameToUrl");a(Qs,"urlToNodeName");a(ma,"forEachReplicatedDatabase");a(Sse,"hasExplicitlyReplicatedTable");a(H_,"lastTimeInAuditStore");a(Tse,"replicateOperation")});var Eg=P((bIe,aF)=>{"use strict";var ku=pH(),{validateBySchema:j_}=st(),{common_validators:Fu,schema_regex:HO}=Ri(),ar=require("joi"),Ase=X(),Rse=require("uuid").v4,pg=_o(),Gu=(G(),D($)),yse=require("util"),Oa=Gn(),{handleHDBError:To,hdb_errors:bse,ClientError:Q_}=he(),{HDB_ERROR_MSGS:_g,HTTP_STATUS_CODES:Ao}=bse,{SchemaEventMsg:mg}=Ks(),nF=Er(),{getDatabases:Ose}=(Ue(),D(ct)),{transformReq:qu}=oe(),{replicateOperation:sF}=(ms(),D(Ra)),hg=ar.string().min(1).max(Fu.schema_length.maximum).pattern(HO).messages({"string.pattern.base":"{:#label} "+Fu.schema_format.message}),Nse=ar.string().min(1).max(Fu.schema_length.maximum).pattern(HO).messages({"string.pattern.base":"{:#label} "+Fu.schema_format.message}).required(),wse=ar.string().min(1).max(Fu.schema_length.maximum).pattern(HO).messages({"string.pattern.base":"{:#label} "+Fu.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();aF.exports={createSchema:Ise,createSchemaStructure:iF,createTable:Cse,createTableStructure:oF,createAttribute:vse,dropSchema:Pse,dropTable:Dse,dropAttribute:Lse,getBackup:Use};async function Ise(e){let t=await iF(e);return pg.signalSchemaChange(new mg(process.pid,e.operation,e.schema)),t}a(Ise,"createSchema");async function iF(e){let t=j_(e,ar.object({database:hg,schema:hg}));if(t)throw new Q_(t.message);if(qu(e),!await ku.checkSchemaExists(e.schema))throw To(new Error,_g.SCHEMA_EXISTS_ERR(e.schema),Ao.BAD_REQUEST,Gu.LOG_LEVELS.ERROR,_g.SCHEMA_EXISTS_ERR(e.schema),!0);return await Oa.createSchema(e),`database '${e.schema}' successfully created`}a(iF,"createSchemaStructure");async function Cse(e){return qu(e),e.hash_attribute=e.primary_key??e.hash_attribute,await oF(e)}a(Cse,"createTable");async function oF(e){let t=j_(e,ar.object({database:hg,schema:hg,table:Nse,residence:ar.array().items(ar.string().min(1)).optional(),hash_attribute:wse}));if(t)throw new Q_(t.message);if(!await ku.checkSchemaTableExists(e.schema,e.table))throw To(new Error,_g.TABLE_EXISTS_ERR(e.schema,e.table),Ao.BAD_REQUEST,Gu.LOG_LEVELS.ERROR,_g.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Rse(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await Oa.createTable(n,e);else throw To(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Ao.BAD_REQUEST);else await Oa.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}a(oF,"createTableStructure");async function Pse(e){let t=j_(e,ar.object({database:ar.string(),schema:ar.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Q_(t.message);qu(e);let r=await ku.checkSchemaExists(e.schema);if(r)throw To(new Error,r,Ao.NOT_FOUND,Gu.LOG_LEVELS.ERROR,r,!0);let n=await ku.schema_describe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await Oa.dropSchema(e),pg.signalSchemaChange(new mg(process.pid,e.operation,e.schema)),await nF.purgeSchemaTableStreams(e.schema,s);let i=await sF(e);return i.message=`successfully deleted '${e.schema}'`,i}a(Pse,"dropSchema");async function Dse(e){let t=j_(e,ar.object({database:ar.string(),schema:ar.string(),table:ar.string().required()}));if(t)throw new Q_(t.message);qu(e);let r=await ku.checkSchemaTableExists(e.schema,e.table);if(r)throw To(new Error,r,Ao.NOT_FOUND,Gu.LOG_LEVELS.ERROR,r,!0);await Oa.dropTable(e),await nF.purgeTableStream(e.schema,e.table);let n=await sF(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(Dse,"dropTable");async function Lse(e){let t=j_(e,ar.object({database:ar.string(),schema:ar.string(),table:ar.string().required(),attribute:ar.string().required()}));if(t)throw new Q_(t.message);qu(e);let r=await ku.checkSchemaTableExists(e.schema,e.table);if(r)throw To(new Error,r,Ao.NOT_FOUND,Gu.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw To(new Error,"You cannot drop a hash attribute",Ao.BAD_REQUEST,void 0,void 0,!0);if(Gu.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw To(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Ao.BAD_REQUEST,void 0,void 0,!0);try{return await Oa.dropAttribute(e),Mse(e),pg.signalSchemaChange(new mg(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw Ase.error(`Got an error deleting attribute ${yse.inspect(e)}.`),n}}a(Lse,"dropAttribute");function Mse(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)}a(Mse,"dropAttributeFromGlobal");async function vse(e){qu(e);let t=Ose()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw To(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Ao.BAD_REQUEST,void 0,void 0,!0);return await Oa.createAttribute(e),pg.signalSchemaChange(new mg(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(vse,"createAttribute");function Use(e){return Oa.getBackup(e)}a(Use,"getBackup")});var lF=P((NIe,cF)=>{"use strict";var{OPERATIONS_ENUM:xse}=(G(),D($)),kO=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=xse.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};cF.exports=kO});var FO=P((CIe,hF)=>{"use strict";var Bse=Gn(),IIe=lF(),gg=oe(),Sg=(G(),D($)),Hse=ce(),{handleHDBError:uF,hdb_errors:kse}=he(),{HDB_ERROR_MSGS:dF,HTTP_STATUS_CODES:fF}=kse,Fse=Object.values(Sg.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),_F="To use this operation audit log must be enabled in harperdb-config.yaml";hF.exports=Gse;async function Gse(e){if(gg.isEmpty(e.schema))throw new Error(dF.SCHEMA_REQUIRED_ERR);if(gg.isEmpty(e.table))throw new Error(dF.TABLE_REQUIRED_ERR);if(!Hse.get(Sg.CONFIG_PARAMS.LOGGING_AUDITLOG))throw uF(new Error,_F,fF.BAD_REQUEST,Sg.LOG_LEVELS.ERROR,_F,!0);let t=gg.checkSchemaTableExist(e.schema,e.table);if(t)throw uF(new Error,t,fF.NOT_FOUND,Sg.LOG_LEVELS.ERROR,t,!0);if(!gg.isEmpty(e.search_type)&&Fse.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await Bse.readAuditLog(e)}a(Gse,"readAuditLog")});var mF=P((DIe,pF)=>{"use strict";var{OPERATIONS_ENUM:qse}=(G(),D($)),GO=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=qse.GET_BACKUP,this.schema=t,this.table=r}};pF.exports=GO});var SF=P((UIe,gF)=>{"use strict";var $se=Gn(),MIe=mF(),qO=oe(),Vse=(G(),D($)),vIe=ce(),{handleHDBError:Kse,hdb_errors:Yse}=he(),{HDB_ERROR_MSGS:EF,HTTP_STATUS_CODES:Wse}=Yse;gF.exports=zse;async function zse(e){if(qO.isEmpty(e.schema))throw new Error(EF.SCHEMA_REQUIRED_ERR);if(qO.isEmpty(e.table))throw new Error(EF.TABLE_REQUIRED_ERR);let t=qO.checkSchemaTableExist(e.schema,e.table);if(t)throw Kse(new Error,t,Wse.NOT_FOUND,Vse.LOG_LEVELS.ERROR,t,!0);return await $se.getBackup(read_audit_log_object)}a(zse,"getBackup")});var yF=P((BIe,RF)=>{"use strict";var jse=ce(),Na=require("joi"),Qse=st(),TF=require("moment"),Jse=require("fs-extra"),$O=require("path"),Xse=require("lodash"),J_=(G(),D($)),{LOG_LEVELS:ol}=(G(),D($)),Zse="YYYY-MM-DD hh:mm:ss",eie=$O.resolve(__dirname,"../logs");RF.exports=function(e){return Qse.validateBySchema(e,tie)};var tie=Na.object({from:Na.custom(AF),until:Na.custom(AF),level:Na.valid(ol.NOTIFY,ol.FATAL,ol.ERROR,ol.WARN,ol.INFO,ol.DEBUG,ol.TRACE),order:Na.valid("asc","desc"),limit:Na.number().min(1),start:Na.number().min(0),log_name:Na.custom(rie)});function AF(e,t){if(TF(e,TF.ISO_8601).format(Zse)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(AF,"validateDatetime");function rie(e,t){if(Xse.invert(J_.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=jse.get(J_.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?J_.LOG_NAMES.HDB:e,i=s===J_.LOG_NAMES.INSTALL?$O.join(eie,J_.LOG_NAMES.INSTALL):$O.join(n,s);return Jse.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(rie,"validateReadLogPath")});var KO=P((kIe,OF)=>{"use strict";var Tg=(G(),D($)),nie=X(),sie=ce(),iie=yF(),VO=require("path"),bF=require("fs-extra"),{once:oie}=require("events"),{handleHDBError:aie,hdb_errors:cie}=he(),{PACKAGE_ROOT:lie}=Et(),uie=VO.join(lie,"logs"),die=1e3,fie=200;OF.exports=_ie;async function _ie(e){let t=iie(e);if(t)throw aie(t,t.message,cie.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=sie.get(Tg.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?Tg.LOG_NAMES.HDB:e.log_name,s=n===Tg.LOG_NAMES.INSTALL?VO.join(uie,Tg.LOG_NAMES.INSTALL):VO.join(r,n),i=e.level!==void 0,o=i?e.level:void 0,c=e.from!==void 0,l=c?new Date(e.from):void 0,u=e.until!==void 0,f=u?new Date(e.until):void 0,d=e.limit===void 0?die:e.limit,h=e.order===void 0?void 0:e.order,_=e.start===void 0?0:e.start,p=_+d,S=0;h==="desc"&&!l&&!f&&(S=Math.max(bF.statSync(s).size-(p+5)*fie,0));let g=bF.createReadStream(s,{start:S});g.on("error",F=>{nie.error(F)});let R=0,E=[],T="",O;g.on("data",F=>{let q=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;F=T+F;let j=0,te;for(;(te=q.exec(F))&&!g.destroyed;){O&&(O.message=F.slice(j,te.index),v(O));let[se,z,ne]=te,le=ne.split("] ["),ie=le[0],Re=le[1];le.splice(0,2),O={timestamp:z,thread:ie,level:Re,tags:le,message:""},j=te.index+se.length}T=F.slice(j)}),g.on("end",F=>{g.destroyed||O&&(O.message=T.trim(),v(O))}),g.resume();function v(F){let q,j,te;switch(!0){case(i&&c&&u):q=new Date(F.timestamp),j=new Date(l),te=new Date(f),F.level===o&&q>=j&&q<=te&&R<_?R++:F.level===o&&q>=j&&q<=te&&(wa(F,h,E),R++,R===p&&g.destroy());break;case(i&&c):q=new Date(F.timestamp),j=new Date(l),F.level===o&&q>=j&&R<_?R++:F.level===o&&q>=j&&(wa(F,h,E),R++,R===p&&g.destroy());break;case(i&&u):q=new Date(F.timestamp),te=new Date(f),F.level===o&&q<=te&&R<_?R++:F.level===o&&q<=te&&(wa(F,h,E),R++,R===p&&g.destroy());break;case(c&&u):q=new Date(F.timestamp),j=new Date(l),te=new Date(f),q>=j&&q<=te&&R<_?R++:q>=j&&q<=te&&(wa(F,h,E),R++,R===p&&g.destroy());break;case i:F.level===o&&R<_?R++:F.level===o&&(wa(F,h,E),R++,R===p&&g.destroy());break;case c:q=new Date(F.timestamp),j=new Date(l),q>=j&&R<_?R++:q>=j&&R>=_&&(wa(F,h,E),R++,R===p&&g.destroy());break;case u:q=new Date(F.timestamp),te=new Date(f),q<=te&&R<_?R++:q<=te&&R>=_&&(wa(F,h,E),R++,R===p&&g.destroy());break;default:R<_?R++:(wa(F,h,E),R++,R===p&&g.destroy())}}return a(v,"onLogMessage"),await oie(g,"close"),E}a(_ie,"readLog");function wa(e,t,r){t==="desc"?hie(e,r):t==="asc"?pie(e,r):r.push(e)}a(wa,"pushLineToResult");function hie(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)}a(hie,"insertDescending");function pie(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)}a(pie,"insertAscending")});var Ag=P((KIe,CF)=>{"use strict";var YO=require("joi"),{string:$u,boolean:NF,date:mie}=YO.types(),Eie=st(),{validateSchemaExists:GIe,validateTableExists:qIe,validateSchemaName:$Ie}=Ri(),gie=(G(),D($)),Sie=Dt(),wF=ce();wF.initSync();var VIe=$u.invalid(wF.get(gie.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Sie.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),IF={operation:$u.valid("add_node","update_node","set_node_replication"),node_name:$u.optional(),subscriptions:YO.array().items({table:$u.optional(),schema:$u.optional(),database:$u.optional(),subscribe:NF.required(),publish:NF.required().custom(Aie),start_time:mie.iso()})};function Tie(e){return Eie.validateBySchema(e,YO.object(IF))}a(Tie,"addUpdateNodeValidator");function Aie(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`)}a(Aie,"checkForFalsy");CF.exports={addUpdateNodeValidator:Tie,validation_schema:IF}});var Vu=P((WIe,PF)=>{"use strict";var WO=class{static{a(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},zO=class{static{a(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};PF.exports={Node:WO,NodeSubscription:zO}});var LF=P((jIe,DF)=>{"use strict";var Rie=(G(),D($)).OPERATIONS_ENUM,jO=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Rie.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};DF.exports=jO});var X_=P((JIe,MF)=>{"use strict";var QO=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},JO=class{static{a(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,o,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=o,c!==void 0&&(this.attributes=c)}};MF.exports={RemotePayloadObject:QO,RemotePayloadSubscription:JO}});var UF=P((ZIe,vF)=>{"use strict";var XO=class{static{a(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,o=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=o}};vF.exports=XO});var BF=P((iCe,xF)=>{"use strict";var yie=UF(),tCe=Ft(),rCe=ht(),bie=X(),{getSchemaPath:nCe,getTransactionAuditStorePath:sCe}=gt(),{getDatabases:Oie}=(Ue(),D(ct));xF.exports=Nie;async function Nie(e){let t=new yie;try{let r=Oie()[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){bie.warn(`unable to stat table dbi due to ${r}`)}return t}a(Nie,"lmdbGetTableSize")});var kF=P((aCe,HF)=>{"use strict";var ZO=class{static{a(this,"SystemInformationObject")}constructor(t,r,n,s,i,o,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=o,this.harperdb_processes=c}};HF.exports=ZO});var Yu=P((_Ce,$F)=>{"use strict";var wie=require("fs-extra"),Iie=require("path"),jr=require("systeminformation"),Ia=X(),FF=Er(),lCe=Dt(),Ku=(G(),D($)),Cie=BF(),Pie=uo(),{getThreadInfo:GF}=it(),Z_=ce();Z_.initSync();var Die=kF(),{openEnvironment:uCe}=ht(),{getSchemaPath:dCe}=gt(),{database:fCe,databases:eN}=(Ue(),D(ct)),Rg;$F.exports={getHDBProcessInfo:sN,getNetworkInfo:oN,getDiskInfo:iN,getMemoryInfo:nN,getCPUInfo:rN,getTimeInfo:tN,getSystemInformation:aN,systemInformation:Lie,getTableSize:cN,getMetrics:lN};function tN(){return jr.time()}a(tN,"getTimeInfo");async function rN(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:o,governor:c,socket:l,cache:u,...f}=await jr.cpu();f.cpu_speed=await jr.cpuCurrentSpeed();let{raw_currentload:d,raw_currentload_idle:h,raw_currentload_irq:_,raw_currentload_nice:p,raw_currentload_system:S,raw_currentload_user:g,cpus:R,...E}=await jr.currentLoad();return E.cpus=[],R.forEach(T=>{let{raw_load:O,raw_load_idle:v,raw_load_irq:F,raw_load_nice:q,raw_load_system:j,raw_load_user:te,...se}=T;E.cpus.push(se)}),f.current_load=E,f}catch(e){return Ia.error(`error in getCPUInfo: ${e}`),{}}}a(rN,"getCPUInfo");async function nN(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await jr.mem();return Object.assign(s,process.memoryUsage())}catch(e){return Ia.error(`error in getMemoryInfo: ${e}`),{}}}a(nN,"getMemoryInfo");async function sN(){let e={core:[],clustering:[]};try{let t=await jr.processes(),r;try{r=Number.parseInt(await wie.readFile(Iie.join(Z_.get(Ku.CONFIG_PARAMS.ROOTPATH),Ku.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===Ku.NODE_ERROR_CODES.ENOENT)Ia.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 Ia.error(`error in getHDBProcessInfo: ${t}`),e}}a(sN,"getHDBProcessInfo");async function iN(){let e={};try{if(!Z_.get(Ku.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await jr.disksIO();e.io=i;let{rx_sec:o,tx_sec:c,wx_sec:l,...u}=await jr.fsStats();return e.read_write=u,e.size=await jr.fsSize(),e}catch(t){return Ia.error(`error in getDiskInfo: ${t}`),e}}a(iN,"getDiskInfo");async function oN(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Z_.get(Ku.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await jr.networkInterfaceDefault(),e.latency=await jr.inetChecksite("google.com"),(await jr.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:o,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:f,carrier_changes:d,...h}=n;e.interfaces.push(h)}),(await jr.networkStats()).forEach(n=>{let{rx_sec:s,tx_sec:i,ms:o,...c}=n;e.stats.push(c)})),e}catch(t){return Ia.error(`error in getNetworkInfo: ${t}`),e}}a(oN,"getNetworkInfo");async function aN(){if(Rg!==void 0)return Rg;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:o,...c}=await jr.osInfo();e=c;let l=await jr.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,Rg=e,Rg}catch(t){return Ia.error(`error in getSystemInformation: ${t}`),e}}a(aN,"getSystemInformation");async function cN(){let e=[],t=await Pie.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await Cie(n));return e}a(cN,"getTableSize");async function lN(){let e={};for(let t in eN){let r=e[t]={},n=r.tables={};for(let s in eN[t])try{let i=eN[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,f,d]=l.trim().split(" ");return{pid:u,thread:f,txnid:d}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:h}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:h}}let o=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=o[l];n[s]=c}catch(i){Ia.notify(`Error getting stats for table ${s}: ${i}`)}}return e}a(lN,"getMetrics");async function qF(){if(Z_.get(Ku.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await FF.getNATSReferences(),t=await FF.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 o={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(o)}return r}}a(qF,"getNatsStreamInfo");async function Lie(e){let t=new Die;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await aN(),t.time=tN(),t.cpu=await rN(),t.memory=await nN(),t.disk=await iN(),t.network=await oN(),t.harperdb_processes=await sN(),t.table_size=await cN(),t.metrics=await lN(),t.threads=await GF(),t.replication=await qF(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await aN();break;case"time":t.time=tN();break;case"cpu":t.cpu=await rN();break;case"memory":t.memory=await nN();break;case"disk":t.disk=await iN();break;case"network":t.network=await oN();break;case"harperdb_processes":t.harperdb_processes=await sN();break;case"table_size":t.table_size=await cN();break;case"database_metrics":case"metrics":t.metrics=await lN();break;case"threads":t.threads=await GF();break;case"replication":t.replication=await qF();break;default:break}return t}a(Lie,"systemInformation")});var Ro=P((gCe,WF)=>{"use strict";var Mie=gn(),uN=oe(),vie=require("util"),al=(G(),D($)),VF=ce();VF.initSync();var Uie=qb(),KF=Vr(),{Node:pCe,NodeSubscription:mCe}=Vu(),xie=hu(),Bie=LF(),{RemotePayloadObject:Hie,RemotePayloadSubscription:kie}=X_(),{handleHDBError:Fie,hdb_errors:Gie}=he(),{HTTP_STATUS_CODES:qie,HDB_ERROR_MSGS:$ie}=Gie,Vie=Ys(),Kie=Yu(),{packageJson:Yie}=Et(),{getDatabases:Wie}=(Ue(),D(ct)),ECe=vie.promisify(Uie.authorize),zie=KF.searchByHash,jie=KF.searchByValue;WF.exports={isEmpty:Qie,getNodeRecord:Jie,upsertNodeRecord:Xie,buildNodePayloads:Zie,checkClusteringEnabled:eoe,getAllNodeRecords:toe,getSystemInfo:roe,reverseSubscription:YF};function Qie(e){return e==null}a(Qie,"isEmpty");async function Jie(e){let t=new xie(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return zie(t)}a(Jie,"getNodeRecord");async function Xie(e){let t=new Bie(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Mie.upsert(t)}a(Xie,"upsertNodeRecord");function YF(e){if(uN.isEmpty(e.subscribe)||uN.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}a(YF,"reverseSubscription");function Zie(e,t,r,n){let s=[];for(let i=0,o=e.length;i<o;i++){let c=e[i],{schema:l,table:u}=c,f=uN.getTableHashAttribute(l,u),{subscribe:d,publish:h}=YF(c),_=Wie()[l]?.[u],p=new kie(l,u,f,h,d,c.start_time,_.schemaDefined?_.attributes:void 0);s.push(p)}return new Hie(r,t,s,n)}a(Zie,"buildNodePayloads");function eoe(){if(!VF.get(al.CONFIG_PARAMS.CLUSTERING_ENABLED))throw Fie(new Error,$ie.CLUSTERING_NOT_ENABLED,qie.BAD_REQUEST,void 0,void 0,!0)}a(eoe,"checkClusteringEnabled");async function toe(){let e=new Vie(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await jie(e))}a(toe,"getAllNodeRecords");async function roe(){let e=await Kie.getSystemInformation();return{hdb_version:Yie.version,node_version:e.node_version,platform:e.platform}}a(roe,"getSystemInfo")});var dN=P((TCe,tG)=>{"use strict";var yg=Er(),zF=oe(),jF=Dt(),QF=(G(),D($)),bg=X(),JF=Eg(),noe=d_(),{RemotePayloadObject:soe}=X_(),{handleHDBError:XF,hdb_errors:ioe}=he(),{HTTP_STATUS_CODES:ZF}=ioe,{NodeSubscription:eG}=Vu();tG.exports=ooe;async function ooe(e,t){let r;try{r=await yg.request(`${t}.${jF.REQUEST_SUFFIX}`,new soe(QF.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),bg.trace("Response from remote describe all request:",r)}catch(o){bg.error(`addNode received error from describe all request to remote node: ${o}`);let c=yg.requestErrorHandler(o,"add_node",t);throw XF(new Error,c,ZF.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===jF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw XF(new Error,o,ZF.INTERNAL_SERVER_ERROR,"error",o)}let n=r.message,s=[],i=[];for(let o of e){let{table:c}=o,l=o.database??o.schema??"data";if(l===QF.SYSTEM_SCHEMA_NAME){await yg.createLocalTableStream(l,c);let p=new eG(l,c,o.publish,o.subscribe);p.start_time=o.start_time,i.push(p);continue}let u=zF.doesSchemaExist(l),f=n[l]!==void 0,d=c?zF.doesTableExist(l,c):!0,h=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!f||!d&&!h){s.push(o);continue}if(!u&&f&&(bg.trace(`addNode creating schema: ${l}`),await JF.createSchema({operation:"create_schema",schema:l})),!d&&h){bg.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let p=new noe(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(p.attributes=n[l][c].attributes),await JF.createTable(p)}await yg.createLocalTableStream(l,c);let _=new eG(l,c,o.publish,o.subscribe);_.start_time=o.start_time,i.push(_)}return{added:i,skipped:s}}a(ooe,"reviewSubscriptions")});var cl={};Be(cl,{addNodeBack:()=>doe,removeNodeBack:()=>foe,setNode:()=>uoe});async function uoe(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=Qs(t)):t=fg(r);let n=(0,nG.validateBySchema)(e,loe);if(n)throw(0,yo.handleHDBError)(n,n.message,coe.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new yo.ClientError("url or hostname is required for remove_node operation");let _=r,p=sr(),S=await p.get(_);if(!S)throw new yo.ClientError(_+" does not exist");try{await z_({url:S.url},{operation:Yt.REMOVE_NODE_BACK,name:S?.subscriptions?.length>0?tt():_},void 0)}catch(g){jn.warn(`Error removing node from target node ${_}, 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(_),`Successfully removed '${_}' from cluster`}if(!t)throw new yo.ClientError("url required for this operation");let s=Ea();if(s==null)throw new yo.ClientError("replication url is missing from harperdb-config.yaml");let i,o,c;if(t?.startsWith("wss:")){i=await(0,Ss.getReplicationCert)();let _=await(0,Ss.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,Ss.createCsr)(),jn.info("Sending CSR to target node:",t)):_&&(c=_.certificate,jn.info("Sending CA named",_.name,"to target node",t))}let l={operation:Yt.ADD_NODE_BACK,hostname:(0,Pa.get)(B.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:o,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,Pa.get)(B.REPLICATION_SHARD)!==void 0&&(l.shard=(0,Pa.get)(B.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(rG):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let _=rG(e);l.subscribe=_.subscribe,l.publish=_.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,f;try{u=await z_({url:t},l,e)}catch(_){_.message=`Error returned from ${t}: `+_.message,jn.warn("Error adding node:",t,"to cluster:",_),f=_}if(o&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw f?(f.message+=" and connection was required to sign certificate",f):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);o&&(jn.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ss.setCertTable)({name:aoe.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ss.setCertTable)({name:tt(),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 d={url:t,ca:u?.usingCA};if(e.hostname&&(d.name=e.hostname),e.subscriptions?d.subscriptions=e.subscriptions:d.replicates=!0,e.start_time&&(d.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(d.authorization=e.authorization),e.revoked_certificates&&(d.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?d.shard=u.shard:e.shard!==void 0&&(d.shard=e.shard),d.replicates){let _={url:s,ca:c,replicates:!0,subscriptions:null};(0,Pa.get)(B.REPLICATION_SHARD)!==void 0&&(_.shard=(0,Pa.get)(B.REPLICATION_SHARD)),e.retain_authorization&&(_.authorization=e.authorization),e.start_time&&(_.start_time=e.start_time),await Eo(tt(),_)}await Eo(u?u.nodeName:d.name??Qs(t),d);let h;return e.operation==="update_node"?h=`Successfully updated '${t}'`:h=`Successfully added '${t}' to cluster`,f&&(h+=" but there was an error updating target node: "+f.message),h}async function doe(e){jn.trace("addNodeBack received request:",e);let t=await(0,Ss.signCertificate)(e),r;e.csr?(r=t.signingCA,jn.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,jn.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,Ss.getReplicationCertAuth)();if(n.replicates){let i={url:Ea(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,Pa.get)(B.REPLICATION_SHARD)!==void 0&&(i.shard=(0,Pa.get)(B.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Eo(tt(),i)}return await Eo(e.hostname,n),t.nodeName=tt(),t.usingCA=s?.certificate,jn.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function foe(e){jn.trace("removeNodeBack received request:",e),await sr().delete(e.name)}function rG(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ss,nG,Ca,Pa,jn,yo,aoe,coe,loe,ll=be(()=>{Ss=M(Zs()),nG=M(st()),Ca=M(require("joi")),Pa=M(ce());G();q_();Zc();ms();jn=M(X()),yo=M(he()),{pki:aoe}=require("node-forge"),{HTTP_STATUS_CODES:coe}=yo.hdb_errors,loe=Ca.default.object({hostname:Ca.default.string(),verify_tls:Ca.default.boolean(),replicates:Ca.default.boolean(),subscriptions:Ca.default.array(),revoked_certificates:Ca.default.array(),shard:Ca.default.number()});a(uoe,"setNode");a(doe,"addNodeBack");a(foe,"removeNodeBack");a(rG,"reverseSubscription")});var Cg=P((CCe,iG)=>{"use strict";var{handleHDBError:Og,hdb_errors:_oe}=he(),{HTTP_STATUS_CODES:Ng}=_oe,{addUpdateNodeValidator:hoe}=Ag(),wg=X(),Ig=(G(),D($)),sG=Dt(),poe=oe(),eh=Er(),th=Ro(),fN=ce(),moe=dN(),{Node:Eoe,NodeSubscription:goe}=Vu(),{broadcast:Soe}=it(),{setNode:Toe}=(ll(),D(cl)),wCe=ce(),ICe=(G(),D($)),Aoe="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Roe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",yoe=fN.get(Ig.CONFIG_PARAMS.CLUSTERING_NODENAME);iG.exports=boe;async function boe(e,t=!1){if(wg.trace("addNode called with:",e),fN.get(Ig.CONFIG_PARAMS.REPLICATION_URL)||fN.get(Ig.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Toe(e);th.checkClusteringEnabled();let r=hoe(e);if(r)throw Og(r,r.message,Ng.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let d=await th.getNodeRecord(n);if(!poe.isEmptyOrZeroLength(d))throw Og(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,Ng.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await moe(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=Aoe,o;let c=th.buildNodePayloads(s,yoe,Ig.OPERATIONS_ENUM.ADD_NODE,await th.getSystemInfo()),l=[];for(let d=0,h=s.length;d<h;d++){let _=s[d];s[d].start_time===void 0&&delete s[d].start_time,l.push(new goe(_.schema,_.table,_.publish,_.subscribe))}wg.trace("addNode sending remote payload:",c);let u;try{u=await eh.request(`${n}.${sG.REQUEST_SUFFIX}`,c)}catch(d){wg.error(`addNode received error from request: ${d}`);for(let _=0,p=s.length;_<p;_++){let S=s[_];S.publish=!1,S.subscribe=!1,await eh.updateRemoteConsumer(S,n)}let h=eh.requestErrorHandler(d,"add_node",n);throw Og(new Error,h,Ng.INTERNAL_SERVER_ERROR,"error",h)}if(u.status===sG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${n}: ${u.message}`;throw Og(new Error,d,Ng.INTERNAL_SERVER_ERROR,"error",d)}wg.trace(u);for(let d=0,h=s.length;d<h;d++){let _=s[d];await eh.updateRemoteConsumer(_,n),_.subscribe===!0&&await eh.updateConsumerIterator(_.schema,_.table,n,"start")}let f=new Eoe(n,l,u.system_info);return await th.upsertNodeRecord(f),Soe({type:"nats_update"}),i.length>0?o.message=Roe:o.message=`Successfully added '${n}' to manifest`,o}a(boe,"addNode")});var mN=P((LCe,aG)=>{"use strict";var{handleHDBError:_N,hdb_errors:Ooe}=he(),{HTTP_STATUS_CODES:hN}=Ooe,{addUpdateNodeValidator:Noe}=Ag(),rh=X(),Pg=(G(),D($)),oG=Dt(),DCe=oe(),nh=Er(),sh=Ro(),pN=ce(),{cloneDeep:woe}=require("lodash"),Ioe=dN(),{Node:Coe,NodeSubscription:Poe}=Vu(),{broadcast:Doe}=it(),{setNode:Loe}=(ll(),D(cl)),Moe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",voe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Uoe=pN.get(Pg.CONFIG_PARAMS.CLUSTERING_NODENAME);aG.exports=xoe;async function xoe(e){if(rh.trace("updateNode called with:",e),pN.get(Pg.CONFIG_PARAMS.REPLICATION_URL)??pN.get(Pg.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Loe(e);sh.checkClusteringEnabled();let t=Noe(e);if(t)throw _N(t,t.message,hN.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await sh.getNodeRecord(r);s.length>0&&(n=woe(s));let{added:i,skipped:o}=await Ioe(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=Moe,c;let l=sh.buildNodePayloads(i,Uoe,Pg.OPERATIONS_ENUM.UPDATE_NODE,await sh.getSystemInfo());for(let f=0,d=i.length;f<d;f++){let h=i[f];rh.trace(`updateNode updating work stream for node: ${r} subscription:`,h),i[f].start_time===void 0&&delete i[f].start_time}rh.trace("updateNode sending remote payload:",l);let u;try{u=await nh.request(`${r}.${oG.REQUEST_SUFFIX}`,l)}catch(f){rh.error(`updateNode received error from request: ${f}`);let d=nh.requestErrorHandler(f,"update_node",r);throw _N(new Error,d,hN.INTERNAL_SERVER_ERROR,"error",d)}if(u.status===oG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${r}: ${u.message}`;throw _N(new Error,f,hN.INTERNAL_SERVER_ERROR,"error",f)}rh.trace(u);for(let f=0,d=i.length;f<d;f++){let h=i[f];await nh.updateRemoteConsumer(h,r),h.subscribe===!0?await nh.updateConsumerIterator(h.schema,h.table,r,"start"):await nh.updateConsumerIterator(h.schema,h.table,r,"stop")}return n||(n=[new Coe(r,[],u.system_info)]),await Boe(n[0],i,u.system_info),o.length>0?c.message=voe:c.message=`Successfully updated '${r}'`,c}a(xoe,"updateNode");async function Boe(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let o=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let f=n.subscriptions[l];if(f.schema===o.schema&&f.table===o.table){f.publish=o.publish,f.subscribe=o.subscribe,c=!0;break}}c||n.subscriptions.push(new Poe(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await sh.upsertNodeRecord(n),Doe({type:"nats_update"})}a(Boe,"updateNodeTable")});var fG=P((vCe,dG)=>{"use strict";var uG=require("joi"),{string:cG}=uG.types(),Hoe=st(),lG=(G(),D($)),koe=ce(),Foe=Dt();dG.exports=Goe;function Goe(e){let t=cG.invalid(koe.get(lG.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(Foe.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=uG.object({operation:cG.valid(lG.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return Hoe.validateBySchema(e,r)}a(Goe,"removeNodeValidator")});var Dg=P((xCe,EG)=>{"use strict";var{handleHDBError:_G,hdb_errors:qoe}=he(),{HTTP_STATUS_CODES:hG}=qoe,$oe=fG(),ih=X(),pG=Ro(),Voe=oe(),Wu=(G(),D($)),mG=Dt(),EN=Er(),gN=ce(),{RemotePayloadObject:Koe}=X_(),{NodeSubscription:Yoe}=Vu(),Woe=u_(),zoe=xc(),{broadcast:joe}=it(),{setNode:Qoe}=(ll(),D(cl)),Joe=gN.get(Wu.CONFIG_PARAMS.CLUSTERING_NODENAME);EG.exports=Xoe;async function Xoe(e){if(ih.trace("removeNode called with:",e),gN.get(Wu.CONFIG_PARAMS.REPLICATION_URL)??gN.get(Wu.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Qoe(e);pG.checkClusteringEnabled();let t=$oe(e);if(t)throw _G(t,t.message,hG.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await pG.getNodeRecord(r);if(Voe.isEmptyOrZeroLength(n))throw _G(new Error,`Node '${r}' was not found.`,hG.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new Koe(Wu.OPERATIONS_ENUM.REMOVE_NODE,Joe,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let f=n.subscriptions[l];f.subscribe===!0&&await EN.updateConsumerIterator(f.schema,f.table,r,"stop");try{await EN.updateRemoteConsumer(new Yoe(f.schema,f.table,!1,!1),r)}catch(d){ih.error(d)}}try{i=await EN.request(`${r}.${mG.REQUEST_SUFFIX}`,s),ih.trace("Remove node reply from remote node:",r,i)}catch(l){ih.error("removeNode received error from request:",l),o=!0}let c=new Woe(Wu.SYSTEM_SCHEMA_NAME,Wu.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await zoe.deleteRecord(c),joe({type:"nats_update"}),i?.status===mG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(ih.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`}a(Xoe,"removeNode")});var TG=P((HCe,SG)=>{"use strict";var gG=require("joi"),{string:Zoe,array:eae}=gG.types(),tae=st(),rae=Ag();SG.exports=nae;function nae(e){let t=gG.object({operation:Zoe.valid("configure_cluster").required(),connections:eae.items(rae.validation_schema).required()});return tae.validateBySchema(e,t)}a(nae,"configureClusterValidator")});var SN=P((FCe,OG)=>{"use strict";var AG=(G(),D($)),Lg=X(),sae=oe(),iae=ce(),oae=Dg(),aae=Cg(),cae=Ro(),lae=TG(),{handleHDBError:RG,hdb_errors:uae}=he(),{HTTP_STATUS_CODES:yG}=uae,dae="Configure cluster complete.",fae="Failed to configure the cluster. Check the logs for more details.",_ae="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";OG.exports=hae;async function hae(e){Lg.trace("configure cluster called with:",e);let t=lae(e);if(t)throw RG(t,t.message,yG.BAD_REQUEST,void 0,void 0,!0);let r=await cae.getAllNodeRecords(),n=[];if(iae.get(AG.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let f=0,d=r.length;f<d;f++){let h=await bG(oae,{operation:AG.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[f].name},r[f].name);n.push(h)}Lg.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let f=0;f<i;f++){let d=e.connections[f],h=await bG(aae,d,d.node_name);s.push(h)}Lg.trace("All results from configure_cluster add node:",s);let o=[],c=[],l=!1,u=n.concat(s);for(let f=0,d=u.length;f<d;f++){let h=u[f];h.status==="rejected"&&(Lg.error(h.node_name,h?.error?.message,h?.error?.stack),o.includes(h.node_name)||o.push(h.node_name)),(h?.result?.message?.includes?.("Successfully")||h?.result?.includes?.("Successfully"))&&(l=!0),!(typeof h.result=="string"&&h.result.includes("Successfully removed")||h.status==="rejected")&&c.push({node_name:h?.node_name,response:h?.result})}if(sae.isEmptyOrZeroLength(o))return{message:dae,connections:c};if(l)return{message:_ae,failed_nodes:o,connections:c};throw RG(new Error,fae,yG.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(hae,"configureCluster");async function bG(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(bG,"functionWrapper")});var CG=P((qCe,IG)=>{"use strict";var oh=require("joi"),pae=st(),{validateSchemaExists:NG,validateTableExists:mae,validateSchemaName:wG}=Ri(),Eae=oh.object({operation:oh.string().valid("purge_stream"),schema:oh.string().custom(NG).custom(wG).optional(),database:oh.string().custom(NG).custom(wG).optional(),table:oh.string().custom(mae).required()});function gae(e){return pae.validateBySchema(e,Eae)}a(gae,"purgeStreamValidator");IG.exports=gae});var TN=P((VCe,PG)=>{"use strict";var{handleHDBError:Sae,hdb_errors:Tae}=he(),{HTTP_STATUS_CODES:Aae}=Tae,Rae=CG(),yae=Er(),bae=Ro();PG.exports=Oae;async function Oae(e){e.schema=e.schema??e.database;let t=Rae(e);if(t)throw Sae(t,t.message,Aae.BAD_REQUEST,void 0,void 0,!0);bae.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await yae.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(Oae,"purgeStream")});var yN=P((YCe,BG)=>{"use strict";var RN=Ro(),Nae=Er(),vg=ce(),zu=(G(),D($)),ul=Dt(),wae=oe(),AN=X(),{RemotePayloadObject:Iae}=X_(),{ErrorCode:DG}=require("nats"),{parentPort:LG}=require("worker_threads"),{onMessageByType:Cae}=it(),{getThisNodeName:Pae}=(ms(),D(Ra)),{requestClusterStatus:Dae}=(q_(),D(ek)),{getReplicationSharedStatus:Lae,getHDBNodeTable:Mae}=(Zc(),D(uO)),{CONFIRMATION_STATUS_POSITION:vae,RECEIVED_VERSION_POSITION:Uae,RECEIVED_TIME_POSITION:xae,SENDING_TIME_POSITION:Bae,RECEIVING_STATUS_POSITION:Hae,RECEIVING_STATUS_RECEIVING:kae}=(UO(),D(Kk)),MG=vg.get(zu.CONFIG_PARAMS.CLUSTERING_ENABLED),vG=vg.get(zu.CONFIG_PARAMS.CLUSTERING_NODENAME);BG.exports={clusterStatus:Fae,buildNodeStatus:xG};var UG;Cae("cluster-status",async e=>{UG(e)});async function Fae(){if(vg.get(zu.CONFIG_PARAMS.REPLICATION_URL)||vg.get(zu.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(LG){LG.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{UG=i});for(let i of n.connections){let o=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let d of Object.values(databases[l]||{}))if(u=d.auditStore,u)break;if(!u)continue;let f=Lae(u,l,o);c.lastCommitConfirmed=Mg(f[vae]),c.lastReceivedRemoteTime=Mg(f[Uae]),c.lastReceivedLocalTime=Mg(f[xae]),c.sendingMessage=Mg(f[Bae]),c.lastReceivedStatus=f[Hae]===kae?"Receiving":"Waiting"}}}else n=Dae();n.node_name=Pae();let s=Mae().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:vG,is_enabled:MG,connections:[]};if(!MG)return e;let t=await RN.getAllNodeRecords();if(wae.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(xG(t[n],e.connections));return await Promise.allSettled(r),e}a(Fae,"clusterStatus");function Mg(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}a(Mg,"asDate");async function xG(e,t){let r=e.name,n=new Iae(zu.OPERATIONS_ENUM.CLUSTER_STATUS,vG,void 0,await RN.getSystemInfo()),s,i,o=ul.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Nae.request(ul.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===ul.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=ul.CLUSTER_STATUS_STATUSES.CLOSED,AN.error(`Error getting node status from ${r} `,s))}catch(l){AN.warn(`Error getting node status from ${r}`,l),l.code===DG.NoResponders?o=ul.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===DG.Timeout?o=ul.CLUSTER_STATUS_STATUSES.TIMEOUT:o=ul.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Gae(r,o,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!==zu.PRE_4_0_0_VERSION&&await RN.upsertNodeRecord(l)}catch(l){AN.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(xG,"buildNodeStatus");function Gae(e,t,r,n,s,i,o,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=o,this.system_info=c}a(Gae,"NodeStatusObject")});var ON=P((zCe,HG)=>{"use strict";var{handleHDBError:qae,hdb_errors:$ae}=he(),{HTTP_STATUS_CODES:Vae}=$ae,Kae=Er(),Yae=Ro(),bN=oe(),Ug=require("joi"),Wae=st(),zae=2e3,jae=Ug.object({timeout:Ug.number().min(1),connected_nodes:Ug.boolean(),routes:Ug.boolean()});HG.exports=Qae;async function Qae(e){Yae.checkClusteringEnabled();let t=Wae.validateBySchema(e,jae);if(t)throw qae(t,t.message,Vae.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||bN.autoCastBoolean(n),o=s===void 0||bN.autoCastBoolean(s),c={nodes:[]},l=await Kae.getServerList(r??zae),u={};if(i)for(let f=0,d=l.length;f<d;f++){let h=l[f].statsz;h&&(u[l[f].server.name]=h.routes)}for(let f=0,d=l.length;f<d;f++){if(l[f].statsz)continue;let h=l[f].server,_=l[f].data;if(h.name.endsWith("-hub")){let p={name:h.name.slice(0,-4),response_time:l[f].response_time};i&&(p.connected_nodes=[],u[h.name]&&u[h.name].forEach(S=>{p.connected_nodes.includes(S.name.slice(0,-4))||p.connected_nodes.push(S.name.slice(0,-4))})),o&&(p.routes=_.cluster?.urls?_.cluster?.urls.map(S=>({host:S.split(":")[0],port:bN.autoCast(S.split(":")[1])})):[]),c.nodes.push(p)}}return c}a(Qae,"clusterNetwork")});var qG=P((QCe,GG)=>{"use strict";var NN=require("joi"),kG=st(),{route_constraints:FG}=AA();GG.exports={setRoutesValidator:Jae,deleteRoutesValidator:Xae};function Jae(e){let t=NN.object({server:NN.valid("hub","leaf"),routes:FG.required()});return kG.validateBySchema(e,t)}a(Jae,"setRoutesValidator");function Xae(e){let t=NN.object({routes:FG.required()});return kG.validateBySchema(e,t)}a(Xae,"deleteRoutesValidator")});var xg=P((XCe,jG)=>{"use strict";var bo=It(),wN=oe(),Ts=(G(),D($)),ju=ce(),$G=qG(),{handleHDBError:VG,hdb_errors:Zae}=he(),{HTTP_STATUS_CODES:KG}=Zae,YG="cluster routes successfully set",WG="cluster routes successfully deleted";jG.exports={setRoutes:tce,getRoutes:rce,deleteRoutes:nce};function ece(e){let t=bo.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 o=0,c=e.routes.length;o<c;o++){let l=e.routes[o];l.port=wN.autoCast(l.port);let u=r.some(d=>d.host===l.host&&d.port===l.port),f=n.some(d=>d.host===l.host&&d.port===l.port);u||f?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?bo.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):bo.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:YG,set:i,skipped:s}}a(ece,"setRoutesNats");function tce(e){let t=$G.setRoutesValidator(e);if(t)throw VG(t,t.message,KG.BAD_REQUEST,void 0,void 0,!0);if(ju.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED))return ece(e);let r=[],n=[],s=ju.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{zG(s,i)?n.push(i):(s.push(i),r.push(i))}),bo.updateConfigValue(Ts.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:YG,set:r,skipped:n}}a(tce,"setRoutes");function zG(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}a(zG,"existsInArray");function rce(){if(ju.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=bo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return ju.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(rce,"getRoutes");function nce(e){let t=$G.deleteRoutesValidator(e);if(t)throw VG(t,t.message,KG.BAD_REQUEST,void 0,void 0,!0);if(ju.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED))return sce(e);let r=[],n=[],s=ju.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{zG(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),bo.updateConfigValue(Ts.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:WG,deleted:r,skipped:n}}a(nce,"deleteRoutes");function sce(e){let t=bo.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],o=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let f=e.routes[l],d=!1;for(let h=0,_=r.length;h<_;h++){let p=r[h];if(f.host===p.host&&f.port===p.port){r.splice(h,1),d=!0,o=!0,s.push(f);break}}if(!d){let h=!0;for(let _=0,p=n.length;_<p;_++){let S=n[_];if(f.host===S.host&&f.port===S.port){n.splice(_,1),c=!0,h=!1,s.push(f);break}}h&&i.push(f)}}return o&&(r=wN.isEmptyOrZeroLength(r)?null:r,bo.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=wN.isEmptyOrZeroLength(n)?null:n,bo.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:WG,deleted:s,skipped:i}}a(sce,"deleteRoutesNats")});var JG=P((ePe,QG)=>{"use strict";var ah=require("alasql"),dl=require("recursive-iterator"),ei=X(),ice=oe(),ch=(G(),D($)),IN=class{static{a(this,"sql_statement_bucket")}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,ace(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=>ch.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=>!ch.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,o=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[o]&&t[i].tables[o][ch.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[o].attribute_permissions.length>0?c=oce(t[i].tables[o].attribute_permissions):c=global.hdb_schema[i][o].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(o).filter(u=>!ch.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let f=new ah.yy.Column({columnid:u});s.tableid&&(f.tableid=s.tableid),this.ast.columns.push(f),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(o,l)}}),this.ast}};function oce(e){return e.filter(t=>t[ch.PERMS_CRUD_ENUM.READ])}a(oce,"filterReadRestrictedAttrs");function ace(e,t,r,n,s){cce(e,t,r,n,s)}a(ace,"interpretAST");function lh(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,o=e.tableid;e.as&&(o=e.as),s.set(o,i)}}a(lh,"addSchemaTableToMap");function cce(e,t,r,n,s){if(!e){ei.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof ah.yy.Insert?fce(e,t,r):e instanceof ah.yy.Select?lce(e,t,r,n,s):e instanceof ah.yy.Update?uce(e,t,r):e instanceof ah.yy.Delete?dce(e,t,r):ei.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(cce,"getRecordAttributesAST");function lce(e,t,r,n,s){if(!e){ei.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(ice.isEmptyOrZeroLength(i)){ei.error("No schema specified");return}e.from.forEach(c=>{lh(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),lh(c.table,t,r,n,s)});let o=new dl(e.columns);for(let{node:c}of o)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{ei.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 dl(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let f=u.tableid?u.tableid:l;if(!t.get(i).has(f))if(r.has(f))f=r.get(f);else{ei.info(`table specified as ${f} not found.`);continue}t.get(i).get(f).indexOf(u.columnid)<0&&t.get(i).get(f).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new dl(c.on);for(let{node:u}of l)if(u&&u.columnid){let f=u.tableid,d=s.get(f);if(!t.get(d).has(f))if(r.has(f))f=r.get(f);else{ei.info(`table specified as ${f} not found.`);continue}t.get(d).get(f).indexOf(u.columnid)<0&&t.get(d).get(f).push(u.columnid)}}),e.order){let c=new dl(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,f=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(f).has(u))if(r.has(u))u=r.get(u);else{ei.info(`table specified as ${u} not found.`);return}t.get(f).get(u).indexOf(l.columnid)<0&&t.get(f).get(u).push(l.columnid)}}}a(lce,"getSelectAttributes");function uce(e,t,r){if(!e){ei.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new dl(e.columns),s=e.table.databaseid;lh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&CN(e.table.tableid,s,i.columnid,t,r)}a(uce,"getUpdateAttributes");function dce(e,t,r){if(!e){ei.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new dl(e.where),s=e.table.databaseid;lh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&CN(e.table.tableid,s,i.columnid,t,r)}a(dce,"getDeleteAttributes");function fce(e,t,r){if(!e){ei.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new dl(e.columns),s=e.into.databaseid;lh(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&CN(e.into.tableid,s,i.columnid,t,r)}a(fce,"getInsertAttributes");function CN(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)}a(CN,"pushAttribute");QG.exports=IN});var ZG=P((rPe,XG)=>{"use strict";var Bg=(G(),D($)),Hg=class{static{a(this,"BaseLicense")}constructor(t=0,r=Bg.RAM_ALLOCATION_ENUM.DEFAULT,n=Bg.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},PN=class extends Hg{static{a(this,"ExtendedLicense")}constructor(t=0,r=Bg.RAM_ALLOCATION_ENUM.DEFAULT,n=Bg.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};XG.exports={BaseLicense:Hg,ExtendedLicense:PN}});var Xu=P((sPe,iq)=>{"use strict";var Ju=require("fs-extra"),kg=(Gm(),D(Fm)),tq=require("crypto"),_ce=require("moment"),hce=require("uuid").v4,Qr=X(),LN=require("path"),pce=oe(),fl=(G(),D($)),{totalmem:eq}=require("os"),mce=ZG().ExtendedLicense,Qu="invalid license key format",Ece="061183",gce="mofi25",Sce="aes-256-cbc",Tce=16,Ace=32,rq=ce(),{resolvePath:nq}=It();rq.initSync();var DN;iq.exports={validateLicense:sq,generateFingerPrint:yce,licenseSearch:UN,getLicense:Nce,checkMemoryLimit:wce};function MN(){return LN.join(rq.getHdbBasePath(),fl.LICENSE_KEY_DIR_NAME,fl.LICENSE_FILE_NAME)}a(MN,"getLicenseDirPath");function Rce(){let e=MN();return nq(LN.join(e,fl.LICENSE_FILE_NAME))}a(Rce,"getLicenseFilePath");function vN(){let e=MN();return nq(LN.join(e,fl.REG_KEY_FILE_NAME))}a(vN,"getFingerPrintFilePath");async function yce(){let e=vN();try{return await Ju.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await bce();throw Qr.error(`Error writing fingerprint file to ${e}`),Qr.error(t),new Error("There was an error generating the fingerprint")}}a(yce,"generateFingerPrint");async function bce(){let e=hce(),t=kg.hash(e,kg.HASH_FUNCTION.MD5),r=vN();try{await Ju.mkdirp(MN()),await Ju.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw Qr.error(`Error writing fingerprint file to ${r}`),Qr.error(n),new Error("There was an error generating the fingerprint")}return t}a(bce,"writeFingerprint");function sq(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:fl.RAM_ALLOCATION_ENUM.DEFAULT,version:fl.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return Qr.error("empty license key passed to validate."),r;let n=vN(),s=!1;try{s=Ju.statSync(n)}catch(i){Qr.error(i)}if(s){let i;try{i=Ju.readFileSync(n,"utf8")}catch{Qr.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(gce),c=o[1];c=Buffer.concat([Buffer.from(c)],Tce);let l=Buffer.concat([Buffer.from(i)],Ace),u=tq.createDecipheriv(Sce,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let f=null;try{f=u.update(o[0],"hex","utf8"),f.trim(),f+=u.final("utf8")}catch{let _=Oce(o[0],i);if(_)f=_;else throw r.valid_license=!1,r.valid_machine=!1,console.error(Qu),Qr.error(Qu),new Error(Qu)}let d;if(isNaN(f))try{d=JSON.parse(f),r.version=d.version,r.exp_date=d.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),d.ram_allocation&&(r.ram_allocation=d.ram_allocation)}catch{throw console.error(Qu),Qr.error(Qu),new Error(Qu)}else r.exp_date=f;r.exp_date<_ce().valueOf()&&(r.valid_date=!1),kg.validate(o[1],`${Ece}${i}${t}`,kg.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||Qr.error("Invalid licence"),r}a(sq,"validateLicense");function Oce(e,t){try{let r=tq.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{Qr.warn("Check old license failed")}}a(Oce,"checkOldLicense");function UN(){let e=new mce,t=[];try{t=Ju.readFileSync(Rce(),"utf-8").split(`\r
22
+ `,"")}a(UH,"runCommand");async function hne(){try{await Vre.access(eO)}catch{return!1}let e=await UH(`${eO} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return Kre.eq(t,fne)}a(hne,"checkNATSServerInstalled");async function iO(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await MH.getClusterUser();if(Xc(o))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=o.username,r=o.decrypt_hash}js.trace("create nats connection called");let i=await nne({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:Or.get(je.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:Or.get(je.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:Or.get(je.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),js.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(o=>{o&&js.error("Error with Nats client connection, connection closed",o),i===zr&&xH()}),i}a(iO,"createConnection");function xH(){zr=void 0,jc=void 0,Qc=void 0,Jc=void 0}a(xH,"clearClientCache");async function pne(){zr&&(await zr.drain(),zr=void 0,jc=void 0,Qc=void 0,Jc=void 0)}a(pne,"closeConnection");var zr,Jc;async function U_(){return Jc||(Jc=iO(Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),zr=await Jc),zr||Jc}a(U_,"getConnection");async function x_(){if(jc)return jc;Xc(zr)&&await U_();let{domain:e}=Iu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Xc(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return jc=await zr.jetstreamManager({domain:e,timeout:6e4}),jc}a(x_,"getJetStreamManager");async function BH(){if(Qc)return Qc;Xc(zr)&&await U_();let{domain:e}=Iu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Xc(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Qc=zr.jetstream({domain:e,timeout:6e4}),Qc}a(BH,"getJetStream");async function Li(){let e=zr||await U_(),t=jc||await x_(),r=Qc||await BH();return{connection:e,jsm:t,js:r}}a(Li,"getNATSReferences");async function mne(e){let t=Or.get(je.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await MH.getClusterUser(),s=await iO(t,r,n),i=sO(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=vH.decode(f.data);d.response_time=Date.now()-l,c.push(d)}})();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 GE.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(mne,"getServerList");async function oO(e,t){let{jsm:r}=await Li(),n=Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:sne.File,retention:ine.Limits,subjects:t,discard:one.Old,max_msgs:s,max_bytes:i,max_age:n})}a(oO,"createLocalStream");async function HH(){let{jsm:e}=await Li(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(HH,"listStreams");async function Ene(e){let{jsm:t}=await Li();await t.streams.delete(e)}a(Ene,"deleteLocalStream");async function gne(e){let{connection:t}=await Li(),r=[],n=sO(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(vH.decode(o.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}a(gne,"listRemoteStreams");async function Sne(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Li(),i=CH(),o={durable_name:i,ack_policy:rO.Explicit};t&&(o.deliver_policy=nO.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);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 f of l){let d=tO(f.data),h={nats_timestamp:f.info.timestampNanos,nats_sequence:f.info.streamSequence,entry:d};if(f.headers&&(h.origin=f.headers.get(Ur.MSG_HEADERS.ORIGIN)),u.push(h),f.ack(),f.info.pending===0)break}return await c.delete(),u}a(Sne,"viewStream");async function*Tne(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Li(),i=CH(),o={durable_name:i,ack_policy:rO.Explicit};t&&(o.deliver_policy=nO.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);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 f=tO(u.data);f[0]||(f=[f]);for(let d of f){let h={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:d};u.headers&&(h.origin=u.headers.get(Ur.MSG_HEADERS.ORIGIN)),yield h}if(u.ack(),u.info.pending===0)break}await c.delete()}a(Tne,"viewStreamIterator");async function Ane(e,t,r,n){js.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=kH(n,r);let{js:s}=await Li(),i=await $E(),o=`${e}.${i}`,c=await une(()=>n instanceof Uint8Array?n:LH.encode(n));try{js.trace(`publishToStream publishing to subject: ${o}`),lne(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(o,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return GH(async()=>{try{await s.publish(o,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){js.trace(`publishToStream creating stream: ${t}`);let f=o.split(".");f[2]="*",await oO(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(Ane,"publishToStream");function kH(e,t){t===void 0&&(t=cne());let r=Or.get(je.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(Ur.MSG_HEADERS.ORIGIN)&&r&&t.append(Ur.MSG_HEADERS.ORIGIN,r),t}a(kH,"addNatsMsgHeader");function Iu(e){e=e.toLowerCase();let t=v_.join(Or.get(je.CONFIG_PARAMS.ROOTPATH),dne);if(e===je.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return Xc(Zb)&&(Zb={port:L_.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:L_.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_NODENAME)+Ur.SERVER_SUFFIX.HUB,config_file:Ur.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:v_.join(t,Ur.PID_FILES.HUB),hdb_nats_path:t}),Zb;if(e===je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return Xc(Xb)&&(Xb={port:L_.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:L_.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_NODENAME)+Ur.SERVER_SUFFIX.LEAF,config_file:Ur.NATS_CONFIG_FILES.LEAF_SERVER,domain:L_.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_NODENAME)+Ur.SERVER_SUFFIX.LEAF,pid_file_path:v_.join(t,Ur.PID_FILES.LEAF),hdb_nats_path:t}),Xb;js.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a(Iu,"getServerConfig");async function FH(e,t,r,n){try{await e.consumers.add(t,{ack_policy:rO.Explicit,durable_name:r,deliver_policy:nO.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a(FH,"createConsumer");async function Rne(e,t,r){await e.consumers.delete(t,r)}a(Rne,"removeConsumer");function yne(e){return e.split(".")[1]}a(yne,"extractServerName");async function bne(e,t,r=6e4,n=sO()){if(!GE.isObject(t))throw new Error("data param must be an object");let s=LH.encode(t),{connection:i}=await Li(),o={timeout:r};n&&(o.reply=n,o.noMux=!0);let c=await i.request(e,s,o);return tO(c.data)}a(bne,"request");function aO(e){return new Promise(async(t,r)=>{let n=jre(eO,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",o=>{r(o)}),n.stdout.on("data",o=>{i+=o.toString()}),n.stderr.on("data",o=>{s+=o.toString()}),n.stderr.on("close",o=>{s&&r(s),t(i)})})}a(aO,"reloadNATS");async function One(){let{pid_file_path:e}=Iu(je.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await aO(e)}a(One,"reloadNATSHub");async function Nne(){let{pid_file_path:e}=Iu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await aO(e)}a(Nne,"reloadNATSLeaf");function wne(e,t,r){let n;switch(e.code){case IH.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case IH.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(wne,"requestErrorHandler");async function Ine(e,t){let r=t+Ur.SERVER_SUFFIX.LEAF,{connection:n}=await Li(),{jsm:s}=await xne(r),{schema:i,table:o}=e,c=qE.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await GH(async()=>{if(e.subscribe===!0)await FH(s,c,n.info.server_name,l);else try{await Rne(s,c,n.info.server_name)}catch(u){js.trace(u)}})}a(Ine,"updateRemoteConsumer");async function Cne(e,t,r,n){let s=qE.createNatsTableStreamName(e,t),i=r+Ur.SERVER_SUFFIX.LEAF,o={type:je.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!DH&&tne()<Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=Jb();await c(o)}await Zre(o),n==="stop"&&await GE.async_set_timeout(1e3)}a(Cne,"updateConsumerIterator");function GH(e){return Xre.writeTransaction(je.SYSTEM_SCHEMA_NAME,je.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(GH,"exclusiveLock");async function qH(e,t){let r=qE.createNatsTableStreamName(e,t),n=await $E(),s=Mne(e,t,n);await oO(r,[s])}a(qH,"createLocalTableStream");async function Pne(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await qH(n,s)}}a(Pne,"createTableStreams");async function $H(e,t,r=void 0){if(Or.get(je.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=qE.createNatsTableStreamName(e,t),{domain:s}=Iu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await U_()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")js.warn(n);else throw n}}a($H,"purgeTableStream");async function Dne(e,t){if(Or.get(je.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await $H(e,t[r])}a(Dne,"purgeSchemaTableStreams");async function Lne(e){return(await x_()).streams.info(e)}a(Lne,"getStreamInfo");function Mne(e,t,r){return`${Ur.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(Mne,"createSubjectName");async function $E(){if(M_)return M_;if(M_=(await x_())?.nc?.info?.server_name,M_===void 0)throw new Error("Unable to get jetstream manager server name");return M_}a($E,"getJsmServerName");async function vne(){let e=await x_(),t=await $E(),r=await HH();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=Une(n),c=i.split(".");if(c[c.length-1]===t&&!o||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let f=u.join(".");js.trace(`Updating stream subject name from: ${i} to: ${f}`),s.subjects[0]=f,await e.streams.update(s.name,s)}}a(vne,"updateLocalStreams");function Une(e){let{config:t}=e,r=!1,n=Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=Or.get(je.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}a(Une,"updateStreamLimits");async function xne(e){let t,r;try{t=await zr.jetstream({domain:e}),r=await zr.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw js.error("Unable to connect to:",e),n}return{js:t,jsm:r}}a(xne,"connectToRemoteJS")});function cO(e){let t=e.get(VE),r=t?(0,Cu.unpack)(t):null;r||(r={remoteNameToId:{}});let n=tt(),s=!1;r.nodeName=tt();let i=r.remoteNameToId;if(i[n]!==0){let o=0,c;for(let l in i){let u=i[l];u===0?c=l:u>o&&(o=u)}if(c){o++,i[c]=o;let l=[Symbol.for("seq"),o];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:H_(e)??1,nodes:[]})})}i[n]=0,e.putSync(VE,(0,Cu.pack)(r))}return r}function B_(e){return cO(e).remoteNameToId}function YH(e,t){let r=cO(t),n=r.remoteNameToId,s=new Map,i=!1;for(let o in e){let c=e[o],l=n[o];if(l==null){let u=0;for(let f in n){let d=n[f];d>u&&(u=d)}l=u+1,n[o]=l,i=!0}s.set(c,l)}return i&&t.putSync(VE,(0,Cu.pack)(r)),s}function KE(e,t){let r=cO(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let o in n){let c=n[o];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(VE,(0,Cu.pack)(r))}return KH.trace?.("The remote node name map",e,n,s),s}var KH,Cu,VE,lO=be(()=>{KH=M(mi());ms();Cu=require("msgpackr"),VE=Symbol.for("remote-ids");a(cO,"getIdMappingRecord");a(B_,"exportIdMapping");a(YH,"remoteToLocalNodeId");a(KE,"getIdOfRemoteNode")});var uO={};Be(uO,{commits_awaiting_replication:()=>Du,getHDBNodeTable:()=>sr,getReplicationSharedStatus:()=>YE,iterateRoutes:()=>F_,shouldReplicateToNode:()=>k_,subscribeToNodeUpdates:()=>Lu});function sr(){return WH||(WH=_t({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 YE(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Lu(e){sr().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;JH.debug?.("adding node",n,"on node",tt()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==tt()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of sr().search({}))if(i.shard!=null){let o=s.get(i.shard);o||s.set(i.shard,o=[]),o.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function k_(e,t){return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&sr().primaryStore.get(tt())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function Bne(){Lu(e=>{ma({},(t,r)=>{let n=e.name,s=zH.get(n);if(s||zH.set(n,s=new Map),s.has(r))return;let i;for(let o in t)if(i=t[o].auditStore,i)break;if(i){let o=YE(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of Du.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*F_(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=Pu.default.get(B.REPLICATION_SECUREPORT)??(!Pu.default.get(B.REPLICATION_PORT)&&Pu.default.get(B.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||Pu.default.get(B.REPLICATION_PORT)||Pu.default.get(B.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){jH.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,start_time:t.startTime,revoked_certificates:t.revokedCertificates}}}var jH,QH,Pu,JH,WH,zH,Du,Zc=be(()=>{Ue();ms();zp();jH=require("worker_threads"),QH=M(he()),Pu=M(ce());G();JH=M(mi());server.nodes=[];a(sr,"getHDBNodeTable");a(YE,"getReplicationSharedStatus");a(Lu,"subscribeToNodeUpdates");a(k_,"shouldReplicateToNode");zH=new Map;WD((e,t,r)=>{if(r>server.nodes.length)throw new QH.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);Du||(Du=new Map,Bne());let n=Du.get(e);return n||(n=[],Du.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(Bne,"startSubscriptionToReplications");a(F_,"iterateRoutes")});var ek={};Be(ek,{connectedToNode:()=>el,disconnectedFromNode:()=>vu,ensureNode:()=>Eo,requestClusterStatus:()=>ZH,startOnMainThread:()=>_O});async function _O(e){let t=0,r=Ze();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){WE.set(i,H_(l.auditStore));break}}}vi.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes?.search([])||[])i.push(o);for(let o of F_(e))try{let c=!o.subscriptions;if(c){let u=tt(),f=sr().primaryStore.get(u);if(f!==null){let d=e.url??Ea();(f===void 0||f.url!==d||f.shard!==e.shard)&&await Eo(u,{name:u,url:d,shard:e.shard,replicates:!0})}}let l=o.trusted!==!1;if(c&&o.replicates==null&&(o.replicates=!0),i.find(u=>u.url===o.url))continue;s(o)}catch(c){console.error(c)}Lu(s)});let n;function s(i,o=i?.name){let c=tt()&&o===tt()||Ea()&&i?.url===Ea();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let h of sr().search([]))h.replicates&&h.name!==o&&s(h,h.name);n=d}if(nt.trace("Setting up node replication for",i),!i){for(let[d,h]of Mi){let _;for(let[p,{worker:S,nodes:g}]of h){let R=g[0];if(R&&R.name==o){_=!0;for(let[E,{worker:T}]of h)h.delete(E),nt.warn("Node was deleted, unsubscribing from node",o,E,d),T?.postMessage({type:"unsubscribe-from-node",node:o,database:E,url:d});break}}if(_){Mi.get(d).iterator.remove(),Mi.delete(d);return}}return}if(c)return;if(!i.url){nt.info(`Node ${i.name} is missing url`);return}let l=Mi.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(nt.info(`Added node ${i.name} at ${i.url} for process ${tt()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[d,h]of Mu)if(i.url===h.url){Mu.delete(d);break}Mu.set(i.name,i)}let u=Ze();if(l||(l=new Map,Mi.set(i.url,l)),l.iterator=ma(e,(d,h,_)=>{_?f(h,!0):f(h,!1)}),i.subscriptions)for(let d of i.subscriptions){let h=d.database||d.schema;u[h]||(nt.warn(`Database ${h} not found for node ${i.name}, making a subscription anyway`),f(h,!1))}function f(d,h){nt.trace("Setting up replication for database",d,"on node",i.name);let _=l.get(d),p,S=[{replicateByDefault:h,...i}];WE.has(d)&&(S.push({replicateByDefault:h,name:tt(),start_time:WE.get(d),end_time:Date.now(),replicates:!0}),WE.delete(d));let g=k_(i,d),R=vi.workers.filter(E=>E.name==="http");if(_?(p=_.worker,_.nodes=S):g&&(t=t%R.length,p=R[t++],l.set(d,{worker:p,nodes:S,url:i.url}),p?.on("exit",()=>{l.get(d)?.worker===p&&(l.delete(d),f(d,h))})),g)setTimeout(()=>{let E={type:"subscribe-to-node",database:d,nodes:S};p?p.postMessage(E):G_(E)},Hne);else{nt.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],sr().primaryStore.get(tt())?.replicates),sr().primaryStore.get(tt())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};p?p.postMessage(E):jE(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),vu=a(function(i){try{nt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(Mu.keys()),c=o.sort(),l=c.indexOf(i.name||Qs(i.url));if(l===-1){nt.warn("Disconnected node not found in node map",i.name,o);return}let u=Mi.get(i.url),f=u?.get(i.database);if(!f){nt.warn("Disconnected node not found in replication map",i.database,u);return}if(f.connected=!1,i.finished||fO.default.get(B.REPLICATION_FAILOVER)===!1)return;let d=f.nodes[0];if(!(d.replicates===!0||d.replicates?.sends||d.subscriptions?.length))return;let h=d.shard,_=(l+1)%c.length;for(;l!==_;){let p=c[_],S=Mu.get(p);u=Mi.get(S.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==h){_=(_+1)%c.length;continue}let{worker:R,nodes:E}=g,T=!1;for(let O of f.nodes){if(E.some(v=>v.name===O.name)){nt.info(`Disconnected node is already failing over to ${p} for ${i.database}`);continue}O.end_time<Date.now()||(E.push(O),T=!0)}if(f.nodes=[f.nodes[0]],!T){nt.info(`Disconnected node ${i.name} has no nodes to fail over to ${p}`);return}nt.info(`Failing over ${i.database} from ${i.name} to ${p}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:E}):G_({database:i.database,nodes:E});return}nt.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){nt.error("Error failing over node",o)}},"disconnectedFromNode"),el=a(function(i){let o=Mi.get(i.url),c=o?.get(i.database);if(!c){nt.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){nt.info("Connected node has no nodes",i.database,c);return}if(!l.name){nt.debug("Connected node is not named yet",i.database,c);return}c.nodes=[l];let u=!1;for(let f of Mi.values()){let d=f.get(i.database);if(!d||d==c)continue;let{worker:h,nodes:_,connected:p}=d;if(_)if(p===!1&&_[0].shard===l.shard)u=!0,c.nodes.push(_[0]);else{let S=_.filter(g=>g.name!==l.name);S.length<_.length&&(d.nodes=S,h.postMessage({type:"subscribe-to-node",database:i.database,nodes:_}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,vi.onMessageByType)("disconnected-from-node",vu),(0,vi.onMessageByType)("connected-to-node",el),(0,vi.onMessageByType)("request-cluster-status",ZH)}function ZH(e,t){let r=[];for(let[n,s]of Mu)try{let i=Mi.get(s.url);nt.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let o=[];if(i){for(let[l,{worker:u,connected:f,nodes:d,latency:h}]of i)o.push({database:l,connected:f,latency:h,thread_id:u?.threadId,nodes:d.filter(_=>!(_.end_time<Date.now())).map(_=>_.name)});let c=(0,dO.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){nt.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Eo(e,t){let r=sr();e=e??Qs(t.url),t.name=e;try{if(t.ca){let s=new XH.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subject_alt_name:s.subjectAltName,serial_number:s.serialNumber,valid_from:s.validFrom,valid_to:s.validTo}}}catch(s){nt.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(nt.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!fO.default.get(B.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],o=(0,dO.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of o)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=[...o,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}nt.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var vi,zE,nt,dO,fO,XH,Hne,Mi,vu,el,Mu,WE,q_=be(()=>{Ue();vi=M(it());ms();zE=require("worker_threads");Zc();nt=M(X()),dO=require("lodash"),fO=M(ce());G();XH=require("crypto"),Hne=200,Mi=new Map,Mu=new Map,WE=new Map;a(_O,"startOnMainThread");a(ZH,"requestClusterStatus");zE.parentPort&&(vu=a(e=>{zE.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),el=a(e=>{zE.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,vi.onMessageByType)("subscribe-to-node",e=>{G_(e)}),(0,vi.onMessageByType)("unsubscribe-from-node",e=>{jE(e)}));a(Eo,"ensureNode")});var Zs=P(yk=>{"use strict";var ir=require("path"),{watch:kne}=require("chokidar"),An=require("fs-extra"),Uu=require("node-forge"),ok=require("net"),{generateKeyPair:pO,X509Certificate:go,createPrivateKey:ak}=require("crypto"),Fne=require("util");pO=Fne.promisify(pO);var yt=Uu.pki,Js=require("joi"),{v4:ck}=require("uuid"),{validateBySchema:SO}=st(),St=X(),zn=ce(),Es=(G(),D($)),{CONFIG_PARAMS:rl}=Es,Xs=SA(),{ClientError:Sa}=he(),QE=require("node:tls"),{relative:lk,join:Gne}=require("node:path"),{CERT_PREFERENCE_APP:Qwe,CERTIFICATE_VALUES:tk}=Xs,qne=uc(),mO=It(),{table:$ne,getDatabases:Vne,databases:hO}=(Ue(),D(ct)),{getJWTRSAKeys:rk}=(bu(),D(P_));Object.assign(yk,{generateKeys:RO,updateConfigCert:Ek,createCsr:Jne,signCertificate:Xne,setCertTable:xu,loadCertificates:hk,reviewSelfSignedCert:bO,createTLSSelector:Sk,listCertificates:Ak,addCertificate:sse,removeCertificate:ose,createNatsCerts:tse,generateCertsKeys:ese,getReplicationCert:V_,getReplicationCertAuth:Qne,renewSelfSigned:rse,hostnamesFromCert:OO,getKey:ase});var{urlToNodeName:uk,getThisNodeUrl:Kne,getThisNodeName:XE,clearThisNodeName:Yne}=(ms(),D(Ra)),{readFileSync:Wne,statSync:dk}=require("node:fs"),Jwe=ce(),{getTicketKeys:zne,onMessageFromWorkers:jne}=it(),ga=X(),{isMainThread:fk}=require("worker_threads"),{TLSSocket:_k,createSecureContext:Xwe}=require("node:tls"),TO=3650,$_=["127.0.0.1","localhost","::1"],AO=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];jne(async e=>{e.type===Es.ITC_EVENT_TYPES.RESTART&&(zn.initSync(!0),await bO())});var xr;function Aa(){return xr||(xr=Vne().system.hdb_certificate,xr||(xr=$ne({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__"}]}))),xr}a(Aa,"getCertTable");async function V_(){let e=Sk("operations-api"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(XE());if(!r)return;let n=new go(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(V_,"getReplicationCert");async function Qne(){Aa();let e=(await V_()).options.cert,r=new go(e).issuer.match(/CN=(.*)/)?.[1];return xr.get(r)}a(Qne,"getReplicationCertAuth");var nk,Ta=new Map;function hk(){if(nk)return;nk=!0;let e=[{configKey:rl.TLS},{configKey:rl.OPERATIONSAPI_TLS}];Aa();let t=ir.dirname(mO.getConfigFilePath()),r;for(let{configKey:n}of e){let s=mO.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&lk(Gne(t,"keys"),o);c&&sk(o,l=>{Ta.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&fk){let f;sk(u,d=>{if(tk.cert===d)return;let h=i.hostname??i.hostnames??i.host??i.hosts;h&&!Array.isArray(h)&&(h=[h]);let _=gk(u),p=new go(_),S;try{S=Rk(p)}catch(T){logger.error("error extracting host name from certificate",T);return}if(S==null){logger.error("No host name found on certificate");return}if(p.checkIssued(new go(tk.cert)))return;let g=xr.primaryStore.get(S),R=dk(u).mtimeMs,E=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&R<=E){R<E&&St.info(`Certificate ${S} at ${u} is older (${new Date(R)}) than the certificate in the database (${E>1?new Date(E):"only self signed certificate available"})`);return}r=xr.put({name:S,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:_,private_key_name:c,is_authority:l,hostnames:h,file_timestamp:R,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}a(hk,"loadCertificates");function sk(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&fk&&St.warn(`Reloading ${r}:`,i),n=c,t(gk(i)))}catch(c){St.error(`Error loading ${r}:`,i,c)}},"loadFile");An.existsSync(e)?s(e,dk(e)):St.error(`${r} file not found:`,e),kne(e,{persistent:!1}).on("change",s)}a(sk,"loadAndWatch");function EO(){let e=Kne();if(e==null){let t=$_[0];return St.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return uk(e)}a(EO,"getHost");function JE(){let e=XE();if(e==null){let t=$_[0];return St.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(JE,"getCommonName");async function Jne(){let e=await V_(),t=yt.certificateFromPem(e.options.cert),r=yt.privateKeyFromPem(e.options.key);St.info("Creating CSR with cert named:",e.name);let n=yt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:JE()},...AO];St.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:pk()}];return St.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Uu.pki.certificationRequestToPem(n)}a(Jne,"createCsr");function pk(){let e=$_.includes(JE())?$_:[...$_,JE()];return e.includes(EO())||e.push(EO()),[{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=>ok.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(pk,"certExtensions");async function Xne(e){let t={},r=ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Aa();for await(let f of xr.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if(Ta.has(f.private_key_name)){n=Ta.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await An.exists(ir.join(r,f.private_key_name))){n=An.readFile(ir.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await gO();s=f.ca,n=f.private_key}n=yt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=yt.certificateFromPem(s.certificate);St.info("Signing CSR with cert named",s.name);let o=yt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return St.error(f),new Error("Error verifying CSR: "+f.message)}let c=Uu.pki.createCertificate();c.serialNumber=Math.random().toString().slice(2,10),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+TO),St.info("sign cert setting validity:",c.validity),St.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),St.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;St.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,Uu.md.sha256.create()),t.certificate=yt.certificateToPem(c)}else St.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(Xne,"signCertificate");async function Zne(e,t){await xu({name:XE(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await xu({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:yt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}a(Zne,"createCertificateTable");async function xu(e){let t=new go(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},Aa(),await xr.patch(e)}a(xu,"setCertTable");async function RO(){let e=await pO("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{public_key:yt.publicKeyFromPem(e.publicKey),private_key:yt.privateKeyFromPem(e.privateKey)}}a(RO,"generateKeys");async function yO(e,t,r){let n=yt.createCertificate();if(!t){let o=await V_();t=yt.certificateFromPem(o.options.cert).publicKey}n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+TO);let i=[{name:"commonName",value:JE()},...AO];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(pk()),n.sign(e,Uu.md.sha256.create()),yt.certificateToPem(n)}a(yO,"generateCertificates");async function gO(){let e=await Ak(),t;for(let r of e){if(!r.is_authority)continue;let n=await Tk(r.private_key_name);if(r.private_key_name&&n&&new go(r.certificate).checkPrivateKey(ak(n))){St.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;St.trace("No CA found with matching private key")}a(gO,"getCertAuthority");async function mk(e,t,r=!0){let n=yt.createCertificate();n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+TO);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${zn.get(rl.REPLICATION_HOSTNAME)??uk(zn.get(rl.REPLICATION_URL))??ck().split("-")[0]}`},...AO];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Uu.md.sha256.create());let o=ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=ir.join(o,Xs.PRIVATEKEY_PEM_NAME);return r&&await An.writeFile(c,yt.privateKeyToPem(e)),n}a(mk,"generateCertAuthority");async function ese(){let{private_key:e,public_key:t}=await RO(),r=await mk(e,t),n=await yO(e,t,r);await Zne(n,r),Ek()}a(ese,"generateCertsKeys");async function tse(){let e=await yO(yt.privateKeyFromPem(Xs.CERTIFICATE_VALUES.key),void 0,yt.certificateFromPem(Xs.CERTIFICATE_VALUES.cert)),t=ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=ir.join(t,Xs.NATS_CERTIFICATE_PEM_NAME);await An.exists(r)||await An.writeFile(r,e);let n=ir.join(t,Xs.NATS_CA_PEM_NAME);await An.exists(n)||await An.writeFile(n,Xs.CERTIFICATE_VALUES.cert)}a(tse,"createNatsCerts");async function rse(){Aa();for await(let e of xr.search([{attribute:"is_self_signed",value:!0}]))await xr.delete(e.name);await bO()}a(rse,"renewSelfSigned");async function bO(){Yne(),await hk(),Aa();let e=await gO();if(!e){St.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=a(u=>{try{return{key:yt.privateKeyFromPem(An.readFileSync(u)),keyPath:u}}catch(f){return St.warn(`Failed to parse private key from ${u}:`,f.message),{key:null,keyPath:u}}},"tryToParseKey"),n=zn.get(rl.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let f=r(u.privateKey);if(s=f.key,i=f.keyPath,f.key)break}}else{let u=zn.get(rl.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=lk(o,i);s||(St.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{private_key:s}=await RO(),An.existsSync(ir.join(o,Xs.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${ck().split("-")[0]}.pem`),await An.writeFile(ir.join(o,c),yt.privateKeyToPem(s)));let l=await mk(s,yt.setRsaPublicKey(s.n,s.e),!1);await xu({name:l.subject.getField("CN").value,uses:["https"],certificate:yt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await V_()){let r=XE();St.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await gO();let n=yt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await yO(yt.privateKeyFromPem(e.private_key),s,n);await xu({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(bO,"reviewSelfSignedCert");function Ek(){let e=qne(Object.keys(Es.CONFIG_PARAM_MAP),!0),t=ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=ir.join(t,Xs.PRIVATEKEY_PEM_NAME),n=ir.join(t,Xs.NATS_CERTIFICATE_PEM_NAME),s=ir.join(t,Xs.NATS_CA_PEM_NAME),i=Es.CONFIG_PARAMS,o={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(o[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(o[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,o[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,o[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),mO.updateConfigValue(void 0,void 0,o,!1,!0)}a(Ek,"updateConfigCert");function gk(e){return e.startsWith("-----BEGIN")?e:Wne(e,"utf8")}a(gk,"readPEM");var ik=QE.createSecureContext;QE.createSecureContext=function(e){if(!e.cert||!e.key)return ik(e);let t={...e};delete t.key,delete t.cert;let r=ik(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var nse=_k.prototype._init;_k.prototype._init=function(e,t){nse.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,o)=>{this.sni_context=o?.context||o,this.certCbDone()})}};var tl=new Map;function Sk(e,t){let r=new Map,n,s=!1;return i.initialize=o=>i.ready?i.ready:(o&&(o.secureContexts=r,o.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),tl.clear();let f=0;for await(let d of hO.system.hdb_certificate.search([])){let h=d.certificate,_=new go(h);d.is_authority&&(_.asString=h,tl.set(_.subject,h))}for await(let d of hO.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let h=e==="operations-api",_=d.is_self_signed?1:2;h&&d.uses?.includes?.("operations")&&(_+=1);let p=await Tk(d.private_key_name),S=d.certificate,g=new go(S);if(tl.has(g.issuer)&&(S+=`
23
+ `+tl.get(g.issuer)),!p||!S)throw new Error("Missing private key or certificate for secure server");let R={ciphers:d.ciphers,ticketKeys:zne(),availableCAs:tl,ca:t&&Array.from(tl.values()),cert:S,key:p,key_file:d.private_key_name,is_self_signed:d.is_self_signed};o&&(R.sessionIdContext=o.sessionIdContext);let E=QE.createSecureContext(R);E.name=d.name,E.options=R,E.quality=_,E.certificateAuthorities=Array.from(tl),E.certStart=S.toString().slice(0,100);let T=d.hostnames??OO(g);Array.isArray(T)||(T=[T]);let O;for(let v of T)if(v){v[0]==="*"&&(s=!0,v=v.slice(1)),v===EO()&&(_+=2),ok.isIP(v)&&(O=!0);let F=r.get(v)?.quality??0;_>F&&r.set(v,E)}else ga.error("No hostname found for certificate at",QE.certificate);ga.trace("Adding TLS",E.name,"for",o.ports||"client","cert named",d.name,"hostnames",T,"quality",_,"best quality",f),_>f&&(i.defaultContext=n=E,f=_,o&&(o.defaultContext=E))}catch(h){ga.error("Error applying TLS for",d.name,h)}o?.secureContextsListeners.forEach(d=>d()),c(n)}catch(f){l(f)}}a(u,"updateTLS"),hO.system.hdb_certificate.subscribe({listener:a(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(o,c){ga.info("TLS requested for",o||"(no SNI)");let l=o;for(;;){let f=r.get(l);if(f)return ga.debug("Found certificate for",o,f.certStart),f.updatedContext&&(f=f.updatedContext),c(null,f);if(s&&l){let d=l.indexOf(".",1);d<0?l="":l=l.slice(d)}else break}o?ga.debug("No certificate found to match",o,"using the default certificate"):ga.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):ga.info("No default certificate found"),c(null,u)}a(i,"SNICallback")}a(Sk,"createTLSSelector");async function Tk(e){let t=Ta.get(e);return!t&&e?await An.readFile(ir.join(zn.get(rl.ROOTPATH),Es.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(Tk,"getPrivateKeyByName");async function Ak(){Aa();let e=[];for await(let t of xr.search([]))e.push(t);return e}a(Ak,"listCertificates");async function sse(e){let t=SO(e,Js.object({name:Js.string().required(),certificate:Js.string().required(),is_authority:Js.boolean().required(),private_key:Js.string(),hosts:Js.array(),uses:Js.array()}));if(t)throw new Sa(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,o=new go(n),c=!1,l=!1,u;for(let[_,p]of Ta)!s&&!c&&o.checkPrivateKey(ak(p))&&(c=!0,u=_),s&&s===p&&(l=!0,u=_);if(!i&&!s&&!c)throw new Sa("A suitable private key was not found for this certificate");let f;if(!r){try{f=Rk(o)}catch(_){St.error(_)}if(f==null)throw new Sa("Error extracting certificate common name, please provide a name parameter")}let d=ise(r??f);s&&!c&&!l&&(await An.writeFile(ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME,d+".pem"),s),Ta.set(d,s));let h={name:r??f,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(h.private_key_name=u??d+".pem"),e.ciphers&&(h.ciphers=e.ciphers),await xu(h),"Successfully added certificate: "+d}a(sse,"addCertificate");function ise(e){return e.replace(/[^a-z0-9\.]/gi,"-")}a(ise,"sanitizeName");async function ose(e){let t=SO(e,Js.object({name:Js.string().required()}));if(t)throw new Sa(t.message);let{name:r}=e;Aa();let n=await xr.get(r);if(!n)throw new Sa(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await xr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(St.info("Removing private key named",s),await An.remove(ir.join(zn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME,s)))}return await xr.delete(r),"Successfully removed "+r}a(ose,"removeCertificate");function Rk(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||OO(e)[0]}a(Rk,"getPrimaryHostName");function OO(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]:[]}a(OO,"hostnamesFromCert");async function ase(e){if(e.bypass_auth!==!0)throw new Sa("Unauthorized","401");let t=SO(e,Js.object({name:Js.string().required()}));if(t)throw new Sa(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await rk()).privateKey;if(r===".jwtPublic")return(await rk()).publicKey;if(Ta.get(r))return Ta.get(e.name);throw new Sa("Key not found")}a(ase,"getKey")});var Kk={};Be(Kk,{CONFIRMATION_STATUS_POSITION:()=>qk,NodeReplicationConnection:()=>Hu,OPERATION_REQUEST:()=>CO,RECEIVED_TIME_POSITION:()=>DO,RECEIVED_VERSION_POSITION:()=>PO,RECEIVING_STATUS_POSITION:()=>LO,RECEIVING_STATUS_RECEIVING:()=>Vk,RECEIVING_STATUS_WAITING:()=>$k,SENDING_TIME_POSITION:()=>K_,createWebSocket:()=>og,database_subscriptions:()=>ba,replicateOverWS:()=>Y_,table_update_listeners:()=>vO});async function og(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=tt(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!wO){let l=(0,Hk.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),wO=u.secureContexts}if(i=wO.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 o={};r&&(o.Authorization=r);let c={headers:o,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,Fk.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(sg?.caCount!==So.size&&(sg=kk.createSecureContext({...i.options,ca:[...So,...i.options.availableCAs.values()]}),sg.caCount=So.size),c.secureContext=sg),new xk.WebSocket(e,"harperdb-replication-v1",c)}function Y_(e,t,r){let n=t.port||t.securePort,s=nl.pid%1e3+"-"+Bk.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3),i=0,o=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(o.buffer,0,1024),u=t.database,f=t.databaseSubscriptions||ba,d,h,_=!1,p=t.subscription;p?.then&&p.then(A=>p=A);let S=t.tables||u&&Ze()[u];if(!r){ae.error?.("No authorization provided"),sn(1008,"Unauthorized");return}let g=new Map,R=[],E=r.name;E&&t.connection&&(t.connection.nodeName=E);let T,O,v,F,q,j,te,se=6e4,z,ne=0,le=0,ie=0,Re=Uk.default.get(B.REPLICATION_BLOBTIMEOUT)??12e4,pe=new Map,Ae=[],Bt=0,dt;if(t.url){let A=a(()=>{q&&le===e._socket?.bytesRead&&ie===e._socket?.bytesWritten?e.terminate():(q=performance.now(),e.ping(),le=e._socket?.bytesRead,ie=e._socket?.bytesWritten)},"send_ping");v=setInterval(A,Mk).unref(),A()}else Cn();e._socket?.setMaxListeners(200);function Cn(){clearTimeout(F),le=e._socket?.bytesRead,ie=e._socket?.bytesWritten,F=setTimeout(()=>{le===e._socket?.bytesRead&&ie===e._socket?.bytesWritten&&(ae.warn?.(`Timeout waiting for ping from ${E}, terminating connection and reconnecting`),e.terminate())},Mk*2).unref()}a(Cn,"resetPingTimer");function nn(){return h||(h=YE(d,u,E)),h}a(nn,"getSharedStatus"),u&&zo(u);let wr,Fd,nc=[],WT=[],zT,Ht=[],Gd=[],qd=[],jT=150,Sp=25,$d=0,De=0,Vd=!1,Wi,Ir,Pn,sc;e.on("message",A=>{ne=performance.now();try{let w=A.dataView=new sl(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let N=(0,et.decode)(A),[H,U,Q]=N;switch(H){case Ok:{if(U){if(E){if(E!==U){ae.error?.(s,`Node name mismatch, expecting to connect to ${E}, but peer reported name as ${U}, disconnecting`),e.send((0,et.encode)([Bu])),sn(1008,"Node name mismatch");return}}else if(E=U,t.connection?.tentativeNode){let Y=t.connection.tentativeNode;Y.name=E,t.connection.tentativeNode=null,Eo(E,Y)}if(t.connection&&(t.connection.nodeName=E),ae.debug?.(s,"received node name:",E,"db:",u),!u)try{zo(u=N[2]),u==="system"&&(wr=ma(t,(Y,V)=>{Wo(V)&&Wd(V)}),e.on("close",()=>{wr?.remove()}))}catch(Y){ae.warn?.(s,"Error setting database",Y),e.send((0,et.encode)([Bu])),sn(1008,Y.message);return}Yo()}break}case Dk:{ae.debug?.(s,"Received table definitions for",U.map(Y=>Y.table));for(let Y of U){let V=N[2];Y.database=V;let ue;Wo(V)&&(V==="system"?Ye[V]?.[Y.table]||(ue=C(Y,Ye[V]?.[Y.table])):ue=C(Y,Ye[V]?.[Y.table]),d||(d=ue?.auditStore),S||(S=Ze()?.[V]))}break}case Bu:sn();break;case CO:try{let Y=r?.replicates||r?.subscribers||r?.name;server.operation(U,{user:r},!Y).then(V=>{Array.isArray(V)&&(V={results:V}),V.requestId=U.requestId,e.send((0,et.encode)([eg,V]))},V=>{e.send((0,et.encode)([eg,{requestId:U.requestId,error:V instanceof Error?V.toString():V}]))})}catch(Y){e.send((0,et.encode)([eg,{requestId:U.requestId,error:Y instanceof Error?Y.toString():Y}]))}break;case eg:let{resolve:J,reject:k}=g.get(U.requestId);U.error?k(new Error(U.error)):J(U),g.delete(U.requestId);break;case NO:let Ce=N[3];S||(u?ae.error?.(s,"No tables found for",u):ae.error?.(s,"Database name never received"));let de=S[Ce];de=C({table:Ce,database:u,attributes:U.attributes,schemaDefined:U.schemaDefined},de),nc[Q]={name:Ce,decoder:new et.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:U.typedStructs,structures:U.structures}),getEntry(Y){return de.primaryStore.getEntry(Y)},rootStore:de.primaryStore.rootStore};break;case Nk:sc=d?YH(U,d):new Map,zT=N[2],ae.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${zT}`);break;case wk:let ye=Q;qd[ye]=U;break;case Pk:nn()[qk]=U,ae.trace?.(s,"received and broadcasting committed update",U),nn().buffer.notify();break;case Ck:T=U,p.send({type:"end_txn",localTime:T,remoteNodeIds:R});break;case tg:{let Y=N[1],{fileId:V,size:ue,finished:_e,error:me}=Y,Te=pe.get(V);ae.debug?.("Received blob",V,"has stream",!!Te,"connectedToBlob",!!Te?.connectedToBlob,"length",N[2].length,"finished",_e),Te||(Te=new IO.PassThrough,Te.expectedSize=ue,pe.set(V,Te)),Te.lastChunk=Date.now();let Pe=N[2];Lt(Pe.byteLength,"bytes-received",`${E}.${u}`,"replication","blob");try{_e?(me?(Te.on("error",()=>{}),Te.destroy(new Error("Blob error: "+me+" for record "+(Te.recordId??"unknown")+" from "+E))):Te.end(Pe),Te.connectedToBlob&&pe.delete(V)):Te.write(Pe)}catch(Ve){ae.error?.(`Error receiving blob for ${Te.recordId} from ${E} and streaming to storage`,Ve),pe.delete(V)}break}case Ik:{let Y=U,V;try{let ue=N[3],_e=WT[Q]||(WT[Q]=S[N[4]]);if(!_e)return ae.warn?.("Unknown table id trying to handle record request",Q);let me=_e.primaryStore.getBinaryFast(Symbol.for("structures")),Te=me?.length;if(Te>0&&Te!==De){De=Te;let Ve=(0,et.decode)(me);e.send((0,et.encode)([NO,{typedStructs:Ve.typed,structures:Ve.named},Q,_e.tableName]))}let Pe=_e.primaryStore.getBinaryFast(ue);if(Pe){let Ve=_e.primaryStore.decoder.decode(Pe,{valueAsBuffer:!0}),We=Ve.value;Ve[bc]&pn&&(We=Buffer.from(We),Nf(()=>_e.primaryStore.decoder.decode(Pe),Dn=>ic(Dn,ue),_e.primaryStore.rootStore)),V=(0,et.encode)([ZE,Y,{value:We,expiresAt:Ve.expiresAt,version:Ve.version,residencyId:Ve.residencyId,nodeId:Ve.nodeId,user:Ve.user}])}else V=(0,et.encode)([ZE,Y])}catch(ue){V=(0,et.encode)([ZE,Y,{error:ue.message}])}e.send(V);break}case ZE:{let{resolve:Y,reject:V,tableId:ue,key:_e}=g.get(N[1]),me=N[2];if(me?.error)V(new Error(me.error));else if(me){let Te;fm(()=>{let Pe=nc[ue].decoder.decode(me.value);me.value=Pe,me.key=_e,Y(me)||Te&&setTimeout(()=>Te.forEach(lm),6e4).unref()},Pe=>{let Ve=Kd(Pe,_e);return Te||(Te=[]),Te.push(Ve),Ve})}else Y();g.delete(N[1]);break}case bk:{Pn=U;let Y,V,ue=!1;if(p){if(u!==p.databaseName&&!p.then){ae.error?.("Subscription request for wrong database",u,p.databaseName);return}}else p=f.get(u);if(ae.debug?.(s,"received subscription request for",u,"at",Pn),!p){let we;p=new Promise(kt=>{ae.debug?.("Waiting for subscription to database "+u),we=kt}),p.ready=we,ba.set(u,p)}if(r.name)V=sr().subscribe(r.name),V.then(async we=>{Y=we;for await(let kt of Y){let Ot=kt.value;if(!(Ot?.replicates===!0||Ot?.replicates?.receives||Ot?.subscriptions?.some(Rr=>(Rr.database||Rr.schema)===u&&Rr.publish!==!1))){ue=!0,e.send((0,et.encode)([Bu])),sn(1008,`Unauthorized database subscription to ${u}`);return}}},we=>{ae.error?.(s,"Error subscribing to HDB nodes",we)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,et.encode)([Bu])),sn(1008,`Unauthorized database subscription to ${u}`);return}if(Ir&&(ae.debug?.(s,"stopping previous subscription",u),Ir.emit("close")),Pn.length===0)return;let _e=Pn[0],me=a(we=>{if(we&&(_e.replicateByDefault?!_e.tables.includes(we.tableName):_e.tables.includes(we.tableName)))return{table:we}},"tableToTableEntry"),Te={txnTime:0},Pe,Ve,We=1/0,Dn,os=a((we,kt)=>{if(we.type==="end_txn"){Te.txnTime&&(o[i]!==66&&ae.error?.("Invalid encoding of message"),K(9),K(ig),y(Dn=kt),Ap()),i=c,Te.txnTime=0;return}let Ot=we.nodeId,Rr=we.tableId,At=Ve[Rr];if(!At&&(At=Ve[Rr]=me(p.tableById[Rr]),!At))return ae.debug?.("Not subscribed to table",Rr);let as=At.table,Nt=as.primaryStore,vs=Nt.encoder;(we.extendedType&Am||!vs.typedStructs)&&(vs._mergeStructures(vs.getStructures()),vs.typedStructs&&(vs.lastTypedStructuresLength=vs.typedStructs.length));let Fl=Pe[Ot];if(!(Fl&&Fl.startTime<kt&&(!Fl.endTime||Fl.endTime>kt)))return ng&&ae.trace?.(s,"skipping replication update",we.recordId,"to:",E,"from:",Ot,"subscribed:",Pe),iP();ng&&ae.trace?.(s,"sending replication update",we.recordId,"to:",E,"from:",Ot,"subscribed:",Pe);let QT=we.version;Te.txnTime!==QT&&(Te.txnTime&&(ng&&ae.trace?.(s,"new txn time, sending queued txn",Te.txnTime),o[i]!==66&&ae.error?.("Invalid encoding of message"),Ap()),Te.txnTime=QT,i=c,y(QT));let cc=we.residencyId,JT=Yd(cc,as),Rp;if(JT&&!JT.includes(E)){let Us=Yd(we.previousResidencyId,as);if(Us&&!Us.includes(E)&&(we.type==="put"||we.type==="patch")||as.getResidencyById)return iP();let zd=we.recordId;ae.trace?.(s,"sending invalidation",zd,E,"from",Ot);let jd=0;cc&&(jd|=wc),we.previousResidencyId&&(jd|=Ic);let eA,yp=null;for(let oP in as.indices){if(!yp){if(eA=we.getValue(Nt,!0),!eA)break;yp={}}yp[oP]=eA[oP]}Rp=Oc(we.version,Rr,zd,null,Ot,we.user,we.type==="put"||we.type==="patch"?"invalidate":we.type,vs.encode(yp),jd,cc,we.previousResidencyId,we.expiresAt)}function iP(){return ae.trace?.(s,"skipping audit record",we.recordId),j||(j=setTimeout(()=>{j=null,(Dn||0)+Lk/2<We&&(ng&&ae.trace?.(s,"sending skipped sequence update",We),e.send((0,et.encode)([Ck,We])))},Lk).unref()),new Promise(setImmediate)}a(iP,"skipAuditRecord");let XT=vs.typedStructs,ZT=vs.structures;if((XT?.length!=At.typed_length||ZT?.length!=At.structure_length)&&(At.typed_length=XT?.length,At.structure_length=ZT.length,ae.debug?.(s,"send table struct",At.typed_length,At.structure_length),At.sentName||(At.sentName=!0),e.send((0,et.encode)([NO,{typedStructs:XT,structures:ZT,attributes:as.attributes,schemaDefined:as.schemaDefined},Rr,At.table.tableName]))),cc&&!Gd[cc]&&(e.send((0,et.encode)([wk,JT,cc])),Gd[cc]=!0),Rp)K(Rp.length),m(Rp);else{let Us=we.encoded;we.extendedType&pn&&Nf(()=>we.getValue(Nt),jd=>ic(jd,we.recordId),Nt.rootStore);let zd=Us[0]===66?8:0;K(Us.length-zd),m(Us,zd),ae.trace?.("wrote record",we.recordId,"length:",Us.length)}return e._socket.writableNeedDrain?new Promise(Us=>{ae.debug?.(`Waiting for remote node ${E} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Us)}):Bt>Sp?new Promise(Us=>{dt=Us}):new Promise(setImmediate)},"sendAuditRecord"),Ap=a(()=>{c-i>8?(e.send(o.subarray(i,c)),ae.debug?.(s,"Sent message, size:",c-i),Lt(c-i,"bytes-sent",`${E}.${u}`,"replication","egress")):ae.debug?.(s,"skipping empty transaction")},"sendQueuedData");Ir=new MO.EventEmitter,Ir.once("close",()=>{ue=!0,Y?.end()});for(let{startTime:we}of Pn)we<We&&(We=we);(V||Promise.resolve()).then(async()=>{p=await p,d=p.auditStore,Ve=p.tableById.map(me),Pe=[];for(let{name:kt,startTime:Ot,endTime:Rr}of Pn){let At=KE(kt,d);ae.debug?.("subscription to",kt,"using local id",At,"starting",Ot),Pe[At]={startTime:Ot,endTime:Rr}}Wd(u),wr||(wr=il(kt=>{kt.databaseName===u&&Wd(u)}),Fd=W_(kt=>{kt===u&&(e.send((0,et.encode)([Bu])),sn())}),e.on("close",()=>{wr?.remove(),Fd?.remove()})),e.send((0,et.encode)([Nk,B_(p.auditStore),Pn.map(({name:kt})=>kt)]));let we=!0;do{isFinite(We)||(ae.warn?.("Invalid sequence id "+We),sn(1008,"Invalid sequence id"+We));let kt;if(we&&!ue&&(we=!1,We===0)){let Ot=We,Rr=ag(d);for(let At in S){if(!me(At))continue;let as=S[At];ae.warn?.(`Fully copying ${At} table to ${E}`);for(let Nt of as.primaryStore.getRange({snapshot:!1,versions:!0})){if(ue)return;if(Nt.localTime>=We){ae.trace?.(s,"Copying record from",u,At,Nt.key,Nt.localTime),Ot=Math.max(Nt.localTime,Ot),kt=!0,nn()[K_]=1;let vs=Oc(Nt.version,as.tableId,Nt.key,null,Rr,null,"put",Nf(()=>as.primaryStore.encoder.encode(Nt.value),Fl=>ic(Fl,Nt.key)),Nt.metadataFlags&-256,Nt.residencyId,null,Nt.expiresAt);await os({recordId:Nt.key,tableId:as.tableId,type:"put",getValue(){return Nt.value},encoded:vs,version:Nt.version,residencyId:Nt.residencyId,nodeId:Rr,extendedType:Nt.metadataFlags},Nt.localTime)}}}kt&&os({type:"end_txn"},We),nn()[K_]=0,We=Ot}for(let{key:Ot,value:Rr}of d.getRange({start:We||1,exclusiveStart:!0,snapshot:!1})){if(ue)return;let At=Pt(Rr);ae.debug?.("sending audit record",new Date(Ot)),nn()[K_]=Ot,We=Ot,await os(At,Ot),Ir.startTime=Ot,kt=!0}kt&&os({type:"end_txn"},We),nn()[K_]=0,await Yk(d)}while(!ue)}).catch(we=>{ae.error?.(s,"Error handling subscription to node",we),sn(1008,"Error handling subscription to node")});break}}return}w.position=8;let b=!0,I,x;do{nn();let N=w.readInt();if(N===9&&w.getUint8(w.position)==ig){w.position++,T=x=w.readFloat64(),h[PO]=T,h[DO]=Date.now(),h[LO]=$k,ae.trace?.("received remote sequence update",T,u);break}let H=w.position,U=Pt(A,H,H+N),Q=nc[U.tableId];Q||ae.error?.(`No table found with an id of ${U.tableId}`);let J;U.residencyId&&(J=qd[U.residencyId],ae.trace?.(s,"received residency list",J,U.type,U.recordId));try{let k=U.recordId;fm(()=>{I={table:Q.name,id:k,type:U.type,nodeId:sc.get(U.nodeId),residencyList:J,timestamp:U.version,value:U.getValue(Q),user:U.user,beginTxn:b,expiresAt:U.expiresAt}},Ce=>Kd(Ce,k))}catch(k){throw k.message+="typed structures for current decoder"+JSON.stringify(Q.decoder.typedStructs),k}b=!1,ae.trace?.(s,"received replication message",U.type,"id",I.id,"version",new Date(U.version),"nodeId",I.nodeId),h[PO]=U.version,h[DO]=Date.now(),h[LO]=Vk,p.send(I),w.position=H+N}while(w.position<A.byteLength);$d++,Lt(A.byteLength,"bytes-received",`${E}.${u}.${I?.table||"unknown_table"}`,"replication","ingest"),$d>jT&&!Vd&&(Vd=!0,e.pause(),ae.debug?.(`Commit backlog causing replication back-pressure, requesting that ${E} pause replication`)),p.send({type:"end_txn",localTime:T,remoteNodeIds:R,async onCommit(){if(I){let N=Date.now()-I.timestamp;Lt(N,"replication-latency",E+"."+u+"."+I.table,I.type,"ingest")}$d--,Vd&&(Vd=!1,e.resume(),ae.debug?.(`Replication resuming ${E}`)),Ae.length>0&&await Promise.all(Ae),ae.trace?.("All blobs finished"),!O&&x&&(ae.trace?.(s,"queuing confirmation of a commit at",x),setTimeout(()=>{e.send((0,et.encode)([Pk,O])),ae.trace?.(s,"sent confirmation of a commit at",O),O=null},lse)),O=x,ae.debug?.("last sequence committed",new Date(x),u)}})}catch(w){ae.error?.(s,"Error handling incoming replication message",w)}}),e.on("ping",Cn),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-q,t.isSubscriptionConnection&&el({name:E,database:u,url:t.url,latency:t.connection.latency})),q=null}),e.on("close",(A,w)=>{clearInterval(v),clearTimeout(F),clearInterval(te),Ir&&Ir.emit("close"),Wi&&Wi.end();for(let[b,{reject:I}]of g)I(new Error(`Connection closed ${w?.toString()} ${A}`));ae.debug?.(s,"closed",A,w?.toString())});function sn(A,w){e.isFinished=!0,e.close(A,w),t.connection?.emit("finished")}a(sn,"close");let Cr=new Set;async function ic(A,w){let b=um(A);if(Cr.has(b)){ae.debug?.("Blob already being sent",b);return}Cr.add(b);try{let I;Bt++;for await(let x of A.stream())I&&(ae.debug?.("Sending blob chunk",b,"length",I.length),e.send((0,et.encode)([tg,{fileId:b,size:A.size},I]))),I=x,e._socket.writableNeedDrain&&(ae.debug?.("draining",b),await new Promise(N=>e._socket.once("drain",N)),ae.debug?.("drained",b)),Lt(x.length,"bytes-sent",`${E}.${u}`,"replication","blob");ae.debug?.("Sending final blob chunk",b,"length",I.length),e.send((0,et.encode)([tg,{fileId:b,size:A.size,finished:!0},I]))}catch(I){ae.warn?.("Error sending blob",I,"blob id",b,"for record",w),e.send((0,et.encode)([tg,{fileId:b,finished:!0,error:I.toString()},Buffer.alloc(0)]))}finally{Cr.delete(b),Bt--,Bt<Sp&&dt?.()}}a(ic,"sendBlobs");function Kd(A,w){let b=um(A),I=pe.get(b);ae.debug?.("Received transaction for record",w,"with blob",b,"has stream",!!I,"ended",!!I?.writableEnded),I?I.writableEnded&&pe.delete(b):(I=new IO.PassThrough,pe.set(b,I)),I.connectedToBlob=!0,I.lastChunk=Date.now(),I.recordId=w,A.size===void 0&&I.expectedSize&&(A.size=I.expectedSize);let x=I.blob??createBlob(I,A);I.blob=x;let N=x.save({primaryStore:p.auditStore});return N&&(N.blobId=b,Ae.push(N),N.finally(()=>{ae.debug?.(`Finished receiving blob stream ${b}`),Ae.splice(Ae.indexOf(N),1)})),x}a(Kd,"receiveBlobs");function Yo(){if(_||(_=!0,t.connection?.on("subscriptions-updated",Yo)),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let A=new Map;d||(d=p?.auditStore);try{for(let I of p?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let x of I.value.nodes||[])x.lastTxnTime>(A.get(x.id)??0)&&A.set(x.id,x.lastTxnTime)}catch(I){if(!I.message.includes("Can not re"))throw I}let w=t.connection?.nodeSubscriptions?.[0];R=[];let b=t.connection?.nodeSubscriptions?.map((I,x)=>{let N=[],{replicateByDefault:H}=I;if(I.subscriptions){for(let k of I.subscriptions)if(k.subscribe&&(k.schema||k.database)===u){let Ce=k.table;S?.[Ce]?.replicate!==!1&&N.push(Ce)}H=!1}else for(let k in S)(H?S[k].replicate===!1:S[k].replicate)&&N.push(k);let U=d&&KE(I.name,d),Q=p?.dbisDB?.get([Symbol.for("seq"),U])??1,J=Math.max(Q?.seqId??1,(typeof I.start_time=="string"?new Date(I.start_time).getTime():I.start_time)??1);if(ae.debug?.("Starting time recorded in db",I.name,U,u,Q?.seqId,"start time:",J,new Date(J)),w!==I){let k=d&&KE(w.name,d),Ce=p?.dbisDB?.get([Symbol.for("seq"),k])??1;for(let de of Ce?.nodes||[])de.name===I.name&&(J=de.seqId,ae.debug?.("Using sequence id from proxy node",w.name,J))}if(U===void 0?ae.warn("Starting subscription request from node",I,"but no node id found"):R.push(U),A.get(U)>J&&(J=A.get(U),ae.debug?.("Updating start time from more recent txn recorded",w.name,J)),J===1&&rg)try{new URL(rg).hostname===I.name&&E===I.name?(ae.warn?.(`Requesting full copy of database ${u} from ${rg}`),J=0):J=Date.now()-6e4}catch(k){ae.error?.("Error parsing leader URL",rg,k)}return ae.trace?.(s,"defining subscription request",I.name,u,new Date(J)),{name:I.name,replicateByDefault:H,tables:N,startTime:J,endTime:I.end_time}});if(b)if(ae.debug?.(s,"sending subscription request",b,p?.dbisDB?.path),clearTimeout(z),b.length>0)e.send((0,et.encode)([bk,b]));else{let I=a(()=>{let x=performance.now();z=setTimeout(()=>{ne<=x?sn(1008,"Connection has no subscriptions and is no longer used"):I()},se).unref()},"schedule_close");I()}}a(Yo,"sendSubscriptionRequestUpdate");function Yd(A,w){if(!A)return;let b=Ht[A];return b||(b=w.getResidencyRecord(A),Ht[A]=b),b}a(Yd,"getResidence");function Wo(A){return!(ya&&ya!="*"&&!ya[A]&&!ya.includes?.(A)&&!ya.some?.(w=>w.name===A))}a(Wo,"checkDatabaseAccess");function zo(A){if(p=p||f.get(A),!Wo(A))throw new Error(`Access to database "${A}" is not permitted`);p||ae.warn?.(`No database named "${A}" was declared and registered`),d=p?.auditStore,S||(S=Ze()?.[A]);let w=tt();if(w===E)throw w?new Error("Should not connect to self",w):new Error("Node name not defined");return Tp(w,A),!0}a(zo,"setDatabase");function Tp(A,w){let b=Ze()?.[w],I=[];for(let x in b){let N=b[x];I.push({table:x,schemaDefined:N.schemaDefined,attributes:N.attributes.map(H=>({name:H.name,type:H.type,isPrimaryKey:H.isPrimaryKey}))})}ae.trace?.("Sending database info for node",A,"database name",w),e.send((0,et.encode)([Ok,A,w,I]))}a(Tp,"sendNodeDBName");function Wd(A){let w=Ze()?.[A],b=[];for(let I in w){if(Pn&&!Pn.some(N=>N.replicateByDefault?!N.tables.includes(I):N.tables.includes(I)))continue;let x=w[I];b.push({table:I,schemaDefined:x.schemaDefined,attributes:x.attributes.map(N=>({name:N.name,type:N.type,isPrimaryKey:N.isPrimaryKey}))})}e.send((0,et.encode)([Dk,b,A]))}a(Wd,"sendDBSchema"),te=setInterval(()=>{for(let[A,w]of pe)w.lastChunk+Re<Date.now()&&(ae.warn?.(`Timeout waiting for blob stream to finish ${A} for record ${w.recordId??"unknown"} from ${E}`),pe.delete(A),w.end())},Re).unref();let oc=1,ac=[];return{end(){Wi&&Wi.end(),Ir&&Ir.emit("close")},getRecord(A){let w=oc++;return new Promise((b,I)=>{let x=[Ik,w,A.table.tableId,A.id];ac[A.table.tableId]||(x.push(A.table.tableName),ac[A.table.tableId]=!0),e.send((0,et.encode)(x)),ne=performance.now(),g.set(w,{tableId:A.table.tableId,key:A.id,resolve(N){let{table:H,entry:U}=A;if(b(N),N)return H._recordRelocate(U,N)},reject:I})})},sendOperation(A){let w=oc++;return A.requestId=w,e.send((0,et.encode)([CO,A])),new Promise((b,I)=>{g.set(w,{resolve:b,reject:I})})}};function K(A){L(5),A<128?o[c++]=A:A<16384?(l.setUint16(c,A|32768),c+=2):A<1056964608?(l.setUint32(c,A|3221225472),c+=4):(o[c]=255,l.setUint32(c+1,A),c+=5)}function m(A,w=0,b=A.length){let I=b-w;L(I),A.copy(o,c,w,b),c+=I}function y(A){L(8),l.setFloat64(c,A),c+=8}function L(A){if(A+16>o.length-c){let w=Buffer.allocUnsafeSlow(c+A-i+65536>>10<<11);o.copy(w,0,i,c),c=c-i,i=0,o=w,l=new DataView(o.buffer,0,o.length)}}function C(A,w){let b=A.database??"data";if(b!=="data"&&!Ye[b]){ae.warn?.("Database not found",A.database);return}w||(w={});let I=w.schemaDefined,x=!1,N=A.schemaDefined,H=w.attributes||[];for(let U=0;U<A.attributes?.length;U++){let Q=A.attributes[U],J=H.find(k=>k.name===Q.name);(!J||J.type!==Q.type)&&(I?ae.error?.(`Schema for '${u}.${A.table}' is defined locally, but attribute '${Q.name}: ${Q.type}' from '${E}' does not match local attribute ${J?"'"+J.name+": "+J.type+"'":"which does not exist"}`):(x=!0,N||(Q.indexed=!0),J?H[H.indexOf(J)]=Q:H.push(Q)))}return x?(ae.debug?.("(Re)creating",A),_t({table:A.table,database:A.database,schemaDefined:A.schemaDefined,attributes:H,...w})):w}}var Uk,et,xk,Bk,ae,MO,Hk,kk,nl,Fk,IO,Gk,bk,Ok,Nk,Bu,wk,NO,Ik,ZE,CO,eg,Ck,Pk,Dk,tg,qk,PO,DO,K_,LO,$k,Vk,cse,rg,vO,ba,ng,Lk,lse,Mk,wO,sg,vk,Hu,UO=be(()=>{Ue();so();lO();xO();ms();Uk=M(ce());G();nu();et=require("msgpackr"),xk=require("ws"),Bk=require("worker_threads"),ae=M(mi());q_();MO=require("events"),Hk=M(Zs()),kk=M(require("node:tls"));Zc();nl=M(require("node:process")),Fk=require("node:net");Ci();_s();IO=require("node:stream"),Gk=M(require("minimist")),bk=129,Ok=140,Nk=141,Bu=142,wk=130,NO=132,Ik=133,ZE=134,CO=136,eg=137,Ck=143,Pk=144,Dk=145,tg=146,qk=0,PO=1,DO=2,K_=3,LO=4,$k=0,Vk=1,cse=(0,Gk.default)(nl.argv),rg=cse.HDB_LEADER_URL??nl.env.HDB_LEADER_URL,vO=new Map,ba=new Map,ng=!0,Lk=300,lse=2,Mk=3e4;a(og,"createWebSocket");vk=500,Hu=class extends MO.EventEmitter{constructor(r,n,s,i,o){super();this.url=r;this.subscription=n;this.databaseName=s;this.nodeName=i;this.authorization=o;this.nodeName=this.nodeName??Qs(r)}static{a(this,"NodeReplicationConnection")}socket;startTime;retryTime=vk;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await og(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;ae.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${nl.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=vk,this.nodeSubscriptions&&el({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,n=Y_(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(n)}),this.socket.on("error",s=>{s.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}`),s.isHandled=!0):s.code!=="ECONNREFUSED"&&(s.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 ${s.message}`)),this.sessionReject(s)}),this.socket.on("close",(s,i)=>{if(this.isConnected&&(this.nodeSubscriptions&&vu({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,n?.end(),this.emit("finished");return}if(++this.retries%20===1){let o=i?.toString();ae.warn?.(`${n?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${o?'"'+o+'" ':""}(code: ${s})`)}n=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((r,n)=>{this.sessionResolve=r,this.sessionReject=n})}subscribe(r,n){this.nodeSubscriptions=r,this.replicateTablesByDefault=n,this.emit("subscriptions-updated",r)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(r){return this.session.then(n=>n.getRecord(r))}};a(Y_,"replicateOverWS")});var Ra={};Be(Ra,{clearThisNodeName:()=>gse,disableReplication:()=>_se,enabled_databases:()=>ya,forEachReplicatedDatabase:()=>ma,getThisNodeId:()=>ag,getThisNodeName:()=>tt,getThisNodeUrl:()=>Ea,hostnameToUrl:()=>fg,lastTimeInAuditStore:()=>H_,monitorNodeCAs:()=>eF,replicateOperation:()=>Tse,replication_certificate_authorities:()=>So,sendOperationToNode:()=>z_,servers:()=>dse,setReplicator:()=>rF,start:()=>fse,startOnMainThread:()=>_O,subscribeToNode:()=>G_,unsubscribeFromNode:()=>jE,urlToNodeName:()=>Qs});function fse(e){if(e.port||(e.port=gs.default.get(B.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=gs.default.get(B.OPERATIONSAPI_NETWORK_SECUREPORT)),!tt())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of F_(e))t.set(Qs(s.url),s);hse(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=Ke.ws(async(s,i,o,c)=>{if(i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,o);await o,s._socket.unref(),Y_(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&or.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Ke.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){!s.authorized&&s._nodeRequest.socket.authorizationError&&or.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 o=sr().primaryStore;if(s.authorized&&s.peerCertificate.subject){let c=s.peerCertificate.subject,l=c&&(o.get(c.CN)||t.get(c.CN));if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){or.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else or.warn(`No node found for certificate common name ${c.CN}, available nodes are ${Array.from(o.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=o.get(s.ip)||t.get(s.ip);c?s.user=c:or.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...o.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=a(()=>{let o=new Set(s.secureContexts.values());s.defaultContext&&o.add(s.defaultContext);for(let c of o)try{let l=Array.from(So);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=dg.createSecureContext(u)}catch(l){or.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),gs.default.get(B.REPLICATION_ENABLEROOTCAS)!==!1&&i()}eF(()=>{for(let s of n)s()})}function eF(e){let t=0;Lu(r=>{r?.ca&&(So.add(r.ca),So.size!==t&&(t=So.size,e?.()))})}function _se(e=!0){Zk=e}function hse(e){Zk||(Ze(),ya=e.databases,ma(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||ba;for(let[s,i]of lg){let o=i.get(r);o&&(o.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];rF(r,s,e),vO.get(s)?.forEach(i=>i(s))}}))}function rF(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 tF extends qr{static{a(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||ba,o=i.get(e),c=o?.tableById||[];c[t.tableId]=t;let l=o?.ready;if(or.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new Un,i.set(e,o),o.tableById=c,o.auditStore=t.auditStore,o.dbisDB=t.dbisDB,o.databaseName=e,l&&l(o),o;this.subscription=o}static subscribeOnThisThread(i,o){return!0}static async load(i){if(i){let o=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),o]);if(c){let l,u=new Set;do{let f;for(let h of c){if(h===Ke.hostname)continue;let _=mse(h,tF.subscription,e);_?.isConnected&&!u.has(_)&&(!f||_.latency<f.latency)&&(f=_)}if(!f)throw l||new Jk.ServerError("No connection to any other nodes are available",502);let d={requestId:use++,table:t,entry:i,id:i.key};u.add(f);try{return await f.getRecord(d)}catch(h){if(f.isConnected)throw h;or.warn("Error in load from node",ug,h),l||(l=h)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function pse(e,t,r,n,s){let i=lg.get(e);i||(i=new Map,lg.set(e,i));let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new Hu(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function mse(e,t,r){let n=Wk.get(e);n||(n=new Map,Wk.set(e,n));let s=n.get(r);if(s)return s;let i=sr().primaryStore.get(e);return i?.url&&(s=new Hu(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function z_(e,t,r){r||(r={}),r.serverName=e.name;let n=await og(e.url,r),s=Y_(n,{},{});return new Promise((i,o)=>{n.on("open",()=>{i(s.sendOperation(t))}),n.on("error",c=>{o(c)}),n.on("close",c=>{or.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function G_(e){try{Xk.isMainThread&&or.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=ba.get(e.database);if(!t){let n;t=new Promise(s=>{or.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,ba.set(e.database,t)}let r=pse(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=>k_(n,e.database)),e.replicateByDefault)}catch(t){or.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function jE({name:e,url:t,database:r}){or.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(sr().primaryStore.getRange({})));let n=lg.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Ese(){if(BO!==void 0)return BO;let e=gs.default.get(B.OPERATIONSAPI_TLS_CERTIFICATE)||gs.default.get(B.TLS_CERTIFICATE);if(e)return BO=new jk.X509Certificate((0,Qk.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function tt(){return ug||(ug=gs.default.get("replication_hostname")??Qs(gs.default.get("replication_url"))??Ese()??zk("operationsapi_network_secureport")??zk("operationsapi_network_port")??"127.0.0.1")}function gse(){ug=void 0}function zk(e){let t=gs.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function cg(e){let t=gs.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function ag(e){return B_(e)?.[tt()]}function Ea(){let e=gs.default.get("replication_url");return e||fg(tt())}function fg(e){let t=cg("replication_port");if(t)return`ws://${e}:${t}`;if(t=cg("replication_secureport"),t)return`wss://${e}:${t}`;if(t=cg("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=cg("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function Qs(e){if(e)return new URL(e).hostname}function ma(e,t){for(let n of Object.getOwnPropertyNames(Ye))r(n);return W_(n=>{r(n)}),il((n,s)=>{r(n.databaseName)});function r(n){let s=Ye[n];or.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):Sse(n)&&t(s,n,!1)}a(r,"forDatabase")}function Sse(e){let t=Ye[e];for(let r in t)if(t[r].replicate)return!0}function H_(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function Tse(e){let t={message:""};if(e.replicated){e.replicated=!1,or.trace?.("Replicating operation",e.operation,"to nodes",Ke.nodes.map(n=>n.name));let r=await Promise.allSettled(Ke.nodes.map(n=>z_(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Ke.nodes[s]?.name,i})}return t}var gs,or,jk,Qk,dg,Jk,Xk,Zk,use,dse,So,ya,lg,Wk,BO,ug,ms=be(()=>{Ue();sa();Yl();UO();Dr();gs=M(ce()),or=M(X()),jk=require("crypto"),Qk=require("fs");q_();Zc();G();lO();dg=M(require("node:tls")),Jk=M(he()),Xk=require("worker_threads"),use=1,dse=[],So=gs.default.get(B.REPLICATION_ENABLEROOTCAS)!==!1?new Set(dg.rootCertificates):new Set;a(fse,"start");a(eF,"monitorNodeCAs");a(_se,"disableReplication");a(hse,"assignReplicationSource");a(rF,"setReplicator");lg=new Map;a(pse,"getSubscriptionConnection");Wk=new Map;a(mse,"getRetrievalConnectionByName");a(z_,"sendOperationToNode");a(G_,"subscribeToNode");a(jE,"unsubscribeFromNode");a(Ese,"getCommonNameFromCert");a(tt,"getThisNodeName");a(gse,"clearThisNodeName");Object.defineProperty(Ke,"hostname",{get(){return tt()}});a(zk,"getHostFromListeningPort");a(cg,"getPortFromListeningPort");a(ag,"getThisNodeId");Ke.replication={getThisNodeId:ag,exportIdMapping:B_};a(Ea,"getThisNodeUrl");a(fg,"hostnameToUrl");a(Qs,"urlToNodeName");a(ma,"forEachReplicatedDatabase");a(Sse,"hasExplicitlyReplicatedTable");a(H_,"lastTimeInAuditStore");a(Tse,"replicateOperation")});var Eg=P((bIe,aF)=>{"use strict";var ku=pH(),{validateBySchema:j_}=st(),{common_validators:Fu,schema_regex:HO}=Ri(),ar=require("joi"),Ase=X(),Rse=require("uuid").v4,pg=_o(),Gu=(G(),D($)),yse=require("util"),Oa=Gn(),{handleHDBError:To,hdb_errors:bse,ClientError:Q_}=he(),{HDB_ERROR_MSGS:_g,HTTP_STATUS_CODES:Ao}=bse,{SchemaEventMsg:mg}=Ks(),nF=Er(),{getDatabases:Ose}=(Ue(),D(ct)),{transformReq:qu}=oe(),{replicateOperation:sF}=(ms(),D(Ra)),hg=ar.string().min(1).max(Fu.schema_length.maximum).pattern(HO).messages({"string.pattern.base":"{:#label} "+Fu.schema_format.message}),Nse=ar.string().min(1).max(Fu.schema_length.maximum).pattern(HO).messages({"string.pattern.base":"{:#label} "+Fu.schema_format.message}).required(),wse=ar.string().min(1).max(Fu.schema_length.maximum).pattern(HO).messages({"string.pattern.base":"{:#label} "+Fu.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();aF.exports={createSchema:Ise,createSchemaStructure:iF,createTable:Cse,createTableStructure:oF,createAttribute:vse,dropSchema:Pse,dropTable:Dse,dropAttribute:Lse,getBackup:Use};async function Ise(e){let t=await iF(e);return pg.signalSchemaChange(new mg(process.pid,e.operation,e.schema)),t}a(Ise,"createSchema");async function iF(e){let t=j_(e,ar.object({database:hg,schema:hg}));if(t)throw new Q_(t.message);if(qu(e),!await ku.checkSchemaExists(e.schema))throw To(new Error,_g.SCHEMA_EXISTS_ERR(e.schema),Ao.BAD_REQUEST,Gu.LOG_LEVELS.ERROR,_g.SCHEMA_EXISTS_ERR(e.schema),!0);return await Oa.createSchema(e),`database '${e.schema}' successfully created`}a(iF,"createSchemaStructure");async function Cse(e){return qu(e),e.hash_attribute=e.primary_key??e.hash_attribute,await oF(e)}a(Cse,"createTable");async function oF(e){let t=j_(e,ar.object({database:hg,schema:hg,table:Nse,residence:ar.array().items(ar.string().min(1)).optional(),hash_attribute:wse}));if(t)throw new Q_(t.message);if(!await ku.checkSchemaTableExists(e.schema,e.table))throw To(new Error,_g.TABLE_EXISTS_ERR(e.schema,e.table),Ao.BAD_REQUEST,Gu.LOG_LEVELS.ERROR,_g.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Rse(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await Oa.createTable(n,e);else throw To(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Ao.BAD_REQUEST);else await Oa.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}a(oF,"createTableStructure");async function Pse(e){let t=j_(e,ar.object({database:ar.string(),schema:ar.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Q_(t.message);qu(e);let r=await ku.checkSchemaExists(e.schema);if(r)throw To(new Error,r,Ao.NOT_FOUND,Gu.LOG_LEVELS.ERROR,r,!0);let n=await ku.schema_describe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await Oa.dropSchema(e),pg.signalSchemaChange(new mg(process.pid,e.operation,e.schema)),await nF.purgeSchemaTableStreams(e.schema,s);let i=await sF(e);return i.message=`successfully deleted '${e.schema}'`,i}a(Pse,"dropSchema");async function Dse(e){let t=j_(e,ar.object({database:ar.string(),schema:ar.string(),table:ar.string().required()}));if(t)throw new Q_(t.message);qu(e);let r=await ku.checkSchemaTableExists(e.schema,e.table);if(r)throw To(new Error,r,Ao.NOT_FOUND,Gu.LOG_LEVELS.ERROR,r,!0);await Oa.dropTable(e),await nF.purgeTableStream(e.schema,e.table);let n=await sF(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(Dse,"dropTable");async function Lse(e){let t=j_(e,ar.object({database:ar.string(),schema:ar.string(),table:ar.string().required(),attribute:ar.string().required()}));if(t)throw new Q_(t.message);qu(e);let r=await ku.checkSchemaTableExists(e.schema,e.table);if(r)throw To(new Error,r,Ao.NOT_FOUND,Gu.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw To(new Error,"You cannot drop a hash attribute",Ao.BAD_REQUEST,void 0,void 0,!0);if(Gu.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw To(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Ao.BAD_REQUEST,void 0,void 0,!0);try{return await Oa.dropAttribute(e),Mse(e),pg.signalSchemaChange(new mg(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw Ase.error(`Got an error deleting attribute ${yse.inspect(e)}.`),n}}a(Lse,"dropAttribute");function Mse(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)}a(Mse,"dropAttributeFromGlobal");async function vse(e){qu(e);let t=Ose()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw To(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Ao.BAD_REQUEST,void 0,void 0,!0);return await Oa.createAttribute(e),pg.signalSchemaChange(new mg(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(vse,"createAttribute");function Use(e){return Oa.getBackup(e)}a(Use,"getBackup")});var lF=P((NIe,cF)=>{"use strict";var{OPERATIONS_ENUM:xse}=(G(),D($)),kO=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=xse.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};cF.exports=kO});var FO=P((CIe,hF)=>{"use strict";var Bse=Gn(),IIe=lF(),gg=oe(),Sg=(G(),D($)),Hse=ce(),{handleHDBError:uF,hdb_errors:kse}=he(),{HDB_ERROR_MSGS:dF,HTTP_STATUS_CODES:fF}=kse,Fse=Object.values(Sg.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),_F="To use this operation audit log must be enabled in harperdb-config.yaml";hF.exports=Gse;async function Gse(e){if(gg.isEmpty(e.schema))throw new Error(dF.SCHEMA_REQUIRED_ERR);if(gg.isEmpty(e.table))throw new Error(dF.TABLE_REQUIRED_ERR);if(!Hse.get(Sg.CONFIG_PARAMS.LOGGING_AUDITLOG))throw uF(new Error,_F,fF.BAD_REQUEST,Sg.LOG_LEVELS.ERROR,_F,!0);let t=gg.checkSchemaTableExist(e.schema,e.table);if(t)throw uF(new Error,t,fF.NOT_FOUND,Sg.LOG_LEVELS.ERROR,t,!0);if(!gg.isEmpty(e.search_type)&&Fse.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await Bse.readAuditLog(e)}a(Gse,"readAuditLog")});var mF=P((DIe,pF)=>{"use strict";var{OPERATIONS_ENUM:qse}=(G(),D($)),GO=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=qse.GET_BACKUP,this.schema=t,this.table=r}};pF.exports=GO});var SF=P((UIe,gF)=>{"use strict";var $se=Gn(),MIe=mF(),qO=oe(),Vse=(G(),D($)),vIe=ce(),{handleHDBError:Kse,hdb_errors:Yse}=he(),{HDB_ERROR_MSGS:EF,HTTP_STATUS_CODES:Wse}=Yse;gF.exports=zse;async function zse(e){if(qO.isEmpty(e.schema))throw new Error(EF.SCHEMA_REQUIRED_ERR);if(qO.isEmpty(e.table))throw new Error(EF.TABLE_REQUIRED_ERR);let t=qO.checkSchemaTableExist(e.schema,e.table);if(t)throw Kse(new Error,t,Wse.NOT_FOUND,Vse.LOG_LEVELS.ERROR,t,!0);return await $se.getBackup(read_audit_log_object)}a(zse,"getBackup")});var yF=P((BIe,RF)=>{"use strict";var jse=ce(),Na=require("joi"),Qse=st(),TF=require("moment"),Jse=require("fs-extra"),$O=require("path"),Xse=require("lodash"),J_=(G(),D($)),{LOG_LEVELS:ol}=(G(),D($)),Zse="YYYY-MM-DD hh:mm:ss",eie=$O.resolve(__dirname,"../logs");RF.exports=function(e){return Qse.validateBySchema(e,tie)};var tie=Na.object({from:Na.custom(AF),until:Na.custom(AF),level:Na.valid(ol.NOTIFY,ol.FATAL,ol.ERROR,ol.WARN,ol.INFO,ol.DEBUG,ol.TRACE),order:Na.valid("asc","desc"),limit:Na.number().min(1),start:Na.number().min(0),log_name:Na.custom(rie)});function AF(e,t){if(TF(e,TF.ISO_8601).format(Zse)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(AF,"validateDatetime");function rie(e,t){if(Xse.invert(J_.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=jse.get(J_.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?J_.LOG_NAMES.HDB:e,i=s===J_.LOG_NAMES.INSTALL?$O.join(eie,J_.LOG_NAMES.INSTALL):$O.join(n,s);return Jse.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(rie,"validateReadLogPath")});var KO=P((kIe,OF)=>{"use strict";var Tg=(G(),D($)),nie=X(),sie=ce(),iie=yF(),VO=require("path"),bF=require("fs-extra"),{once:oie}=require("events"),{handleHDBError:aie,hdb_errors:cie}=he(),{PACKAGE_ROOT:lie}=Et(),uie=VO.join(lie,"logs"),die=1e3,fie=200;OF.exports=_ie;async function _ie(e){let t=iie(e);if(t)throw aie(t,t.message,cie.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=sie.get(Tg.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?Tg.LOG_NAMES.HDB:e.log_name,s=n===Tg.LOG_NAMES.INSTALL?VO.join(uie,Tg.LOG_NAMES.INSTALL):VO.join(r,n),i=e.level!==void 0,o=i?e.level:void 0,c=e.from!==void 0,l=c?new Date(e.from):void 0,u=e.until!==void 0,f=u?new Date(e.until):void 0,d=e.limit===void 0?die:e.limit,h=e.order===void 0?void 0:e.order,_=e.start===void 0?0:e.start,p=_+d,S=0;h==="desc"&&!l&&!f&&(S=Math.max(bF.statSync(s).size-(p+5)*fie,0));let g=bF.createReadStream(s,{start:S});g.on("error",F=>{nie.error(F)});let R=0,E=[],T="",O;g.on("data",F=>{let q=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;F=T+F;let j=0,te;for(;(te=q.exec(F))&&!g.destroyed;){O&&(O.message=F.slice(j,te.index),v(O));let[se,z,ne]=te,le=ne.split("] ["),ie=le[0],Re=le[1];le.splice(0,2),O={timestamp:z,thread:ie,level:Re,tags:le,message:""},j=te.index+se.length}T=F.slice(j)}),g.on("end",F=>{g.destroyed||O&&(O.message=T.trim(),v(O))}),g.resume();function v(F){let q,j,te;switch(!0){case(i&&c&&u):q=new Date(F.timestamp),j=new Date(l),te=new Date(f),F.level===o&&q>=j&&q<=te&&R<_?R++:F.level===o&&q>=j&&q<=te&&(wa(F,h,E),R++,R===p&&g.destroy());break;case(i&&c):q=new Date(F.timestamp),j=new Date(l),F.level===o&&q>=j&&R<_?R++:F.level===o&&q>=j&&(wa(F,h,E),R++,R===p&&g.destroy());break;case(i&&u):q=new Date(F.timestamp),te=new Date(f),F.level===o&&q<=te&&R<_?R++:F.level===o&&q<=te&&(wa(F,h,E),R++,R===p&&g.destroy());break;case(c&&u):q=new Date(F.timestamp),j=new Date(l),te=new Date(f),q>=j&&q<=te&&R<_?R++:q>=j&&q<=te&&(wa(F,h,E),R++,R===p&&g.destroy());break;case i:F.level===o&&R<_?R++:F.level===o&&(wa(F,h,E),R++,R===p&&g.destroy());break;case c:q=new Date(F.timestamp),j=new Date(l),q>=j&&R<_?R++:q>=j&&R>=_&&(wa(F,h,E),R++,R===p&&g.destroy());break;case u:q=new Date(F.timestamp),te=new Date(f),q<=te&&R<_?R++:q<=te&&R>=_&&(wa(F,h,E),R++,R===p&&g.destroy());break;default:R<_?R++:(wa(F,h,E),R++,R===p&&g.destroy())}}return a(v,"onLogMessage"),await oie(g,"close"),E}a(_ie,"readLog");function wa(e,t,r){t==="desc"?hie(e,r):t==="asc"?pie(e,r):r.push(e)}a(wa,"pushLineToResult");function hie(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)}a(hie,"insertDescending");function pie(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)}a(pie,"insertAscending")});var Ag=P((KIe,CF)=>{"use strict";var YO=require("joi"),{string:$u,boolean:NF,date:mie}=YO.types(),Eie=st(),{validateSchemaExists:GIe,validateTableExists:qIe,validateSchemaName:$Ie}=Ri(),gie=(G(),D($)),Sie=Dt(),wF=ce();wF.initSync();var VIe=$u.invalid(wF.get(gie.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Sie.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),IF={operation:$u.valid("add_node","update_node","set_node_replication"),node_name:$u.optional(),subscriptions:YO.array().items({table:$u.optional(),schema:$u.optional(),database:$u.optional(),subscribe:NF.required(),publish:NF.required().custom(Aie),start_time:mie.iso()})};function Tie(e){return Eie.validateBySchema(e,YO.object(IF))}a(Tie,"addUpdateNodeValidator");function Aie(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`)}a(Aie,"checkForFalsy");CF.exports={addUpdateNodeValidator:Tie,validation_schema:IF}});var Vu=P((WIe,PF)=>{"use strict";var WO=class{static{a(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},zO=class{static{a(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};PF.exports={Node:WO,NodeSubscription:zO}});var LF=P((jIe,DF)=>{"use strict";var Rie=(G(),D($)).OPERATIONS_ENUM,jO=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Rie.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};DF.exports=jO});var X_=P((JIe,MF)=>{"use strict";var QO=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},JO=class{static{a(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,o,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=o,c!==void 0&&(this.attributes=c)}};MF.exports={RemotePayloadObject:QO,RemotePayloadSubscription:JO}});var UF=P((ZIe,vF)=>{"use strict";var XO=class{static{a(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,o=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=o}};vF.exports=XO});var BF=P((iCe,xF)=>{"use strict";var yie=UF(),tCe=Ft(),rCe=ht(),bie=X(),{getSchemaPath:nCe,getTransactionAuditStorePath:sCe}=gt(),{getDatabases:Oie}=(Ue(),D(ct));xF.exports=Nie;async function Nie(e){let t=new yie;try{let r=Oie()[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){bie.warn(`unable to stat table dbi due to ${r}`)}return t}a(Nie,"lmdbGetTableSize")});var kF=P((aCe,HF)=>{"use strict";var ZO=class{static{a(this,"SystemInformationObject")}constructor(t,r,n,s,i,o,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=o,this.harperdb_processes=c}};HF.exports=ZO});var Yu=P((_Ce,$F)=>{"use strict";var wie=require("fs-extra"),Iie=require("path"),jr=require("systeminformation"),Ia=X(),FF=Er(),lCe=Dt(),Ku=(G(),D($)),Cie=BF(),Pie=uo(),{getThreadInfo:GF}=it(),Z_=ce();Z_.initSync();var Die=kF(),{openEnvironment:uCe}=ht(),{getSchemaPath:dCe}=gt(),{database:fCe,databases:eN}=(Ue(),D(ct)),Rg;$F.exports={getHDBProcessInfo:sN,getNetworkInfo:oN,getDiskInfo:iN,getMemoryInfo:nN,getCPUInfo:rN,getTimeInfo:tN,getSystemInformation:aN,systemInformation:Lie,getTableSize:cN,getMetrics:lN};function tN(){return jr.time()}a(tN,"getTimeInfo");async function rN(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:o,governor:c,socket:l,cache:u,...f}=await jr.cpu();f.cpu_speed=await jr.cpuCurrentSpeed();let{raw_currentload:d,raw_currentload_idle:h,raw_currentload_irq:_,raw_currentload_nice:p,raw_currentload_system:S,raw_currentload_user:g,cpus:R,...E}=await jr.currentLoad();return E.cpus=[],R.forEach(T=>{let{raw_load:O,raw_load_idle:v,raw_load_irq:F,raw_load_nice:q,raw_load_system:j,raw_load_user:te,...se}=T;E.cpus.push(se)}),f.current_load=E,f}catch(e){return Ia.error(`error in getCPUInfo: ${e}`),{}}}a(rN,"getCPUInfo");async function nN(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await jr.mem();return Object.assign(s,process.memoryUsage())}catch(e){return Ia.error(`error in getMemoryInfo: ${e}`),{}}}a(nN,"getMemoryInfo");async function sN(){let e={core:[],clustering:[]};try{let t=await jr.processes(),r;try{r=Number.parseInt(await wie.readFile(Iie.join(Z_.get(Ku.CONFIG_PARAMS.ROOTPATH),Ku.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===Ku.NODE_ERROR_CODES.ENOENT)Ia.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 Ia.error(`error in getHDBProcessInfo: ${t}`),e}}a(sN,"getHDBProcessInfo");async function iN(){let e={};try{if(!Z_.get(Ku.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await jr.disksIO();e.io=i;let{rx_sec:o,tx_sec:c,wx_sec:l,...u}=await jr.fsStats();return e.read_write=u,e.size=await jr.fsSize(),e}catch(t){return Ia.error(`error in getDiskInfo: ${t}`),e}}a(iN,"getDiskInfo");async function oN(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Z_.get(Ku.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await jr.networkInterfaceDefault(),e.latency=await jr.inetChecksite("google.com"),(await jr.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:o,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:f,carrier_changes:d,...h}=n;e.interfaces.push(h)}),(await jr.networkStats()).forEach(n=>{let{rx_sec:s,tx_sec:i,ms:o,...c}=n;e.stats.push(c)})),e}catch(t){return Ia.error(`error in getNetworkInfo: ${t}`),e}}a(oN,"getNetworkInfo");async function aN(){if(Rg!==void 0)return Rg;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:o,...c}=await jr.osInfo();e=c;let l=await jr.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,Rg=e,Rg}catch(t){return Ia.error(`error in getSystemInformation: ${t}`),e}}a(aN,"getSystemInformation");async function cN(){let e=[],t=await Pie.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await Cie(n));return e}a(cN,"getTableSize");async function lN(){let e={};for(let t in eN){let r=e[t]={},n=r.tables={};for(let s in eN[t])try{let i=eN[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,f,d]=l.trim().split(" ");return{pid:u,thread:f,txnid:d}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:h}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:h}}let o=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=o[l];n[s]=c}catch(i){Ia.notify(`Error getting stats for table ${s}: ${i}`)}}return e}a(lN,"getMetrics");async function qF(){if(Z_.get(Ku.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await FF.getNATSReferences(),t=await FF.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 o={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(o)}return r}}a(qF,"getNatsStreamInfo");async function Lie(e){let t=new Die;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await aN(),t.time=tN(),t.cpu=await rN(),t.memory=await nN(),t.disk=await iN(),t.network=await oN(),t.harperdb_processes=await sN(),t.table_size=await cN(),t.metrics=await lN(),t.threads=await GF(),t.replication=await qF(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await aN();break;case"time":t.time=tN();break;case"cpu":t.cpu=await rN();break;case"memory":t.memory=await nN();break;case"disk":t.disk=await iN();break;case"network":t.network=await oN();break;case"harperdb_processes":t.harperdb_processes=await sN();break;case"table_size":t.table_size=await cN();break;case"database_metrics":case"metrics":t.metrics=await lN();break;case"threads":t.threads=await GF();break;case"replication":t.replication=await qF();break;default:break}return t}a(Lie,"systemInformation")});var Ro=P((gCe,WF)=>{"use strict";var Mie=gn(),uN=oe(),vie=require("util"),al=(G(),D($)),VF=ce();VF.initSync();var Uie=qb(),KF=Vr(),{Node:pCe,NodeSubscription:mCe}=Vu(),xie=hu(),Bie=LF(),{RemotePayloadObject:Hie,RemotePayloadSubscription:kie}=X_(),{handleHDBError:Fie,hdb_errors:Gie}=he(),{HTTP_STATUS_CODES:qie,HDB_ERROR_MSGS:$ie}=Gie,Vie=Ys(),Kie=Yu(),{packageJson:Yie}=Et(),{getDatabases:Wie}=(Ue(),D(ct)),ECe=vie.promisify(Uie.authorize),zie=KF.searchByHash,jie=KF.searchByValue;WF.exports={isEmpty:Qie,getNodeRecord:Jie,upsertNodeRecord:Xie,buildNodePayloads:Zie,checkClusteringEnabled:eoe,getAllNodeRecords:toe,getSystemInfo:roe,reverseSubscription:YF};function Qie(e){return e==null}a(Qie,"isEmpty");async function Jie(e){let t=new xie(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return zie(t)}a(Jie,"getNodeRecord");async function Xie(e){let t=new Bie(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Mie.upsert(t)}a(Xie,"upsertNodeRecord");function YF(e){if(uN.isEmpty(e.subscribe)||uN.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}a(YF,"reverseSubscription");function Zie(e,t,r,n){let s=[];for(let i=0,o=e.length;i<o;i++){let c=e[i],{schema:l,table:u}=c,f=uN.getTableHashAttribute(l,u),{subscribe:d,publish:h}=YF(c),_=Wie()[l]?.[u],p=new kie(l,u,f,h,d,c.start_time,_.schemaDefined?_.attributes:void 0);s.push(p)}return new Hie(r,t,s,n)}a(Zie,"buildNodePayloads");function eoe(){if(!VF.get(al.CONFIG_PARAMS.CLUSTERING_ENABLED))throw Fie(new Error,$ie.CLUSTERING_NOT_ENABLED,qie.BAD_REQUEST,void 0,void 0,!0)}a(eoe,"checkClusteringEnabled");async function toe(){let e=new Vie(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await jie(e))}a(toe,"getAllNodeRecords");async function roe(){let e=await Kie.getSystemInformation();return{hdb_version:Yie.version,node_version:e.node_version,platform:e.platform}}a(roe,"getSystemInfo")});var dN=P((TCe,tG)=>{"use strict";var yg=Er(),zF=oe(),jF=Dt(),QF=(G(),D($)),bg=X(),JF=Eg(),noe=d_(),{RemotePayloadObject:soe}=X_(),{handleHDBError:XF,hdb_errors:ioe}=he(),{HTTP_STATUS_CODES:ZF}=ioe,{NodeSubscription:eG}=Vu();tG.exports=ooe;async function ooe(e,t){let r;try{r=await yg.request(`${t}.${jF.REQUEST_SUFFIX}`,new soe(QF.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),bg.trace("Response from remote describe all request:",r)}catch(o){bg.error(`addNode received error from describe all request to remote node: ${o}`);let c=yg.requestErrorHandler(o,"add_node",t);throw XF(new Error,c,ZF.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===jF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw XF(new Error,o,ZF.INTERNAL_SERVER_ERROR,"error",o)}let n=r.message,s=[],i=[];for(let o of e){let{table:c}=o,l=o.database??o.schema??"data";if(l===QF.SYSTEM_SCHEMA_NAME){await yg.createLocalTableStream(l,c);let p=new eG(l,c,o.publish,o.subscribe);p.start_time=o.start_time,i.push(p);continue}let u=zF.doesSchemaExist(l),f=n[l]!==void 0,d=c?zF.doesTableExist(l,c):!0,h=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!f||!d&&!h){s.push(o);continue}if(!u&&f&&(bg.trace(`addNode creating schema: ${l}`),await JF.createSchema({operation:"create_schema",schema:l})),!d&&h){bg.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let p=new noe(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(p.attributes=n[l][c].attributes),await JF.createTable(p)}await yg.createLocalTableStream(l,c);let _=new eG(l,c,o.publish,o.subscribe);_.start_time=o.start_time,i.push(_)}return{added:i,skipped:s}}a(ooe,"reviewSubscriptions")});var cl={};Be(cl,{addNodeBack:()=>doe,removeNodeBack:()=>foe,setNode:()=>uoe});async function uoe(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=Qs(t)):t=fg(r);let n=(0,nG.validateBySchema)(e,loe);if(n)throw(0,yo.handleHDBError)(n,n.message,coe.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new yo.ClientError("url or hostname is required for remove_node operation");let _=r,p=sr(),S=await p.get(_);if(!S)throw new yo.ClientError(_+" does not exist");try{await z_({url:S.url},{operation:Yt.REMOVE_NODE_BACK,name:S?.subscriptions?.length>0?tt():_},void 0)}catch(g){jn.warn(`Error removing node from target node ${_}, 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(_),`Successfully removed '${_}' from cluster`}if(!t)throw new yo.ClientError("url required for this operation");let s=Ea();if(s==null)throw new yo.ClientError("replication url is missing from harperdb-config.yaml");let i,o,c;if(t?.startsWith("wss:")){i=await(0,Ss.getReplicationCert)();let _=await(0,Ss.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,Ss.createCsr)(),jn.info("Sending CSR to target node:",t)):_&&(c=_.certificate,jn.info("Sending CA named",_.name,"to target node",t))}let l={operation:Yt.ADD_NODE_BACK,hostname:(0,Pa.get)(B.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:o,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,Pa.get)(B.REPLICATION_SHARD)!==void 0&&(l.shard=(0,Pa.get)(B.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(rG):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let _=rG(e);l.subscribe=_.subscribe,l.publish=_.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,f;try{u=await z_({url:t},l,e)}catch(_){_.message=`Error returned from ${t}: `+_.message,jn.warn("Error adding node:",t,"to cluster:",_),f=_}if(o&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw f?(f.message+=" and connection was required to sign certificate",f):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);o&&(jn.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ss.setCertTable)({name:aoe.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ss.setCertTable)({name:tt(),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 d={url:t,ca:u?.usingCA};if(e.hostname&&(d.name=e.hostname),e.subscriptions?d.subscriptions=e.subscriptions:d.replicates=!0,e.start_time&&(d.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(d.authorization=e.authorization),e.revoked_certificates&&(d.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?d.shard=u.shard:e.shard!==void 0&&(d.shard=e.shard),d.replicates){let _={url:s,ca:c,replicates:!0,subscriptions:null};(0,Pa.get)(B.REPLICATION_SHARD)!==void 0&&(_.shard=(0,Pa.get)(B.REPLICATION_SHARD)),e.retain_authorization&&(_.authorization=e.authorization),e.start_time&&(_.start_time=e.start_time),await Eo(tt(),_)}await Eo(u?u.nodeName:d.name??Qs(t),d);let h;return e.operation==="update_node"?h=`Successfully updated '${t}'`:h=`Successfully added '${t}' to cluster`,f&&(h+=" but there was an error updating target node: "+f.message),h}async function doe(e){jn.trace("addNodeBack received request:",e);let t=await(0,Ss.signCertificate)(e),r;e.csr?(r=t.signingCA,jn.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,jn.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,Ss.getReplicationCertAuth)();if(n.replicates){let i={url:Ea(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,Pa.get)(B.REPLICATION_SHARD)!==void 0&&(i.shard=(0,Pa.get)(B.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Eo(tt(),i)}return await Eo(e.hostname,n),t.nodeName=tt(),t.usingCA=s?.certificate,jn.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function foe(e){jn.trace("removeNodeBack received request:",e),await sr().delete(e.name)}function rG(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ss,nG,Ca,Pa,jn,yo,aoe,coe,loe,ll=be(()=>{Ss=M(Zs()),nG=M(st()),Ca=M(require("joi")),Pa=M(ce());G();q_();Zc();ms();jn=M(X()),yo=M(he()),{pki:aoe}=require("node-forge"),{HTTP_STATUS_CODES:coe}=yo.hdb_errors,loe=Ca.default.object({hostname:Ca.default.string(),verify_tls:Ca.default.boolean(),replicates:Ca.default.boolean(),subscriptions:Ca.default.array(),revoked_certificates:Ca.default.array(),shard:Ca.default.number()});a(uoe,"setNode");a(doe,"addNodeBack");a(foe,"removeNodeBack");a(rG,"reverseSubscription")});var Cg=P((CCe,iG)=>{"use strict";var{handleHDBError:Og,hdb_errors:_oe}=he(),{HTTP_STATUS_CODES:Ng}=_oe,{addUpdateNodeValidator:hoe}=Ag(),wg=X(),Ig=(G(),D($)),sG=Dt(),poe=oe(),eh=Er(),th=Ro(),fN=ce(),moe=dN(),{Node:Eoe,NodeSubscription:goe}=Vu(),{broadcast:Soe}=it(),{setNode:Toe}=(ll(),D(cl)),wCe=ce(),ICe=(G(),D($)),Aoe="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Roe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",yoe=fN.get(Ig.CONFIG_PARAMS.CLUSTERING_NODENAME);iG.exports=boe;async function boe(e,t=!1){if(wg.trace("addNode called with:",e),fN.get(Ig.CONFIG_PARAMS.REPLICATION_URL)||fN.get(Ig.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Toe(e);th.checkClusteringEnabled();let r=hoe(e);if(r)throw Og(r,r.message,Ng.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let d=await th.getNodeRecord(n);if(!poe.isEmptyOrZeroLength(d))throw Og(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,Ng.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await moe(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=Aoe,o;let c=th.buildNodePayloads(s,yoe,Ig.OPERATIONS_ENUM.ADD_NODE,await th.getSystemInfo()),l=[];for(let d=0,h=s.length;d<h;d++){let _=s[d];s[d].start_time===void 0&&delete s[d].start_time,l.push(new goe(_.schema,_.table,_.publish,_.subscribe))}wg.trace("addNode sending remote payload:",c);let u;try{u=await eh.request(`${n}.${sG.REQUEST_SUFFIX}`,c)}catch(d){wg.error(`addNode received error from request: ${d}`);for(let _=0,p=s.length;_<p;_++){let S=s[_];S.publish=!1,S.subscribe=!1,await eh.updateRemoteConsumer(S,n)}let h=eh.requestErrorHandler(d,"add_node",n);throw Og(new Error,h,Ng.INTERNAL_SERVER_ERROR,"error",h)}if(u.status===sG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${n}: ${u.message}`;throw Og(new Error,d,Ng.INTERNAL_SERVER_ERROR,"error",d)}wg.trace(u);for(let d=0,h=s.length;d<h;d++){let _=s[d];await eh.updateRemoteConsumer(_,n),_.subscribe===!0&&await eh.updateConsumerIterator(_.schema,_.table,n,"start")}let f=new Eoe(n,l,u.system_info);return await th.upsertNodeRecord(f),Soe({type:"nats_update"}),i.length>0?o.message=Roe:o.message=`Successfully added '${n}' to manifest`,o}a(boe,"addNode")});var mN=P((LCe,aG)=>{"use strict";var{handleHDBError:_N,hdb_errors:Ooe}=he(),{HTTP_STATUS_CODES:hN}=Ooe,{addUpdateNodeValidator:Noe}=Ag(),rh=X(),Pg=(G(),D($)),oG=Dt(),DCe=oe(),nh=Er(),sh=Ro(),pN=ce(),{cloneDeep:woe}=require("lodash"),Ioe=dN(),{Node:Coe,NodeSubscription:Poe}=Vu(),{broadcast:Doe}=it(),{setNode:Loe}=(ll(),D(cl)),Moe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",voe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Uoe=pN.get(Pg.CONFIG_PARAMS.CLUSTERING_NODENAME);aG.exports=xoe;async function xoe(e){if(rh.trace("updateNode called with:",e),pN.get(Pg.CONFIG_PARAMS.REPLICATION_URL)??pN.get(Pg.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Loe(e);sh.checkClusteringEnabled();let t=Noe(e);if(t)throw _N(t,t.message,hN.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await sh.getNodeRecord(r);s.length>0&&(n=woe(s));let{added:i,skipped:o}=await Ioe(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=Moe,c;let l=sh.buildNodePayloads(i,Uoe,Pg.OPERATIONS_ENUM.UPDATE_NODE,await sh.getSystemInfo());for(let f=0,d=i.length;f<d;f++){let h=i[f];rh.trace(`updateNode updating work stream for node: ${r} subscription:`,h),i[f].start_time===void 0&&delete i[f].start_time}rh.trace("updateNode sending remote payload:",l);let u;try{u=await nh.request(`${r}.${oG.REQUEST_SUFFIX}`,l)}catch(f){rh.error(`updateNode received error from request: ${f}`);let d=nh.requestErrorHandler(f,"update_node",r);throw _N(new Error,d,hN.INTERNAL_SERVER_ERROR,"error",d)}if(u.status===oG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${r}: ${u.message}`;throw _N(new Error,f,hN.INTERNAL_SERVER_ERROR,"error",f)}rh.trace(u);for(let f=0,d=i.length;f<d;f++){let h=i[f];await nh.updateRemoteConsumer(h,r),h.subscribe===!0?await nh.updateConsumerIterator(h.schema,h.table,r,"start"):await nh.updateConsumerIterator(h.schema,h.table,r,"stop")}return n||(n=[new Coe(r,[],u.system_info)]),await Boe(n[0],i,u.system_info),o.length>0?c.message=voe:c.message=`Successfully updated '${r}'`,c}a(xoe,"updateNode");async function Boe(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let o=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let f=n.subscriptions[l];if(f.schema===o.schema&&f.table===o.table){f.publish=o.publish,f.subscribe=o.subscribe,c=!0;break}}c||n.subscriptions.push(new Poe(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await sh.upsertNodeRecord(n),Doe({type:"nats_update"})}a(Boe,"updateNodeTable")});var fG=P((vCe,dG)=>{"use strict";var uG=require("joi"),{string:cG}=uG.types(),Hoe=st(),lG=(G(),D($)),koe=ce(),Foe=Dt();dG.exports=Goe;function Goe(e){let t=cG.invalid(koe.get(lG.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(Foe.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=uG.object({operation:cG.valid(lG.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return Hoe.validateBySchema(e,r)}a(Goe,"removeNodeValidator")});var Dg=P((xCe,EG)=>{"use strict";var{handleHDBError:_G,hdb_errors:qoe}=he(),{HTTP_STATUS_CODES:hG}=qoe,$oe=fG(),ih=X(),pG=Ro(),Voe=oe(),Wu=(G(),D($)),mG=Dt(),EN=Er(),gN=ce(),{RemotePayloadObject:Koe}=X_(),{NodeSubscription:Yoe}=Vu(),Woe=u_(),zoe=xc(),{broadcast:joe}=it(),{setNode:Qoe}=(ll(),D(cl)),Joe=gN.get(Wu.CONFIG_PARAMS.CLUSTERING_NODENAME);EG.exports=Xoe;async function Xoe(e){if(ih.trace("removeNode called with:",e),gN.get(Wu.CONFIG_PARAMS.REPLICATION_URL)??gN.get(Wu.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Qoe(e);pG.checkClusteringEnabled();let t=$oe(e);if(t)throw _G(t,t.message,hG.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await pG.getNodeRecord(r);if(Voe.isEmptyOrZeroLength(n))throw _G(new Error,`Node '${r}' was not found.`,hG.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new Koe(Wu.OPERATIONS_ENUM.REMOVE_NODE,Joe,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let f=n.subscriptions[l];f.subscribe===!0&&await EN.updateConsumerIterator(f.schema,f.table,r,"stop");try{await EN.updateRemoteConsumer(new Yoe(f.schema,f.table,!1,!1),r)}catch(d){ih.error(d)}}try{i=await EN.request(`${r}.${mG.REQUEST_SUFFIX}`,s),ih.trace("Remove node reply from remote node:",r,i)}catch(l){ih.error("removeNode received error from request:",l),o=!0}let c=new Woe(Wu.SYSTEM_SCHEMA_NAME,Wu.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await zoe.deleteRecord(c),joe({type:"nats_update"}),i?.status===mG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(ih.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`}a(Xoe,"removeNode")});var TG=P((HCe,SG)=>{"use strict";var gG=require("joi"),{string:Zoe,array:eae}=gG.types(),tae=st(),rae=Ag();SG.exports=nae;function nae(e){let t=gG.object({operation:Zoe.valid("configure_cluster").required(),connections:eae.items(rae.validation_schema).required()});return tae.validateBySchema(e,t)}a(nae,"configureClusterValidator")});var SN=P((FCe,OG)=>{"use strict";var AG=(G(),D($)),Lg=X(),sae=oe(),iae=ce(),oae=Dg(),aae=Cg(),cae=Ro(),lae=TG(),{handleHDBError:RG,hdb_errors:uae}=he(),{HTTP_STATUS_CODES:yG}=uae,dae="Configure cluster complete.",fae="Failed to configure the cluster. Check the logs for more details.",_ae="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";OG.exports=hae;async function hae(e){Lg.trace("configure cluster called with:",e);let t=lae(e);if(t)throw RG(t,t.message,yG.BAD_REQUEST,void 0,void 0,!0);let r=await cae.getAllNodeRecords(),n=[];if(iae.get(AG.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let f=0,d=r.length;f<d;f++){let h=await bG(oae,{operation:AG.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[f].name},r[f].name);n.push(h)}Lg.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let f=0;f<i;f++){let d=e.connections[f],h=await bG(aae,d,d.node_name);s.push(h)}Lg.trace("All results from configure_cluster add node:",s);let o=[],c=[],l=!1,u=n.concat(s);for(let f=0,d=u.length;f<d;f++){let h=u[f];h.status==="rejected"&&(Lg.error(h.node_name,h?.error?.message,h?.error?.stack),o.includes(h.node_name)||o.push(h.node_name)),(h?.result?.message?.includes?.("Successfully")||h?.result?.includes?.("Successfully"))&&(l=!0),!(typeof h.result=="string"&&h.result.includes("Successfully removed")||h.status==="rejected")&&c.push({node_name:h?.node_name,response:h?.result})}if(sae.isEmptyOrZeroLength(o))return{message:dae,connections:c};if(l)return{message:_ae,failed_nodes:o,connections:c};throw RG(new Error,fae,yG.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(hae,"configureCluster");async function bG(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(bG,"functionWrapper")});var CG=P((qCe,IG)=>{"use strict";var oh=require("joi"),pae=st(),{validateSchemaExists:NG,validateTableExists:mae,validateSchemaName:wG}=Ri(),Eae=oh.object({operation:oh.string().valid("purge_stream"),schema:oh.string().custom(NG).custom(wG).optional(),database:oh.string().custom(NG).custom(wG).optional(),table:oh.string().custom(mae).required()});function gae(e){return pae.validateBySchema(e,Eae)}a(gae,"purgeStreamValidator");IG.exports=gae});var TN=P((VCe,PG)=>{"use strict";var{handleHDBError:Sae,hdb_errors:Tae}=he(),{HTTP_STATUS_CODES:Aae}=Tae,Rae=CG(),yae=Er(),bae=Ro();PG.exports=Oae;async function Oae(e){e.schema=e.schema??e.database;let t=Rae(e);if(t)throw Sae(t,t.message,Aae.BAD_REQUEST,void 0,void 0,!0);bae.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await yae.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(Oae,"purgeStream")});var yN=P((YCe,BG)=>{"use strict";var RN=Ro(),Nae=Er(),vg=ce(),zu=(G(),D($)),ul=Dt(),wae=oe(),AN=X(),{RemotePayloadObject:Iae}=X_(),{ErrorCode:DG}=require("nats"),{parentPort:LG}=require("worker_threads"),{onMessageByType:Cae}=it(),{getThisNodeName:Pae}=(ms(),D(Ra)),{requestClusterStatus:Dae}=(q_(),D(ek)),{getReplicationSharedStatus:Lae,getHDBNodeTable:Mae}=(Zc(),D(uO)),{CONFIRMATION_STATUS_POSITION:vae,RECEIVED_VERSION_POSITION:Uae,RECEIVED_TIME_POSITION:xae,SENDING_TIME_POSITION:Bae,RECEIVING_STATUS_POSITION:Hae,RECEIVING_STATUS_RECEIVING:kae}=(UO(),D(Kk)),MG=vg.get(zu.CONFIG_PARAMS.CLUSTERING_ENABLED),vG=vg.get(zu.CONFIG_PARAMS.CLUSTERING_NODENAME);BG.exports={clusterStatus:Fae,buildNodeStatus:xG};var UG;Cae("cluster-status",async e=>{UG(e)});async function Fae(){if(vg.get(zu.CONFIG_PARAMS.REPLICATION_URL)||vg.get(zu.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(LG){LG.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{UG=i});for(let i of n.connections){let o=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let d of Object.values(databases[l]||{}))if(u=d.auditStore,u)break;if(!u)continue;let f=Lae(u,l,o);c.lastCommitConfirmed=Mg(f[vae]),c.lastReceivedRemoteTime=Mg(f[Uae]),c.lastReceivedLocalTime=Mg(f[xae]),c.sendingMessage=Mg(f[Bae]),c.lastReceivedStatus=f[Hae]===kae?"Receiving":"Waiting"}}}else n=Dae();n.node_name=Pae();let s=Mae().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:vG,is_enabled:MG,connections:[]};if(!MG)return e;let t=await RN.getAllNodeRecords();if(wae.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(xG(t[n],e.connections));return await Promise.allSettled(r),e}a(Fae,"clusterStatus");function Mg(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}a(Mg,"asDate");async function xG(e,t){let r=e.name,n=new Iae(zu.OPERATIONS_ENUM.CLUSTER_STATUS,vG,void 0,await RN.getSystemInfo()),s,i,o=ul.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Nae.request(ul.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===ul.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=ul.CLUSTER_STATUS_STATUSES.CLOSED,AN.error(`Error getting node status from ${r} `,s))}catch(l){AN.warn(`Error getting node status from ${r}`,l),l.code===DG.NoResponders?o=ul.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===DG.Timeout?o=ul.CLUSTER_STATUS_STATUSES.TIMEOUT:o=ul.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Gae(r,o,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!==zu.PRE_4_0_0_VERSION&&await RN.upsertNodeRecord(l)}catch(l){AN.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(xG,"buildNodeStatus");function Gae(e,t,r,n,s,i,o,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=o,this.system_info=c}a(Gae,"NodeStatusObject")});var ON=P((zCe,HG)=>{"use strict";var{handleHDBError:qae,hdb_errors:$ae}=he(),{HTTP_STATUS_CODES:Vae}=$ae,Kae=Er(),Yae=Ro(),bN=oe(),Ug=require("joi"),Wae=st(),zae=2e3,jae=Ug.object({timeout:Ug.number().min(1),connected_nodes:Ug.boolean(),routes:Ug.boolean()});HG.exports=Qae;async function Qae(e){Yae.checkClusteringEnabled();let t=Wae.validateBySchema(e,jae);if(t)throw qae(t,t.message,Vae.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||bN.autoCastBoolean(n),o=s===void 0||bN.autoCastBoolean(s),c={nodes:[]},l=await Kae.getServerList(r??zae),u={};if(i)for(let f=0,d=l.length;f<d;f++){let h=l[f].statsz;h&&(u[l[f].server.name]=h.routes)}for(let f=0,d=l.length;f<d;f++){if(l[f].statsz)continue;let h=l[f].server,_=l[f].data;if(h.name.endsWith("-hub")){let p={name:h.name.slice(0,-4),response_time:l[f].response_time};i&&(p.connected_nodes=[],u[h.name]&&u[h.name].forEach(S=>{p.connected_nodes.includes(S.name.slice(0,-4))||p.connected_nodes.push(S.name.slice(0,-4))})),o&&(p.routes=_.cluster?.urls?_.cluster?.urls.map(S=>({host:S.split(":")[0],port:bN.autoCast(S.split(":")[1])})):[]),c.nodes.push(p)}}return c}a(Qae,"clusterNetwork")});var qG=P((QCe,GG)=>{"use strict";var NN=require("joi"),kG=st(),{route_constraints:FG}=AA();GG.exports={setRoutesValidator:Jae,deleteRoutesValidator:Xae};function Jae(e){let t=NN.object({server:NN.valid("hub","leaf"),routes:FG.required()});return kG.validateBySchema(e,t)}a(Jae,"setRoutesValidator");function Xae(e){let t=NN.object({routes:FG.required()});return kG.validateBySchema(e,t)}a(Xae,"deleteRoutesValidator")});var xg=P((XCe,jG)=>{"use strict";var bo=It(),wN=oe(),Ts=(G(),D($)),ju=ce(),$G=qG(),{handleHDBError:VG,hdb_errors:Zae}=he(),{HTTP_STATUS_CODES:KG}=Zae,YG="cluster routes successfully set",WG="cluster routes successfully deleted";jG.exports={setRoutes:tce,getRoutes:rce,deleteRoutes:nce};function ece(e){let t=bo.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 o=0,c=e.routes.length;o<c;o++){let l=e.routes[o];l.port=wN.autoCast(l.port);let u=r.some(d=>d.host===l.host&&d.port===l.port),f=n.some(d=>d.host===l.host&&d.port===l.port);u||f?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?bo.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):bo.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:YG,set:i,skipped:s}}a(ece,"setRoutesNats");function tce(e){let t=$G.setRoutesValidator(e);if(t)throw VG(t,t.message,KG.BAD_REQUEST,void 0,void 0,!0);if(ju.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED))return ece(e);let r=[],n=[],s=ju.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{zG(s,i)?n.push(i):(s.push(i),r.push(i))}),bo.updateConfigValue(Ts.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:YG,set:r,skipped:n}}a(tce,"setRoutes");function zG(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}a(zG,"existsInArray");function rce(){if(ju.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=bo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return ju.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(rce,"getRoutes");function nce(e){let t=$G.deleteRoutesValidator(e);if(t)throw VG(t,t.message,KG.BAD_REQUEST,void 0,void 0,!0);if(ju.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED))return sce(e);let r=[],n=[],s=ju.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{zG(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),bo.updateConfigValue(Ts.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:WG,deleted:r,skipped:n}}a(nce,"deleteRoutes");function sce(e){let t=bo.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],o=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let f=e.routes[l],d=!1;for(let h=0,_=r.length;h<_;h++){let p=r[h];if(f.host===p.host&&f.port===p.port){r.splice(h,1),d=!0,o=!0,s.push(f);break}}if(!d){let h=!0;for(let _=0,p=n.length;_<p;_++){let S=n[_];if(f.host===S.host&&f.port===S.port){n.splice(_,1),c=!0,h=!1,s.push(f);break}}h&&i.push(f)}}return o&&(r=wN.isEmptyOrZeroLength(r)?null:r,bo.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=wN.isEmptyOrZeroLength(n)?null:n,bo.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:WG,deleted:s,skipped:i}}a(sce,"deleteRoutesNats")});var JG=P((ePe,QG)=>{"use strict";var ah=require("alasql"),dl=require("recursive-iterator"),ei=X(),ice=oe(),ch=(G(),D($)),IN=class{static{a(this,"sql_statement_bucket")}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,ace(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=>ch.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=>!ch.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,o=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[o]&&t[i].tables[o][ch.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[o].attribute_permissions.length>0?c=oce(t[i].tables[o].attribute_permissions):c=global.hdb_schema[i][o].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(o).filter(u=>!ch.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let f=new ah.yy.Column({columnid:u});s.tableid&&(f.tableid=s.tableid),this.ast.columns.push(f),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(o,l)}}),this.ast}};function oce(e){return e.filter(t=>t[ch.PERMS_CRUD_ENUM.READ])}a(oce,"filterReadRestrictedAttrs");function ace(e,t,r,n,s){cce(e,t,r,n,s)}a(ace,"interpretAST");function lh(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,o=e.tableid;e.as&&(o=e.as),s.set(o,i)}}a(lh,"addSchemaTableToMap");function cce(e,t,r,n,s){if(!e){ei.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof ah.yy.Insert?fce(e,t,r):e instanceof ah.yy.Select?lce(e,t,r,n,s):e instanceof ah.yy.Update?uce(e,t,r):e instanceof ah.yy.Delete?dce(e,t,r):ei.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(cce,"getRecordAttributesAST");function lce(e,t,r,n,s){if(!e){ei.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(ice.isEmptyOrZeroLength(i)){ei.error("No schema specified");return}e.from.forEach(c=>{lh(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),lh(c.table,t,r,n,s)});let o=new dl(e.columns);for(let{node:c}of o)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{ei.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 dl(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let f=u.tableid?u.tableid:l;if(!t.get(i).has(f))if(r.has(f))f=r.get(f);else{ei.info(`table specified as ${f} not found.`);continue}t.get(i).get(f).indexOf(u.columnid)<0&&t.get(i).get(f).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new dl(c.on);for(let{node:u}of l)if(u&&u.columnid){let f=u.tableid,d=s.get(f);if(!t.get(d).has(f))if(r.has(f))f=r.get(f);else{ei.info(`table specified as ${f} not found.`);continue}t.get(d).get(f).indexOf(u.columnid)<0&&t.get(d).get(f).push(u.columnid)}}),e.order){let c=new dl(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,f=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(f).has(u))if(r.has(u))u=r.get(u);else{ei.info(`table specified as ${u} not found.`);return}t.get(f).get(u).indexOf(l.columnid)<0&&t.get(f).get(u).push(l.columnid)}}}a(lce,"getSelectAttributes");function uce(e,t,r){if(!e){ei.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new dl(e.columns),s=e.table.databaseid;lh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&CN(e.table.tableid,s,i.columnid,t,r)}a(uce,"getUpdateAttributes");function dce(e,t,r){if(!e){ei.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new dl(e.where),s=e.table.databaseid;lh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&CN(e.table.tableid,s,i.columnid,t,r)}a(dce,"getDeleteAttributes");function fce(e,t,r){if(!e){ei.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new dl(e.columns),s=e.into.databaseid;lh(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&CN(e.into.tableid,s,i.columnid,t,r)}a(fce,"getInsertAttributes");function CN(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)}a(CN,"pushAttribute");QG.exports=IN});var ZG=P((rPe,XG)=>{"use strict";var Bg=(G(),D($)),Hg=class{static{a(this,"BaseLicense")}constructor(t=0,r=Bg.RAM_ALLOCATION_ENUM.DEFAULT,n=Bg.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},PN=class extends Hg{static{a(this,"ExtendedLicense")}constructor(t=0,r=Bg.RAM_ALLOCATION_ENUM.DEFAULT,n=Bg.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};XG.exports={BaseLicense:Hg,ExtendedLicense:PN}});var Xu=P((sPe,iq)=>{"use strict";var Ju=require("fs-extra"),kg=(Gm(),D(Fm)),tq=require("crypto"),_ce=require("moment"),hce=require("uuid").v4,Qr=X(),LN=require("path"),pce=oe(),fl=(G(),D($)),{totalmem:eq}=require("os"),mce=ZG().ExtendedLicense,Qu="invalid license key format",Ece="061183",gce="mofi25",Sce="aes-256-cbc",Tce=16,Ace=32,rq=ce(),{resolvePath:nq}=It();rq.initSync();var DN;iq.exports={validateLicense:sq,generateFingerPrint:yce,licenseSearch:UN,getLicense:Nce,checkMemoryLimit:wce};function MN(){return LN.join(rq.getHdbBasePath(),fl.LICENSE_KEY_DIR_NAME,fl.LICENSE_FILE_NAME)}a(MN,"getLicenseDirPath");function Rce(){let e=MN();return nq(LN.join(e,fl.LICENSE_FILE_NAME))}a(Rce,"getLicenseFilePath");function vN(){let e=MN();return nq(LN.join(e,fl.REG_KEY_FILE_NAME))}a(vN,"getFingerPrintFilePath");async function yce(){let e=vN();try{return await Ju.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await bce();throw Qr.error(`Error writing fingerprint file to ${e}`),Qr.error(t),new Error("There was an error generating the fingerprint")}}a(yce,"generateFingerPrint");async function bce(){let e=hce(),t=kg.hash(e,kg.HASH_FUNCTION.MD5),r=vN();try{await Ju.mkdirp(MN()),await Ju.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw Qr.error(`Error writing fingerprint file to ${r}`),Qr.error(n),new Error("There was an error generating the fingerprint")}return t}a(bce,"writeFingerprint");function sq(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:fl.RAM_ALLOCATION_ENUM.DEFAULT,version:fl.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return Qr.error("empty license key passed to validate."),r;let n=vN(),s=!1;try{s=Ju.statSync(n)}catch(i){Qr.error(i)}if(s){let i;try{i=Ju.readFileSync(n,"utf8")}catch{Qr.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(gce),c=o[1];c=Buffer.concat([Buffer.from(c)],Tce);let l=Buffer.concat([Buffer.from(i)],Ace),u=tq.createDecipheriv(Sce,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let f=null;try{f=u.update(o[0],"hex","utf8"),f.trim(),f+=u.final("utf8")}catch{let _=Oce(o[0],i);if(_)f=_;else throw r.valid_license=!1,r.valid_machine=!1,console.error(Qu),Qr.error(Qu),new Error(Qu)}let d;if(isNaN(f))try{d=JSON.parse(f),r.version=d.version,r.exp_date=d.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),d.ram_allocation&&(r.ram_allocation=d.ram_allocation)}catch{throw console.error(Qu),Qr.error(Qu),new Error(Qu)}else r.exp_date=f;r.exp_date<_ce().valueOf()&&(r.valid_date=!1),kg.validate(o[1],`${Ece}${i}${t}`,kg.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||Qr.error("Invalid licence"),r}a(sq,"validateLicense");function Oce(e,t){try{let r=tq.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{Qr.warn("Check old license failed")}}a(Oce,"checkOldLicense");function UN(){let e=new mce,t=[];try{t=Ju.readFileSync(Rce(),"utf-8").split(`\r
24
24
  `)}catch(r){r.code==="ENOENT"?Qr.debug("no license file found"):Qr.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(pce.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=sq(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){Qr.error("There was an error parsing the license string."),Qr.error(s),e.ram_allocation=fl.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return DN=e,e}a(UN,"licenseSearch");async function Nce(){return DN||await UN(),DN}a(Nce,"getLicense");function wce(){let e=UN().ram_allocation,t=process.constrainedMemory?.()||eq();if(t=Math.round(Math.min(t,eq())/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.`}a(wce,"checkMemoryLimit")});var HN=P((oPe,lq)=>{var Fg=Xu(),oq=require("chalk"),Qn=X(),aq=require("prompt"),{promisify:Ice}=require("util"),xN=(G(),D($)),Cce=require("fs-extra"),Pce=require("path"),Dce=oe(),{packageJson:Lce}=Et(),cq=ce();cq.initSync();var Mce=require("moment"),vce=Ice(aq.get),Uce=Pce.join(cq.getHdbBasePath(),xN.LICENSE_KEY_DIR_NAME,xN.LICENSE_FILE_NAME,xN.LICENSE_FILE_NAME);lq.exports={getFingerprint:Bce,setLicense:xce,parseLicense:BN,register:Hce,getRegistrationInfo:Fce};async function xce(e){if(e&&e.key&&e.company){try{Qn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await BN(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw Qn.error(r),Qn.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(xce,"setLicense");async function Bce(){let e={};try{e=await Fg.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw Qn.error(r),Qn.error(t),new Error(r)}return e}a(Bce,"getFingerprint");async function BN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");Qn.info("Validating license input...");let r=Fg.validateLicense(e,t);if(Qn.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(Qn.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(Qn.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{Qn.info("writing license to disk"),await Cce.writeFile(Uce,JSON.stringify({license_key:e,company:t}))}catch(n){throw Qn.error("Failed to write License"),n}return"Registration successful."}a(BN,"parseLicense");async function Hce(){let e=await kce();return BN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Hce,"register");async function kce(){let e=await Fg.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:oq.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:oq.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{aq.start()}catch(n){Qn.error(n)}let r;try{r=await vce(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(kce,"promptForRegistration");async function Fce(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await Fg.getLicense()}catch(r){throw Qn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(Dce.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=Lce.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=Mce.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(Fce,"getRegistrationInfo")});var dq=P((cPe,uq)=>{"use strict";var Gce=Dt(),kN=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d,h,_,p){this.port=t,o===null&&(o=void 0),this.server_name=r+Gce.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:o,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c}},this.cluster={name:f,port:d,routes:h,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l}},this.accounts={SYS:{users:_},HDB:{users:p}},this.system_account="SYS"}};uq.exports=kN});var hq=P((uPe,_q)=>{"use strict";var fq=Dt(),FN=class{static{a(this,"LeafConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d){this.port=t,d===null&&(d=void 0),this.server_name=r+fq.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+fq.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:f,ca_file:d,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:d,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:d,insecure:!0},urls:o,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};_q.exports=FN});var mq=P((fPe,pq)=>{"use strict";var GN=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};pq.exports=GN});var gq=P((hPe,Eq)=>{"use strict";var qce=Dt(),qN=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+qce.SERVER_SUFFIX.ADMIN,this.password=r}};Eq.exports=qN});var Vg=P((mPe,Aq)=>{"use strict";var _l=require("path"),hl=require("fs-extra"),$ce=dq(),Vce=hq(),Kce=mq(),Yce=gq(),$N=qn(),ed=oe(),Rn=It(),qg=(G(),D($)),uh=Dt(),{CONFIG_PARAMS:Qt}=qg,td=X(),dh=ce(),Sq=lo(),VN=Er(),Wce=Zs(),Zu="clustering",zce=1e4,Tq=50;Aq.exports={generateNatsConfig:Qce,removeNatsConfig:Jce,getHubConfigPath:jce};function jce(){let e=dh.get(Qt.ROOTPATH);return _l.join(e,Zu,uh.NATS_CONFIG_FILES.HUB_SERVER)}a(jce,"getHubConfigPath");async function Qce(e=!1,t=void 0){let r=dh.get(Qt.ROOTPATH);hl.ensureDirSync(_l.join(r,"clustering","leaf")),dh.initSync();let n=Rn.getConfigFromFile(Qt.CLUSTERING_TLS_CERT_AUTH),s=Rn.getConfigFromFile(Qt.CLUSTERING_TLS_PRIVATEKEY),i=Rn.getConfigFromFile(Qt.CLUSTERING_TLS_CERTIFICATE);!await hl.exists(i)&&!await hl.exists(!n)&&await Wce.createNatsCerts();let o=_l.join(r,Zu,uh.PID_FILES.HUB),c=_l.join(r,Zu,uh.PID_FILES.LEAF),l=Rn.getConfigFromFile(Qt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=_l.join(r,Zu,uh.NATS_CONFIG_FILES.HUB_SERVER),f=_l.join(r,Zu,uh.NATS_CONFIG_FILES.LEAF_SERVER),d=Rn.getConfigFromFile(Qt.CLUSTERING_TLS_INSECURE),h=Rn.getConfigFromFile(Qt.CLUSTERING_TLS_VERIFY),_=Rn.getConfigFromFile(Qt.CLUSTERING_NODENAME),p=Rn.getConfigFromFile(Qt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await VN.checkNATSServerInstalled()||$g("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await $N.listUsers(),g=Rn.getConfigFromFile(Qt.CLUSTERING_USER),R=await $N.getClusterUser();(ed.isEmpty(R)||R.active!==!0)&&$g(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await Gg(Qt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await Gg(Qt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await Gg(Qt.CLUSTERING_HUBSERVER_NETWORK_PORT),await Gg(Qt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[se,z]of S.entries())z.role?.role===qg.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(E.push(new Yce(z.username,Sq.decrypt(z.hash))),T.push(new Kce(z.username,Sq.decrypt(z.hash))));let O=[],{hub_routes:v}=Rn.getClusteringRoutes();if(!ed.isEmptyOrZeroLength(v))for(let se of v)O.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${se.host}:${se.port}`);let F=new $ce(Rn.getConfigFromFile(Qt.CLUSTERING_HUBSERVER_NETWORK_PORT),_,o,i,s,n,d,h,p,Rn.getConfigFromFile(Qt.CLUSTERING_HUBSERVER_CLUSTER_NAME),Rn.getConfigFromFile(Qt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),O,E,T);n==null&&(delete F.tls.ca_file,delete F.leafnodes.tls.ca_file),t=ed.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===qg.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await hl.writeJson(u,F),td.trace(`Hub server config written to ${u}`));let q=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${p}`,j=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${p}`,te=new Vce(Rn.getConfigFromFile(Qt.CLUSTERING_LEAFSERVER_NETWORK_PORT),_,c,l,[q],[j],E,T,i,s,n,d);n==null&&delete te.tls.ca_file,(t===void 0||t===qg.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await hl.writeJson(f,te),td.trace(`Leaf server config written to ${f}`))}a(Qce,"generateNatsConfig");async function Gg(e){let t=dh.get(e);return ed.isEmpty(t)&&$g(`port undefined for '${e}'`),await ed.isPortTaken(t)&&$g(`'${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}a(Gg,"isPortAvailable");function $g(e){let t=`Error generating clustering config: ${e}`;td.error(t),console.error(t),process.exit(1)}a($g,"generateNatsConfigError");async function Jce(e){let{port:t,config_file:r}=VN.getServerConfig(e),{username:n,decrypt_hash:s}=await $N.getClusterUser(),i=0,o=2e3;for(;i<Tq;){try{let f=await VN.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){td.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=Tq)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=o*(i*2);u>3e4&&td.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await ed.async_set_timeout(u)}let c="0".repeat(zce),l=_l.join(dh.get(Qt.ROOTPATH),Zu,r);await hl.writeFile(l,c),await hl.remove(l),td.notify(e,"started.")}a(Jce,"removeNatsConfig")});var WN={};Be(WN,{compactOnStart:()=>Xce,copyDb:()=>wq});async function Xce(){Da.notify("Running compact on start"),console.log("Running compact on start");let e=(0,KN.get)(B.ROOTPATH),t=new Map,r=Ze();(0,YN.updateConfigValue)(B.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,Kg.join)(e,"backup",n+".mdb"),o=(0,Kg.join)(e,lc,n+"-copy.mdb"),c=0;try{c=await Rq(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){Da.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{db_path:s,copy_dest:o,backup_dest:i,record_count:c}),await wq(n,o),console.log("Backing up",n,"to",i),await(0,pl.move)(s,i,{overwrite:!0})}try{rd()}catch(n){Da.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}for(let[n,{db_path:s,copy_dest:i}]of t)console.log("Moving copy compacted",n,"to",s),await(0,pl.move)(i,s,{overwrite:!0}),await(0,pl.remove)((0,Kg.join)(e,lc,`${n}-copy.mdb-lock`));try{rd()}catch(n){Da.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){Da.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,YN.updateConfigValue)(B.STORAGE_COMPACTONSTART,!1);for(let[s,{db_path:i,backup_dest:o}]of t){console.error("Moving backup database",o,"back to",i);try{await(0,pl.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw rd(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await Rq(n);if(console.log("Database",n,"after compact has a total record count of",c),i!==c){o=!1;let l=`There is a discrepancy between pre and post compact record count for database ${n}.
25
25
  Total record count before compaction: ${i}, total after: ${c}.
26
26
  Database backup has not been removed and can be found here: ${s}`;Da.error(l),console.error(l)}(0,KN.get)(B.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||o===!1||(console.log("Removing backup",s),await(0,pl.remove)(s))}}async function Rq(e){let t=await(0,Nq.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}async function wq(e,t){console.log("copyDb start");let r=Ze()[e],n;for(let d in r){n=r[d].primaryStore.rootStore;break}let s=n.dbisDb,i=n.auditStore,o=(0,yq.open)(new bq.default(t)),c=o.openDB(Yg.INTERNAL_DBIS_NAME),l,u=0,f=s.useReadTransaction();try{for(let{key:h,value:_}of s.getRange({transaction:f})){let p=_.is_hash_attribute||_.isPrimaryKey,S,g;if(p&&(S=_.compression,g=Wg(),g?_.compression=g:delete _.compression,S?.dictionary?.toString()===g?.dictionary?.toString()&&(S=null,g=null)),c.put(h,_),!(p||_.indexed))continue;let R=new Oq.default(!p,p);R.encoding="binary",R.compression=S;let E=n.openDB(h,R);E.decoder=null,E.decoderCopies=!1,E.encoding="binary",R.compression=g;let T=o.openDB(h,R);T.encoder=null,console.log("copying",h,"from",e,"to",t),await d(E,T,p,f)}if(i){let h=n.openDB(Yg.AUDIT_STORE_NAME,fh);console.log("copying audit log for",e,"to",t),d(i,h,!1,f)}async function d(h,_,p,S){let g=0,R=0,E=1e7,T=null;for(;E-- >0;)try{for(let O of h.getKeys({start:T,transaction:S}))try{T=O;let{value:v,version:F}=h.getEntry(O,{transaction:S});l=_.put(O,v,p?F:void 0),g++,S.openTimer&&(S.openTimer=0),R+=(O?.length||10)+v.length,u++>5e3&&(await l,console.log("copied",g,"entries",R,"bytes"),u=0)}catch(v){console.error("Error copying record",typeof O=="symbol"?"symbol":O,"from",e,"to",t,v)}console.log("finish copying, copied",g,"entries",R,"bytes");return}catch{if(typeof T=="string"){if(T==="z")return console.error("Reached end of dbi",T,"for",e,"to",t);T=T.slice(0,-2)+"z"}else if(typeof T=="number")T++;else return console.error("Unknown key type",T,"for",e,"to",t)}}a(d,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{f.done(),o.close()}}var yq,Kg,pl,KN,bq,Oq,Yg,Nq,YN,Da,zN=be(()=>{Ue();yq=require("lmdb"),Kg=require("path"),pl=require("fs-extra"),KN=M(ce()),bq=M(Hf()),Oq=M(Bf()),Yg=M(Ft());G();so();Nq=M(uo()),YN=M(It()),Da=M(X());a(Xce,"compactOnStart");a(Rq,"getTotalDBRecordCount");a(wq,"copyDb")});var sd=P((OPe,vq)=>{"use strict";var Zce=require("minimist"),{isMainThread:QN,parentPort:hh,threadId:RPe}=require("worker_threads"),ot=(G(),D($)),Ui=X(),JN=oe(),jg=Vg(),zg=Er(),yPe=Dt(),Dq=It(),ti=id(),Iq=Yu(),{compactOnStart:ele}=(zN(),D(WN)),tle=uc(),{restartWorkers:Qg,onMessageByType:rle}=it(),{handleHDBError:nle,hdb_errors:sle}=he(),{HTTP_STATUS_CODES:ile}=sle,ph=ce(),{sendOperationToNode:Cq,getThisNodeName:ole,monitorNodeCAs:ale}=(ms(),D(Ra)),{getHDBNodeTable:bPe}=(Zc(),D(uO));ph.initSync();var _h=`Restarting HarperDB. This may take up to ${ot.RESTART_TIMEOUT_MS/1e3} seconds.`,cle="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",Pq="Clustering is not enabled so cannot be restarted",lle="Invalid service",nd,As;vq.exports={restart:Lq,restartService:XN};QN&&rle(ot.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await XN({service:e.workerType}):Lq({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function Lq(e){As=Object.keys(e).length===0,nd=await ti.isServiceRegistered(ot.PROCESS_DESCRIPTORS.HDB);let t=Zce(process.argv);if(t.service){await XN(t);return}if(As&&!nd){console.error(cle);return}if(As&&console.log(_h),nd){ti.enterPM2Mode(),Ui.notify(_h);let r=tle(Object.keys(ot.CONFIG_PARAM_MAP),!0);return JN.isEmptyOrZeroLength(Object.keys(r))||Dq.updateConfigValue(void 0,void 0,r,!0,!0),ule(),_h}return QN?(Ui.notify(_h),ph.get(ot.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await ele(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{Qg()},50)):hh.postMessage({type:ot.ITC_EVENT_TYPES.RESTART}),_h}a(Lq,"restart");async function XN(e){let{service:t}=e;if(ot.HDB_PROCESS_SERVICES[t]===void 0)throw nle(new Error,lle,ile.BAD_REQUEST,void 0,void 0,!0);if(ti.expectedRestartOfChildren(),nd=await ti.isServiceRegistered(ot.PROCESS_DESCRIPTORS.HDB),!QN){e.replicated&&ale(),hh.postMessage({type:ot.ITC_EVENT_TYPES.RESTART,workerType:t}),hh.ref(),await new Promise(s=>{hh.on("message",i=>{i.type==="restart-complete"&&(s(),hh.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===ole())continue;let i;try{({job_id:i}=await Cq(s,e))}catch(o){n.push({node:s.name,message:o.message});continue}n.push(await new Promise((o,c)=>{let u=2400,f=setInterval(async()=>{if(u--<=0){clearInterval(f);let _=new Error("Timed out waiting for restart job to complete");_.replicated=n,c(_)}let h=(await Cq(s,{operation:"get_job",id:i})).results[0];if(h.status==="COMPLETE"&&(clearInterval(f),o({node:s.name,message:h.message})),h.status==="ERROR"){clearInterval(f);let _=new Error(h.message);_.replicated=n,c(_)}},250)}))}return{replicated:n}}return}let r;switch(t){case ot.HDB_PROCESS_SERVICES.clustering:if(!ph.get(ot.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Pq;break}As&&console.log("Restarting clustering"),Ui.notify("Restarting clustering"),await Mq();break;case ot.HDB_PROCESS_SERVICES.clustering_config:case ot.HDB_PROCESS_SERVICES["clustering config"]:if(!ph.get(ot.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Pq;break}As&&console.log("Restarting clustering_config"),Ui.notify("Restarting clustering_config"),await ti.reloadClustering();break;case"custom_functions":case"custom functions":case ot.HDB_PROCESS_SERVICES.harperdb:case ot.HDB_PROCESS_SERVICES.http_workers:case ot.HDB_PROCESS_SERVICES.http:if(As&&!nd){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}As&&console.log("Restarting http_workers"),Ui.notify("Restarting http_workers"),As?await ti.restart(ot.PROCESS_DESCRIPTORS.HDB):await Qg("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Ui.error(r),As&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(XN,"restartService");async function ule(){await Mq(),await ti.restart(ot.PROCESS_DESCRIPTORS.HDB),await JN.async_set_timeout(2e3),ph.get(ot.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await jN(),As&&(await zg.closeConnection(),process.exit(0))}a(ule,"restartPM2Mode");async function Mq(){if(!Dq.getConfigFromFile(ot.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await Iq.getHDBProcessInfo()).clustering.length===0)Ui.trace("Clustering not running, restart will start clustering services"),await jg.generateNatsConfig(!0),await ti.startClusteringProcesses(),await ti.startClusteringThreads(),await jN(),As&&await zg.closeConnection();else{await jg.generateNatsConfig(!0),nd?(Ui.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await ti.restart(ot.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await ti.restart(ot.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await Iq.getHDBProcessInfo()).clustering.forEach(s=>{Ui.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await JN.async_set_timeout(3e3),await jN(),await zg.updateLocalStreams(),As&&await zg.closeConnection(),Ui.trace("Restart clustering restarting ingest and reply service threads");let t=Qg(ot.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=Qg(ot.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(Mq,"restartClustering");async function jN(){await jg.removeNatsConfig(ot.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await jg.removeNatsConfig(ot.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(jN,"removeNatsConfig")});var Kq=P((IPe,Vq)=>{"use strict";var wPe=require("lodash"),yn=(G(),D($)),{handleHDBError:Uq,hdb_errors:dle}=he(),{HDB_ERROR_MSGS:fle,HTTP_STATUS_CODES:_le}=dle,ZN=X();Vq.exports={getRolePermissions:ple};var ml=Object.create(null),hle=a(e=>({key:e,perms:{}}),"perms_template_obj"),kq=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),Fq=a((e=!1,t=!1,r=!1,n=!1)=>({[yn.PERMS_CRUD_ENUM.READ]:e,[yn.PERMS_CRUD_ENUM.INSERT]:t,[yn.PERMS_CRUD_ENUM.UPDATE]:r,[yn.PERMS_CRUD_ENUM.DELETE]:n}),"permissions_template"),ew=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...Fq(t,r,n,s)}),"table_perms_template"),xq=a((e,t=Fq())=>({attribute_name:e,describe:$q(t),[mh]:t[mh],[tw]:t[tw],[rw]:t[rw]}),"attr_perms_template"),Bq=a((e,t=!1)=>({attribute_name:e,describe:t,[mh]:t}),"timestamp_attr_perms_template"),{READ:mh,INSERT:tw,UPDATE:rw}=yn.PERMS_CRUD_ENUM,Gq=Object.values(yn.PERMS_CRUD_ENUM),qq=[mh,tw,rw];function ple(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[yn.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(ml[t]&&ml[t].key===n)return ml[t].perms;let s=mle(e,r);return ml[t]?ml[t].key=n:ml[t]=hle(n),ml[t].perms=s,s}catch(r){if(!e[yn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[yn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<yn.PERMS_UPDATE_RELEASE_TIMESTAMP){let n=`Role permissions for role '${t}' must be updated to align with new structure from the 2.2.0 release.`;throw ZN.error(n),ZN.debug(r),Uq(new Error,fle.OUTDATED_PERMS_TRANSLATION_ERROR,_le.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
@@ -129,4 +129,4 @@ Connection: close\r
129
129
  \r
130
130
  `))}},25).unref()}o.close?.(()=>{if(at.get(Xt.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&bd()==0)try{QY(ZY(at.get(Xt.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)))}catch{}clearInterval(c),setTimeout(()=>{console.log("forced close server",i,tT),o.cantCleanupProperly||wn.warn("Had to forcefully exit the thread",tT),process.exit(0)},5e3).unref()})}if(eW||process.env.DEV_MODE)try{require("inspector").close()}catch(i){wn.info("Could not close debugger",i)}}}).ref();let e;Zh&&!UEe&&(e=rW()),Promise.resolve(e).then(()=>{if(bd()===0)try{LEe(QI)}catch(t){console.error("Error displaying start-up log",t)}ep?.postMessage({type:Xt.ITC_EVENT_TYPES.CHILD_STARTED})})})}a(tW,"startServers");function rW(){let e=[];for(let t in qi){let r=qi[t];if(t.includes?.("/")&&bd()==0){OEe(t)&&QY(t),e.push(new Promise((o,c)=>{r.listen({path:t},()=>{o({port:t,name:r.name,protocol_name:r.protocol_name}),wn.info("Domain socket listening on "+t)}).on("error",c)}));continue}let n,s=at.get(Xt.CONFIG_PARAMS.HTTP_THREADRANGE);if(s){let o=typeof s=="string"?s.split("-"):s,c=bd();if(c<o[0]||c>o[1])continue}let i;try{let o=t.lastIndexOf(":");o>0?Zh?n={fd:Zh(+t.slice(o+1).replace(/[\[\]]/g,""),t.slice(0,o))}:n={host:+t.slice(o+1).replace(/[\[\]]/g,""),port:t.slice(0,o)}:Zh?n={fd:Zh(+t,"::")}:n={port:t}}catch(o){console.error(`Unable to bind to port ${t}`,o);continue}e.push(new Promise((o,c)=>{r.listen(n,()=>{o({port:t,name:r.name,protocol_name:r.protocol_name}),wn.trace("Listening on port "+t,tT)}).on("error",c)}))}return Promise.all(e)}a(rW,"listenOnPorts");!zI&&!EEe?.noServerStart&&tW();function ZI(e,t,r){let n=e?.read?e:new gEe({fd:e,readable:!0,writable:!0,allowHalfOpen:!0}),s=qi[t];if(s.isSecure&&(n.startTime=performance.now()),s)typeof s=="function"?s(n):s.emit("connection",n),r&&n.emit("data",r);else{let i=a(o=>{setTimeout(()=>{let c=qi[t];c?(typeof c=="function"?c(n):c.emit("connection",n),r&&n.emit("data",r)):o<5?i(o+1):(wn.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}a(ZI,"deliverSocket");var KY=new Map;function xEe(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=KY.get(s),r){case"connection":i=ZI(void 0,t),KY.set(s,i),i.write=(c,l,u)=>(ep.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(ep.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let o=i.destroy;i.destroy=()=>{o.call(i),ep.postMessage({requestId:s,event:"destroy"})};break;case"data":i._readableState.destroyed||i.emit("data",Buffer.from(n,"latin1"));break;case"drain":i._readableState.destroyed||i.emit("drain",{});break;case"end":i._readableState.destroyed||i.emit("end",{});break;case"error":i._readableState.destroyed||i.emit("error",{});break}}a(xEe,"proxyRequest");var{getComponentName:nT}=(Oh(),D(bh));function eC(e,t,r=!0){t||(t=at.get(Xt.CONFIG_PARAMS.HTTP_PORT));let n=qi[t];if(n){let s=n.lastServer||n;if(s===e)throw new Error(`Can not register the same server twice for the same port ${t}`);if(r&&!!s.sessionIdContext!=!!e.sessionIdContext&&+t)throw new Error(`Can not mix secure HTTPS and insecure HTTP on the same port ${t}`);s.off("unhandled",jY),s.on("unhandled",(i,o)=>{e.cantCleanupProperly&&(n.cantCleanupProperly=!0),e.emit("request",i,o)}),n.lastServer=e}else qi[t]=e;e.on("unhandled",jY)}a(eC,"registerServer");function tC(e){let t=[],r=e?.securePort;return r&&t.push({port:r,secure:!0}),r=e?.port,r&&t.push({port:r,secure:!1}),t.length===0&&(t=[],at.get(Xt.CONFIG_PARAMS.HTTP_PORT)!=null&&t.push({port:at.get(Xt.CONFIG_PARAMS.HTTP_PORT),secure:at.get(Xt.CONFIG_PARAMS.CUSTOMFUNCTIONS_NETWORK_HTTPS)}),at.get(Xt.CONFIG_PARAMS.HTTP_SECUREPORT)!=null&&t.push({port:at.get(Xt.CONFIG_PARAMS.HTTP_SECUREPORT),secure:!0})),e?.isOperationsServer&&at.get(Xt.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&t.push({port:ZY(at.get(Xt.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}a(tC,"getPorts");function rC(e,t){let r=[];for(let{port:n,secure:s}of tC(t))r.push(nW(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?JI[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,eC(e,n,!1)),rT[n]=iT(JI,n);return r}a(rC,"httpServer");function sT(e,t){let r=QI.get(e)??[];QI.set(e,[...r,t])}a(sT,"setPortServerMap");function nW(e,t,r,n){if(sT(e,{protocol_name:t?"HTTPS":"HTTP",name:nT()}),!eT[e]){let s=r?"operationsApi_network":"http",i=at.get(s+"_keepAliveTimeout"),o=at.get(s+"_timeout"),c=at.get(s+"_headersTimeout"),l={keepAliveTimeout:i,headersTimeout:c,requestTimeout:o,highWaterMark:128*1024,noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600,maxHeaderSize:at.get(Xt.CONFIG_PARAMS.HTTP_MAXHEADERSIZE)},u=at.get(s+"_mtls"),f=at.get(s+"_mtls_required"),d;if(t){let p=at.get("tls");d=at.get(s+"_http2"),Object.assign(l,{allowHTTP1:!0,rejectUnauthorized:!!f,requestCert:!!(u||n),ticketKeys:IEe(),SNICallback:XY(r?"operations-api":"server",u),ciphers:p.ciphers??p[0]?.ciphers})}let h=DEe(),_=eT[e]=(t?d?yEe:REe:TEe)(l,async(p,S)=>{try{let R=performance.now(),E=new JY(p,S);r&&(E.isOperationsServer=!0);let T=await rT[e](E);if(!T){if(E._nodeResponse.statusCode)return;T=sW(E)}if(T.headers?.set||(T.headers=new jI(T.headers)),h?T.headers?.set?.("Server","Unlicensed HarperDB, this should only be used for educational and development purposes"):T.headers?.set?.("Server","HarperDB"),T.status===-1){for(let ne of T.headers||[])S.setHeader(ne[0],ne[1]);return p.baseRequest=E,S.baseResponse=T,eT[e].emit("unhandled",p,S)}let O=T.status||200,v=performance.now(),F=v-R,q=T.body,j,te=!1;if(!T.handlesHeaders){let ne=T.headers||new jI;q?q.length>=0?(typeof q=="string"?ne.set("Content-Length",Buffer.byteLength(q)):ne.set("Content-Length",q.length),j=!0):q instanceof bEe&&(q.size?ne.set("Content-Length",q.size):q.on&&(te=!0,q.on("size",ie=>{S.headersSent||S.setHeader("Content-Length",ie)})),q=q.stream()):(ne.set("Content-Length","0"),j=!0);let le=`hdb;dur=${F.toFixed(2)}`;if(T.wasCacheMiss&&(le+=", miss"),PEe(ne,"Server-Timing",le,!0),!S.headersSent)if(te){if(S.statusCode=O,ne)if(ne[Symbol.iterator])for(let[ie,Re]of ne)S.setHeader(ie,Re);else for(let ie in ne)S.setHeader(ie,ne[ie])}else S.writeHead(O,ne&&(ne[Symbol.iterator]?Array.from(ne):ne));j&&S.end(q)}let se=E.handlerPath,z=E.method;if(Jh(F,"duration",se,z,T.wasCacheMiss==null?void 0:T.wasCacheMiss?"cache-miss":"cache-hit"),$Y(O<400,"success",se,z),$Y(1,"response_"+O,se,z),!j)if(q instanceof ReadableStream&&(q=VY.fromWeb(q)),(q[Symbol.iterator]||q[Symbol.asyncIterator])&&(q=VY.from(q)),q?.pipe){q.pipe(S),q.destroy&&S.on("close",()=>{q.destroy()});let ne=0;q.on("data",le=>{ne+=le.length}),q.on("end",()=>{Jh(performance.now()-v,"transfer",se,z),Jh(ne,"bytes-sent",se,z)})}else q?.then?q.then(ne=>{S.end(ne)},g):S.end(q)}catch(R){g(R)}function g(R){let E=R.headers;S.writeHead(R.statusCode||500,E&&(E[Symbol.iterator]?Array.from(E):E)),S.end(R.toString()),R.statusCode?R.statusCode===500?wn.warn(R):wn.info(R):wn.error(R)}a(g,"onError")});i>=0&&(_.keepAliveTimeout=i),c>=0&&(_.headersTimeout=c),t&&(_.ports||(_.ports=[]),_.ports.push(e),l.SNICallback.initialize(_),u&&(_.mtlsConfig=u),_.on("secureConnection",p=>{p._parent.startTime&&Jh(performance.now()-p._parent.startTime,"tls-handshake",e),Jh(p.isSessionReused(),"tls-reused",e)}),_.isSecure=!0),eC(_,e)}return eT[e]}a(nW,"getHTTPServer");function iT(e,t){let r=sW;for(let n=e.length;n>0;){let{listener:s,port:i}=e[--n];if(i===t||i==="all"){let o=r;r=a((...c)=>s(...c,o),"next_callback")}}return r}a(iT,"makeCallbackChain");function sW(e){return e.user&&(e._nodeRequest.user=e.user),{status:-1,body:"Not found",headers:new jI}}a(sW,"unhandled");function BEe(e,t){rC(e,{requestOnly:!0,...t})}a(BEe,"onRequest");function HEe(e,t){let r;if(t.securePort){sT(t.securePort,{protocol_name:"TLS",name:nT()});let n=XY("server",t.mtls),s=at.get("tls");r=wEe({rejectUnauthorized:!!t.mtls?.required,requestCert:!!t.mtls,noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600,ciphers:s.ciphers??s[0]?.ciphers,SNICallback:n},e),n.initialize(r),qi[t.securePort]=r}return t.port&&(sT(t.port,{protocol_name:"TCP",name:nT()}),r=SEe(e,{noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600}),qi[t.port]=r),r}a(HEe,"onSocket");Object.defineProperty(AEe.prototype,"upgrade",{get(){return"connection"in this.headers&&"upgrade"in this.headers&&this.headers.connection.toLowerCase().includes("upgrade")&&this.headers.upgrade.toLowerCase()=="websocket"},set(e){}});var YY=[],XI={};function iW(e,t){for(let{port:r}of tC(t))YY[t?.runFirst?"unshift":"push"]({listener:e,port:r}),XI[r]=iT(YY,r)}a(iW,"onUpgrade");var WY=[],zY={};function kEe(e,t){let r=[];for(let{port:n,secure:s}of tC(t)){sT(n,{protocol_name:s?"WSS":"WS",name:nT()});let i=nW(n,s,t?.isOperationsServer,t?.mtls);Xh[n]||(Xh[n]=new NEe({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),Xh[n].on("connection",(o,c)=>{let l=new JY(c);l.isWebSocket=!0;let u=rT[n](l);zY[n](o,l,u)}),iW((o,c,l,u)=>o.__harperdb_request_upgraded?u(o,c,l):Xh[n].handleUpgrade(o,c,l,f=>{o.__harperdb_request_upgraded=!0,u(o,c,l),Xh[n].emit("connection",f,o)}),{port:n}),i.on("upgrade",(o,c,l)=>{XI[n]&&XI[n](o,c,l)})),r.push(i),WY[t?.runFirst?"unshift":"push"]({listener:e,port:n}),zY[n]=iT(WY,n),rT[n]=iT(JI,n)}return r}a(kEe,"onWebSocket");function jY(e,t){t.writeHead(404),t.end(`Not found
131
131
  `)}a(jY,"defaultNotFound")});var qY={};Be(qY,{startHTTPThreads:()=>GEe,startSocketServer:()=>cC,updateWorkerIdleness:()=>hW});async function GEe(e=2,t){try{if(t)oC(0,1,!0);else{let{loadRootComponents:r}=oT();if(e===0)return(0,Ps.setMainIsWorker)(!0),await nC().startServers(),Promise.resolve([]);await r()}_W();for(let r=0;r<e;r++)oC(r,e);return Promise.all(fW)}finally{(0,Ps.threadsHaveStarted)()}}function _W(){let e=(0,lW.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),iC=setInterval(()=>{lT.notify(e)},FEe).unref())}function oC(e,t=1,r){if(sC++,(0,Ps.startWorker)("server/threads/threadServer.js",{name:uA.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((o,c)=>{function l(u){u.type===aA.CHILD_STARTED&&(n.removeListener("message",l),o(n))}a(l,"onMessage"),n.on("message",l),n.on("error",c)});fW.push(s),await s,Od.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",o=>{if(o.requestId){let c=cT.get(o.requestId);c&&c(o)}}),n.on("exit",i),n.on("shutdown",i);function i(){let o=Od.indexOf(n);o>-1&&Od.splice(o,1)}if(a(i,"removeWorker"),Nd){let o=Nd;Nd=[];for(let c of o)dW[c.localPort](null,c)}}}),r){let n=setInterval(()=>{aC?aC=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,Ps.shutdownWorkers)(),sC=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function cC(e=0,t){if(typeof e=="string")try{(0,uT.existsSync)(e)&&(0,uT.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=qEe:r=$Ee(t):r=lC;let n=(0,wd.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);return n._handle&&(n._handle.onconnection=dW[e]=function(s,i){r.readsData||(i.reading=!1,i.readStop()),aC=!0,r(i,(o,c)=>{if(!o){if(oW){let u=i._socket||new wd.Socket({handle:i,writable:!0,readable:!0});oW.deliverSocket(u,e,c),u.resume()}else sC>0?(Nd.length===0&&setTimeout(()=>{Nd.length>0&&console.warn("Incoming sockets/requests have been queued for workers to start, and no workers have handled them. Check to make sure an error is not preventing workers from starting")},1e4).unref(),i.localPort=e,Nd.push(i)):(console.log("start up a dynamic thread to handle request"),oC(0));Lt(!1,"socket-routed");return}o.requests++;let l=i.fd;if(l>=0)o.postMessage({port:e,fd:l,data:c});else{let u=i._socket||new wd.Socket({handle:i,writable:!0,readable:!0});YEe(u,o,e)}Lt(!0,"socket-routed")})},lT.info(`HarperDB ${uW.packageJson.version} Server running on port ${e}`)),n.on("error",s=>{console.error("Error in socket server",s)}),process.env._UNREF_SERVER&&n.unref(),n}function lC(e,t){let r,n=0;for(let s of Od){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=aT)return aT=i,t(r);n=i}aT=0,t(r)}function qEe(e,t){let r={};e.getpeername(r);let n=r.address,s=Id.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);lC(e,o=>{Id.set(n,{worker:o,lastUsed:i}),t(o)})}function $Ee(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new wd.Socket({handle:n,readable:!0,writable:!0});n._socket=i,i.on("data",o=>{n.readStop();let l=o.toString("latin1").match(t)?.[1],u=Id.get(l),f=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=f,s(u.worker);lC(n,d=>{Id.set(l,{worker:d,lastUsed:f}),s(d,o)})})}a(r,"findByHeaderAffinity")}function hW(){aT=0;for(let e of Od)e.expectedIdle=e.recentELU.idle+VEe,e.requests=1;Od.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function YEe(e,t,r){let n=KEe++;t.postMessage({port:r,requestId:n,event:"connection"}),e.on("data",s=>{let i=s.toString("latin1");t.postMessage({port:r,requestId:n,data:i,event:"data"})}).on("close",s=>{t.postMessage({port:r,requestId:n,event:"close",hadError:s})}).on("error",s=>{t.postMessage({port:r,requestId:n,event:"error",error:s})}).on("drain",s=>{t.postMessage({port:r,requestId:n,event:"drain",error:s})}).on("end",()=>{t.postMessage({port:r,requestId:n,event:"end"})}).resume(),cT.set(n,s=>{s.event=="data"&&e.write(Buffer.from(s.data,"latin1")),s.event=="end"&&(e.end(s.data&&Buffer.from(s.data,"latin1")),cT.delete(n)),s.event=="destroy"&&(e.destroy(),cT.delete(n))})}var Ps,wd,lT,uT,cW,lW,uW,Od,Nd,dW,oW,sC,fW,iC,FEe,aC,aT,aW,Id,VEe,cT,KEe,WI=be(()=>{Ps=M(it()),wd=require("net");G();lT=M(X()),uT=require("fs");Ci();cW=require("worker_threads"),lW=M(Xu()),uW=M(Et()),Od=[],Nd=[],dW=[],sC=0,fW=[];cW.isMainThread&&(process.on("uncaughtException",e=>{e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,Ps.onMessageFromWorkers)(e=>{e.type===lA.RESTART&&iC&&(clearInterval(iC),_W())}));FEe=6e5;a(GEe,"startHTTPThreads");a(_W,"licenseWarning");a(oC,"startHTTPWorker");a(cC,"startSocketServer");aT=0;a(lC,"findMostIdleWorker");aW=36e5,Id=new Map;a(qEe,"findByRemoteAddressAffinity");a($Ee,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of Id)r.lastUsed+aW<e&&Id.delete(t)},aW).unref();VEe=1e3;a(hW,"updateWorkerIdleness");(0,Ps.setMonitorListener)(hW);cT=new Map,KEe=1;a(YEe,"proxySocket")});var CW=P((cMe,IW)=>{var mW=M(require("cluster")),Wa=M(ce());G();var $i=M(X()),EW=M(require("fastify")),gW=M(require("@fastify/cors")),SW=M(require("@fastify/compress")),TW=M(require("@fastify/static")),AW=M(Bb()),RW=M(require("path")),yW=M(Et()),bW=M($s()),OW=M(oe()),NW=M(qn()),wW=M(Xu());Dr();var za=M(MS());eo();Wa.default.initSync();var WEe=6e4,zEe=1024*1024*1024,jEe="TRUE",{CONFIG_PARAMS:rp}=$,Cd;IW.exports={hdbServer:pW,start:pW};async function pW(e){try{$i.default.debug("In Fastify server"+process.cwd()),$i.default.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),$i.default.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=mW.default.isMaster,await QEe();let t=e.securePort>0;Cd=JEe(t),await Cd.ready(),e||(e={}),e.isOperationsServer=!0;try{Ke.http(Cd.server,e),Cd.server.closeIdleConnections||await Cd.listen({port:0,host:"::"})}catch(r){throw Cd.close(),$i.default.error(r),$i.default.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),$i.default.fatal(t),process.exit(1)}}a(pW,"operationsServer");async function QEe(){$i.default.trace("Configuring HarperDB process."),bW.default.setSchemaDataToGlobal(),await NW.default.setUsersWithRolesCache(),await wW.default.getLicense()}a(QEe,"setUp");function JEe(e){$i.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=XEe(e),r=(0,EW.default)(t);r.server.headersTimeout=ege(),r.setErrorHandler(za.serverErrorHandler);let n=ZEe();n&&r.register(gW.default,n),r.register(function(i,o,c){i.setNotFoundHandler(function(l,u){r.server.emit("unhandled",l.raw,u.raw)}),c()}),r.register(AW.default),r.register(SW.default),r.register(TW.default,{root:RW.default.join(yW.PACKAGE_ROOT,"studio/build-local")}),Cf(r);let s=Wa.default.get(oA.LOCAL_STUDIO_ON);return r.get("/",function(i,o){return!OW.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?o.sendFile("index.html"):o.sendFile("running.html")}),r.post("/",{preValidation:[za.reqBodyValidationHandler,za.authHandler],config:{isOperation:!0}},async function(i,o){return i.body?.operation?.startsWith("restart")&&o.header("Connection","close"),(0,za.handlePostRequest)(i,o)}),r.get("/health",()=>"HarperDB is running."),$i.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}a(JEe,"buildServer");function XEe(e){let t=Wa.default.get(rp.OPERATIONSAPI_NETWORK_TIMEOUT),r=Wa.default.get(rp.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:zEe,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}a(XEe,"getServerOptions");function ZEe(){let e=Wa.default.get(rp.OPERATIONSAPI_NETWORK_CORS),t=Wa.default.get(rp.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===jEe)&&(r={origin:!0,allowedHeaders:["Content-Type","Authorization","Accept"],credentials:!1},t&&t.length>0&&t[0]!==null&&t[0]!=="*"&&(r.origin=(n,s)=>s(null,t.indexOf(n)!==-1))),r}a(ZEe,"getCORSOpts");function ege(){return Wa.default.get(rp.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??WEe}a(ege,"getHeaderTimeoutConfig")});var pC={};Be(pC,{disableNATS:()=>rge,publishToStream:()=>_T,setNATSReplicator:()=>uC,setPublishToStream:()=>nge,setSubscription:()=>hC,start:()=>tge});function tge(){np.default.get(B.CLUSTERING_ENABLED)&&ige()}function rge(e=!0){vW=e}function nge(e,t){_T=e,hC=t}function ige(){if(vW||process.env._DISABLE_NATS)return;let e=Ze(),t=Object.keys(e);t.push("system");for(let r of t){let n=e[r];for(let s in n){let i=n[s];uC(s,r,i)}}il((r,n)=>{uC(r.tableName,r.databaseName,r),n&&xW(r)}),!PW&&(PW=!0)}function uC(e,t,r){if(t==="system"&&oge.includes(e))return;if(!r)return console.error(`Attempt to replicate non-existent table ${e} from database ${t}`);if(r.sources.some(s=>s?.isNATSReplicator))return;r.sourcedFrom(class extends qr{static{a(this,"NATSReplicator")}put(i){return n(this.getContext()).addWrite(t,{operation:"put",table:e,id:this.getId(),record:i})}delete(){return n(this.getContext()).addWrite(t,{operation:"delete",table:e,id:this.getId()})}publish(i){return n(this.getContext()).addWrite(t,{operation:"publish",table:e,id:this.getId(),record:i})}patch(i){return n(this.getContext()).addWrite(t,{operation:"patch",table:e,id:this.getId(),record:i})}invalidate(){n(this.getContext()).addWrite(t,{operation:"invalidate",table:e,id:this.getId()})}static defineSchema(i){xW(i)}static subscribe(){let i=new Un;return hC(t,e,i),i}static subscribeOnThisThread(i){return i<(np.default.get(B.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??sge)}static isEqual(i){return i.isNATSReplicator}static isNATSReplicator=!0;static shouldReceiveInvalidations=!0},{intermediateSource:!0});function n(s){let i=s?.transaction?.nats;if(!i)if(s?.transaction){s.transaction.nats=i=new dT(s.transaction,s);let o=s.transaction;for(;o.next;)o=o.next;o.next=s.transaction.nats,i.user=s.user,i.context=s}else i=UW;return i}a(n,"getNATSTransaction")}function xW(e){let t=np.default.get(B.CLUSTERING_NODENAME);_T(`${fC.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,_C.createNatsTableStreamName)(e.databaseName,e.tableName),void 0,{operation:"define_schema",schema:e.databaseName,table:e.tableName,attributes:e.attributes,__origin:{timestamp:Date.now(),node_name:t}})}var DW,fC,_C,LW,MW,np,fT,vW,_T,hC,sge,UW,PW,oge,dT,dC,BW=be(()=>{Ue();sa();DW=M(Er()),fC=M(Dt()),_C=M(lo());Yl();LW=M(Jb()),MW=M(ln()),np=M(ce());G();fT=M(X());a(tge,"start");a(rge,"disableNATS");_T=DW.publishToStream,hC=LW.setSubscription;a(nge,"setPublishToStream");sge=2;a(ige,"assignReplicationSource");oge=["hdb_job","hdb_analytics","hdb_raw_analytics","hdb_info","hdb_license"];a(uC,"setNATSReplicator");a(xW,"publishSchema");dT=class{constructor(t,r){this.transaction=t;this.options=r}static{a(this,"NATSTransaction")}user;writes_by_db=new Map;addWrite(t,r){r.expiresAt=this.context?.expiresAt;let n=this.writes_by_db.get(t);n||this.writes_by_db.set(t,n=[]),n.push(r)}commit({timestamp:t}){let r=np.default.get(B.CLUSTERING_NODENAME),n=[];for(let[s,i]of this.writes_by_db){let o=[],c=[],l,u;for(let f of i){let d=f.table,h=f.operation=="put"?"upsert":f.operation;l||(fT.trace(`Sending transaction event ${h}`),u=l={operation:h,schema:s,table:d,__origin:{user:this.user?.username,timestamp:t,node_name:r}},l.hash_values=c,h!=="delete"&&h!=="invalidate"&&(l.records=o)),l.table===d&&l.operation===h?(o.push(f.record),c.push(f.id)):u=u.next={operation:h,table:d,id:f.id,record:f.record},f.expiresAt&&(u.expiresAt=f.expiresAt)}l&&n.push(_T(`${fC.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,_C.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(f=>{throw fT.error("An error has occurred trying to replicate transaction",l,f),f.statusCode=504,f}))}return Promise.all(n)}},dC=class extends dT{static{a(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,MW.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};UW=new dC});async function qW({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let o=await mC.get(e,{returnNonexistent:!0});i=new SC(e,t,o),o&&(i.sessionWasPresent=!0)}else{if(e){let o=await mC.get(e);o&&o.delete()}i=new pT(e,t)}return n&&(n.id=e,n.user={username:t?.username},sp.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function EC(){return hT++,hT>65500&&(hT=1),hT}function gC(e,t,r){let{topic:n,retain:s}=e;e.data=t,e.async=!0,r.authorize=!0;let i=ds.getMatch(n,"mqtt");if(!i)throw new Error(`Can not publish to topic ${n} as it does not exist, no resource has been defined to handle this topic`);e.url=i.relativeURL;let o=i.Resource;return Ct(r,()=>s?t===void 0?o.delete(e,r):o.put(e,e.data,r):o.publish(e,e.data,r))}var kW,ja,FW,GW,HW,mC,sp,hT,pT,SC,$W=be(()=>{Ue();Xl();kW=M(ln()),ja=M(X());pc();FW=M(it()),GW=M(nC());Dr();HW=100,mC=_t({database:"system",table:"hdb_durable_session",attributes:[{name:"id",isPrimaryKey:!0},{name:"subscriptions",type:"array",elements:{attributes:[{name:"topic"},{name:"qos"},{name:"startTime"},{name:"acks"}]}}]}),sp=_t({database:"system",table:"hdb_session_will",attributes:[{name:"id",isPrimaryKey:!0},{name:"topic",type:"string"},{name:"data"},{name:"qos",type:"number"},{name:"retain",type:"boolean"},{name:"user",type:"any"}]});(0,FW.getWorkerIndex)()===0&&(async()=>{await GW.when_components_loaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of sp.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await Ke.getUser(r.user.username));try{await gC(r,t,r)}catch{(0,ja.warn)("Failed to publish will",t)}sp.delete(e.id)}})();a(qW,"getSession");hT=1;a(EC,"getNextMessageId");pT=class{static{a(this,"SubscriptionsSession")}listener;sessionId;user;request;socket;subscriptions=[];awaitingAcks;sessionWasPresent;keepalive;keepaliveTimer;constructor(t,r){this.sessionId=t,this.user=r}async addSubscription(t,r,n){let{topic:s,rh:i,startTime:o}=t,c=s.indexOf("?"),l,u;if(c>-1?(l=s.slice(c),u=s.slice(0,c)):u=s,!u)throw new Error("No topic provided");if(u.indexOf(".")>-1)throw new Error("Dots are not allowed in topic names");let f=this.subscriptions.find(R=>R.topic===s),d;f?(d=i>0,f.end(),this.subscriptions.splice(this.subscriptions.indexOf(f),1)):d=i===2;let h={search:l,async:!0,user:this.user,startTime:o,omitCurrent:d,url:""};o&&(0,ja.trace)("Resuming subscription from",s,"from",o);let _=ds.getMatch(u,"mqtt");if(!_){let R=new Error(`The topic ${s} does not exist, no resource has been defined to handle this topic`);throw R.statusCode=404,R}if(h.url=_.relativeURL,h.url.indexOf("+")>-1||h.url.indexOf("#")>-1){let R=h.url.slice(1);if(R.indexOf("#")>-1&&R.indexOf("#")!==R.length-1)throw new Error("Multi-level wildcards can only be used at the end of a topic");if(h.isCollection=!0,R.indexOf("+")===R.length-1)h.onlyChildren=!0,h.url="/"+R.slice(0,R.length-1);else{let E=R.split("/"),T;for(let F=0;F<E.length;F++)if(E[F].indexOf("+")>-1)if(E[F]==="+")T=!0;else throw new Error("Single-level wildcards can only be used as a topic level (between or after slashes)");if(n&&T)throw new Error("Filters can not be combined");let O=!0;E[E.length-1]==="#"&&(E.length--,O=!1),T&&(n=a(F=>{let q=F.id;if(!Array.isArray(q))if(q?.indexOf?.("/")>-1)q=q.split("/");else return!1;if(O&&q.length!==E.length)return!1;for(let j=0;j<E.length;j++)if(E[j]!=="+"&&E[j]!==q[j])return!1;return!0},"filter"));let v=E.indexOf("+");h.url="/"+(v>-1?E.slice(0,v):E).concat("").join("/")}}else h.isCollection=!1;let p=_.path,S=_.Resource,g=await Ct(h,async()=>{let R=this.createContext();R.topic=s,R.retainHandling=i,R.isCollection=h.isCollection;let E=await S.subscribe(h,R);if(!E)return;if(!E[Symbol.asyncIterator])throw new Error(`Subscription is not (async) iterable for topic ${s}`);let T=(async()=>{for await(let O of E)try{let v;if(O.type&&O.type!=="put"&&O.type!=="delete"&&O.type!=="message"&&O.type!=="patch"||n&&!n(O))continue;r?(O.topic=s,v=this.needsAcknowledge(O)):(O.acknowledge?.(),v=EC());let F=O.id;if(Array.isArray(F)&&(F=Jl(F)),F==null&&(F=""),await this.listener(p+"/"+F,O.value,v,t)===!1)break;this.awaitingAcks?.size>HW?await new Promise(j=>setTimeout(j,this.awaitingAcks.size-HW)):await new Promise(setImmediate)}catch(v){(0,ja.warn)(v)}})();return E});if(g)return g.topic=s,g.qos=t.qos,this.subscriptions.push(g),g}resume(){}needsAcknowledge(t){let r=EC();return t.acknowledge&&(this.awaitingAcks||(this.awaitingAcks=new Map),this.awaitingAcks.set(r,{acknowledge:t.acknowledge})),r}acknowledge(t){let r=this.awaitingAcks?.get(t);r&&(this.awaitingAcks.delete(t),r.acknowledge())}async removeSubscription(t){let r=this.subscriptions.find(n=>n.topic===t);if(r)return r.end(),this.subscriptions.splice(this.subscriptions.indexOf(r),1),!0}async publish(t,r){return gC(t,r,this.createContext())}createContext(){let t={session:this,socket:this.socket,user:this.user,authorize:!0};return this.request&&(t.request=this.request,t.url=this.request.url,t.headers=this.request.headers),t}setListener(t){this.listener=t}disconnect(t){this.keepaliveTimer&&clearTimeout(this.keepaliveTimer);let r=this.createContext();Ct(r,async()=>{try{if(!t){let n=await sp.get(this.sessionId);n?.doesExist()&&await gC(n,n.data,r)}}finally{await sp.delete(this.sessionId)}}).catch(n=>{(0,ja.warn)(`Error publishing MQTT will for ${this.sessionId}`,n)});for(let n of this.subscriptions)n.end();this.subscriptions=[]}receivedPacket(){this.keepalive&&(clearTimeout(this.keepaliveTimer),this.keepaliveTimer=setTimeout(()=>{this.socket?.destroy?this.socket.destroy(new Error("Keepalive timeout")):this.socket?.terminate()},this.keepalive*1500))}};a(gC,"publish");SC=class extends pT{static{a(this,"DurableSubscriptionsSession")}sessionRecord;constructor(t,r,n){super(t,r),this.sessionRecord=n||{id:t,subscriptions:[]}}async resume(){for(let t of this.sessionRecord.subscriptions||[])await this.resumeSubscription({omitCurrent:!0,topic:t.topic,qos:t.qos,startTime:t.startTime},!0,t.acks?r=>!t.acks.includes(r.localTime):null)}resumeSubscription(t,r,n){return super.addSubscription(t,r,n)}needsAcknowledge(t){this.awaitingAcks||(this.awaitingAcks=new Map);let r=EC(),n={topic:t.topic,timestamp:t.localTime};return t.acknowledge&&(n.acknowledge=t.acknowledge),this.awaitingAcks.set(r,n),r}acknowledge(t){let r=this.awaitingAcks?.get(t);if(!r)return;this.awaitingAcks?.delete(t),r.acknowledge?.();let n=r.topic;for(let[,s]of this.awaitingAcks)if(s.topic===n&&s.timestamp<r.timestamp){for(let i of this.sessionRecord.subscriptions)if(i.topic===n){i.acks||(i.acks=[]),i.acks.push(r.timestamp),(0,ja.trace)("Received ack",n,r.timestamp),this.sessionRecord.update();return}}for(let s of this.sessionRecord.subscriptions)s.topic===n&&(s.startTime=r.timestamp);this.sessionRecord.update()}async addSubscription(t,r){await this.resumeSubscription(t,r);let{qos:n,startTime:s}=t;return n>0&&!s&&this.saveSubscriptions(),t.qos}removeSubscription(t){let r=this.subscriptions.find(s=>s.topic===t),n=super.removeSubscription(t);return r.qos>0&&this.saveSubscriptions(),n}saveSubscriptions(){this.sessionRecord.subscriptions=this.subscriptions.map(t=>{let r=t.startTime;return r||(r=t.startTime=(0,kW.getNextMonotonicTime)()),(0,ja.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),mC.put(this.sessionRecord)}}});var AC={};Be(AC,{bypassAuth:()=>age,start:()=>cge});function age(){zW=!0}function cge({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new WW.EventEmitter},e.mqtt.events.on("error",()=>{}));let o=e.mqtt,c=[],l=r?.mtls;return n&&(c=e.ws((u,f,d,h)=>{if(f.headers.get("sec-websocket-protocol")!=="mqtt")return h(u,f,d);o.events.emit("connection",u),_r.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:_,onClose:p}=KW(u,S=>{u.send(S)},f,Promise.resolve(d).then(()=>f?.user),o);u.on("message",_),u.on("close",p),u.on("error",S=>{_r.info?.("WebSocket error",S)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let f;if(o.events.emit("connection",u),_r.debug?.(`Received ${u.getCertificate?"SSL":"TCP"} connection for MQTT from ${u.remoteAddress}`),l){if(u.authorized)try{let _=l.user;if(_!==null){(_===void 0||_==="Common Name"||_==="CN")&&(_=u.getPeerCertificate().subject.CN);try{f=await e.getUser(_,null,null),(0,Pd.get)(B.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&ET.notify?.({username:f?.username,status:xs.SUCCESS,type:jo.AUTHENTICATION,auth_strategy:"MQTT mTLS",remote_address:u.remoteAddress})}catch(p){throw(0,Pd.get)(B.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&ET.error?.({username:_,status:xs.FAILURE,type:jo.AUTHENTICATION,auth_strategy:"mqtt",remote_address:u.remoteAddress}),p}}else _r.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(_){o.events.emit("error",_,u),_r.error?.(_)}else if(l.required)return _r.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!f&&zW&&u.remoteAddress.includes("127.0.0.1")&&(f=await(0,YW.getSuperUser)(),_r.debug?.("Auto-authorizing local connection",f?.username));let{onMessage:d,onClose:h}=KW(u,_=>u.write(_),null,f,o);u.on("data",d),u.on("close",h),u.on("error",_=>{_r.info?.("Socket error",_)})},{port:t,securePort:s,mtls:l})),c}function KW(e,t,r,n,s){VW||(VW=!0,y_(d=>{mT>0&&d.push({metric:"mqtt-connections",connections:mT,byThread:!0})}));let i;mT++;let o,c={protocolVersion:4},l=(0,gT.parser)({protocolVersion:5});function u(d){l.parse(d)}a(u,"onMessage");function f(){mT--,i||(i=!0,o?.disconnect?.(),s.events.emit("disconnected",o,e),s.sessions.delete(o),Wn(!1,"connection","mqtt","disconnect"),_r.debug?.("MQTT connection was closed",e.remoteAddress))}return a(f,"onClose"),l.on("packet",async d=>{n?.then&&(n=await n);let h=d.cmd;if(o)o.then&&await o;else if(h!=="connect"){_r.info?.("Received packet before connection was established, closing connection"),e?.destroy?e.destroy():e?.terminate();return}let _=d.topic,p=_?.indexOf("/",1),S=p>0?_.slice(0,p):_;Lt(d.length,"bytes-received",S,R(d),"mqtt");try{switch(o?.receivedPacket?.(),h){case"connect":if(c.protocolVersion=d.protocolVersion,d.username)try{n=await Ke.getUser(d.username,d.password.toString(),r),(0,Pd.get)(B.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&ET.notify?.({username:n?.username,status:xs.SUCCESS,type:jo.AUTHENTICATION,auth_strategy:"MQTT",remote_address:e.remoteAddress})}catch(se){return(0,Pd.get)(B.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&ET.error?.({username:d.username,status:xs.FAILURE,type:jo.AUTHENTICATION,auth_strategy:"mqtt",remote_address:e.remoteAddress}),s.events.emit("auth-failed",d,e,se),Wn(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:4,returnCode:134})}if(!n&&s.requireAuthentication)return s.events.emit("auth-failed",d,e),Wn(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:4,returnCode:134});try{if(s.authorizeClient?.(d,n),d.will){let se=e.deserialize||(e.deserialize=no(r?.headers.get?.("content-type")));d.will.data=d.will.payload?.length>0?se(d.will.payload):void 0,delete d.will.payload}o=qW({user:n,...d}),o=await o,o.socket=e,r&&(o.request=r),s.sessions.add(o)}catch(se){return _r.error?.(se),s.events.emit("auth-failed",d,e,se),Wn(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:se.code||5,returnCode:se.code||128})}s.events.emit("connected",o,e),Wn(!0,"connection","mqtt","connect"),g({cmd:"connack",sessionPresent:o.sessionWasPresent,reasonCode:0,returnCode:0});let T=a(async(se,z,ne,le)=>{try{if(i)throw new Error("Session disconnected while trying to send message to",se);let ie=se.indexOf("/",1),Re=ie>0?se.slice(0,ie):se;g({cmd:"publish",topic:se,payload:await E(z),messageId:ne||Math.floor(Math.random()*1e8),qos:le.qos},Re);let pe=e._socket??e;return pe.writableNeedDrain?new Promise(Ae=>pe.once("drain",Ae)):!pe.closed}catch(ie){return _r.error?.(ie),o?.disconnect(),s.sessions.delete(o),!1}},"listener");o.setListener(T),o.sessionWasPresent&&await o.resume();break;case"subscribe":let O=[];for(let se of d.subscriptions){let z;try{let ne=await o.addSubscription(se,se.qos>=1);z=ne?ne.qos||0:c.protocolVersion<5?128:143}catch(ne){s.events.emit("error",ne,e,se,o),ne.statusCode?ne.statusCode===500?_r.warn?.(ne):_r.info?.(ne):_r.error?.(ne),z=c.protocolVersion<5?128:ne.statusCode===403?135:ne.statusCode===404?143:128}O.push(z)}await o.committed,g({cmd:"suback",granted:O,messageId:d.messageId});break;case"unsubscribe":{let se=[];for(let z of d.unsubscriptions)se.push(o.removeSubscription(z)?0:17);g({cmd:"unsuback",granted:se,messageId:d.messageId});break}case"pubrel":g({cmd:"pubcomp",messageId:d.messageId,reasonCode:0});return;case"publish":let v=d.qos===2?"pubrec":"puback",F=e.deserialize||(e.deserialize=no(r?.headers.get?.("content-type"))),j=(d.payload?.length||0)>0?F(d.payload):void 0,te;try{te=await o.publish(d,j)}catch(se){s.events.emit("error",se,e,d,o),_r.warn?.(se),d.qos>0&&g({cmd:v,messageId:d.messageId,reasonCode:128},d.topic);break}d.qos>0&&g({cmd:v,messageId:d.messageId,reasonCode:te===!1?144:0},d.topic);break;case"pubrec":g({cmd:"pubrel",messageId:d.messageId,reasonCode:0});break;case"pubcomp":case"puback":o.acknowledge(d.messageId);break;case"pingreq":g({cmd:"pingresp"});break;case"disconnect":i=!0,o?.disconnect(!0),s.events.emit("disconnected",o,e),s.sessions.delete(o),Wn(!0,"connection","mqtt","disconnect"),_r.debug?.("Received disconnect command, closing MQTT session",e.remoteAddress),e.close?e.close():e.end();break}}catch(T){s.events.emit("error",T,e,d,o),_r.error?.(T),g({cmd:"disconnect"})}function g(T,O){let v=(0,gT.generate)(T,c);t(v),Lt(v.length,"bytes-sent",O,R(T),"mqtt")}a(g,"sendPacket");function R(T){return T.qos>0?T.cmd+",qos="+T.qos:T.cmd}a(R,"packetMethodName");function E(T){return aa(T,r)}a(E,"serialize")}),l.on("error",d=>{_r.warn("MQTT parsing error, closing connection:",d.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:f}}var gT,YW,Pd,TC,WW,ET,_r,zW,VW,mT,jW=be(()=>{gT=require("mqtt-packet");$W();YW=M(qn());eo();Ci();Dr();Pd=M(ce());G();TC=M(mi()),WW=require("events"),ET=(0,TC.loggerWithTag)("auth-event"),_r=(0,TC.loggerWithTag)("mqtt"),zW=(0,Pd.get)(B.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;a(age,"bypassAuth");a(cge,"start");mT=0;a(KW,"onSocket")});var bh={};Be(bh,{component_errors:()=>Ld,getComponentName:()=>_ge,loadComponent:()=>AT,loadComponentDirectories:()=>ez,setErrorReporter:()=>fge});function ez(e,t){t&&(yC=t),e&&(NC=e);let r=[];if((0,ut.existsSync)(RC)){let s=(0,ut.readdirSync)(RC,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let o=i.name,c=(0,Tt.join)(RC,o);r.push(AT(c,yC,rA,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(AT(n,yC,n,!1,null,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{ZW=!0})}function fge(e){ip=e}function hge(e,t){return new Promise((r,n)=>{let s=Ze().system.hdb_info;if(!s)return r();let i=setTimeout(()=>{s.primaryStore.unlock(e,0),n(new Error("symlinking harperdb module timed out"))},1e4);if(s.primaryStore.attemptLock(e,0,()=>{clearTimeout(i),r()}))try{(0,ut.rmSync)(t,{recursive:!0,force:!0}),(0,ut.existsSync)((0,Tt.join)(e,"node_modules"))||(0,ut.mkdirSync)((0,Tt.join)(e,"node_modules")),(0,ut.symlinkSync)(CC.PACKAGE_ROOT,t,"dir"),r()}finally{s.primaryStore.unlock(e,0)}})}async function AT(e,t,r,n,s,i){let o=(0,ut.realpathSync)(e);if(ST.has(o))return ST.get(o);ST.set(o,!0),s&&(NC=s);try{let c;n&&(Ld=new Map);let l=(0,Tt.join)(e,"harperdb-config.yaml");(0,ut.existsSync)(l)?c=n?(0,RT.getConfigObj)():(0,bC.parseDocument)((0,ut.readFileSync)(l,"utf8")).toJSON():!n&&(0,ut.existsSync)(l=(0,Tt.join)(e,"config.yaml"))?c=(0,bC.parseDocument)((0,ut.readFileSync)(l,"utf8")).toJSON():c=wC;try{let d=(0,Tt.join)(e,"node_modules","harperdb");(n||((0,ut.existsSync)(d)||!e.startsWith((0,OC.getHdbBasePath)()))&&(!(0,ut.existsSync)(d)||(0,ut.realpathSync)(CC.PACKAGE_ROOT)!==(0,ut.realpathSync)(d)))&&await hge(e,d)}catch(d){Ml.default.error("Error symlinking harperdb module",d),d.code=="EPERM"&&process.platform==="win32"&&Ml.default.error('You may need to enable developer mode in "Settings" / "System" (or "Update & Security") / "For developers", in order to enable symlinks so components can use `import from "harperdb"`')}let u=TT,f=n;for(let d in c){TT=d;let h=c[d];if(Ld.set(n?d:(0,Tt.basename)(e),!1),!h)continue;let _,p=h.package;try{if(p){let T=e,O;for(;!(0,ut.existsSync)(O=(0,Tt.join)(T,"node_modules",d));)if(T=(0,Tt.dirname)(T),T.length<(0,OC.getHdbBasePath)().length){O=null;break}if(O)_=await AT(O,t,r,!1),f=!0;else throw new Error(`Unable to find package ${d}:${p}`)}else _=dge[d];if(!_)continue;let S=a(T=>(T.origin=r,_t(T)),"ensureTable"),g=h.network||(h.port||h.securePort)&&h,R=g?.securePort||g?.https&&g.port,E=!g?.https&&g?.port;if(Dd.isMainThread&&(_=await _.startOnMainThread?.({server:Ke,ensureTable:S,port:E,securePort:R,resources:t,...h})||_,n&&g))for(let T of[E,R])try{if(+T&&!QW.includes(T)){let O=IC.get(B.HTTP_SESSIONAFFINITY);O&&Ml.default.warn("Session affinity is not recommended and may cause memory leaks"),(O||!RE)&&(QW.push(T),cC(T,O))}}catch(O){console.error("Error listening on socket",T,O,d)}if(t.isWorker&&(_=await _.start?.({server:Ke,ensureTable:S,port:E,securePort:R,resources:t,...h})||_),NC.set(_,!0),(_.handleFile||_.handleDirectory||_.setupFile||_.setupDirectory)&&h.files!=null){if(h.files.includes(".."))throw(0,XW.handleHDBError)("Can not reference parent directories");let T=(0,Tt.join)(e,h.files).replace(/\\/g,"/"),O=T.indexOf("/*");if(O>-1&&h.files!==wC[d]?.files&&!(0,ut.existsSync)(T.slice(0,O)))throw new Error(`The path '${T.slice(0,O)}' does not exist and cannot be used as the base of the resolved 'files' path value '${h.files}'`);let v=(0,Tt.basename)(e),F=h.path||"/";F=F.startsWith("/")?F:F.startsWith("./")?"/"+v+F.slice(2):F==="."?"/"+v:"/"+v+"/"+F;let q,j,te;if(h.root){let z=h.root;z.startsWith("/")&&(z=z.slice(1)),z.endsWith("/")&&(z=z.slice(0,-1)),z+="/",j=(0,Tt.join)(e,z)}else(te=T.indexOf("/*"))>-1?(j=T.slice(0,te+1),q=(0,Tt.relative)(e,j)):h.files.indexOf("/")>-1&&(j=T.slice(0,T.lastIndexOf("/")+1),q=(0,Tt.relative)(e,j));let se=!1;if(Dd.isMainThread&&_.setupDirectory&&(se=await _.setupDirectory?.(F,j,t)),t.isWorker&&_.handleDirectory&&(se=await _.handleDirectory?.(F,j,t)),se){f=!0;continue}for(let z of await(0,JW.default)(T,{onlyFiles:!1,objectMode:!0})){let{path:ne,dirent:le}=z;f=!0;let ie=(0,Tt.relative)(e,ne).replace(/\\/g,"/");if(q)if(ie.startsWith(q))ie=ie.slice(q.length+1);else throw new Error(`The root path '${h.root}' does not reference a valid part of the file path '${ie}'.The root path should be used to indicate the relative path/part of the file path for determining the exported web path.`);let Re=F+(F.endsWith("/")?"":"/")+ie;try{if(le.isFile()){let pe=await uge(ne);Dd.isMainThread&&await _.setupFile?.(pe,Re,ne,t),t.isWorker&&await _.handleFile?.(pe,Re,ne,t)}else Dd.isMainThread&&await _.setupDirectory?.(Re,ne,t),t.isWorker&&await _.handleDirectory?.(Re,ne,t)}catch(pe){let Ae=`Could not load ${le.isFile()?"file":"directory"} '${ne}'${h.module?` using '${h.module}'`:""} for application '${e}' due to:
132
- `;pe.message=`${Ae}${pe.message}`,pe.stack=`${Ae}${pe.stack}`,ip?.(pe),Ml.default.error(pe),t.set(h.path||"/",new ia(pe)),Ld.set(n?d:(0,Tt.basename)(e),pe.message)}}}}catch(S){S.message=`Could not load component '${d}' for application '${(0,Tt.basename)(e)}' due to: ${S.message}`,ip?.(S),((0,op.getWorkerIndex)()===0?console:Ml.default).error(S),t.set(h.path||"/",new ia(S),null,!0),Ld.set(n?d:(0,Tt.basename)(e),S.message)}}if(TT=u,Dd.isMainThread&&!ZW&&i&&(0,op.watchDir)(e,async()=>ez()),c.extensionModule){let d=await EE((0,Tt.join)(e,c.extensionModule));return ST.set(o,d),d}if(!f&&t.isWorker){let d=`${e} did not load any modules, resources, or files, is this a valid component?`;ip?.(new Error(d)),((0,op.getWorkerIndex)()===0?console:Ml.default).error(d),Ld.set((0,Tt.basename)(e),d)}}catch(c){console.error(`Could not load application directory ${e}`,c),c.message=`Could not load application due to ${c.message}`,ip?.(c),t.set("",new ia(c))}}var ut,Tt,Dd,bC,IC,CC,JW,op,Ml,XW,OC,lge,RT,uge,RC,NC,ZW,yC,Ld,dge,wC,QW,ST,ip,TT,_ge,Oh=be(()=>{ut=require("fs"),Tt=require("path"),Dd=require("worker_threads"),bC=require("yaml"),IC=M(ce()),CC=M(Et());G();lL();VL();eB();sB();iB();$B();iK();dK();_K();JW=M(require("fast-glob")),op=M(it()),Ml=M(X());Sb();Dr();XW=M(he());Ue();WI();OC=M(ce()),lge=M(CW());Xg();BW();ms();jW();RT=M(It());yE();HA();({readFile:uge}=ut.promises),RC=(0,RT.resolvePath)(IC.get(B.COMPONENTSROOT)),NC=new Map,Ld=new Map;a(ez,"loadComponentDirectories");dge={REST:OE,rest:OE,graphql:sR,graphqlSchema:qA,roles:gb,jsResource:Ab,fastifyRoutes:lI,login:yb,static:uI,operationsApi:lge,customFunctions:{},http:{},clustering:pC,replication:Ra,authentication:Eh,mqtt:AC,loadEnv:dI},wC={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js",path:"."}};Object.defineProperty(wC,"static",{value:{files:"web/**"}});QW=[],ST=new Map;a(fge,"setErrorReporter");_ge=a(()=>TT,"getComponentName");a(hge,"symlinkHarperModule");a(AT,"loadComponent")});var oT=P((HMe,rz)=>{var{isMainThread:tz}=require("worker_threads"),{getTables:pge,getDatabases:xMe,table:BMe}=(Ue(),D(ct)),{loadComponentDirectories:mge,loadComponent:Ege}=(Oh(),D(bh)),{resetResources:gge}=(Xl(),D(iL)),Sge=aw(),Tge=It(),{dirname:Age}=require("path"),{getConnection:Rge}=Er(),yge=ce(),{CONFIG_PARAMS:bge}=(G(),D($)),{loadCertificates:Oge}=Zs(),PC=new Map;async function Nge(e=!1){!tz&&yge.get(bge.CLUSTERING_ENABLED)&&Rge();try{tz&&await Sge()}catch(n){console.error(n)}let t=gge();pge(),t.isWorker=e,await Oge(),await Ege(Age(Tge.getConfigFilePath()),t,"hdb",!0,PC),await mge(PC,t);let r=[];for(let[n]of PC)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}a(Nge,"loadRootComponents");rz.exports.loadRootComponents=Nge});var it=P((FMe,li)=>{"use strict";kA();var{Worker:wge,MessageChannel:Ige,parentPort:Vi,isMainThread:UC,threadId:Cge,workerData:Ki}=require("worker_threads"),{PACKAGE_ROOT:Pge}=Et(),{join:oz,isAbsolute:Dge,extname:Lge}=require("path"),{server:az}=(Dr(),D($l)),{watch:Mge,readdir:vge}=require("fs/promises"),{totalmem:nz}=require("os"),Md=(G(),D($)),cz=ce(),ci=X(),{randomBytes:Uge}=require("crypto"),{_assignPackageExport:xge}=ui(),sz=1024*1024,Qa=[],Ds=[],Bge=50,xC=1e4,Hge="restart",lz="request_thread_info",uz="resource_report",dz="thread_info",fz="added-port",kge="ack",DC;xge("threads",Ds);li.exports={startWorker:LC,restartWorkers:HC,shutdownWorkers:Vge,workers:Qa,setMonitorListener:Xge,onMessageFromWorkers:Kge,onMessageByType:Sz,broadcast:Wge,broadcastWithAcknowledgement:jge,setChildListenerByType:$ge,getWorkerIndex:_z,getWorkerCount:hz,getTicketKeys:mz,setMainIsWorker:Gge,setTerminateTimeout:Fge,restartNumber:Ki?.restartNumber||1};Ds.onMessageByType=Sz;Ds.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=Ds.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};li.exports.whenThreadsStarted=new Promise(e=>{li.exports.threadsHaveStarted=e});var BC;function Fge(e){xC=e}a(Fge,"setTerminateTimeout");function _z(){return Ki?Ki.workerIndex:BC?0:void 0}a(_z,"getWorkerIndex");function hz(){return Ki?Ki.workerCount:BC?1:void 0}a(hz,"getWorkerCount");function Gge(e){BC=e,li.exports.threadsHaveStarted()}a(Gge,"setMainIsWorker");var pz=1,yT;function mz(){return yT||(yT=UC?Uge(48):Ki.ticketKeys,yT)}a(mz,"getTicketKeys");Object.defineProperty(az,"workerIndex",{get(){return _z()}});Object.defineProperty(az,"workerCount",{get(){return hz()}});var Ez={[lz](e,t){Qge(t)},[uz](e,t){Jge(t,e)}};function LC(e,t={}){let r=process.constrainedMemory?.()||nz();r=Math.min(r,nz(),2e4*sz);let n=cz.get(Md.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/sz/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],o=[];for(let l of Ds){let u=new Ige;u.existingPort=l,i.push(u),o.push(u.port2)}Lge(e)||(e+=".js");let c=new wge(Dge(e)?e:oz(Pge,e),{resourceLimits:{maxOldGenerationSizeMb:n,maxYoungGenerationSizeMb:s},execArgv:["--enable-source-maps","--expose-internals"],argv:process.argv.slice(2),workerData:{addPorts:o,addThreadIds:i.map(l=>l.existingPort.threadId),workerIndex:t.workerIndex,workerCount:pz=t.threadCount,name:t.name,restartNumber:li.exports.restartNumber,ticketKeys:mz()},transferList:o,...t});for(let{port1:l,existingPort:u}of i)u.postMessage({type:fz,port:l,threadId:c.threadId},[l]);return OT(c,!0),c.unexpectedRestarts=t.unexpectedRestarts||0,c.startCopy=()=>LC(e,t),c.on("error",l=>{ci.error(`Worker index ${t.workerIndex} error:`,l)}),c.on("exit",l=>{Qa.splice(Qa.indexOf(c),1),!c.wasShutdown&&t.autoRestart!==!1&&(c.unexpectedRestarts<Bge?(t.unexpectedRestarts=c.unexpectedRestarts+1,LC(e,t)):ci.error(`Thread has been restarted ${c.restarts} times and will not be restarted`))}),c.on("message",l=>{Ez[l.type]?.(l,c)}),Qa.push(c),eSe(),t.onStarted&&t.onStarted(c),c.name=t.name,c}a(LC,"startWorker");var qge=[Md.THREAD_TYPES.HTTP];async function HC(e=null,t=Math.max(pz>3,1),r=!0){if(UC){try{process.chdir(process.cwd())}catch(o){ci.error("Unable to reestablish current working directory",o)}if(r){let{loadRootComponents:o}=oT();await o()}li.exports.restartNumber++,t<1&&(t=t*Qa.length);let n=[],s=[];for(let o of Qa.slice(0)){if(e&&o.name!==e||o.wasShutdown)continue;ci.trace("sending shutdown request to ",o.threadId),o.postMessage({restartNumber:li.exports.restartNumber,type:Md.ITC_EVENT_TYPES.SHUTDOWN}),o.wasShutdown=!0,o.emit("shutdown",{});let c=qge.indexOf(o.name)>-1,l=new Promise(u=>{let f=setTimeout(()=>{ci.warn("Thread did not voluntarily terminate, terminating from the outside",o.threadId),o.terminate()},xC*2).unref();o.on("exit",()=>{clearTimeout(f),n.splice(n.indexOf(l)),!c&&r&&o.startCopy(),u()})});if(n.push(l),c&&r){let u=o.startCopy(),f=new Promise(d=>{let h=a(_=>{_.type===Md.ITC_EVENT_TYPES.CHILD_STARTED&&(ci.trace("Worker has started",u.threadId),d(),s.splice(s.indexOf(f)),u.off("message",h))},"startListener");ci.trace("Waiting for worker to start",u.threadId),u.on("message",h)});s.push(f),n.length>=t&&await Promise.race(n),s.length>=t&&await Promise.race(s)}}await Promise.all(n),await Promise.all(s);let{restartService:i}=sd();r&&(e==="http"||!e)&&cz.get(Md.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else Vi.postMessage({type:Hge,workerType:e})}a(HC,"restartWorkers");function $ge(e,t){Ez[e]=t}a($ge,"setChildListenerByType");function Vge(e){return HC(e,1/0,!1)}a(Vge,"shutdownWorkers");var gz=[];function Kge(e){gz.push(e)}a(Kge,"onMessageFromWorkers");var MC=new Map;function Sz(e,t){let r=MC.get(e);r||MC.set(e,r=[]),r.push(t)}a(Sz,"onMessageByType");var Yge=10;async function Wge(e,t){let r=0;for(let n of Ds)try{n.postMessage(e),r++>Yge&&(r=0,await new Promise(setImmediate))}catch(s){ci.error("Unable to send message to worker",s)}t&&Az(e,null)}a(Wge,"broadcast");var bT=new Map,zge=1;function jge(e){return new Promise(t=>{let r=0;for(let n of Ds)try{let s=zge++,i=a(()=>{bT.delete(s),--r===0&&t(),n!==Vi&&--n.refCount===0&&n.unref()},"ack_handler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,bT.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,o]of bT)o.port===n&&o()})),n.postMessage(e),r++}catch(s){ci.error("Unable to send message to worker",s)}r===0&&t()})}a(jge,"broadcastWithAcknowledgement");function Qge(e){e.postMessage({type:dz,workers:Tz()})}a(Qge,"sendThreadInfo");function Tz(){let e=Date.now();return Qa.map(t=>({threadId:t.threadId,name:t.name,heapTotal:t.resources?.heapTotal,heapUsed:t.resources?.heapUsed,externalMemory:t.resources?.external,arrayBuffers:t.resources?.arrayBuffers,sinceLastUpdate:e-t.resources?.updated,...t.recentELU}))}a(Tz,"getChildWorkerInfo");function Jge(e,t){e.resources=t,e.resources.updated=Date.now()}a(Jge,"recordResourceReport");var vC;function Xge(e){vC=e}a(Xge,"setMonitorListener");var Zge=1e3,iz=!1;function eSe(){iz||(iz=!0,setInterval(()=>{for(let e of Qa){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}vC&&vC()},Zge).unref())}a(eSe,"startMonitoring");var tSe=1e3;if(Vi&&Ki?.addPorts){OT(Vi);for(let e=0,t=Ki.addPorts.length;e<t;e++){let r=Ki.addPorts[e];r.threadId=Ki.addThreadIds[e],OT(r)}setInterval(()=>{let e=process.memoryUsage();Vi.postMessage({type:uz,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},tSe).unref(),DC=a(()=>new Promise((e,t)=>{Vi.on("message",r),Vi.postMessage({type:lz});function r(n){n.type===dz&&(Vi.off("message",r),e(n.workers))}a(r,"receiveThreadInfo")}),"getThreadInfo")}else DC=Tz;li.exports.getThreadInfo=DC;function OT(e,t){Ds.push(e),e.on("message",r=>{if(r.type===fz)r.port.threadId=r.threadId,OT(r.port);else if(r.type===kge){let n=bT.get(r.id);n&&n()}else Az(r,e)}).on("close",()=>{Ds.splice(Ds.indexOf(e),1)}).on("exit",()=>{Ds.splice(Ds.indexOf(e),1)}),t?e.refCount=100:e.unref()}a(OT,"addPort");function Az(e,t){for(let n of gz)n(e,t);let r=MC.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){ci.error(s)}}a(Az,"notifyMessageListeners");if(UC){let e,t,r=new Set,n=a(async(s,i)=>{i&&(e=i);for(let o of await vge(s,{withFileTypes:!0}))o.isDirectory()&&o.name!=="node_modules"&&n(oz(s,o.name));try{for await(let{filename:o}of Mge(s,{persistent:!1}))r.add(o),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await HC(),console.log("Reloaded HarperDB components, changed files:",Array.from(r)),r.clear()},100)}catch(o){console.warn("Error trying to watch component directory",s,o)}},"watch_dir");li.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else Vi.on("message",async e=>{let{type:t}=e;t===Md.ITC_EVENT_TYPES.SHUTDOWN&&(li.exports.restartNumber=e.restartNumber,Vi.unref(),setTimeout(()=>{ci.warn("Thread did not voluntarily terminate",Cge),process.exit(0)},xC).unref())})});var Sx={};Be(Sx,{ACTION_32_BIT:()=>Tm,ACTION_64_BIT:()=>iSe,AUDIT_STORE_OPTIONS:()=>fh,Decoder:()=>sl,HAS_BLOBS:()=>pn,HAS_CURRENT_RESIDENCY_ID:()=>wc,HAS_EXPIRATION_EXTENDED_TYPE:()=>xf,HAS_ORIGINATING_OPERATION:()=>Uf,HAS_PREVIOUS_RESIDENCY_ID:()=>Ic,REMOTE_SEQUENCE_UPDATE:()=>ig,createAuditEntry:()=>Oc,getLastRemoved:()=>nSe,openAuditStore:()=>IT,readAuditEntry:()=>Pt,removeAuditEntry:()=>CT,setAuditRetention:()=>sSe,transactionKeyEncoder:()=>Pz});function IT(e){let t=e.auditStore=e.openDB(kC.AUDIT_STORE_NAME,{create:!1,...fh});t||(t=e.auditStore=e.openDB(kC.AUDIT_STORE_NAME,fh),yz(t,1)),t.rootStore=e,t.tableStores=[];let r=[];t.addDeleteRemovalCallback=function(l,u,f){return r[l]=f,t.tableStores[l]=u,t.deleteCallbacks=r,{remove(){delete r[l]}}};let n=null,s,i=0,o=GC;Qh(t.env.path,l=>{if(i=l,l)return c(100)});function c(l){l&&(o=l),clearTimeout(n);let u=new Promise(f=>{n=setTimeout(async()=>{if(await s,s=u,t.rootStore.status==="closed"||t.rootStore.status==="closing")return;let d=0,h,_;try{for(let{key:p,value:S}of t.getRange({start:1,snapshot:!1,end:Date.now()-FC/(1+i*i)})){try{h=CT(t,p,S)}catch(g){vd.warn("Error removing audit entry",g)}if(_=p,await new Promise(setImmediate),++d>=rSe){o=10;break}}await h}finally{d===0?o=Math.min(o<<1,FC/10):(yz(t,_),o>100&&(o=o>>1)),f(void 0),c()}},o).unref()});return u}if(a(c,"scheduleAuditCleanup"),t.scheduleAuditCleanup=c,(0,cp.getWorkerIndex)()===(0,cp.getWorkerCount)()-1&&c(),(0,cp.getWorkerIndex)()===0&&!Rz)for(let l of t.getKeys({reverse:!0,limit:1}))l>Date.now()&&(Rz=!0,vd.error("The current time is before the last recorded entry in the audit log. Time reversal can undermine the integrity of data tracking and certificate validation and the time must be corrected."));return t}function CT(e,t,r){let n=oSe(r),s;if(n&pn){s=Pt(r);let i=e.tableStores[s.tableId],o=i?.getEntry(s.recordId);(!o||o.version!==s.version||!o.value)&&Tc(()=>oa(s.getValue(i)),i.rootStore)}if((n&15)===qC){s=s||Pt(r);let i=s.tableId;e.tableStores[s.tableId]?.getEntry(s.recordId)?.version===s.version&&e.deleteCallbacks?.[i]?.(s.recordId,s.version)}return e.remove(t)}function yz(e,t){$C[0]=t,e.put(Symbol.for("last-removed"),Dz)}function nSe(e){let t=e.get(Symbol.for("last-removed"));if(t)return Dz.set(t),$C[0]}function sSe(e,t=GC){FC=e,GC=t}function Oc(e,t,r,n,s,i,o,c,l,u,f,d,h){let _=Lz[o];if(!_)throw new Error(`Invalid audit entry type ${o}`);let p=1;if(n&&(n>1?Ja.setFloat64(0,n):Ls.set(hR),p=9),l){if(l&255)throw new Error("Illegal extended type");p+=3}R(s),R(t),g(r),Ja.setFloat64(p,e),p+=8,l&wc&&R(u),l&Ic&&R(f),l&xf&&(Ja.setFloat64(p,d),p+=8),l&Uf&&R(Mz[h]),i?g(i):Ls[p++]=0,l?Ja.setUint32(n?8:0,_|l|3221225472):Ls[n?8:0]=_;let S=Ls.subarray(0,p);if(c)return Buffer.concat([S,c]);return S;function g(E){let T=p;p+=1,p=(0,vl.writeKey)(E,Ls,p);let O=p-T-1;O>127?O>16383?(vd.error("Key or username was too large for audit entry",E),p=T+1,Ls[T]=0):(Ls.copyWithin(T+2,T+1,p),Ja.setUint16(T,O|32768),p++):Ls[T]=O}function R(E){E<128?Ls[p++]=E:E<16384?(Ja.setUint16(p,E|32768),p+=2):E<1056964608?(Ja.setUint32(p,E|3221225472),p+=4):(Ls[p]=255,Ja.setUint32(p+1,E),p+=5)}}function oSe(e){let t=0;e[0]==66&&(t=8);let r=e[t];if(r<128)return r;let n=e.dataView||(e.dataView=new sl(e.buffer,e.byteOffset,e.byteLength));return n.position=t,n.readInt()}function Pt(e,t=0,r=void 0){try{let n=e.dataView||(e.dataView=new sl(e.buffer,e.byteOffset,e.byteLength));n.position=t;let s;e[n.position]==66&&(s=n.readFloat64());let i=n.readInt(),o=n.readInt(),c=n.readInt(),l=n.readInt(),u=n.position,f=n.position+=l,d=n.readFloat64(),h,_,p,S;if(i&wc&&(h=n.readInt()),i&Ic&&(_=n.readInt()),i&xf&&(p=n.readFloat64()),i&Uf){let T=n.readInt();S=Mz[T]}l=n.readInt();let g=n.position,R=n.position+=l,E;return{type:Lz[i&7],tableId:c,nodeId:o,get recordId(){return(0,vl.readKey)(e,u,f)},getBinaryRecordId(){return e.subarray(u,f)},version:d,previousLocalTime:s,get user(){return R>g?(0,vl.readKey)(e,g,R):void 0},get encoded(){return t?e.subarray(t,r):e},getValue(T,O,v){if(i&NT||i&ap&&!O)return E||(E=Tc(()=>T.decoder.decode(e.subarray(n.position,r)),T.rootStore)),E;if(i&ap&&v)return nb(T.getEntry(this.recordId),v,T)},getBinaryValue(){return i&(NT|ap)?e.subarray(n.position,r):void 0},extendedType:i,residencyId:h,previousResidencyId:_,expiresAt:p,originatingOperation:S}}catch(n){return vd.error("Reading audit entry error",n,e),{}}}var vl,wT,kC,cp,Cz,vd,Ls,Ja,Pz,fh,FC,rSe,$C,Dz,GC,Rz,NT,ap,bz,qC,Oz,Nz,wz,Iz,Tm,iSe,ig,wc,Ic,Uf,xf,pn,Lz,Mz,sl,so=be(()=>{vl=require("ordered-binary"),wT=M(ce()),kC=M(Ft());G();cp=M(it()),Cz=M(oe());nu();vd=M(X());sE();_s();XS();(0,wT.initSync)();Ls=Buffer.alloc(2816),Ja=new DataView(Ls.buffer,Ls.byteOffset,2816),Pz={writeKey(e,t,r){return e===vf?(t.set(vf,r),r+8):typeof e=="number"?((t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).setFloat64(r,e),r+8):(0,vl.writeKey)(e,t,r)},readKey(e,t,r){return e[t]===66?(e.dataView||(e.dataView=new DataView(e.buffer,e.byteOffset,e.byteLength))).getFloat64(t):(0,vl.readKey)(e,t,r)}},fh={encoding:"binary",keyEncoder:Pz},FC=(0,Cz.convertToMS)((0,wT.get)(B.LOGGING_AUDITRETENTION))||86400*3,rSe=1e3,$C=new Float64Array(1),Dz=new Uint8Array($C.buffer),GC=1e4,Rz=!1;a(IT,"openAuditStore");a(CT,"removeAuditEntry");a(yz,"updateLastRemoved");a(nSe,"getLastRemoved");a(sSe,"setAuditRetention");NT=16,ap=32,bz=1,qC=2,Oz=3,Nz=4,wz=5,Iz=6,Tm=14,iSe=15,ig=11,wc=512,Ic=1024,Uf=2048,xf=4096,pn=8192,Lz={put:bz|NT,[bz]:"put",delete:qC,[qC]:"delete",message:Oz|NT,[Oz]:"message",invalidate:Nz|ap,[Nz]:"invalidate",patch:wz|ap,[wz]:"patch",relocate:Iz,[Iz]:"relocate"},Mz={insert:1,update:2,upsert:3,1:"insert",2:"update",3:"upsert"};a(Oc,"createAuditEntry");a(oSe,"readAction");a(Pt,"readAuditEntry");sl=class extends DataView{static{a(this,"Decoder")}position=0;readInt(){let t;return t=this.getUint8(this.position++),t>=128?t>=192?t===255?(t=this.getUint32(this.position),this.position+=4,t):(t=this.getUint32(this.position-1)&1073741823,this.position+=3,t):(t=this.getUint16(this.position-1)&32767,this.position++,t):t}readFloat64(){try{let t=this.getFloat64(this.position);return this.position+=8,t}catch(t){throw t.message=`Error reading float64: ${t.message} at position ${this.position}`,t}}}});function YC(e,t,r,n,s){let i=e.primaryStore.env.path,o=e.primaryStore.tableId,c;s?.crossThreads===!1?(c=Uz,aSe(e.primaryStore,e.auditStore)):(c=vz,e.primaryStore.env.hasSubscriptionCommitListener||(e.primaryStore.env.hasSubscriptionCommitListener=!0,e.primaryStore.on("committed",()=>{xz(vz[i])})));let l=c[i]||(c[i]=[]);if(l.auditStore=e.auditStore,l.lastTxnTime==null&&(l.lastTxnTime=Date.now()),s?.scope==="full-database")return;let u=l[o];u||(u=l[o]=new Map,u.envs=l,u.tableId=o,u.store=e.primaryStore),t=Jl(t);let f=new KC(r);f.startTime=n;let d=u.get(t);return d?d.push(f):(u.set(t,d=[f]),d.tables=u,d.key=t),f.subscriptions=d,f}function xz(e){if(!e)return;let t=e.auditStore;t.resetReadTxn(),Bz(e.auditStore);let r;for(let{key:n,value:s}of t.getRange({start:e.lastTxnTime,exclusiveStart:!0})){e.lastTxnTime=n;let i=Pt(s),o=e[i.tableId];if(!o)continue;let c=i.recordId,l=Jl(c),u=0;do{let f=o.get(l);if(f){for(let h of f)if(!(u>0&&!(h.includeDescendants&&!(h.onlyChildren&&u>1)))){if(h.startTime>=n){(0,VC.info)("omitting",c,h.startTime,n);continue}try{let _;h.supportsTransactions&&h.txnInProgress!==i.version&&(_=!0,h.txnInProgress||(r?r.push(h):r=[h]),h.txnInProgress=i.version),h.listener(c,i,n,_)}catch(_){console.error(_),(0,VC.info)(_)}}}if(l==null)break;let d=l.lastIndexOf?.("/",l.length-2);d!==l.length-1&&u++,d>-1?l=l.slice(0,d+1):l=null}while(!0)}if(r)for(let n of r)n.txnInProgress=null,n.listener(null,{type:"end_txn"},e.lastTxnTime,!0)}function aSe(e,t){let r=t||e,n=r.env;if(!n.hasAfterCommitListener){n.hasAfterCommitListener=!0;let s=n.path;r.on("aftercommit",({next:i,last:o,txnId:c})=>{let l=Uz[s];if(!l)return;let u=a(()=>{r.threadLocalWrites||(r.threadLocalWrites=new Float64Array(r.getUserSharedBuffer("last-thread-local-write",new ArrayBuffer(8)))),l.txnTime=r.threadLocalWrites[0]||Date.now();try{xz(l)}finally{r.threadLocalWrites[0]=l.lastTxnTime,r.unlock("thread-local-writes")}},"acquiredLock");r.attemptLock("thread-local-writes",u)&&u()})}}function Bz(e){e.nextTransaction?.resolve();let t;e.nextTransaction=new Promise(r=>{t=r}),e.nextTransaction.resolve=t}function Yk(e){return e.nextTransaction||(YC({primaryStore:e,auditStore:e},null,null,0,{scope:"full-database"}),Bz(e)),e.nextTransaction}var VC,vz,Uz,KC,xO=be(()=>{VC=M(X());Yl();Xl();so();vz=Object.create(null),Uz=Object.create(null);a(YC,"addSubscription");KC=class extends Un{static{a(this,"Subscription")}listener;subscriptions;startTime;constructor(t){super(),this.listener=t,this.on("close",()=>this.end())}end(){if(this.subscriptions){if(this.subscriptions.splice(this.subscriptions.indexOf(this),1),this.subscriptions.length===0){let t=this.subscriptions.tables;if(t){let r=this.subscriptions.key;if(t.delete(r),t.size===0){let n=t.envs,s=t.dbi;delete n[s]}}}this.subscriptions=null}}toJSON(){return{name:"subscription"}}};a(xz,"notifyFromTransactionData");a(aSe,"listenToCommits");a(Bz,"nextTransaction");a(Yk,"whenNextTransaction")});var Vw={};Be(Vw,{EVICTED:()=>na,INVALIDATED:()=>fn,coerceType:()=>LT,makeTable:()=>vT,setServerUtilities:()=>pSe});function vT(e){let{primaryKey:t,indices:r,tableId:n,tableName:s,primaryStore:i,databasePath:o,databaseName:c,auditStore:l,schemaDefined:u,dbisDB:f,sealed:d,splitSegments:h,replicate:_}=e,{expirationMS:p,evictionMS:S,audit:g,trackDeletes:R}=e;S??=0;let{attributes:E}=e;E||(E=[]);let T=ER(i,n,l),O,v,F={},q=Promise.resolve(),j,te,se;for(let K of E)(K.assignCreatedTime||K.name==="__createdtime__")&&(j=K),(K.assignUpdatedTime||K.name==="__updatedtime__")&&(te=K),K.expiresAt&&(se=K),K.isPrimaryKey&&(F=K);let z,ne=[],le=[],ie=1,Re=2,pe={},Ae={},Bt=864e5,dt=0,Cn,nn,wr,Fd=!1,nc,WT=new Map,zT=new Map,Ht,Gd,qd=xl.get(B.REPLICATION_DATABASES);if(Array.isArray(qd)){for(let K of qd)if(K.name===c&&K.replicateTo>=0){Gd=K.replicateTo;break}}let jT=i.getRange({start:!1,end:!1}).constructor,Sp=10,$d=6;g&&Tp(),Qh(i.env.path,K=>{if(v)return zo(K)});class De extends qr{#e;#t;#n;#r;#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=o;static databaseName=c;static attributes=E;static replicate=_;static sealed=d;static splitSegments=h??!0;static createdTimeProperty=j;static updatedTimeProperty=te;static propertyResolvers;static userResolvers={};static sources=[];static getResidencyById;static get expirationMS(){return p}static dbisDB=f;static schemaDefined=u;static sourcedFrom(m,y){if(y&&(this.sourceOptions=y,(y.expiration||y.eviction||y.scanInterval)&&this.setTTLExpiration(y)),y?.intermediateSource)m.intermediateSource=!0,this.sources.unshift(m);else{if(this.sources.some(b=>!b.intermediateSource)){if(this.sources.some(b=>b.name===m.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(m)}v=v||m.get&&(!m.get.reliesOnPrototype||m.prototype.get),O=O||m.load;let L=a(b=>{let I=this.sources;if(I=I.filter(x=>x.intermediateSource&&x[b]&&(!x[b].reliesOnPrototype||x.prototype[b])),I.length>0)if(I.length===1){let x=I[0];return(N,H,U)=>{if(N?.source!==x)return x[b](H,U,N)}}else return(x,N,H)=>{let U=[];for(let Q of I){if(x?.source===Q)break;U.push(Q[b](N,H,x))}return Promise.all(U)}},"getApplyToIntermediateSource"),C=this.sources[this.sources.length-1];C.intermediateSource&&(C={});let A=a(b=>{if(C[b]&&(!C[b].reliesOnPrototype||C.prototype[b]))return(I,x,N)=>{if(!I?.source)return C[b](x,N,I)}},"getApplyToCanonicalSource");pe={put:A("put"),patch:A("patch"),delete:A("delete"),publish:A("publish")},Ae={put:L("put"),patch:L("patch"),delete:L("delete"),publish:L("publish"),invalidate:L("invalidate")};let w=C.shouldRevalidateEvents;return(async()=>{let b=!1,I,x=a(async(N,H)=>{let U=N.value,Q=N.table?Ye[c][N.table]:De;if(c===Jd&&(N.table===Gl.ROLE_TABLE_NAME||N.table===Gl.USER_TABLE_NAME)&&(b=!0),N.id===void 0&&(N.id=U[Q.primaryKey],N.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(N));N.source=m;let J={residencyId:ac(N.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:N.nodeId},k=await Q.getResource(N.id,H,J);switch(N.finished&&await N.finished,N.type){case"put":return w?k._writeInvalidate(U,J):k._writeUpdate(U,!0,J);case"patch":return w?k._writeInvalidate(U,J):k._writeUpdate(U,!1,J);case"delete":return k._writeDelete(J);case"publish":case"message":return k._writePublish(U,J);case"invalidate":return k._writeInvalidate(U,J);case"relocate":return k._writeRelocate(J);default:xe.default.error?.("Unknown operation",N.type,N.id)}},"writeUpdate");try{let N=m.subscribe;N&&R==null&&(R=!0);let H={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},U=m.subscribeOnThisThread?m.subscribeOnThisThread((0,Ul.getWorkerIndex)(),H):(0,Ul.getWorkerIndex)()===0,Q=N&&U&&await m.subscribe?.(H);if(Q){let J;for await(let k of Q)try{if(!(k.type==="transaction"?k.writes[0]:k)){xe.default.error?.("Bad subscription event",k);continue}if(k.source=m,k.type==="end_txn"){if(J?.resolve(),k.localTime&&I!==k.localTime){if(k.remoteNodeIds?.length>0){let ye=[Symbol.for("seq"),k.remoteNodeIds[0]],Y=f.get(ye),V=Y?.nodes;V||(V=[]);for(let _e of k.remoteNodeIds.slice(1)){let me=V.find(Te=>Te.id===_e);V=V.filter(Te=>Te.id!==_e||Te===me),me||(me={id:_e,seqId:0},V.push(me)),me.seqId=Math.max(Y?.seqId??1,k.localTime),_e===J?.nodeId&&(me.lastTxnTime=k.timestamp)}let ue=Math.max(Y?.seqId??1,k.localTime);xe.default.trace?.("Received txn",c,ue,new Date(ue),k.localTime,new Date(k.localTime),k.remoteNodeIds),f.put(ye,{seqId:ue,nodes:V})}I=k.localTime}k.onCommit&&J?.committed.then(k.onCommit);continue}if(J)if(k.beginTxn)J.resolve();else{J.write_promises.push(x(k,J));continue}!k.timestamp&&k.version&&(k.timestamp=k.version);let de=Ct(k,()=>{if(k.type==="transaction"){let ye=[];for(let Y of k.writes)try{ye.push(x(Y,k))}catch(V){throw V.message+=" writing "+JSON.stringify(Y)+" of event "+JSON.stringify(k),V}return Promise.all(ye)}else if(k.type==="define_schema"){let ye=this.attributes.slice(0),Y;for(let V of k.attributes)ye.find(ue=>ue.name===V.name)||(ye.push(V),Y=!0);Y&&(_t({table:s,database:c,attributes:ye,origin:"cluster"}),up.signalSchemaChange(new dp.SchemaEventMsg(process.pid,Yt.CREATE_TABLE,c,s)))}else return k.beginTxn?(J=k,J.write_promises=[x(k,k)],new Promise(ye=>{J.resolve=()=>ye(Promise.all(J.write_promises))})):x(k,k)});J&&(J.committed=de),b&&de&&!de?.waitingForUserChange&&(de.then(()=>up.signalUserChange(new dp.UserEventMsg(process.pid))),de.waitingForUserChange=!0),k.onCommit&&(de?de.then(k.onCommit):k.onCommit())}catch(Ce){xe.default.error?.("error in subscription handler",Ce)}}}catch(N){xe.default.error?.(N)}})(),this}static get isCaching(){return v}static get shouldRevalidateEvents(){return this.prototype.get!==De.prototype.get}static getResource(m,y,L){let C=super.getResource(m,y,L);if(m!=null){Ir(m);try{if(C.getRecord?.())return C;if(typeof m=="object"&&m&&!Array.isArray(m))throw new Error(`Invalid id ${JSON.stringify(m)}`);let A=!L?.async||i.cache?.get?.(m),w=Cr(y),b=w.getReadTxn();if(b?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return Pn(m,y,{transaction:b,ensureLoaded:L?.ensureLoaded},A,I=>{if(I?De._updateResource(C,I):C.#e=null,y.onlyIfCached&&y.noCacheStore){if(!C.doesExist())throw new Nr.ServerError("Entry is not cached",504)}else if(L?.ensureLoaded){let x=sn(m,I,y,C);if(x)return w?.disregardReadTxn(),C.#i=!0,zC(x,N=>(De._updateResource(C,N),C))}return C})}catch(A){throw A.message.includes("Unable to serialize object")&&(A.message+=": "+JSON.stringify(m)),A}}return C}static _updateResource(m,y){m.#r=y,m.#e=y?.value??null,m.#n=y?.version}ensureLoaded(){let m=sn(this.getId(),this.#r,this.getContext());if(m)return this.#i=!0,zC(m,y=>{this.#r=y,this.#e=y.value,this.#n=y.version})}static getNewId(){let m=F?.type;if(m==="String"||m==="ID")return super.getNewId();if(!Ht){let A=i.getEntry(Symbol.for("id_allocation")),w=A?.value,b;if(w&&w.nodeName===server.hostname&&(!ESe(i)||w.pid===process.pid)){let I=w.start,x=w.end;b=I;for(let N of i.getKeys({start:x,end:I,limit:1,reverse:!0}))b=N}else w=C(A?.version??null),b=w.start;Ht=new BigInt64Array([BigInt(b)+1n]),Ht=new BigInt64Array(i.getUserSharedBuffer("id",Ht.buffer)),Ht.maxSafeId=w.end}let y=Number(Atomics.add(Ht,0,1n)),L=m==="Int"?512:1048576;if(y+L>=Ht.maxSafeId){let A=a(w=>{Ht.maxSafeId=y+(m==="Int"?1023:4194303);let b=(m==="Int"?Math.pow(2,31):Math.pow(2,49))-1,I=w?void 0:i.useReadTransaction(),x=Number(Ht[0]);for(let U of i.getKeys({start:x+1,end:b,limit:1,transaction:I}))b=U;I?.done();let{value:N,version:H}=i.getEntry(Symbol.for("id_allocation"));if(Ht.maxSafeId<b){if(N.end>Ht.maxSafeId-100)return;xe.default.info?.("New id allocation",y,Ht.maxSafeId,H),i.put(Symbol.for("id_allocation"),{start:N.start,end:Ht.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),H)}else{xe.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${Ht.maxSafeId}, but id of ${b} detected`);let U=C(H);U.alreadyUpdated||Atomics.store(Ht,0,BigInt(U.start+1)),Ht.maxSafeId=U.end}},"updateEnd");y+L===Ht.maxSafeId?setImmediate(A):y+100>=Ht.maxSafeId&&(xe.default.warn?.(`Synchronous id allocation required on table ${s}${m=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>A(!0)))}return y;function C(A){let w=(m==="Int"?Math.pow(2,31):Math.pow(2,49))-1,b=w/4,I,x,N=!1,H,U;do{H=Math.floor(Math.random()*w),U={start:H,end:H+(m==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},I=0;for(let Q of i.getKeys({start:H,limit:1,reverse:!0}))I=Q;x=w;for(let Q of i.getKeys({start:H+1,end:w,limit:1}))x=Q;b*=.875,b<1e3&&!N&&(N=!0,xe.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${m==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,H,I,x,b))}while(!(b<x-H&&(b<H-I||I===0)));return i.transactionSync(()=>{let Q=i.getEntry(Symbol.for("id_allocation"));return(Q?.version??null)==A?(xe.default.info?.("Allocated new id range",U),i.put(Symbol.for("id_allocation"),U,Date.now()),U):(xe.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...Q.value})})}}static setTTLExpiration(m){if(typeof m=="number")p=m*1e3,S||(S=0);else if(m&&typeof m=="object")p=m.expiration*1e3,S=(m.eviction||0)*1e3,Bt=m.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(p<0)throw new Error("Expiration can not be negative");Bt=Bt||(p+S)/4,zo()}static getResidencyRecord(m){return f.get([Symbol.for("residency_by_id"),m])}static setResidency(m){De.getResidency=m&&((y,L)=>{try{return m(y,L)}catch(C){throw C.message+=` in residency function for table ${s}`,C}})}static setResidencyById(m){De.getResidencyById=m&&(y=>{try{return m(y)}catch(L){throw L.message+=` in residency function for table ${s}`,L}})}static getResidency(m,y){if(De.getResidencyById)return De.getResidencyById(m[t]);let L=Gd;if(y.replicateTo!=null){if(Array.isArray(y.replicateTo))return y.replicateTo.includes(server.hostname)?y.replicateTo:[server.hostname,...y.replicateTo];y.replicateTo>=0&&(L=y.replicateTo)}if(L>=0&&server.nodes){let C=[server.hostname];if(y.previousResidency)C.push(...y.previousResidency.slice(0,L));else{let A=server.nodes.map(I=>I.name),w=Math.floor(A.length*Math.random());C.push(...A.slice(w,w+L));let b=w+L-A.length;b>0&&C.push(...A.slice(0,b))}return C}}static enableAuditing(m=!0){g=m,m&&Tp(),De.audit=m}static coerceId(m){return m===""?null:LT(m,F)}static async dropTable(){delete Ye[c][s];for(let m of i.getRange({versions:!0,snapshot:!1,lazy:!0}))m.metadataFlags&pn&&m.value&&oa(m.value);if(c===o){for(let m of E)f.remove(De.tableName+"/"+m.name),r[m.name]?.drop();f.remove(De.tableName+"/"),i.drop(),await f.committed}else console.log("legacy dropTable"),await i.close(),await DT.default.remove(data_path),await DT.default.remove(data_path===standard_path?data_path+MDB_LOCK_FILE_SUFFIX:path.join(path.dirname(data_path),MDB_LEGACY_LOCK_FILE_NAME));up.signalSchemaChange(new dp.SchemaEventMsg(process.pid,Yt.DROP_TABLE,c,s))}get(m){if(typeof m=="string")return this.getProperty(m);if(this.isCollection)return this.search(m);if(this.getId()===null){if(m?.conditions||m?.size>0)return this.search(m);let y={records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:E};return this.getContext()?.includeExpensiveRecordCountEstimates?De.getRecordCount().then(L=>(y.recordCount=L.recordCount,y.estimatedRecordRange=L.estimatedRange,y)):y}if(m?.property)return this.getProperty(m.property);if(this.doesExist()||m?.ensureLoaded===!1||this.getContext()?.returnNonexistent)return this}allowRead(m,y){let L=sc(m);if(L?.read){if(L.isSuperUser)return!0;let C=L.attribute_permissions,A=y?.select;if(C?.length>0||Fd&&A){if(y||(y={}),A){let w=C?.length>0&&WC(C,"read");y.select=A.map(b=>{let I=b.name||b;if(!w||w[I]){let x=wr[I]?.definition?.tableClass;if(x){if(b.name||(b={name:b}),!x.prototype.allowRead.call(null,m,b))return!1;if(!b.select)return b.name}return b}}).filter(Boolean)}else y.select=C.filter(w=>w.read&&!wr[w.attribute_name]).map(w=>w.attribute_name);return y}else return!0}}allowUpdate(m,y){let L=sc(m);if(L?.update){let C=L.attribute_permissions;if(C?.length>0){let A=WC(C,"update");for(let w in y)if(!A[w])return!1;for(let w of C){let b=w.attribute_name;!w.update&&!(b in y)&&(y[b]=this.getProperty(b))}}return Wo(this.getContext())}}allowCreate(m,y){if(this.isCollection){let L=sc(m);if(L?.insert){let C=L.attribute_permissions;if(C?.length>0){let A=WC(C,"insert");for(let w in y)if(!A[w])return!1;return Wo(this.getContext())}else return Wo(this.getContext())}}else return this.allowUpdate(m,{})}allowDelete(m){return sc(m)?.delete&&Wo(this.getContext())}update(m,y){if(!Cr(this.getContext()))throw new Error("Can not update a table resource outside of a transaction");if(m===!1)return this;let C;return typeof m=="object"&&m&&(y?(Object.isFrozen(m)&&(m={...m}),this.#e={},this.#t=m):(C=this.#t,C&&(m=Object.assign(C,m)),this.#t=m)),this._writeUpdate(this.#t,y),this}addTo(m,y){if(typeof y=="number"||typeof y=="bigint")this.#s===kz?this.set(m,(+this.getProperty(m)||0)+y):(this.#s||this.update(),this.set(m,new aE(y)));else throw new Error("Can not add a non-numeric value")}subtractFrom(m,y){if(typeof y=="number")return this.addTo(m,-y);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this.#r}getRecord(){return this.#e}getChanges(){return this.#t}_setChanges(m){this.#t=m}setRecord(m){this.#e=m}invalidate(){this._writeInvalidate()}_writeInvalidate(m,y){let L=this.getContext(),C=this.getId();Ir(C),Cr(this.getContext()).addWrite({key:C,store:i,invalidated:!0,entry:this.#r,before:pe.invalidate?.bind(this,L,C),beforeIntermediate:Ae.invalidate?.bind(this,L,C),commit:a((w,b)=>{if(!(Yo(w,b,y?.nodeId)<=0)){m??=null;for(let I in r)m||(m={}),m[I]===void 0&&(m[I]=this.getProperty(I));xe.default.trace?.(`Invalidating entry id: ${C}, timestamp: ${new Date(w).toISOString()}`),T(C,m,this.#r,w,fn,g,{user:L?.user,residencyId:y?.residencyId,nodeId:y?.nodeId},"invalidate")}},"commit")})}_writeRelocate(m){let y=this.getContext(),L=this.getId();Ir(L),Cr(this.getContext()).addWrite({key:L,store:i,invalidated:!0,entry:this.#r,before:pe.relocate?.bind(this,y,L),beforeIntermediate:Ae.relocate?.bind(this,y,L),commit:a((A,w)=>{if(Yo(A,w,m?.nodeId)<=0)return;let b=De.getResidencyRecord(m.residencyId),I=0,x=null,N=w?.value;if(b&&!b.includes(server.hostname)){for(let H in r)x||(x={}),x[H]=N[H];I=fn}else x=N;xe.default.trace?.(`Relocating entry id: ${L}, timestamp: ${new Date(A).toISOString()}`),T(L,x,this.#r,A,I,g,{user:y.user,residencyId:m.residencyId,nodeId:m.nodeId,expiresAt:m.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(m,y){let L={previousResidency:this.getResidencyRecord(m.residencyId),isRelocation:!0},C=oc(this.getResidency(y.value,L)),A;if(C){if(!C.includes(server.hostname))return!1;A=ac(C)}let w=0;xe.default.debug?.("Performing a relocate of an entry",m.key,y.value,C);let b=T(m.key,y.value,m,m.version,w,!0,{residencyId:A,expiresAt:y.expiresAt},"relocate",!1,null);return!0}static evict(m,y,L){let C=this.Source,A;if(!((v||g)&&(!y||(A=i.getEntry(m),!A||!y)||A.version!==L))){if(v){if(i.hasLock(m,A.version))return;let w;for(let b in r)w||(w={}),w[b]=y[b];if(w)return T(m,w,A,L,na,null,null,null,!0)}if(i.ifVersion(m,L,()=>{Wi(m,y,null)}),g)return T(m,null,A,L,na,null,null,null,!0);Nc(i,A??i.getEntry(m),L)}}lock(){throw new Error("Not yet implemented")}static operation(m,y){return m.table||=s,m.schema||=c,Wz.operation(m,y)}put(m){this.update(m,!0)}patch(m){this.update(m,!1)}_writeUpdate(m,y,L){let C=this.getContext(),A=Cr(C),w=this.getId();Ir(w);let b=this.#r;this.#s=y?kz:fSe;let I={key:w,store:i,entry:b,nodeName:C?.nodeName,validate:a(x=>{m||(m=this.#t),y||m&&iE(this.#t===m?this:m)?C?.source||(A.checkOverloaded(),this.validate(m,!y),te&&(m[te.name]=te.type==="Date"?new Date(x):te.type==="String"?new Date(x).toISOString():x),y&&(t&&m[t]!==w&&(m[t]=w),j&&(b?.value?m[j.name]=b?.value[j.name]:m[j.name]=j.type==="Date"?new Date(x):j.type==="String"?new Date(x).toISOString():x),m=$c(m))):A.removeWrite(I)},"validate"),before:y?pe.put?()=>pe.put(C,w,m):null:pe.patch?()=>pe.patch(C,w,m):pe.put?()=>pe.put(C,w,$c(this)):null,beforeIntermediate:y?Ae.put?()=>Ae.put(C,w,m):null:Ae.patch?()=>Ae.patch(C,w,m):Ae.put?()=>Ae.put(C,w,$c(this)):null,commit:a((x,N,H)=>{if(H){if(C&&N?.version>(C.lastModified||0)&&(C.lastModified=N.version),this.#r=N,N?.value&&N.value.getRecord)throw new Error("Can not assign a record to a record, check for circular references");y||(this.#e=N?.value??null)}this.#t=void 0,this.#n=x;let U=N?.value,Q=m;this.#s=0;let J=!1,k=Yo(x,N,L?.nodeId),Ce;if(k<=0)if(g){let ue=N.localTime,_e=N.version;xe.default.trace?.("Applying CRDT update to record with id: ",w,"applying later update:",_e);let me=[];for(;ue>x||_e>=x&&ue>0;){let Te=l.get(ue);if(!Te)break;let Pe=Pt(Te);if(_e=Pe.version,_e>=x){if(_e===x){if(k=Yo(x,{version:_e,localTime:ue},L?.nodeId),k===0)return;if(k>0)continue}if(Pe.type==="patch")me.push(Pe),Ce=m;else if(Pe.type==="put"||Pe.type==="delete")return}ue=Pe.previousLocalTime}me.sort((Te,Pe)=>Te.version-Pe.version);for(let Te of me){let Pe=Te.getValue(i);if(Q=nE(Q,Pe,y),xe.default.debug?.("Rebuilding update with future patch:",Q),!Q)return}}else{if(y)return;Q=nE(Q,U,y),xe.default.debug?.("Rebuilding update without audit:",Q)}let de;if(y?de=Q:(this.#e=U,de=$c(this,Q)),this.#e=de,de&&de.getRecord)throw new Error("Can not assign a record to a record, check for circular references");let ye;if(L?.residencyId!=null)ye=L.residencyId;else{b?.residencyId&&(C.previousResidency=De.getResidencyRecord(b.residencyId));let ue=oc(De.getResidency(de,C));if(ue&&!ue.includes(server.hostname))if(Ce??=de,J=!0,De.getResidencyById)de=void 0;else{de=null;for(let _e in r)de||(de={}),de[_e]=Ce[_e]}ye=ac(ue)}y||(Ce=m);let Y=C?.expiresAt??(p?p+Date.now():-1);xe.default.trace?.(`Saving record with id: ${w}, timestamp: ${new Date(x).toISOString()}${Y?", expires at: "+new Date(Y).toISOString():""}${N?", replaces entry from: "+new Date(N.version).toISOString():", new entry"}`,(()=>{try{return JSON.stringify(de).slice(0,100)}catch{return""}})()),Wi(w,U,de);let V=y?"put":"patch";T(w,de,N,x,J?fn:0,g,{omitLocalRecord:J,user:C?.user,residencyId:ye,expiresAt:Y,nodeId:L?.nodeId,originatingOperation:C?.originatingOperation},V,!1,Ce),C.expiresAt&&zo()},"commit")};A.addWrite(I)}async delete(m){if(typeof m=="string")return this.deleteProperty(m);if(this.isCollection){for await(let y of this.search(m))(await De.getResource(y[t],this.getContext(),{ensureLoaded:!1}))._writeDelete(m);return}return this.#e?this._writeDelete(m):!1}_writeDelete(m){let y=Cr(this.getContext()),L=this.getId();Ir(L);let C=this.getContext();return y.addWrite({key:L,store:i,entry:this.#r,nodeName:C?.nodeName,before:pe.delete?.bind(this,C,L),beforeIntermediate:Ae.delete?.bind(this,C,L),commit:a((A,w,b)=>{let I=w?.value;b&&(C&&w?.version>(C.lastModified||0)&&(C.lastModified=w.version),De._updateResource(this,w)),!(Yo(A,w,m?.nodeId)<=0)&&(Wi(this.getId(),I),xe.default.trace?.(`Deleting record with id: ${L}, txn timestamp: ${new Date(A).toISOString()}`),g||R?(T(L,null,this.#r,A,0,g,{user:C?.user,nodeId:m?.nodeId},"delete"),g||zo()):Nc(i,w))},"commit")}),!0}search(m){let y=this.getContext(),L=Cr(y);if(!m)throw new Error("No query provided");let C=m.conditions;C?C.length===void 0&&(C=C[Symbol.iterator]?Array.from(C):[C]):C=Array.isArray(m)?m:m[Symbol.iterator]?Array.from(m):[],this.getId()&&(C=[{attribute:null,comparator:Array.isArray(this.getId())?"prefix":"starts_with",value:this.getId()}].concat(C));let A,w={};function b(V,ue){let _e;switch(ue){case"and":case void 0:if(V.length<1)throw new Error('An "and" operator requires at least one condition');_e=!0;break;case"or":if(V.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+ue)}for(let me of V){if(me.conditions){me.conditions=b(me.conditions,me.operator);continue}let Te=me[0]??me.attribute,Pe=Te==null?F:pi(E,Te);if(Pe)(Pe.type||MA[me.comparator])&&(me[1]===void 0?me.value=x(me.value,Pe):me[1]=x(me[1],Pe));else if(Te!=null)throw(0,Nr.handleHDBError)(new Error,`${Te} is not a defined attribute`,404);if(me.chainedConditions)if(me.chainedConditions.length===1&&(!me.operator||me.operator=="and")){let Ve=me.chainedConditions[0],We,Dn;if(Ve.comparator==="gt"||Ve.comparator==="greater_than"||Ve.comparator==="ge"||Ve.comparator==="greater_than_equal"?(We=me,Dn=Ve):(We=Ve,Dn=me),We.comparator!=="lt"&&We.comparator!=="less_than"&&We.comparator!=="le"&&We.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let os=Dn.comparator==="ge"||Dn.comparator==="greater_than_equal",Ap=We.comparator==="le"||We.comparator==="less_than_equal";me.comparator=(os?"ge":"gt")+(Ap?"le":"lt"),me.value=[Dn.value,We.value]}else throw new Error("Multiple chained conditions are not currently supported")}return V}a(b,"prepareConditions");function I(V,ue){if(m.enforceExecutionOrder)return V;for(let _e of V)_e.conditions&&(_e.conditions=I(_e.conditions,_e.operator));return V.length>1&&ue!=="or"?(0,Kz.sortBy)(V,Qp(De)):V}a(I,"orderConditions");function x(V,ue){return Array.isArray(V)?V.map(_e=>LT(_e,ue)):LT(V,ue)}a(x,"coerceTypedValues");let N=m.operator;(C.length>0||N)&&(C=b(C,N));let H=typeof m.sort=="object"&&m.sort,U;if(H&&N!=="or"){let V=H.attribute;if(V==null)throw new Nr.ClientError("Sort requires an attribute");if(A=C.find(ue=>Ql(ue.attribute)===Ql(V)),!A){let ue=pi(E,V);if(!ue)throw(0,Nr.handleHDBError)(new Error,`${Array.isArray(V)?V.join("."):V} is not a defined attribute`,404);if(ue.indexed)A={attribute:V,comparator:"sort"},C.push(A);else if(C.length===0&&!m.allowFullScan)throw(0,Nr.handleHDBError)(new Error,`${Array.isArray(V)?V.join("."):V} is not indexed and not combined with any other conditions`,404)}A&&(A.descending=!!H.descending)}C=I(C,N),H&&(A&&C[0]===A?H.next&&(U={dbOrderedAttribute:H.attribute,attribute:H.next.attribute,descending:H.next.descending,next:H.next.next}):(A&&C.splice(C.indexOf(A),1),U=H));let Q=m.select;if(C.length===0&&(C=[{attribute:t,comparator:"greater_than",value:!0}]),m.explain)return{conditions:C,operator:N,postOrdering:U,selectApplied:!!Q};let J=L.useReadTxn(),k=vA(C,N,De,J,m,y,(V,ue)=>Kd(V,Q,y,J,ue),w),Ce=m.ensureLoaded!==!1;U||(k=Y(k));let de=De.transformEntryForSelect(Q,y,J,w,Ce,!0),ye=De.transformToOrderedSelect(k,Q,U,J,y,de);function Y(V){return m.offset||m.limit!==void 0?V.slice(m.offset,m.limit!==void 0?(m.offset||0)+m.limit:void 0):V}return a(Y,"applyOffset"),U&&(ye=Y(ye)),ye.onDone=()=>{ye.onDone=null,L.doneReadTxn()},ye.selectApplied=!0,ye.getColumns=()=>{if(Q){let V=[];for(let ue of Q)ue==="*"?V.push(...E.map(_e=>_e.name)):V.push(ue.name||ue);return V}return E.filter(V=>!V.computed&&!V.relationship).map(V=>V.name)},ye}static transformToOrderedSelect(m,y,L,C,A,w){let b=new jT;if(L){m=Kd(m,y,C,A,null);let I;b.iterate=function(){let N,H=m[Symbol.asyncIterator]?m[Symbol.asyncIterator]():m[Symbol.iterator](),U,Q=L.dbOrderedAttribute,J,k,Ce=!0;function de(Y){let V=Y.next&&de(Y.next),ue=Y.descending;return(_e,me)=>{let Te=ic(_e,Y.attribute,C),Pe=ic(me,Y.attribute,C),Ve=ue?(0,Bl.compareKeys)(Pe,Te):(0,Bl.compareKeys)(Te,Pe);return Ve===0?V?.(_e,me)||0:Ve}}a(de,"createComparator");let ye=de(L);return{async next(){let Y;if(N)if(Y=N.next(),Y.done){if(U)return b.onDone&&b.onDone(),Y}else return{value:await w.call(this,Y.value)};I=[],J&&I.push(J);do if(Y=await H.next(),Y.done){if(U=!0,I.length)break;return b.onDone&&b.onDone(),Y}else{let V=Y.value;if(V?.then&&(V=await V),Q){let ue=ic(V,Q,C);if(Ce)Ce=!1,k=ue;else if(ue!==k){k=ue,J=V;break}}I.push(V)}while(!0);return L.isGrouped,I.sort(ye),N=I[Symbol.iterator](),Y=N.next(),Y.done?(b.onDone&&b.onDone(),Y):{value:await w.call(this,Y.value)}},return(){b.onDone&&b.onDone(),H.return()},throw(){b.onDone&&b.onDone(),H.throw()}}};let x=a(N=>{if(typeof y=="object"&&Array.isArray(N.attribute))for(let H=0;H<y.length;H++){let U=y[H],Q;if(U.name===N.attribute[0]){for(Q=U.sort||(U.sort={});Q.next;)Q=Q.next;Q.attribute=N.attribute.slice(1),Q.descending=N.descending}else U===N.attribute[0]&&(y[H]=Q={name:U,sort:{attribute:N.attribute.slice(1),descending:N.descending}})}N.next&&x(N.next)},"applySortingOnSelect");x(L)}else b.iterate=(m[Symbol.asyncIterator]||m[Symbol.iterator]).bind(m),b=b.map(function(I){try{let x=w.call(this,I);return typeof x?.catch=="function"?x.catch(N=>{throw N.partialObject={[t]:I.key},N}):x}catch(x){throw x.partialObject={[t]:I.key},x}});return b}static transformEntryForSelect(m,y,L,C,A,w){if(m&&(m===t||m?.length===1&&m[0]===t&&Array.isArray(m))){let N=a(H=>(y?.transaction?.stale&&(y.transaction.stale=!1),H?.key??H),"transform");return m===t?N:m.asArray?H=>[N(H)]:H=>({[t]:N(H)})}let b;A&&v&&!(typeof m=="string"?[m]:m)?.every(N=>{let H;return typeof N=="object"?H=N.name:H=N,r[H]||H===t})&&(b=!0);let I,x=a(function(N){let H;if(y?.transaction?.stale&&(y.transaction.stale=!1),N!=null){if(H=N.value||N.deref?.()?.value,!H&&(N.key===void 0||N.deref)||N.metadataFlags&fn){if(N.metadataFlags&fn&&y.replicateFrom===!1&&w&&N.residencyId)return Za.SKIP;if(N=Pn(N.key??N,y,{transaction:L,lazy:m?.length<4,ensureLoaded:A},this?.isSync,U=>U),N?.then)return N.then(x.bind(this));H=N?.value}if(b&&N?.metadataFlags&(fn|na)||N?.expiresAt!=null&&N?.expiresAt<Date.now()){if(y.onlyIfCached&&y.noCacheStore)return{[t]:N.key,message:"This entry has expired"};let U=sn(N.key??N,N,y);if(U?.then)return U.then(x)}}if(H==null)return w?Za.SKIP:H;if(m&&!(m[0]==="*"&&m.length===1)){let U,Q=a((k,Ce)=>{let de;typeof k=="object"?de=k.name:de=k;let ye=wr?.[de],Y;if(ye){let V=C?.[de];if(V)if(V.hasMappings){let _e=ye.from?H[ye.from]:Ql(N.key);Y=V.get(_e),Y||(Y=[])}else Y=V.fromRecord?.(H);else Y=ye(H,y,N);let ue=a(_e=>{if(_e&&typeof _e=="object"){let me=ye.definition?.tableClass||De;I||(I={});let Te=I[de]||(I[de]=me.transformEntryForSelect(de===k?null:k.select||(Array.isArray(k)?k:null),y,L,V,A));if(Array.isArray(_e)){let Pe=[],Ve=me.transformToOrderedSelect(_e,k.select,typeof k.sort=="object"&&k.sort,y,L,Te)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),We=a(os=>{for(;!os.done;){if(os?.then)return os.then(We);Pe.push(os.value),os=Ve.next()}Ce(Pe,de)},"nextValue"),Dn=We(Ve.next());Dn&&(U||(U=[]),U.push(Dn));return}else if(_e=Te.call(this,_e),_e?.then){U||(U=[]),U.push(_e.then(Pe=>Ce(Pe,de)));return}}Ce(_e,de)},"handleResolvedValue");Y?.then?(U||(U=[]),U.push(Y.then(ue))):ue(Y);return}else Y=H[de],Y&&typeof Y=="object"&&de!==k&&(Y=De.transformEntryForSelect(k.select||k,y,L,null)({value:Y}));Ce(Y,de)},"selectAttribute"),J;if(typeof m=="string")Q(m,k=>{J=k});else if(Array.isArray(m))if(m.asArray)J=[],m.forEach((k,Ce)=>{k==="*"?m[Ce]=H:Q(k,de=>J[Ce]=de)});else{J={};let k=m.forceNulls;for(let Ce of m)if(Ce==="*")for(let de in H)J[de]=H[de];else Q(Ce,(de,ye)=>{de===void 0&&k&&(de=null),J[ye]=de})}else throw new Nr.ClientError("Invalid select"+m);return U?Promise.all(U).then(()=>J):J}return H},"transform");return x}async subscribe(m){if(!l)throw new Error("Can not subscribe to a table without an audit log");g||_t({table:s,database:c,schemaDefined:u,attributes:E,audit:!0}),m||(m={});let y=!m.rawEvents,L=[],C=this,A=YC(De,this.getId()??null,function(b,I,x,N){try{let H=I.getValue?.(i,y),U=I.type;if(!H&&U==="patch"&&y){let J=i.getEntry(b);J?.version===I.version?H=J.value:H=I.getValue?.(i,!0,x),U="put"}let Q={id:b,localTime:x,value:H,version:I.version,type:U,beginTxn:N};L?L.push(Q):this.send(Q)}catch(H){xe.default.error?.(H)}},m.startTime||0,m),w=(async()=>{this.isCollection&&(A.includeDescendants=!0,m.onlyChildren&&(A.onlyChildren=!0)),m.supportsTransactions&&(A.supportsTransactions=!0);let b=this.getId(),I=m.previousCount;I>1e3&&(I=1e3);let x=m.startTime;if(this.isCollection){if(x){if(I)throw new Nr.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:N,value:H}of l.getRange({start:x,exclusiveStart:!0,snapshot:!1})){let U=Pt(H);if(U.tableId!==n)continue;let Q=U.recordId;if(b==null||$z(b,Q)){let J=U.getValue(i,y,N);if(A.send({id:Q,localTime:N,value:J,version:U.version,type:U.type}),A.queue?.length>Gz&&await A.waitForDrain()===!1)return}A.startTime=N}}else if(I){let N=[];for(let{key:H,value:U}of l.getRange({start:"z",end:!1,reverse:!0}))try{let Q=Pt(U);if(Q.tableId!==n)continue;let J=Q.recordId;if(b==null||$z(b,J)){let k=Q.getValue(i,y,H);if(N.push({id:J,localTime:H,value:k,version:Q.version,type:Q.type}),--I<=0)break}}catch(Q){xe.default.error("Error getting history entry",H,Q)}for(let H=N.length;H>0;)A.send(N[--H]);N[0]&&(A.startTime=N[0].localTime)}else if(!m.omitCurrent){for(let{key:N,value:H,version:U,localTime:Q}of i.getRange({start:b??!1,end:b==null?void 0:[b,Bl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(H&&(A.send({id:N,localTime:Q,value:H,version:U,type:"put"}),A.queue?.length>Gz&&await A.waitForDrain()===!1))return}}else{I&&!x&&(x=0);let N=this.#r?.localTime;if(N===mR&&(i.cache?.delete(b),this.#r=i.getEntry(b),xe.default.trace?.("re-retrieved record",N,this.#r?.localTime),N=this.#r?.localTime),xe.default.trace?.("Subscription from",x,"from",b,N),x<N){let H=[],U=N;do{let Q=l.get(U);if(Q){m.omitCurrent=!0;let J=Pt(Q),k=J.getValue(i,y,U);y&&(J.type="put"),H.push({id:b,value:k,localTime:U,...J}),U=J.previousLocalTime}else break;I&&I--}while(U>x&&I!==0);for(let Q=H.length;Q>0;)A.send(H[--Q]);A.startTime=N}!m.omitCurrent&&this.doesExist()&&A.send({id:b,localTime:N,value:this.#e,version:this.#n,type:"put"})}for(let N of L)A.send(N);L=null})();return m.listener&&A.on("data",m.listener),A}static subscribeOnThisThread(m,y){return m===0||y?.crossThreads===!1}doesExist(){return!!(this.#e||this.#s)}publish(m,y){this._writePublish(m,y)}_writePublish(m,y){let L=Cr(this.getContext()),C=this.getId()||null;C!=null&&Ir(C);let A=this.getContext();L.addWrite({key:C,store:i,entry:this.#r,nodeName:A?.nodeName,validate:a(()=>{A?.source||(L.checkOverloaded(),this.validate(m))},"validate"),before:pe.publish?.bind(this,A,C,m),beforeIntermediate:Ae.publish?.bind(this,A,C,m),commit:a((w,b,I)=>{b===void 0&&R&&!g&&zo(),xe.default.trace?.(`Publishing message to id: ${C}, timestamp: ${new Date(w).toISOString()}`),T(C,b?.value??null,b,b?.version||w,0,!0,{user:A?.user,residencyId:y?.residencyId,expiresAt:A?.expiresAt,nodeId:y?.nodeId},"message",!1,m)},"commit")})}validate(m,y){let L,C=a((A,w,b)=>{if(w.type&&A!=null)if(y&&A.__op__&&(A=A.value),w.properties){typeof A!="object"&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be an object${w.type?" ("+w.type+")":""}`);let I=w.properties;for(let x=0,N=I.length;x<N;x++){let H=I[x],U=C(A[H.name],H,b+"."+H.name);U&&(A[H.name]=U)}if(w.sealed&&A!=null&&typeof A=="object")for(let x in A)I.find(N=>N.name===x)||(L||(L=[])).push(`Property ${x} is not allowed within object in property ${b}`)}else switch(w.type){case"Int":(typeof A!="number"||A>>0!==A)&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof A!="number"||!(Math.floor(A)===A&&Math.abs(A)<=9007199254740992))&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof A!="number"&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a number`);break;case"ID":typeof A=="string"||A?.length>0&&A.every?.(I=>typeof I=="string")||(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a string, or an array of strings`);break;case"String":typeof A!="string"&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a string`);break;case"Boolean":typeof A!="boolean"&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a boolean`);break;case"Date":if(!(A instanceof Date)){if(typeof A=="string"||typeof A=="number")return new Date(A);(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a Date`)}break;case"BigInt":if(typeof A!="bigint"){if(typeof A=="string"||typeof A=="number")return BigInt(A);(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a bigint`)}break;case"Bytes":if(!(A instanceof Uint8Array)){if(typeof A=="string")return Buffer.from(A);(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a Buffer or Uint8Array`)}break;case"Blob":if(!(A instanceof gi)){if(typeof A=="string"&&(A=Buffer.from(A)),A instanceof Buffer)return createBlob(A,{type:"text/plain"});(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a Blob`)}break;case"array":if(Array.isArray(A)){if(w.elements)for(let I=0,x=A.length;I<x;I++){let N=A[I],H=C(N,w.elements,b+"[*]");H&&(A[I]=H)}}else(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be an Array`);break}w.nullable===!1&&A==null&&(L||(L=[])).push(`Property ${b} is required (and not does not allow null values)`)},"validateValue");for(let A=0,w=E.length;A<w;A++){let b=E[A];if(!(b.relationship||b.computed)&&(!y||b.name in m)){let I=C(m[b.name],b,b.name);I&&(m[b.name]=I)}}if(d)for(let A in m)E.find(w=>w.name===A)||(L||(L=[])).push(`Property ${A} is not allowed`);if(L)throw new Nr.ClientError(L.join(". "))}getUpdatedTime(){return this.#n}wasLoadedFromSource(){return v?!!this.#i:void 0}static async addAttributes(m){let y=E.slice(0);for(let L of m){if(!L.name)throw new Nr.ClientError("Attribute name is required");if(L.name.match(/[`/]/))throw new Nr.ClientError("Attribute names cannot include backticks or forward slashes");(0,Yz.validateAttribute)(L.name),y.push(L)}return _t({table:s,database:c,schemaDefined:u,attributes:y}),De.indexingOperation}static async removeAttributes(m){let y=E.filter(L=>!m.includes(L.name));return _t({table:s,database:c,schemaDefined:u,attributes:y}),De.indexingOperation}static getSize(){let m=i.getStats();return(m.treeBranchPageCount+m.treeLeafPageCount+m.overflowPages)*m.pageSize}static getAuditSize(){let m=l?.getStats();return m&&(m.treeBranchPageCount+m.treeLeafPageCount+m.overflowPages)*m.pageSize}static getStorageStats(){let m=i.env.path,y=DT.default.statfsSync?.(m)??{};return{available:y.bavail*y.bsize,free:y.bfree*y.bsize,size:y.blocks*y.bsize}}static async getRecordCount(m){let y=i.getStats().entryCount,L=1e3/2,C=performance.now(),A=Math.floor(y/2),w=m?.exactCount,b=0,I=0,x;for(let{value:N}of i.getRange({start:!0,lazy:!0,snapshot:!1}))if(N!=null&&b++,I++,await Xa(),!w&&I<A&&performance.now()-C>L){x=I;break}if(x){let N=b;b=0;for(let{value:Y}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:x,snapshot:!1}))Y!=null&&b++,await Xa();let H=x*2,U=(b+N)/H,Q=Math.pow((b-N+1)/x/2,2)+U*(1-U)/H,J=Math.max(Math.sqrt(Q)*y,1),k=Math.round(U*y),Ce=Math.max(k-1.96*J,b+N),de=Math.min(k+1.96*J,y),ye=Math.pow(10,Math.round(Math.log10(J)));return ye>k&&(ye=ye/10),b=Math.round(k/ye)*ye,{recordCount:b,estimatedRange:[Math.round(Ce),Math.round(de)]}}return{recordCount:b}}static updatedAttributes(){wr=this.propertyResolvers={$id:a((m,y,L)=>({value:L.key}),"$id"),$updatedtime:a((m,y,L)=>L.version,"$updatedtime"),$record:a((m,y,L)=>L?{value:m}:m,"$record")};for(let m of this.attributes){m.isPrimaryKey&&(F=m),m.resolve=null;let y=m.relationship,L=m.computed;if(y)if(m.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),L&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),Fd=!0,y.to)m.elements?.definition?(wr[m.name]=m.resolve=(C,A,w)=>{let b=C[y.from?y.from:t],I=m.elements.definition.tableClass;return w?jl({attribute:y.to,value:b},Cr(A).getReadTxn(),!1,I,!1).asArray:I.search([{attribute:y.to,value:b}],A).asArray},m.set=()=>{throw new Error("Setting a one-to-many relationship property is not supported")},m.resolve.definition=m.elements.definition,y.from&&(m.resolve.from=y.from)):console.error(`The one-to-many/many-to-many relationship property "${m.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(y.from){let C=m.definition||m.elements?.definition;C?(wr[m.name]=m.resolve=(A,w,b)=>{let I=A[y.from];if(I!==void 0){if(m.elements){let x,N=I?.map(H=>{let U=b?C.tableClass.primaryStore.getEntry(H,{transaction:Cr(w).getReadTxn()}):C.tableClass.get(H,w);return U?.then&&(x=!0),U});return y.filterMissing?x?Promise.all(N).then(H=>H.filter(Vz)):N.filter(Vz):x?Promise.all(N):N}return b?C.tableClass.primaryStore.getEntry(I,{transaction:Cr(w).getReadTxn()}):C.tableClass.get(I,w)}},m.set=(A,w)=>{if(Array.isArray(w)){let b=w.map(I=>I.getId?.()||I[C.tableClass.primaryKey]);A[y.from]=b}else{let b=w.getId?.()||w[C.tableClass.primaryKey];A[y.from]=b}},m.resolve.definition=m.definition||m.elements?.definition,m.resolve.from=y.from):console.error(`The relationship property "${m.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${m.name}" in table "${s}" must use either "from" or "to" arguments`);else L&&(typeof L.from=="function"&&this.setComputedAttribute(m.name,L.from),wr[m.name]=m.resolve=(C,A,w)=>{let b=typeof L.from=="string"?C[L.from]:C,I=this.userResolvers[m.name];if(I)return I(b,A,w);xe.default.warn(`Computed attribute "${m.name}" does not have a function assigned to it. Please use setComputedAttribute('${m.name}', resolver) to assign a resolver function.`),this.userResolvers[m.name]=()=>{}})}cE(this,this)}static setComputedAttribute(m,y){let L=pi(E,m);if(!L){console.error(`The attribute "${m}" does not exist in the table "${s}"`);return}if(!L.computed){console.error(`The attribute "${m}" is not defined as computed in the table "${s}"`);return}this.userResolvers[m]=y}static async deleteHistory(m=0,y=!1){let L;for(let{key:C,value:A}of l.getRange({start:0,end:m}))await Xa(),Pt(A).tableId===n&&(L=CT(l,C,A));if(y)for(let C of i.getRange({start:0,versions:!0})){let{key:A,value:w,localTime:b}=C;await Xa(),w===null&&b<m&&(L=Nc(i,C))}await L}static async*getHistory(m=0,y=1/0){for(let{key:L,value:C}of l.getRange({start:m||1,end:y})){await Xa();let A=Pt(C);A.tableId===n&&(yield{id:A.recordId,localTime:L,version:A.version,type:A.type,value:A.getValue(i,!0,L),user:A.user,operation:A.originatingOperation})}}static async getHistoryOfRecord(m){let y=[];if(m==null)throw new Error("An id is required");let L=i.getEntry(m);if(!L)return y;let C=L.localTime;if(!C)throw new Error("The entry does not have a local audit time");let A=0;do{await Xa();let w=l.get(C);if(w){let b=Pt(w);y.push({id:b.recordId,localTime:C,version:b.version,type:b.type,value:b.getValue(i,!0,C),user:b.user}),C=b.previousLocalTime}else break}while(A<1e3&&C);return y.reverse()}static cleanup(){z?.remove()}}De.updatedAttributes();let Vd=De.prototype;return p&&De.setTTLExpiration(p/1e3),se&&Wd(),De;function Wi(K,m,y){let L;for(let C in r){let A=r[C],w=A.isIndexing,b=wr[C],I=y&&(b?b(y):y[C]),x=m&&(b?b(m):m[C]);if(I===x&&!w)continue;L=!0;let N=A.indexNulls,H=(0,lp.getIndexedValues)(I,N),U=(0,lp.getIndexedValues)(x,N);if(U?.length>0){let Q=new Set(U);if(H=H?H.filter(J=>{if(Q.has(J))Q.delete(J);else return!0}):[],U=Array.from(Q),(U.length>0||H.length>0)&&Hz){let J=U.concat(H).map(k=>({key:k,value:K}));A.prefetch(J,qz)}for(let J=0,k=U.length;J<k;J++)A.remove(U[J],K)}else H?.length>0&&Hz&&A.prefetch(H.map(Q=>({key:Q,value:K})),qz);if(H)for(let Q=0,J=H.length;Q<J;Q++)A.put(H[Q],K)}return L}a(Wi,"updateIndices");function Ir(K){switch(typeof K){case"number":return!0;case"string":if(K.length<659)return!0;if(K.length>Fz)throw new Error("Primary key size is too large: "+K.length);break;case"object":if(K===null)throw new Error("Invalid primary key of null");break;case"bigint":if(K<2n**64n&&K>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof K)}if((0,Bl.writeKey)(K,_Se,0)>Fz)throw new Error("Primary key size is too large: "+K.length);return!0}a(Ir,"checkValidId");function Pn(K,m,y,L,C){if(De.getResidencyById&&y.ensureLoaded&&m?.replicateFrom!==!1){let w=oc(De.getResidencyById(K));if(w&&!w.includes(server.hostname)&&O)return O({key:K,residency:w}).then(C)}let A=a(()=>{if(m?.transaction?.stale&&(m.transaction.stale=!1),y.transaction?.isDone)return C(null,K);let w=i.getEntry(K,y);return w?.residencyId&&w.metadataFlags&fn&&O&&y.ensureLoaded&&m?.replicateFrom!==!1?O(w).then(b=>C(b,K),b=>(xe.default.error?.("Error loading remote record",K,w,y,b),C(null,K))):(w&&m&&(w?.version>(m.lastModified||0)&&(m.lastModified=w.version),w?.localTime&&!m.lastRefreshed&&(m.lastRefreshed=w.localTime)),C(w,K))},"whenPrefetched");return L?A():ie>0?(ie--,A()):new Promise((w,b)=>{ie===0?(ie--,i.prefetch([K],()=>{I(),x()})):(ne.push(K),le.push(x),ne.length>$d&&(ie--,I()));function I(){if(ne.length>0){let N=le;i.prefetch(ne,()=>{ie===-1?I():ie++;for(let H of N)H()}),ne=[],le=[],Re>2&&Re--}else ie=Re,Re<Sp&&Re++}a(I,"prefetch");function x(){try{w(A())}catch(N){b(N)}}a(x,"load")})}a(Pn,"loadLocalRecord");function sc(K){if(!K?.role)return;let m=K.role.permission;if(m.super_user)return hSe;let y=m[c],L,C=y?.tables;if(C)return C[s];if(c==="data"&&(L=m[s])&&!L.tables)return L}a(sc,"getTablePermissions");function sn(K,m,y,L){if(v){let C=!1;if(y.noCache?C=!0:(m?(!m.value||m.metadataFlags&(fn|na)||m.expiresAt!=null&&m.expiresAt<Date.now())&&(C=!0):C=!0,Wn(!C,"cache-hit",s)),C){let A=Yd(K,m,y).then(w=>(w?.value&&w?.value.getRecord?.()&&xe.default.error?.("Can not assign a record that is already a resource"),y&&(w?.version>(y.lastModified||0)&&(y.lastModified=w.version),y.lastRefreshed=Date.now()),w));if(y?.onlyIfCached||m?.value&&L?.allowStaleWhileRevalidate?.(m,K)){if(A.catch(w=>xe.default.warn?.(w)),y?.onlyIfCached&&!L.doesExist())throw new Nr.ServerError("Entry is not cached",504);return}else return A}}else if(m?.value&&m.expiresAt!=null&&m.expiresAt<Date.now())return De.evict(m.key,m.value,m.version),m.value=null,{then(C){return C(m)}}}a(sn,"ensureLoadedFromSource");function Cr(K){let m=K?.transaction;if(m){if(!m.lmdbDb)return m.lmdbDb=i,m;do{if(m.lmdbDb?.path===i.path)return m;let y=m.next;if(!y)return m=m.next=new hc,m.lmdbDb=i,m;m=y}while(!0)}else return new Wp}a(Cr,"txnForContext");function ic(K,m,y){if(!K)return;let L=K.value||i.getEntry(K.key)?.value;if(typeof m=="object"){let A=wr,w=L;for(let b=0,I=m.length;b<I;b++){let x=m[b],N=A?.[x];w=N&&w?N(w,y,!0)?.value:w?.[x],A=N?.definition?.tableClass?.propertyResolvers}return w}let C=wr[m];return C?C(L,y):L[m]}a(ic,"getAttributeValue");function Kd(K,m,y,L,C){let A=C?.length,w={transaction:L,lazy:A>0||typeof m=="string"||m?.length<4,alwaysPrefetch:!0},b;function I(x,N){let H=x?.value;if(!H)return Za.SKIP;for(let U=0;U<A;U++)if(!b?.includes(U)&&!C[U](H,x))return Za.SKIP;return N!==void 0&&(x.key=N),x}if(a(I,"processEntry"),A>0||!K.hasEntries){let x=K.map(N=>{if(b=null,typeof N=="object"&&N?.key!==void 0)return A>0?I(N):N;if(N==null)return Za.SKIP;for(let H=0;H<A;H++){let Q=C[H].idFilter;if(Q){if(!Q(N))return Za.SKIP;b||(b=[]),b.push(H)}}return Pn(N,y,w,!1,I)});return Array.isArray(K)&&(x=x.filter(N=>N!==Za.SKIP)),x.hasEntries=!0,x}return K}a(Kd,"transformToEntries");function Yo(K,m,y=server.replication?.getThisNodeId(l)){if(K<=m?.version){if(m?.version===K&&y!==void 0){let L=server.replication?.exportIdMapping(l),C=m.localTime,A=C&&l.get(C);if(A){let w,b,I=Pt(A);for(let x in L)L[x]===y&&(w=x),L[x]===I.nodeId&&(b=x);if(w>b)return 1;if(w===b)return 0}}return-1}return 1}a(Yo,"precedesExistingVersion");async function Yd(K,m,y){let L=m?.metadataFlags,C=m?.version,A,w;if(!i.attemptLock(K,C,()=>{clearTimeout(w);let N=i.getEntry(K);!N||!N.value||N.metadataFlags&(fn|na)?A(Yd(K,i.getEntry(K),y)):A(N)}))return new Promise(N=>{A=N,w=setTimeout(()=>{i.unlock(K,C)},dSe)});let b=m?.value,I={requestContext:y,replacingRecord:b,replacingEntry:m,replacingVersion:C,noCacheStore:!1,source:null,resourceCache:y?.resourceCache},x=y?.responseHeaders;return new Promise((N,H)=>{let U;zC(Ct(I,async Q=>{let J=performance.now(),k,Ce,de;try{for(let ue of De.sources)if(ue.get&&(!ue.get.reliesOnPrototype||ue.prototype.get)){if(ue.available?.(m)===!1)continue;if(I.source=ue,k=await ue.get(K,I),k)break}de=L&fn;let Y=I.lastModified||de&&C;Ce=de||Y>C||!b,Y||(Y=(0,lp.getNextMonotonicTime)());let V=performance.now()-J;if(Lt(V,"cache-resolution",s,null,"success"),x&&AE(x,"Server-Timing",`cache-resolve;dur=${V.toFixed(2)}`,!0),Q.timestamp=Y,p&&I.expiresAt==null&&(I.expiresAt=Date.now()+p),k){if(typeof k!="object")throw new Error("Only objects can be cached and stored in tables");if(k.status>0&&k.headers)if(k.status>=300)if(k.status===304)k=b,Y=C;else throw new Nr.ServerError(k.body||"Error from source",k.status);else k=k.body;typeof k.toJSON=="function"&&(k=k.toJSON()),t&&k[t]!==K&&(k[t]=K)}U=!0,N({key:K,version:Y,value:k})}catch(Y){Y.message+=` while resolving record ${K} for ${s}`,b&&((Y.code==="ECONNRESET"||Y.code==="ECONNREFUSED"||Y.code==="EAI_AGAIN")&&!y?.mustRevalidate||y?.staleIfError&&(Y.statusCode===500||Y.statusCode===502||Y.statusCode===503||Y.statusCode===504))?(N({key:K,version:C,value:b}),xe.default.trace?.(Y.message,"(returned stale record)")):H(Y);let V=performance.now()-J;Lt(V,"cache-resolution",s,null,"fail"),x&&AE(x,"Server-Timing",`cache-resolve;dur=${V.toFixed(2)}`,!0),I.transaction.abort();return}if(y?.noCacheStore||I.noCacheStore){I.transaction.abort();return}Cr(I).addWrite({key:K,store:i,entry:m,nodeName:"source",commit:a((Y,V)=>{if(V?.version!==C)return;let ue=Wi(K,b,k);if(k){Ae.put?.(I,K,k),V&&(y.previousResidency=De.getResidencyRecord(V.residencyId));let _e,me=!1,Te,Pe=oc(De.getResidency(k,y));if(Pe){if(!Pe.includes(server.hostname))if(_e=k,me=!0,De.getResidencyById)k=void 0;else{k=null;for(let Ve in r)k||(k={}),k[Ve]=_e[Ve]}Te=ac(Pe)}xe.default.trace?.(`Writing resolved record from source with id: ${K}, timestamp: ${new Date(Y).toISOString()}`),T(K,k,V,Y,me?fn:0,g&&(Ce||me)||null,{user:I?.user,expiresAt:I.expiresAt,residencyId:Te},"put",!!de,_e)}else V&&(Ae.delete?.(I,K),xe.default.trace?.(`Deleting resolved record from source with id: ${K}, timestamp: ${new Date(Y).toISOString()}`),g||R?T(K,null,V,Y,0,g&&Ce||null,{user:I?.user},"delete",!!de):Nc(i,V,C))},"commit")})}),()=>{i.unlock(K,C)},Q=>{i.unlock(K,C),U&&xe.default.error?.("Error committing cache update",Q)})})}a(Yd,"getFromSource");function Wo(K){if(!K||K.user?.role?.permission?.super_user)return!0;if(K.replicateTo)throw new Nr.ClientError("Can not specify replication parameters without super user permissions",403);if(K.replicatedConfirmation)throw new Nr.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}a(Wo,"checkContextPermissions");function zo(K){let m=!1;if(K&&(K-dt>1&&(m=!0),dt=K),!(Bt===Cn&&!m)&&(Cn=Bt,(0,Ul.getWorkerIndex)()===(0,Ul.getWorkerCount)()-1))return nn&&clearTimeout(nn),Bt?new Promise(y=>{let L=new Date;L.setMonth(0),L.setDate(1),L.setHours(0),L.setMinutes(0),L.setSeconds(0);let C=Bt/(1+dt),A=m?Date.now():Math.ceil((Date.now()-L.getTime())/C)*C+L.getTime(),w=a(b=>{xe.default.trace?.(`Scheduled next cleanup scan at ${new Date(b)}`),nn=setTimeout(()=>q=q.then(async()=>{if(w(Math.max(b+Bt,Date.now())),i.rootStore.status!=="open"){clearTimeout(nn);return}let I=50,x=new Array(I),N=0,H=Math.pow(dt,8)*(xl.get(B.STORAGE_RECLAMATION_EVICTIONFACTOR)??1e5),U=S/Math.pow(Math.max(dt,1),4);xe.default.info?.(`Starting cleanup scan for ${s}, evict threshold ${H}, adjusted eviction ${U}ms`);function Q(J,k,Ce,de){let ye=J+U-Date.now();if(ye<0)return!0;if(dt){let Y=i.lastSize;return Ce&pn&&eu(de,V=>{V.size&&(Y+=V.size)}),xe.default.trace?.(`shouldEvict adjusted ${ye} ${Y}, ${ye*(J-k)/Y} < ${H}`),ye*(J-k)/Y<H}return!1}a(Q,"shouldEvict");try{let J=0;for(let k of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let{key:Ce,value:de,version:ye,expiresAt:Y,metadataFlags:V}=k,ue;de===null&&!g&&ye+uSe<Date.now()?ue=Nc(i,k,ye):Y!=null&&Q(Y,ye,V,de)&&(ue=De.evict(Ce,de,ye),J++),ue&&(await x[N],x[N]=ue.catch(_e=>{xe.default.error?.("Cleanup error",_e)}),++N>=I&&(N=0)),await Xa()}xe.default.info?.(`Finished cleanup scan for ${s}, evicted ${J} entries`)}catch(J){xe.default.warn?.(`Error in cleanup scan for ${s}:`,J)}y(void 0),dt=0}),Math.min(b-Date.now(),2147483647)).unref()},"startNextTimer");w(A)}):void 0}a(zo,"scheduleCleanup");function Tp(){z=l?.addDeleteRemovalCallback(n,i,(K,m)=>{i.remove(K,m)})}a(Tp,"addDeleteRemoval");function Wd(){(0,Ul.getWorkerIndex)()===0&&setInterval(async()=>{if(!nc){nc=!0;try{let K=se.name,m=r[K];if(!m)throw new Error(`expiresAt attribute ${se} must be indexed`);for(let y of m.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let L of m.getValues(y)){let C=i.getEntry(L);C?.value?C.value[K]<Date.now()&&De.evict(L,C.value,C.version):i.ifVersion(L,C?.version,()=>m.remove(y,L))}await Xa()}}catch(K){xe.default.error?.("Error in evicting old records",K)}finally{nc=!1}}},lSe).unref()}a(Wd,"runRecordExpirationEviction");function oc(K){if(K!=null){if(Array.isArray(K))return K;if(typeof K=="number"){if(K>=65536)throw new Error(`Shard id ${K} must be below 65536`);let m=server.shards?.get?.(K);if(m)return xe.default.trace?.(`Shard ${K} mapped to ${m.map(y=>y.name).join(", ")}`),m.map(y=>y.name);throw new Error(`Shard ${K} is not defined`)}throw new Error(`Shard or residency list ${K} is not a valid type, must be a shard number or residency list of node hostnames`)}}a(oc,"residencyFromFunction");function ac(K){if(K){let m=K.join(","),y=f.get([Symbol.for("residency_by_set"),m]);return y||(f.put([Symbol.for("residency_by_set"),m],y=Math.floor(Math.random()*2147418112)+65535),f.put([Symbol.for("residency_by_id"),y],K),y)}}a(ac,"getResidencyId")}function WC(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 qz(){}function pSe(e){Wz=e}function LT(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 PT(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return PT(+e);case"Float":return e==="null"?null:PT(+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;mSe.test(e)||(e+="Z");let n=new Date(e);return PT(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,MT.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function PT(e){if(isNaN(e))throw new SyntaxError;return e}function $z(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 zC(e,t,r){return e?.then?e.then(t,r):t(e)}function Vz(e){return e!=null}function Ms(e){try{return JSON.stringify(e)}catch{return e}}function ESe(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var Za,lp,Kz,Yz,xl,Nr,up,dp,xe,Bl,Ul,MT,DT,cSe,Wz,lSe,uSe,Hz,dSe,kz,fSe,fn,na,_Se,Fz,Gz,hSe,Eve,mSe,Xa,Tf=be(()=>{G();Za=require("lmdb"),lp=M(ln()),Kz=require("lodash"),Yz=M(hf());sa();zp();xl=M(ce());xO();Nr=M(he()),up=M(_o()),dp=M(Ks());Ue();Sf();xe=M(mi());ob();pc();Bl=require("ordered-binary"),Ul=M(it());so();MT=M(oe());nu();Ci();sE();O_();DT=M(require("node:fs"));_s();XS();cSe=new Uint8Array(9);cSe[8]=192;lSe=6e4,uSe=864e5;xl.initSync();Hz=xl.get(B.STORAGE_PREFETCHWRITES),dSe=1e4,kz=1,fSe=2,fn=1,na=8,_Se=Buffer.allocUnsafeSlow(8192),Fz=1978,Gz=100,hSe={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},Eve=(0,MT.convertToMS)(xl.get(B.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;a(vT,"makeTable");a(WC,"attributesAsObject");a(qz,"noop");a(pSe,"setServerUtilities");mSe=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;a(LT,"coerceType");a(PT,"rejectNaN");a($z,"isDescendantId");Xa=a(()=>new Promise(setImmediate),"rest");a(zC,"when");a(Vz,"exists");a(Ms,"stringify");a(ESe,"hasOtherProcesses")});var ct={};Be(ct,{database:()=>mu,database_envs:()=>Go,databases:()=>Ye,dropDatabase:()=>db,dropTableMeta:()=>RSe,getDatabases:()=>Ze,getDefaultCompression:()=>Wg,getTables:()=>gSe,onRemovedDB:()=>W_,onUpdatedTable:()=>il,readMetaDb:()=>fp,resetDatabases:()=>rd,table:()=>_t,tables:()=>Yn});function gSe(){return HT||Ze(),Yn||{}}function Ze(){if(HT)return Ye;HT=!0,Bd=new Map;let e=(0,Zt.getHdbBasePath)()&&(0,Ut.join)((0,Zt.getHdbBasePath)(),lc),t=(0,Zt.get)(B.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,Zt.get)(B.STORAGE_PATH)||e&&((0,ns.existsSync)(e)?e:(0,Ut.join)((0,Zt.getHdbBasePath)(),Np)),!e)return;if((0,ns.existsSync)(e))for(let n of(0,ns.readdirSync)(e,{withFileTypes:!0})){let s=(0,Ut.basename)(n.name,".mdb");n.isFile()&&(0,Ut.extname)(n.name).toLowerCase()===".mdb"&&!t[s]?.path&&fp((0,Ut.join)(e,n.name),null,s)}if((0,ns.existsSync)((0,xd.getBaseSchemaPath)())){for(let n of(0,ns.readdirSync)((0,xd.getBaseSchemaPath)(),{withFileTypes:!0}))if(!n.isFile()){let s=(0,Ut.join)((0,xd.getBaseSchemaPath)(),n.name),i=(0,Ut.join)((0,xd.getTransactionAuditStoreBasePath)(),n.name);for(let o of(0,ns.readdirSync)(s,{withFileTypes:!0}))if(o.isFile()&&(0,Ut.extname)(o.name).toLowerCase()===".mdb"){let c=(0,Ut.join)(i,o.name);fp((0,Ut.join)(s,o.name),(0,Ut.basename)(o.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,Ut.extname)(c.name).toLowerCase()===".mdb"&&fp((0,Ut.join)(i,c.name),(0,Ut.basename)(c.name,".mdb"),n);let o=s.tables;if(o)for(let c in o){let l=o[c],u=(0,Ut.join)(l.path,(0,Ut.basename)(c+".mdb"));(0,ns.existsSync)(u)&&fp(u,c,n,null,!0)}}for(let n in Ye){let s=Bd.get(n);if(s){let i=Ye[n];n.includes("delete")&&xt.trace(`defined tables ${Array.from(s.keys())}`);for(let o in i)s.has(o)||(xt.trace(`delete table class ${o}`),delete i[o])}else if(delete Ye[n],n==="data"){for(let i in Yn)delete Yn[i];delete Yn[kT]}}let r=["hdb_temp","hdb_certificate","hdb_analytics","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_license","hdb_info"];if(Ye.system)for(let n of r)Ye.system[n]&&(Ye.system[n].replicate=!1);return Bd=null,Ye}function rd(){HT=!1;for(let[,e]of Go)e.needsDeletion=!0;Ze();for(let[e,t]of Go)t.needsDeletion&&!e.endsWith("system.mdb")&&(t.close(),Go.delete(e),delete Ye[t.databaseName],hp.forEach(r=>r(t.databaseName)));return Ye}function fp(e,t,r=JC,n,s){let i=new jC.default(e,!1);try{let o=Go.get(e);o?o.needsDeletion=!1:(o=(0,Hd.open)(i),Go.set(e,o));let c=new Hl.default(!1),l=o.dbisDb||(o.dbisDb=o.openDB(UT.INTERNAL_DBIS_NAME,c)),u=o.auditStore;u||(n?(0,ns.existsSync)(n)&&(i.path=n,u=(0,Hd.open)(i),u.isLegacy=!0):u=IT(o));let f=Jz(r),d=f[kT],h=new Map;for(let{key:_,value:p}of l.getRange({start:!1})){let[S,g]=_.toString().split("/");g===""?g=p.name:g||(g=S,S=t,p.name||(p.name=g,p.indexed=!p.is_hash_attribute)),d?.add(S);let R=h.get(S);R||h.set(S,R={attributes:[]}),(g==null||p.is_hash_attribute)&&(R.primary=p),g!=null&&R.attributes.push(p),Object.defineProperty(p,"key",{value:_,configurable:!0})}for(let[_,p]of h){let{attributes:S,primary:g}=p;if(!g){for(let ie of S)if(ie.is_hash_attribute||ie.isPrimaryKey){g=ie;break}if(!g){xt.warn(`Unable to find a primary key attribute on table ${_}, with attributes: ${JSON.stringify(S)}`);continue}}let R=f[_],E={},T=[],O,v,F=typeof g.audit=="boolean"?g.audit:(0,Zt.get)(B.LOGGING_AUDITLOG),q=g.trackDeletes,j=g.expiration,te=g.eviction,se=g.sealed,z=g.splitSegments,ne=g.replicate;if(R)E=R.indices,T=R.attributes,R.schemaVersion++;else{O=g.tableId,O?O>=(l.get(Ud)||0)&&(l.putSync(Ud,O+1),xt.info(`Updating next table id (it was out of sync) to ${O+1} for ${_}`)):(g.tableId=O=l.get(Ud),O||(O=1),xt.debug("Table {table_name} missing an id, assigning {table_id}"),l.putSync(Ud,O+1),l.putSync(g.key,g));let ie=new Hl.default(!g.is_hash_attribute,g.is_hash_attribute);if(ie.compression=g.compression,ie.compression){let Re=(0,Zt.get)(B.STORAGE_COMPRESSION_THRESHOLD)||Qz;ie.compression.threshold=Re}v=Rm(o.openDB(g.key,ie),o),o.databaseName=r,v.tableId=O}let le;for(let ie of S){ie.attribute=ie.name;try{if(!ie.is_hash_attribute&&(ie.indexed||ie.attribute&&!ie.name)){if(!E[ie.name]){let pe=new Hl.default(!ie.is_hash_attribute,ie.is_hash_attribute);E[ie.name]=o.openDB(ie.key,pe),E[ie.name].indexNulls=ie.indexNulls}let Re=T.find(pe=>pe.name===ie.name);Re?T.splice(T.indexOf(Re),1,ie):T.push(ie),le=!0}}catch(Re){xt.error("Error trying to update attribute",ie,T,E,Re)}}for(let ie of T)if(!S.find(pe=>pe.name===ie.name)){if(ie.is_hash_attribute){xt.error("Unable to remove existing primary key attribute",ie);continue}ie.indexed&&(T.splice(T.indexOf(ie),1),le=!0)}if(R)le&&(R.schemaVersion++,R.updatedAttributes());else{R=Xz(f,_,vT({primaryStore:v,auditStore:u,audit:F,sealed:se,splitSegments:z,replicate:ne,expirationMS:j&&j*1e3,evictionMS:te&&te*1e3,trackDeletes:q,tableName:_,tableId:O,primaryKey:g.name,databasePath:s?r+"/"+_:r,databaseName:r,indices:E,attributes:S,schemaDefined:g.schemaDefined,dbisDB:l})),R.schemaVersion=1;for(let ie of _p)ie(R)}}return o}catch(o){throw o.message+=` opening database ${e}`,o}}function Jz(e){let t=Ye[e];if(t||(e==="data"?t=Ye[e]=Yn:e==="system"?Object.defineProperty(Ye,"system",{value:t=Object.create(null),configurable:!0}):t=Ye[e]=Object.create(null)),Bd&&!Bd.has(e)){let r=new Set;t[kT]=r,Bd.set(e,r)}return t}function Xz(e,t,r){return e[t]=r,r}function mu({database:e,table:t}){e||(e=JC),Ze();let r=Jz(e),n=(0,Ut.join)((0,Zt.getHdbBasePath)(),lc),s=(0,Zt.get)(B.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,Zt.get)(B.STORAGE_PATH)||((0,ns.existsSync)(n)?n:(0,Ut.join)((0,Zt.getHdbBasePath)(),Np));let o=(0,Ut.join)(n,(i?t:e)+".mdb"),c=Go.get(o);if(!c||c.status==="closed"){let l=new jC.default(o,!1);c=(0,Hd.open)(l),Go.set(o,c)}return c.auditStore||(c.auditStore=IT(c)),c}async function db(e){if(!Ye[e])throw new Error("Schema does not exist");let t=Ye[e],r;for(let n in t)r=t[n].primaryStore.rootStore,Go.delete(r.path),r.status==="open"&&(await r.close(),await pp.remove(r.path));if(r||(r=mu({database:e,table:null}),r.status==="open"&&(await r.close(),await pp.remove(r.path))),e==="data"){for(let n in Yn)delete Yn[n];delete Yn[kT]}delete Ye[e],hp.forEach(n=>n(e)),await QA(r)}function _t(e){let{table:t,database:r,expiration:n,eviction:s,scanInterval:i,attributes:o,audit:c,sealed:l,splitSegments:u,replicate:f,trackDeletes:d,schemaDefined:h,origin:_}=e;r||(r=JC);let p=mu({database:r,table:t}),S=Ye[r];xt.trace(`Defining ${t} in ${r}`);let g=S?.[t];if(p.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let R,E,T;h==null&&(h=!0);let O=new Hl.default(!1);for(let z of o)z.attribute&&!z.name?(z.name=z.attribute,z.indexed=!0):z.attribute=z.name,z.expiresAt&&(z.indexed=!0);let v,F;if(g){if(R=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,...o)}else{let z=p.auditStore;E=o.find(Re=>Re.isPrimaryKey)||{},R=E.name,E.is_hash_attribute=E.isPrimaryKey=!0,E.schemaDefined=h,E.compression=Wg(),d&&(E.trackDeletes=!0),c=E.audit=typeof c=="boolean"?c:(0,Zt.get)(B.LOGGING_AUDITLOG),n&&(E.expiration=n),s&&(E.eviction=s),u??=!1,E.splitSegments=u,typeof l=="boolean"&&(E.sealed=l),typeof f=="boolean"&&(E.replicate=f),_&&(E.origins?E.origins.includes(_)||E.origins.push(_):E.origins=[_]),xt.trace(`${t} table loading, opening primary store`);let ne=new Hl.default(!1,!0);ne.compression=E.compression;let le=t+"/";if(T=p.dbisDb=p.openDB(UT.INTERNAL_DBIS_NAME,O),se(),T.get(le))return F&&F(),rd(),_t(e);let ie=Rm(p.openDB(le,ne),p);p.databaseName=r,ie.tableId=T.get(Ud),xt.trace(`Assigning new table id ${ie.tableId} for ${t}`),ie.tableId||(ie.tableId=1),T.put(Ud,ie.tableId+1),E.tableId=ie.tableId,g=Xz(S,t,vT({primaryStore:ie,auditStore:z,audit:c,sealed:l,splitSegments:u,replicate:f,trackDeletes:d,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:R,tableName:t,tableId:ie.tableId,databasePath:r,databaseName:r,indices:{},attributes:o,schemaDefined:h,dbisDB:T})),g.schemaVersion=1,v=!0,T.put(le,E)}let q=g.indices;T=T||(p.dbisDb=p.openDB(UT.INTERNAL_DBIS_NAME,O)),g.dbisDB=T;let j=[];for(let{key:z,value:ne}of T.getRange({start:!0})){let[le,ie]=z.toString().split("/");if(ie===""&&(ie=ne.name),ie){if(le!==t)continue}else continue;let Re=o.find(Ae=>Ae.name===ie),pe=!Re?.indexed&&ne.indexed&&!ne.isPrimaryKey;if((!Re||pe)&&(se(),v=!0,Re||T.remove(z),pe)){let Ae=g.indices[le];Ae&&j.push(Ae)}}let te=[];try{for(let z of o||[]){if((z.relationship||z.computed)&&(v=!0,z.relationship))continue;let ne=t+"/"+(z.name||"");Object.defineProperty(z,"key",{value:ne,configurable:!0});let le=T.get(ne);if(z.isPrimaryKey){if(le=le||T.get(ne=t+"/")||{},c!==void 0&&c!==g.audit||l!==void 0&&l!==g.sealed||f!==void 0&&f!==g.replicate||(+n||void 0)!==(+le.expiration||void 0)||(+s||void 0)!==(+le.eviction||void 0)||z.type!==le.type){let Re={...le};typeof c=="boolean"&&(c&&g.enableAuditing(c),Re.audit=c),n&&(Re.expiration=+n),s&&(Re.eviction=+s),l!==void 0&&(Re.sealed=l),f!==void 0&&(Re.replicate=f),z.type&&(Re.type=z.type),v=!0,se(),T.put(ne,Re)}continue}le?.attribute&&!le.name&&(le.indexed=!0);let ie=!le||le.type!==z.type||le.indexed!==z.indexed||le.nullable!==z.nullable||le.version!==z.version||JSON.stringify(le.properties)!==JSON.stringify(z.properties)||JSON.stringify(le.elements)!==JSON.stringify(z.elements);if(z.indexed){let Re=new Hl.default(!0,!1),pe=p.openDB(ne,Re);(ie||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<mp.workerData?.restartNumber)&&(v=!0,se(),le=T.get(ne),(ie||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<mp.workerData?.restartNumber)&&(v=!0,z.indexNulls===void 0&&(z.indexNulls=!0),g.primaryStore.getStats().entryCount>0&&(z.lastIndexedKey=le?.lastIndexedKey??void 0,z.indexingPID=process.pid,pe.isIndexing=!0,Object.defineProperty(z,"dbi",{value:pe}),te.push(z))),T.put(ne,z)),le?.indexNulls&&z.indexNulls===void 0&&(z.indexNulls=!0),pe.indexNulls=z.indexNulls,q[z.name]=pe}else ie&&(v=!0,se(),T.put(ne,z))}}finally{F&&F()}if(v&&(g.schemaVersion++,g.updatedAttributes()),xt.trace(`${t} table loading, running index`),te.length>0||j.length>0?g.indexingOperation=ASe(g,te,j):v&&xT.signalSchemaChange(new BT.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=_,v)for(let z of _p)z(g,_!=="cluster");return(n||s||i)&&g.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),xt.trace(`${t} table loaded`),g;function se(){F||p.transactionSync(()=>({then(z){F=z}}))}a(se,"startTxn")}async function ASe(e,t,r){try{xt.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await xT.signalSchemaChange(new BT.SchemaEventMsg(process.pid,"schema-change",e.databaseName,e.tableName));let s;for(let u of r)s=u.drop();let i,o={},c=0,l=t.length;if(await new Promise(u=>setImmediate(u)),l>0){let u;for(let d of t)(0,Hd.compareKeys)(d.lastIndexedKey,u)<0&&(u=d.lastIndexedKey),d.lastIndexedKey==null&&d.dbi.clearAsync();let f=0;for(let{key:d,value:h,version:_}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(h){if(f++,s=e.primaryStore.ifVersion(d,_,()=>{for(let p=0;p<l;p++){let S=t[p],g=S.name;try{let R=S.resolve,E=h&&(R?R(h):h[g]),T=(0,zz.getIndexedValues)(E);if(T)for(let O=0,v=T.length;O<v;O++)S.dbi.put(T[O],d)}catch(R){o[g]||(o[g]=!0,xt.error(`Error indexing attribute ${g}`,R))}}}),s.then(()=>f--,p=>{f--,xt.error(p)}),mp.workerData&&mp.workerData.restartNumber!==jz.restartNumber&&(i=!0),++c%100===0||i){for(let p of t)p.lastIndexedKey=d,e.dbisDB.put(p.key,p);if(i)return}f>SSe?await s:f>TSe&&await new Promise(p=>setImmediate(p))}for(let d of t)delete d.lastIndexedKey,delete d.indexingPID,d.dbi.isIndexing=!1,s=e.dbisDB.put(d.key,d)}await s,await xT.signalSchemaChange(new BT.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),xt.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){xt.error("Error in indexing",n)}}function RSe({table:e,database:t}){let r=mu({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 il(e){return _p.push(e),{remove(){let t=_p.indexOf(e);t>-1&&_p.splice(t,1)}}}function W_(e){return hp.push(e),{remove(){let t=hp.indexOf(e);t>-1&&hp.splice(t,1)}}}function Wg(){let e=(0,Zt.get)(B.STORAGE_COMPRESSION),t=(0,Zt.get)(B.STORAGE_COMPRESSION_DICTIONARY),r=(0,Zt.get)(B.STORAGE_COMPRESSION_THRESHOLD)||Qz,n={startingOffset:32};return t&&(n.dictionary=pp.readFileSync(t)),r&&(n.threshold=r),e&&n}var Zt,UT,Hd,Ut,ns,xd,Hl,jC,pp,QC,zz,xT,BT,mp,xt,jz,JC,kT,Qz,Yn,Ye,Ud,_p,hp,HT,Go,Bd,SSe,TSe,Ue=be(()=>{Zt=M(ce()),UT=M(Ft()),Hd=require("lmdb"),Ut=require("path"),ns=require("fs"),xd=M(gt());Tf();Hl=M(Bf()),jC=M(Hf());G();pp=M(require("fs-extra")),QC=M(ui()),zz=M(ln()),xT=M(_o()),BT=M(Ks()),mp=require("worker_threads"),xt=M(X()),jz=M(it());so();nu();_s();JC="data",kT=Symbol("defined-tables"),Qz=((0,Zt.get)(B.STORAGE_PAGESIZE)||4096)-60;(0,Zt.initSync)();Yn=Object.create(null),Ye=Object.create(null);(0,QC._assignPackageExport)("databases",Ye);(0,QC._assignPackageExport)("tables",Yn);Ud=Symbol.for("next-table-id"),_p=[],hp=[],Go=new Map;a(gSe,"getTables");a(Ze,"getDatabases");a(rd,"resetDatabases");a(fp,"readMetaDb");a(Jz,"ensureDB");a(Xz,"setTable");a(mu,"database");a(db,"dropDatabase");a(_t,"table");SSe=1e3,TSe=10;a(ASe,"runIndexing");a(RSe,"dropTableMeta");a(il,"onUpdatedTable");a(W_,"onRemovedDB");a(Wg,"getDefaultCompression")});var oe=P((Ive,fj)=>{"use strict";var ec=require("path"),nj=require("fs-extra"),In=X(),Zz=require("fs-extra"),FT=require("os"),ySe=require("net"),bSe=require("recursive-iterator"),Ar=(G(),D($)),{PACKAGE_ROOT:OSe}=Et(),NSe=mA(),ej=require("papaparse"),GT=require("moment"),{inspect:wSe}=require("util"),tj=require("is-number"),wve=require("lodash"),ISe=require("minimist"),CSe=require("https"),PSe=require("http"),{hdb_errors:qT}=he(),DSe=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,sj=require("util").promisify(setTimeout),LSe=100,MSe=5,vSe="",USe=4,rj={true:!0,TRUE:!0,FALSE:!1,false:!1,undefined:null,null:null,NULL:null,NaN:NaN};fj.exports={isEmpty:ss,isEmptyOrZeroLength:Yi,arrayHasEmptyValues:HSe,arrayHasEmptyOrZeroLengthValues:kSe,buildFolderPath:FSe,isBoolean:ij,errorizeMessage:xSe,stripFileExtension:qSe,autoCast:$Se,autoCastJSON:oj,autoCastJSONDeep:ZC,removeDir:VSe,compareVersions:KSe,isCompatibleDataVersion:YSe,escapeRawValue:WSe,unescapeValue:zSe,stringifyProps:jSe,timeoutPromise:JSe,isClusterOperation:ZSe,getClusterUser:tTe,checkGlobalSchemaTable:eTe,getHomeDir:cj,getPropsFilePath:QSe,promisifyPapaParse:rTe,removeBOM:lj,createEventPromise:nTe,checkProcessRunning:sTe,checkSchemaTableExist:iTe,checkSchemaExists:uj,checkTableExists:dj,getStartOfTomorrowInSeconds:oTe,getLimitKey:aTe,isObject:GSe,isNotEmptyAndHasValue:BSe,autoCasterIsNumberCheck:aj,backtickASTSchemaItems:cTe,isPortTaken:XSe,createForkArgs:lTe,autoCastBoolean:uTe,async_set_timeout:sj,getTableHashAttribute:dTe,doesSchemaExist:fTe,doesTableExist:_Te,stringifyObj:hTe,ms_to_time:pTe,changeExtension:mTe,getEnvCliRootPath:eP,noBootFile:ETe,httpRequest:gTe,transformReq:STe,convertToMS:TTe,PACKAGE_ROOT:OSe};function xSe(e){return e instanceof Error?e:new Error(e)}a(xSe,"errorizeMessage");function ss(e){return e==null}a(ss,"isEmpty");function BSe(e){return!ss(e)&&(e||e===0||e===""||ij(e))}a(BSe,"isNotEmptyAndHasValue");function Yi(e){return ss(e)||e.length===0||e.size===0}a(Yi,"isEmptyOrZeroLength");function HSe(e){if(ss(e))return!0;for(let t=0;t<e.length;t++)if(ss(e[t]))return!0;return!1}a(HSe,"arrayHasEmptyValues");function kSe(e){if(Yi(e))return!0;for(let t=0;t<e.length;t++)if(Yi(e[t]))return!0;return!1}a(kSe,"arrayHasEmptyOrZeroLengthValues");function FSe(...e){try{return e.join(ec.sep)}catch{console.error(e)}}a(FSe,"buildFolderPath");function ij(e){return ss(e)?!1:e===!0||e===!1}a(ij,"isBoolean");function GSe(e){return ss(e)?!1:typeof e=="object"}a(GSe,"isObject");function qSe(e){return Yi(e)?vSe:e.slice(0,-USe)}a(qSe,"stripFileExtension");function $Se(e){return ss(e)||e===""||typeof e!="string"?e:rj[e]!==void 0?rj[e]:aj(e)===!0?Number(e):DSe.test(e)?new Date(e):e}a($Se,"autoCast");function oj(e){if(typeof e=="string"&&(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]")))try{return JSON.parse(e)}catch{}return e}a(oj,"autoCastJSON");function ZC(e){if(e&&typeof e=="object"){if(Array.isArray(e))for(let t=0,r=e.length;t<r;t++){let n=e[t],s=ZC(n);s!==n&&(e[t]=s)}else for(let t in e){let r=e[t],n=ZC(r);n!==r&&(e[t]=n)}return e}else return oj(e)}a(ZC,"autoCastJSONDeep");function aj(e){if(e.startsWith("0.")&&tj(e))return!0;let t=e.toUpperCase().includes("E");return!!((e!=="0"&&e.startsWith("0"))===!1&&t===!1&&tj(e))}a(aj,"autoCasterIsNumberCheck");async function VSe(e){if(Yi(e))throw new Error(`Directory path: ${e} does not exist`);try{await Zz.emptyDir(e),await Zz.remove(e)}catch(t){throw In.error(`Error removing files in ${e} -- ${t}`),t}}a(VSe,"removeDir");function KSe(e,t){if(Yi(e)){In.info("Invalid current version sent as parameter.");return}if(Yi(t)){In.info("Invalid upgrade version sent as parameter.");return}let r,n=/(\.0+)+$/,s=e.version?e.version:e,i=t.version?t.version:t,o=s.replace(n,"").split("."),c=i.replace(n,"").split("."),l=Math.min(o.length,c.length);for(let u=0;u<l;u++)if(r=parseInt(o[u],10)-parseInt(c[u],10),r)return r;return o.length-c.length}a(KSe,"compareVersions");function YSe(e,t,r=!1){let n=e.toString().split("."),s=t.toString().split(".");return n[0]===s[0]&&(!r||n[1]===s[1])}a(YSe,"isCompatibleDataVersion");function WSe(e){if(ss(e))return e;let t=String(e);return t==="."?Ar.UNICODE_PERIOD:t===".."?Ar.UNICODE_PERIOD+Ar.UNICODE_PERIOD:t.replace(Ar.FORWARD_SLASH_REGEX,Ar.UNICODE_FORWARD_SLASH)}a(WSe,"escapeRawValue");function zSe(e){if(ss(e))return e;let t=String(e);return t===Ar.UNICODE_PERIOD?".":t===Ar.UNICODE_PERIOD+Ar.UNICODE_PERIOD?"..":String(e).replace(Ar.ESCAPED_FORWARD_SLASH_REGEX,"/")}a(zSe,"unescapeValue");function jSe(e,t){if(ss(e))return In.info("Properties object is null"),"";let r="";return e.each(function(n,s){try{if(t&&t[n]){let i=t[n];for(let o of i)r+=";"+o+FT.EOL}!Yi(n)&&n[0]===";"?r+=" "+n+s+FT.EOL:Yi(n)||(r+=n+"="+s+FT.EOL)}catch{In.error(`Found bad property during upgrade with key ${n} and value: ${s}`)}}),r}a(jSe,"stringifyProps");function cj(){let e;try{e=FT.homedir()}catch{e=process.env.HOME}return e}a(cj,"getHomeDir");function QSe(){let e=ec.join(cj(),Ar.HDB_HOME_DIR_NAME,Ar.BOOT_PROPS_FILE_NAME);return nj.existsSync(e)||(e=ec.join(__dirname,"../","hdb_boot_properties.file")),e}a(QSe,"getPropsFilePath");function JSe(e,t){let r,n;return n=new Promise(function(s){r=setTimeout(function(){s(t)},e)}),{promise:n,cancel:a(function(){clearTimeout(r)},"cancel")}}a(JSe,"timeoutPromise");async function XSe(e){if(!e)throw new Error("Invalid port passed as parameter");return new Promise((t,r)=>{let n=ySe.createServer().once("error",s=>{s.code==="EADDRINUSE"?t(!0):r(s)}).once("listening",()=>n.once("close",()=>t(!1)).close()).listen(e)})}a(XSe,"isPortTaken");function ZSe(e){try{return Ar.CLUSTER_OPERATIONS[e.toLowerCase()]!==void 0}catch(t){In.error(`Error checking operation against cluster ops ${t}`)}return!1}a(ZSe,"isClusterOperation");function eTe(e,t){let r=(Ue(),D(ct)).getDatabases();if(!r[e])return qT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e);if(!r[e][t])return qT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(eTe,"checkGlobalSchemaTable");function tTe(e,t){if(ss(t)){In.warn("No CLUSTERING_USER defined, clustering disabled");return}if(ss(e)||Yi(e)){In.warn("No users to search.");return}let r;try{let n=e.get(t);n&&n.role.permission.cluster_user===!0&&n.active===!0&&(r=n)}catch(n){In.error(`unable to find cluster_user due to: ${n.message}`);return}if(r===void 0){In.warn(`CLUSTERING_USER: ${t} not found or is not active.`);return}return r}a(tTe,"getClusterUser");function rTe(){ej.parsePromise=function(e,t,r){return new Promise(function(n,s){ej.parse(e,{header:!0,transformHeader:lj,chunk:t.bind(null,s),skipEmptyLines:!0,transform:r,dynamicTyping:!1,error:s,complete:n})})}}a(rTe,"promisifyPapaParse");function lj(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return e.charCodeAt(0)===65279?e.slice(1):e}a(lj,"removeBOM");function nTe(e,t,r){return new Promise(n=>{t.once(e,s=>{let i=r;In.info(`Got cluster status event response: ${wSe(s)}`);try{i.cancel()}catch{In.error("Error trying to cancel timeout.")}n(s)})})}a(nTe,"createEventPromise");async function sTe(e){let t=!0,r=0;do await sj(LSe*r++),(await NSe.findPs(e)).length>0&&(t=!1);while(t&&r<MSe);if(t)throw new Error(`process ${e} was not started`)}a(sTe,"checkProcessRunning");function iTe(e,t){let r=uj(e);if(r)return r;let n=dj(e,t);if(n)return n}a(iTe,"checkSchemaTableExist");function uj(e){let{getDatabases:t}=(Ue(),D(ct));if(!t()[e])return qT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(uj,"checkSchemaExists");function dj(e,t){let{getDatabases:r}=(Ue(),D(ct));if(!r()[e][t])return qT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(dj,"checkTableExists");function oTe(){let e=GT().utc().add(1,"d").startOf("d").unix(),t=GT().utc().unix();return e-t}a(oTe,"getStartOfTomorrowInSeconds");function aTe(){return GT().utc().format("DD-MM-YYYY")}a(aTe,"getLimitKey");function cTe(e){try{let t=new bSe(e);for(let{node:r}of t)r&&(r.columnid&&typeof r.columnid!="string"&&(r.columnid=r.columnid.toString()),r.columnid&&!r.columnid.startsWith("`")&&(r.columnid_orig=r.columnid,r.columnid=`\`${r.columnid}\``),r.tableid&&!r.tableid.startsWith("`")&&(r.tableid_orig=r.tableid,r.tableid=`\`${r.tableid}\``),r.databaseid&&!r.databaseid.startsWith("`")&&(r.databaseid_orig=r.databaseid,r.databaseid=`\`${r.databaseid}\``),r.as&&typeof r.as=="string"&&!r.as.startsWith("[")&&(r.as_orig=r.as,r.as=`\`${r.as}\``))}catch(t){In.error("Got an error back ticking items."),In.error(t)}}a(cTe,"backtickASTSchemaItems");function lTe(e){return[e]}a(lTe,"createForkArgs");function uTe(e){return e===!0||typeof e=="string"&&e.toLowerCase()==="true"}a(uTe,"autoCastBoolean");function dTe(e,t){let{getDatabases:r}=(Ue(),D(ct)),n=r()[e]?.[t];return n?.primaryKey||n?.hash_attribute}a(dTe,"getTableHashAttribute");function fTe(e){let{getDatabases:t}=(Ue(),D(ct));return t()[e]!==void 0}a(fTe,"doesSchemaExist");function _Te(e,t){let{getDatabases:r}=(Ue(),D(ct));return r()[e]?.[t]!==void 0}a(_Te,"doesTableExist");function hTe(e){try{return JSON.stringify(e)}catch{return e}}a(hTe,"stringifyObj");function pTe(e){let t=GT.duration(e),r=t.seconds()>0?t.seconds()+"s":"",n=t.minutes()>0?t.minutes()+"m ":"",s=t.hours()>0?t.hours()+"h ":"",i=t.days()>0?t.days()+"d ":"";return(t.years()>0?t.years()+"y ":"")+i+s+n+r}a(pTe,"ms_to_time");function mTe(e,t){let r=ec.basename(e,ec.extname(e));return ec.join(ec.dirname(e),r+t)}a(mTe,"changeExtension");function eP(){if(process.env[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return process.env[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()];let e=ISe(process.argv);if(e[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return e[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()]}a(eP,"getEnvCliRootPath");var XC;function ETe(){if(XC)return XC;let e=eP();if(eP()&&nj.pathExistsSync(ec.join(e,Ar.HDB_CONFIG_FILE)))return XC=!0,!0}a(ETe,"noBootFile");function gTe(e,t){let r;return e.protocol==="http:"?r=PSe:r=CSe,new Promise((n,s)=>{let i=r.request(e,o=>{o.setEncoding("utf8"),o.body="",o.on("data",c=>{o.body+=c}),o.on("end",()=>{n(o)})});i.on("error",o=>{s(o)}),i.write(t instanceof Buffer?t:JSON.stringify(t)),i.end()})}a(gTe,"httpRequest");function STe(e){if(!e.schema&&!e.database){e.schema=Ar.DEFAULT_DATABASE_NAME;return}e.database&&(e.schema=e.database)}a(STe,"transformReq");function TTe(e){let t=0;if(typeof e=="number"&&(t=e),typeof e=="string")switch(t=parseFloat(e),e.slice(-1)){case"M":t*=86400*30;break;case"D":case"d":t*=86400;break;case"H":case"h":t*=3600;break;case"m":t*=60;break}return t*1e3}a(TTe,"convertToMS")});var gj=P((Pve,Ej)=>{"use strict";var is=ce(),ATe=Xu(),qe=(G(),D($)),Ep=Dt(),qo=require("path"),{PACKAGE_ROOT:VT}=Et(),_j=ce(),$T=oe(),kd="/dev/null",RTe=qo.join(VT,"launchServiceScripts"),hj=qo.join(VT,"utility/scripts"),yTe=qo.join(hj,qe.HDB_RESTART_SCRIPT),pj=qo.resolve(VT,"dependencies",`${process.platform}-${process.arch}`,Ep.NATS_BINARY_NAME);function mj(){let t=ATe.licenseSearch().ram_allocation||qe.RAM_ALLOCATION_ENUM.DEFAULT,r=qe.MEM_SETTING_KEY+t,n={[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return $T.noBootFile()&&(n[qe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=$T.getEnvCliRootPath()),{name:qe.PROCESS_DESCRIPTORS.HDB,script:qe.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:VT}}a(mj,"generateMainServerConfig");var bTe=9930;function OTe(){is.initSync(!0);let e=is.get(qe.CONFIG_PARAMS.ROOTPATH),t=qo.join(e,"clustering",Ep.NATS_CONFIG_FILES.HUB_SERVER),r=qo.join(is.get(qe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),qe.LOG_NAMES.HDB),n=_j.get(qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Ep.LOG_LEVEL_FLAGS[is.get(qe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==bTe?"-"+n:""),script:pj,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return is.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=kd,i.error_file=kd),i}a(OTe,"generateNatsHubServerConfig");var NTe=9940;function wTe(){is.initSync(!0);let e=is.get(qe.CONFIG_PARAMS.ROOTPATH),t=qo.join(e,"clustering",Ep.NATS_CONFIG_FILES.LEAF_SERVER),r=qo.join(is.get(qe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),qe.LOG_NAMES.HDB),n=_j.get(qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Ep.LOG_LEVEL_FLAGS[is.get(qe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==NTe?"-"+n:""),script:pj,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return is.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=kd,i.error_file=kd),i}a(wTe,"generateNatsLeafServerConfig");function ITe(){is.initSync();let e=qo.join(is.get(qe.CONFIG_PARAMS.LOGGING_ROOT),qe.LOG_NAMES.HDB),t={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:qe.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:RTe,autorestart:!1};return is.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=kd,t.error_file=kd),t}a(ITe,"generateClusteringUpgradeV4ServiceConfig");function CTe(){let e={[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.RESTART_HDB};return $T.noBootFile()&&(e[qe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=$T.getEnvCliRootPath()),{...{name:qe.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:hj},script:yTe}}a(CTe,"generateRestart");function PTe(){return{apps:[mj()]}}a(PTe,"generateAllServiceConfigs");Ej.exports={generateAllServiceConfigs:PTe,generateMainServerConfig:mj,generateRestart:CTe,generateNatsHubServerConfig:OTe,generateNatsLeafServerConfig:wTe,generateClusteringUpgradeV4ServiceConfig:ITe}});var id=P((Mve,Lj)=>{"use strict";var rt=(G(),D($)),DTe=oe(),Vo=Vg(),KT=Er(),$o=Dt(),tc=gj(),YT=ce(),kl=X(),LTe=Ro(),{startWorker:Sj,onMessageFromWorkers:MTe}=it(),vTe=Yu(),Lve=require("util"),UTe=require("child_process"),xTe=require("fs"),{execFile:BTe}=UTe,Qe;Lj.exports={enterPM2Mode:HTe,start:rc,stop:tP,reload:Aj,restart:Rj,list:rP,describe:Oj,connect:Ko,kill:$Te,startAllServices:VTe,startService:nP,getUniqueServicesList:Nj,restartAllServices:KTe,isServiceRegistered:wj,reloadStopStart:Ij,restartHdb:bj,deleteProcess:GTe,startClusteringProcesses:Pj,startClusteringThreads:Dj,isHdbRestartRunning:qTe,isClusteringRunning:WTe,stopClustering:YTe,reloadClustering:zTe,expectedRestartOfChildren:yj};var gp=!1;MTe(e=>{e.type==="restart"&&YT.initSync(!0)});function HTe(){gp=!0}a(HTe,"enterPM2Mode");function Ko(){return Qe||(Qe=require("pm2")),new Promise((e,t)=>{Qe.connect((r,n)=>{r&&t(r),e(n)})})}a(Ko,"connect");var rn,kTe=10,Tj;function rc(e,t=!1){if(gp)return FTe(e);let r=BTe(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=rn.indexOf(r);o>-1&&rn.splice(o,1),!Tj&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<kTe&&(xTe.existsSync(Vo.getHubConfigPath())?rc(e):(await Vo.generateNatsConfig(!0),rc(e),await new Promise(c=>setTimeout(c,3e3)),await Vo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Vo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=YT.get(rt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&$o.LOG_LEVEL_HIERARCHY[o]>=$o.LOG_LEVEL_HIERARCHY[f||"info"]){let _=f===$o.LOG_LEVELS.ERR||f===$o.LOG_LEVELS.WRN?kl.OUTPUTS.STDERR:kl.OUTPUTS.STDOUT;kl.logCustomLevel(f||"info",_,n,i.slice(u,l.index).trim())}let[d,h]=l;u=l.index+d.length,f=$o.LOG_LEVELS[h]}if($o.LOG_LEVEL_HIERARCHY[o]>=$o.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===$o.LOG_LEVELS.ERR||f===$o.LOG_LEVELS.WRN?kl.OUTPUTS.STDERR:kl.OUTPUTS.STDOUT;kl.logCustomLevel(f||"info",d,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!rn&&(rn=[],!t)){let i=a(()=>{Tj=!0,rn&&(rn.map(o=>o.kill()),process.exit(0))},"kill_children");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}rn.push(r)}a(rc,"start");function FTe(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.start(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(FTe,"startWithPM2");function tP(e){if(!gp){for(let t of rn||[])t.name===e&&(rn.splice(rn.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.stop(e,async(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.delete(e,(i,o)=>{i&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(o)})})})}a(tP,"stop");function Aj(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.reload(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Aj,"reload");function Rj(e){if(!gp){yj();for(let t of rn||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.restart(e,(n,s)=>{Qe.disconnect(),t(s)})})}a(Rj,"restart");function yj(){for(let e of rn||[])e.config&&(e.config.restarts=0)}a(yj,"expectedRestartOfChildren");function GTe(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.delete(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(GTe,"deleteProcess");async function bj(){await rc(tc.generateRestart())}a(bj,"restartHdb");async function qTe(){let e=await rP();for(let t in e)if(e[t].name===rt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(qTe,"isHdbRestartRunning");function rP(){return new Promise(async(e,t)=>{try{await Ko()}catch(r){t(r)}Qe.list((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}a(rP,"list");function Oj(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.describe(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Oj,"describe");function $Te(){if(!gp){for(let e of rn||[])e.kill();rn=[];return}return new Promise(async(e,t)=>{try{await Ko()}catch(r){t(r)}Qe.killDaemon((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}a($Te,"kill");async function VTe(){try{await Pj(),await Dj(),await rc(tc.generateAllServiceConfigs())}catch(e){throw Qe?.disconnect(),e}}a(VTe,"startAllServices");async function nP(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case rt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=tc.generateMainServerConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=tc.generateNatsIngestServiceConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=tc.generateNatsReplyServiceConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=tc.generateNatsHubServerConfig(),await rc(r,t),await Vo.removeNatsConfig(e);return;case rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=tc.generateNatsLeafServerConfig(),await rc(r,t),await Vo.removeNatsConfig(e);return;case rt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=tc.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await rc(r)}catch(r){throw Qe?.disconnect(),r}}a(nP,"startService");async function Nj(){try{let e=await rP(),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 Qe?.disconnect(),e}}a(Nj,"getUniqueServicesList");async function KTe(e=[]){try{let t=!1,r=await Nj();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===rt.PROCESS_DESCRIPTORS.HDB?t=!0:await Rj(o))}t&&await Ij(rt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Qe?.disconnect(),t}}a(KTe,"restartAllServices");async function wj(e){if(rn?.find(r=>r.name===e))return!0;let t=await vTe.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(wj,"isServiceRegistered");async function Ij(e){let t=YT.get(rt.CONFIG_PARAMS.THREADS_COUNT)??YT.get(rt.CONFIG_PARAMS.THREADS),r=await Oj(e),n=DTe.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await tP(e),await nP(e)):e===rt.PROCESS_DESCRIPTORS.HDB?await bj():await Aj(e)}a(Ij,"reloadStopStart");var Cj;async function Pj(e=!1){for(let t in rt.CLUSTERING_PROCESSES){let r=rt.CLUSTERING_PROCESSES[t];await nP(r,e)}}a(Pj,"startClusteringProcesses");async function Dj(){Cj=Sj(rt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:rt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await KT.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await KT.updateLocalStreams();let e=await LTe.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===rt.PRE_4_0_0_VERSION){kl.info("Starting clustering upgrade 4.0.0 process"),Sj(rt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(Dj,"startClusteringThreads");async function YTe(){for(let e in rt.CLUSTERING_PROCESSES)if(e!==rt.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===rt.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await Cj.terminate();else{let t=rt.CLUSTERING_PROCESSES[e];await tP(t)}}a(YTe,"stopClustering");async function WTe(){for(let e in rt.CLUSTERING_PROCESSES){let t=rt.CLUSTERING_PROCESSES[e];if(await wj(t)===!1)return!1}return!0}a(WTe,"isClusteringRunning");async function zTe(){await Vo.generateNatsConfig(!0),await KT.reloadNATSHub(),await KT.reloadNATSLeaf(),await Vo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Vo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(zTe,"reloadClustering")});var sP=id(),Mj=(G(),D($));a(async function(){try{let t=await sP.describe(Mj.PROCESS_DESCRIPTORS.HDB);for(let r of t)await sP.reload(r.pm_id);await sP.deleteProcess(Mj.PROCESS_DESCRIPTORS.RESTART_HDB)}catch(t){throw console.error(t),t}},"restartHdb")();
132
+ `;pe.message=`${Ae}${pe.message}`,pe.stack=`${Ae}${pe.stack}`,ip?.(pe),Ml.default.error(pe),t.set(h.path||"/",new ia(pe)),Ld.set(n?d:(0,Tt.basename)(e),pe.message)}}}}catch(S){S.message=`Could not load component '${d}' for application '${(0,Tt.basename)(e)}' due to: ${S.message}`,ip?.(S),((0,op.getWorkerIndex)()===0?console:Ml.default).error(S),t.set(h.path||"/",new ia(S),null,!0),Ld.set(n?d:(0,Tt.basename)(e),S.message)}}if(TT=u,Dd.isMainThread&&!ZW&&i&&(0,op.watchDir)(e,async()=>ez()),c.extensionModule){let d=await EE((0,Tt.join)(e,c.extensionModule));return ST.set(o,d),d}if(!f&&t.isWorker){let d=`${e} did not load any modules, resources, or files, is this a valid component?`;ip?.(new Error(d)),((0,op.getWorkerIndex)()===0?console:Ml.default).error(d),Ld.set((0,Tt.basename)(e),d)}}catch(c){console.error(`Could not load application directory ${e}`,c),c.message=`Could not load application due to ${c.message}`,ip?.(c),t.set("",new ia(c))}}var ut,Tt,Dd,bC,IC,CC,JW,op,Ml,XW,OC,lge,RT,uge,RC,NC,ZW,yC,Ld,dge,wC,QW,ST,ip,TT,_ge,Oh=be(()=>{ut=require("fs"),Tt=require("path"),Dd=require("worker_threads"),bC=require("yaml"),IC=M(ce()),CC=M(Et());G();lL();VL();eB();sB();iB();$B();iK();dK();_K();JW=M(require("fast-glob")),op=M(it()),Ml=M(X());Sb();Dr();XW=M(he());Ue();WI();OC=M(ce()),lge=M(CW());Xg();BW();ms();jW();RT=M(It());yE();HA();({readFile:uge}=ut.promises),RC=(0,RT.resolvePath)(IC.get(B.COMPONENTSROOT)),NC=new Map,Ld=new Map;a(ez,"loadComponentDirectories");dge={REST:OE,rest:OE,graphql:sR,graphqlSchema:qA,roles:gb,jsResource:Ab,fastifyRoutes:lI,login:yb,static:uI,operationsApi:lge,customFunctions:{},http:{},clustering:pC,replication:Ra,authentication:Eh,mqtt:AC,loadEnv:dI},wC={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js",path:"."}};Object.defineProperty(wC,"static",{value:{files:"web/**"}});QW=[],ST=new Map;a(fge,"setErrorReporter");_ge=a(()=>TT,"getComponentName");a(hge,"symlinkHarperModule");a(AT,"loadComponent")});var oT=P((HMe,rz)=>{var{isMainThread:tz}=require("worker_threads"),{getTables:pge,getDatabases:xMe,table:BMe}=(Ue(),D(ct)),{loadComponentDirectories:mge,loadComponent:Ege}=(Oh(),D(bh)),{resetResources:gge}=(Xl(),D(iL)),Sge=aw(),Tge=It(),{dirname:Age}=require("path"),{getConnection:Rge}=Er(),yge=ce(),{CONFIG_PARAMS:bge}=(G(),D($)),{loadCertificates:Oge}=Zs(),PC=new Map;async function Nge(e=!1){!tz&&yge.get(bge.CLUSTERING_ENABLED)&&Rge();try{tz&&await Sge()}catch(n){console.error(n)}let t=gge();pge(),t.isWorker=e,await Oge(),await Ege(Age(Tge.getConfigFilePath()),t,"hdb",!0,PC),await mge(PC,t);let r=[];for(let[n]of PC)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}a(Nge,"loadRootComponents");rz.exports.loadRootComponents=Nge});var it=P((FMe,li)=>{"use strict";kA();var{Worker:wge,MessageChannel:Ige,parentPort:Vi,isMainThread:UC,threadId:Cge,workerData:Ki}=require("worker_threads"),{PACKAGE_ROOT:Pge}=Et(),{join:oz,isAbsolute:Dge,extname:Lge}=require("path"),{server:az}=(Dr(),D($l)),{watch:Mge,readdir:vge}=require("fs/promises"),{totalmem:nz}=require("os"),Md=(G(),D($)),cz=ce(),ci=X(),{randomBytes:Uge}=require("crypto"),{_assignPackageExport:xge}=ui(),sz=1024*1024,Qa=[],Ds=[],Bge=50,xC=1e4,Hge="restart",lz="request_thread_info",uz="resource_report",dz="thread_info",fz="added-port",kge="ack",DC;xge("threads",Ds);li.exports={startWorker:LC,restartWorkers:HC,shutdownWorkers:Vge,workers:Qa,setMonitorListener:Xge,onMessageFromWorkers:Kge,onMessageByType:Sz,broadcast:Wge,broadcastWithAcknowledgement:jge,setChildListenerByType:$ge,getWorkerIndex:_z,getWorkerCount:hz,getTicketKeys:mz,setMainIsWorker:Gge,setTerminateTimeout:Fge,restartNumber:Ki?.restartNumber||1};Ds.onMessageByType=Sz;Ds.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=Ds.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};li.exports.whenThreadsStarted=new Promise(e=>{li.exports.threadsHaveStarted=e});var BC;function Fge(e){xC=e}a(Fge,"setTerminateTimeout");function _z(){return Ki?Ki.workerIndex:BC?0:void 0}a(_z,"getWorkerIndex");function hz(){return Ki?Ki.workerCount:BC?1:void 0}a(hz,"getWorkerCount");function Gge(e){BC=e,li.exports.threadsHaveStarted()}a(Gge,"setMainIsWorker");var pz=1,yT;function mz(){return yT||(yT=UC?Uge(48):Ki.ticketKeys,yT)}a(mz,"getTicketKeys");Object.defineProperty(az,"workerIndex",{get(){return _z()}});Object.defineProperty(az,"workerCount",{get(){return hz()}});var Ez={[lz](e,t){Qge(t)},[uz](e,t){Jge(t,e)}};function LC(e,t={}){let r=process.constrainedMemory?.()||nz();r=Math.min(r,nz(),2e4*sz);let n=cz.get(Md.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/sz/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],o=[];for(let l of Ds){let u=new Ige;u.existingPort=l,i.push(u),o.push(u.port2)}Lge(e)||(e+=".js");let c=new wge(Dge(e)?e:oz(Pge,e),{resourceLimits:{maxOldGenerationSizeMb:n,maxYoungGenerationSizeMb:s},execArgv:["--enable-source-maps","--expose-internals"],argv:process.argv.slice(2),workerData:{addPorts:o,addThreadIds:i.map(l=>l.existingPort.threadId),workerIndex:t.workerIndex,workerCount:pz=t.threadCount,name:t.name,restartNumber:li.exports.restartNumber,ticketKeys:mz()},transferList:o,...t});for(let{port1:l,existingPort:u}of i)u.postMessage({type:fz,port:l,threadId:c.threadId},[l]);return OT(c,!0),c.unexpectedRestarts=t.unexpectedRestarts||0,c.startCopy=()=>LC(e,t),c.on("error",l=>{ci.error(`Worker index ${t.workerIndex} error:`,l)}),c.on("exit",l=>{Qa.splice(Qa.indexOf(c),1),!c.wasShutdown&&t.autoRestart!==!1&&(c.unexpectedRestarts<Bge?(t.unexpectedRestarts=c.unexpectedRestarts+1,LC(e,t)):ci.error(`Thread has been restarted ${c.restarts} times and will not be restarted`))}),c.on("message",l=>{Ez[l.type]?.(l,c)}),Qa.push(c),eSe(),t.onStarted&&t.onStarted(c),c.name=t.name,c}a(LC,"startWorker");var qge=[Md.THREAD_TYPES.HTTP];async function HC(e=null,t=Math.max(pz>3,1),r=!0){if(UC){try{process.chdir(process.cwd())}catch(o){ci.error("Unable to reestablish current working directory",o)}if(r){let{loadRootComponents:o}=oT();await o()}li.exports.restartNumber++,t<1&&(t=t*Qa.length);let n=[],s=[];for(let o of Qa.slice(0)){if(e&&o.name!==e||o.wasShutdown)continue;ci.trace("sending shutdown request to ",o.threadId),o.postMessage({restartNumber:li.exports.restartNumber,type:Md.ITC_EVENT_TYPES.SHUTDOWN}),o.wasShutdown=!0,o.emit("shutdown",{});let c=qge.indexOf(o.name)>-1,l=new Promise(u=>{let f=setTimeout(()=>{ci.warn("Thread did not voluntarily terminate, terminating from the outside",o.threadId),o.terminate()},xC*2).unref();o.on("exit",()=>{clearTimeout(f),n.splice(n.indexOf(l)),!c&&r&&o.startCopy(),u()})});if(n.push(l),c&&r){let u=o.startCopy(),f=new Promise(d=>{let h=a(_=>{_.type===Md.ITC_EVENT_TYPES.CHILD_STARTED&&(ci.trace("Worker has started",u.threadId),d(),s.splice(s.indexOf(f)),u.off("message",h))},"startListener");ci.trace("Waiting for worker to start",u.threadId),u.on("message",h)});s.push(f),n.length>=t&&await Promise.race(n),s.length>=t&&await Promise.race(s)}}await Promise.all(n),await Promise.all(s);let{restartService:i}=sd();r&&(e==="http"||!e)&&cz.get(Md.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else Vi.postMessage({type:Hge,workerType:e})}a(HC,"restartWorkers");function $ge(e,t){Ez[e]=t}a($ge,"setChildListenerByType");function Vge(e){return HC(e,1/0,!1)}a(Vge,"shutdownWorkers");var gz=[];function Kge(e){gz.push(e)}a(Kge,"onMessageFromWorkers");var MC=new Map;function Sz(e,t){let r=MC.get(e);r||MC.set(e,r=[]),r.push(t)}a(Sz,"onMessageByType");var Yge=10;async function Wge(e,t){let r=0;for(let n of Ds)try{n.postMessage(e),r++>Yge&&(r=0,await new Promise(setImmediate))}catch(s){ci.error("Unable to send message to worker",s)}t&&Az(e,null)}a(Wge,"broadcast");var bT=new Map,zge=1;function jge(e){return new Promise(t=>{let r=0;for(let n of Ds)try{let s=zge++,i=a(()=>{bT.delete(s),--r===0&&t(),n!==Vi&&--n.refCount===0&&n.unref()},"ack_handler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,bT.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,o]of bT)o.port===n&&o()})),n.postMessage(e),r++}catch(s){ci.error("Unable to send message to worker",s)}r===0&&t()})}a(jge,"broadcastWithAcknowledgement");function Qge(e){e.postMessage({type:dz,workers:Tz()})}a(Qge,"sendThreadInfo");function Tz(){let e=Date.now();return Qa.map(t=>({threadId:t.threadId,name:t.name,heapTotal:t.resources?.heapTotal,heapUsed:t.resources?.heapUsed,externalMemory:t.resources?.external,arrayBuffers:t.resources?.arrayBuffers,sinceLastUpdate:e-t.resources?.updated,...t.recentELU}))}a(Tz,"getChildWorkerInfo");function Jge(e,t){e.resources=t,e.resources.updated=Date.now()}a(Jge,"recordResourceReport");var vC;function Xge(e){vC=e}a(Xge,"setMonitorListener");var Zge=1e3,iz=!1;function eSe(){iz||(iz=!0,setInterval(()=>{for(let e of Qa){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}vC&&vC()},Zge).unref())}a(eSe,"startMonitoring");var tSe=1e3;if(Vi&&Ki?.addPorts){OT(Vi);for(let e=0,t=Ki.addPorts.length;e<t;e++){let r=Ki.addPorts[e];r.threadId=Ki.addThreadIds[e],OT(r)}setInterval(()=>{let e=process.memoryUsage();Vi.postMessage({type:uz,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},tSe).unref(),DC=a(()=>new Promise((e,t)=>{Vi.on("message",r),Vi.postMessage({type:lz});function r(n){n.type===dz&&(Vi.off("message",r),e(n.workers))}a(r,"receiveThreadInfo")}),"getThreadInfo")}else DC=Tz;li.exports.getThreadInfo=DC;function OT(e,t){Ds.push(e),e.on("message",r=>{if(r.type===fz)r.port.threadId=r.threadId,OT(r.port);else if(r.type===kge){let n=bT.get(r.id);n&&n()}else Az(r,e)}).on("close",()=>{Ds.splice(Ds.indexOf(e),1)}).on("exit",()=>{Ds.splice(Ds.indexOf(e),1)}),t?e.refCount=100:e.unref()}a(OT,"addPort");function Az(e,t){for(let n of gz)n(e,t);let r=MC.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){ci.error(s)}}a(Az,"notifyMessageListeners");if(UC){let e,t,r=new Set,n=a(async(s,i)=>{i&&(e=i);for(let o of await vge(s,{withFileTypes:!0}))o.isDirectory()&&o.name!=="node_modules"&&n(oz(s,o.name));try{for await(let{filename:o}of Mge(s,{persistent:!1}))r.add(o),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await HC(),console.log("Reloaded HarperDB components, changed files:",Array.from(r)),r.clear()},100)}catch(o){console.warn("Error trying to watch component directory",s,o)}},"watch_dir");li.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else Vi.on("message",async e=>{let{type:t}=e;t===Md.ITC_EVENT_TYPES.SHUTDOWN&&(li.exports.restartNumber=e.restartNumber,Vi.unref(),setTimeout(()=>{ci.warn("Thread did not voluntarily terminate",Cge),process.exit(0)},xC).unref())})});var Sx={};Be(Sx,{ACTION_32_BIT:()=>Tm,ACTION_64_BIT:()=>iSe,AUDIT_STORE_OPTIONS:()=>fh,Decoder:()=>sl,HAS_BLOBS:()=>pn,HAS_CURRENT_RESIDENCY_ID:()=>wc,HAS_EXPIRATION_EXTENDED_TYPE:()=>xf,HAS_ORIGINATING_OPERATION:()=>Uf,HAS_PREVIOUS_RESIDENCY_ID:()=>Ic,REMOTE_SEQUENCE_UPDATE:()=>ig,createAuditEntry:()=>Oc,getLastRemoved:()=>nSe,openAuditStore:()=>IT,readAuditEntry:()=>Pt,removeAuditEntry:()=>CT,setAuditRetention:()=>sSe,transactionKeyEncoder:()=>Pz});function IT(e){let t=e.auditStore=e.openDB(kC.AUDIT_STORE_NAME,{create:!1,...fh});t||(t=e.auditStore=e.openDB(kC.AUDIT_STORE_NAME,fh),yz(t,1)),t.rootStore=e,t.tableStores=[];let r=[];t.addDeleteRemovalCallback=function(l,u,f){return r[l]=f,t.tableStores[l]=u,t.deleteCallbacks=r,{remove(){delete r[l]}}};let n=null,s,i=0,o=GC;Qh(t.env.path,l=>{if(i=l,l)return c(100)});function c(l){l&&(o=l),clearTimeout(n);let u=new Promise(f=>{n=setTimeout(async()=>{if(await s,s=u,t.rootStore.status==="closed"||t.rootStore.status==="closing")return;let d=0,h,_;try{for(let{key:p,value:S}of t.getRange({start:1,snapshot:!1,end:Date.now()-FC/(1+i*i)})){try{h=CT(t,p,S)}catch(g){vd.warn("Error removing audit entry",g)}if(_=p,await new Promise(setImmediate),++d>=rSe){o=10;break}}await h}finally{d===0?o=Math.min(o<<1,FC/10):(yz(t,_),o>100&&(o=o>>1)),f(void 0),c()}},o).unref()});return u}if(a(c,"scheduleAuditCleanup"),t.scheduleAuditCleanup=c,(0,cp.getWorkerIndex)()===(0,cp.getWorkerCount)()-1&&c(),(0,cp.getWorkerIndex)()===0&&!Rz)for(let l of t.getKeys({reverse:!0,limit:1}))l>Date.now()&&(Rz=!0,vd.error("The current time is before the last recorded entry in the audit log. Time reversal can undermine the integrity of data tracking and certificate validation and the time must be corrected."));return t}function CT(e,t,r){let n=oSe(r),s;if(n&pn){s=Pt(r);let i=e.tableStores[s.tableId],o=i?.getEntry(s.recordId);(!o||o.version!==s.version||!o.value)&&Tc(()=>oa(s.getValue(i)),i.rootStore)}if((n&15)===qC){s=s||Pt(r);let i=s.tableId;e.tableStores[s.tableId]?.getEntry(s.recordId)?.version===s.version&&e.deleteCallbacks?.[i]?.(s.recordId,s.version)}return e.remove(t)}function yz(e,t){$C[0]=t,e.put(Symbol.for("last-removed"),Dz)}function nSe(e){let t=e.get(Symbol.for("last-removed"));if(t)return Dz.set(t),$C[0]}function sSe(e,t=GC){FC=e,GC=t}function Oc(e,t,r,n,s,i,o,c,l,u,f,d,h){let _=Lz[o];if(!_)throw new Error(`Invalid audit entry type ${o}`);let p=1;if(n&&(n>1?Ja.setFloat64(0,n):Ls.set(hR),p=9),l){if(l&255)throw new Error("Illegal extended type");p+=3}R(s),R(t),g(r),Ja.setFloat64(p,e),p+=8,l&wc&&R(u),l&Ic&&R(f),l&xf&&(Ja.setFloat64(p,d),p+=8),l&Uf&&R(Mz[h]),i?g(i):Ls[p++]=0,l?Ja.setUint32(n?8:0,_|l|3221225472):Ls[n?8:0]=_;let S=Ls.subarray(0,p);if(c)return Buffer.concat([S,c]);return S;function g(E){let T=p;p+=1,p=(0,vl.writeKey)(E,Ls,p);let O=p-T-1;O>127?O>16383?(vd.error("Key or username was too large for audit entry",E),p=T+1,Ls[T]=0):(Ls.copyWithin(T+2,T+1,p),Ja.setUint16(T,O|32768),p++):Ls[T]=O}function R(E){E<128?Ls[p++]=E:E<16384?(Ja.setUint16(p,E|32768),p+=2):E<1056964608?(Ja.setUint32(p,E|3221225472),p+=4):(Ls[p]=255,Ja.setUint32(p+1,E),p+=5)}}function oSe(e){let t=0;e[0]==66&&(t=8);let r=e[t];if(r<128)return r;let n=e.dataView||(e.dataView=new sl(e.buffer,e.byteOffset,e.byteLength));return n.position=t,n.readInt()}function Pt(e,t=0,r=void 0){try{let n=e.dataView||(e.dataView=new sl(e.buffer,e.byteOffset,e.byteLength));n.position=t;let s;e[n.position]==66&&(s=n.readFloat64());let i=n.readInt(),o=n.readInt(),c=n.readInt(),l=n.readInt(),u=n.position,f=n.position+=l,d=n.readFloat64(),h,_,p,S;if(i&wc&&(h=n.readInt()),i&Ic&&(_=n.readInt()),i&xf&&(p=n.readFloat64()),i&Uf){let T=n.readInt();S=Mz[T]}l=n.readInt();let g=n.position,R=n.position+=l,E;return{type:Lz[i&7],tableId:c,nodeId:o,get recordId(){return(0,vl.readKey)(e,u,f)},getBinaryRecordId(){return e.subarray(u,f)},version:d,previousLocalTime:s,get user(){return R>g?(0,vl.readKey)(e,g,R):void 0},get encoded(){return t?e.subarray(t,r):e},getValue(T,O,v){if(i&NT||i&ap&&!O)return E||(E=Tc(()=>T.decoder.decode(e.subarray(n.position,r)),T.rootStore)),E;if(i&ap&&v)return nb(T.getEntry(this.recordId),v,T)},getBinaryValue(){return i&(NT|ap)?e.subarray(n.position,r):void 0},extendedType:i,residencyId:h,previousResidencyId:_,expiresAt:p,originatingOperation:S}}catch(n){return vd.error("Reading audit entry error",n,e),{}}}var vl,wT,kC,cp,Cz,vd,Ls,Ja,Pz,fh,FC,rSe,$C,Dz,GC,Rz,NT,ap,bz,qC,Oz,Nz,wz,Iz,Tm,iSe,ig,wc,Ic,Uf,xf,pn,Lz,Mz,sl,so=be(()=>{vl=require("ordered-binary"),wT=M(ce()),kC=M(Ft());G();cp=M(it()),Cz=M(oe());nu();vd=M(X());sE();_s();XS();(0,wT.initSync)();Ls=Buffer.alloc(2816),Ja=new DataView(Ls.buffer,Ls.byteOffset,2816),Pz={writeKey(e,t,r){return e===vf?(t.set(vf,r),r+8):typeof e=="number"?((t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).setFloat64(r,e),r+8):(0,vl.writeKey)(e,t,r)},readKey(e,t,r){return e[t]===66?(e.dataView||(e.dataView=new DataView(e.buffer,e.byteOffset,e.byteLength))).getFloat64(t):(0,vl.readKey)(e,t,r)}},fh={encoding:"binary",keyEncoder:Pz},FC=(0,Cz.convertToMS)((0,wT.get)(B.LOGGING_AUDITRETENTION))||86400*3,rSe=1e3,$C=new Float64Array(1),Dz=new Uint8Array($C.buffer),GC=1e4,Rz=!1;a(IT,"openAuditStore");a(CT,"removeAuditEntry");a(yz,"updateLastRemoved");a(nSe,"getLastRemoved");a(sSe,"setAuditRetention");NT=16,ap=32,bz=1,qC=2,Oz=3,Nz=4,wz=5,Iz=6,Tm=14,iSe=15,ig=11,wc=512,Ic=1024,Uf=2048,xf=4096,pn=8192,Lz={put:bz|NT,[bz]:"put",delete:qC,[qC]:"delete",message:Oz|NT,[Oz]:"message",invalidate:Nz|ap,[Nz]:"invalidate",patch:wz|ap,[wz]:"patch",relocate:Iz,[Iz]:"relocate"},Mz={insert:1,update:2,upsert:3,1:"insert",2:"update",3:"upsert"};a(Oc,"createAuditEntry");a(oSe,"readAction");a(Pt,"readAuditEntry");sl=class extends DataView{static{a(this,"Decoder")}position=0;readInt(){let t;return t=this.getUint8(this.position++),t>=128?t>=192?t===255?(t=this.getUint32(this.position),this.position+=4,t):(t=this.getUint32(this.position-1)&1073741823,this.position+=3,t):(t=this.getUint16(this.position-1)&32767,this.position++,t):t}readFloat64(){try{let t=this.getFloat64(this.position);return this.position+=8,t}catch(t){throw t.message=`Error reading float64: ${t.message} at position ${this.position}`,t}}}});function YC(e,t,r,n,s){let i=e.primaryStore.env.path,o=e.primaryStore.tableId,c;s?.crossThreads===!1?(c=Uz,aSe(e.primaryStore,e.auditStore)):(c=vz,e.primaryStore.env.hasSubscriptionCommitListener||(e.primaryStore.env.hasSubscriptionCommitListener=!0,e.primaryStore.on("committed",()=>{xz(vz[i])})));let l=c[i]||(c[i]=[]);if(l.auditStore=e.auditStore,l.lastTxnTime==null&&(l.lastTxnTime=Date.now()),s?.scope==="full-database")return;let u=l[o];u||(u=l[o]=new Map,u.envs=l,u.tableId=o,u.store=e.primaryStore),t=Jl(t);let f=new KC(r);f.startTime=n;let d=u.get(t);return d?d.push(f):(u.set(t,d=[f]),d.tables=u,d.key=t),f.subscriptions=d,f}function xz(e){if(!e)return;let t=e.auditStore;t.resetReadTxn(),Bz(e.auditStore);let r;for(let{key:n,value:s}of t.getRange({start:e.lastTxnTime,exclusiveStart:!0})){e.lastTxnTime=n;let i=Pt(s),o=e[i.tableId];if(!o)continue;let c=i.recordId,l=Jl(c),u=0;do{let f=o.get(l);if(f){for(let h of f)if(!(u>0&&!(h.includeDescendants&&!(h.onlyChildren&&u>1)))){if(h.startTime>=n){(0,VC.info)("omitting",c,h.startTime,n);continue}try{let _;h.supportsTransactions&&h.txnInProgress!==i.version&&(_=!0,h.txnInProgress||(r?r.push(h):r=[h]),h.txnInProgress=i.version),h.listener(c,i,n,_)}catch(_){console.error(_),(0,VC.info)(_)}}}if(l==null)break;let d=l.lastIndexOf?.("/",l.length-2);d!==l.length-1&&u++,d>-1?l=l.slice(0,d+1):l=null}while(!0)}if(r)for(let n of r)n.txnInProgress=null,n.listener(null,{type:"end_txn"},e.lastTxnTime,!0)}function aSe(e,t){let r=t||e,n=r.env;if(!n.hasAfterCommitListener){n.hasAfterCommitListener=!0;let s=n.path;r.on("aftercommit",({next:i,last:o,txnId:c})=>{let l=Uz[s];if(!l)return;let u=a(()=>{r.threadLocalWrites||(r.threadLocalWrites=new Float64Array(r.getUserSharedBuffer("last-thread-local-write",new ArrayBuffer(8)))),l.txnTime=r.threadLocalWrites[0]||Date.now();try{xz(l)}finally{r.threadLocalWrites[0]=l.lastTxnTime,r.unlock("thread-local-writes")}},"acquiredLock");r.attemptLock("thread-local-writes",u)&&u()})}}function Bz(e){e.nextTransaction?.resolve();let t;e.nextTransaction=new Promise(r=>{t=r}),e.nextTransaction.resolve=t}function Yk(e){return e.nextTransaction||(YC({primaryStore:e,auditStore:e},null,null,0,{scope:"full-database"}),Bz(e)),e.nextTransaction}var VC,vz,Uz,KC,xO=be(()=>{VC=M(X());Yl();Xl();so();vz=Object.create(null),Uz=Object.create(null);a(YC,"addSubscription");KC=class extends Un{static{a(this,"Subscription")}listener;subscriptions;startTime;constructor(t){super(),this.listener=t,this.on("close",()=>this.end())}end(){if(this.subscriptions){if(this.subscriptions.splice(this.subscriptions.indexOf(this),1),this.subscriptions.length===0){let t=this.subscriptions.tables;if(t){let r=this.subscriptions.key;if(t.delete(r),t.size===0){let n=t.envs,s=t.dbi;delete n[s]}}}this.subscriptions=null}}toJSON(){return{name:"subscription"}}};a(xz,"notifyFromTransactionData");a(aSe,"listenToCommits");a(Bz,"nextTransaction");a(Yk,"whenNextTransaction")});var Vw={};Be(Vw,{EVICTED:()=>na,INVALIDATED:()=>fn,coerceType:()=>LT,makeTable:()=>vT,setServerUtilities:()=>pSe});function vT(e){let{primaryKey:t,indices:r,tableId:n,tableName:s,primaryStore:i,databasePath:o,databaseName:c,auditStore:l,schemaDefined:u,dbisDB:f,sealed:d,splitSegments:h,replicate:_}=e,{expirationMS:p,evictionMS:S,audit:g,trackDeletes:R}=e;S??=0;let{attributes:E}=e;E||(E=[]);let T=ER(i,n,l),O,v,F={},q=Promise.resolve(),j,te,se;for(let K of E)(K.assignCreatedTime||K.name==="__createdtime__")&&(j=K),(K.assignUpdatedTime||K.name==="__updatedtime__")&&(te=K),K.expiresAt&&(se=K),K.isPrimaryKey&&(F=K);let z,ne=[],le=[],ie=1,Re=2,pe={},Ae={},Bt=864e5,dt=0,Cn,nn,wr,Fd=!1,nc,WT=new Map,zT=new Map,Ht,Gd,qd=xl.get(B.REPLICATION_DATABASES);if(Array.isArray(qd)){for(let K of qd)if(K.name===c&&K.replicateTo>=0){Gd=K.replicateTo;break}}let jT=i.getRange({start:!1,end:!1}).constructor,Sp=10,$d=6;g&&Tp(),Qh(i.env.path,K=>{if(v)return zo(K)});class De extends qr{#e;#t;#n;#r;#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=o;static databaseName=c;static attributes=E;static replicate=_;static sealed=d;static splitSegments=h??!0;static createdTimeProperty=j;static updatedTimeProperty=te;static propertyResolvers;static userResolvers={};static sources=[];static getResidencyById;static get expirationMS(){return p}static dbisDB=f;static schemaDefined=u;static sourcedFrom(m,y){if(y&&(this.sourceOptions=y,(y.expiration||y.eviction||y.scanInterval)&&this.setTTLExpiration(y)),y?.intermediateSource)m.intermediateSource=!0,this.sources.unshift(m);else{if(this.sources.some(b=>!b.intermediateSource)){if(this.sources.some(b=>b.name===m.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(m)}v=v||m.get&&(!m.get.reliesOnPrototype||m.prototype.get),O=O||m.load;let L=a(b=>{let I=this.sources;if(I=I.filter(x=>x.intermediateSource&&x[b]&&(!x[b].reliesOnPrototype||x.prototype[b])),I.length>0)if(I.length===1){let x=I[0];return(N,H,U)=>{if(N?.source!==x)return x[b](H,U,N)}}else return(x,N,H)=>{let U=[];for(let Q of I){if(x?.source===Q)break;U.push(Q[b](N,H,x))}return Promise.all(U)}},"getApplyToIntermediateSource"),C=this.sources[this.sources.length-1];C.intermediateSource&&(C={});let A=a(b=>{if(C[b]&&(!C[b].reliesOnPrototype||C.prototype[b]))return(I,x,N)=>{if(!I?.source)return C[b](x,N,I)}},"getApplyToCanonicalSource");pe={put:A("put"),patch:A("patch"),delete:A("delete"),publish:A("publish")},Ae={put:L("put"),patch:L("patch"),delete:L("delete"),publish:L("publish"),invalidate:L("invalidate")};let w=C.shouldRevalidateEvents;return(async()=>{let b=!1,I,x=a(async(N,H)=>{let U=N.value,Q=N.table?Ye[c][N.table]:De;if(c===Jd&&(N.table===Gl.ROLE_TABLE_NAME||N.table===Gl.USER_TABLE_NAME)&&(b=!0),N.id===void 0&&(N.id=U[Q.primaryKey],N.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(N));N.source=m;let J={residencyId:ac(N.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:N.nodeId,async:!0},k=await Q.getResource(N.id,H,J);switch(N.finished&&await N.finished,N.type){case"put":return w?k._writeInvalidate(U,J):k._writeUpdate(U,!0,J);case"patch":return w?k._writeInvalidate(U,J):k._writeUpdate(U,!1,J);case"delete":return k._writeDelete(J);case"publish":case"message":return k._writePublish(U,J);case"invalidate":return k._writeInvalidate(U,J);case"relocate":return k._writeRelocate(J);default:xe.default.error?.("Unknown operation",N.type,N.id)}},"writeUpdate");try{let N=m.subscribe;N&&R==null&&(R=!0);let H={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},U=m.subscribeOnThisThread?m.subscribeOnThisThread((0,Ul.getWorkerIndex)(),H):(0,Ul.getWorkerIndex)()===0,Q=N&&U&&await m.subscribe?.(H);if(Q){let J;for await(let k of Q)try{if(!(k.type==="transaction"?k.writes[0]:k)){xe.default.error?.("Bad subscription event",k);continue}if(k.source=m,k.type==="end_txn"){if(J?.resolve(),k.localTime&&I!==k.localTime){if(k.remoteNodeIds?.length>0){let ye=[Symbol.for("seq"),k.remoteNodeIds[0]],Y=f.get(ye),V=Y?.nodes;V||(V=[]);for(let _e of k.remoteNodeIds.slice(1)){let me=V.find(Te=>Te.id===_e);V=V.filter(Te=>Te.id!==_e||Te===me),me||(me={id:_e,seqId:0},V.push(me)),me.seqId=Math.max(Y?.seqId??1,k.localTime),_e===J?.nodeId&&(me.lastTxnTime=k.timestamp)}let ue=Math.max(Y?.seqId??1,k.localTime);xe.default.trace?.("Received txn",c,ue,new Date(ue),k.localTime,new Date(k.localTime),k.remoteNodeIds),f.put(ye,{seqId:ue,nodes:V})}I=k.localTime}k.onCommit&&J?.committed.then(k.onCommit);continue}if(J)if(k.beginTxn)J.resolve();else{J.write_promises.push(x(k,J));continue}!k.timestamp&&k.version&&(k.timestamp=k.version);let de=Ct(k,()=>{if(k.type==="transaction"){let ye=[];for(let Y of k.writes)try{ye.push(x(Y,k))}catch(V){throw V.message+=" writing "+JSON.stringify(Y)+" of event "+JSON.stringify(k),V}return Promise.all(ye)}else if(k.type==="define_schema"){let ye=this.attributes.slice(0),Y;for(let V of k.attributes)ye.find(ue=>ue.name===V.name)||(ye.push(V),Y=!0);Y&&(_t({table:s,database:c,attributes:ye,origin:"cluster"}),up.signalSchemaChange(new dp.SchemaEventMsg(process.pid,Yt.CREATE_TABLE,c,s)))}else return k.beginTxn?(J=k,J.write_promises=[x(k,k)],new Promise(ye=>{J.resolve=()=>ye(Promise.all(J.write_promises))})):x(k,k)});J&&(J.committed=de),b&&de&&!de?.waitingForUserChange&&(de.then(()=>up.signalUserChange(new dp.UserEventMsg(process.pid))),de.waitingForUserChange=!0),k.onCommit&&(de?de.then(k.onCommit):k.onCommit())}catch(Ce){xe.default.error?.("error in subscription handler",Ce)}}}catch(N){xe.default.error?.(N)}})(),this}static get isCaching(){return v}static get shouldRevalidateEvents(){return this.prototype.get!==De.prototype.get}static getResource(m,y,L){let C=super.getResource(m,y,L);if(m!=null){Ir(m);try{if(C.getRecord?.())return C;if(typeof m=="object"&&m&&!Array.isArray(m))throw new Error(`Invalid id ${JSON.stringify(m)}`);let A=!L?.async||i.cache?.get?.(m),w=Cr(y),b=w.getReadTxn();if(b?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return Pn(m,y,{transaction:b,ensureLoaded:L?.ensureLoaded},A,I=>{if(I?De._updateResource(C,I):C.#e=null,y.onlyIfCached&&y.noCacheStore){if(!C.doesExist())throw new Nr.ServerError("Entry is not cached",504)}else if(L?.ensureLoaded){let x=sn(m,I,y,C);if(x)return w?.disregardReadTxn(),C.#i=!0,zC(x,N=>(De._updateResource(C,N),C))}return C})}catch(A){throw A.message.includes("Unable to serialize object")&&(A.message+=": "+JSON.stringify(m)),A}}return C}static _updateResource(m,y){m.#r=y,m.#e=y?.value??null,m.#n=y?.version}ensureLoaded(){let m=sn(this.getId(),this.#r,this.getContext());if(m)return this.#i=!0,zC(m,y=>{this.#r=y,this.#e=y.value,this.#n=y.version})}static getNewId(){let m=F?.type;if(m==="String"||m==="ID")return super.getNewId();if(!Ht){let A=i.getEntry(Symbol.for("id_allocation")),w=A?.value,b;if(w&&w.nodeName===server.hostname&&(!ESe(i)||w.pid===process.pid)){let I=w.start,x=w.end;b=I;for(let N of i.getKeys({start:x,end:I,limit:1,reverse:!0}))b=N}else w=C(A?.version??null),b=w.start;Ht=new BigInt64Array([BigInt(b)+1n]),Ht=new BigInt64Array(i.getUserSharedBuffer("id",Ht.buffer)),Ht.maxSafeId=w.end}let y=Number(Atomics.add(Ht,0,1n)),L=m==="Int"?512:1048576;if(y+L>=Ht.maxSafeId){let A=a(w=>{Ht.maxSafeId=y+(m==="Int"?1023:4194303);let b=(m==="Int"?Math.pow(2,31):Math.pow(2,49))-1,I=w?void 0:i.useReadTransaction(),x=Number(Ht[0]);for(let U of i.getKeys({start:x+1,end:b,limit:1,transaction:I}))b=U;I?.done();let{value:N,version:H}=i.getEntry(Symbol.for("id_allocation"));if(Ht.maxSafeId<b){if(N.end>Ht.maxSafeId-100)return;xe.default.info?.("New id allocation",y,Ht.maxSafeId,H),i.put(Symbol.for("id_allocation"),{start:N.start,end:Ht.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),H)}else{xe.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${Ht.maxSafeId}, but id of ${b} detected`);let U=C(H);U.alreadyUpdated||Atomics.store(Ht,0,BigInt(U.start+1)),Ht.maxSafeId=U.end}},"updateEnd");y+L===Ht.maxSafeId?setImmediate(A):y+100>=Ht.maxSafeId&&(xe.default.warn?.(`Synchronous id allocation required on table ${s}${m=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>A(!0)))}return y;function C(A){let w=(m==="Int"?Math.pow(2,31):Math.pow(2,49))-1,b=w/4,I,x,N=!1,H,U;do{H=Math.floor(Math.random()*w),U={start:H,end:H+(m==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},I=0;for(let Q of i.getKeys({start:H,limit:1,reverse:!0}))I=Q;x=w;for(let Q of i.getKeys({start:H+1,end:w,limit:1}))x=Q;b*=.875,b<1e3&&!N&&(N=!0,xe.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${m==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,H,I,x,b))}while(!(b<x-H&&(b<H-I||I===0)));return i.transactionSync(()=>{let Q=i.getEntry(Symbol.for("id_allocation"));return(Q?.version??null)==A?(xe.default.info?.("Allocated new id range",U),i.put(Symbol.for("id_allocation"),U,Date.now()),U):(xe.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...Q.value})})}}static setTTLExpiration(m){if(typeof m=="number")p=m*1e3,S||(S=0);else if(m&&typeof m=="object")p=m.expiration*1e3,S=(m.eviction||0)*1e3,Bt=m.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(p<0)throw new Error("Expiration can not be negative");Bt=Bt||(p+S)/4,zo()}static getResidencyRecord(m){return f.get([Symbol.for("residency_by_id"),m])}static setResidency(m){De.getResidency=m&&((y,L)=>{try{return m(y,L)}catch(C){throw C.message+=` in residency function for table ${s}`,C}})}static setResidencyById(m){De.getResidencyById=m&&(y=>{try{return m(y)}catch(L){throw L.message+=` in residency function for table ${s}`,L}})}static getResidency(m,y){if(De.getResidencyById)return De.getResidencyById(m[t]);let L=Gd;if(y.replicateTo!=null){if(Array.isArray(y.replicateTo))return y.replicateTo.includes(server.hostname)?y.replicateTo:[server.hostname,...y.replicateTo];y.replicateTo>=0&&(L=y.replicateTo)}if(L>=0&&server.nodes){let C=[server.hostname];if(y.previousResidency)C.push(...y.previousResidency.slice(0,L));else{let A=server.nodes.map(I=>I.name),w=Math.floor(A.length*Math.random());C.push(...A.slice(w,w+L));let b=w+L-A.length;b>0&&C.push(...A.slice(0,b))}return C}}static enableAuditing(m=!0){g=m,m&&Tp(),De.audit=m}static coerceId(m){return m===""?null:LT(m,F)}static async dropTable(){delete Ye[c][s];for(let m of i.getRange({versions:!0,snapshot:!1,lazy:!0}))m.metadataFlags&pn&&m.value&&oa(m.value);if(c===o){for(let m of E)f.remove(De.tableName+"/"+m.name),r[m.name]?.drop();f.remove(De.tableName+"/"),i.drop(),await f.committed}else console.log("legacy dropTable"),await i.close(),await DT.default.remove(data_path),await DT.default.remove(data_path===standard_path?data_path+MDB_LOCK_FILE_SUFFIX:path.join(path.dirname(data_path),MDB_LEGACY_LOCK_FILE_NAME));up.signalSchemaChange(new dp.SchemaEventMsg(process.pid,Yt.DROP_TABLE,c,s))}get(m){if(typeof m=="string")return this.getProperty(m);if(this.isCollection)return this.search(m);if(this.getId()===null){if(m?.conditions||m?.size>0)return this.search(m);let y={records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:E};return this.getContext()?.includeExpensiveRecordCountEstimates?De.getRecordCount().then(L=>(y.recordCount=L.recordCount,y.estimatedRecordRange=L.estimatedRange,y)):y}if(m?.property)return this.getProperty(m.property);if(this.doesExist()||m?.ensureLoaded===!1||this.getContext()?.returnNonexistent)return this}allowRead(m,y){let L=sc(m);if(L?.read){if(L.isSuperUser)return!0;let C=L.attribute_permissions,A=y?.select;if(C?.length>0||Fd&&A){if(y||(y={}),A){let w=C?.length>0&&WC(C,"read");y.select=A.map(b=>{let I=b.name||b;if(!w||w[I]){let x=wr[I]?.definition?.tableClass;if(x){if(b.name||(b={name:b}),!x.prototype.allowRead.call(null,m,b))return!1;if(!b.select)return b.name}return b}}).filter(Boolean)}else y.select=C.filter(w=>w.read&&!wr[w.attribute_name]).map(w=>w.attribute_name);return y}else return!0}}allowUpdate(m,y){let L=sc(m);if(L?.update){let C=L.attribute_permissions;if(C?.length>0){let A=WC(C,"update");for(let w in y)if(!A[w])return!1;for(let w of C){let b=w.attribute_name;!w.update&&!(b in y)&&(y[b]=this.getProperty(b))}}return Wo(this.getContext())}}allowCreate(m,y){if(this.isCollection){let L=sc(m);if(L?.insert){let C=L.attribute_permissions;if(C?.length>0){let A=WC(C,"insert");for(let w in y)if(!A[w])return!1;return Wo(this.getContext())}else return Wo(this.getContext())}}else return this.allowUpdate(m,{})}allowDelete(m){return sc(m)?.delete&&Wo(this.getContext())}update(m,y){if(!Cr(this.getContext()))throw new Error("Can not update a table resource outside of a transaction");if(m===!1)return this;let C;return typeof m=="object"&&m&&(y?(Object.isFrozen(m)&&(m={...m}),this.#e={},this.#t=m):(C=this.#t,C&&(m=Object.assign(C,m)),this.#t=m)),this._writeUpdate(this.#t,y),this}addTo(m,y){if(typeof y=="number"||typeof y=="bigint")this.#s===kz?this.set(m,(+this.getProperty(m)||0)+y):(this.#s||this.update(),this.set(m,new aE(y)));else throw new Error("Can not add a non-numeric value")}subtractFrom(m,y){if(typeof y=="number")return this.addTo(m,-y);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this.#r}getRecord(){return this.#e}getChanges(){return this.#t}_setChanges(m){this.#t=m}setRecord(m){this.#e=m}invalidate(){this._writeInvalidate()}_writeInvalidate(m,y){let L=this.getContext(),C=this.getId();Ir(C),Cr(this.getContext()).addWrite({key:C,store:i,invalidated:!0,entry:this.#r,before:pe.invalidate?.bind(this,L,C),beforeIntermediate:Ae.invalidate?.bind(this,L,C),commit:a((w,b)=>{if(!(Yo(w,b,y?.nodeId)<=0)){m??=null;for(let I in r)m||(m={}),m[I]===void 0&&(m[I]=this.getProperty(I));xe.default.trace?.(`Invalidating entry id: ${C}, timestamp: ${new Date(w).toISOString()}`),T(C,m,this.#r,w,fn,g,{user:L?.user,residencyId:y?.residencyId,nodeId:y?.nodeId},"invalidate")}},"commit")})}_writeRelocate(m){let y=this.getContext(),L=this.getId();Ir(L),Cr(this.getContext()).addWrite({key:L,store:i,invalidated:!0,entry:this.#r,before:pe.relocate?.bind(this,y,L),beforeIntermediate:Ae.relocate?.bind(this,y,L),commit:a((A,w)=>{if(Yo(A,w,m?.nodeId)<=0)return;let b=De.getResidencyRecord(m.residencyId),I=0,x=null,N=w?.value;if(b&&!b.includes(server.hostname)){for(let H in r)x||(x={}),x[H]=N[H];I=fn}else x=N;xe.default.trace?.(`Relocating entry id: ${L}, timestamp: ${new Date(A).toISOString()}`),T(L,x,this.#r,A,I,g,{user:y.user,residencyId:m.residencyId,nodeId:m.nodeId,expiresAt:m.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(m,y){let L={previousResidency:this.getResidencyRecord(m.residencyId),isRelocation:!0},C=oc(this.getResidency(y.value,L)),A;if(C){if(!C.includes(server.hostname))return!1;A=ac(C)}let w=0;xe.default.debug?.("Performing a relocate of an entry",m.key,y.value,C);let b=T(m.key,y.value,m,m.version,w,!0,{residencyId:A,expiresAt:y.expiresAt},"relocate",!1,null);return!0}static evict(m,y,L){let C=this.Source,A;if(!((v||g)&&(!y||(A=i.getEntry(m),!A||!y)||A.version!==L))){if(v){if(i.hasLock(m,A.version))return;let w;for(let b in r)w||(w={}),w[b]=y[b];if(w)return T(m,w,A,L,na,null,null,null,!0)}if(i.ifVersion(m,L,()=>{Wi(m,y,null)}),g)return T(m,null,A,L,na,null,null,null,!0);Nc(i,A??i.getEntry(m),L)}}lock(){throw new Error("Not yet implemented")}static operation(m,y){return m.table||=s,m.schema||=c,Wz.operation(m,y)}put(m){this.update(m,!0)}patch(m){this.update(m,!1)}_writeUpdate(m,y,L){let C=this.getContext(),A=Cr(C),w=this.getId();Ir(w);let b=this.#r;this.#s=y?kz:fSe;let I={key:w,store:i,entry:b,nodeName:C?.nodeName,validate:a(x=>{m||(m=this.#t),y||m&&iE(this.#t===m?this:m)?C?.source||(A.checkOverloaded(),this.validate(m,!y),te&&(m[te.name]=te.type==="Date"?new Date(x):te.type==="String"?new Date(x).toISOString():x),y&&(t&&m[t]!==w&&(m[t]=w),j&&(b?.value?m[j.name]=b?.value[j.name]:m[j.name]=j.type==="Date"?new Date(x):j.type==="String"?new Date(x).toISOString():x),m=$c(m))):A.removeWrite(I)},"validate"),before:y?pe.put?()=>pe.put(C,w,m):null:pe.patch?()=>pe.patch(C,w,m):pe.put?()=>pe.put(C,w,$c(this)):null,beforeIntermediate:y?Ae.put?()=>Ae.put(C,w,m):null:Ae.patch?()=>Ae.patch(C,w,m):Ae.put?()=>Ae.put(C,w,$c(this)):null,commit:a((x,N,H)=>{if(H){if(C&&N?.version>(C.lastModified||0)&&(C.lastModified=N.version),this.#r=N,N?.value&&N.value.getRecord)throw new Error("Can not assign a record to a record, check for circular references");y||(this.#e=N?.value??null)}this.#t=void 0,this.#n=x;let U=N?.value,Q=m;this.#s=0;let J=!1,k=Yo(x,N,L?.nodeId),Ce;if(k<=0)if(g){let ue=N.localTime,_e=N.version;xe.default.trace?.("Applying CRDT update to record with id: ",w,"applying later update:",_e);let me=[];for(;ue>x||_e>=x&&ue>0;){let Te=l.get(ue);if(!Te)break;let Pe=Pt(Te);if(_e=Pe.version,_e>=x){if(_e===x){if(k=Yo(x,{version:_e,localTime:ue},L?.nodeId),k===0)return;if(k>0)continue}if(Pe.type==="patch")me.push(Pe),Ce=m;else if(Pe.type==="put"||Pe.type==="delete")return}ue=Pe.previousLocalTime}me.sort((Te,Pe)=>Te.version-Pe.version);for(let Te of me){let Pe=Te.getValue(i);if(Q=nE(Q,Pe,y),xe.default.debug?.("Rebuilding update with future patch:",Q),!Q)return}}else{if(y)return;Q=nE(Q,U,y),xe.default.debug?.("Rebuilding update without audit:",Q)}let de;if(y?de=Q:(this.#e=U,de=$c(this,Q)),this.#e=de,de&&de.getRecord)throw new Error("Can not assign a record to a record, check for circular references");let ye;if(L?.residencyId!=null)ye=L.residencyId;else{b?.residencyId&&(C.previousResidency=De.getResidencyRecord(b.residencyId));let ue=oc(De.getResidency(de,C));if(ue&&!ue.includes(server.hostname))if(Ce??=de,J=!0,De.getResidencyById)de=void 0;else{de=null;for(let _e in r)de||(de={}),de[_e]=Ce[_e]}ye=ac(ue)}y||(Ce=m);let Y=C?.expiresAt??(p?p+Date.now():-1);xe.default.trace?.(`Saving record with id: ${w}, timestamp: ${new Date(x).toISOString()}${Y?", expires at: "+new Date(Y).toISOString():""}${N?", replaces entry from: "+new Date(N.version).toISOString():", new entry"}`,(()=>{try{return JSON.stringify(de).slice(0,100)}catch{return""}})()),Wi(w,U,de);let V=y?"put":"patch";T(w,de,N,x,J?fn:0,g,{omitLocalRecord:J,user:C?.user,residencyId:ye,expiresAt:Y,nodeId:L?.nodeId,originatingOperation:C?.originatingOperation},V,!1,Ce),C.expiresAt&&zo()},"commit")};A.addWrite(I)}async delete(m){if(typeof m=="string")return this.deleteProperty(m);if(this.isCollection){for await(let y of this.search(m))(await De.getResource(y[t],this.getContext(),{ensureLoaded:!1}))._writeDelete(m);return}return this.#e?this._writeDelete(m):!1}_writeDelete(m){let y=Cr(this.getContext()),L=this.getId();Ir(L);let C=this.getContext();return y.addWrite({key:L,store:i,entry:this.#r,nodeName:C?.nodeName,before:pe.delete?.bind(this,C,L),beforeIntermediate:Ae.delete?.bind(this,C,L),commit:a((A,w,b)=>{let I=w?.value;b&&(C&&w?.version>(C.lastModified||0)&&(C.lastModified=w.version),De._updateResource(this,w)),!(Yo(A,w,m?.nodeId)<=0)&&(Wi(this.getId(),I),xe.default.trace?.(`Deleting record with id: ${L}, txn timestamp: ${new Date(A).toISOString()}`),g||R?(T(L,null,this.#r,A,0,g,{user:C?.user,nodeId:m?.nodeId},"delete"),g||zo()):Nc(i,w))},"commit")}),!0}search(m){let y=this.getContext(),L=Cr(y);if(!m)throw new Error("No query provided");let C=m.conditions;C?C.length===void 0&&(C=C[Symbol.iterator]?Array.from(C):[C]):C=Array.isArray(m)?m:m[Symbol.iterator]?Array.from(m):[],this.getId()&&(C=[{attribute:null,comparator:Array.isArray(this.getId())?"prefix":"starts_with",value:this.getId()}].concat(C));let A,w={};function b(V,ue){let _e;switch(ue){case"and":case void 0:if(V.length<1)throw new Error('An "and" operator requires at least one condition');_e=!0;break;case"or":if(V.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+ue)}for(let me of V){if(me.conditions){me.conditions=b(me.conditions,me.operator);continue}let Te=me[0]??me.attribute,Pe=Te==null?F:pi(E,Te);if(Pe)(Pe.type||MA[me.comparator])&&(me[1]===void 0?me.value=x(me.value,Pe):me[1]=x(me[1],Pe));else if(Te!=null)throw(0,Nr.handleHDBError)(new Error,`${Te} is not a defined attribute`,404);if(me.chainedConditions)if(me.chainedConditions.length===1&&(!me.operator||me.operator=="and")){let Ve=me.chainedConditions[0],We,Dn;if(Ve.comparator==="gt"||Ve.comparator==="greater_than"||Ve.comparator==="ge"||Ve.comparator==="greater_than_equal"?(We=me,Dn=Ve):(We=Ve,Dn=me),We.comparator!=="lt"&&We.comparator!=="less_than"&&We.comparator!=="le"&&We.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let os=Dn.comparator==="ge"||Dn.comparator==="greater_than_equal",Ap=We.comparator==="le"||We.comparator==="less_than_equal";me.comparator=(os?"ge":"gt")+(Ap?"le":"lt"),me.value=[Dn.value,We.value]}else throw new Error("Multiple chained conditions are not currently supported")}return V}a(b,"prepareConditions");function I(V,ue){if(m.enforceExecutionOrder)return V;for(let _e of V)_e.conditions&&(_e.conditions=I(_e.conditions,_e.operator));return V.length>1&&ue!=="or"?(0,Kz.sortBy)(V,Qp(De)):V}a(I,"orderConditions");function x(V,ue){return Array.isArray(V)?V.map(_e=>LT(_e,ue)):LT(V,ue)}a(x,"coerceTypedValues");let N=m.operator;(C.length>0||N)&&(C=b(C,N));let H=typeof m.sort=="object"&&m.sort,U;if(H&&N!=="or"){let V=H.attribute;if(V==null)throw new Nr.ClientError("Sort requires an attribute");if(A=C.find(ue=>Ql(ue.attribute)===Ql(V)),!A){let ue=pi(E,V);if(!ue)throw(0,Nr.handleHDBError)(new Error,`${Array.isArray(V)?V.join("."):V} is not a defined attribute`,404);if(ue.indexed)A={attribute:V,comparator:"sort"},C.push(A);else if(C.length===0&&!m.allowFullScan)throw(0,Nr.handleHDBError)(new Error,`${Array.isArray(V)?V.join("."):V} is not indexed and not combined with any other conditions`,404)}A&&(A.descending=!!H.descending)}C=I(C,N),H&&(A&&C[0]===A?H.next&&(U={dbOrderedAttribute:H.attribute,attribute:H.next.attribute,descending:H.next.descending,next:H.next.next}):(A&&C.splice(C.indexOf(A),1),U=H));let Q=m.select;if(C.length===0&&(C=[{attribute:t,comparator:"greater_than",value:!0}]),m.explain)return{conditions:C,operator:N,postOrdering:U,selectApplied:!!Q};let J=L.useReadTxn(),k=vA(C,N,De,J,m,y,(V,ue)=>Kd(V,Q,y,J,ue),w),Ce=m.ensureLoaded!==!1;U||(k=Y(k));let de=De.transformEntryForSelect(Q,y,J,w,Ce,!0),ye=De.transformToOrderedSelect(k,Q,U,J,y,de);function Y(V){return m.offset||m.limit!==void 0?V.slice(m.offset,m.limit!==void 0?(m.offset||0)+m.limit:void 0):V}return a(Y,"applyOffset"),U&&(ye=Y(ye)),ye.onDone=()=>{ye.onDone=null,L.doneReadTxn()},ye.selectApplied=!0,ye.getColumns=()=>{if(Q){let V=[];for(let ue of Q)ue==="*"?V.push(...E.map(_e=>_e.name)):V.push(ue.name||ue);return V}return E.filter(V=>!V.computed&&!V.relationship).map(V=>V.name)},ye}static transformToOrderedSelect(m,y,L,C,A,w){let b=new jT;if(L){m=Kd(m,y,C,A,null);let I;b.iterate=function(){let N,H=m[Symbol.asyncIterator]?m[Symbol.asyncIterator]():m[Symbol.iterator](),U,Q=L.dbOrderedAttribute,J,k,Ce=!0;function de(Y){let V=Y.next&&de(Y.next),ue=Y.descending;return(_e,me)=>{let Te=ic(_e,Y.attribute,C),Pe=ic(me,Y.attribute,C),Ve=ue?(0,Bl.compareKeys)(Pe,Te):(0,Bl.compareKeys)(Te,Pe);return Ve===0?V?.(_e,me)||0:Ve}}a(de,"createComparator");let ye=de(L);return{async next(){let Y;if(N)if(Y=N.next(),Y.done){if(U)return b.onDone&&b.onDone(),Y}else return{value:await w.call(this,Y.value)};I=[],J&&I.push(J);do if(Y=await H.next(),Y.done){if(U=!0,I.length)break;return b.onDone&&b.onDone(),Y}else{let V=Y.value;if(V?.then&&(V=await V),Q){let ue=ic(V,Q,C);if(Ce)Ce=!1,k=ue;else if(ue!==k){k=ue,J=V;break}}I.push(V)}while(!0);return L.isGrouped,I.sort(ye),N=I[Symbol.iterator](),Y=N.next(),Y.done?(b.onDone&&b.onDone(),Y):{value:await w.call(this,Y.value)}},return(){b.onDone&&b.onDone(),H.return()},throw(){b.onDone&&b.onDone(),H.throw()}}};let x=a(N=>{if(typeof y=="object"&&Array.isArray(N.attribute))for(let H=0;H<y.length;H++){let U=y[H],Q;if(U.name===N.attribute[0]){for(Q=U.sort||(U.sort={});Q.next;)Q=Q.next;Q.attribute=N.attribute.slice(1),Q.descending=N.descending}else U===N.attribute[0]&&(y[H]=Q={name:U,sort:{attribute:N.attribute.slice(1),descending:N.descending}})}N.next&&x(N.next)},"applySortingOnSelect");x(L)}else b.iterate=(m[Symbol.asyncIterator]||m[Symbol.iterator]).bind(m),b=b.map(function(I){try{let x=w.call(this,I);return typeof x?.catch=="function"?x.catch(N=>{throw N.partialObject={[t]:I.key},N}):x}catch(x){throw x.partialObject={[t]:I.key},x}});return b}static transformEntryForSelect(m,y,L,C,A,w){if(m&&(m===t||m?.length===1&&m[0]===t&&Array.isArray(m))){let N=a(H=>(y?.transaction?.stale&&(y.transaction.stale=!1),H?.key??H),"transform");return m===t?N:m.asArray?H=>[N(H)]:H=>({[t]:N(H)})}let b;A&&v&&!(typeof m=="string"?[m]:m)?.every(N=>{let H;return typeof N=="object"?H=N.name:H=N,r[H]||H===t})&&(b=!0);let I,x=a(function(N){let H;if(y?.transaction?.stale&&(y.transaction.stale=!1),N!=null){if(H=N.value||N.deref?.()?.value,!H&&(N.key===void 0||N.deref)||N.metadataFlags&fn){if(N.metadataFlags&fn&&y.replicateFrom===!1&&w&&N.residencyId)return Za.SKIP;if(N=Pn(N.key??N,y,{transaction:L,lazy:m?.length<4,ensureLoaded:A},this?.isSync,U=>U),N?.then)return N.then(x.bind(this));H=N?.value}if(b&&N?.metadataFlags&(fn|na)||N?.expiresAt!=null&&N?.expiresAt<Date.now()){if(y.onlyIfCached&&y.noCacheStore)return{[t]:N.key,message:"This entry has expired"};let U=sn(N.key??N,N,y);if(U?.then)return U.then(x)}}if(H==null)return w?Za.SKIP:H;if(m&&!(m[0]==="*"&&m.length===1)){let U,Q=a((k,Ce)=>{let de;typeof k=="object"?de=k.name:de=k;let ye=wr?.[de],Y;if(ye){let V=C?.[de];if(V)if(V.hasMappings){let _e=ye.from?H[ye.from]:Ql(N.key);Y=V.get(_e),Y||(Y=[])}else Y=V.fromRecord?.(H);else Y=ye(H,y,N);let ue=a(_e=>{if(_e&&typeof _e=="object"){let me=ye.definition?.tableClass||De;I||(I={});let Te=I[de]||(I[de]=me.transformEntryForSelect(de===k?null:k.select||(Array.isArray(k)?k:null),y,L,V,A));if(Array.isArray(_e)){let Pe=[],Ve=me.transformToOrderedSelect(_e,k.select,typeof k.sort=="object"&&k.sort,y,L,Te)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),We=a(os=>{for(;!os.done;){if(os?.then)return os.then(We);Pe.push(os.value),os=Ve.next()}Ce(Pe,de)},"nextValue"),Dn=We(Ve.next());Dn&&(U||(U=[]),U.push(Dn));return}else if(_e=Te.call(this,_e),_e?.then){U||(U=[]),U.push(_e.then(Pe=>Ce(Pe,de)));return}}Ce(_e,de)},"handleResolvedValue");Y?.then?(U||(U=[]),U.push(Y.then(ue))):ue(Y);return}else Y=H[de],Y&&typeof Y=="object"&&de!==k&&(Y=De.transformEntryForSelect(k.select||k,y,L,null)({value:Y}));Ce(Y,de)},"selectAttribute"),J;if(typeof m=="string")Q(m,k=>{J=k});else if(Array.isArray(m))if(m.asArray)J=[],m.forEach((k,Ce)=>{k==="*"?m[Ce]=H:Q(k,de=>J[Ce]=de)});else{J={};let k=m.forceNulls;for(let Ce of m)if(Ce==="*")for(let de in H)J[de]=H[de];else Q(Ce,(de,ye)=>{de===void 0&&k&&(de=null),J[ye]=de})}else throw new Nr.ClientError("Invalid select"+m);return U?Promise.all(U).then(()=>J):J}return H},"transform");return x}async subscribe(m){if(!l)throw new Error("Can not subscribe to a table without an audit log");g||_t({table:s,database:c,schemaDefined:u,attributes:E,audit:!0}),m||(m={});let y=!m.rawEvents,L=[],C=this,A=YC(De,this.getId()??null,function(b,I,x,N){try{let H=I.getValue?.(i,y),U=I.type;if(!H&&U==="patch"&&y){let J=i.getEntry(b);J?.version===I.version?H=J.value:H=I.getValue?.(i,!0,x),U="put"}let Q={id:b,localTime:x,value:H,version:I.version,type:U,beginTxn:N};L?L.push(Q):this.send(Q)}catch(H){xe.default.error?.(H)}},m.startTime||0,m),w=(async()=>{this.isCollection&&(A.includeDescendants=!0,m.onlyChildren&&(A.onlyChildren=!0)),m.supportsTransactions&&(A.supportsTransactions=!0);let b=this.getId(),I=m.previousCount;I>1e3&&(I=1e3);let x=m.startTime;if(this.isCollection){if(x){if(I)throw new Nr.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:N,value:H}of l.getRange({start:x,exclusiveStart:!0,snapshot:!1})){let U=Pt(H);if(U.tableId!==n)continue;let Q=U.recordId;if(b==null||$z(b,Q)){let J=U.getValue(i,y,N);if(A.send({id:Q,localTime:N,value:J,version:U.version,type:U.type}),A.queue?.length>Gz&&await A.waitForDrain()===!1)return}A.startTime=N}}else if(I){let N=[];for(let{key:H,value:U}of l.getRange({start:"z",end:!1,reverse:!0}))try{let Q=Pt(U);if(Q.tableId!==n)continue;let J=Q.recordId;if(b==null||$z(b,J)){let k=Q.getValue(i,y,H);if(N.push({id:J,localTime:H,value:k,version:Q.version,type:Q.type}),--I<=0)break}}catch(Q){xe.default.error("Error getting history entry",H,Q)}for(let H=N.length;H>0;)A.send(N[--H]);N[0]&&(A.startTime=N[0].localTime)}else if(!m.omitCurrent){for(let{key:N,value:H,version:U,localTime:Q}of i.getRange({start:b??!1,end:b==null?void 0:[b,Bl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(H&&(A.send({id:N,localTime:Q,value:H,version:U,type:"put"}),A.queue?.length>Gz&&await A.waitForDrain()===!1))return}}else{I&&!x&&(x=0);let N=this.#r?.localTime;if(N===mR&&(i.cache?.delete(b),this.#r=i.getEntry(b),xe.default.trace?.("re-retrieved record",N,this.#r?.localTime),N=this.#r?.localTime),xe.default.trace?.("Subscription from",x,"from",b,N),x<N){let H=[],U=N;do{let Q=l.get(U);if(Q){m.omitCurrent=!0;let J=Pt(Q),k=J.getValue(i,y,U);y&&(J.type="put"),H.push({id:b,value:k,localTime:U,...J}),U=J.previousLocalTime}else break;I&&I--}while(U>x&&I!==0);for(let Q=H.length;Q>0;)A.send(H[--Q]);A.startTime=N}!m.omitCurrent&&this.doesExist()&&A.send({id:b,localTime:N,value:this.#e,version:this.#n,type:"put"})}for(let N of L)A.send(N);L=null})();return m.listener&&A.on("data",m.listener),A}static subscribeOnThisThread(m,y){return m===0||y?.crossThreads===!1}doesExist(){return!!(this.#e||this.#s)}publish(m,y){this._writePublish(m,y)}_writePublish(m,y){let L=Cr(this.getContext()),C=this.getId()||null;C!=null&&Ir(C);let A=this.getContext();L.addWrite({key:C,store:i,entry:this.#r,nodeName:A?.nodeName,validate:a(()=>{A?.source||(L.checkOverloaded(),this.validate(m))},"validate"),before:pe.publish?.bind(this,A,C,m),beforeIntermediate:Ae.publish?.bind(this,A,C,m),commit:a((w,b,I)=>{b===void 0&&R&&!g&&zo(),xe.default.trace?.(`Publishing message to id: ${C}, timestamp: ${new Date(w).toISOString()}`),T(C,b?.value??null,b,b?.version||w,0,!0,{user:A?.user,residencyId:y?.residencyId,expiresAt:A?.expiresAt,nodeId:y?.nodeId},"message",!1,m)},"commit")})}validate(m,y){let L,C=a((A,w,b)=>{if(w.type&&A!=null)if(y&&A.__op__&&(A=A.value),w.properties){typeof A!="object"&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be an object${w.type?" ("+w.type+")":""}`);let I=w.properties;for(let x=0,N=I.length;x<N;x++){let H=I[x],U=C(A[H.name],H,b+"."+H.name);U&&(A[H.name]=U)}if(w.sealed&&A!=null&&typeof A=="object")for(let x in A)I.find(N=>N.name===x)||(L||(L=[])).push(`Property ${x} is not allowed within object in property ${b}`)}else switch(w.type){case"Int":(typeof A!="number"||A>>0!==A)&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof A!="number"||!(Math.floor(A)===A&&Math.abs(A)<=9007199254740992))&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof A!="number"&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a number`);break;case"ID":typeof A=="string"||A?.length>0&&A.every?.(I=>typeof I=="string")||(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a string, or an array of strings`);break;case"String":typeof A!="string"&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a string`);break;case"Boolean":typeof A!="boolean"&&(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a boolean`);break;case"Date":if(!(A instanceof Date)){if(typeof A=="string"||typeof A=="number")return new Date(A);(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a Date`)}break;case"BigInt":if(typeof A!="bigint"){if(typeof A=="string"||typeof A=="number")return BigInt(A);(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a bigint`)}break;case"Bytes":if(!(A instanceof Uint8Array)){if(typeof A=="string")return Buffer.from(A);(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a Buffer or Uint8Array`)}break;case"Blob":if(!(A instanceof gi)){if(typeof A=="string"&&(A=Buffer.from(A)),A instanceof Buffer)return createBlob(A,{type:"text/plain"});(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be a Blob`)}break;case"array":if(Array.isArray(A)){if(w.elements)for(let I=0,x=A.length;I<x;I++){let N=A[I],H=C(N,w.elements,b+"[*]");H&&(A[I]=H)}}else(L||(L=[])).push(`Value ${Ms(A)} in property ${b} must be an Array`);break}w.nullable===!1&&A==null&&(L||(L=[])).push(`Property ${b} is required (and not does not allow null values)`)},"validateValue");for(let A=0,w=E.length;A<w;A++){let b=E[A];if(!(b.relationship||b.computed)&&(!y||b.name in m)){let I=C(m[b.name],b,b.name);I&&(m[b.name]=I)}}if(d)for(let A in m)E.find(w=>w.name===A)||(L||(L=[])).push(`Property ${A} is not allowed`);if(L)throw new Nr.ClientError(L.join(". "))}getUpdatedTime(){return this.#n}wasLoadedFromSource(){return v?!!this.#i:void 0}static async addAttributes(m){let y=E.slice(0);for(let L of m){if(!L.name)throw new Nr.ClientError("Attribute name is required");if(L.name.match(/[`/]/))throw new Nr.ClientError("Attribute names cannot include backticks or forward slashes");(0,Yz.validateAttribute)(L.name),y.push(L)}return _t({table:s,database:c,schemaDefined:u,attributes:y}),De.indexingOperation}static async removeAttributes(m){let y=E.filter(L=>!m.includes(L.name));return _t({table:s,database:c,schemaDefined:u,attributes:y}),De.indexingOperation}static getSize(){let m=i.getStats();return(m.treeBranchPageCount+m.treeLeafPageCount+m.overflowPages)*m.pageSize}static getAuditSize(){let m=l?.getStats();return m&&(m.treeBranchPageCount+m.treeLeafPageCount+m.overflowPages)*m.pageSize}static getStorageStats(){let m=i.env.path,y=DT.default.statfsSync?.(m)??{};return{available:y.bavail*y.bsize,free:y.bfree*y.bsize,size:y.blocks*y.bsize}}static async getRecordCount(m){let y=i.getStats().entryCount,L=1e3/2,C=performance.now(),A=Math.floor(y/2),w=m?.exactCount,b=0,I=0,x;for(let{value:N}of i.getRange({start:!0,lazy:!0,snapshot:!1}))if(N!=null&&b++,I++,await Xa(),!w&&I<A&&performance.now()-C>L){x=I;break}if(x){let N=b;b=0;for(let{value:Y}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:x,snapshot:!1}))Y!=null&&b++,await Xa();let H=x*2,U=(b+N)/H,Q=Math.pow((b-N+1)/x/2,2)+U*(1-U)/H,J=Math.max(Math.sqrt(Q)*y,1),k=Math.round(U*y),Ce=Math.max(k-1.96*J,b+N),de=Math.min(k+1.96*J,y),ye=Math.pow(10,Math.round(Math.log10(J)));return ye>k&&(ye=ye/10),b=Math.round(k/ye)*ye,{recordCount:b,estimatedRange:[Math.round(Ce),Math.round(de)]}}return{recordCount:b}}static updatedAttributes(){wr=this.propertyResolvers={$id:a((m,y,L)=>({value:L.key}),"$id"),$updatedtime:a((m,y,L)=>L.version,"$updatedtime"),$record:a((m,y,L)=>L?{value:m}:m,"$record")};for(let m of this.attributes){m.isPrimaryKey&&(F=m),m.resolve=null;let y=m.relationship,L=m.computed;if(y)if(m.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),L&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),Fd=!0,y.to)m.elements?.definition?(wr[m.name]=m.resolve=(C,A,w)=>{let b=C[y.from?y.from:t],I=m.elements.definition.tableClass;return w?jl({attribute:y.to,value:b},Cr(A).getReadTxn(),!1,I,!1).asArray:I.search([{attribute:y.to,value:b}],A).asArray},m.set=()=>{throw new Error("Setting a one-to-many relationship property is not supported")},m.resolve.definition=m.elements.definition,y.from&&(m.resolve.from=y.from)):console.error(`The one-to-many/many-to-many relationship property "${m.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(y.from){let C=m.definition||m.elements?.definition;C?(wr[m.name]=m.resolve=(A,w,b)=>{let I=A[y.from];if(I!==void 0){if(m.elements){let x,N=I?.map(H=>{let U=b?C.tableClass.primaryStore.getEntry(H,{transaction:Cr(w).getReadTxn()}):C.tableClass.get(H,w);return U?.then&&(x=!0),U});return y.filterMissing?x?Promise.all(N).then(H=>H.filter(Vz)):N.filter(Vz):x?Promise.all(N):N}return b?C.tableClass.primaryStore.getEntry(I,{transaction:Cr(w).getReadTxn()}):C.tableClass.get(I,w)}},m.set=(A,w)=>{if(Array.isArray(w)){let b=w.map(I=>I.getId?.()||I[C.tableClass.primaryKey]);A[y.from]=b}else{let b=w.getId?.()||w[C.tableClass.primaryKey];A[y.from]=b}},m.resolve.definition=m.definition||m.elements?.definition,m.resolve.from=y.from):console.error(`The relationship property "${m.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${m.name}" in table "${s}" must use either "from" or "to" arguments`);else L&&(typeof L.from=="function"&&this.setComputedAttribute(m.name,L.from),wr[m.name]=m.resolve=(C,A,w)=>{let b=typeof L.from=="string"?C[L.from]:C,I=this.userResolvers[m.name];if(I)return I(b,A,w);xe.default.warn(`Computed attribute "${m.name}" does not have a function assigned to it. Please use setComputedAttribute('${m.name}', resolver) to assign a resolver function.`),this.userResolvers[m.name]=()=>{}})}cE(this,this)}static setComputedAttribute(m,y){let L=pi(E,m);if(!L){console.error(`The attribute "${m}" does not exist in the table "${s}"`);return}if(!L.computed){console.error(`The attribute "${m}" is not defined as computed in the table "${s}"`);return}this.userResolvers[m]=y}static async deleteHistory(m=0,y=!1){let L;for(let{key:C,value:A}of l.getRange({start:0,end:m}))await Xa(),Pt(A).tableId===n&&(L=CT(l,C,A));if(y)for(let C of i.getRange({start:0,versions:!0})){let{key:A,value:w,localTime:b}=C;await Xa(),w===null&&b<m&&(L=Nc(i,C))}await L}static async*getHistory(m=0,y=1/0){for(let{key:L,value:C}of l.getRange({start:m||1,end:y})){await Xa();let A=Pt(C);A.tableId===n&&(yield{id:A.recordId,localTime:L,version:A.version,type:A.type,value:A.getValue(i,!0,L),user:A.user,operation:A.originatingOperation})}}static async getHistoryOfRecord(m){let y=[];if(m==null)throw new Error("An id is required");let L=i.getEntry(m);if(!L)return y;let C=L.localTime;if(!C)throw new Error("The entry does not have a local audit time");let A=0;do{await Xa();let w=l.get(C);if(w){let b=Pt(w);y.push({id:b.recordId,localTime:C,version:b.version,type:b.type,value:b.getValue(i,!0,C),user:b.user}),C=b.previousLocalTime}else break}while(A<1e3&&C);return y.reverse()}static cleanup(){z?.remove()}}De.updatedAttributes();let Vd=De.prototype;return p&&De.setTTLExpiration(p/1e3),se&&Wd(),De;function Wi(K,m,y){let L;for(let C in r){let A=r[C],w=A.isIndexing,b=wr[C],I=y&&(b?b(y):y[C]),x=m&&(b?b(m):m[C]);if(I===x&&!w)continue;L=!0;let N=A.indexNulls,H=(0,lp.getIndexedValues)(I,N),U=(0,lp.getIndexedValues)(x,N);if(U?.length>0){let Q=new Set(U);if(H=H?H.filter(J=>{if(Q.has(J))Q.delete(J);else return!0}):[],U=Array.from(Q),(U.length>0||H.length>0)&&Hz){let J=U.concat(H).map(k=>({key:k,value:K}));A.prefetch(J,qz)}for(let J=0,k=U.length;J<k;J++)A.remove(U[J],K)}else H?.length>0&&Hz&&A.prefetch(H.map(Q=>({key:Q,value:K})),qz);if(H)for(let Q=0,J=H.length;Q<J;Q++)A.put(H[Q],K)}return L}a(Wi,"updateIndices");function Ir(K){switch(typeof K){case"number":return!0;case"string":if(K.length<659)return!0;if(K.length>Fz)throw new Error("Primary key size is too large: "+K.length);break;case"object":if(K===null)throw new Error("Invalid primary key of null");break;case"bigint":if(K<2n**64n&&K>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof K)}if((0,Bl.writeKey)(K,_Se,0)>Fz)throw new Error("Primary key size is too large: "+K.length);return!0}a(Ir,"checkValidId");function Pn(K,m,y,L,C){if(De.getResidencyById&&y.ensureLoaded&&m?.replicateFrom!==!1){let w=oc(De.getResidencyById(K));if(w&&!w.includes(server.hostname)&&O)return O({key:K,residency:w}).then(C)}let A=a(()=>{if(m?.transaction?.stale&&(m.transaction.stale=!1),y.transaction?.isDone)return C(null,K);let w=i.getEntry(K,y);return w?.residencyId&&w.metadataFlags&fn&&O&&y.ensureLoaded&&m?.replicateFrom!==!1?O(w).then(b=>C(b,K),b=>(xe.default.error?.("Error loading remote record",K,w,y,b),C(null,K))):(w&&m&&(w?.version>(m.lastModified||0)&&(m.lastModified=w.version),w?.localTime&&!m.lastRefreshed&&(m.lastRefreshed=w.localTime)),C(w,K))},"whenPrefetched");return L?A():ie>0?(ie--,A()):new Promise((w,b)=>{ie===0?(ie--,i.prefetch([K],()=>{I(),x()})):(ne.push(K),le.push(x),ne.length>$d&&(ie--,I()));function I(){if(ne.length>0){let N=le;i.prefetch(ne,()=>{ie===-1?I():ie++;for(let H of N)H()}),ne=[],le=[],Re>2&&Re--}else ie=Re,Re<Sp&&Re++}a(I,"prefetch");function x(){try{w(A())}catch(N){b(N)}}a(x,"load")})}a(Pn,"loadLocalRecord");function sc(K){if(!K?.role)return;let m=K.role.permission;if(m.super_user)return hSe;let y=m[c],L,C=y?.tables;if(C)return C[s];if(c==="data"&&(L=m[s])&&!L.tables)return L}a(sc,"getTablePermissions");function sn(K,m,y,L){if(v){let C=!1;if(y.noCache?C=!0:(m?(!m.value||m.metadataFlags&(fn|na)||m.expiresAt!=null&&m.expiresAt<Date.now())&&(C=!0):C=!0,Wn(!C,"cache-hit",s)),C){let A=Yd(K,m,y).then(w=>(w?.value&&w?.value.getRecord?.()&&xe.default.error?.("Can not assign a record that is already a resource"),y&&(w?.version>(y.lastModified||0)&&(y.lastModified=w.version),y.lastRefreshed=Date.now()),w));if(y?.onlyIfCached||m?.value&&L?.allowStaleWhileRevalidate?.(m,K)){if(A.catch(w=>xe.default.warn?.(w)),y?.onlyIfCached&&!L.doesExist())throw new Nr.ServerError("Entry is not cached",504);return}else return A}}else if(m?.value&&m.expiresAt!=null&&m.expiresAt<Date.now())return De.evict(m.key,m.value,m.version),m.value=null,{then(C){return C(m)}}}a(sn,"ensureLoadedFromSource");function Cr(K){let m=K?.transaction;if(m){if(!m.lmdbDb)return m.lmdbDb=i,m;do{if(m.lmdbDb?.path===i.path)return m;let y=m.next;if(!y)return m=m.next=new hc,m.lmdbDb=i,m;m=y}while(!0)}else return new Wp}a(Cr,"txnForContext");function ic(K,m,y){if(!K)return;let L=K.value||i.getEntry(K.key)?.value;if(typeof m=="object"){let A=wr,w=L;for(let b=0,I=m.length;b<I;b++){let x=m[b],N=A?.[x];w=N&&w?N(w,y,!0)?.value:w?.[x],A=N?.definition?.tableClass?.propertyResolvers}return w}let C=wr[m];return C?C(L,y):L[m]}a(ic,"getAttributeValue");function Kd(K,m,y,L,C){let A=C?.length,w={transaction:L,lazy:A>0||typeof m=="string"||m?.length<4,alwaysPrefetch:!0},b;function I(x,N){let H=x?.value;if(!H)return Za.SKIP;for(let U=0;U<A;U++)if(!b?.includes(U)&&!C[U](H,x))return Za.SKIP;return N!==void 0&&(x.key=N),x}if(a(I,"processEntry"),A>0||!K.hasEntries){let x=K.map(N=>{if(b=null,typeof N=="object"&&N?.key!==void 0)return A>0?I(N):N;if(N==null)return Za.SKIP;for(let H=0;H<A;H++){let Q=C[H].idFilter;if(Q){if(!Q(N))return Za.SKIP;b||(b=[]),b.push(H)}}return Pn(N,y,w,!1,I)});return Array.isArray(K)&&(x=x.filter(N=>N!==Za.SKIP)),x.hasEntries=!0,x}return K}a(Kd,"transformToEntries");function Yo(K,m,y=server.replication?.getThisNodeId(l)){if(K<=m?.version){if(m?.version===K&&y!==void 0){let L=server.replication?.exportIdMapping(l),C=m.localTime,A=C&&l.get(C);if(A){let w,b,I=Pt(A);for(let x in L)L[x]===y&&(w=x),L[x]===I.nodeId&&(b=x);if(w>b)return 1;if(w===b)return 0}}return-1}return 1}a(Yo,"precedesExistingVersion");async function Yd(K,m,y){let L=m?.metadataFlags,C=m?.version,A,w;if(!i.attemptLock(K,C,()=>{clearTimeout(w);let N=i.getEntry(K);!N||!N.value||N.metadataFlags&(fn|na)?A(Yd(K,i.getEntry(K),y)):A(N)}))return new Promise(N=>{A=N,w=setTimeout(()=>{i.unlock(K,C)},dSe)});let b=m?.value,I={requestContext:y,replacingRecord:b,replacingEntry:m,replacingVersion:C,noCacheStore:!1,source:null,resourceCache:y?.resourceCache},x=y?.responseHeaders;return new Promise((N,H)=>{let U;zC(Ct(I,async Q=>{let J=performance.now(),k,Ce,de;try{for(let ue of De.sources)if(ue.get&&(!ue.get.reliesOnPrototype||ue.prototype.get)){if(ue.available?.(m)===!1)continue;if(I.source=ue,k=await ue.get(K,I),k)break}de=L&fn;let Y=I.lastModified||de&&C;Ce=de||Y>C||!b,Y||(Y=(0,lp.getNextMonotonicTime)());let V=performance.now()-J;if(Lt(V,"cache-resolution",s,null,"success"),x&&AE(x,"Server-Timing",`cache-resolve;dur=${V.toFixed(2)}`,!0),Q.timestamp=Y,p&&I.expiresAt==null&&(I.expiresAt=Date.now()+p),k){if(typeof k!="object")throw new Error("Only objects can be cached and stored in tables");if(k.status>0&&k.headers)if(k.status>=300)if(k.status===304)k=b,Y=C;else throw new Nr.ServerError(k.body||"Error from source",k.status);else k=k.body;typeof k.toJSON=="function"&&(k=k.toJSON()),t&&k[t]!==K&&(k[t]=K)}U=!0,N({key:K,version:Y,value:k})}catch(Y){Y.message+=` while resolving record ${K} for ${s}`,b&&((Y.code==="ECONNRESET"||Y.code==="ECONNREFUSED"||Y.code==="EAI_AGAIN")&&!y?.mustRevalidate||y?.staleIfError&&(Y.statusCode===500||Y.statusCode===502||Y.statusCode===503||Y.statusCode===504))?(N({key:K,version:C,value:b}),xe.default.trace?.(Y.message,"(returned stale record)")):H(Y);let V=performance.now()-J;Lt(V,"cache-resolution",s,null,"fail"),x&&AE(x,"Server-Timing",`cache-resolve;dur=${V.toFixed(2)}`,!0),I.transaction.abort();return}if(y?.noCacheStore||I.noCacheStore){I.transaction.abort();return}Cr(I).addWrite({key:K,store:i,entry:m,nodeName:"source",commit:a((Y,V)=>{if(V?.version!==C)return;let ue=Wi(K,b,k);if(k){Ae.put?.(I,K,k),V&&(y.previousResidency=De.getResidencyRecord(V.residencyId));let _e,me=!1,Te,Pe=oc(De.getResidency(k,y));if(Pe){if(!Pe.includes(server.hostname))if(_e=k,me=!0,De.getResidencyById)k=void 0;else{k=null;for(let Ve in r)k||(k={}),k[Ve]=_e[Ve]}Te=ac(Pe)}xe.default.trace?.(`Writing resolved record from source with id: ${K}, timestamp: ${new Date(Y).toISOString()}`),T(K,k,V,Y,me?fn:0,g&&(Ce||me)||null,{user:I?.user,expiresAt:I.expiresAt,residencyId:Te},"put",!!de,_e)}else V&&(Ae.delete?.(I,K),xe.default.trace?.(`Deleting resolved record from source with id: ${K}, timestamp: ${new Date(Y).toISOString()}`),g||R?T(K,null,V,Y,0,g&&Ce||null,{user:I?.user},"delete",!!de):Nc(i,V,C))},"commit")})}),()=>{i.unlock(K,C)},Q=>{i.unlock(K,C),U&&xe.default.error?.("Error committing cache update",Q)})})}a(Yd,"getFromSource");function Wo(K){if(!K||K.user?.role?.permission?.super_user)return!0;if(K.replicateTo)throw new Nr.ClientError("Can not specify replication parameters without super user permissions",403);if(K.replicatedConfirmation)throw new Nr.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}a(Wo,"checkContextPermissions");function zo(K){let m=!1;if(K&&(K-dt>1&&(m=!0),dt=K),!(Bt===Cn&&!m)&&(Cn=Bt,(0,Ul.getWorkerIndex)()===(0,Ul.getWorkerCount)()-1))return nn&&clearTimeout(nn),Bt?new Promise(y=>{let L=new Date;L.setMonth(0),L.setDate(1),L.setHours(0),L.setMinutes(0),L.setSeconds(0);let C=Bt/(1+dt),A=m?Date.now():Math.ceil((Date.now()-L.getTime())/C)*C+L.getTime(),w=a(b=>{xe.default.trace?.(`Scheduled next cleanup scan at ${new Date(b)}`),nn=setTimeout(()=>q=q.then(async()=>{if(w(Math.max(b+Bt,Date.now())),i.rootStore.status!=="open"){clearTimeout(nn);return}let I=50,x=new Array(I),N=0,H=Math.pow(dt,8)*(xl.get(B.STORAGE_RECLAMATION_EVICTIONFACTOR)??1e5),U=S/Math.pow(Math.max(dt,1),4);xe.default.info?.(`Starting cleanup scan for ${s}, evict threshold ${H}, adjusted eviction ${U}ms`);function Q(J,k,Ce,de){let ye=J+U-Date.now();if(ye<0)return!0;if(dt){let Y=i.lastSize;return Ce&pn&&eu(de,V=>{V.size&&(Y+=V.size)}),xe.default.trace?.(`shouldEvict adjusted ${ye} ${Y}, ${ye*(J-k)/Y} < ${H}`),ye*(J-k)/Y<H}return!1}a(Q,"shouldEvict");try{let J=0;for(let k of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let{key:Ce,value:de,version:ye,expiresAt:Y,metadataFlags:V}=k,ue;de===null&&!g&&ye+uSe<Date.now()?ue=Nc(i,k,ye):Y!=null&&Q(Y,ye,V,de)&&(ue=De.evict(Ce,de,ye),J++),ue&&(await x[N],x[N]=ue.catch(_e=>{xe.default.error?.("Cleanup error",_e)}),++N>=I&&(N=0)),await Xa()}xe.default.info?.(`Finished cleanup scan for ${s}, evicted ${J} entries`)}catch(J){xe.default.warn?.(`Error in cleanup scan for ${s}:`,J)}y(void 0),dt=0}),Math.min(b-Date.now(),2147483647)).unref()},"startNextTimer");w(A)}):void 0}a(zo,"scheduleCleanup");function Tp(){z=l?.addDeleteRemovalCallback(n,i,(K,m)=>{i.remove(K,m)})}a(Tp,"addDeleteRemoval");function Wd(){(0,Ul.getWorkerIndex)()===0&&setInterval(async()=>{if(!nc){nc=!0;try{let K=se.name,m=r[K];if(!m)throw new Error(`expiresAt attribute ${se} must be indexed`);for(let y of m.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let L of m.getValues(y)){let C=i.getEntry(L);C?.value?C.value[K]<Date.now()&&De.evict(L,C.value,C.version):i.ifVersion(L,C?.version,()=>m.remove(y,L))}await Xa()}}catch(K){xe.default.error?.("Error in evicting old records",K)}finally{nc=!1}}},lSe).unref()}a(Wd,"runRecordExpirationEviction");function oc(K){if(K!=null){if(Array.isArray(K))return K;if(typeof K=="number"){if(K>=65536)throw new Error(`Shard id ${K} must be below 65536`);let m=server.shards?.get?.(K);if(m)return xe.default.trace?.(`Shard ${K} mapped to ${m.map(y=>y.name).join(", ")}`),m.map(y=>y.name);throw new Error(`Shard ${K} is not defined`)}throw new Error(`Shard or residency list ${K} is not a valid type, must be a shard number or residency list of node hostnames`)}}a(oc,"residencyFromFunction");function ac(K){if(K){let m=K.join(","),y=f.get([Symbol.for("residency_by_set"),m]);return y||(f.put([Symbol.for("residency_by_set"),m],y=Math.floor(Math.random()*2147418112)+65535),f.put([Symbol.for("residency_by_id"),y],K),y)}}a(ac,"getResidencyId")}function WC(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 qz(){}function pSe(e){Wz=e}function LT(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 PT(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return PT(+e);case"Float":return e==="null"?null:PT(+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;mSe.test(e)||(e+="Z");let n=new Date(e);return PT(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,MT.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function PT(e){if(isNaN(e))throw new SyntaxError;return e}function $z(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 zC(e,t,r){return e?.then?e.then(t,r):t(e)}function Vz(e){return e!=null}function Ms(e){try{return JSON.stringify(e)}catch{return e}}function ESe(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var Za,lp,Kz,Yz,xl,Nr,up,dp,xe,Bl,Ul,MT,DT,cSe,Wz,lSe,uSe,Hz,dSe,kz,fSe,fn,na,_Se,Fz,Gz,hSe,Eve,mSe,Xa,Tf=be(()=>{G();Za=require("lmdb"),lp=M(ln()),Kz=require("lodash"),Yz=M(hf());sa();zp();xl=M(ce());xO();Nr=M(he()),up=M(_o()),dp=M(Ks());Ue();Sf();xe=M(mi());ob();pc();Bl=require("ordered-binary"),Ul=M(it());so();MT=M(oe());nu();Ci();sE();O_();DT=M(require("node:fs"));_s();XS();cSe=new Uint8Array(9);cSe[8]=192;lSe=6e4,uSe=864e5;xl.initSync();Hz=xl.get(B.STORAGE_PREFETCHWRITES),dSe=1e4,kz=1,fSe=2,fn=1,na=8,_Se=Buffer.allocUnsafeSlow(8192),Fz=1978,Gz=100,hSe={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},Eve=(0,MT.convertToMS)(xl.get(B.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;a(vT,"makeTable");a(WC,"attributesAsObject");a(qz,"noop");a(pSe,"setServerUtilities");mSe=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;a(LT,"coerceType");a(PT,"rejectNaN");a($z,"isDescendantId");Xa=a(()=>new Promise(setImmediate),"rest");a(zC,"when");a(Vz,"exists");a(Ms,"stringify");a(ESe,"hasOtherProcesses")});var ct={};Be(ct,{database:()=>mu,database_envs:()=>Go,databases:()=>Ye,dropDatabase:()=>db,dropTableMeta:()=>RSe,getDatabases:()=>Ze,getDefaultCompression:()=>Wg,getTables:()=>gSe,onRemovedDB:()=>W_,onUpdatedTable:()=>il,readMetaDb:()=>fp,resetDatabases:()=>rd,table:()=>_t,tables:()=>Yn});function gSe(){return HT||Ze(),Yn||{}}function Ze(){if(HT)return Ye;HT=!0,Bd=new Map;let e=(0,Zt.getHdbBasePath)()&&(0,Ut.join)((0,Zt.getHdbBasePath)(),lc),t=(0,Zt.get)(B.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,Zt.get)(B.STORAGE_PATH)||e&&((0,ns.existsSync)(e)?e:(0,Ut.join)((0,Zt.getHdbBasePath)(),Np)),!e)return;if((0,ns.existsSync)(e))for(let n of(0,ns.readdirSync)(e,{withFileTypes:!0})){let s=(0,Ut.basename)(n.name,".mdb");n.isFile()&&(0,Ut.extname)(n.name).toLowerCase()===".mdb"&&!t[s]?.path&&fp((0,Ut.join)(e,n.name),null,s)}if((0,ns.existsSync)((0,xd.getBaseSchemaPath)())){for(let n of(0,ns.readdirSync)((0,xd.getBaseSchemaPath)(),{withFileTypes:!0}))if(!n.isFile()){let s=(0,Ut.join)((0,xd.getBaseSchemaPath)(),n.name),i=(0,Ut.join)((0,xd.getTransactionAuditStoreBasePath)(),n.name);for(let o of(0,ns.readdirSync)(s,{withFileTypes:!0}))if(o.isFile()&&(0,Ut.extname)(o.name).toLowerCase()===".mdb"){let c=(0,Ut.join)(i,o.name);fp((0,Ut.join)(s,o.name),(0,Ut.basename)(o.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,Ut.extname)(c.name).toLowerCase()===".mdb"&&fp((0,Ut.join)(i,c.name),(0,Ut.basename)(c.name,".mdb"),n);let o=s.tables;if(o)for(let c in o){let l=o[c],u=(0,Ut.join)(l.path,(0,Ut.basename)(c+".mdb"));(0,ns.existsSync)(u)&&fp(u,c,n,null,!0)}}for(let n in Ye){let s=Bd.get(n);if(s){let i=Ye[n];n.includes("delete")&&xt.trace(`defined tables ${Array.from(s.keys())}`);for(let o in i)s.has(o)||(xt.trace(`delete table class ${o}`),delete i[o])}else if(delete Ye[n],n==="data"){for(let i in Yn)delete Yn[i];delete Yn[kT]}}let r=["hdb_temp","hdb_certificate","hdb_analytics","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_license","hdb_info"];if(Ye.system)for(let n of r)Ye.system[n]&&(Ye.system[n].replicate=!1);return Bd=null,Ye}function rd(){HT=!1;for(let[,e]of Go)e.needsDeletion=!0;Ze();for(let[e,t]of Go)t.needsDeletion&&!e.endsWith("system.mdb")&&(t.close(),Go.delete(e),delete Ye[t.databaseName],hp.forEach(r=>r(t.databaseName)));return Ye}function fp(e,t,r=JC,n,s){let i=new jC.default(e,!1);try{let o=Go.get(e);o?o.needsDeletion=!1:(o=(0,Hd.open)(i),Go.set(e,o));let c=new Hl.default(!1),l=o.dbisDb||(o.dbisDb=o.openDB(UT.INTERNAL_DBIS_NAME,c)),u=o.auditStore;u||(n?(0,ns.existsSync)(n)&&(i.path=n,u=(0,Hd.open)(i),u.isLegacy=!0):u=IT(o));let f=Jz(r),d=f[kT],h=new Map;for(let{key:_,value:p}of l.getRange({start:!1})){let[S,g]=_.toString().split("/");g===""?g=p.name:g||(g=S,S=t,p.name||(p.name=g,p.indexed=!p.is_hash_attribute)),d?.add(S);let R=h.get(S);R||h.set(S,R={attributes:[]}),(g==null||p.is_hash_attribute)&&(R.primary=p),g!=null&&R.attributes.push(p),Object.defineProperty(p,"key",{value:_,configurable:!0})}for(let[_,p]of h){let{attributes:S,primary:g}=p;if(!g){for(let ie of S)if(ie.is_hash_attribute||ie.isPrimaryKey){g=ie;break}if(!g){xt.warn(`Unable to find a primary key attribute on table ${_}, with attributes: ${JSON.stringify(S)}`);continue}}let R=f[_],E={},T=[],O,v,F=typeof g.audit=="boolean"?g.audit:(0,Zt.get)(B.LOGGING_AUDITLOG),q=g.trackDeletes,j=g.expiration,te=g.eviction,se=g.sealed,z=g.splitSegments,ne=g.replicate;if(R)E=R.indices,T=R.attributes,R.schemaVersion++;else{O=g.tableId,O?O>=(l.get(Ud)||0)&&(l.putSync(Ud,O+1),xt.info(`Updating next table id (it was out of sync) to ${O+1} for ${_}`)):(g.tableId=O=l.get(Ud),O||(O=1),xt.debug("Table {table_name} missing an id, assigning {table_id}"),l.putSync(Ud,O+1),l.putSync(g.key,g));let ie=new Hl.default(!g.is_hash_attribute,g.is_hash_attribute);if(ie.compression=g.compression,ie.compression){let Re=(0,Zt.get)(B.STORAGE_COMPRESSION_THRESHOLD)||Qz;ie.compression.threshold=Re}v=Rm(o.openDB(g.key,ie),o),o.databaseName=r,v.tableId=O}let le;for(let ie of S){ie.attribute=ie.name;try{if(!ie.is_hash_attribute&&(ie.indexed||ie.attribute&&!ie.name)){if(!E[ie.name]){let pe=new Hl.default(!ie.is_hash_attribute,ie.is_hash_attribute);E[ie.name]=o.openDB(ie.key,pe),E[ie.name].indexNulls=ie.indexNulls}let Re=T.find(pe=>pe.name===ie.name);Re?T.splice(T.indexOf(Re),1,ie):T.push(ie),le=!0}}catch(Re){xt.error("Error trying to update attribute",ie,T,E,Re)}}for(let ie of T)if(!S.find(pe=>pe.name===ie.name)){if(ie.is_hash_attribute){xt.error("Unable to remove existing primary key attribute",ie);continue}ie.indexed&&(T.splice(T.indexOf(ie),1),le=!0)}if(R)le&&(R.schemaVersion++,R.updatedAttributes());else{R=Xz(f,_,vT({primaryStore:v,auditStore:u,audit:F,sealed:se,splitSegments:z,replicate:ne,expirationMS:j&&j*1e3,evictionMS:te&&te*1e3,trackDeletes:q,tableName:_,tableId:O,primaryKey:g.name,databasePath:s?r+"/"+_:r,databaseName:r,indices:E,attributes:S,schemaDefined:g.schemaDefined,dbisDB:l})),R.schemaVersion=1;for(let ie of _p)ie(R)}}return o}catch(o){throw o.message+=` opening database ${e}`,o}}function Jz(e){let t=Ye[e];if(t||(e==="data"?t=Ye[e]=Yn:e==="system"?Object.defineProperty(Ye,"system",{value:t=Object.create(null),configurable:!0}):t=Ye[e]=Object.create(null)),Bd&&!Bd.has(e)){let r=new Set;t[kT]=r,Bd.set(e,r)}return t}function Xz(e,t,r){return e[t]=r,r}function mu({database:e,table:t}){e||(e=JC),Ze();let r=Jz(e),n=(0,Ut.join)((0,Zt.getHdbBasePath)(),lc),s=(0,Zt.get)(B.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,Zt.get)(B.STORAGE_PATH)||((0,ns.existsSync)(n)?n:(0,Ut.join)((0,Zt.getHdbBasePath)(),Np));let o=(0,Ut.join)(n,(i?t:e)+".mdb"),c=Go.get(o);if(!c||c.status==="closed"){let l=new jC.default(o,!1);c=(0,Hd.open)(l),Go.set(o,c)}return c.auditStore||(c.auditStore=IT(c)),c}async function db(e){if(!Ye[e])throw new Error("Schema does not exist");let t=Ye[e],r;for(let n in t)r=t[n].primaryStore.rootStore,Go.delete(r.path),r.status==="open"&&(await r.close(),await pp.remove(r.path));if(r||(r=mu({database:e,table:null}),r.status==="open"&&(await r.close(),await pp.remove(r.path))),e==="data"){for(let n in Yn)delete Yn[n];delete Yn[kT]}delete Ye[e],hp.forEach(n=>n(e)),await QA(r)}function _t(e){let{table:t,database:r,expiration:n,eviction:s,scanInterval:i,attributes:o,audit:c,sealed:l,splitSegments:u,replicate:f,trackDeletes:d,schemaDefined:h,origin:_}=e;r||(r=JC);let p=mu({database:r,table:t}),S=Ye[r];xt.trace(`Defining ${t} in ${r}`);let g=S?.[t];if(p.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let R,E,T;h==null&&(h=!0);let O=new Hl.default(!1);for(let z of o)z.attribute&&!z.name?(z.name=z.attribute,z.indexed=!0):z.attribute=z.name,z.expiresAt&&(z.indexed=!0);let v,F;if(g){if(R=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,...o)}else{let z=p.auditStore;E=o.find(Re=>Re.isPrimaryKey)||{},R=E.name,E.is_hash_attribute=E.isPrimaryKey=!0,E.schemaDefined=h,E.compression=Wg(),d&&(E.trackDeletes=!0),c=E.audit=typeof c=="boolean"?c:(0,Zt.get)(B.LOGGING_AUDITLOG),n&&(E.expiration=n),s&&(E.eviction=s),u??=!1,E.splitSegments=u,typeof l=="boolean"&&(E.sealed=l),typeof f=="boolean"&&(E.replicate=f),_&&(E.origins?E.origins.includes(_)||E.origins.push(_):E.origins=[_]),xt.trace(`${t} table loading, opening primary store`);let ne=new Hl.default(!1,!0);ne.compression=E.compression;let le=t+"/";if(T=p.dbisDb=p.openDB(UT.INTERNAL_DBIS_NAME,O),se(),T.get(le))return F&&F(),rd(),_t(e);let ie=Rm(p.openDB(le,ne),p);p.databaseName=r,ie.tableId=T.get(Ud),xt.trace(`Assigning new table id ${ie.tableId} for ${t}`),ie.tableId||(ie.tableId=1),T.put(Ud,ie.tableId+1),E.tableId=ie.tableId,g=Xz(S,t,vT({primaryStore:ie,auditStore:z,audit:c,sealed:l,splitSegments:u,replicate:f,trackDeletes:d,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:R,tableName:t,tableId:ie.tableId,databasePath:r,databaseName:r,indices:{},attributes:o,schemaDefined:h,dbisDB:T})),g.schemaVersion=1,v=!0,T.put(le,E)}let q=g.indices;T=T||(p.dbisDb=p.openDB(UT.INTERNAL_DBIS_NAME,O)),g.dbisDB=T;let j=[];for(let{key:z,value:ne}of T.getRange({start:!0})){let[le,ie]=z.toString().split("/");if(ie===""&&(ie=ne.name),ie){if(le!==t)continue}else continue;let Re=o.find(Ae=>Ae.name===ie),pe=!Re?.indexed&&ne.indexed&&!ne.isPrimaryKey;if((!Re||pe)&&(se(),v=!0,Re||T.remove(z),pe)){let Ae=g.indices[le];Ae&&j.push(Ae)}}let te=[];try{for(let z of o||[]){if((z.relationship||z.computed)&&(v=!0,z.relationship))continue;let ne=t+"/"+(z.name||"");Object.defineProperty(z,"key",{value:ne,configurable:!0});let le=T.get(ne);if(z.isPrimaryKey){if(le=le||T.get(ne=t+"/")||{},c!==void 0&&c!==g.audit||l!==void 0&&l!==g.sealed||f!==void 0&&f!==g.replicate||(+n||void 0)!==(+le.expiration||void 0)||(+s||void 0)!==(+le.eviction||void 0)||z.type!==le.type){let Re={...le};typeof c=="boolean"&&(c&&g.enableAuditing(c),Re.audit=c),n&&(Re.expiration=+n),s&&(Re.eviction=+s),l!==void 0&&(Re.sealed=l),f!==void 0&&(Re.replicate=f),z.type&&(Re.type=z.type),v=!0,se(),T.put(ne,Re)}continue}le?.attribute&&!le.name&&(le.indexed=!0);let ie=!le||le.type!==z.type||le.indexed!==z.indexed||le.nullable!==z.nullable||le.version!==z.version||JSON.stringify(le.properties)!==JSON.stringify(z.properties)||JSON.stringify(le.elements)!==JSON.stringify(z.elements);if(z.indexed){let Re=new Hl.default(!0,!1),pe=p.openDB(ne,Re);(ie||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<mp.workerData?.restartNumber)&&(v=!0,se(),le=T.get(ne),(ie||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<mp.workerData?.restartNumber)&&(v=!0,z.indexNulls===void 0&&(z.indexNulls=!0),g.primaryStore.getStats().entryCount>0&&(z.lastIndexedKey=le?.lastIndexedKey??void 0,z.indexingPID=process.pid,pe.isIndexing=!0,Object.defineProperty(z,"dbi",{value:pe}),te.push(z))),T.put(ne,z)),le?.indexNulls&&z.indexNulls===void 0&&(z.indexNulls=!0),pe.indexNulls=z.indexNulls,q[z.name]=pe}else ie&&(v=!0,se(),T.put(ne,z))}}finally{F&&F()}if(v&&(g.schemaVersion++,g.updatedAttributes()),xt.trace(`${t} table loading, running index`),te.length>0||j.length>0?g.indexingOperation=ASe(g,te,j):v&&xT.signalSchemaChange(new BT.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=_,v)for(let z of _p)z(g,_!=="cluster");return(n||s||i)&&g.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),xt.trace(`${t} table loaded`),g;function se(){F||p.transactionSync(()=>({then(z){F=z}}))}a(se,"startTxn")}async function ASe(e,t,r){try{xt.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await xT.signalSchemaChange(new BT.SchemaEventMsg(process.pid,"schema-change",e.databaseName,e.tableName));let s;for(let u of r)s=u.drop();let i,o={},c=0,l=t.length;if(await new Promise(u=>setImmediate(u)),l>0){let u;for(let d of t)(0,Hd.compareKeys)(d.lastIndexedKey,u)<0&&(u=d.lastIndexedKey),d.lastIndexedKey==null&&d.dbi.clearAsync();let f=0;for(let{key:d,value:h,version:_}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(h){if(f++,s=e.primaryStore.ifVersion(d,_,()=>{for(let p=0;p<l;p++){let S=t[p],g=S.name;try{let R=S.resolve,E=h&&(R?R(h):h[g]),T=(0,zz.getIndexedValues)(E);if(T)for(let O=0,v=T.length;O<v;O++)S.dbi.put(T[O],d)}catch(R){o[g]||(o[g]=!0,xt.error(`Error indexing attribute ${g}`,R))}}}),s.then(()=>f--,p=>{f--,xt.error(p)}),mp.workerData&&mp.workerData.restartNumber!==jz.restartNumber&&(i=!0),++c%100===0||i){for(let p of t)p.lastIndexedKey=d,e.dbisDB.put(p.key,p);if(i)return}f>SSe?await s:f>TSe&&await new Promise(p=>setImmediate(p))}for(let d of t)delete d.lastIndexedKey,delete d.indexingPID,d.dbi.isIndexing=!1,s=e.dbisDB.put(d.key,d)}await s,await xT.signalSchemaChange(new BT.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),xt.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){xt.error("Error in indexing",n)}}function RSe({table:e,database:t}){let r=mu({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 il(e){return _p.push(e),{remove(){let t=_p.indexOf(e);t>-1&&_p.splice(t,1)}}}function W_(e){return hp.push(e),{remove(){let t=hp.indexOf(e);t>-1&&hp.splice(t,1)}}}function Wg(){let e=(0,Zt.get)(B.STORAGE_COMPRESSION),t=(0,Zt.get)(B.STORAGE_COMPRESSION_DICTIONARY),r=(0,Zt.get)(B.STORAGE_COMPRESSION_THRESHOLD)||Qz,n={startingOffset:32};return t&&(n.dictionary=pp.readFileSync(t)),r&&(n.threshold=r),e&&n}var Zt,UT,Hd,Ut,ns,xd,Hl,jC,pp,QC,zz,xT,BT,mp,xt,jz,JC,kT,Qz,Yn,Ye,Ud,_p,hp,HT,Go,Bd,SSe,TSe,Ue=be(()=>{Zt=M(ce()),UT=M(Ft()),Hd=require("lmdb"),Ut=require("path"),ns=require("fs"),xd=M(gt());Tf();Hl=M(Bf()),jC=M(Hf());G();pp=M(require("fs-extra")),QC=M(ui()),zz=M(ln()),xT=M(_o()),BT=M(Ks()),mp=require("worker_threads"),xt=M(X()),jz=M(it());so();nu();_s();JC="data",kT=Symbol("defined-tables"),Qz=((0,Zt.get)(B.STORAGE_PAGESIZE)||4096)-60;(0,Zt.initSync)();Yn=Object.create(null),Ye=Object.create(null);(0,QC._assignPackageExport)("databases",Ye);(0,QC._assignPackageExport)("tables",Yn);Ud=Symbol.for("next-table-id"),_p=[],hp=[],Go=new Map;a(gSe,"getTables");a(Ze,"getDatabases");a(rd,"resetDatabases");a(fp,"readMetaDb");a(Jz,"ensureDB");a(Xz,"setTable");a(mu,"database");a(db,"dropDatabase");a(_t,"table");SSe=1e3,TSe=10;a(ASe,"runIndexing");a(RSe,"dropTableMeta");a(il,"onUpdatedTable");a(W_,"onRemovedDB");a(Wg,"getDefaultCompression")});var oe=P((Ive,fj)=>{"use strict";var ec=require("path"),nj=require("fs-extra"),In=X(),Zz=require("fs-extra"),FT=require("os"),ySe=require("net"),bSe=require("recursive-iterator"),Ar=(G(),D($)),{PACKAGE_ROOT:OSe}=Et(),NSe=mA(),ej=require("papaparse"),GT=require("moment"),{inspect:wSe}=require("util"),tj=require("is-number"),wve=require("lodash"),ISe=require("minimist"),CSe=require("https"),PSe=require("http"),{hdb_errors:qT}=he(),DSe=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,sj=require("util").promisify(setTimeout),LSe=100,MSe=5,vSe="",USe=4,rj={true:!0,TRUE:!0,FALSE:!1,false:!1,undefined:null,null:null,NULL:null,NaN:NaN};fj.exports={isEmpty:ss,isEmptyOrZeroLength:Yi,arrayHasEmptyValues:HSe,arrayHasEmptyOrZeroLengthValues:kSe,buildFolderPath:FSe,isBoolean:ij,errorizeMessage:xSe,stripFileExtension:qSe,autoCast:$Se,autoCastJSON:oj,autoCastJSONDeep:ZC,removeDir:VSe,compareVersions:KSe,isCompatibleDataVersion:YSe,escapeRawValue:WSe,unescapeValue:zSe,stringifyProps:jSe,timeoutPromise:JSe,isClusterOperation:ZSe,getClusterUser:tTe,checkGlobalSchemaTable:eTe,getHomeDir:cj,getPropsFilePath:QSe,promisifyPapaParse:rTe,removeBOM:lj,createEventPromise:nTe,checkProcessRunning:sTe,checkSchemaTableExist:iTe,checkSchemaExists:uj,checkTableExists:dj,getStartOfTomorrowInSeconds:oTe,getLimitKey:aTe,isObject:GSe,isNotEmptyAndHasValue:BSe,autoCasterIsNumberCheck:aj,backtickASTSchemaItems:cTe,isPortTaken:XSe,createForkArgs:lTe,autoCastBoolean:uTe,async_set_timeout:sj,getTableHashAttribute:dTe,doesSchemaExist:fTe,doesTableExist:_Te,stringifyObj:hTe,ms_to_time:pTe,changeExtension:mTe,getEnvCliRootPath:eP,noBootFile:ETe,httpRequest:gTe,transformReq:STe,convertToMS:TTe,PACKAGE_ROOT:OSe};function xSe(e){return e instanceof Error?e:new Error(e)}a(xSe,"errorizeMessage");function ss(e){return e==null}a(ss,"isEmpty");function BSe(e){return!ss(e)&&(e||e===0||e===""||ij(e))}a(BSe,"isNotEmptyAndHasValue");function Yi(e){return ss(e)||e.length===0||e.size===0}a(Yi,"isEmptyOrZeroLength");function HSe(e){if(ss(e))return!0;for(let t=0;t<e.length;t++)if(ss(e[t]))return!0;return!1}a(HSe,"arrayHasEmptyValues");function kSe(e){if(Yi(e))return!0;for(let t=0;t<e.length;t++)if(Yi(e[t]))return!0;return!1}a(kSe,"arrayHasEmptyOrZeroLengthValues");function FSe(...e){try{return e.join(ec.sep)}catch{console.error(e)}}a(FSe,"buildFolderPath");function ij(e){return ss(e)?!1:e===!0||e===!1}a(ij,"isBoolean");function GSe(e){return ss(e)?!1:typeof e=="object"}a(GSe,"isObject");function qSe(e){return Yi(e)?vSe:e.slice(0,-USe)}a(qSe,"stripFileExtension");function $Se(e){return ss(e)||e===""||typeof e!="string"?e:rj[e]!==void 0?rj[e]:aj(e)===!0?Number(e):DSe.test(e)?new Date(e):e}a($Se,"autoCast");function oj(e){if(typeof e=="string"&&(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]")))try{return JSON.parse(e)}catch{}return e}a(oj,"autoCastJSON");function ZC(e){if(e&&typeof e=="object"){if(Array.isArray(e))for(let t=0,r=e.length;t<r;t++){let n=e[t],s=ZC(n);s!==n&&(e[t]=s)}else for(let t in e){let r=e[t],n=ZC(r);n!==r&&(e[t]=n)}return e}else return oj(e)}a(ZC,"autoCastJSONDeep");function aj(e){if(e.startsWith("0.")&&tj(e))return!0;let t=e.toUpperCase().includes("E");return!!((e!=="0"&&e.startsWith("0"))===!1&&t===!1&&tj(e))}a(aj,"autoCasterIsNumberCheck");async function VSe(e){if(Yi(e))throw new Error(`Directory path: ${e} does not exist`);try{await Zz.emptyDir(e),await Zz.remove(e)}catch(t){throw In.error(`Error removing files in ${e} -- ${t}`),t}}a(VSe,"removeDir");function KSe(e,t){if(Yi(e)){In.info("Invalid current version sent as parameter.");return}if(Yi(t)){In.info("Invalid upgrade version sent as parameter.");return}let r,n=/(\.0+)+$/,s=e.version?e.version:e,i=t.version?t.version:t,o=s.replace(n,"").split("."),c=i.replace(n,"").split("."),l=Math.min(o.length,c.length);for(let u=0;u<l;u++)if(r=parseInt(o[u],10)-parseInt(c[u],10),r)return r;return o.length-c.length}a(KSe,"compareVersions");function YSe(e,t,r=!1){let n=e.toString().split("."),s=t.toString().split(".");return n[0]===s[0]&&(!r||n[1]===s[1])}a(YSe,"isCompatibleDataVersion");function WSe(e){if(ss(e))return e;let t=String(e);return t==="."?Ar.UNICODE_PERIOD:t===".."?Ar.UNICODE_PERIOD+Ar.UNICODE_PERIOD:t.replace(Ar.FORWARD_SLASH_REGEX,Ar.UNICODE_FORWARD_SLASH)}a(WSe,"escapeRawValue");function zSe(e){if(ss(e))return e;let t=String(e);return t===Ar.UNICODE_PERIOD?".":t===Ar.UNICODE_PERIOD+Ar.UNICODE_PERIOD?"..":String(e).replace(Ar.ESCAPED_FORWARD_SLASH_REGEX,"/")}a(zSe,"unescapeValue");function jSe(e,t){if(ss(e))return In.info("Properties object is null"),"";let r="";return e.each(function(n,s){try{if(t&&t[n]){let i=t[n];for(let o of i)r+=";"+o+FT.EOL}!Yi(n)&&n[0]===";"?r+=" "+n+s+FT.EOL:Yi(n)||(r+=n+"="+s+FT.EOL)}catch{In.error(`Found bad property during upgrade with key ${n} and value: ${s}`)}}),r}a(jSe,"stringifyProps");function cj(){let e;try{e=FT.homedir()}catch{e=process.env.HOME}return e}a(cj,"getHomeDir");function QSe(){let e=ec.join(cj(),Ar.HDB_HOME_DIR_NAME,Ar.BOOT_PROPS_FILE_NAME);return nj.existsSync(e)||(e=ec.join(__dirname,"../","hdb_boot_properties.file")),e}a(QSe,"getPropsFilePath");function JSe(e,t){let r,n;return n=new Promise(function(s){r=setTimeout(function(){s(t)},e)}),{promise:n,cancel:a(function(){clearTimeout(r)},"cancel")}}a(JSe,"timeoutPromise");async function XSe(e){if(!e)throw new Error("Invalid port passed as parameter");return new Promise((t,r)=>{let n=ySe.createServer().once("error",s=>{s.code==="EADDRINUSE"?t(!0):r(s)}).once("listening",()=>n.once("close",()=>t(!1)).close()).listen(e)})}a(XSe,"isPortTaken");function ZSe(e){try{return Ar.CLUSTER_OPERATIONS[e.toLowerCase()]!==void 0}catch(t){In.error(`Error checking operation against cluster ops ${t}`)}return!1}a(ZSe,"isClusterOperation");function eTe(e,t){let r=(Ue(),D(ct)).getDatabases();if(!r[e])return qT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e);if(!r[e][t])return qT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(eTe,"checkGlobalSchemaTable");function tTe(e,t){if(ss(t)){In.warn("No CLUSTERING_USER defined, clustering disabled");return}if(ss(e)||Yi(e)){In.warn("No users to search.");return}let r;try{let n=e.get(t);n&&n.role.permission.cluster_user===!0&&n.active===!0&&(r=n)}catch(n){In.error(`unable to find cluster_user due to: ${n.message}`);return}if(r===void 0){In.warn(`CLUSTERING_USER: ${t} not found or is not active.`);return}return r}a(tTe,"getClusterUser");function rTe(){ej.parsePromise=function(e,t,r){return new Promise(function(n,s){ej.parse(e,{header:!0,transformHeader:lj,chunk:t.bind(null,s),skipEmptyLines:!0,transform:r,dynamicTyping:!1,error:s,complete:n})})}}a(rTe,"promisifyPapaParse");function lj(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return e.charCodeAt(0)===65279?e.slice(1):e}a(lj,"removeBOM");function nTe(e,t,r){return new Promise(n=>{t.once(e,s=>{let i=r;In.info(`Got cluster status event response: ${wSe(s)}`);try{i.cancel()}catch{In.error("Error trying to cancel timeout.")}n(s)})})}a(nTe,"createEventPromise");async function sTe(e){let t=!0,r=0;do await sj(LSe*r++),(await NSe.findPs(e)).length>0&&(t=!1);while(t&&r<MSe);if(t)throw new Error(`process ${e} was not started`)}a(sTe,"checkProcessRunning");function iTe(e,t){let r=uj(e);if(r)return r;let n=dj(e,t);if(n)return n}a(iTe,"checkSchemaTableExist");function uj(e){let{getDatabases:t}=(Ue(),D(ct));if(!t()[e])return qT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(uj,"checkSchemaExists");function dj(e,t){let{getDatabases:r}=(Ue(),D(ct));if(!r()[e][t])return qT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(dj,"checkTableExists");function oTe(){let e=GT().utc().add(1,"d").startOf("d").unix(),t=GT().utc().unix();return e-t}a(oTe,"getStartOfTomorrowInSeconds");function aTe(){return GT().utc().format("DD-MM-YYYY")}a(aTe,"getLimitKey");function cTe(e){try{let t=new bSe(e);for(let{node:r}of t)r&&(r.columnid&&typeof r.columnid!="string"&&(r.columnid=r.columnid.toString()),r.columnid&&!r.columnid.startsWith("`")&&(r.columnid_orig=r.columnid,r.columnid=`\`${r.columnid}\``),r.tableid&&!r.tableid.startsWith("`")&&(r.tableid_orig=r.tableid,r.tableid=`\`${r.tableid}\``),r.databaseid&&!r.databaseid.startsWith("`")&&(r.databaseid_orig=r.databaseid,r.databaseid=`\`${r.databaseid}\``),r.as&&typeof r.as=="string"&&!r.as.startsWith("[")&&(r.as_orig=r.as,r.as=`\`${r.as}\``))}catch(t){In.error("Got an error back ticking items."),In.error(t)}}a(cTe,"backtickASTSchemaItems");function lTe(e){return[e]}a(lTe,"createForkArgs");function uTe(e){return e===!0||typeof e=="string"&&e.toLowerCase()==="true"}a(uTe,"autoCastBoolean");function dTe(e,t){let{getDatabases:r}=(Ue(),D(ct)),n=r()[e]?.[t];return n?.primaryKey||n?.hash_attribute}a(dTe,"getTableHashAttribute");function fTe(e){let{getDatabases:t}=(Ue(),D(ct));return t()[e]!==void 0}a(fTe,"doesSchemaExist");function _Te(e,t){let{getDatabases:r}=(Ue(),D(ct));return r()[e]?.[t]!==void 0}a(_Te,"doesTableExist");function hTe(e){try{return JSON.stringify(e)}catch{return e}}a(hTe,"stringifyObj");function pTe(e){let t=GT.duration(e),r=t.seconds()>0?t.seconds()+"s":"",n=t.minutes()>0?t.minutes()+"m ":"",s=t.hours()>0?t.hours()+"h ":"",i=t.days()>0?t.days()+"d ":"";return(t.years()>0?t.years()+"y ":"")+i+s+n+r}a(pTe,"ms_to_time");function mTe(e,t){let r=ec.basename(e,ec.extname(e));return ec.join(ec.dirname(e),r+t)}a(mTe,"changeExtension");function eP(){if(process.env[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return process.env[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()];let e=ISe(process.argv);if(e[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return e[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()]}a(eP,"getEnvCliRootPath");var XC;function ETe(){if(XC)return XC;let e=eP();if(eP()&&nj.pathExistsSync(ec.join(e,Ar.HDB_CONFIG_FILE)))return XC=!0,!0}a(ETe,"noBootFile");function gTe(e,t){let r;return e.protocol==="http:"?r=PSe:r=CSe,new Promise((n,s)=>{let i=r.request(e,o=>{o.setEncoding("utf8"),o.body="",o.on("data",c=>{o.body+=c}),o.on("end",()=>{n(o)})});i.on("error",o=>{s(o)}),i.write(t instanceof Buffer?t:JSON.stringify(t)),i.end()})}a(gTe,"httpRequest");function STe(e){if(!e.schema&&!e.database){e.schema=Ar.DEFAULT_DATABASE_NAME;return}e.database&&(e.schema=e.database)}a(STe,"transformReq");function TTe(e){let t=0;if(typeof e=="number"&&(t=e),typeof e=="string")switch(t=parseFloat(e),e.slice(-1)){case"M":t*=86400*30;break;case"D":case"d":t*=86400;break;case"H":case"h":t*=3600;break;case"m":t*=60;break}return t*1e3}a(TTe,"convertToMS")});var gj=P((Pve,Ej)=>{"use strict";var is=ce(),ATe=Xu(),qe=(G(),D($)),Ep=Dt(),qo=require("path"),{PACKAGE_ROOT:VT}=Et(),_j=ce(),$T=oe(),kd="/dev/null",RTe=qo.join(VT,"launchServiceScripts"),hj=qo.join(VT,"utility/scripts"),yTe=qo.join(hj,qe.HDB_RESTART_SCRIPT),pj=qo.resolve(VT,"dependencies",`${process.platform}-${process.arch}`,Ep.NATS_BINARY_NAME);function mj(){let t=ATe.licenseSearch().ram_allocation||qe.RAM_ALLOCATION_ENUM.DEFAULT,r=qe.MEM_SETTING_KEY+t,n={[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return $T.noBootFile()&&(n[qe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=$T.getEnvCliRootPath()),{name:qe.PROCESS_DESCRIPTORS.HDB,script:qe.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:VT}}a(mj,"generateMainServerConfig");var bTe=9930;function OTe(){is.initSync(!0);let e=is.get(qe.CONFIG_PARAMS.ROOTPATH),t=qo.join(e,"clustering",Ep.NATS_CONFIG_FILES.HUB_SERVER),r=qo.join(is.get(qe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),qe.LOG_NAMES.HDB),n=_j.get(qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Ep.LOG_LEVEL_FLAGS[is.get(qe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==bTe?"-"+n:""),script:pj,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return is.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=kd,i.error_file=kd),i}a(OTe,"generateNatsHubServerConfig");var NTe=9940;function wTe(){is.initSync(!0);let e=is.get(qe.CONFIG_PARAMS.ROOTPATH),t=qo.join(e,"clustering",Ep.NATS_CONFIG_FILES.LEAF_SERVER),r=qo.join(is.get(qe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),qe.LOG_NAMES.HDB),n=_j.get(qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Ep.LOG_LEVEL_FLAGS[is.get(qe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==NTe?"-"+n:""),script:pj,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return is.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=kd,i.error_file=kd),i}a(wTe,"generateNatsLeafServerConfig");function ITe(){is.initSync();let e=qo.join(is.get(qe.CONFIG_PARAMS.LOGGING_ROOT),qe.LOG_NAMES.HDB),t={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:qe.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:RTe,autorestart:!1};return is.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=kd,t.error_file=kd),t}a(ITe,"generateClusteringUpgradeV4ServiceConfig");function CTe(){let e={[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.RESTART_HDB};return $T.noBootFile()&&(e[qe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=$T.getEnvCliRootPath()),{...{name:qe.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:hj},script:yTe}}a(CTe,"generateRestart");function PTe(){return{apps:[mj()]}}a(PTe,"generateAllServiceConfigs");Ej.exports={generateAllServiceConfigs:PTe,generateMainServerConfig:mj,generateRestart:CTe,generateNatsHubServerConfig:OTe,generateNatsLeafServerConfig:wTe,generateClusteringUpgradeV4ServiceConfig:ITe}});var id=P((Mve,Lj)=>{"use strict";var rt=(G(),D($)),DTe=oe(),Vo=Vg(),KT=Er(),$o=Dt(),tc=gj(),YT=ce(),kl=X(),LTe=Ro(),{startWorker:Sj,onMessageFromWorkers:MTe}=it(),vTe=Yu(),Lve=require("util"),UTe=require("child_process"),xTe=require("fs"),{execFile:BTe}=UTe,Qe;Lj.exports={enterPM2Mode:HTe,start:rc,stop:tP,reload:Aj,restart:Rj,list:rP,describe:Oj,connect:Ko,kill:$Te,startAllServices:VTe,startService:nP,getUniqueServicesList:Nj,restartAllServices:KTe,isServiceRegistered:wj,reloadStopStart:Ij,restartHdb:bj,deleteProcess:GTe,startClusteringProcesses:Pj,startClusteringThreads:Dj,isHdbRestartRunning:qTe,isClusteringRunning:WTe,stopClustering:YTe,reloadClustering:zTe,expectedRestartOfChildren:yj};var gp=!1;MTe(e=>{e.type==="restart"&&YT.initSync(!0)});function HTe(){gp=!0}a(HTe,"enterPM2Mode");function Ko(){return Qe||(Qe=require("pm2")),new Promise((e,t)=>{Qe.connect((r,n)=>{r&&t(r),e(n)})})}a(Ko,"connect");var rn,kTe=10,Tj;function rc(e,t=!1){if(gp)return FTe(e);let r=BTe(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=rn.indexOf(r);o>-1&&rn.splice(o,1),!Tj&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<kTe&&(xTe.existsSync(Vo.getHubConfigPath())?rc(e):(await Vo.generateNatsConfig(!0),rc(e),await new Promise(c=>setTimeout(c,3e3)),await Vo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Vo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=YT.get(rt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&$o.LOG_LEVEL_HIERARCHY[o]>=$o.LOG_LEVEL_HIERARCHY[f||"info"]){let _=f===$o.LOG_LEVELS.ERR||f===$o.LOG_LEVELS.WRN?kl.OUTPUTS.STDERR:kl.OUTPUTS.STDOUT;kl.logCustomLevel(f||"info",_,n,i.slice(u,l.index).trim())}let[d,h]=l;u=l.index+d.length,f=$o.LOG_LEVELS[h]}if($o.LOG_LEVEL_HIERARCHY[o]>=$o.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===$o.LOG_LEVELS.ERR||f===$o.LOG_LEVELS.WRN?kl.OUTPUTS.STDERR:kl.OUTPUTS.STDOUT;kl.logCustomLevel(f||"info",d,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!rn&&(rn=[],!t)){let i=a(()=>{Tj=!0,rn&&(rn.map(o=>o.kill()),process.exit(0))},"kill_children");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}rn.push(r)}a(rc,"start");function FTe(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.start(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(FTe,"startWithPM2");function tP(e){if(!gp){for(let t of rn||[])t.name===e&&(rn.splice(rn.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.stop(e,async(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.delete(e,(i,o)=>{i&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(o)})})})}a(tP,"stop");function Aj(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.reload(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Aj,"reload");function Rj(e){if(!gp){yj();for(let t of rn||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.restart(e,(n,s)=>{Qe.disconnect(),t(s)})})}a(Rj,"restart");function yj(){for(let e of rn||[])e.config&&(e.config.restarts=0)}a(yj,"expectedRestartOfChildren");function GTe(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.delete(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(GTe,"deleteProcess");async function bj(){await rc(tc.generateRestart())}a(bj,"restartHdb");async function qTe(){let e=await rP();for(let t in e)if(e[t].name===rt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(qTe,"isHdbRestartRunning");function rP(){return new Promise(async(e,t)=>{try{await Ko()}catch(r){t(r)}Qe.list((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}a(rP,"list");function Oj(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.describe(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Oj,"describe");function $Te(){if(!gp){for(let e of rn||[])e.kill();rn=[];return}return new Promise(async(e,t)=>{try{await Ko()}catch(r){t(r)}Qe.killDaemon((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}a($Te,"kill");async function VTe(){try{await Pj(),await Dj(),await rc(tc.generateAllServiceConfigs())}catch(e){throw Qe?.disconnect(),e}}a(VTe,"startAllServices");async function nP(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case rt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=tc.generateMainServerConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=tc.generateNatsIngestServiceConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=tc.generateNatsReplyServiceConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=tc.generateNatsHubServerConfig(),await rc(r,t),await Vo.removeNatsConfig(e);return;case rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=tc.generateNatsLeafServerConfig(),await rc(r,t),await Vo.removeNatsConfig(e);return;case rt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=tc.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await rc(r)}catch(r){throw Qe?.disconnect(),r}}a(nP,"startService");async function Nj(){try{let e=await rP(),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 Qe?.disconnect(),e}}a(Nj,"getUniqueServicesList");async function KTe(e=[]){try{let t=!1,r=await Nj();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===rt.PROCESS_DESCRIPTORS.HDB?t=!0:await Rj(o))}t&&await Ij(rt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Qe?.disconnect(),t}}a(KTe,"restartAllServices");async function wj(e){if(rn?.find(r=>r.name===e))return!0;let t=await vTe.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(wj,"isServiceRegistered");async function Ij(e){let t=YT.get(rt.CONFIG_PARAMS.THREADS_COUNT)??YT.get(rt.CONFIG_PARAMS.THREADS),r=await Oj(e),n=DTe.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await tP(e),await nP(e)):e===rt.PROCESS_DESCRIPTORS.HDB?await bj():await Aj(e)}a(Ij,"reloadStopStart");var Cj;async function Pj(e=!1){for(let t in rt.CLUSTERING_PROCESSES){let r=rt.CLUSTERING_PROCESSES[t];await nP(r,e)}}a(Pj,"startClusteringProcesses");async function Dj(){Cj=Sj(rt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:rt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await KT.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await KT.updateLocalStreams();let e=await LTe.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===rt.PRE_4_0_0_VERSION){kl.info("Starting clustering upgrade 4.0.0 process"),Sj(rt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(Dj,"startClusteringThreads");async function YTe(){for(let e in rt.CLUSTERING_PROCESSES)if(e!==rt.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===rt.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await Cj.terminate();else{let t=rt.CLUSTERING_PROCESSES[e];await tP(t)}}a(YTe,"stopClustering");async function WTe(){for(let e in rt.CLUSTERING_PROCESSES){let t=rt.CLUSTERING_PROCESSES[e];if(await wj(t)===!1)return!1}return!0}a(WTe,"isClusteringRunning");async function zTe(){await Vo.generateNatsConfig(!0),await KT.reloadNATSHub(),await KT.reloadNATSLeaf(),await Vo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Vo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(zTe,"reloadClustering")});var sP=id(),Mj=(G(),D($));a(async function(){try{let t=await sP.describe(Mj.PROCESS_DESCRIPTORS.HDB);for(let r of t)await sP.reload(r.pm_id);await sP.deleteProcess(Mj.PROCESS_DESCRIPTORS.RESTART_HDB)}catch(t){throw console.error(t),t}},"restartHdb")();