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.
- package/README.md +1 -1
- package/bin/harperdb.js +3 -3
- package/bin/lite.js +3 -3
- package/launchServiceScripts/launchNatsIngestService.js +3 -3
- package/launchServiceScripts/launchNatsReplyService.js +3 -3
- package/launchServiceScripts/launchUpdateNodes4-0-0.js +3 -3
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/server/jobs/jobProcess.js +3 -3
- package/server/threads/threadServer.js +3 -3
- package/studio/build-local/asset-manifest.json +2 -2
- package/studio/build-local/index.html +1 -1
- package/studio/build-local/static/js/{main.c94aa29f.js → main.5af5f213.js} +2 -2
- package/utility/scripts/restartHdb.js +3 -3
- /package/studio/build-local/static/js/{main.c94aa29f.js.LICENSE.txt → main.5af5f213.js.LICENSE.txt} +0 -0
|
@@ -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()}});xL={type:"application/json",serializeStream:Af,serialize:wf,deserialize:o3,q:.5};$r.set("*/*",xL);$r.set("",xL);a(o3,"tryJSONParse");a(Cf,"registerContentHandlers");a3=require("fastify-plugin"),c3=a3(function(e,t,r){e.addHook("preSerialization",async(n,s)=>{if(s.raw.getHeader("content-type"))return;let{serializer:o,type:c}=gm(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(gm,"findBestSerializer");DL=sR.default.get(B.HTTP_COMPRESSIONTHRESHOLD);a(Pf,"serialize");a(aa,"serializeMessage");a(rR,"asyncSerialization");a(nR,"hasAsyncSerialization");a(l3,"streamToBuffer");u3=["ascii","utf8","utf-8","utf16le","utf-16le","ucs2","ucs-2","base64","base64url","latin1","binary","hex"];a(d3,"isBufferEncoding");a(f3,"parseContentType");a(no,"getDeserializer");a(_3,"deserializerUnknownType");a(h3,"transformIterable");a(Em,"toCsvStream")});var lR={};Be(lR,{start:()=>y3});function p3(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 HL(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 cR(e){return parseInt(e.value,10)}function FL(e){return parseFloat(e.value)}function GL(e,t,r){let n=r.get(e.name.value);return qL(n)?$L(n,t):{attribute:t,value:n}}function qL(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function $L(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],qL(n)?$L(n,t):{attribute:t,value:n}))}function m3(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:cR(e.value)};case ve.Kind.FLOAT:return{attribute:t,value:FL(e.value)};case ve.Kind.BOOLEAN:case ve.Kind.STRING:return{attribute:t,value:e.value.value};case ve.Kind.VARIABLE:return GL(e.value,t,r);case ve.Kind.OBJECT:return VL(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 VL(e,t,r){return e.fields.flatMap(n=>m3(n,t,r))}function E3(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:cR(e.value)};case ve.Kind.FLOAT:return{attribute:e.name.value,value:FL(e.value)};case ve.Kind.BOOLEAN:case ve.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case ve.Kind.VARIABLE:return GL(e.value,e.name.value,t);case ve.Kind.OBJECT:return VL(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 g3(e,t){return e.flatMap(r=>E3(r,t))}function Sm(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 Sm(s.selectionSet,t)}case ve.Kind.INLINE_FRAGMENT:return Sm(r.selectionSet,t)}})}function KL(e,t){return Sm(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:KL(r.selectionSet,t)}:r.name.value)}async function S3(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:KL(e.selectionSet,r),conditions:g3(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 YL(e){switch(e.kind){case ve.Kind.NULL:return null;case ve.Kind.INT:return cR(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]:YL(r.value),...t}),{});case ve.Kind.LIST:case ve.Kind.ENUM:default:throw new yr(`Value type, ${e.kind}, is not supported.`)}}function T3(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=YL(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 A3(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=T3(e.variableDefinitions,t),i=await Promise.all(Sm(e.selectionSet,r).map(c=>S3(c,s,r,n))),o={data:{}};for(let[c,l]of i)o.data[c]=l;return o}async function kL({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(p3(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 A3(c,t,o,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function R3(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 HL(r),kL(r,e)}case"POST":{let r=await no(e.headers.get("content-type"),!0)(e._nodeRequest);return HL(r),kL(r,e)}default:throw new Ti("Method Not Allowed",405,{Allow:"GET, POST"})}}function y3(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await R3(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,WL=be(()=>{ve=M(require("graphql"));eo();Zl();a(p3,"assertExecutableDefinitionNode");a(HL,"assertRequestParams");a(cR,"processIntValueNode");a(FL,"processFloatValueNode");a(GL,"processVariableNode");a(qL,"isObject");a($L,"transformObjectIntoQueryCondition");a(m3,"processObjectFieldNode");a(VL,"processObjectValueNode");a(E3,"processArgumentNode");a(g3,"buildConditionsQuery");a(Sm,"fillInFragments");a(KL,"buildSelectQuery");a(S3,"processFieldNode");a(YL,"processConstValueNode");a(T3,"resolveVariables");a(A3,"executeOperation");a(kL,"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(R3,"graphqlQueryingHandler");a(y3,"start")});var Ri=P((wRe,QL)=>{"use strict";var jL=oe(),zL=(G(),D($)),ru=/^[\x20-\x2E|\x30-\x5F|\x61-\x7E]*$/,Ai=require("joi"),ca={schema_format:{pattern:ru,message:"names cannot include backticks or forward slashes"},schema_length:{minimum:1,maximum:250,tooLong:"cannot exceed 250 characters"}},b3=Ai.alternatives(Ai.string().min(1).max(ca.schema_length.maximum).pattern(ru).messages({"string.pattern.base":"{:#label} "+ca.schema_format.message}),Ai.number(),Ai.array()).required(),O3=Ai.alternatives(Ai.string().min(1).max(ca.schema_length.maximum).pattern(ru).messages({"string.pattern.base":"{:#label} "+ca.schema_format.message}),Ai.number()),N3=Ai.alternatives(Ai.string().min(1).max(ca.schema_length.maximum).pattern(ru).messages({"string.pattern.base":"{:#label} "+ca.schema_format.message}),Ai.number()).required();function w3(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`:ru.test(t)?"":`'${e}' has illegal characters`:`'${e}' must be at least one character`:`'${e}' is required`}a(w3,"checkValidTable");function I3(e,t){return jL.doesSchemaExist(e)?e:t.message(`Database '${e}' does not exist`)}a(I3,"validateSchemaExists");function C3(e,t){let r=t.state.ancestors[0].schema;return jL.doesTableExist(r,e)?e:t.message(`Table '${e}' does not exist`)}a(C3,"validateTableExists");function P3(e,t){return e.toLowerCase()===zL.SYSTEM_SCHEMA_NAME?t.message(`'subscriptions[${t.state.path[1]}]' invalid database name, '${zL.SYSTEM_SCHEMA_NAME}' name is reserved`):e}a(P3,"validateSchemaName");QL.exports={common_validators:ca,schema_regex:ru,hdb_schema_table:b3,validateSchemaExists:I3,validateTableExists:C3,validateSchemaName:P3,checkValidTable:w3,hdb_database:O3,hdb_table:N3}});var dR=P((CRe,XL)=>{var{hdb_table:D3,hdb_database:JL}=Ri(),L3=st(),uR=require("joi"),M3={undefined:"undefined",null:"null"},v3=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||M3[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"),U3=uR.object({database:JL,schema:JL,table:D3,records:uR.array().items(uR.object().custom(v3)).required()});XL.exports=function(e){return L3.validateBySchema(e,U3)}});var eM=P((DRe,ZL)=>{"use strict";var fR=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")}};ZL.exports=fR});var rM=P((MRe,tM)=>{"use strict";var _R=class{static{a(this,"DBIDefinition")}constructor(t=!1,r=!1){this.dup_sort=t,this.is_hash_attribute=r,this.useVersions=r}};tM.exports=_R});var aM={};Be(aM,{HAS_EXPIRATION:()=>Rm,HAS_RESIDENCY_ID:()=>TR,HAS_STRUCTURE_UPDATE:()=>bm,LAST_TIMESTAMP_PLACEHOLDER:()=>vf,LOCAL_TIMESTAMP:()=>x3,METADATA:()=>Oc,NEW_TIMESTAMP_PLACEHOLDER:()=>sM,NO_TIMESTAMP:()=>hR,PENDING_LOCAL_TIME:()=>AR,PREVIOUS_TIMESTAMP_PLACEHOLDER:()=>SR,RecordEncoder:()=>gR,TIMESTAMP_ASSIGN_LAST:()=>H3,TIMESTAMP_ASSIGN_NEW:()=>iM,TIMESTAMP_ASSIGN_PREVIOUS:()=>oM,TIMESTAMP_PLACEHOLDER:()=>Tm,TIMESTAMP_RECORD_PREVIOUS:()=>pR,handleLocalTimeForGets:()=>Om,recordUpdater:()=>RR,removeEntry:()=>wc});function F3(){return Mf[0]=Mf[0]^64,B3.getFloat64(0)}function Om(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?.[Oc];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?.[Oc]>=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[Oc];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,bc.push(new WeakRef(this))),c.call(this)},o.prototype.done=function(){if(l.call(this),this.isDone)for(let u=0;u<bc.length;u++){let f=bc[u].deref();(!f||f.isDone||f.isCommitted)&&bc.splice(u--,1)}},o.prototype.done.isTracked=!0}return e}function RR(e,t,r){return function(n,s,i,o,c=-1,l,u,f="put",d,h){d||l==null?nu=i?.localTime?pR|oM:hR:nu=l?i?.localTime?pR|16384:iM|16384:hR;let _=u?.expiresAt;if(_>=0&&(c|=Rm),Lf=c,mR=_,i?.version===o&&l===!1)throw new Error("Must retain local time if version is not changed");let p={version:o,instructedWrite:nu>0},S,g=0;try{let R=i?.residencyId,E=u?.residencyId;E&&(ER=E,Lf|=TR,g|=Ic),R!==E&&(g|=Cc,R||(R=0)),c&Rm&&(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=hm(()=>e.put(n,s,p),n,e.rootStore),Tc&&(g|=pn)),l){let O=u?.user?.username;if(h&&(hm(()=>e.encoder.encode(h),n,e.rootStore),Tc&&(g|=pn)),e.encoder.hasStructureUpdate&&(g|=bm,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,Nc(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?sM:vf,Nc(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 wc(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 nM,Am,Tm,vf,SR,sM,x3,Oc,Mf,B3,hR,iM,H3,oM,pR,Rm,TR,AR,bm,k3,Df,nu,Lf,mR,ER,gR,bc,su=be(()=>{nM=require("msgpackr");so();Am=M(X());_s();_s();Tm=new Uint8Array([1,1,1,1,4,64,0,0]),vf=new Uint8Array([1,1,1,1,1,0,0,0]),SR=new Uint8Array([1,1,1,1,3,64,0,0]),sM=new Uint8Array([1,1,1,1,0,64,0,0]),x3=Symbol("local-timestamp"),Oc=Symbol("metadata"),Mf=new Uint8Array(8),B3=new DataView(Mf.buffer,0,8),hR=0,iM=0,H3=1,oM=3,pR=4,Rm=16,TR=32,AR=1,bm=256,nu=0,Lf=-1,mR=-1,ER=0,gR=class extends nM.Encoder{static{a(this,"RecordEncoder")}constructor(t){t.useBigIntExtension=!0,super(t);let r=this.encode;this.encode=function(s,i){if(nu||Lf>=0){let o=0,c=nu;c&&(o+=8,nu=0);let l=Lf,u=mR,f=ER;l>=0&&(o+=4,Lf=-1,u>=0&&(o+=8,mR=-1),f&&(o+=4,ER=0));let d=k3=r.call(this,s,i|2048|o);Df=d.subarray((d.start||0)+o,d.end);let h=d.start||0;return c&&(Tm[4]=c,Tm[5]=c>>8,d.set(Tm,h),h+=8),Tc&&(l|=pn),l>=0&&((d.dataView||(d.dataView=new DataView(d.buffer,d.byteOffset,d.byteLength))).setUint32(h,l|ym<<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=F3(),i=t[c]}let u,f;i<32&&(i===ym?(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&Rm&&(u=(t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).getFloat64(c),c+=8),o&TR&&(f=(t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).getUint32(c),c+=4));let d=Ac(()=>r?.valueAsBuffer?t.subarray(c,s):super.decode(t.subarray(c,s),s-c),this.rootStore);return{localTime:l,value:d,[Oc]:o,expiresAt:u,residencyId:f}}return r?.valueAsBuffer?t:Ac(()=>super.decode(t,r),this.rootStore)}catch(c){return Am.error("Error decoding record",c,"data: "+t.slice(0,40).toString("hex")),null}}};a(F3,"getTimestamp");a(Om,"handleLocalTimeForGets");bc=[];setInterval(()=>{for(let e=0;e<bc.length;e++){let t=bc[e].deref();!t||t.isDone||t.isCommitted?bc.splice(e--,1):t.notCurrent&&(t.openTimer?(t.openTimer>3&&(t.openTimer>60?(Am.error("Read transaction detected that has been open too long (over 15 minutes), ending transaction",t),t.done()):Am.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(RR,"recordUpdater");a(wc,"removeEntry")});var Bf=P((kRe,lM)=>{"use strict";var cM=ce(),G3=(G(),D($)),{RecordEncoder:q3}=(su(),D(aM));cM.initSync();var $3=cM.get(G3.CONFIG_PARAMS.STORAGE_CACHING)!==!1,yR=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=$3&&{validated:!0},this.randomAccessStructure=!0,this.freezeData=!0,this.encoder={Encoder:q3})}};lM.exports=yR});var Hf=P((GRe,uM)=>{"use strict";var kn=ce(),hs=(G(),D($));kn.initSync();var Nm=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=kn.get(hs.CONFIG_PARAMS.STORAGE_WRITEASYNC)===!0||kn.get(hs.CONFIG_PARAMS.STORAGE_WRITEASYNC)==="true"||kn.get(hs.CONFIG_PARAMS.STORAGE_WRITEASYNC)==="TRUE",kn.get(hs.CONFIG_PARAMS.STORAGE_OVERLAPPINGSYNC)!==void 0&&(this.overlappingSync=kn.get(hs.CONFIG_PARAMS.STORAGE_OVERLAPPINGSYNC)),kn.get(hs.CONFIG_PARAMS.STORAGE_MAXFREESPACETOLOAD)&&(this.maxFreeSpaceToLoad=kn.get(hs.CONFIG_PARAMS.STORAGE_MAXFREESPACETOLOAD)),kn.get(hs.CONFIG_PARAMS.STORAGE_MAXFREESPACETORETAIN)&&(this.maxFreeSpaceToRetain=kn.get(hs.CONFIG_PARAMS.STORAGE_MAXFREESPACETORETAIN)),kn.get(hs.CONFIG_PARAMS.STORAGE_PAGESIZE)&&(this.pageSize=kn.get(hs.CONFIG_PARAMS.STORAGE_PAGESIZE)),this.noReadAhead=kn.get(hs.CONFIG_PARAMS.STORAGE_NOREADAHEAD)}};uM.exports=Nm;Nm.MAX_DBS=1e4});var ht=P(($Re,TM)=>{"use strict";var OR=require("lmdb"),Gs=require("fs-extra"),Fn=require("path"),wm=ln(),_M=X(),mn=Mn().LMDB_ERRORS_ENUM,Im=rM(),NR=Bf(),hM=Hf(),la=Ft(),dM=(G(),D($)),{table:V3,resetDatabases:K3}=(Ue(),D(ct)),fM=ce(),qs=la.INTERNAL_DBIS_NAME,pM=la.DBI_DEFINITION_NAME,Y3="data.mdb",W3="lock.mdb",kf=".mdb",z3="-lock",bR=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 OR.Cursor(this.txn,this.dbi)}close(){this.cursor.close(),this.txn.abort()}commit(){this.cursor.close(),this.txn.commit()}};function Cm(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(Cm,"pathEnvNameValidation");async function wR(e,t,r=!0){try{await Gs.access(e)}catch(n){throw n.code==="ENOENT"?new Error(mn.INVALID_BASE_PATH):n}try{let n=Fn.join(e,t+kf);return await Gs.access(n,Gs.constants.R_OK|Gs.constants.F_OK),n}catch(n){if(n.code==="ENOENT")if(r)try{return await Gs.access(Fn.join(e,t,Y3),Gs.constants.R_OK|Gs.constants.F_OK),Fn.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(wR,"validateEnvironmentPath");function Pm(e,t){if(wm.validateEnv(e),t===void 0)throw new Error(mn.DBI_NAME_REQUIRED)}a(Pm,"validateEnvDBIName");async function j3(e,t,r=!1,n=!1){Cm(e,t);let s=Fn.basename(e);t=t.toString();let i=fM.get(dM.CONFIG_PARAMS.DATABASES);i||fM.setProperty(dM.CONFIG_PARAMS.DATABASES,i={}),i[s]||(i[s]={}),i[s].path=e;try{return await wR(e,t,n),mM(e,t,r)}catch(o){if(o.message===mn.INVALID_ENVIRONMENT){let c=Fn.join(e,t);await Gs.mkdirp(n?c:e);let l=new hM(n?c:c+kf,!1),u=OR.open(l);u.dbis=Object.create(null);let f=new NR(!1);u.openDB(qs,f),global.lmdb_map===void 0&&(global.lmdb_map=Object.create(null));let d=IR(e,t,r);return u[la.ENVIRONMENT_NAME_KEY]=d,global.lmdb_map[d]=u,u}throw o}}a(j3,"createEnvironment");async function Q3(e,t,r,n=!0){Cm(e,t),t=t.toString();let s=Fn.join(e,t);return V3({table:t,database:Fn.parse(e).name,path:s,attributes:[{name:"id",isPrimaryKey:!0}]})}a(Q3,"copyEnvironment");async function mM(e,t,r=!1){Cm(e,t),t=t.toString();let n=IR(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 wR(e,t),i=Fn.join(e,t+kf),o=s!=i,c=new hM(s,o),l=OR.open(c);l.dbis=Object.create(null);let u=gM(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(mM,"openEnvironment");async function J3(e,t,r=!1){Cm(e,t),t=t.toString();let n=Fn.join(e,t+kf),s=await wR(e,t);if(global.lmdb_map!==void 0){let i=IR(e,t,r);if(global.lmdb_map[i]){let o=global.lmdb_map[i];await EM(o),delete global.lmdb_map[i]}}await Gs.remove(s),await Gs.remove(s===n?s+z3:Fn.join(Fn.dirname(s),W3))}a(J3,"deleteEnvironment");async function EM(e){wm.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(EM,"closeEnvironment");function IR(e,t,r=!1){let s=`${Fn.basename(e)}.${t}`;return r===!0&&(s=`txn.${s}`),s}a(IR,"getCachedEnvironmentName");function X3(e){wm.validateEnv(e);let t=Object.create(null),r=ps(e,qs);for(let{key:n,value:s}of r.getRange({start:!1}))if(n!==qs)try{t[n]=Object.assign(new Im,s)}catch{_M.warn(`an internal error occurred: unable to parse DBI Definition for ${n}`)}return t}a(X3,"listDBIDefinitions");function gM(e){wm.validateEnv(e);let t=[],r=ps(e,qs);for(let{key:n}of r.getRange({start:!1}))n!==qs&&t.push(n);return t}a(gM,"listDBIs");function Z3(e,t){let n=ps(e,qs).getEntry(t),s=new Im;if(n!==void 0){try{s=Object.assign(s,n.value)}catch{_M.warn(`an internal error occurred: unable to parse DBI Definition for ${n}`)}return s}}a(Z3,"getDBIDefinition");function SM(e,t,r,n=!r){if(Pm(e,t),t=t.toString(),t===qs)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 NR(r,n===!0),o=e.openDB(t,i),c=new Im(r===!0,n);return o[pM]=c,ps(e,qs).putSync(t,c),e.dbis[t]=o,o}throw s}}a(SM,"createDBI");function ps(e,t){if(Pm(e,t),t=t.toString(),e.dbis[t]!==void 0)return e.dbis[t];let r;if(t!==qs?r=Z3(e,t):r=new Im,r===void 0)throw new Error(mn.DBI_DOES_NOT_EXIST);let n;try{let s=new NR(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[pM]=r,e.dbis[t]=n,n}a(ps,"openDBI");function eX(e,t){Pm(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(eX,"statDBI");async function tX(e,t){try{let r=Fn.join(e,t+kf);return(await Gs.stat(r)).size}catch{throw new Error(mn.INVALID_ENVIRONMENT)}}a(tX,"environmentDataSize");function rX(e,t){if(Pm(e,t),t=t.toString(),t===qs)throw new Error(mn.CANNOT_DROP_INTERNAL_DBIS_NAME);ps(e,t).dropSync(),e.dbis!==void 0&&delete e.dbis[t],ps(e,qs).removeSync(t)}a(rX,"dropDBI");function nX(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)SM(e,i,i!==t,i===t),n=!0;else throw o}}n&&K3()}a(nX,"initializeDBIs");TM.exports={openDBI:ps,openEnvironment:mM,createEnvironment:j3,listDBIs:gM,listDBIDefinitions:X3,createDBI:SM,dropDBI:rX,statDBI:eX,deleteEnvironment:J3,initializeDBIs:nX,TransactionCursor:bR,environmentDataSize:tX,copyEnvironment:Q3,closeEnvironment:EM}});var RM=P((KRe,AM)=>{"use strict";var CR=class{static{a(this,"InsertRecordsResponseObject")}constructor(t=[],r=[],n=void 0){this.written_hashes=t,this.skipped_hashes=r,this.txn_time=n}};AM.exports=CR});var bM=P((WRe,yM)=>{"use strict";var PR=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}};yM.exports=PR});var NM=P((jRe,OM)=>{"use strict";var DR=class{static{a(this,"UpsertRecordsResponseObject")}constructor(t=[],r=void 0,n=[]){this.written_hashes=t,this.txn_time=r,this.original_records=n}};OM.exports=DR});var Dc=P((eye,CM)=>{"use strict";var sX=ht(),iX=RM(),oX=bM(),aX=NM(),yi=ln(),Ff=Mn().LMDB_ERRORS_ENUM,cX=Ft(),io=(G(),D($)),lX=oe(),uX=require("uuid"),JRe=require("lmdb"),{handleHDBError:dX,hdb_errors:fX}=he(),{OVERFLOW_MARKER:XRe,MAX_SEARCH_KEY_LENGTH:ZRe}=cX,wM=ce();wM.initSync();var Dm=wM.get(io.CONFIG_PARAMS.STORAGE_PREFETCHWRITES),LR=io.TIME_STAMP_NAMES_ENUM.CREATED_TIME,Pc=io.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function _X(e,t,r,n,s=yi.getNextMonotonicTime()){xR(e,t,r,n),MR(e,t,r);let i=new iX,o=[],c=[];for(let l=0;l<n.length;l++){let u=n[l];IM(u,!0,s);let f=hX(e,t,r,u),d=u[t];o.push(f),c.push(d)}return vR(o,c,n,i,s)}a(_X,"insertRecords");function hX(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){Dm&&u.prefetch(l.map(f=>({key:f,value:s})),Lm);for(let f=0,d=l.length;f<d;f++)u.put(l[f],s)}}Dm&&e.dbis[t].prefetch([s],Lm),e.dbis[t].put(s,n,n[Pc])})}a(hX,"insertRecord");function pX(e,t=[]){let r=0;for(let n=0;n<t.length;n++){let s=t[n];e.splice(s-r,1),r++}}a(pX,"removeSkippedRecords");function IM(e,t,r){let n=r>0;(n||!Number.isInteger(e[Pc]))&&(e[Pc]=r||(r=yi.getNextMonotonicTime())),t===!0?(n||!Number.isInteger(e[LR]))&&(e[LR]=r||yi.getNextMonotonicTime()):delete e[LR]}a(IM,"setTimestamps");function MR(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),sX.initializeDBIs(e,t,r)}a(MR,"initializeTransaction");async function mX(e,t,r,n,s=yi.getNextMonotonicTime()){xR(e,t,r,n),MR(e,t,r);let i=new oX,o=[],c=[],l=[];for(let u=0;u<n.length;u++){let f=n[u],d=f[t],h;try{h=UR(e,t,f,d,i,!0,s)}catch{i.skipped_hashes.push(d),o.push(u);continue}c.push(h),l.push(d)}return vR(c,l,n,i,s,o)}a(mX,"updateRecords");async function EX(e,t,r,n,s=yi.getNextMonotonicTime()){try{xR(e,t,r,n)}catch(l){throw dX(l,l.message,fX.HTTP_STATUS_CODES.BAD_REQUEST)}MR(e,t,r);let i=new aX,o=[],c=[];for(let l=0;l<n.length;l++){let u=n[l],f;lX.isEmpty(u[t])?(f=uX.v4(),u[t]=f):f=u[t];let d=UR(e,t,u,f,i,!1,s);o.push(d),c.push(f)}return vR(o,c,n,i,s)}a(EX,"upsertRecords");async function vR(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(),pX(r,i),n}a(vR,"finalizeWrite");function UR(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(IM(r,!f,o),Number.isInteger(r[Pc])&&u[Pc]>r[Pc])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){Dm&&g.prefetch(E.map(T=>({key:T,value:n})),Lm);for(let T=0,O=E.length;T<O;T++)g.remove(E[T],n)}if(E=yi.getIndexedValues(S),E){Dm&&g.prefetch(E.map(T=>({key:T,value:n})),Lm);for(let T=0,O=E.length;T<O;T++)g.put(E[T],n)}}let _={...u,...r};c.put(n,_,_[Pc])},"do_put");return l?d=c.ifVersion(n,l.version,h):d=c.ifNoExists(n,h),d.then(_=>_?!0:UR(e,t,r,n,s,i,o))}a(UR,"updateUpsertRecord");function gX(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(gX,"validateBasic");function xR(e,t,r,n){if(gX(e,t,r),!Array.isArray(n))throw n===void 0?new Error(Ff.RECORDS_REQUIRED):new Error(Ff.RECORDS_MUST_BE_ARRAY)}a(xR,"validateWrite");function Lm(){}a(Lm,"noop");CM.exports={insertRecords:_X,updateRecords:mX,upsertRecords:EX}});var oo=P((rye,SX)=>{SX.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 DM=P((nye,PM)=>{"use strict";var TX=require("uuid"),BR=class{static{a(this,"CreateAttributeObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.attribute=n,this.id=s||TX.v4(),this.schema_table=`${this.schema}.${this.table}`}};PM.exports=BR});var Mm=P((iye,LM)=>{"use strict";var AX=DM(),HR=class extends AX{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}};LM.exports=HR});var vM=P((aye,MM)=>{"use strict";MM.exports=yX;var RX="inserted";function yX(e,t,r,n){let s={message:`${e} ${t.length} of ${r.records.length} records`,skipped_hashes:n};return e===RX?(s.inserted_hashes=t,s):(s.update_hashes=t,s)}a(yX,"returnObject")});var vm=P((uye,xM)=>{"use strict";var bX=(G(),D($)),kR=ht(),OX=Dc(),{getSystemSchemaPath:NX,getSchemaPath:wX}=gt(),lye=oo(),{validateBySchema:IX}=st(),Gf=require("joi"),CX=Mm(),PX=vM(),{handleHDBError:DX,hdb_errors:LX,ClientError:MX}=he(),UM=oe(),{HTTP_STATUS_CODES:vX}=LX,UX="inserted";xM.exports=xX;async function xX(e){let t=IX(e,Gf.object({database:Gf.string(),schema:Gf.string(),table:Gf.string().required(),attribute:Gf.string().required()}));if(t)throw new MX(t.message);let r=!e.skip_table_check&&UM.checkGlobalSchemaTable(e.schema,e.table);if(r)throw DX(new Error,r,vX.NOT_FOUND);e.is_hash_attribute=e.is_hash_attribute=="true",e.dup_sort=UM.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 CX(e.schema,e.table,e.attribute,e.id);try{let i=await kR.openEnvironment(wX(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}`);kR.createDBI(i,e.attribute,e.dup_sort,e.is_hash_attribute);let o=await kR.openEnvironment(NX(),bX.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),{written_hashes:c,skipped_hashes:l}=await OX.insertRecords(o,HDB_TABLE_INFO.hash_attribute,hdb_attribute_attributes,[s]);return PX(UX,c,{records:[s]},l)}catch(i){throw i}}a(xX,"lmdbCreateAttribute")});var qf=P((_ye,HM)=>{"use strict";var ao=oe(),BM=X(),fye=dR(),{getDatabases:BX}=(Ue(),D(ct)),{ClientError:Lc}=he();HM.exports=HX;function HX(e){if(ao.isEmpty(e))throw new Lc("invalid update parameters defined.");if(ao.isEmptyOrZeroLength(e.schema))throw new Lc("invalid schema specified.");if(ao.isEmptyOrZeroLength(e.table))throw new Lc("invalid table specified.");if(!Array.isArray(e.records))throw new Lc("records must be an array");let t=BX()[e.schema]?.[e.table];if(ao.isEmpty(t))throw new Lc(`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 BM.error("a valid hash attribute must be provided with update record:",o),new Lc("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 BM.error(`a valid hash value must be provided with ${e.operation} record:`,o),new Lc(`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(HX,"insertUpdateValidate")});var FM=P((pye,kM)=>{"use strict";var FR=class{static{a(this,"ITCEventObject")}constructor(t,r){this.type=t,this.message=r}};kM.exports=FR});var $M=P((Eye,qM)=>{"use strict";var GR=ht(),kX=X(),GM=Mn().LMDB_ERRORS_ENUM;qM.exports=FX;async function FX(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 GR.closeEnvironment(global.lmdb_map[o])}catch(c){if(c.message!==GM.ENV_REQUIRED)throw c}}break;case"drop_table":let n=`${e.schema}.${e.table}`,s=`txn.${n}`;try{await GR.closeEnvironment(global.lmdb_map[n]),await GR.closeEnvironment(global.lmdb_map[s])}catch(i){if(i.message!==GM.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){kX.error(t)}}a(FX,"cleanLMDBMap")});var rv=P((Tye,tv)=>{"use strict";var qR=require("recursive-iterator"),GX=require("alasql"),$R=require("clone"),VM=oe(),{handleHDBError:KM,hdb_errors:qX}=he(),{HDB_ERROR_MSGS:YM,HTTP_STATUS_CODES:WM}=qX,{getDatabases:$X}=(Ue(),D(ct)),VX=["DISTINCT_ARRAY"],zM=Symbol("validateTables"),VR=Symbol("validateTable"),Sye=Symbol("getAllColumns"),jM=Symbol("validateAllColumns"),Um=Symbol("findColumn"),QM=Symbol("validateOrderBy"),$f=Symbol("validateSegment"),KR=Symbol("validateColumn"),JM=Symbol("setColumnsForTable"),XM=Symbol("checkColumnsForAsterisk"),ZM=Symbol("validateGroupBy"),ev=Symbol("hasColumns"),YR=class{static{a(this,"SelectValidator")}constructor(t){this.statement=t,this.attributes=[]}validate(){if(!this.statement)throw new Error("invalid sql statement");this[zM](),this[XM](),this[jM]()}[zM](){if(this[ev]()){if(!this.statement.from||this.statement.from.length===0)throw"no from clause";this.statement.from.forEach(t=>{this[VR](t)}),this.statement.joins&&this.statement.joins.forEach(t=>{t.table.as=t.as,this[VR](t.table)})}}[ev](){let t=!1,r=new qR(this.statement);for(let{node:n,path:s}of r)if(n&&n.columnid){t=!0;break}return t}[VR](t){if(!t.databaseid)throw`schema not defined for table ${t.tableid}`;let r=$X();if(!r[t.databaseid])throw KM(new Error,YM.SCHEMA_NOT_FOUND(t.databaseid),WM.NOT_FOUND);if(!r[t.databaseid][t.tableid])throw KM(new Error,YM.TABLE_NOT_FOUND(t.databaseid,t.tableid),WM.NOT_FOUND);r[t.databaseid][t.tableid].attributes.forEach(s=>{let i=$R(s);i.table=$R(t),this.attributes.push(i)})}[Um](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)}[XM](){let t=new qR(this.statement.columns);for(let{node:r,path:n}of t)r&&r.columnid==="*"&&n.indexOf("expression")<0&&this[JM](r.tableid)}[JM](t){this.attributes.forEach(r=>{(!t||t&&(r.table.tableid===t||r.table.as===t))&&!r.relation&&this.statement.columns.push(new GX.yy.Column({columnid:r.attribute,tableid:r.table.as?r.table.as:r.table.tableid}))})}[jM](){this[$f](this.statement.columns,!1),this[$f](this.statement.joins,!1),this[$f](this.statement.where,!1),this[ZM](this.statement.group,!1),this[$f](this.statement.order,!0)}[$f](t,r){if(!t)return;let n=new qR(t),s=[];for(let{node:i,path:o}of n)!VM.isEmpty(i)&&!VM.isEmpty(i.columnid)&&i.columnid!=="*"&&(r?this[QM](i):s.push(this[KR](i)));return s}[ZM](t){if(!t)return;let r=[];if(this.statement.columns.forEach(n=>{if(!(n.funcid&&VX.indexOf(n.funcid.toUpperCase())>=0)){if(!n.aggregatorid&&!n.columnid){let s=$R(n);delete s.as,r.push(s)}else if(n.columnid){let s=this[Um](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[Um](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`}[QM](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[KR](t)}[KR](t){let r=this[Um](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]}};tv.exports=YR});var ov=P((Rye,iv)=>{"use strict";var nv=require("lodash"),Vf=require("mathjs"),KX=require("jsonata"),sv=oe();iv.exports={distinct_array:a(e=>Array.isArray(e)&&e.length>1?nv.uniqWith(e,nv.isEqual):e,"distinct_array"),searchJSON:YX,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 YX(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(sv.isEmpty(this.__ala__.res)&&(this.__ala__.res={}),sv.isEmpty(this.__ala__.res[r])){let n=KX(e);this.__ala__.res[r]=n}return this.__ala__.res[r].evaluate(t)}a(YX,"searchJSON")});var cv=P((bye,av)=>{"use strict";var rr=require("moment"),WR="YYYY-MM-DDTHH:mm:ss.SSSZZ";rr.suppressDeprecationWarnings=!0;av.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(WR),"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(WR),"get_server_time"),offset_utc:a((e,t)=>rr(e).utc().utcOffset(t).format(WR),"offset_utc")}});var fv=P((Nye,dv)=>{"use strict";var WX=require("@turf/area"),zX=require("@turf/length"),jX=require("@turf/circle"),QX=require("@turf/difference"),JX=require("@turf/distance"),XX=require("@turf/boolean-contains"),ZX=require("@turf/boolean-equal"),e6=require("@turf/boolean-disjoint"),t6=require("@turf/helpers"),lv=(G(),D($)),$e=oe(),co=X();dv.exports={geoArea:r6,geoLength:n6,geoCircle:s6,geoDifference:i6,geoDistance:uv,geoNear:o6,geoContains:a6,geoEqual:c6,geoCrosses:l6,geoConvert:u6};function r6(e){if($e.isEmpty(e))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e));try{return WX.default(e)}catch(t){return co.trace(t,e),NaN}}a(r6,"geoArea");function n6(e,t){if($e.isEmpty(e))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e));try{return zX.default(e,{units:t||"kilometers"})}catch(r){return co.trace(r,e),NaN}}a(n6,"geoLength");function s6(e,t,r){if($e.isEmpty(e))return NaN;if($e.isEmpty(t))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e));try{return jX.default(e,t,{units:r||"kilometers"})}catch(n){return co.trace(n,e,t),NaN}}a(s6,"geoCircle");function i6(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 QX(e,t)}catch(r){return co.trace(r,e,t),NaN}}a(i6,"geoDifference");function uv(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 JX.default(e,t,{units:r||"kilometers"})}catch(n){return co.trace(n,e,t),NaN}}a(uv,"geoDistance");function o6(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 uv(e,t,n)<=r}catch(s){return co.trace(s,e,t),!1}}a(o6,"geoNear");function a6(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 XX.default(e,t)}catch(r){return co.trace(r,e,t),!1}}a(a6,"geoContains");function c6(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(c6,"geoEqual");function l6(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!e6.default(e,t)}catch(r){return co.trace(r,e,t),!1}}a(l6,"geoCrosses");function u6(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(lv.GEO_CONVERSION_ENUM[t]))throw new Error(`geo_type of ${t} is invalid please use one of the following types: ${Object.keys(lv.GEO_CONVERSION_ENUM).join(",")}`);return typeof e=="string"&&(e=$e.autoCastJSON(e)),t6[t](e,r)}a(u6,"geoConvert")});var xm=P((Iye,_v)=>{var Mc=ov(),Gn=cv(),bi=fv();_v.exports=e=>{e.aggr.mad=e.aggr.MAD=Mc.mad,e.aggr.mean=e.aggr.MEAN=Mc.mean,e.aggr.mode=e.aggr.MODE=Mc.mode,e.aggr.prod=e.aggr.PROD=Mc.prod,e.aggr.median=e.aggr.MEDIAN=Mc.median,e.fn.distinct_array=e.fn.DISTINCT_ARRAY=Mc.distinct_array,e.fn.search_json=e.fn.SEARCH_JSON=Mc.searchJSON,e.fn.__ala__=e,e.fn.current_date=e.fn.CURRENT_DATE=Gn.current_date,e.fn.current_time=e.fn.CURRENT_TIME=Gn.current_time,e.fn.extract=e.fn.EXTRACT=Gn.extract,e.fn.date=e.fn.DATE=Gn.date,e.fn.date_format=e.fn.DATE_FORMAT=Gn.date_format,e.fn.date_add=e.fn.DATE_ADD=Gn.date_add,e.fn.date_sub=e.fn.DATE_SUB=Gn.date_sub,e.fn.date_diff=e.fn.DATE_DIFF=e.fn.datediff=e.fn.DATEDIFF=Gn.date_diff,e.fn.now=e.fn.NOW=Gn.now,e.fn.offset_utc=e.fn.OFFSET_UTC=Gn.offset_utc,e.fn.get_server_time=e.fn.GET_SERVER_TIME=Gn.get_server_time,e.fn.getdate=e.fn.GETDATE=Gn.now,e.fn.current_timestamp=e.fn.CURRENT_TIMESTAMP=Gn.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 Ev=P((Cye,mv)=>{"use strict";var Yf=require("lodash"),En=require("alasql");En.options.cache=!1;var d6=xm(),hv=require("clone"),Bm=require("recursive-iterator"),He=X(),Xe=oe(),iu=qn(),f6=(G(),D($)),{hdb_errors:_6}=he(),{getDatabases:pv}=(Ue(),D(ct)),h6="IS NULL",$s="There was a problem performing this search. Please check the logs and try again.";d6(En);var zR=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($s)}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($s)}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($s)}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($s)}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($s)}}_getColumns(){let t=new Bm(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(hv(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=pv()[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 Bm(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 Bm(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(f6.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(hv(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(h6)>-1&&this.tables.forEach(s=>{let i={columnid:pv()[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 iu.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($s)}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 iu.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($s)}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 iu.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($s)}else try{c.search_attribute=s.attribute,c.search_value="*";let f=await iu.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($s)}}}_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 Bm(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($s)}}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 iu.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(_6.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 iu.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($s)}}return Object.values(Object.values(this.data)[0].__merged_data)}};mv.exports=zR});var Vr=P((Dye,gv)=>{"use strict";var p6=rv();gv.exports={searchByConditions:E6,searchByHash:g6,searchByValue:S6,search:T6};var jR=qn(),{transformReq:QR}=oe(),m6=Ev();async function E6(e){return QR(e),jR.searchByConditions(e)}a(E6,"searchByConditions");async function g6(e){QR(e),e.ids&&(e.hash_values=e.ids);let t=[];for await(let r of jR.searchByHash(e))r&&t.push(r);return t}a(g6,"searchByHash");async function S6(e){QR(e),e.hasOwnProperty("desc")===!0&&(e.reverse=e.desc);let t=[];for await(let r of jR.searchByValue(e))t.push(r);return t}a(S6,"searchByValue");function T6(e,t){try{let r=new p6(e);r.validate(),new m6(r.statement,r.attributes).search().then(s=>{t(null,s)}).catch(s=>{t(s,null)})}catch(r){return t(r)}}a(T6,"search")});var lo=P((Mye,Rv)=>{"use strict";var Wf=require("crypto"),A6=ce(),{CONFIG_PARAMS:R6}=(G(),D($)),Tv="aes-256-cbc",y6=32,b6=16,JR=64,Av=32,O6=JR+Av,Sv=new Map;Rv.exports={encrypt:N6,decrypt:w6,createNatsTableStreamName:I6};function N6(e){let t=Wf.randomBytes(y6),r=Wf.randomBytes(b6),n=Wf.createCipheriv(Tv,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(N6,"encrypt");function w6(e){let t=e.substr(0,JR),r=e.substr(JR,Av),n=e.substr(O6,e.length),s=Buffer.from(r,"hex"),i=Buffer.from(n,"hex"),o=Wf.createDecipheriv(Tv,Buffer.from(t,"hex"),s),c=o.update(i);return c=Buffer.concat([c,o.final()]),c.toString()}a(w6,"decrypt");function I6(e,t){let r=A6.get(R6.CLUSTERING_DATABASELEVEL)?e:`${e}.${t}`,n=Sv.get(r);return n||(n=Wf.createHash("md5").update(r).digest("hex"),Sv.set(r,n)),n}a(I6,"createNatsTableStreamName")});var uo=P((xye,Nv)=>{"use strict";var Uye=Vr(),zf=X(),{validateBySchema:yv}=st(),vc=require("joi"),C6=lo(),Hm=oe(),{handleHDBError:km,hdb_errors:P6,ClientError:bv}=he(),{HDB_ERROR_MSGS:Fm,HTTP_STATUS_CODES:XR}=P6,Ov=ce();Ov.initSync();var{getDatabases:ZR}=(Ue(),D(ct)),D6=require("fs-extra"),L6=(G(),D($));Nv.exports={describeAll:M6,describeTable:Gm,describeSchema:v6};async function M6(e={}){try{let t=Hm.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 Gm({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 Gm({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),km(new Error,Fm.DESCRIBE_ALL_ERR)}}a(M6,"describeAll");async function Gm(e,t){Hm.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=yv(e,vc.object({database:vc.string(),table:vc.string().required(),exact_count:vc.boolean().strict()}));if(i)throw new bv(i.message);let c=ZR()[r];if(!c)throw km(new Error,Fm.SCHEMA_NOT_FOUND(e.schema),XR.NOT_FOUND);let l=c[n];if(!l)throw km(new Error,Fm.TABLE_NOT_FOUND(e.schema,e.table),XR.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 D6.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")),Ov.get(L6.CONFIG_PARAMS.CLUSTERING_ENABLED)&&(h.clustering_stream_name=C6.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(Gm,"descTable");async function v6(e){Hm.transformReq(e);let t=yv(e,vc.object({database:vc.string(),exact_count:vc.boolean().strict()}));if(t)throw new bv(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 km(new Error,Fm.SCHEMA_NOT_FOUND(e.schema),XR.NOT_FOUND);let o={};for(let c in i){let l;if(r&&r.tables[c]&&(l=r.tables[c]),Hm.isEmpty(l)||l.describe){let u=await Gm({schema:e.schema,table:c,exact_count:e.exact_count},l?l.attribute_permissions:null);u&&(o[u.name]=u)}}return o}a(v6,"describeSchema")});var ms=P((Fye,Dv)=>{var U6=oo(),{callbackify:Iv,promisify:x6}=require("util"),{getDatabases:Cv}=(Ue(),D(ct));Dv.exports={setSchemaDataToGlobal:wv,getTableSchema:B6,getSystemSchema:H6,setSchemaDataToGlobalAsync:x6(wv)};var Pv=uo(),Hye=Iv(Pv.describeAll),kye=Iv(Pv.describeTable);function wv(e){global.hdb_schema=Cv(),e&&e()}a(wv,"setSchemaDataToGlobal");function B6(e,t,r){let n=Cv()[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(B6,"getTableSchema");function H6(){return U6}a(H6,"getSystemSchema")});var ty=P((qye,vv)=>{var k6=st(),ey=require("joi"),{hdb_table:F6,hdb_database:Lv}=Ri(),Mv={schema:Lv,database:Lv,table:F6},G6={date:ey.date().iso().required()},q6={timestamp:ey.date().timestamp().required().messages({"date.format":"'timestamp' is invalid"})};vv.exports=function(e,t){let r=t==="timestamp"?{...Mv,...q6}:{...Mv,...G6},n=ey.object(r);return k6.validateBySchema(e,n)}});var Bv=P(($ye,xv)=>{var $6=st(),ry=require("joi"),{hdb_table:V6,hdb_database:Uv}=Ri(),K6=ry.object({schema:Uv,database:Uv,table:V6,hash_values:ry.array().required(),ids:ry.array()});xv.exports=function(e){return $6.validateBySchema(e,K6)}});var oy=P((Vye,Hv)=>{"use strict";var ny=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}},sy=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}},iy=class{static{a(this,"DeleteResponseObject")}constructor(){this.message=void 0,this.deleted_hashes=[],this.skipped_hashes=[]}};Hv.exports={InsertObject:ny,NoSQLSeachObject:sy,DeleteResponseObject:iy}});var Bc=P((Yye,$v)=>{"use strict";var Fv=ty(),Y6=Bv(),Uc=oe(),kv=require("moment"),Gv=X(),{promisify:W6,callbackify:z6}=require("util"),xc=(G(),D($)),j6=ms(),ay=W6(j6.getTableSchema),cy=qn(),{DeleteResponseObject:Q6}=oy(),{handleHDBError:ua,hdb_errors:J6}=he(),{HDB_ERROR_MSGS:qm,HTTP_STATUS_CODES:da}=J6,X6="records successfully deleted",Z6=z6(qv);$v.exports={delete:Z6,deleteRecord:qv,deleteFilesBefore:eZ,deleteAuditLogsBefore:tZ};async function eZ(e){let t=Fv(e,"date");if(t)throw ua(t,t.message,da.BAD_REQUEST,void 0,void 0,!0);if(Uc.transformReq(e),!kv(e.date,kv.ISO_8601).isValid())throw ua(new Error,qm.INVALID_DATE,da.BAD_REQUEST,xc.LOG_LEVELS.ERROR,qm.INVALID_DATE,!0);let n=Uc.checkSchemaTableExist(e.schema,e.table);if(n)throw ua(new Error,n,da.NOT_FOUND,xc.LOG_LEVELS.ERROR,n,!0);let s=await cy.deleteRecordsBefore(e);if(await ay(e.schema,e.table),Gv.info(`Finished deleting files before ${e.date}`),s&&s.message)return s.message}a(eZ,"deleteFilesBefore");async function tZ(e){let t=Fv(e,"timestamp");if(t)throw ua(t,t.message,da.BAD_REQUEST,void 0,void 0,!0);if(Uc.transformReq(e),isNaN(e.timestamp))throw ua(new Error,qm.INVALID_VALUE("Timestamp"),da.BAD_REQUEST,xc.LOG_LEVELS.ERROR,qm.INVALID_VALUE("Timestamp"),!0);let r=Uc.checkSchemaTableExist(e.schema,e.table);if(r)throw ua(new Error,r,da.NOT_FOUND,xc.LOG_LEVELS.ERROR,r,!0);let n=await cy.deleteAuditLogsBefore(e);return await ay(e.schema,e.table),Gv.info(`Finished deleting audit logs before ${e.timestamp}`),n}a(tZ,"deleteAuditLogsBefore");async function qv(e){e.ids&&(e.hash_values=e.ids);let t=Y6(e);if(t)throw ua(t,t.message,da.BAD_REQUEST,void 0,void 0,!0);Uc.transformReq(e);let r=Uc.checkSchemaTableExist(e.schema,e.table);if(r)throw ua(new Error,r,da.NOT_FOUND,xc.LOG_LEVELS.ERROR,r,!0);try{await ay(e.schema,e.table);let n=await cy.deleteRecords(e);return Uc.isEmptyOrZeroLength(n.message)&&(n.message=`${n.deleted_hashes.length} of ${e.hash_values.length} ${X6}`),n}catch(n){if(n.message===xc.SEARCH_NOT_FOUND_MESSAGE){let s=new Q6;return s.message=xc.SEARCH_NOT_FOUND_MESSAGE,s.skipped_hashes=e.hash_values.length,s.deleted_hashes=0,s}throw n}}a(qv,"deleteRecord")});var $m={};Be($m,{HASH_FUNCTION:()=>Jf,hash:()=>dy,validate:()=>fy});function ly(e=Qf){let t="0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";return Array.from(jf.randomBytes(e)).map(r=>t[r%t.length]).join("")}function dy(e,t=Jf[Kv?.toUpperCase()]??"sha256"){return uy[t](e)}function fy(e,t,r=Jf[Kv?.toUpperCase()]??"sha256"){return e?rZ[r](e,t):!1}var jf,ou,Vv,Kv,Qf,Yv,Jf,uy,rZ,Vm=be(()=>{jf=M(require("node:crypto")),ou=M(require("argon2")),Vv=M(ce());G();Kv=(0,Vv.get)(B.AUTHENTICATION_HASHFUNCTION)?.toLowerCase(),Qf=16,Yv=9,Jf=(n=>(n.MD5="md5",n.SHA256="sha256",n.ARGON2ID="argon2id",n))(Jf||{});a(ly,"generateSalt");uy={md5:a((e,t=void 0)=>{t=t??ly(Yv);let r=jf.createHash("md5").update(e+t).digest("hex");return t+r},"md5"),sha256:a((e,t=void 0)=>{t=t??ly(Qf);let r=jf.createHash("sha256").update(e+t).digest("hex");return t+r},"sha256"),argon2id:a(async e=>{let t=ly(Qf),r=await ou.hash(e,{type:ou.argon2id,salt:Buffer.from(t)});return t+r},"argon2id")},rZ={md5:a((e,t)=>{let r=e.slice(0,Yv);return e===uy.md5(t,r)},"md5"),sha256:a((e,t)=>{let r=e.slice(0,Qf);return e===uy.sha256(t,r)},"sha256"),argon2id:a(async(e,t)=>await ou.verify(e.slice(Qf),t),"argon2id")};a(dy,"hash");a(fy,"validate")});var zv=P((Qye,Wv)=>{var _y=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 nZ(e){return Kr.password.presence=!0,Kr.username.presence=!0,Kr.role.presence=!0,Kr.active.presence=!0,_y.validateObject(e,Kr)}a(nZ,"addUserValidation");function sZ(e){return Kr.password.presence=!1,Kr.username.presence=!0,Kr.role.presence=!1,Kr.active.presence=!1,_y.validateObject(e,Kr)}a(sZ,"alterUserValidation");function iZ(e){return Kr.password.presence=!1,Kr.username.presence=!0,Kr.role.presence=!1,Kr.active.presence=!1,_y.validateObject(e,Kr)}a(iZ,"dropUserValidation");Wv.exports={addUserValidation:nZ,alterUserValidation:sZ,dropUserValidation:iZ}});var Dt=P((Zye,Qv)=>{"use strict";var{platform:Xye}=require("os"),oZ="nats-server.zip",hy="nats-server",aZ=process.platform==="win32"?`${hy}.exe`:hy,cZ=/^[^\s.,*>]+$/,jv="__request__",lZ=a(e=>`${e}.${jv}`,"REQUEST_SUBJECT"),uZ={NATS_MSG_ID:"Nats-Msg-Id",ORIGIN:"origin",TRANSACTED_NODES:"transacted_nodes"},dZ={HUB_SERVER:"hub.json",LEAF_SERVER:"leaf.json"},fZ={HUB:"hub.pid",LEAF:"leaf.pid"},_Z={HUB:"-hub",LEAF:"-leaf",ADMIN:"-admin"},hZ={SUCCESS:"success",ERROR:"error"},pZ={OPEN:"open",CLOSED:"closed",NO_RESPONDERS:"NoResponders",TIMEOUT:"Timeout"},mZ={TXN:"txn",MSGID:"msgid"},au={ERR:"error",WRN:"warn",INF:"info",DBG:"debug",TRC:"trace"},EZ={[au.ERR]:1,[au.WRN]:2,[au.INF]:3,[au.DBG]:4,[au.TRC]:5},gZ={debug:"-D",trace:"-DVV"};Qv.exports={NATS_SERVER_ZIP:oZ,NATS_SERVER_NAME:hy,NATS_BINARY_NAME:aZ,PID_FILES:fZ,NATS_CONFIG_FILES:dZ,SERVER_SUFFIX:_Z,NATS_TERM_CONSTRAINTS_RX:cZ,REQUEST_SUFFIX:jv,UPDATE_REMOTE_RESPONSE_STATUSES:hZ,CLUSTER_STATUS_STATUSES:pZ,REQUEST_SUBJECT:lZ,SUBJECT_PREFIXES:mZ,MSG_HEADERS:uZ,LOG_LEVELS:au,LOG_LEVEL_FLAGS:gZ,LOG_LEVEL_HIERARCHY:EZ}});var gn=P((tbe,br)=>{"use strict";var Zv="username is required",eU="nothing to update, must supply active, role or password to update",tU="password cannot be an empty string",rU="If role is specified, it cannot be empty.",nU="active must be true or false";br.exports.addUser=wZ;br.exports.alterUser=IZ;br.exports.dropUser=PZ;br.exports.getSuperUser=UZ;br.exports.userInfo=DZ;br.exports.listUsers=Ym;br.exports.listUsersExternal=LZ;br.exports.setUsersWithRolesCache=Hc;br.exports.findAndValidateUser=yy;br.exports.getClusterUser=xZ;br.exports.getUsersWithRolesCache=vZ;br.exports.USERNAME_REQUIRED=Zv;br.exports.ALTERUSER_NOTHING_TO_UPDATE=eU;br.exports.EMPTY_PASSWORD=tU;br.exports.EMPTY_ROLE=rU;br.exports.ACTIVE_BOOLEAN=nU;var sU=Sn(),SZ=Bc(),Xf=(Vm(),D($m)),iU=zv(),Zf=Vr(),Sy=_o(),Oi=oe(),oU=require("validate.js"),Ty=X(),{promisify:TZ}=require("util"),Ay=lo(),my=(G(),D($)),Jv=Dt(),AZ=It(),RZ=ce(),yZ=oo(),{hdb_errors:bZ,ClientError:Vs}=he(),{HTTP_STATUS_CODES:fo,AUTHENTICATION_ERROR_MSGS:py,HDB_ERROR_MSGS:cu}=bZ,{UserEventMsg:Ry}=Ks(),Ey=require("lodash"),{server:Km}=(Dr(),D(Vl)),OZ=X();Km.getUser=(e,t)=>yy(e,t,t!=null);Km.authenticateUser=(e,t)=>yy(e,t);var aU={username:!0,active:!0,role:!0,password:!0},Xv=new Map,NZ=TZ(SZ.delete),gy=RZ.get(my.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??Xf.HASH_FUNCTION.SHA256,Ni;async function wZ(e){let t=oU.cleanAttributes(e,aU),r=iU.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(cu.ROLE_NAME_NOT_FOUND(t.role),fo.NOT_FOUND);if(n.length>1)throw new Vs(cu.DUP_ROLES_FOUND(t.role),fo.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=Ay.encrypt(t.password)),t.password=await Xf.hash(t.password,gy),t.hash_function=gy,t.role=n[0].id;let s=await sU.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(Ty.debug(s),await Hc(),s.skipped_hashes.length===1)throw new Vs(cu.USER_ALREADY_EXISTS(t.username),fo.CONFLICT);return Sy.signalUserChange(new Ry(process.pid)),`${t.username} successfully added`}a(wZ,"addUser");async function IZ(e){let t=oU.cleanAttributes(e,aU);if(Oi.isEmptyOrZeroLength(t.username))throw new Error(Zv);if(Oi.isEmptyOrZeroLength(t.password)&&Oi.isEmptyOrZeroLength(t.role)&&Oi.isEmptyOrZeroLength(t.active))throw new Error(eU);if(!Oi.isEmpty(t.password)&&Oi.isEmptyOrZeroLength(t.password.trim()))throw new Error(tU);if(!Oi.isEmpty(t.active)&&!Oi.isBoolean(t.active))throw new Error(nU);if(!Oi.isEmpty(t.password)&&!Oi.isEmptyOrZeroLength(t.password.trim())&&(CZ(t.username)&&(t.hash=Ay.encrypt(t.password)),t.password=await Xf.hash(t.password,gy)),t.role==="")throw new Error(rU);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(cu.ALTER_USER_ROLE_NOT_FOUND(t.role),fo.NOT_FOUND);if(n.length>1)throw new Vs(cu.DUP_ROLES_FOUND(t.role),fo.CONFLICT);t.role=n[0].id}let r=await sU.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await Hc(),Sy.signalUserChange(new Ry(process.pid)),r}a(IZ,"alterUser");function CZ(e){let t=!1,r=Ni.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}a(CZ,"isClusterUser");async function PZ(e){let t=iU.dropUserValidation(e);if(t)throw new Vs(t.message);if(Ni.get(e.username)===void 0)throw new Vs(cu.USER_NOT_EXIST(e.username),fo.NOT_FOUND);let r=await NZ({table:"hdb_user",schema:"system",hash_values:[e.username]});return Ty.debug(r),await Hc(),Sy.signalUserChange(new Ry(process.pid)),`${e.username} successfully deleted`}a(PZ,"dropUser");async function DZ(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=Ey.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(DZ,"userInfo");async function LZ(){let e=await Ym();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}a(LZ,"listUsersExternal");async function Ym(){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]=Ey.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=Ey.cloneDeep(s),s.role=t[s.role],MZ(s.role),n.set(s.username,s);return n}a(Ym,"listUsers");function MZ(e){if(!e){Ty.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(yZ)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}a(MZ,"appendSystemTablesToRole");async function Hc(e=void 0){e?Ni=e:Ni=await Ym()}a(Hc,"setUsersWithRolesCache");async function vZ(){return Ni||await Hc(),Ni}a(vZ,"getUsersWithRolesCache");async function yy(e,t,r=!0){Ni||await Hc();let n=Ni.get(e);if(!n){if(!r)return{username:e};throw new Vs(py.GENERIC_AUTH_FAIL,fo.UNAUTHORIZED)}if(n&&!n.active)throw new Vs(py.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(Xv.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)Xv.set(t,n.password);else throw new Vs(py.GENERIC_AUTH_FAIL,fo.UNAUTHORIZED)}}return s}a(yy,"findAndValidateUser");async function UZ(){Ni||await Hc();for(let[,e]of Ni)if(e.role.role==="super_user")return e}a(UZ,"getSuperUser");async function xZ(){let e=await Ym(),t=AZ.getConfigFromFile(my.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==my.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=Ay.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+Jv.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+Jv.SERVER_SUFFIX.ADMIN,r}a(xZ,"getClusterUser");var cU=[];Km.invalidateUser=function(e){for(let t of cU)try{t(e)}catch(r){OZ.error("Error invalidating user",r)}};Km.onInvalidatedUser=function(e){cU.push(e)}});var t_=P((ibe,fU)=>{"use strict";var kc=X(),$n=(G(),D($)),BZ=$M(),nbe=ms(),sbe=uo(),HZ=gn(),{validateEvent:lU}=Ks(),e_=qn(),kZ=require("process"),{resetDatabases:FZ}=(Ue(),D(ct)),GZ={[$n.ITC_EVENT_TYPES.SCHEMA]:qZ,[$n.ITC_EVENT_TYPES.USER]:dU};async function qZ(e){let t=lU(e);if(t){kc.error(t);return}kc.trace("ITC schemaHandler received schema event:",e),await BZ(e.message),await $Z(e.message)}a(qZ,"schemaHandler");async function $Z(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=FZ();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){kc.error(t)}}a($Z,"syncSchemaMetadata");var uU=[];async function dU(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){kc.warn(r)}let t=lU(e);if(t){kc.error(t);return}kc.trace(`ITC userHandler ${$n.HDB_ITC_CLIENT_PREFIX}${kZ.pid} received user event:`,e),await HZ.setUsersWithRolesCache();for(let r of uU)r()}catch(t){kc.error(t)}}a(dU,"userHandler");dU.addListener=function(e){uU.push(e)};fU.exports=GZ});var Ks=P((dbe,hU)=>{"use strict";var abe=X(),by=oe(),VZ=(G(),D($)),{ITC_ERRORS:r_}=Mn(),{parentPort:cbe,threadId:KZ,isMainThread:YZ,workerData:lbe}=require("worker_threads"),{onMessageFromWorkers:WZ,broadcast:ube,broadcastWithAcknowledgement:zZ}=it();hU.exports={sendItcEvent:jZ,validateEvent:_U,SchemaEventMsg:QZ,UserEventMsg:JZ};var Wm;WZ(async(e,t)=>{Wm=Wm||t_(),_U(e),Wm[e.type]&&await Wm[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function jZ(e){return!YZ&&e.message&&(e.message.originator=KZ),zZ(e)}a(jZ,"sendItcEvent");function _U(e){if(typeof e!="object")return r_.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||by.isEmpty(e.type))return r_.MISSING_TYPE;if(!e.hasOwnProperty("message")||by.isEmpty(e.message))return r_.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||by.isEmpty(e.message.originator))return r_.MISSING_ORIGIN;if(VZ.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return r_.INVALID_EVENT(e.type)}a(_U,"validateEvent");function QZ(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(QZ,"SchemaEventMsg");function JZ(e){this.originator=e}a(JZ,"UserEventMsg")});var _o=P((hbe,gU)=>{"use strict";var pU=(G(),D($)),_be=oe(),zm=X(),mU=FM(),lu,{sendItcEvent:EU}=Ks();function XZ(e){try{zm.info("signalSchemaChange called with message:",e),lu=lu||t_();let t=new mU(pU.ITC_EVENT_TYPES.SCHEMA,e);return lu.schema(t),EU(t)}catch(t){zm.error(t)}}a(XZ,"signalSchemaChange");function ZZ(e){try{zm.trace("signalUserChange called with message:",e),lu=lu||t_();let t=new mU(pU.ITC_EVENT_TYPES.USER,e);return lu.user(t),EU(t)}catch(t){zm.error(t)}}a(ZZ,"signalUserChange");gU.exports={signalSchemaChange:XZ,signalUserChange:ZZ}});var jm=P((mbe,TU)=>{"use strict";var SU=oe(),e8=(G(),D($)),t8=X(),r8=vm(),n8=Mm(),s8=_o(),{SchemaEventMsg:i8}=Ks(),o8="already exists in";TU.exports=a8;async function a8(e,t,r){if(SU.isEmptyOrZeroLength(r))return r;let n=[];SU.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 c8(e,t.schema,t.name,i)})),s}a(a8,"lmdbCheckForNewAttributes");async function c8(e,t,r,n){let s=new n8(t,r,n,void 0,!0);e&&(s.hdb_auth_header=e);try{await l8(s)}catch(i){if(typeof i=="object"&&i.message!==void 0&&i.message.includes(o8))t8.warn(`attribute ${t}.${r}.${n} already exists`);else throw i}}a(c8,"createNewAttribute");async function l8(e){let t;return t=await r8(e),s8.signalSchemaChange(new i8(process.pid,e8.OPERATIONS_ENUM.CREATE_ATTRIBUTE,e.schema,e.table,e.attribute)),t}a(l8,"createAttribute")});var uu=P((gbe,AU)=>{"use strict";var Oy=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}};AU.exports=Oy});var yU=P((Tbe,RU)=>{"use strict";var u8=uu(),d8=(G(),D($)).OPERATIONS_ENUM,Ny=class extends u8{static{a(this,"LMDBInsertTransactionObject")}constructor(t,r,n,s,i=void 0){super(d8.INSERT,r,n,s,i),this.records=t}};RU.exports=Ny});var OU=P((Rbe,bU)=>{"use strict";var f8=uu(),_8=(G(),D($)).OPERATIONS_ENUM,wy=class extends f8{static{a(this,"LMDBUpdateTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(_8.UPDATE,n,s,i,o),this.records=t,this.original_records=r}};bU.exports=wy});var wU=P((bbe,NU)=>{"use strict";var h8=uu(),p8=(G(),D($)).OPERATIONS_ENUM,Iy=class extends h8{static{a(this,"LMDBUpsertTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(p8.UPSERT,n,s,i,o),this.records=t,this.original_records=r}};NU.exports=Iy});var CU=P((Nbe,IU)=>{"use strict";var m8=uu(),E8=(G(),D($)).OPERATIONS_ENUM,Cy=class extends m8{static{a(this,"LMDBDeleteTransactionObject")}constructor(t,r,n,s,i=void 0){super(E8.DELETE,n,s,t,i),this.original_records=r}};IU.exports=Cy});var n_=P((Cbe,MU)=>{"use strict";var Ibe=require("path"),PU=ht(),g8=yU(),S8=OU(),T8=wU(),A8=CU(),du=Ft(),DU=oe(),{CONFIG_PARAMS:R8}=(G(),D($)),LU=ce();LU.initSync();var Qm=(G(),D($)).OPERATIONS_ENUM,{getTransactionAuditStorePath:y8}=gt();MU.exports=b8;async function b8(e,t){if(LU.get(R8.LOGGING_AUDITLOG)===!1)return;let r=y8(e.schema,e.table),n=await PU.openEnvironment(r,e.table,!0),s=O8(e,t);if(!(s===void 0||s.hash_values.length===0)&&n!==void 0){PU.initializeDBIs(n,du.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,du.TRANSACTIONS_DBIS);let i=s.timestamp;return await n.dbis[du.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].ifNoExists(i,()=>{n.dbis[du.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].put(i,s),DU.isEmpty(s.user_name)||n.dbis[du.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].put(s.user_name,i);for(let o=0;o<s.hash_values.length;o++)n.dbis[du.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].put(s.hash_values[o],i)})}}a(b8,"writeTransaction");function O8(e,t){let r=DU.isEmpty(e.hdb_user)?void 0:e.hdb_user?.username;if(e.operation===Qm.INSERT)return new g8(e.records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===Qm.UPDATE)return new S8(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===Qm.UPSERT)return new T8(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===Qm.DELETE)return new A8(t.deleted,t.original_records,r,t.txn_time,e.__origin)}a(O8,"createTransactionObject")});var Py=P((Lbe,vU)=>{"use strict";var N8=qf(),Dbe=_f(),s_=(G(),D($)),w8=hf(),I8=Dc().insertRecords,C8=ht(),P8=X(),D8=jm(),{getSchemaPath:L8}=gt(),M8=n_();vU.exports=v8;async function v8(e){try{let{schema_table:t,attributes:r}=N8(e);w8(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 D8(e.hdb_auth_header,t,r),s=L8(e.schema,e.table),i=await C8.openEnvironment(s,e.table),o=await I8(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await M8(e,o)}catch(c){P8.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(v8,"lmdbCreateRecords")});var BU=P((vbe,xU)=>{"use strict";var UU=(G(),D($)),U8=Py(),x8=_f(),B8=require("fs-extra"),{getSchemaPath:H8}=gt();xU.exports=k8;async function k8(e){let t=[{name:e.schema,createddate:Date.now()}],r=new x8(UU.SYSTEM_SCHEMA_NAME,UU.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,void 0,t);await U8(r),await B8.mkdirp(H8(e.schema))}a(k8,"lmdbCreateSchema")});var kU=P((xbe,HU)=>{"use strict";var Dy=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}};HU.exports=Dy});var $U=P((Gbe,qU)=>{"use strict";var FU=ht(),Ly=ln(),My=Mn().LMDB_ERRORS_ENUM,F8=Ft(),GU=X(),Hbe=oe(),G8=require("lmdb"),q8=kU(),$8=(G(),D($)),{OVERFLOW_MARKER:kbe,MAX_SEARCH_KEY_LENGTH:Fbe}=F8,V8=$8.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function K8(e,t,r,n){if(Ly.validateEnv(e),t===void 0)throw new Error(My.HASH_ATTRIBUTE_REQUIRED);if(!Array.isArray(r))throw r===void 0?new Error(My.IDS_REQUIRED):new Error(My.IDS_MUST_BE_ITERABLE);try{let s=FU.listDBIs(e);FU.initializeDBIs(e,t,s);let i=new q8,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[V8]>n){i.skipped.push(o);continue}let S=e.dbis[t].ifVersion(o,G8.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=Ly.getIndexedValues(T);if(O)for(let v=0,F=O.length;v<F;v++)E.remove(O[v],o)}catch{GU.warn(`cannot delete from attribute: ${R}, ${T}:${o}`)}}});c.push(S),l.push(o),i.original_records.push(p)}catch(p){GU.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=Ly.getNextMonotonicTime(),i}catch(s){throw s}}a(K8,"deleteRecords");qU.exports={deleteRecords:K8}});var i_=P(($be,KU)=>{"use strict";var fu=oe(),Y8=$U(),W8=ht(),{getSchemaPath:z8}=gt(),j8=n_(),Q8=X();KU.exports=J8;async function J8(e,t=!0){let n=global.hdb_schema[e.schema][e.table].hash_attribute;if(fu.isEmpty(n))throw new Error(`could not retrieve hash attribute for schema:${e.schema} and table ${e.table}`);try{if(fu.isEmptyOrZeroLength(e.hash_values)&&!fu.isEmptyOrZeroLength(e.records)){e.hash_values=[];for(let c=0;c<e.records.length;c++){let l=e.records[c][n];fu.isEmpty(l)||e.hash_values.push(l)}}if(fu.isEmptyOrZeroLength(e.hash_values))return VU([],[]);if(!Array.isArray(e.hash_values))throw new Error("hash_values must be an array");if(fu.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=z8(e.schema,e.table),i=await W8.openEnvironment(s,e.table),o=await Y8.deleteRecords(i,n,e.hash_values,e.__origin?.timestamp);try{t===!0&&await j8(e,o)}catch(c){Q8.error(`unable to write transaction due to ${c.message}`)}return VU(o.deleted,o.skipped,o.txn_time)}catch(s){throw s}}a(J8,"lmdbDeleteRecords");function VU(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(VU,"createDeleteResponse")});var Uy=P((Ybe,YU)=>{"use strict";var X8=(G(),D($)),Kbe=ln();function vy(e,t){let r=Object.create(null);if(t.length===1&&X8.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(vy,"parseRow");function Z8(e,t,r,n){let s=vy(r,e);n.push(s)}a(Z8,"searchAll");function e5(e,t,r,n){let s=vy(r,e);n[t]=s}a(e5,"searchAllToMap");function t5(e,t,r){r[e]===void 0&&(r[e]=[]),r[e].push(t)}a(t5,"iterateDBI");function Fc(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(Fc,"pushResults");function r5(e,t,r,n,s,i){t.toString().endsWith(e)&&Fc(t,r,n,s,i)}a(r5,"endsWith");function n5(e,t,r,n,s,i){t.toString().includes(e)&&Fc(t,r,n,s,i)}a(n5,"contains");function s5(e,t,r,n,s,i){t>e&&Fc(t,r,n,s,i)}a(s5,"greaterThanCompare");function i5(e,t,r,n,s,i){t>=e&&Fc(t,r,n,s,i)}a(i5,"greaterThanEqualCompare");function o5(e,t,r,n,s,i){t<e&&Fc(t,r,n,s,i)}a(o5,"lessThanCompare");function a5(e,t,r,n,s,i){t<=e&&Fc(t,r,n,s,i)}a(a5,"lessThanEqualCompare");YU.exports={parseRow:vy,searchAll:Z8,searchAllToMap:e5,iterateDBI:t5,endsWith:r5,contains:n5,greaterThanCompare:s5,greaterThanEqualCompare:i5,lessThanCompare:o5,lessThanEqualCompare:a5,pushResults:Fc}});var _u=P((Jbe,ZU)=>{"use strict";var fa=ht(),zbe=X(),Vn=ln(),Jm=Ft(),zt=Mn().LMDB_ERRORS_ENUM,jbe=oe(),c5=(G(),D($)),Xm=Uy(),{parseRow:l5}=Xm,Qbe=require("lmdb"),{OVERFLOW_MARKER:WU,MAX_SEARCH_KEY_LENGTH:u5}=Jm;function zU(e,t,r,n=!1,s=void 0,i=void 0){return Gc(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(zU,"iterateFullIndex");function o_(e,t,r,n,s,i=!1,o=void 0,c=void 0,l=!1,u=!1){return Gc(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 Gc(e,t,r,n){let s=e.database||e,i=fa.openDBI(s,r);i[Jm.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(Gc,"setupTransaction");function jU(e,t,r,n){let s;return function(i,o){if(typeof i=="string"&&i.endsWith(WU)){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[Jm.DBI_DEFINITION_NAME].is_hash_attribute);u++);}i=s.get(o,{transaction:t,lazy:!0})[n]}return i}}a(jU,"getOverflowCheck");function d5(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 Gc(e,t,t,(o,c,l)=>(Zm(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=>l5(u.value,r))))}a(d5,"searchAll");function f5(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);Zm(r),r=a_(e.database||e,r);let o=new Map;for(let{key:c,value:l}of zU(e,t,t,n,s,i))o.set(c,Xm.parseRow(l,r));return o}a(f5,"searchAllToMap");function _5(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=zU(e,void 0,t,r,n,s),c=o.transaction,l=jU(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(_5,"iterateDBI");function h5(e,t){if(Vn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);return fa.statDBI(e,t).entryCount}a(h5,"countAll");function p5(e,t,r,n,s=!1,i=void 0,o=void 0){return _a(e,r,n),Gc(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(p5,"equals");function m5(e,t,r){return _a(e,t,r),fa.openDBI(e,t).getValuesCount(r)}a(m5,"count");function E5(e,t,r,n,s=!1,i=void 0,o=void 0){return _a(e,r,n),Gc(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(E5,"startsWith");function g5(e,t,r,n,s=!1,i=void 0,o=void 0){return QU(e,t,r,n,s,i,o,!0)}a(g5,"endsWith");function QU(e,t,r,n,s=!1,i=void 0,o=void 0,c=!1){return _a(e,r,n),Gc(e,null,r,(l,u,f,d)=>{let h=jU(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(WU)?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[Jm.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(QU,"contains");function S5(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(S5,"greaterThan");function T5(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(T5,"greaterThanEqual");function A5(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(A5,"lessThan");function R5(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(R5,"lessThanEqual");function y5(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(y5,"between");function b5(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(Zm(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=Xm.parseRow(c,r)),o}a(b5,"searchByHash");function O5(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(O5,"checkHashExists");function N5(e,t,r,n,s=[]){return XU(e,t,r,n,s),JU(e,t,r,n,s).map(i=>i[1])}a(N5,"batchSearchByHash");function w5(e,t,r,n,s=[]){XU(e,t,r,n,s);let i=new Map;for(let[o,c]of JU(e,t,r,n,s))i.set(o,c);return i}a(w5,"batchSearchByHashToMap");function JU(e,t,r,n,s=[]){return Gc(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,Xm.parseRow(f,r)];s.push(u)}).filter(u=>u)})}a(JU,"batchHashSearch");function XU(e,t,r,n,s){if(Vn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);if(Zm(r),n==null)throw new Error(zt.IDS_REQUIRED);if(!n[Symbol.iterator])throw new Error(zt.IDS_MUST_BE_ITERABLE)}a(XU,"initializeBatchSearchByHash");function Zm(e){if(!Array.isArray(e))throw e===void 0?new Error(zt.FETCH_ATTRIBUTES_REQUIRED):new Error(zt.FETCH_ATTRIBUTES_MUST_BE_ARRAY)}a(Zm,"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>u5)throw new Error(zt.SEARCH_VALUE_TOO_LARGE)}a(_a,"validateComparisonFunctions");function a_(e,t){return t.length===1&&c5.SEARCH_WILDCARDS.indexOf(t[0])>=0&&(t=fa.listDBIs(e)),t}a(a_,"setGetWholeRowAttributes");ZU.exports={searchAll:d5,searchAllToMap:f5,count:m5,countAll:h5,equals:p5,startsWith:E5,endsWith:g5,contains:QU,searchByHash:b5,setGetWholeRowAttributes:a_,batchSearchByHash:N5,batchSearchByHashToMap:w5,checkHashExists:O5,iterateDBI:_5,greaterThan:S5,greaterThanEqual:T5,lessThan:A5,lessThanEqual:R5,between:y5}});var hu=P((Zbe,s0)=>{var e0=require("lodash"),t0=st(),Fe=require("joi"),I5=oe(),{hdb_schema_table:c_,checkValidTable:r0,hdb_table:n0,hdb_database:eE}=Ri(),{handleHDBError:C5,hdb_errors:P5}=he(),{getDatabases:D5}=(Ue(),D(ct)),{HTTP_STATUS_CODES:L5}=P5,M5=Fe.object({database:eE,schema:eE,table:n0,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)}),v5=Fe.object({database:eE,schema:eE,table:n0,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()});s0.exports=function(e,t){let r=null;switch(t){case"value":r=t0.validateBySchema(e,M5);break;case"hashes":let i=function(o){s?s+=". "+o:s=o};var n=i;a(i,"addError");let s;i(r0("database",e.schema)),i(r0("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=t0.validateBySchema(e,v5);break;default:throw new Error(`Error validating search, unknown type: ${t}`)}if(!r&&e.schema!=="system"){let s=I5.checkGlobalSchemaTable(e.schema,e.table);if(s)return C5(new Error,s,L5.NOT_FOUND);let o=D5()[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=e0.filter(c,f=>f!=="*"&&!f.startsWith?.("$")&&f.attribute!=="*"&&!Array.isArray(f)&&!f.name&&!e0.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 xy=P((tOe,i0)=>{"use strict";var U5=ht(),x5=hu(),{getSchemaPath:B5}=gt();i0.exports=H5;function H5(e){let t=x5(e,"hashes");if(t)throw t;let r=B5(e.schema,e.table);return U5.openEnvironment(r,e.table)}a(H5,"initialize")});var By=P((nOe,o0)=>{"use strict";var k5=_u(),F5=xy();o0.exports=G5;async function G5(e){let t=await F5(e),r=t.useReadTransaction();r.database=t;let n=global.hdb_schema[e.schema][e.table];try{return k5.batchSearchByHashToMap(r,n.hash_attribute,e.get_attributes,e.hash_values)}finally{r.done()}}a(G5,"lmdbGetDataByHash")});var pu=P((iOe,a0)=>{"use strict";var Hy=class{static{a(this,"SearchByHashObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.hash_values=n,this.get_attributes=s}};a0.exports=Hy});var l0=P((cOe,c0)=>{"use strict";var aOe=pu(),q5=_u(),$5=xy();c0.exports=V5;async function V5(e){let t=await $5(e),r=global.hdb_schema[e.schema][e.table];return q5.batchSearchByHash(t,r.hash_attribute,e.get_attributes,e.hash_values)}a(V5,"lmdbSearchByHash")});var Ys=P((uOe,u0)=>{"use strict";var ky=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}};u0.exports=ky});var tE=P((fOe,m0)=>{"use strict";var Yr=_u(),K5=ht(),Y5=oe(),Ge=Ft(),qc=(G(),D($)),W5=oo(),d0=Mn().LMDB_ERRORS_ENUM,{getSchemaPath:z5}=gt(),ho=qc.SEARCH_WILDCARDS;async function j5(e,t,r){let n;e.schema===qc.SYSTEM_SCHEMA_NAME?n=W5[e.table]:n=global.hdb_schema[e.schema][e.table];let s=p0(e,n.hash_attribute,r,t);return _0(e,s,n.hash_attribute,r)}a(j5,"prepSearch");async function _0(e,t,r,n){let s=z5(e.schema,e.table),i=await K5.openEnvironment(s,e.table),o=h0(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(Q5(e,r)===!1){let f=e.search_attribute;if(f===r)return n?f0(o,()=>!0):o.map(h=>({[r]:h.key}));let d=a(h=>({[r]:h.value,[f]:h.key}),"toObject");return n?f0(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(_0,"executeSearch");function h0(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(h0,"searchByType");function f0(e,t){let r=new Map;for(let n of e)r.set(n.value,t(n));return r}a(f0,"createMapFromIterable");function Q5(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(Q5,"checkToFetchMore");function p0(e,t,r,n){if(Y5.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(d0.UNKNOWN_SEARCH_TYPE)}else switch(n){case qc.VALUE_SEARCH_COMPARATORS.BETWEEN:return Ge.SEARCH_TYPES.BETWEEN;case qc.VALUE_SEARCH_COMPARATORS.GREATER:return Ge.SEARCH_TYPES.GREATER_THAN;case qc.VALUE_SEARCH_COMPARATORS.GREATER_OR_EQ:return Ge.SEARCH_TYPES.GREATER_THAN_EQUAL;case qc.VALUE_SEARCH_COMPARATORS.LESS:return Ge.SEARCH_TYPES.LESS_THAN;case qc.VALUE_SEARCH_COMPARATORS.LESS_OR_EQ:return Ge.SEARCH_TYPES.LESS_THAN_EQUAL;default:throw new Error(d0.UNKNOWN_SEARCH_TYPE)}}a(p0,"createSearchTypeFromSearchObject");m0.exports={executeSearch:_0,createSearchTypeFromSearchObject:p0,prepSearch:j5,searchByType:h0}});var g0=P((pOe,E0)=>{"use strict";var hOe=Ys(),J5=hu(),X5=oe(),Z5=(G(),D($)),e9=tE();E0.exports=t9;function t9(e,t){if(!X5.isEmpty(t)&&Z5.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=J5(e,"value");if(n)throw n;return e9.prepSearch(e,t,!0)}a(t9,"lmdbGetDataByValue")});var l_=P((gOe,S0)=>{"use strict";var EOe=Ys(),r9=hu(),n9=oe(),s9=(G(),D($)),i9=tE();S0.exports=o9;async function o9(e,t){if(!n9.isEmpty(t)&&s9.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=r9(e,"value");if(n)throw n;return i9.prepSearch(e,t,!1)}a(o9,"lmdbSearchByValue")});var A0=P((AOe,T0)=>{"use strict";var TOe=Ft(),Fy=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}},Gy=class{static{a(this,"SearchCondition")}constructor(t,r,n){this.search_attribute=t,this.search_type=r,this.search_value=n}},qy=class{static{a(this,"SortAttribute")}constructor(t,r){this.attribute=t,this.desc=r}};T0.exports={SearchByConditionsObject:Fy,SearchCondition:Gy,SortAttribute:qy}});var N0=P((OOe,O0)=>{"use strict";var yOe=A0().SearchByConditionsObject,a9=Ys(),c9=hu(),$y=_u(),rE=Ft(),{Resource:bOe}=(sa(),D($A)),b0=tE(),l9=Uy(),u9=require("lodash"),{getSchemaPath:d9}=gt(),R0=ht(),{handleHDBError:f9,hdb_errors:_9}=he(),{HTTP_STATUS_CODES:h9}=_9,p9=1e8;O0.exports=m9;async function m9(e){let t=c9(e,"conditions");if(t)throw f9(t,t.message,h9.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=d9(e.schema,e.table),n=await R0.openEnvironment(r,e.table),s=global.hdb_schema[e.schema][e.table];for(let u of e.conditions)R0.openDBI(n,u.search_attribute);let i=u9.sortBy(e.conditions,u=>{if(u.estimated_count===void 0){let f=u.search_type;f===rE.SEARCH_TYPES.EQUALS?u.estimated_count=$y.count(n,u.search_attribute,u.search_value):f===rE.SEARCH_TYPES.CONTAINS||f===rE.SEARCH_TYPES.ENDS_WITH?u.estimated_count=1/0:u.estimated_count=p9}return u.estimated_count}),o=n.useReadTransaction();o.database=n;let c=await y0(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(b0.filterByType),d=f.length,h=$y.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(_=>l9.parseRow(_,h))}else{for(let d=1;d<i.length;d++){let h=i[d],_=await y0(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=$y.batchSearchByHash(o,s.hash_attribute,e.get_attributes,c)}return l.onDone=()=>{o.done()},l}a(m9,"lmdbSearchByConditions");async function y0(e,t,r,n){let s=new a9(t.schema,t.table,void 0,void 0,n,t.get_attributes),i=r.search_type;return s.search_attribute=r.search_attribute,i===rE.SEARCH_TYPES.BETWEEN?(s.search_value=r.search_value[0],s.end_value=r.search_value[1]):s.search_value=r.search_value,b0.searchByType(e,s,i,n).map(o=>o.value)}a(y0,"executeConditionSearch")});var u_=P((wOe,w0)=>{"use strict";var E9=(G(),D($)).OPERATIONS_ENUM,Vy=class{static{a(this,"DeleteObject")}constructor(t,r,n,s=void 0){this.operation=E9.DELETE,this.schema=t,this.table=r,this.hash_values=n,this.__origin=s}};w0.exports=Vy});var Ky=P((COe,U0)=>{"use strict";var D0=Ys(),L0=u_(),M0=l_(),v0=i_(),Tn=(G(),D($)),I0=oe(),C0=ht(),{getTransactionAuditStorePath:g9,getSchemaPath:S9}=gt(),P0=X();U0.exports=T9;async function T9(e){try{if(I0.isEmpty(global.hdb_schema[e.schema])||I0.isEmpty(global.hdb_schema[e.schema][e.table]))throw new Error(`unknown schema:${e.schema} and table ${e.table}`);await A9(e),await R9(e);let t=S9(e.schema,e.table);try{await C0.deleteEnvironment(t,e.table)}catch(r){if(r.message==="invalid environment")P0.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}try{let r=g9(e.schema,e.table);await C0.deleteEnvironment(r,e.table,!0)}catch(r){if(r.message==="invalid environment")P0.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}}catch(t){throw t}}a(T9,"lmdbDropTable");async function A9(e){let t=new D0(Tn.SYSTEM_SCHEMA_NAME,Tn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,Tn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[Tn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r=Array.from(await M0(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 L0(Tn.SYSTEM_SCHEMA_NAME,Tn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,n);await v0(s)}a(A9,"deleteAttributesFromSystem");async function R9(e){let t=new D0(Tn.SYSTEM_SCHEMA_NAME,Tn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,Tn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,e.table,void 0,[Tn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,Tn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,Tn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r,n;try{r=Array.from(await M0(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 L0(Tn.SYSTEM_SCHEMA_NAME,Tn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,[n.id]);try{await v0(s)}catch(i){throw i}}a(R9,"dropTableFromSystem")});var B0=P((DOe,x0)=>{"use strict";var y9=require("fs-extra"),b9=Ys(),O9=pu(),N9=u_(),w9=Ky(),I9=i_(),C9=By(),P9=l_(),po=(G(),D($)),{getSchemaPath:D9}=gt(),{handleHDBError:L9,hdb_errors:M9}=he(),{HDB_ERROR_MSGS:v9,HTTP_STATUS_CODES:U9}=M9;x0.exports=x9;async function x9(e){let t;try{t=await B9(e.schema);let r=new b9(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 P9(r));for(let o=0;o<n.length;o++){let c={schema:t,table:n[o].name};try{await w9(c)}catch(l){if(l.message!=="invalid environment")throw l}}let s=new N9(po.SYSTEM_SCHEMA_NAME,po.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[t]);await I9(s);let i=D9(t);await y9.remove(i)}catch(r){throw r}}a(x9,"lmdbDropSchema");async function B9(e){let t=new O9(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 C9(t))}catch(s){throw s}for(let[,s]of r)s.name===e&&(n=e);if(!n)throw L9(new Error,v9.SCHEMA_NOT_FOUND(e),U9.NOT_FOUND,void 0,void 0,!0);return n}a(B9,"validateDropSchema")});var d_=P((MOe,H0)=>{"use strict";var Yy=class{static{a(this,"CreateTableObject")}constructor(t,r,n){this.schema=t,this.table=r,this.hash_attribute=n}};H0.exports=Yy});var zy=P((xOe,k0)=>{"use strict";var H9=require("fs-extra"),nE=ht(),{getTransactionAuditStorePath:k9}=gt(),Wy=Ft(),UOe=d_();k0.exports=F9;async function F9(e){let t;try{let r=k9(e.schema,e.table);await H9.mkdirp(r),t=await nE.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{nE.createDBI(t,Wy.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,!1,!0),nE.createDBI(t,Wy.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,!0,!1),nE.createDBI(t,Wy.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(F9,"createTransactionsAuditEnvironment")});var q0=P((kOe,G0)=>{"use strict";var jy=(G(),D($)),F0=ht(),G9=Dc(),{getSystemSchemaPath:q9,getSchemaPath:$9}=gt(),HOe=oo(),V9=vm(),Qy=Mm(),K9=X(),Y9=zy();G0.exports=W9;async function W9(e,t){let r=$9(t.schema,t.table),n=new Qy(t.schema,t.table,jy.TIME_STAMP_NAMES_ENUM.CREATED_TIME,void 0,!0),s=new Qy(t.schema,t.table,jy.TIME_STAMP_NAMES_ENUM.UPDATED_TIME,void 0,!0),i=new Qy(t.schema,t.table,t.hash_attribute,void 0,!1,!0);try{if(await F0.createEnvironment(r,t.table),e!==void 0){let o=await F0.openEnvironment(q9(),jy.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME);await G9.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 Jy(n),await Jy(s),await Jy(i)}await Y9(t)}catch(o){throw o}}a(W9,"lmdbCreateTable");async function Jy(e){try{await V9(e)}catch(t){K9.warn(`failed to create attribute ${e.attribute} due to ${t.message}`)}}a(Jy,"createAttribute")});var V0=P((GOe,$0)=>{"use strict";var z9=qf(),j9=hf(),Q9=jm(),f_=(G(),D($)),J9=Dc().updateRecords,X9=ht(),{getSchemaPath:Z9}=gt(),e7=n_(),t7=X();$0.exports=r7;async function r7(e){try{let{schema_table:t,attributes:r}=z9(e);j9(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 Q9(e.hdb_auth_header,t,r),s=Z9(e.schema,e.table),i=await X9.openEnvironment(s,e.table),o=await J9(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await e7(e,o)}catch(c){t7.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(r7,"lmdbUpdateRecords")});var Y0=P(($Oe,K0)=>{"use strict";var n7=(G(),D($)).OPERATIONS_ENUM,Xy=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=n7.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};K0.exports=Xy});var z0=P((YOe,W0)=>{"use strict";var KOe=Y0(),s7=qf(),i7=hf(),o7=jm(),__=(G(),D($)),a7=Dc().upsertRecords,c7=ht(),{getSchemaPath:l7}=gt(),u7=n_(),d7=X(),{handleHDBError:f7,hdb_errors:_7}=he();W0.exports=h7;async function h7(e){let t;try{t=s7(e)}catch(l){throw f7(l,l.message,_7.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}let{schema_table:r,attributes:n}=t;i7(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 o7(e.hdb_auth_header,r,n),i=l7(e.schema,e.table),o=await c7.openEnvironment(i,e.table),c=await a7(o,r.hash_attribute,n,e.records,e.__origin?.timestamp);try{await u7(e,c)}catch(l){d7.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(h7,"lmdbUpsertRecords")});var Q0=P((zOe,j0)=>{"use strict";var Zy=class{static{a(this,"DeleteBeforeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.timestamp=n}};j0.exports=Zy});var X0=P((QOe,J0)=>{"use strict";var eb=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}};J0.exports=eb});var tx=P((ZOe,ex)=>{"use strict";var tb=ht(),{getTransactionAuditStorePath:p7}=gt(),XOe=Q0(),h_=Ft(),m7=oe(),Z0=X0(),E7=require("util").promisify,g7=E7(setTimeout),S7=1e4,T7=100;ex.exports=A7;async function A7(e){let t=p7(e.schema,e.table),r=await tb.openEnvironment(t,e.table,!0),n=tb.listDBIs(r);tb.initializeDBIs(r,h_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s,i=new Z0;do s=await R7(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 g7(T7);while(s.transactions_deleted>0);return i}a(A7,"deleteAuditLogsBefore");async function R7(e,t){let r=new Z0;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];m7.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>S7)break}return await s,r}catch(n){throw n}}a(R7,"deleteTransactions")});var nx=P((tNe,rx)=>{"use strict";var rb=class{static{a(this,"DropAttributeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.attribute=n}};rx.exports=rb});var ix=P((sNe,sx)=>{"use strict";var y7=Ys(),b7=u_(),nNe=nx(),wi=(G(),D($)),O7=oe(),nb=ht(),N7=oo(),w7=l_(),I7=i_(),{getSchemaPath:C7}=gt();sx.exports=P7;async function P7(e,t=!0){let r;e.schema===wi.SYSTEM_SCHEMA_NAME?r=N7[e.table]:r=global.hdb_schema[e.schema][e.table];let n=await L7(e),s=C7(e.schema,e.table),i=await nb.openEnvironment(s,e.table);return t===!0&&await D7(e,i,r.hash_attribute),nb.dropDBI(i,e.attribute),n}a(P7,"lmdbDropAttribute");async function D7(e,t,r){let n=nb.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(D7,"removeAttributeFromAllObjects");async function L7(e){let t=new y7(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 w7(t)).filter(o=>o[wi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]===e.attribute);if(O7.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 b7(wi.SYSTEM_SCHEMA_NAME,wi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,s);return I7(i)}a(L7,"dropAttributeFromSystem")});var dx=P((aNe,ux)=>{"use strict";var sb=ht(),mu=Ft(),oNe=ln(),ib=(G(),D($)),ox=oe(),{getTransactionAuditStorePath:M7}=gt(),v7=_u(),sE=uu(),U7=X();ux.exports=x7;async function x7(e){let t=M7(e.schema,e.table),r=await sb.openEnvironment(t,e.table,!0),n=sb.listDBIs(r);sb.initializeDBIs(r,mu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s;switch(e.search_type){case ib.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.TIMESTAMP:return ax(r,e.search_values);case ib.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:return s=global.hdb_schema[e.schema][e.table].hash_attribute,H7(r,e.search_values,s);case ib.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME:return B7(r,e.search_values);default:return ax(r)}}a(x7,"readAuditLog");function ax(e,t=[0,Date.now()]){ox.isEmpty(t[0])&&(t[0]=0),ox.isEmpty(t[1])&&(t[1]=Date.now());let r=e.dbis[mu.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 sE,s))}a(ax,"searchTransactionsByTimestamp");function B7(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[mu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].getValues(s))i.push(o);r.set(s,lx(e,i))}return Object.fromEntries(r)}a(B7,"searchTransactionsByUsername");function H7(e,t,r){let n=new Map;for(let c=0,l=t.length;c<l;c++){let u=t[c],f=v7.equals(e,mu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,mu.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=lx(e,s),o=new Map;for(let c=0;c<i.length;c++){let l=i[c],u=l.timestamp,f=n.get(u);cx(l,"records",r,f,o),cx(l,"original_records",r,f,o)}return Object.fromEntries(o)}a(H7,"searchTransactionsByHashValues");function cx(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 sE(e.operation,e.user_name,i,void 0);d[t]=[c],u.push(d)}}else{let u=new sE(e.operation,e.user_name,i,void 0);u[t]=[c],s.set(l,[u])}}}a(cx,"loopRecords");function lx(e,t){let r=[];try{let n=e.dbis[mu.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 sE,i);r.push(o)}}catch(i){U7.warn(i)}return r}catch(n){throw n}}a(lx,"batchSearchTransactions")});var _x=P((dNe,fx)=>{"use strict";var{getSchemaPath:lNe}=gt(),uNe=ht(),{database:k7}=(Ue(),D(ct));fx.exports={writeTransaction:F7};async function F7(e,t,r){return k7({database:e,table:t}).transaction(r)}a(F7,"writeTransaction")});var Ex=P((_Ne,mx)=>{"use strict";var{getSchemaPath:hx}=gt(),px=ht();mx.exports={flush:G7,resetReadTxn:q7};async function G7(e,t){return(await px.openEnvironment(hx(e,t),t.toString())).flushed}a(G7,"flush");async function q7(e,t){try{(await px.openEnvironment(hx(e,t),t.toString())).resetReadTxn()}catch{}}a(q7,"resetReadTxn")});var Ax=P((pNe,Tx)=>{"use strict";var{Readable:$7}=require("stream"),{getDatabases:V7}=(Ue(),D(ct)),{readSync:K7,openSync:Y7,createReadStream:gx}=require("fs"),{open:W7}=require("lmdb"),Sx=Bf(),z7=Hf(),{AUDIT_STORE_OPTIONS:j7}=(so(),D(Rx)),{INTERNAL_DBIS_NAME:Q7,AUDIT_STORE_NAME:J7}=Ft();Tx.exports=Z7;var ob=32768,X7=100;async function Z7(e){let t=e.database||e.schema||"data",r=V7()[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=W7({noSync:!0,maxDbs:z7.MAX_DBS}),h,_=d.openDB(Q7,new Sx(!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++%X7===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 Sx(!v,v);await g(E,F)}e.include_audit&&await g(J7,{...j7}),await h;let R=gx(d.path);return R.headers=l(),R.on("close",()=>{p.done(),d.close()}),R}let o=r[Object.keys(r)[0]].primaryStore,c=Y7(o.path);return o.transaction(()=>{let u=Buffer.alloc(ob);K7(c,u,0,ob),o.resetReadTxn();let f=o.useReadTransaction();f.renew();let d=gx(null,{fd:c,start:ob}),h=new $7.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(Z7,"getBackup")});var Ox=P((ENe,bx)=>{"use strict";var eee=X(),{handleHDBError:tee}=he(),ree=eM(),nee=vm(),see=Py(),iee=BU(),oee=i_(),aee=By(),cee=l0(),lee=g0(),uee=l_(),dee=N0(),fee=B0(),_ee=q0(),hee=V0(),pee=z0(),mee=tx(),Eee=Ky(),gee=ix(),See=dx(),Tee=_x(),yx=Ex(),Aee=Ax(),ab=class extends ree{static{a(this,"LMDBBridge")}async searchByConditions(t){return dee(t)}async getDataByHash(t){return await aee(t)}async searchByHash(t){return await cee(t)}async getDataByValue(t,r){return await lee(t,r)}async searchByValue(t){return await uee(t)}async createSchema(t){return await iee(t)}async dropSchema(t){return await fee(t)}async createTable(t,r){return await _ee(t,r)}async dropTable(t){return await Eee(t)}async createAttribute(t){return await nee(t)}async createRecords(t){return await see(t)}async updateRecords(t){return await hee(t)}async upsertRecords(t){try{return await pee(t)}catch(r){throw tee(r,null,null,eee.ERR,r)}}async deleteRecords(t){return await oee(t)}async dropAttribute(t){return await gee(t)}async deleteAuditLogsBefore(t){return await mee(t)}async readAuditLog(t){return await See(t)}writeTransaction(t,r,n){return Tee.writeTransaction(t,r,n)}flush(t,r){return yx.flush(t,r)}resetReadTxn(t,r){return yx.resetReadTxn(t,r)}getBackup(t){return Aee(t)}};bx.exports=ab});var lb={};Be(lb,{add:()=>iE,applyReverse:()=>Nx,getRecordAtTime:()=>cb,rebuildUpdateBefore:()=>oE});function iE(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 oE(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,iE(n,s,i)}else r&&(n||(n={}),n[s]=i)}else n||(n={}),n[s]=e[s];return n}function Nx(e,t){for(let r in t){let n=t[r];if(n?.__op__){let s=Ree[n.__op__]?.reverse;if(s)s(e,r,{value:n.value});else throw new Error(`Unsupported operation ${n.__op__}`)}else e[r]=wx}}function cb(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":Nx(s,u.getValue(r));break;case"delete":s=null}i=u.previousLocalTime}let o={},c=0;for(let l in s)s[l]===wx&&(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 Ree,wx,aE=be(()=>{so();a(iE,"add");iE.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)};Ree={add:iE};a(oE,"rebuildUpdateBefore");a(Nx,"applyReverse");wx={};a(cb,"getRecordAtTime")});function An(e){let t=e.getChanges();return t||(t=Object.create(null),e._setChanges(t)),t}function dE(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}`);An(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}`);An(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}`);An(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}`);An(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}`);An(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}`);An(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}`);An(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}`);An(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}`);An(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}`);An(this)[l]=d},"set");break;case"Any":case void 0:u=a(function(d){An(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}`);An(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 _=ub(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");An(this)[c]=l}),i("deleteProperty",function(c){An(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,Cx);break}o=c}while(o&&o!==Cx)}function ub(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")}},dE(r,t)),new r(e)):new p_(e);case Array:let n=new lE(e.length,e);for(let s=0,i=e.length;s<i;s++){let o=e[s];o&&typeof o=="object"&&(o=ub(o,t?.elements)),n[s]=o}return n;default:return e}}function fE(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=fE(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 Vc(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=Vc(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=lb[s?.__op__];if(i)i(r,n,s);else throw new Error("Invalid CRDT operation "+s.__op__);continue}else s=Vc(s);r[n]=s}if(!Array.isArray(e))for(let n in e)yee.call(e,n)&&(r||(r={...e.getRecord?.()}),r[n]=e[n]);return r?Object.freeze(r):e.getRecord?.()??e}function cE(e){let t=e.getRecord?.();if(t===void 0)return!0;if(e.constructor===Array){if(!t||e[$c]||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(cE(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(cE(s))return!0}else return!0}else return!0}}return!1}var Kn,Ix,Cx,p_,yee,$c,lE,uE,db=be(()=>{Kn=M(he());aE();_s();a(An,"getChanges");a(dE,"assignTrackedAccessors");Ix=Object.prototype,Cx=new Proxy({},{get(e,t,r){if(typeof t=="string"){if(t==="then"||t==="getRecord"||t==="getChanges")return;if(Ix[t])return Ix[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=ub(s);if(i)return n||(n=Object.create(null),r._setChanges(n)),n[t]=i,i}return s}}});a(ub,"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}};dE(p_,{});a(fE,"collapseData");yee=Object.prototype.hasOwnProperty;a(Vc,"updateAndFreeze");a(cE,"hasChanges");$c=Symbol.for("has-array-changes"),lE=class extends Array{static{a(this,"TrackedArray")}#e;[$c];constructor(t,r){super(t),this.#e=r}getRecord(){return this.#e}splice(...t){return this[$c]=!0,super.splice(...t)}push(...t){return this[$c]=!0,super.push(...t)}pop(){return this[$c]=!0,super.pop()}unshift(...t){return this[$c]=!0,super.unshift(...t)}shift(){return this[$c]=!0,super.shift()}};lE.prototype.constructor=Array;uE=class{constructor(t){this.value=t}static{a(this,"Addition")}__op__="add";update(t){return(+t||0)+this.value}}});var Bx={};Be(Bx,{ResourceBridge:()=>hb});function pb({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 Dx(e,t){let r=Ii(e),n=pb(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&&fE(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||Oee,r=Ze()[t];if(!r)throw(0,Ws.handleHDBError)(new Error,bee.SCHEMA_NOT_FOUND(t),404);return r[e.table]}function Lx(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*Mx(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 vx,_E,Ws,Ux,fb,_b,xx,bee,Oee,Nee,wee,Px,hb,Hx=be(()=>{"use strict";vx=M(Ox()),_E=M(hu()),Ws=M(he());Ue();Ux=M(qf());G();fb=M(_o()),_b=M(Ks()),xx=M(oe());mc();db();({HDB_ERROR_MSGS:bee}=Ws.hdb_errors),Oee="data",Nee=1e4,wee=10,hb=class extends vx.default{static{a(this,"ResourceBridge")}constructor(t){super(t),Px=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,_E.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:pb(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 Eu({database:t.schema,table:null}),fb.signalSchemaChange(new _b.SchemaEventMsg(process.pid,Yt.CREATE_SCHEMA,t.schema))}async dropSchema(t){await mb(t.schema),fb.signalSchemaChange(new _b.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,Px.upsertRecords(t)}async upsertRecords(t){let{schema_table:r,attributes:n}=(0,Ux.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=fE(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 Lx(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:Pp.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,xx.async_set_timeout)(wee),l=[],s=!0},"chunkDelete");for await(let f of n)l.push(f[r.primaryKey]),c++,c%Nee===0&&await u();return l.length>0&&await u(),s?Lx(i,o,void 0):{message:"No records found to delete"}}searchByHash(t){t.select!==void 0&&(t.get_attributes=t.select);let r=(0,_E.default)(t,"hashes");if(r)throw r;return Dx(t)}async getDataByHash(t){let r=new Map;t._returnKeyValue=!0;for await(let{key:n,value:s}of Dx(t,!0))r.set(n,s);return r}searchByValue(t,r){if(r&&hA[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,_E.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===Pp.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:pb(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 Dp.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 Dp.USERNAME:let s=t.search_values;for await(let i of Mx(r))s.includes(i.user_name)&&(n[i.user_name]||(n[i.user_name]=[])).push(i);return n;default:return Mx(r,t.search_values?.[0],t.search_values?.[1],t.limit)}}};a(pb,"getSelect");a(Dx,"getRecords");a(Ii,"getTable");a(Lx,"createDeleteResponse");a(Mx,"groupRecordsInHistory")});var qn=P((PNe,kx)=>{"use strict";var{ResourceBridge:Iee}=(Hx(),D(Bx)),Cee=ce();Cee.initSync();var hE;function Pee(){return hE||(hE=new Iee,hE)}a(Pee,"getBridge");kx.exports=Pee()});var Sn=P((LNe,$x)=>{"use strict";var mE=dR(),Mr=oe(),Dee=require("util"),EE=qn(),Lee=ms(),Fx=X(),{handleHDBError:Kc,hdb_errors:Mee}=he(),{HTTP_STATUS_CODES:Yc}=Mee,vee=Dee.promisify(Lee.getTableSchema),Uee="updated",Gx="inserted",qx="upserted";$x.exports={insert:Bee,update:Hee,upsert:kee,validation:xee,flush:Fee};async function xee(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 vee(e.schema,e.table),r=mE(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 Fx.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 Fx.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(xee,"validation");async function Bee(e){if(e.operation!=="insert")throw new Error("invalid operation, must be insert");let t=mE(e);if(t)throw Kc(new Error,t.message,Yc.BAD_REQUEST);Mr.transformReq(e);let r=Mr.checkSchemaTableExist(e.schema,e.table);if(r)throw Kc(new Error,r,Yc.BAD_REQUEST);let n=await EE.createRecords(e);return pE(Gx,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time)}a(Bee,"insertData");async function Hee(e){if(e.operation!=="update")throw new Error("invalid operation, must be update");let t=mE(e);if(t)throw Kc(new Error,t.message,Yc.BAD_REQUEST);Mr.transformReq(e);let r=Mr.checkSchemaTableExist(e.schema,e.table);if(r)throw Kc(new Error,r,Yc.BAD_REQUEST);let n=await EE.updateRecords(e);return Mr.isEmpty(n.existing_rows)?pE(Uee,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time):pE(n.update_action,[],e,n.hashes,void 0,n.txn_time)}a(Hee,"updateData");async function kee(e){if(e.operation!=="upsert")throw Kc(new Error,"invalid operation, must be upsert",Yc.INTERNAL_SERVER_ERROR);let t=mE(e);if(t)throw Kc(new Error,t.message,Yc.BAD_REQUEST);Mr.transformReq(e);let r=Mr.checkSchemaTableExist(e.schema,e.table);if(r)throw Kc(new Error,r,Yc.BAD_REQUEST);let n=await EE.upsertRecords(e);return pE(qx,n.written_hashes,e,[],n.new_attributes,n.txn_time)}a(kee,"upsertData");function pE(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===Gx?(o.inserted_hashes=t,o.skipped_hashes=n,o):e===qx?(o.upserted_hashes=t,o):(o.update_hashes=t,o.skipped_hashes=n,o)}a(pE,"returnObject");function Fee(e){return Mr.transformReq(e),EE.flush(e.schema,e.table)}a(Fee,"flush")});var jx=P((vNe,zx)=>{var gu=require("validate.js"),Kx=st(),Su=(G(),D($)),{handleHDBError:Gee,hdb_errors:qee}=he(),{HDB_ERROR_MSGS:jt,HTTP_STATUS_CODES:$ee}=qee,Eb=a(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Vee={STRUCTURE_USER:"structure_user"},Vx=Object.values(Su.ROLE_TYPES_ENUM),Kee="attribute_permissions",Yee="attribute_name",{PERMS_CRUD_ENUM:Tu}=Su,Wee=[Kee,...Object.values(Tu)],Yx=[Tu.READ,Tu.INSERT,Tu.UPDATE],zee=[Yee,...Yx];function jee(e){let t=Eb();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,Wx(e,t)}a(jee,"addRoleValidation");function Qee(e){let t=Eb();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,Wx(e,t)}a(Qee,"alterRoleValidation");function Jee(e){let t=Eb();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,Kx.validateObject(e,t)}a(Jee,"dropRoleValidation");var Xee=["operation","role","id","permission","hdb_user","access"];function Wx(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let o=0,c=n.length;o<c;o++)Xee.includes(n[o])||s.push(n[o]);s.length>0&&nr(jt.INVALID_ROLE_JSON_KEYS(s),r);let i=Kx.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{nr(o,r)}),e.permission){let o=Zee(e);o&&nr(o,r),Vx.forEach(c=>{e.permission[c]&&!gu.isBoolean(e.permission[c])&&nr(jt.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let o in e.permission)if(Vx.indexOf(o)<0){if(o===Vee.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=>{Wee.includes(f)||nr(jt.INVALID_PERM_KEY(f),r,o,l)}),Object.values(Tu).forEach(f=>{gu.isDefined(u[f])?gu.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=>{!zee.includes(S)&&S!==Tu.DELETE&&nr(jt.INVALID_ATTR_PERM_KEY(S),r,o,l)}),!gu.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}Yx.forEach(S=>{gu.isDefined(_[S])?gu.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 ete(r)}a(Wx,"customValidate");zx.exports={addRoleValidation:jee,alterRoleValidation:Qee,dropRoleValidation:Jee};function Zee(e){let{operation:t,permission:r}=e;if(t===Su.OPERATIONS_ENUM.ADD_ROLE||t===Su.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?Su.ROLE_TYPES_ENUM.SUPER_USER:Su.ROLE_TYPES_ENUM.CLUSTER_USER;return jt.SU_CU_ROLE_NO_PERMS_ALLOWED(o)}}}return null}a(Zee,"validateNoSUPerms");function ete(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 Gee(new Error,n,$ee.BAD_REQUEST)}else return null}a(ete,"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((BNe,Zx)=>{"use strict";var Qx=Sn(),Jx=Vr(),tte=Bc(),Sb=jx(),Tb=_o(),xNe=require("uuid").v4,rte=require("util"),gE=(G(),D($)),nte=oe(),Ab=Jx.searchByValue,ste=Jx.searchByHash,ite=rte.promisify(tte.delete),ote=Ys(),ate=pu(),{hdb_errors:cte,handleHDBError:Wc}=he(),{HDB_ERROR_MSGS:Xx,HTTP_STATUS_CODES:m_}=cte,{UserEventMsg:Rb}=Ks();Zx.exports={addRole:lte,alterRole:ute,dropRole:dte,listRoles:fte};function gb(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(gb,"scrubRoleDetails");async function lte(e){let t=Sb.addRoleValidation(e);if(t)throw t;e=gb(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 Ab(r)||[])}catch(i){throw Wc(i)}if(n&&n.length>0)throw Wc(new Error,Xx.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 Qx.insert(s),Tb.signalUserChange(new Rb(process.pid)),e=gb(e),e}a(lte,"addRole");async function ute(e){let t=Sb.alterRoleValidation(e);if(t)throw t;e=gb(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await Qx.update(r)}catch(s){throw Wc(s)}if(n&&n?.message==="updated 0 of 1 records")throw Wc(new Error,"Invalid role id",m_.BAD_REQUEST,void 0,void 0,!0);return await Tb.signalUserChange(new Rb(process.pid)),e}a(ute,"alterRole");async function dte(e){let t=Sb.dropRoleValidation(e);if(t)throw Wc(new Error,t,m_.BAD_REQUEST,void 0,void 0,!0);let r=new ate(gE.SYSTEM_SCHEMA_NAME,gE.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await ste(r));if(n.length===0)throw Wc(new Error,Xx.ROLE_NOT_FOUND,m_.NOT_FOUND,void 0,void 0,!0);let s=new ote(gE.SYSTEM_SCHEMA_NAME,gE.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await Ab(s)),o=!1;if(nte.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){o=!0;break}}if(o===!0)throw Wc(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 ite(c),Tb.signalUserChange(new Rb(process.pid)),`${n[0].role} successfully deleted`}a(dte,"dropRole");async function fte(){return Ab({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}a(fte,"listRoles")});var yb={};Be(yb,{start:()=>rB,startOnMainThread:()=>pte});function rB({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,eB.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(_te.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 hte(i)}}}async function hte(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,tB.isEqual)(i,e)?void 0:(e.id=r.id,(0,SE.alterRole)(e))}return(0,SE.addRole)(e)}var SE,eB,tB,_te,pte,nB=be(()=>{Ue();SE=M(E_()),eB=require("yaml"),tB=require("lodash"),_te=["super_user","cluster_user","structure_user"];a(rB,"start");a(hte,"ensureRole");pte=rB});async function TE(e){let t=(0,oB.pathToFileURL)(e).toString();if(mte)return g_||(g_=Ete(Ste)),(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 Ete(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:gte,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,iB.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,sB.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),g_}function gte(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 Ste(){return{Resource:qr,tables:Yn}}var sB,iB,oB,mte,g_,bb=be(()=>{sa();Ue();sB=require("fs/promises"),iB=require("path"),oB=require("url"),mte=!1;a(TE,"secureImport");a(Ete,"getCompartment");a(gte,"secureOnlyFetch");a(Ste,"getGlobalVars")});var Nb={};Be(Nb,{handleFile:()=>Tte});async function Tte(e,t,r,n){let s=new Map,i=await TE(r);c(i.default)&&n.set((0,Ob.dirname)(t),i.default),o(i,(0,Ob.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 Ob,aB=be(()=>{bb();Ob=require("path");a(Tte,"handleFile")});var Ib={};Be(Ib,{start:()=>Ate});function Ate({resources:e}){e.set("login",wb),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var wb,cB=be(()=>{sa();a(Ate,"start");wb=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:()=>wB,diffResourceUsage:()=>IB,recordAction:()=>Lt,recordActionBinary:()=>Wn,setAnalyticsEnabled:()=>Rte});function Rte(e){RB=e}function yte(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 bte(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},RE.set(e,o)}function Lt(e,t,r,n,s){if(!RB)return;let i=t+(r?"-"+r:"");n!==void 0&&(i+="-"+n),s!==void 0&&(i+="-"+s);let o=RE.get(i);o?yte(e,o):bte(i,e,t,r,n,s),AE||Ote()}function Wn(e,t,r,n,s){Lt(!!e,t,r,n,s)}function y_(e){OB.push(e)}function Ote(){AE=performance.now(),setTimeout(async()=>{let e=performance.now()-AE;AE=0;let t=[],r={time:Date.now(),period:e,threadId:zc.threadId,metrics:t};for(let[s,i]of RE){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 NB){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 CB()}let n=process.memoryUsage();t.push({metric:"memory",threadId:zc.threadId,byThread:!0,...n});for(let s of OB)s(t);RE=new Map,zc.parentPort?zc.parentPort.postMessage({type:bB,report:r}):LB({report:r})},yB).unref()}function yE(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 wB(e,t){let r=e.userCPUTime+e.systemCPUTime;return Math.round(r/t*100)/100}function IB(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 Nte(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};yE(e,"table-size",l),jc.trace?.(`table ${o} size metric: ${JSON.stringify(l)}`),n+=c}return n}function lB(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getAuditSize();if(!i)return;let o=AB.default.statSync(s.primaryStore.env.path).size,c=Nte(e,r,n),l=o-c,u={database:r,size:o,used:c,free:l,audit:i};yE(e,"database-size",u),jc.trace?.(`database ${r} size metric: ${JSON.stringify(u)}`)}catch(s){jc.warn?.("Error getting DB size metrics",s)}}function uB(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};yE(e,"storage-volume",o),jc.trace?.(`db ${r} storage volume metrics: ${JSON.stringify(o)}`)}catch(s){jc.warn?.("Error getting DB volume metrics",s)}}async function wte(e,t=6e4){let r=Pb(),n=PB(),s=new Promise(E=>{let T=performance.now();setImmediate(()=>{let O=performance.now();O-T>5e3&&jc.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&&jc.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 Pn=Re[dt];typeof Pn=="number"&&(Ae[dt]=(Ae[dt]*Bt+Pn*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 CB()}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,Pn)=>dt.value>Pn.value?1:-1);let v=O.count-1,F=[],q=0,j=0,te;for(let dt of NB){let Pn=v*dt;for(;q<Pn;)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-Pn)/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:_-dB,active:p-fB,taskQueueLatency:await s,time:h,...process.memoryUsage()};n.primaryStore.put(E,T,{append:!0}).then(O=>{O||n.primaryStore.put(E,T)})}dB=_,fB=p;let S=process.resourceUsage(),g=IB(S_,S);g.time=h,g.period=S_.time?h-S_.time:t,g.cpuUtilization=wB(S_,g.period),yE(n,"resource-usage",g),S_=g;let R=Ze();lB(n,R),lB(n,{system:R.system}),uB(n,R),uB(n,{system:R.system})}async function _B(e,t){let r=Date.now()-t;for(let n of e.primaryStore.getKeys({start:!1,end:r}))e.primaryStore.remove(n)}function Pb(){return hB||(hB=_t({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function PB(){return pB||(pB=_t({table:"hdb_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]}))}function Pte(){DB=!0;let e=(0,R_.get)(B.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await wte(yB,e),await _B(Pb(),Ite),await _B(PB(),Cte)},Math.min(e/2,2147483647)).unref()}function LB(e,t){let r=e.report;r.threadId=t?.threadId||zc.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(mB+=n.mean*n.count);r.totalBytesProcessed=mB,t&&(r.metrics.push({metric:"utilization",...t.performance.eventLoopUtilization(EB.get(t))}),EB.set(t,t.performance.eventLoopUtilization())),r.id=(0,A_.getNextMonotonicTime)(),Pb().primaryStore.put(r.id,r),DB||Pte(),Dte&&(MB=Mte(r))}async function Mte(e){if(await MB,!ha){let r=(0,T_.dirname)((0,SB.getLogFilePath)());try{ha=await(0,Cb.open)((0,T_.join)(r,"analytics.log"),"r+")}catch{ha=await(0,Cb.open)((0,T_.join)(r,"analytics.log"),"w+")}}let t=(await ha.stat()).size;if(t>Lte){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 zc,gB,SB,TB,T_,Cb,A_,R_,AB,jc,RE,RB,AE,yB,bB,OB,NB,dB,fB,S_,CB,Ite,Cte,hB,pB,DB,mB,EB,Dte,MB,ha,Lte,Ci=be(()=>{zc=require("worker_threads"),gB=M(it());Ue();SB=M(X()),TB=M(mi()),T_=require("path"),Cb=require("fs/promises"),A_=M(ln()),R_=M(ce());G();Dr();AB=M(require("node:fs")),jc=(0,TB.loggerWithTag)("analytics");(0,R_.initSync)();RE=new Map,RB=(0,R_.get)(B.ANALYTICS_AGGREGATEPERIOD)>-1;a(Rte,"setAnalyticsEnabled");a(yte,"recordExistingAction");a(bte,"recordNewAction");a(Lt,"recordAction");Ke.recordAnalytics=Lt;a(Wn,"recordActionBinary");AE=0,yB=1e3,bB="analytics-report",OB=[];a(y_,"addAnalyticsListener");NB=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Ote,"sendAnalytics");a(yE,"storeMetric");a(wB,"calculateCPUUtilization");a(IB,"diffResourceUsage");a(Nte,"storeTableSizeMetrics");a(lB,"storeDBSizeMetrics");a(uB,"storeVolumeMetrics");a(wte,"aggregation");dB=0,fB=0,S_={},CB=a(()=>new Promise(setImmediate),"rest");a(_B,"cleanup");Ite=36e5,Cte=31536e6;a(Pb,"getRawAnalyticsTable");a(PB,"getAnalyticsTable");(0,gB.setChildListenerByType)(bB,LB);a(Pte,"startScheduledTasks");mB=0,EB=new Map,Dte=!1;a(LB,"recordAnalytics");Lte=1e6;a(Mte,"logAnalytics")});var vB={};Be(vB,{Headers:()=>mo,appendHeader:()=>bE,mergeHeaders:()=>Db});function bE(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 Db(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(bE,"appendHeader");a(Db,"mergeHeaders")});function kB(e){let t={openapi:vte,info:{title:"HarperDB HTTP REST interface",version:HB.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 Ub(Lb[se.type],se.type)}),t.components.schemas[j.type]=new BB(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 Ub(Lb[v.type],v.type)}:T==="Any"||T=="ID"?u[O]={format:T}:u[O]=new Ub(Lb[T],T)}f.push(new xb(O,"query",u[O]))}let d=Object.keys(u),h=new xb(c,"path",{format:"ID"});h.required=!0,h.description="primary key of record";let _=new xb("property","path",{enum:d});_.required=!0,t.components.schemas[i]=new BB(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 Ute(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[E]||(t.paths[E]={}),t.paths[E].get=new Mb(f,r,{200:new vb({$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 xB(f,r,"delete all the records that match the provided query",{204:new UB})),E="/"+s+"/{"+c+"}",g&&(t.paths[E]={},t.paths[E].get=new Mb([h],r,{200:new vb({$ref:pa+i})},"retrieve a record by its primary key")),S&&(t.paths[E]||(t.paths[E]={}),t.paths[E].put=new xte([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 xB([h],r,"delete a record with the given primary key",{204:new UB})),g&&_.schema.enum.length>0&&(E="/"+s+"/{"+c+"}.{property}",t.paths[E]={},t.paths[E].get=new Mb([h,_],r,{200:new vb({enum:d})},"used to retrieve the specified property of the specified record"))}return t}function Ute(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:pa+e}}}},this.security=t,this.responses={200:{description:Bb,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function Mb(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function vb(e){this.description=Bb,this.content={"application/json":{schema:e}}}function UB(){this.description="successfully processed request, no content returned to client"}function xte(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:Bb}}}function xB(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function BB(e){this.type="object",this.properties=e}function Ub(e,t){this.type=e,this.format=t}function xb(e,t,r){this.name=e,this.in=t,this.schema=r}var HB,vte,Lb,pa,Bb,FB=be(()=>{HB=M(Et()),vte="3.0.3",Lb={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},pa="#/components/schemas/",Bb="successful operation";a(kB,"generateJsonApi");a(Ute,"Post");a(Mb,"Get");a(vb,"Response200");a(UB,"Response204");a(xte,"Put");a(xB,"Delete");a(BB,"ResourceSchema");a(Ub,"Type");a(xb,"Parameter")});var qB={};Be(qB,{Request:()=>N_,createReuseportFd:()=>OE});var GB,N_,Hb,kb,OE,NE=be(()=>{GB=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 kb(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 Hb(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)}},Hb=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)}},kb=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,GB.platform)()!="win32"&&(OE=require("node-unix-socket").createReuseportFd)});var IE={};Be(IE,{parseHeaderValue:()=>Gb,start:()=>kte});async function Hte(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&em(e);let i=new mo;try{e.responseHeaders=i;let o=e.url.slice(1),c,l;if(o!==$B){let g=wE.getMatch(o,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new Ec(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=Gb(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=Gb(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 Au.ClientError(g,400)}if(e.authorize=!0,o===$B&&s==="GET"){if(e?.user?.role?.permission?.super_user)return kB(wE);throw new Au.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 Au.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Au.ServerError(`Method ${s} is not recognized`,501)}}),h=200,_;if(d==null)h=s==="GET"||s==="HEAD"?404:204,Fb.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(d.status>0&&d.headers){let g=Db(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){Bte[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),Fb.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 kte(e){Fb=e,e.includeExpensiveRecordCountEstimates&&(N_.prototype.includeExpensiveRecordCountEstimates=!0),!VB&&(VB=!0,wE=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return Hte(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{w_++;let s=new xn;KB||(KB=!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=wE.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 Ec(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(Fte[l.statusCode]||1011,l.toString())}t.close()},e))}function Gb(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,Au,vr,Bte,Fb,$B,VB,wE,KB,w_,Fte,YB=be(()=>{eo();Ci();Pi=M(X()),Au=M(he());Sf();Wl();mc();O_();FB();Sf();NE();vr=new Uint8Array(8),Bte=new Float64Array(vr.buffer,0,1),Fb={},$B="openapi";a(Hte,"http");w_=0;a(kte,"start");Fte={401:3e3,403:3003};a(Gb,"parseHeaderValue")});var qb=P((hwe,zB)=>{var{recordAction:CE,recordActionBinary:WB}=(Ci(),D(b_)),Gte=require("fastify-plugin"),qte=200;zB.exports=Gte(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),CE(o,"duration",u,d,f),WB(s.raw.statusCode<400,"success",u,d,f),WB(1,"response_"+s.raw.statusCode,u,d,f);let h=qte;i?.pipe?(i.on("data",g=>{h+=g.length}),i.on("end",()=>{CE(performance.now()-c,"transfer",u,d,f),CE(h,"bytes-sent",u,d,f)})):(h+=i?.length||0,CE(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 QB=P((pwe,jB)=>{var $te=st(),Vte={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};jB.exports=function(e){return $te.validateObject(e,Vte)}});var PE=P((mwe,JB)=>{"use strict";var Kte=(G(),D($)).OPERATIONS_ENUM,$b=class{static{a(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=Kte.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};JB.exports=$b});var P_={};Be(P_,{createTokens:()=>Wte,getJWTRSAKeys:()=>UE,refreshOperationToken:()=>zte,validateOperationToken:()=>Yb,validateRefreshToken:()=>xE});async function UE(){if(DE)return DE;try{let e=I_.default.join(C_.default.getHdbBasePath(),dA),t=await LE.default.readFile(I_.default.join(e,Xd.JWT_PASSPHRASE_NAME),"utf8"),r=await LE.default.readFile(I_.default.join(e,Xd.JWT_PRIVATE_KEY_NAME),"utf8");return DE={publicKey:await LE.default.readFile(I_.default.join(e,Xd.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},DE}catch(e){throw vE.default.error(e),new zs.ClientError(yu.NO_ENCRYPTION_KEYS,Ru.INTERNAL_SERVER_ERROR)}}async function Wte(e){let t=(0,Vb.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,Kb.findAndValidateUser)(e.username,e.password,d)}catch(d){throw vE.default.error(d),new zs.ClientError(yu.INVALID_CREDENTIALS,Ru.UNAUTHORIZED)}if(!r)throw new zs.ClientError(yu.INVALID_CREDENTIALS,Ru.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 UE(),c=await bu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:e.expires_in??rH,algorithm:ME,subject:"operation"}),l=await bu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:Yte,algorithm:ME,subject:"refresh"}),u=dy(l,"sha256");if((await(0,XB.update)(new ZB.default(Jd,ql.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new zs.ClientError(yu.REFRESH_TOKEN_SAVE_FAILED,Ru.INTERNAL_SERVER_ERROR);return eH.default.signalUserChange(new tH.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function zte(e){let t=(0,Vb.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 xE(r);let n=await UE(),s=await bu.default.decode(r);return{operation_token:await bu.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:rH,algorithm:ME,subject:"operation"})}}async function Yb(e){return nH(e,"operation")}async function xE(e){return nH(e,"refresh")}async function nH(e,t){try{let r=await UE(),n=await bu.default.verify(e,r.publicKey,{algorithms:ME,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,Kb.findAndValidateUser)(n.username,void 0,!1);if(t==="refresh"&&!fy(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw vE.default.warn(r),r?.name==="TokenExpiredError"?new zs.ClientError(yu.TOKEN_EXPIRED,Ru.FORBIDDEN):new zs.ClientError(yu.INVALID_TOKEN,Ru.UNAUTHORIZED)}}var bu,LE,I_,Di,Vb,zs,vE,Kb,XB,ZB,eH,tH,C_,Ru,yu,rH,Yte,ME,DE,Ou=be(()=>{bu=M(require("jsonwebtoken")),LE=M(require("fs-extra")),I_=M(require("node:path")),Di=M(require("joi")),Vb=M(st());G();zs=M(he()),vE=M(X());Vm();Kb=M(gn()),XB=M(Sn()),ZB=M(PE()),eH=M(_o()),tH=M(Ks()),C_=M(ce()),{HTTP_STATUS_CODES:Ru,AUTHENTICATION_ERROR_MSGS:yu}=zs.hdb_errors;C_.default.initSync();rH=C_.default.get(B.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",Yte=C_.default.get(B.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",ME="RS256";a(UE,"getJWTRSAKeys");a(Wte,"createTokens");a(zte,"refreshOperationToken");a(Yb,"validateOperationToken");a(xE,"validateRefreshToken");a(nH,"validateToken")});var Wb=P((Awe,oH)=>{"use strict";var jte=QB(),Nu=require("passport"),Qte=require("passport-local").Strategy,Jte=require("passport-http").BasicStrategy,Xte=require("util"),Zte=gn(),iH=Xte.callbackify(Zte.findAndValidateUser),Twe=Mn(),ere=(G(),D($)),sH=(Ou(),D(P_));Nu.use(new Qte(function(e,t,r){iH(e,t,r)}));Nu.use(new Jte(function(e,t,r){iH(e,t,r)}));Nu.serializeUser(function(e,t){t(null,e)});Nu.deserializeUser(function(e,t){t(null,e)});function tre(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":Nu.authenticate("basic",{session:!1},(o,c)=>{i(o,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===ere.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?sH.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):sH.validateOperationToken(s).then(o=>{r(null,o)}).catch(o=>{r(o)});break;default:Nu.authenticate("local",{session:!1},function(o,c){i(o,c)})(e,t,r);break}}a(tre,"authorize");function rre(e,t){let r=jte(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(rre,"checkPermissions");oH.exports={authorize:tre,checkPermissions:rre}});var BE=P((ywe,aH)=>{"use strict";var nre=qn();aH.exports={writeTransaction:sre};function sre(e,t,r){return nre.writeTransaction(e,t,r)}a(sre,"writeTransaction")});var dH=P((Nwe,uH)=>{"use strict";var ire=Vr(),ore=ms(),cH=X(),are=Sn(),Owe=BE(),cre=require("clone"),jb=require("alasql"),lre=xm(),lH=require("util"),ure=lH.promisify(ore.getTableSchema),dre=lH.promisify(ire.search),fre=(G(),D($)),zb=oe();lre(jb);uH.exports={update:hre};var _re="There was a problem performing this update. Please check the logs and try again.";async function hre({statement:e,hdb_user:t}){let r=await ure(e.table.databaseid,e.table.tableid),n=pre(e.columns);zb.backtickASTSchemaItems(e);let{table:s,where:i}=e,o=cre(s),c=zb.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=jb.parse(l).statements[0],f=await dre(u),d=mre(n,f);return Ere(o,d,t)}a(hre,"update");function pre(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=jb.compile(`SELECT ${r.expression.toString()} AS [${fre.FUNC_VAL}] FROM ?`)}),t}catch(t){throw cH.error(t),new Error(_re)}}a(pre,"createUpdateRecord");function mre(e,t){return zb.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}a(mre,"buildUpdateRecords");async function Ere(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await are.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){cH.error(`Error delete new_attributes from update response: ${i}`)}return s}a(Ere,"updateRecords")});var _H=P((Pwe,fH)=>{var gre=require("alasql"),Sre=Vr(),Tre=X(),Are=qn(),Jb=require("util"),Qb=oe(),Rre=(G(),D($)),yre=ms(),Iwe=BE(),Cwe=Sn(),bre="record",Ore="successfully deleted",Nre=Jb.callbackify(Pre),wre=Jb.promisify(Sre.search),Ire=Jb.promisify(yre.getTableSchema);fH.exports={convertDelete:Nre};function Cre(e){return`${e.deleted_hashes.length} ${bre}${e.deleted_hashes.length===1?"":"s"} ${Ore}`}a(Cre,"generateReturnMessage");async function Pre({statement:e,hdb_user:t}){let r=await Ire(e.table.databaseid,e.table.tableid);Qb.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=Qb.isEmpty(s)?"":` WHERE ${s.toString()}`,o=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=gre.parse(o).statements[0],l={operation:Rre.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await wre(c);let u=await Are.deleteRecords(l);return Qb.isEmptyOrZeroLength(u.message)&&(u.message=Cre(u)),delete u.txn_time,u}catch(u){throw Tre.error(u),u.hdb_code?u.message:u}}a(Pre,"convertDelete")});var gH=P((Lwe,EH)=>{"use strict";var Dre=uo(),{hdb_errors:hH}=he(),{getDatabases:pH}=(Ue(),D(ct));EH.exports={checkSchemaExists:mH,checkSchemaTableExists:Lre,schema_describe:Dre};async function mH(e){if(!pH()[e])return hH.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(mH,"checkSchemaExists");async function Lre(e,t){let r=await mH(e);if(r)return r;if(!pH()[e][t])return hH.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(Lre,"checkSchemaTableExists")});var rO=P((Bwe,PH)=>{"use strict";var{decode:Mre}=require("msgpackr"),{isMainThread:vwe,parentPort:Uwe,threadId:xwe}=require("worker_threads"),FE=sr(),wu=Dt(),eO=(G(),D($)),Wr=X(),Zb=ce(),vre=(G(),D($)),{onMessageByType:Ure}=it(),RH=lo(),{recordAction:SH,recordActionBinary:xre}=(Ci(),D(b_)),{publishToStream:Bre}=FE,{ConsumerEvents:TH}=require("nats"),Hre=Vr(),{promisify:kre}=require("util"),{decodeBlobsWithWrites:Fre}=(_s(),D(mm)),yH=kre(setTimeout),GE=1e4,qE,kE,Gre,qre,bH,D_=new Map,Iu=new Map;PH.exports={initialize:OH,ingestConsumer:tO,setSubscription:$re,setIgnoreOrigin:Yre,getDatabaseSubscriptions:Kre,updateConsumer:NH};async function OH(){Ure(eO.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,async n=>{await NH(n)}),bH=!0,Wr.notify("Initializing clustering ingest service.");let{connection:e,jsm:t,js:r}=await FE.getNATSReferences();qE=e,kE=e.info.server_name,Gre=t,qre=r}a(OH,"initialize");async function NH(e){if(e.status==="start"){let{js:t,jsm:r}=await wH(e.node_domain_name);tO(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")),Iu.get(e.node_domain_name)==="failed"&&Iu.set(e.node_domain_name,"close")}}a(NH,"updateConsumer");var $E=new Map;function $re(e,t,r){let n=$E.get(e);n||$E.set(e,n=new Map),n.set(t,r),bH||OH().then(Vre)}a($re,"setSubscription");async function Vre(){let e=await Hre.searchByValue({database:"system",table:"hdb_nodes",search_attribute:"name",search_value:"*"});for await(let t of e){let r=t.name+wu.SERVER_SUFFIX.LEAF,n,s;for(let i of t.subscriptions||[])if(i.subscribe===!0){if(!n&&({js:n,jsm:s}=await wH(r),!n))break;let{schema:o,table:c}=i,l=RH.createNatsTableStreamName(o,c);tO(l,n,s,r)}}}a(Vre,"accessConsumers");async function wH(e){let t,r,n=1;for(;!r;)try{t=await qE.jetstream({domain:e}),r=await qE.jetstreamManager({domain:e,checkAPI:!1})}catch(s){if(Iu.get(e)==="close")break;Iu.set(e,"failed"),n%10===1&&Wr.warn("Nats ingest attempting to connect to:",e,"Nats error:",s.message);let i=n++*100<GE?n++*100:GE;await yH(i)}return{js:t,jsm:r}}a(wH,"connectToRemoteJS");function Kre(){return $E}a(Kre,"getDatabaseSubscriptions");var IH;function Yre(e){IH=e}a(Yre,"setIgnoreOrigin");var CH=100,AH=new Array(CH),HE=0;async function tO(e,t,r,n){let{connection:s}=await FE.getNATSReferences();qE=s,kE=s.info.server_name;let i,o=1;for(;!i;)try{i=await t.consumers.get(e,kE),Wr.notify("Initializing ingest consumer for node:",n,"stream:",e)}catch(u){if(Iu.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 FE.createConsumer(r,e,kE,new Date(Date.now()).toISOString()));let f=o++*100<GE?o++*100:GE;await yH(f)}let c=!1,l;for(;!c;){if(D_.get(e+n)==="close"||Iu.get(n)==="close"){D_.delete(e+n),c=!0;continue}l=await i.consume({max_messages:Zb.get(eO.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===TH.ConsumerDeleted&&(await l.close(),c=!0),f.type===TH.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 AH[HE],AH[HE]=Wre(f).catch(d=>{Wr.error(d)}),++HE>=CH&&(HE=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(tO,"ingestConsumer");async function Wre(e){let t;await Fre(()=>{t=Mre(e.data)}),SH(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(eO.CONFIG_PARAMS.CLUSTERING_NODENAME);r.has(wu.MSG_HEADERS.TRANSACTED_NODES)&&r.values(wu.MSG_HEADERS.TRANSACTED_NODES).indexOf(s)>-1&&(n=!0);let i=r.get(wu.MSG_HEADERS.ORIGIN);if(n||(n=i===s&&!IH),xre(n,"echo",e.subject,t.operation,"ingest"),n){e.ack();return}r.append(wu.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(wu.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=$E.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:Xb(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:Xb(o),value:F,expiresAt:_,id:d?.[q],table:u}));for(;l;)v.push({type:Xb(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(vre.CONFIG_PARAMS.CLUSTERING_REPUBLISHMESSAGES)!==!1&&Bre(e.subject.split(".").slice(0,-1).join("."),RH.createNatsTableStreamName(c,u),e.headers,e.data),await S;let O=Date.now()-g;g&&SH(O,"replication-latency",e.subject,o,"ingest")}catch(o){Wr.error(o)}e.ack()}a(Wre,"messageProcessor");function Xb(e){switch(e){case"insert":case"upsert":case"update":return"put"}return e}a(Xb,"convertOperation")});var sr=P((Vwe,WH)=>{"use strict";var Or=ce();Or.initSync();var zre=require("fs-extra"),jre=require("semver"),v_=require("path"),{monotonicFactory:Qre}=require("ulidx"),LH=Qre(),Jre=require("util"),MH=require("child_process"),Xre=Jre.promisify(MH.exec),Zre=MH.spawn,Ur=Dt(),je=(G(),D($)),{packageJson:ene,PACKAGE_ROOT:tne}=Et(),VE=oe(),js=X(),KE=lo(),rne=BE(),L_=It(),{broadcast:nne,onMessageByType:sne,getWorkerIndex:ine}=it(),{isMainThread:vH}=require("worker_threads"),{Encoder:one,decode:oO}=require("msgpackr"),UH=new one,{isEmpty:Zc}=VE,xH=gn(),kwe=48*36e11;vH&&sne(je.ITC_EVENT_TYPES.RESTART,()=>{zr=void 0,Xc=void 0});var{connect:ane,StorageType:cne,RetentionPolicy:lne,AckPolicy:aO,DeliverPolicy:cO,DiscardPolicy:une,NatsConnection:Fwe,JetStreamManager:Gwe,JetStreamClient:qwe,StringCodec:$we,JSONCodec:dne,createInbox:lO,headers:fne,ErrorCode:DH}=require("nats"),{recordAction:_ne}=(Ci(),D(b_)),{encodeBlobsAsBuffers:hne}=(_s(),D(mm)),BH=dne(),pne="clustering",mne=ene.engines[Ur.NATS_SERVER_NAME],Ene=v_.join(tne,"dependencies"),iO=v_.join(Ene,`${process.platform}-${process.arch}`,Ur.NATS_BINARY_NAME),nO,sO,M_,Qc,Jc;WH.exports={runCommand:HH,checkNATSServerInstalled:gne,createConnection:uO,getConnection:U_,getJetStreamManager:x_,getJetStream:FH,getNATSReferences:Li,getServerList:Tne,createLocalStream:dO,listStreams:GH,deleteLocalStream:Ane,getServerConfig:Cu,listRemoteStreams:Rne,viewStream:yne,viewStreamIterator:bne,publishToStream:One,request:Ine,reloadNATS:fO,reloadNATSHub:Cne,reloadNATSLeaf:Pne,extractServerName:wne,requestErrorHandler:Dne,createLocalTableStream:KH,createTableStreams:vne,purgeTableStream:YH,purgeSchemaTableStreams:Une,getStreamInfo:xne,updateLocalStreams:Hne,closeConnection:Sne,getJsmServerName:YE,addNatsMsgHeader:qH,clearClientCache:kH,updateRemoteConsumer:Lne,createConsumer:$H,updateConsumerIterator:Mne};async function HH(e,t=void 0){let{stdout:r,stderr:n}=await Xre(e,{cwd:t});if(n)throw new Error(n.replace(`
|
|
21
21
|
`,""));return r.replace(`
|
|
22
|
-
`,"")}a(HH,"runCommand");async function gne(){try{await zre.access(iO)}catch{return!1}let e=await HH(`${iO} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return jre.eq(t,mne)}a(gne,"checkNATSServerInstalled");async function uO(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await xH.getClusterUser();if(Zc(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 ane({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&&kH()}),i}a(uO,"createConnection");function kH(){zr=void 0,Qc=void 0,Jc=void 0,Xc=void 0}a(kH,"clearClientCache");async function Sne(){zr&&(await zr.drain(),zr=void 0,Qc=void 0,Jc=void 0,Xc=void 0)}a(Sne,"closeConnection");var zr,Xc;async function U_(){return Xc||(Xc=uO(Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),zr=await Xc),zr||Xc}a(U_,"getConnection");async function x_(){if(Qc)return Qc;Zc(zr)&&await U_();let{domain:e}=Cu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Zc(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Qc=await zr.jetstreamManager({domain:e,timeout:6e4}),Qc}a(x_,"getJetStreamManager");async function FH(){if(Jc)return Jc;Zc(zr)&&await U_();let{domain:e}=Cu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Zc(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Jc=zr.jetstream({domain:e,timeout:6e4}),Jc}a(FH,"getJetStream");async function Li(){let e=zr||await U_(),t=Qc||await x_(),r=Jc||await FH();return{connection:e,jsm:t,js:r}}a(Li,"getNATSReferences");async function Tne(e){let t=Or.get(je.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await xH.getClusterUser(),s=await uO(t,r,n),i=lO(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=BH.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 VE.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(Tne,"getServerList");async function dO(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:cne.File,retention:lne.Limits,subjects:t,discard:une.Old,max_msgs:s,max_bytes:i,max_age:n})}a(dO,"createLocalStream");async function GH(){let{jsm:e}=await Li(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(GH,"listStreams");async function Ane(e){let{jsm:t}=await Li();await t.streams.delete(e)}a(Ane,"deleteLocalStream");async function Rne(e){let{connection:t}=await Li(),r=[],n=lO(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(BH.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(Rne,"listRemoteStreams");async function yne(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Li(),i=LH(),o={durable_name:i,ack_policy:aO.Explicit};t&&(o.deliver_policy=cO.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=oO(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(yne,"viewStream");async function*bne(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Li(),i=LH(),o={durable_name:i,ack_policy:aO.Explicit};t&&(o.deliver_policy=cO.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=oO(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(bne,"viewStreamIterator");async function One(e,t,r,n){js.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=qH(n,r);let{js:s}=await Li(),i=await YE(),o=`${e}.${i}`,c=await hne(()=>n instanceof Uint8Array?n:UH.encode(n));try{js.trace(`publishToStream publishing to subject: ${o}`),_ne(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 VH(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 dO(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(One,"publishToStream");function qH(e,t){t===void 0&&(t=fne());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(qH,"addNatsMsgHeader");function Cu(e){e=e.toLowerCase();let t=v_.join(Or.get(je.CONFIG_PARAMS.ROOTPATH),pne);if(e===je.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return Zc(sO)&&(sO={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}),sO;if(e===je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return Zc(nO)&&(nO={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}),nO;js.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a(Cu,"getServerConfig");async function $H(e,t,r,n){try{await e.consumers.add(t,{ack_policy:aO.Explicit,durable_name:r,deliver_policy:cO.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a($H,"createConsumer");async function Nne(e,t,r){await e.consumers.delete(t,r)}a(Nne,"removeConsumer");function wne(e){return e.split(".")[1]}a(wne,"extractServerName");async function Ine(e,t,r=6e4,n=lO()){if(!VE.isObject(t))throw new Error("data param must be an object");let s=UH.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 oO(c.data)}a(Ine,"request");function fO(e){return new Promise(async(t,r)=>{let n=Zre(iO,["--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(fO,"reloadNATS");async function Cne(){let{pid_file_path:e}=Cu(je.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await fO(e)}a(Cne,"reloadNATSHub");async function Pne(){let{pid_file_path:e}=Cu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await fO(e)}a(Pne,"reloadNATSLeaf");function Dne(e,t,r){let n;switch(e.code){case DH.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case DH.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(Dne,"requestErrorHandler");async function Lne(e,t){let r=t+Ur.SERVER_SUFFIX.LEAF,{connection:n}=await Li(),{jsm:s}=await Fne(r),{schema:i,table:o}=e,c=KE.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await VH(async()=>{if(e.subscribe===!0)await $H(s,c,n.info.server_name,l);else try{await Nne(s,c,n.info.server_name)}catch(u){js.trace(u)}})}a(Lne,"updateRemoteConsumer");async function Mne(e,t,r,n){let s=KE.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(!vH&&ine()<Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=rO();await c(o)}await nne(o),n==="stop"&&await VE.async_set_timeout(1e3)}a(Mne,"updateConsumerIterator");function VH(e){return rne.writeTransaction(je.SYSTEM_SCHEMA_NAME,je.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(VH,"exclusiveLock");async function KH(e,t){let r=KE.createNatsTableStreamName(e,t),n=await YE(),s=Bne(e,t,n);await dO(r,[s])}a(KH,"createLocalTableStream");async function vne(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await KH(n,s)}}a(vne,"createTableStreams");async function YH(e,t,r=void 0){if(Or.get(je.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=KE.createNatsTableStreamName(e,t),{domain:s}=Cu(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(YH,"purgeTableStream");async function Une(e,t){if(Or.get(je.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await YH(e,t[r])}a(Une,"purgeSchemaTableStreams");async function xne(e){return(await x_()).streams.info(e)}a(xne,"getStreamInfo");function Bne(e,t,r){return`${Ur.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(Bne,"createSubjectName");async function YE(){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(YE,"getJsmServerName");async function Hne(){let e=await x_(),t=await YE(),r=await GH();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=kne(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(Hne,"updateLocalStreams");function kne(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(kne,"updateStreamLimits");async function Fne(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(Fne,"connectToRemoteJS")});function _O(e){let t=e.get(WE),r=t?(0,Pu.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(WE,(0,Pu.pack)(r))}return r}function B_(e){return _O(e).remoteNameToId}function jH(e,t){let r=_O(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(WE,(0,Pu.pack)(r)),s}function zE(e,t){let r=_O(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(WE,(0,Pu.pack)(r))}return zH.trace?.("The remote node name map",e,n,s),s}var zH,Pu,WE,hO=be(()=>{zH=M(mi());Es();Pu=require("msgpackr"),WE=Symbol.for("remote-ids");a(_O,"getIdMappingRecord");a(B_,"exportIdMapping");a(jH,"remoteToLocalNodeId");a(zE,"getIdOfRemoteNode")});var pO={};Be(pO,{commits_awaiting_replication:()=>Lu,getHDBNodeTable:()=>ir,getReplicationSharedStatus:()=>jE,iterateRoutes:()=>F_,shouldReplicateToNode:()=>k_,subscribeToNodeUpdates:()=>Mu});function ir(){return QH||(QH=_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 jE(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Mu(e){ir().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;ek.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 ir().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]&&ir().primaryStore.get(tt())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function Gne(){Mu(e=>{ma({},(t,r)=>{let n=e.name,s=JH.get(n);if(s||JH.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=jE(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of Lu.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=Du.default.get(B.REPLICATION_SECUREPORT)??(!Du.default.get(B.REPLICATION_PORT)&&Du.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||Du.default.get(B.REPLICATION_PORT)||Du.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){XH.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 XH,ZH,Du,ek,QH,JH,Lu,el=be(()=>{Ue();Es();Jp();XH=require("worker_threads"),ZH=M(he()),Du=M(ce());G();ek=M(mi());server.nodes=[];a(ir,"getHDBNodeTable");a(jE,"getReplicationSharedStatus");a(Mu,"subscribeToNodeUpdates");a(k_,"shouldReplicateToNode");JH=new Map;JD((e,t,r)=>{if(r>server.nodes.length)throw new ZH.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);Lu||(Lu=new Map,Gne());let n=Lu.get(e);return n||(n=[],Lu.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(Gne,"startSubscriptionToReplications");a(F_,"iterateRoutes")});var nk={};Be(nk,{connectedToNode:()=>tl,disconnectedFromNode:()=>Uu,ensureNode:()=>Eo,requestClusterStatus:()=>rk,startOnMainThread:()=>gO});async function gO(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){QE.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=ir().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)}Mu(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 ir().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 vu)if(i.url===h.url){vu.delete(d);break}vu.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}];QE.has(d)&&(S.push({replicateByDefault:h,name:tt(),start_time:QE.get(d),end_time:Date.now(),replicates:!0}),QE.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)},qne);else{nt.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],ir().primaryStore.get(tt())?.replicates),ir().primaryStore.get(tt())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};p?p.postMessage(E):XE(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),Uu=a(function(i){try{if(EO.default.get(B.REPLICATION_FAILOVER)===!1)return;nt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(vu.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=vu.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"),tl=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",Uu),(0,vi.onMessageByType)("connected-to-node",tl),(0,vi.onMessageByType)("request-cluster-status",rk)}function rk(e,t){let r=[];for(let[n,s]of vu)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,mO.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=ir();e=e??Qs(t.url),t.name=e;try{if(t.ca){let s=new tk.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&&!EO.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,mO.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,JE,nt,mO,EO,tk,qne,Mi,Uu,tl,vu,QE,q_=be(()=>{Ue();vi=M(it());Es();JE=require("worker_threads");el();nt=M(X()),mO=require("lodash"),EO=M(ce());G();tk=require("crypto"),qne=200,Mi=new Map,vu=new Map,QE=new Map;a(gO,"startOnMainThread");a(rk,"requestClusterStatus");JE.parentPort&&(Uu=a(e=>{JE.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),tl=a(e=>{JE.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,vi.onMessageByType)("subscribe-to-node",e=>{G_(e)}),(0,vi.onMessageByType)("unsubscribe-from-node",e=>{XE(e)}));a(Eo,"ensureNode")});var Zs=P(Nk=>{"use strict";var or=require("path"),{watch:$ne}=require("chokidar"),Rn=require("fs-extra"),xu=require("node-forge"),lk=require("net"),{generateKeyPair:TO,X509Certificate:go,createPrivateKey:uk}=require("crypto"),Vne=require("util");TO=Vne.promisify(TO);var yt=xu.pki,Js=require("joi"),{v4:dk}=require("uuid"),{validateBySchema:bO}=st(),St=X(),zn=ce(),gs=(G(),D($)),{CONFIG_PARAMS:nl}=gs,Xs=OA(),{ClientError:Sa}=he(),ZE=require("node:tls"),{relative:fk,join:Kne}=require("node:path"),{CERT_PREFERENCE_APP:aIe,CERTIFICATE_VALUES:sk}=Xs,Yne=dc(),AO=It(),{table:Wne,getDatabases:zne,databases:SO}=(Ue(),D(ct)),{getJWTRSAKeys:ik}=(Ou(),D(P_));Object.assign(Nk,{generateKeys:wO,updateConfigCert:Tk,createCsr:tse,signCertificate:rse,setCertTable:Bu,loadCertificates:Ek,reviewSelfSignedCert:CO,createTLSSelector:Rk,listCertificates:bk,addCertificate:cse,removeCertificate:use,createNatsCerts:ise,generateCertsKeys:sse,getReplicationCert:V_,getReplicationCertAuth:ese,renewSelfSigned:ose,hostnamesFromCert:PO,getKey:dse});var{urlToNodeName:_k,getThisNodeUrl:jne,getThisNodeName:tg,clearThisNodeName:Qne}=(Es(),D(Ra)),{readFileSync:Jne,statSync:hk}=require("node:fs"),cIe=ce(),{getTicketKeys:Xne,onMessageFromWorkers:Zne}=it(),ga=X(),{isMainThread:pk}=require("worker_threads"),{TLSSocket:mk,createSecureContext:lIe}=require("node:tls"),OO=3650,$_=["127.0.0.1","localhost","::1"],NO=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];Zne(async e=>{e.type===gs.ITC_EVENT_TYPES.RESTART&&(zn.initSync(!0),await CO())});var xr;function Aa(){return xr||(xr=zne().system.hdb_certificate,xr||(xr=Wne({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=Rk("operations-api"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(tg());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 ese(){Aa();let e=(await V_()).options.cert,r=new go(e).issuer.match(/CN=(.*)/)?.[1];return xr.get(r)}a(ese,"getReplicationCertAuth");var ok,Ta=new Map;function Ek(){if(ok)return;ok=!0;let e=[{configKey:nl.TLS},{configKey:nl.OPERATIONSAPI_TLS}];Aa();let t=or.dirname(AO.getConfigFilePath()),r;for(let{configKey:n}of e){let s=AO.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&fk(Kne(t,"keys"),o);c&&ak(o,l=>{Ta.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&pk){let f;ak(u,d=>{if(sk.cert===d)return;let h=i.hostname??i.hostnames??i.host??i.hosts;h&&!Array.isArray(h)&&(h=[h]);let _=Ak(u),p=new go(_),S;try{S=Ok(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(sk.cert)))return;let g=xr.primaryStore.get(S),R=hk(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(Ek,"loadCertificates");function ak(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&pk&&St.warn(`Reloading ${r}:`,i),n=c,t(Ak(i)))}catch(c){St.error(`Error loading ${r}:`,i,c)}},"loadFile");Rn.existsSync(e)?s(e,hk(e)):St.error(`${r} file not found:`,e),$ne(e,{persistent:!1}).on("change",s)}a(ak,"loadAndWatch");function RO(){let e=jne();if(e==null){let t=$_[0];return St.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return _k(e)}a(RO,"getHost");function eg(){let e=tg();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(eg,"getCommonName");async function tse(){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:eg()},...NO];St.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:gk()}];return St.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),xu.pki.certificationRequestToPem(n)}a(tse,"createCsr");function gk(){let e=$_.includes(eg())?$_:[...$_,eg()];return e.includes(RO())||e.push(RO()),[{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=>lk.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(gk,"certExtensions");async function rse(e){let t={},r=or.join(zn.getHdbBasePath(),gs.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 Rn.exists(or.join(r,f.private_key_name))){n=Rn.readFile(or.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await yO();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=xu.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()+OO),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,xu.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(rse,"signCertificate");async function nse(e,t){await Bu({name:tg(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Bu({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(nse,"createCertificateTable");async function Bu(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(Bu,"setCertTable");async function wO(){let e=await TO("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(wO,"generateKeys");async function IO(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()+OO);let i=[{name:"commonName",value:eg()},...NO];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(gk()),n.sign(e,xu.md.sha256.create()),yt.certificateToPem(n)}a(IO,"generateCertificates");async function yO(){let e=await bk(),t;for(let r of e){if(!r.is_authority)continue;let n=await yk(r.private_key_name);if(r.private_key_name&&n&&new go(r.certificate).checkPrivateKey(uk(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(yO,"getCertAuthority");async function Sk(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()+OO);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${zn.get(nl.REPLICATION_HOSTNAME)??_k(zn.get(nl.REPLICATION_URL))??dk().split("-")[0]}`},...NO];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,xu.md.sha256.create());let o=or.join(zn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),c=or.join(o,Xs.PRIVATEKEY_PEM_NAME);return r&&await Rn.writeFile(c,yt.privateKeyToPem(e)),n}a(Sk,"generateCertAuthority");async function sse(){let{private_key:e,public_key:t}=await wO(),r=await Sk(e,t),n=await IO(e,t,r);await nse(n,r),Tk()}a(sse,"generateCertsKeys");async function ise(){let e=await IO(yt.privateKeyFromPem(Xs.CERTIFICATE_VALUES.key),void 0,yt.certificateFromPem(Xs.CERTIFICATE_VALUES.cert)),t=or.join(zn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),r=or.join(t,Xs.NATS_CERTIFICATE_PEM_NAME);await Rn.exists(r)||await Rn.writeFile(r,e);let n=or.join(t,Xs.NATS_CA_PEM_NAME);await Rn.exists(n)||await Rn.writeFile(n,Xs.CERTIFICATE_VALUES.cert)}a(ise,"createNatsCerts");async function ose(){Aa();for await(let e of xr.search([{attribute:"is_self_signed",value:!0}]))await xr.delete(e.name);await CO()}a(ose,"renewSelfSigned");async function CO(){Qne(),await Ek(),Aa();let e=await yO();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(Rn.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(nl.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(nl.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=or.join(zn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),c=fk(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 wO(),Rn.existsSync(or.join(o,Xs.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${dk().split("-")[0]}.pem`),await Rn.writeFile(or.join(o,c),yt.privateKeyToPem(s)));let l=await Sk(s,yt.setRsaPublicKey(s.n,s.e),!1);await Bu({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=tg();St.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await yO();let n=yt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await IO(yt.privateKeyFromPem(e.private_key),s,n);await Bu({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(CO,"reviewSelfSignedCert");function Tk(){let e=Yne(Object.keys(gs.CONFIG_PARAM_MAP),!0),t=or.join(zn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),r=or.join(t,Xs.PRIVATEKEY_PEM_NAME),n=or.join(t,Xs.NATS_CERTIFICATE_PEM_NAME),s=or.join(t,Xs.NATS_CA_PEM_NAME),i=gs.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),AO.updateConfigValue(void 0,void 0,o,!1,!0)}a(Tk,"updateConfigCert");function Ak(e){return e.startsWith("-----BEGIN")?e:Jne(e,"utf8")}a(Ak,"readPEM");var ck=ZE.createSecureContext;ZE.createSecureContext=function(e){if(!e.cert||!e.key)return ck(e);let t={...e};delete t.key,delete t.cert;let r=ck(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var ase=mk.prototype._init;mk.prototype._init=function(e,t){ase.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 rl=new Map;function Rk(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(),rl.clear();let f=0;for await(let d of SO.system.hdb_certificate.search([])){let h=d.certificate,_=new go(h);d.is_authority&&(_.asString=h,rl.set(_.subject,h))}for await(let d of SO.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 yk(d.private_key_name),S=d.certificate,g=new go(S);if(rl.has(g.issuer)&&(S+=`
|
|
23
|
-
`+rl.get(g.issuer)),!p||!S)throw new Error("Missing private key or certificate for secure server");let R={ciphers:d.ciphers,ticketKeys:Xne(),availableCAs:rl,ca:t&&Array.from(rl.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=ZE.createSecureContext(R);E.name=d.name,E.options=R,E.quality=_,E.certificateAuthorities=Array.from(rl),E.certStart=S.toString().slice(0,100);let T=d.hostnames??PO(g);Array.isArray(T)||(T=[T]);let O;for(let v of T)if(v){v[0]==="*"&&(s=!0,v=v.slice(1)),v===RO()&&(_+=2),lk.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",ZE.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"),SO.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(Rk,"createTLSSelector");async function yk(e){let t=Ta.get(e);return!t&&e?await Rn.readFile(or.join(zn.get(nl.ROOTPATH),gs.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(yk,"getPrivateKeyByName");async function bk(){Aa();let e=[];for await(let t of xr.search([]))e.push(t);return e}a(bk,"listCertificates");async function cse(e){let t=bO(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(uk(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=Ok(o)}catch(_){St.error(_)}if(f==null)throw new Sa("Error extracting certificate common name, please provide a name parameter")}let d=lse(r??f);s&&!c&&!l&&(await Rn.writeFile(or.join(zn.getHdbBasePath(),gs.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 Bu(h),"Successfully added certificate: "+d}a(cse,"addCertificate");function lse(e){return e.replace(/[^a-z0-9\.]/gi,"-")}a(lse,"sanitizeName");async function use(e){let t=bO(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 Rn.remove(or.join(zn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME,s)))}return await xr.delete(r),"Successfully removed "+r}a(use,"removeCertificate");function Ok(e){let t=e.subject.match(/CN=(.*)/)?.[1];return t||PO(e)[0]}a(Ok,"getPrimaryHostName");function PO(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(PO,"hostnamesFromCert");async function dse(e){if(e.bypass_auth!==!0)throw new Sa("Unauthorized","401");let t=bO(e,Js.object({name:Js.string().required()}));if(t)throw new Sa(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await ik()).privateKey;if(r===".jwtPublic")return(await ik()).publicKey;if(Ta.get(r))return Ta.get(e.name);throw new Sa("Key not found")}a(dse,"getKey")});var zk={};Be(zk,{CONFIRMATION_STATUS_POSITION:()=>Kk,NodeReplicationConnection:()=>ku,OPERATION_REQUEST:()=>vO,RECEIVED_TIME_POSITION:()=>xO,RECEIVED_VERSION_POSITION:()=>UO,RECEIVING_STATUS_POSITION:()=>BO,RECEIVING_STATUS_RECEIVING:()=>Wk,RECEIVING_STATUS_WAITING:()=>Yk,SENDING_TIME_POSITION:()=>K_,createWebSocket:()=>lg,database_subscriptions:()=>ba,replicateOverWS:()=>Y_,table_update_listeners:()=>kO});async function lg(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(!LO){let l=(0,Gk.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),LO=u.secureContexts}if(i=LO.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,$k.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(ag?.caCount!==So.size&&(ag=qk.createSecureContext({...i.options,ca:[...So,...i.options.availableCAs.values()]}),ag.caCount=So.size),c.secureContext=ag),new kk.WebSocket(e,"harperdb-replication-v1",c)}function Y_(e,t,r){let n=t.port||t.securePort,s=sl.pid%1e3+"-"+Fk.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=Hk.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,xk).unref(),A()}else Pn();e._socket?.setMaxListeners(200);function Pn(){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())},xk*2).unref()}a(Pn,"resetPingTimer");function nn(){return h||(h=jE(d,u,E)),h}a(nn,"getSharedStatus"),u&&zo(u);let wr,Fd,sc=[],ZT=[],eA,Ht=[],Gd=[],qd=[],tA=150,Ap=25,$d=0,De=0,Vd=!1,Wi,Ir,Dn,ic;e.on("message",A=>{ne=performance.now();try{let w=A.dataView=new il(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let N=(0,et.decode)(A),[H,U,Q]=N;switch(H){case Ik:{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)([Hu])),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)([Hu])),sn(1008,Y.message);return}Yo()}break}case vk:{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 Hu:sn();break;case vO: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)([ng,V]))},V=>{e.send((0,et.encode)([ng,{requestId:U.requestId,error:V instanceof Error?V.toString():V}]))})}catch(Y){e.send((0,et.encode)([ng,{requestId:U.requestId,error:Y instanceof Error?Y.toString():Y}]))}break;case ng:let{resolve:J,reject:k}=g.get(U.requestId);U.error?k(new Error(U.error)):J(U),g.delete(U.requestId);break;case DO: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),sc[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 Ck:ic=d?jH(U,d):new Map,eA=N[2],ae.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${eA}`);break;case Pk:let ye=Q;qd[ye]=U;break;case Mk:nn()[Kk]=U,ae.trace?.(s,"received and broadcasting committed update",U),nn().buffer.notify();break;case Lk:T=U,p.send({type:"end_txn",localTime:T,remoteNodeIds:R});break;case sg:{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 MO.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 Dk:{let Y=U,V;try{let ue=N[3],_e=ZT[Q]||(ZT[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)([DO,{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[Oc]&pn&&(We=Buffer.from(We),Nf(()=>_e.primaryStore.decoder.decode(Pe),Ln=>oc(Ln,ue),_e.primaryStore.rootStore)),V=(0,et.encode)([rg,Y,{value:We,expiresAt:Ve.expiresAt,version:Ve.version,residencyId:Ve.residencyId,nodeId:Ve.nodeId,user:Ve.user}])}else V=(0,et.encode)([rg,Y])}catch(ue){V=(0,et.encode)([rg,Y,{error:ue.message}])}e.send(V);break}case rg:{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;pm(()=>{let Pe=sc[ue].decoder.decode(me.value);me.value=Pe,me.key=_e,Y(me)||Te&&setTimeout(()=>Te.forEach(fm),6e4).unref()},Pe=>{let Ve=Kd(Pe,_e);return Te||(Te=[]),Te.push(Ve),Ve})}else Y();g.delete(N[1]);break}case wk:{Dn=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",Dn),!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=ir().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)([Hu])),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)([Hu])),sn(1008,`Unauthorized database subscription to ${u}`);return}if(Ir&&(ae.debug?.(s,"stopping previous subscription",u),Ir.emit("close")),Dn.length===0)return;let _e=Dn[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,Ln,os=a((we,kt)=>{if(we.type==="end_txn"){Te.txnTime&&(o[i]!==66&&ae.error?.("Invalid encoding of message"),K(9),K(cg),y(Ln=kt),yp()),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,Us=Nt.encoder;(we.extendedType&bm||!Us.typedStructs)&&(Us._mergeStructures(Us.getStructures()),Us.typedStructs&&(Us.lastTypedStructuresLength=Us.typedStructs.length));let Gl=Pe[Ot];if(!(Gl&&Gl.startTime<kt&&(!Gl.endTime||Gl.endTime>kt)))return og&&ae.trace?.(s,"skipping replication update",we.recordId,"to:",E,"from:",Ot,"subscribed:",Pe),cP();og&&ae.trace?.(s,"sending replication update",we.recordId,"to:",E,"from:",Ot,"subscribed:",Pe);let rA=we.version;Te.txnTime!==rA&&(Te.txnTime&&(og&&ae.trace?.(s,"new txn time, sending queued txn",Te.txnTime),o[i]!==66&&ae.error?.("Invalid encoding of message"),yp()),Te.txnTime=rA,i=c,y(rA));let lc=we.residencyId,nA=Yd(lc,as),bp;if(nA&&!nA.includes(E)){let xs=Yd(we.previousResidencyId,as);if(xs&&!xs.includes(E)&&(we.type==="put"||we.type==="patch")||as.getResidencyById)return cP();let zd=we.recordId;ae.trace?.(s,"sending invalidation",zd,E,"from",Ot);let jd=0;lc&&(jd|=Ic),we.previousResidencyId&&(jd|=Cc);let oA,Op=null;for(let lP in as.indices){if(!Op){if(oA=we.getValue(Nt,!0),!oA)break;Op={}}Op[lP]=oA[lP]}bp=Nc(we.version,Rr,zd,null,Ot,we.user,we.type==="put"||we.type==="patch"?"invalidate":we.type,Us.encode(Op),jd,lc,we.previousResidencyId,we.expiresAt)}function cP(){return ae.trace?.(s,"skipping audit record",we.recordId),j||(j=setTimeout(()=>{j=null,(Ln||0)+Uk/2<We&&(og&&ae.trace?.(s,"sending skipped sequence update",We),e.send((0,et.encode)([Lk,We])))},Uk).unref()),new Promise(setImmediate)}a(cP,"skipAuditRecord");let sA=Us.typedStructs,iA=Us.structures;if((sA?.length!=At.typed_length||iA?.length!=At.structure_length)&&(At.typed_length=sA?.length,At.structure_length=iA.length,ae.debug?.(s,"send table struct",At.typed_length,At.structure_length),At.sentName||(At.sentName=!0),e.send((0,et.encode)([DO,{typedStructs:sA,structures:iA,attributes:as.attributes,schemaDefined:as.schemaDefined},Rr,At.table.tableName]))),lc&&!Gd[lc]&&(e.send((0,et.encode)([Pk,nA,lc])),Gd[lc]=!0),bp)K(bp.length),m(bp);else{let xs=we.encoded;we.extendedType&pn&&Nf(()=>we.getValue(Nt),jd=>oc(jd,we.recordId),Nt.rootStore);let zd=xs[0]===66?8:0;K(xs.length-zd),m(xs,zd),ae.trace?.("wrote record",we.recordId,"length:",xs.length)}return e._socket.writableNeedDrain?new Promise(xs=>{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",xs)}):Bt>Ap?new Promise(xs=>{dt=xs}):new Promise(setImmediate)},"sendAuditRecord"),yp=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 HO.EventEmitter,Ir.once("close",()=>{ue=!0,Y?.end()});for(let{startTime:we}of Dn)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 Dn){let At=zE(kt,d);ae.debug?.("subscription to",kt,"using local id",At,"starting",Ot),Pe[At]={startTime:Ot,endTime:Rr}}Wd(u),wr||(wr=ol(kt=>{kt.databaseName===u&&Wd(u)}),Fd=W_(kt=>{kt===u&&(e.send((0,et.encode)([Hu])),sn())}),e.on("close",()=>{wr?.remove(),Fd?.remove()})),e.send((0,et.encode)([Ck,B_(p.auditStore),Dn.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=ug(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 Us=Nc(Nt.version,as.tableId,Nt.key,null,Rr,null,"put",Nf(()=>as.primaryStore.encoder.encode(Nt.value),Gl=>oc(Gl,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:Us,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 jk(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)==cg){w.position++,T=x=w.readFloat64(),h[UO]=T,h[xO]=Date.now(),h[BO]=Yk,ae.trace?.("received remote sequence update",T,u);break}let H=w.position,U=Pt(A,H,H+N),Q=sc[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;pm(()=>{I={table:Q.name,id:k,type:U.type,nodeId:ic.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[UO]=U.version,h[xO]=Date.now(),h[BO]=Wk,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>tA&&!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)([Mk,O])),ae.trace?.(s,"sent confirmation of a commit at",O),O=null},_se)),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",Pn),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-q,t.isSubscriptionConnection&&tl({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 oc(A,w){let b=_m(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)([sg,{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)([sg,{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)([sg,{fileId:b,finished:!0,error:I.toString()},Buffer.alloc(0)]))}finally{Cr.delete(b),Bt--,Bt<Ap&&dt?.()}}a(oc,"sendBlobs");function Kd(A,w){let b=_m(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 MO.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&&zE(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&&zE(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&&ig)try{new URL(ig).hostname===I.name&&E===I.name?(ae.warn?.(`Requesting full copy of database ${u} from ${ig}`),J=0):J=Date.now()-6e4}catch(k){ae.error?.("Error parsing leader URL",ig,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)([wk,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 Rp(w,A),!0}a(zo,"setDatabase");function Rp(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)([Ik,A,w,I]))}a(Rp,"sendNodeDBName");function Wd(A){let w=Ze()?.[A],b=[];for(let I in w){if(Dn&&!Dn.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)([vk,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 ac=1,cc=[];return{end(){Wi&&Wi.end(),Ir&&Ir.emit("close")},getRecord(A){let w=ac++;return new Promise((b,I)=>{let x=[Dk,w,A.table.tableId,A.id];cc[A.table.tableId]||(x.push(A.table.tableName),cc[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=ac++;return A.requestId=w,e.send((0,et.encode)([vO,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 Hk,et,kk,Fk,ae,HO,Gk,qk,sl,$k,MO,Vk,wk,Ik,Ck,Hu,Pk,DO,Dk,rg,vO,ng,Lk,Mk,vk,sg,Kk,UO,xO,K_,BO,Yk,Wk,fse,ig,kO,ba,og,Uk,_se,xk,LO,ag,Bk,ku,FO=be(()=>{Ue();so();hO();GO();Es();Hk=M(ce());G();su();et=require("msgpackr"),kk=require("ws"),Fk=require("worker_threads"),ae=M(mi());q_();HO=require("events"),Gk=M(Zs()),qk=M(require("node:tls"));el();sl=M(require("node:process")),$k=require("node:net");Ci();_s();MO=require("node:stream"),Vk=M(require("minimist")),wk=129,Ik=140,Ck=141,Hu=142,Pk=130,DO=132,Dk=133,rg=134,vO=136,ng=137,Lk=143,Mk=144,vk=145,sg=146,Kk=0,UO=1,xO=2,K_=3,BO=4,Yk=0,Wk=1,fse=(0,Vk.default)(sl.argv),ig=fse.HDB_LEADER_URL??sl.env.HDB_LEADER_URL,kO=new Map,ba=new Map,og=!0,Uk=300,_se=2,xk=3e4;a(lg,"createWebSocket");Bk=500,ku=class extends HO.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=Bk;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await lg(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;ae.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${sl.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=Bk,this.nodeSubscriptions&&tl({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&&Uu({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:()=>Rse,disableReplication:()=>Ese,enabled_databases:()=>ya,forEachReplicatedDatabase:()=>ma,getThisNodeId:()=>ug,getThisNodeName:()=>tt,getThisNodeUrl:()=>Ea,hostnameToUrl:()=>pg,lastTimeInAuditStore:()=>H_,monitorNodeCAs:()=>nF,replicateOperation:()=>bse,replication_certificate_authorities:()=>So,sendOperationToNode:()=>z_,servers:()=>pse,setReplicator:()=>iF,start:()=>mse,startOnMainThread:()=>gO,subscribeToNode:()=>G_,unsubscribeFromNode:()=>XE,urlToNodeName:()=>Qs});function mse(e){if(e.port||(e.port=Ss.default.get(B.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=Ss.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);gse(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"&&ar.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&&ar.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=ir().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)){ar.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else ar.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:ar.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=hg.createSecureContext(u)}catch(l){ar.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Ss.default.get(B.REPLICATION_ENABLEROOTCAS)!==!1&&i()}nF(()=>{for(let s of n)s()})}function nF(e){let t=0;Mu(r=>{r?.ca&&(So.add(r.ca),So.size!==t&&(t=So.size,e?.()))})}function Ese(e=!0){rF=e}function gse(e){rF||(Ze(),ya=e.databases,ma(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||ba;for(let[s,i]of fg){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];iF(r,s,e),kO.get(s)?.forEach(i=>i(s))}}))}function iF(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 sF 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(ar.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new xn,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 _=Tse(h,sF.subscription,e);_?.isConnected&&!u.has(_)&&(!f||_.latency<f.latency)&&(f=_)}if(!f)throw l||new eF.ServerError("No connection to any other nodes are available",502);let d={requestId:hse++,table:t,entry:i,id:i.key};u.add(f);try{return await f.getRecord(d)}catch(h){if(f.isConnected)throw h;ar.warn("Error in load from node",_g,h),l||(l=h)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function Sse(e,t,r,n,s){let i=fg.get(e);i||(i=new Map,fg.set(e,i));let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new ku(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function Tse(e,t,r){let n=Qk.get(e);n||(n=new Map,Qk.set(e,n));let s=n.get(r);if(s)return s;let i=ir().primaryStore.get(e);return i?.url&&(s=new ku(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 lg(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=>{ar.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function G_(e){try{tF.isMainThread&&ar.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=>{ar.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,ba.set(e.database,t)}let r=Sse(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){ar.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function XE({name:e,url:t,database:r}){ar.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(ir().primaryStore.getRange({})));let n=fg.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Ase(){if(qO!==void 0)return qO;let e=Ss.default.get(B.OPERATIONSAPI_TLS_CERTIFICATE)||Ss.default.get(B.TLS_CERTIFICATE);if(e)return qO=new Xk.X509Certificate((0,Zk.readFileSync)(e)).subject.match(/CN=(.*)/)?.[1]??null}function tt(){return _g||(_g=Ss.default.get("replication_hostname")??Qs(Ss.default.get("replication_url"))??Ase()??Jk("operationsapi_network_secureport")??Jk("operationsapi_network_port")??"127.0.0.1")}function Rse(){_g=void 0}function Jk(e){let t=Ss.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function dg(e){let t=Ss.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function ug(e){return B_(e)?.[tt()]}function Ea(){let e=Ss.default.get("replication_url");return e||pg(tt())}function pg(e){let t=dg("replication_port");if(t)return`ws://${e}:${t}`;if(t=dg("replication_secureport"),t)return`wss://${e}:${t}`;if(t=dg("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=dg("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)}),ol((n,s)=>{r(n.databaseName)});function r(n){let s=Ye[n];ar.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):yse(n)&&t(s,n,!1)}a(r,"forDatabase")}function yse(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 bse(e){let t={message:""};if(e.replicated){e.replicated=!1,ar.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 Ss,ar,Xk,Zk,hg,eF,tF,rF,hse,pse,So,ya,fg,Qk,qO,_g,Es=be(()=>{Ue();sa();Wl();FO();Dr();Ss=M(ce()),ar=M(X()),Xk=require("crypto"),Zk=require("fs");q_();el();G();hO();hg=M(require("node:tls")),eF=M(he()),tF=require("worker_threads"),hse=1,pse=[],So=Ss.default.get(B.REPLICATION_ENABLEROOTCAS)!==!1?new Set(hg.rootCertificates):new Set;a(mse,"start");a(nF,"monitorNodeCAs");a(Ese,"disableReplication");a(gse,"assignReplicationSource");a(iF,"setReplicator");fg=new Map;a(Sse,"getSubscriptionConnection");Qk=new Map;a(Tse,"getRetrievalConnectionByName");a(z_,"sendOperationToNode");a(G_,"subscribeToNode");a(XE,"unsubscribeFromNode");a(Ase,"getCommonNameFromCert");a(tt,"getThisNodeName");a(Rse,"clearThisNodeName");Object.defineProperty(Ke,"hostname",{get(){return tt()}});a(Jk,"getHostFromListeningPort");a(dg,"getPortFromListeningPort");a(ug,"getThisNodeId");Ke.replication={getThisNodeId:ug,exportIdMapping:B_};a(Ea,"getThisNodeUrl");a(pg,"hostnameToUrl");a(Qs,"urlToNodeName");a(ma,"forEachReplicatedDatabase");a(yse,"hasExplicitlyReplicatedTable");a(H_,"lastTimeInAuditStore");a(bse,"replicateOperation")});var Tg=P((UIe,uF)=>{"use strict";var Fu=gH(),{validateBySchema:j_}=st(),{common_validators:Gu,schema_regex:$O}=Ri(),cr=require("joi"),Ose=X(),Nse=require("uuid").v4,gg=_o(),qu=(G(),D($)),wse=require("util"),Oa=qn(),{handleHDBError:To,hdb_errors:Ise,ClientError:Q_}=he(),{HDB_ERROR_MSGS:mg,HTTP_STATUS_CODES:Ao}=Ise,{SchemaEventMsg:Sg}=Ks(),oF=sr(),{getDatabases:Cse}=(Ue(),D(ct)),{transformReq:$u}=oe(),{replicateOperation:aF}=(Es(),D(Ra)),Eg=cr.string().min(1).max(Gu.schema_length.maximum).pattern($O).messages({"string.pattern.base":"{:#label} "+Gu.schema_format.message}),Pse=cr.string().min(1).max(Gu.schema_length.maximum).pattern($O).messages({"string.pattern.base":"{:#label} "+Gu.schema_format.message}).required(),Dse=cr.string().min(1).max(Gu.schema_length.maximum).pattern($O).messages({"string.pattern.base":"{:#label} "+Gu.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();uF.exports={createSchema:Lse,createSchemaStructure:cF,createTable:Mse,createTableStructure:lF,createAttribute:Hse,dropSchema:vse,dropTable:Use,dropAttribute:xse,getBackup:kse};async function Lse(e){let t=await cF(e);return gg.signalSchemaChange(new Sg(process.pid,e.operation,e.schema)),t}a(Lse,"createSchema");async function cF(e){let t=j_(e,cr.object({database:Eg,schema:Eg}));if(t)throw new Q_(t.message);if($u(e),!await Fu.checkSchemaExists(e.schema))throw To(new Error,mg.SCHEMA_EXISTS_ERR(e.schema),Ao.BAD_REQUEST,qu.LOG_LEVELS.ERROR,mg.SCHEMA_EXISTS_ERR(e.schema),!0);return await Oa.createSchema(e),`database '${e.schema}' successfully created`}a(cF,"createSchemaStructure");async function Mse(e){return $u(e),e.hash_attribute=e.primary_key??e.hash_attribute,await lF(e)}a(Mse,"createTable");async function lF(e){let t=j_(e,cr.object({database:Eg,schema:Eg,table:Pse,residence:cr.array().items(cr.string().min(1)).optional(),hash_attribute:Dse}));if(t)throw new Q_(t.message);if(!await Fu.checkSchemaTableExists(e.schema,e.table))throw To(new Error,mg.TABLE_EXISTS_ERR(e.schema,e.table),Ao.BAD_REQUEST,qu.LOG_LEVELS.ERROR,mg.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Nse(),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(lF,"createTableStructure");async function vse(e){let t=j_(e,cr.object({database:cr.string(),schema:cr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Q_(t.message);$u(e);let r=await Fu.checkSchemaExists(e.schema);if(r)throw To(new Error,r,Ao.NOT_FOUND,qu.LOG_LEVELS.ERROR,r,!0);let n=await Fu.schema_describe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await Oa.dropSchema(e),gg.signalSchemaChange(new Sg(process.pid,e.operation,e.schema)),await oF.purgeSchemaTableStreams(e.schema,s);let i=await aF(e);return i.message=`successfully deleted '${e.schema}'`,i}a(vse,"dropSchema");async function Use(e){let t=j_(e,cr.object({database:cr.string(),schema:cr.string(),table:cr.string().required()}));if(t)throw new Q_(t.message);$u(e);let r=await Fu.checkSchemaTableExists(e.schema,e.table);if(r)throw To(new Error,r,Ao.NOT_FOUND,qu.LOG_LEVELS.ERROR,r,!0);await Oa.dropTable(e),await oF.purgeTableStream(e.schema,e.table);let n=await aF(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(Use,"dropTable");async function xse(e){let t=j_(e,cr.object({database:cr.string(),schema:cr.string(),table:cr.string().required(),attribute:cr.string().required()}));if(t)throw new Q_(t.message);$u(e);let r=await Fu.checkSchemaTableExists(e.schema,e.table);if(r)throw To(new Error,r,Ao.NOT_FOUND,qu.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(qu.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),Bse(e),gg.signalSchemaChange(new Sg(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw Ose.error(`Got an error deleting attribute ${wse.inspect(e)}.`),n}}a(xse,"dropAttribute");function Bse(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(Bse,"dropAttributeFromGlobal");async function Hse(e){$u(e);let t=Cse()[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),gg.signalSchemaChange(new Sg(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(Hse,"createAttribute");function kse(e){return Oa.getBackup(e)}a(kse,"getBackup")});var fF=P((BIe,dF)=>{"use strict";var{OPERATIONS_ENUM:Fse}=(G(),D($)),VO=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Fse.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};dF.exports=VO});var KO=P((FIe,EF)=>{"use strict";var Gse=qn(),kIe=fF(),Ag=oe(),Rg=(G(),D($)),qse=ce(),{handleHDBError:_F,hdb_errors:$se}=he(),{HDB_ERROR_MSGS:hF,HTTP_STATUS_CODES:pF}=$se,Vse=Object.values(Rg.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),mF="To use this operation audit log must be enabled in harperdb-config.yaml";EF.exports=Kse;async function Kse(e){if(Ag.isEmpty(e.schema))throw new Error(hF.SCHEMA_REQUIRED_ERR);if(Ag.isEmpty(e.table))throw new Error(hF.TABLE_REQUIRED_ERR);if(!qse.get(Rg.CONFIG_PARAMS.LOGGING_AUDITLOG))throw _F(new Error,mF,pF.BAD_REQUEST,Rg.LOG_LEVELS.ERROR,mF,!0);let t=Ag.checkSchemaTableExist(e.schema,e.table);if(t)throw _F(new Error,t,pF.NOT_FOUND,Rg.LOG_LEVELS.ERROR,t,!0);if(!Ag.isEmpty(e.search_type)&&Vse.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await Gse.readAuditLog(e)}a(Kse,"readAuditLog")});var SF=P((qIe,gF)=>{"use strict";var{OPERATIONS_ENUM:Yse}=(G(),D($)),YO=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Yse.GET_BACKUP,this.schema=t,this.table=r}};gF.exports=YO});var RF=P((YIe,AF)=>{"use strict";var Wse=qn(),VIe=SF(),WO=oe(),zse=(G(),D($)),KIe=ce(),{handleHDBError:jse,hdb_errors:Qse}=he(),{HDB_ERROR_MSGS:TF,HTTP_STATUS_CODES:Jse}=Qse;AF.exports=Xse;async function Xse(e){if(WO.isEmpty(e.schema))throw new Error(TF.SCHEMA_REQUIRED_ERR);if(WO.isEmpty(e.table))throw new Error(TF.TABLE_REQUIRED_ERR);let t=WO.checkSchemaTableExist(e.schema,e.table);if(t)throw jse(new Error,t,Jse.NOT_FOUND,zse.LOG_LEVELS.ERROR,t,!0);return await Wse.getBackup(read_audit_log_object)}a(Xse,"getBackup")});var NF=P((zIe,OF)=>{"use strict";var Zse=ce(),Na=require("joi"),eie=st(),yF=require("moment"),tie=require("fs-extra"),zO=require("path"),rie=require("lodash"),J_=(G(),D($)),{LOG_LEVELS:al}=(G(),D($)),nie="YYYY-MM-DD hh:mm:ss",sie=zO.resolve(__dirname,"../logs");OF.exports=function(e){return eie.validateBySchema(e,iie)};var iie=Na.object({from:Na.custom(bF),until:Na.custom(bF),level:Na.valid(al.NOTIFY,al.FATAL,al.ERROR,al.WARN,al.INFO,al.DEBUG,al.TRACE),order:Na.valid("asc","desc"),limit:Na.number().min(1),start:Na.number().min(0),log_name:Na.custom(oie)});function bF(e,t){if(yF(e,yF.ISO_8601).format(nie)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(bF,"validateDatetime");function oie(e,t){if(rie.invert(J_.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Zse.get(J_.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?J_.LOG_NAMES.HDB:e,i=s===J_.LOG_NAMES.INSTALL?zO.join(sie,J_.LOG_NAMES.INSTALL):zO.join(n,s);return tie.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(oie,"validateReadLogPath")});var QO=P((QIe,IF)=>{"use strict";var yg=(G(),D($)),aie=X(),cie=ce(),lie=NF(),jO=require("path"),wF=require("fs-extra"),{once:uie}=require("events"),{handleHDBError:die,hdb_errors:fie}=he(),{PACKAGE_ROOT:_ie}=Et(),hie=jO.join(_ie,"logs"),pie=1e3,mie=200;IF.exports=Eie;async function Eie(e){let t=lie(e);if(t)throw die(t,t.message,fie.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=cie.get(yg.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?yg.LOG_NAMES.HDB:e.log_name,s=n===yg.LOG_NAMES.INSTALL?jO.join(hie,yg.LOG_NAMES.INSTALL):jO.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?pie: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(wF.statSync(s).size-(p+5)*mie,0));let g=wF.createReadStream(s,{start:S});g.on("error",F=>{aie.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 uie(g,"close"),E}a(Eie,"readLog");function wa(e,t,r){t==="desc"?gie(e,r):t==="asc"?Sie(e,r):r.push(e)}a(wa,"pushLineToResult");function gie(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(gie,"insertDescending");function Sie(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(Sie,"insertAscending")});var bg=P((rCe,LF)=>{"use strict";var JO=require("joi"),{string:Vu,boolean:CF,date:Tie}=JO.types(),Aie=st(),{validateSchemaExists:XIe,validateTableExists:ZIe,validateSchemaName:eCe}=Ri(),Rie=(G(),D($)),yie=Dt(),PF=ce();PF.initSync();var tCe=Vu.invalid(PF.get(Rie.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(yie.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),DF={operation:Vu.valid("add_node","update_node","set_node_replication"),node_name:Vu.optional(),subscriptions:JO.array().items({table:Vu.optional(),schema:Vu.optional(),database:Vu.optional(),subscribe:CF.required(),publish:CF.required().custom(Oie),start_time:Tie.iso()})};function bie(e){return Aie.validateBySchema(e,JO.object(DF))}a(bie,"addUpdateNodeValidator");function Oie(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(Oie,"checkForFalsy");LF.exports={addUpdateNodeValidator:bie,validation_schema:DF}});var Ku=P((sCe,MF)=>{"use strict";var XO=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}};MF.exports={Node:XO,NodeSubscription:ZO}});var UF=P((oCe,vF)=>{"use strict";var Nie=(G(),D($)).OPERATIONS_ENUM,eN=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Nie.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};vF.exports=eN});var X_=P((cCe,xF)=>{"use strict";var tN=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},rN=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)}};xF.exports={RemotePayloadObject:tN,RemotePayloadSubscription:rN}});var HF=P((uCe,BF)=>{"use strict";var nN=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}};BF.exports=nN});var FF=P((mCe,kF)=>{"use strict";var wie=HF(),fCe=Ft(),_Ce=ht(),Iie=X(),{getSchemaPath:hCe,getTransactionAuditStorePath:pCe}=gt(),{getDatabases:Cie}=(Ue(),D(ct));kF.exports=Pie;async function Pie(e){let t=new wie;try{let r=Cie()[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){Iie.warn(`unable to stat table dbi due to ${r}`)}return t}a(Pie,"lmdbGetTableSize")});var qF=P((gCe,GF)=>{"use strict";var sN=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}};GF.exports=sN});var Wu=P((bCe,YF)=>{"use strict";var Die=require("fs-extra"),Lie=require("path"),jr=require("systeminformation"),Ia=X(),$F=sr(),TCe=Dt(),Yu=(G(),D($)),Mie=FF(),vie=uo(),{getThreadInfo:VF}=it(),Z_=ce();Z_.initSync();var Uie=qF(),{openEnvironment:ACe}=ht(),{getSchemaPath:RCe}=gt(),{database:yCe,databases:iN}=(Ue(),D(ct)),Og;YF.exports={getHDBProcessInfo:lN,getNetworkInfo:dN,getDiskInfo:uN,getMemoryInfo:cN,getCPUInfo:aN,getTimeInfo:oN,getSystemInformation:fN,systemInformation:xie,getTableSize:_N,getMetrics:hN};function oN(){return jr.time()}a(oN,"getTimeInfo");async function aN(){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(aN,"getCPUInfo");async function cN(){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(cN,"getMemoryInfo");async function lN(){let e={core:[],clustering:[]};try{let t=await jr.processes(),r;try{r=Number.parseInt(await Die.readFile(Lie.join(Z_.get(Yu.CONFIG_PARAMS.ROOTPATH),Yu.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===Yu.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(lN,"getHDBProcessInfo");async function uN(){let e={};try{if(!Z_.get(Yu.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(uN,"getDiskInfo");async function dN(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Z_.get(Yu.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(dN,"getNetworkInfo");async function fN(){if(Og!==void 0)return Og;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,Og=e,Og}catch(t){return Ia.error(`error in getSystemInformation: ${t}`),e}}a(fN,"getSystemInformation");async function _N(){let e=[],t=await vie.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await Mie(n));return e}a(_N,"getTableSize");async function hN(){let e={};for(let t in iN){let r=e[t]={},n=r.tables={};for(let s in iN[t])try{let i=iN[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(hN,"getMetrics");async function KF(){if(Z_.get(Yu.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await $F.getNATSReferences(),t=await $F.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(KF,"getNatsStreamInfo");async function xie(e){let t=new Uie;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await fN(),t.time=oN(),t.cpu=await aN(),t.memory=await cN(),t.disk=await uN(),t.network=await dN(),t.harperdb_processes=await lN(),t.table_size=await _N(),t.metrics=await hN(),t.threads=await VF(),t.replication=await KF(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await fN();break;case"time":t.time=oN();break;case"cpu":t.cpu=await aN();break;case"memory":t.memory=await cN();break;case"disk":t.disk=await uN();break;case"network":t.network=await dN();break;case"harperdb_processes":t.harperdb_processes=await lN();break;case"table_size":t.table_size=await _N();break;case"database_metrics":case"metrics":t.metrics=await hN();break;case"threads":t.threads=await VF();break;case"replication":t.replication=await KF();break;default:break}return t}a(xie,"systemInformation")});var Ro=P((CCe,QF)=>{"use strict";var Bie=Sn(),pN=oe(),Hie=require("util"),cl=(G(),D($)),WF=ce();WF.initSync();var kie=Wb(),zF=Vr(),{Node:NCe,NodeSubscription:wCe}=Ku(),Fie=pu(),Gie=UF(),{RemotePayloadObject:qie,RemotePayloadSubscription:$ie}=X_(),{handleHDBError:Vie,hdb_errors:Kie}=he(),{HTTP_STATUS_CODES:Yie,HDB_ERROR_MSGS:Wie}=Kie,zie=Ys(),jie=Wu(),{packageJson:Qie}=Et(),{getDatabases:Jie}=(Ue(),D(ct)),ICe=Hie.promisify(kie.authorize),Xie=zF.searchByHash,Zie=zF.searchByValue;QF.exports={isEmpty:eoe,getNodeRecord:toe,upsertNodeRecord:roe,buildNodePayloads:noe,checkClusteringEnabled:soe,getAllNodeRecords:ioe,getSystemInfo:ooe,reverseSubscription:jF};function eoe(e){return e==null}a(eoe,"isEmpty");async function toe(e){let t=new Fie(cl.SYSTEM_SCHEMA_NAME,cl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Xie(t)}a(toe,"getNodeRecord");async function roe(e){let t=new Gie(cl.SYSTEM_SCHEMA_NAME,cl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Bie.upsert(t)}a(roe,"upsertNodeRecord");function jF(e){if(pN.isEmpty(e.subscribe)||pN.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(jF,"reverseSubscription");function noe(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=pN.getTableHashAttribute(l,u),{subscribe:d,publish:h}=jF(c),_=Jie()[l]?.[u],p=new $ie(l,u,f,h,d,c.start_time,_.schemaDefined?_.attributes:void 0);s.push(p)}return new qie(r,t,s,n)}a(noe,"buildNodePayloads");function soe(){if(!WF.get(cl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw Vie(new Error,Wie.CLUSTERING_NOT_ENABLED,Yie.BAD_REQUEST,void 0,void 0,!0)}a(soe,"checkClusteringEnabled");async function ioe(){let e=new zie(cl.SYSTEM_SCHEMA_NAME,cl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await Zie(e))}a(ioe,"getAllNodeRecords");async function ooe(){let e=await jie.getSystemInformation();return{hdb_version:Qie.version,node_version:e.node_version,platform:e.platform}}a(ooe,"getSystemInfo")});var mN=P((DCe,sG)=>{"use strict";var Ng=sr(),JF=oe(),XF=Dt(),ZF=(G(),D($)),wg=X(),eG=Tg(),aoe=d_(),{RemotePayloadObject:coe}=X_(),{handleHDBError:tG,hdb_errors:loe}=he(),{HTTP_STATUS_CODES:rG}=loe,{NodeSubscription:nG}=Ku();sG.exports=uoe;async function uoe(e,t){let r;try{r=await Ng.request(`${t}.${XF.REQUEST_SUFFIX}`,new coe(ZF.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),wg.trace("Response from remote describe all request:",r)}catch(o){wg.error(`addNode received error from describe all request to remote node: ${o}`);let c=Ng.requestErrorHandler(o,"add_node",t);throw tG(new Error,c,rG.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===XF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw tG(new Error,o,rG.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===ZF.SYSTEM_SCHEMA_NAME){await Ng.createLocalTableStream(l,c);let p=new nG(l,c,o.publish,o.subscribe);p.start_time=o.start_time,i.push(p);continue}let u=JF.doesSchemaExist(l),f=n[l]!==void 0,d=c?JF.doesTableExist(l,c):!0,h=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!f||!d&&!h){s.push(o);continue}if(!u&&f&&(wg.trace(`addNode creating schema: ${l}`),await eG.createSchema({operation:"create_schema",schema:l})),!d&&h){wg.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let p=new aoe(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(p.attributes=n[l][c].attributes),await eG.createTable(p)}await Ng.createLocalTableStream(l,c);let _=new nG(l,c,o.publish,o.subscribe);_.start_time=o.start_time,i.push(_)}return{added:i,skipped:s}}a(uoe,"reviewSubscriptions")});var ll={};Be(ll,{addNodeBack:()=>poe,removeNodeBack:()=>moe,setNode:()=>hoe});async function hoe(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=pg(r);let n=(0,oG.validateBySchema)(e,_oe);if(n)throw(0,yo.handleHDBError)(n,n.message,foe.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=ir(),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,Ts.getReplicationCert)();let _=await(0,Ts.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,Ts.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(iG):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let _=iG(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,Ts.setCertTable)({name:doe.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ts.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 poe(e){jn.trace("addNodeBack received request:",e);let t=await(0,Ts.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,Ts.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 moe(e){jn.trace("removeNodeBack received request:",e),await ir().delete(e.name)}function iG(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ts,oG,Ca,Pa,jn,yo,doe,foe,_oe,ul=be(()=>{Ts=M(Zs()),oG=M(st()),Ca=M(require("joi")),Pa=M(ce());G();q_();el();Es();jn=M(X()),yo=M(he()),{pki:doe}=require("node-forge"),{HTTP_STATUS_CODES:foe}=yo.hdb_errors,_oe=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(hoe,"setNode");a(poe,"addNodeBack");a(moe,"removeNodeBack");a(iG,"reverseSubscription")});var Lg=P((FCe,cG)=>{"use strict";var{handleHDBError:Ig,hdb_errors:Eoe}=he(),{HTTP_STATUS_CODES:Cg}=Eoe,{addUpdateNodeValidator:goe}=bg(),Pg=X(),Dg=(G(),D($)),aG=Dt(),Soe=oe(),eh=sr(),th=Ro(),EN=ce(),Toe=mN(),{Node:Aoe,NodeSubscription:Roe}=Ku(),{broadcast:yoe}=it(),{setNode:boe}=(ul(),D(ll)),HCe=ce(),kCe=(G(),D($)),Ooe="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Noe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",woe=EN.get(Dg.CONFIG_PARAMS.CLUSTERING_NODENAME);cG.exports=Ioe;async function Ioe(e,t=!1){if(Pg.trace("addNode called with:",e),EN.get(Dg.CONFIG_PARAMS.REPLICATION_URL)||EN.get(Dg.CONFIG_PARAMS.REPLICATION_HOSTNAME))return boe(e);th.checkClusteringEnabled();let r=goe(e);if(r)throw Ig(r,r.message,Cg.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let d=await th.getNodeRecord(n);if(!Soe.isEmptyOrZeroLength(d))throw Ig(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,Cg.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Toe(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=Ooe,o;let c=th.buildNodePayloads(s,woe,Dg.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 Roe(_.schema,_.table,_.publish,_.subscribe))}Pg.trace("addNode sending remote payload:",c);let u;try{u=await eh.request(`${n}.${aG.REQUEST_SUFFIX}`,c)}catch(d){Pg.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 Ig(new Error,h,Cg.INTERNAL_SERVER_ERROR,"error",h)}if(u.status===aG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${n}: ${u.message}`;throw Ig(new Error,d,Cg.INTERNAL_SERVER_ERROR,"error",d)}Pg.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 Aoe(n,l,u.system_info);return await th.upsertNodeRecord(f),yoe({type:"nats_update"}),i.length>0?o.message=Noe:o.message=`Successfully added '${n}' to manifest`,o}a(Ioe,"addNode")});var AN=P(($Ce,uG)=>{"use strict";var{handleHDBError:gN,hdb_errors:Coe}=he(),{HTTP_STATUS_CODES:SN}=Coe,{addUpdateNodeValidator:Poe}=bg(),rh=X(),Mg=(G(),D($)),lG=Dt(),qCe=oe(),nh=sr(),sh=Ro(),TN=ce(),{cloneDeep:Doe}=require("lodash"),Loe=mN(),{Node:Moe,NodeSubscription:voe}=Ku(),{broadcast:Uoe}=it(),{setNode:xoe}=(ul(),D(ll)),Boe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",Hoe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",koe=TN.get(Mg.CONFIG_PARAMS.CLUSTERING_NODENAME);uG.exports=Foe;async function Foe(e){if(rh.trace("updateNode called with:",e),TN.get(Mg.CONFIG_PARAMS.REPLICATION_URL)??TN.get(Mg.CONFIG_PARAMS.REPLICATION_HOSTNAME))return xoe(e);sh.checkClusteringEnabled();let t=Poe(e);if(t)throw gN(t,t.message,SN.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await sh.getNodeRecord(r);s.length>0&&(n=Doe(s));let{added:i,skipped:o}=await Loe(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=Boe,c;let l=sh.buildNodePayloads(i,koe,Mg.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}.${lG.REQUEST_SUFFIX}`,l)}catch(f){rh.error(`updateNode received error from request: ${f}`);let d=nh.requestErrorHandler(f,"update_node",r);throw gN(new Error,d,SN.INTERNAL_SERVER_ERROR,"error",d)}if(u.status===lG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${r}: ${u.message}`;throw gN(new Error,f,SN.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 Moe(r,[],u.system_info)]),await Goe(n[0],i,u.system_info),o.length>0?c.message=Hoe:c.message=`Successfully updated '${r}'`,c}a(Foe,"updateNode");async function Goe(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 voe(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await sh.upsertNodeRecord(n),Uoe({type:"nats_update"})}a(Goe,"updateNodeTable")});var pG=P((KCe,hG)=>{"use strict";var _G=require("joi"),{string:dG}=_G.types(),qoe=st(),fG=(G(),D($)),$oe=ce(),Voe=Dt();hG.exports=Koe;function Koe(e){let t=dG.invalid($oe.get(fG.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(Voe.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=_G.object({operation:dG.valid(fG.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return qoe.validateBySchema(e,r)}a(Koe,"removeNodeValidator")});var vg=P((WCe,TG)=>{"use strict";var{handleHDBError:mG,hdb_errors:Yoe}=he(),{HTTP_STATUS_CODES:EG}=Yoe,Woe=pG(),ih=X(),gG=Ro(),zoe=oe(),zu=(G(),D($)),SG=Dt(),RN=sr(),yN=ce(),{RemotePayloadObject:joe}=X_(),{NodeSubscription:Qoe}=Ku(),Joe=u_(),Xoe=Bc(),{broadcast:Zoe}=it(),{setNode:eae}=(ul(),D(ll)),tae=yN.get(zu.CONFIG_PARAMS.CLUSTERING_NODENAME);TG.exports=rae;async function rae(e){if(ih.trace("removeNode called with:",e),yN.get(zu.CONFIG_PARAMS.REPLICATION_URL)??yN.get(zu.CONFIG_PARAMS.REPLICATION_HOSTNAME))return eae(e);gG.checkClusteringEnabled();let t=Woe(e);if(t)throw mG(t,t.message,EG.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await gG.getNodeRecord(r);if(zoe.isEmptyOrZeroLength(n))throw mG(new Error,`Node '${r}' was not found.`,EG.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new joe(zu.OPERATIONS_ENUM.REMOVE_NODE,tae,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let f=n.subscriptions[l];f.subscribe===!0&&await RN.updateConsumerIterator(f.schema,f.table,r,"stop");try{await RN.updateRemoteConsumer(new Qoe(f.schema,f.table,!1,!1),r)}catch(d){ih.error(d)}}try{i=await RN.request(`${r}.${SG.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 Joe(zu.SYSTEM_SCHEMA_NAME,zu.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await Xoe.deleteRecord(c),Zoe({type:"nats_update"}),i?.status===SG.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(rae,"removeNode")});var yG=P((jCe,RG)=>{"use strict";var AG=require("joi"),{string:nae,array:sae}=AG.types(),iae=st(),oae=bg();RG.exports=aae;function aae(e){let t=AG.object({operation:nae.valid("configure_cluster").required(),connections:sae.items(oae.validation_schema).required()});return iae.validateBySchema(e,t)}a(aae,"configureClusterValidator")});var bN=P((JCe,IG)=>{"use strict";var bG=(G(),D($)),Ug=X(),cae=oe(),lae=ce(),uae=vg(),dae=Lg(),fae=Ro(),_ae=yG(),{handleHDBError:OG,hdb_errors:hae}=he(),{HTTP_STATUS_CODES:NG}=hae,pae="Configure cluster complete.",mae="Failed to configure the cluster. Check the logs for more details.",Eae="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";IG.exports=gae;async function gae(e){Ug.trace("configure cluster called with:",e);let t=_ae(e);if(t)throw OG(t,t.message,NG.BAD_REQUEST,void 0,void 0,!0);let r=await fae.getAllNodeRecords(),n=[];if(lae.get(bG.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let f=0,d=r.length;f<d;f++){let h=await wG(uae,{operation:bG.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[f].name},r[f].name);n.push(h)}Ug.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 wG(dae,d,d.node_name);s.push(h)}Ug.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"&&(Ug.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(cae.isEmptyOrZeroLength(o))return{message:pae,connections:c};if(l)return{message:Eae,failed_nodes:o,connections:c};throw OG(new Error,mae,NG.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(gae,"configureCluster");async function wG(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(wG,"functionWrapper")});var LG=P((ZCe,DG)=>{"use strict";var oh=require("joi"),Sae=st(),{validateSchemaExists:CG,validateTableExists:Tae,validateSchemaName:PG}=Ri(),Aae=oh.object({operation:oh.string().valid("purge_stream"),schema:oh.string().custom(CG).custom(PG).optional(),database:oh.string().custom(CG).custom(PG).optional(),table:oh.string().custom(Tae).required()});function Rae(e){return Sae.validateBySchema(e,Aae)}a(Rae,"purgeStreamValidator");DG.exports=Rae});var ON=P((tPe,MG)=>{"use strict";var{handleHDBError:yae,hdb_errors:bae}=he(),{HTTP_STATUS_CODES:Oae}=bae,Nae=LG(),wae=sr(),Iae=Ro();MG.exports=Cae;async function Cae(e){e.schema=e.schema??e.database;let t=Nae(e);if(t)throw yae(t,t.message,Oae.BAD_REQUEST,void 0,void 0,!0);Iae.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await wae.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(Cae,"purgeStream")});var IN=P((nPe,FG)=>{"use strict";var wN=Ro(),Pae=sr(),Bg=ce(),ju=(G(),D($)),dl=Dt(),Dae=oe(),NN=X(),{RemotePayloadObject:Lae}=X_(),{ErrorCode:vG}=require("nats"),{parentPort:UG}=require("worker_threads"),{onMessageByType:Mae}=it(),{getThisNodeName:vae}=(Es(),D(Ra)),{requestClusterStatus:Uae}=(q_(),D(nk)),{getReplicationSharedStatus:xae,getHDBNodeTable:Bae}=(el(),D(pO)),{CONFIRMATION_STATUS_POSITION:Hae,RECEIVED_VERSION_POSITION:kae,RECEIVED_TIME_POSITION:Fae,SENDING_TIME_POSITION:Gae,RECEIVING_STATUS_POSITION:qae,RECEIVING_STATUS_RECEIVING:$ae}=(FO(),D(zk)),xG=Bg.get(ju.CONFIG_PARAMS.CLUSTERING_ENABLED),BG=Bg.get(ju.CONFIG_PARAMS.CLUSTERING_NODENAME);FG.exports={clusterStatus:Vae,buildNodeStatus:kG};var HG;Mae("cluster-status",async e=>{HG(e)});async function Vae(){if(Bg.get(ju.CONFIG_PARAMS.REPLICATION_URL)||Bg.get(ju.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(UG){UG.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{HG=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=xae(u,l,o);c.lastCommitConfirmed=xg(f[Hae]),c.lastReceivedRemoteTime=xg(f[kae]),c.lastReceivedLocalTime=xg(f[Fae]),c.sendingMessage=xg(f[Gae]),c.lastReceivedStatus=f[qae]===$ae?"Receiving":"Waiting"}}}else n=Uae();n.node_name=vae();let s=Bae().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:BG,is_enabled:xG,connections:[]};if(!xG)return e;let t=await wN.getAllNodeRecords();if(Dae.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(kG(t[n],e.connections));return await Promise.allSettled(r),e}a(Vae,"clusterStatus");function xg(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}a(xg,"asDate");async function kG(e,t){let r=e.name,n=new Lae(ju.OPERATIONS_ENUM.CLUSTER_STATUS,BG,void 0,await wN.getSystemInfo()),s,i,o=dl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Pae.request(dl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===dl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=dl.CLUSTER_STATUS_STATUSES.CLOSED,NN.error(`Error getting node status from ${r} `,s))}catch(l){NN.warn(`Error getting node status from ${r}`,l),l.code===vG.NoResponders?o=dl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===vG.Timeout?o=dl.CLUSTER_STATUS_STATUSES.TIMEOUT:o=dl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Kae(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!==ju.PRE_4_0_0_VERSION&&await wN.upsertNodeRecord(l)}catch(l){NN.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(kG,"buildNodeStatus");function Kae(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(Kae,"NodeStatusObject")});var PN=P((iPe,GG)=>{"use strict";var{handleHDBError:Yae,hdb_errors:Wae}=he(),{HTTP_STATUS_CODES:zae}=Wae,jae=sr(),Qae=Ro(),CN=oe(),Hg=require("joi"),Jae=st(),Xae=2e3,Zae=Hg.object({timeout:Hg.number().min(1),connected_nodes:Hg.boolean(),routes:Hg.boolean()});GG.exports=ece;async function ece(e){Qae.checkClusteringEnabled();let t=Jae.validateBySchema(e,Zae);if(t)throw Yae(t,t.message,zae.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||CN.autoCastBoolean(n),o=s===void 0||CN.autoCastBoolean(s),c={nodes:[]},l=await jae.getServerList(r??Xae),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:CN.autoCast(S.split(":")[1])})):[]),c.nodes.push(p)}}return c}a(ece,"clusterNetwork")});var KG=P((aPe,VG)=>{"use strict";var DN=require("joi"),qG=st(),{route_constraints:$G}=wA();VG.exports={setRoutesValidator:tce,deleteRoutesValidator:rce};function tce(e){let t=DN.object({server:DN.valid("hub","leaf"),routes:$G.required()});return qG.validateBySchema(e,t)}a(tce,"setRoutesValidator");function rce(e){let t=DN.object({routes:$G.required()});return qG.validateBySchema(e,t)}a(rce,"deleteRoutesValidator")});var kg=P((lPe,XG)=>{"use strict";var bo=It(),LN=oe(),As=(G(),D($)),Qu=ce(),YG=KG(),{handleHDBError:WG,hdb_errors:nce}=he(),{HTTP_STATUS_CODES:zG}=nce,jG="cluster routes successfully set",QG="cluster routes successfully deleted";XG.exports={setRoutes:ice,getRoutes:oce,deleteRoutes:ace};function sce(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=LN.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(As.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):bo.updateConfigValue(As.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:jG,set:i,skipped:s}}a(sce,"setRoutesNats");function ice(e){let t=YG.setRoutesValidator(e);if(t)throw WG(t,t.message,zG.BAD_REQUEST,void 0,void 0,!0);if(Qu.get(As.CONFIG_PARAMS.CLUSTERING_ENABLED))return sce(e);let r=[],n=[],s=Qu.get(As.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{JG(s,i)?n.push(i):(s.push(i),r.push(i))}),bo.updateConfigValue(As.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:jG,set:r,skipped:n}}a(ice,"setRoutes");function JG(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(JG,"existsInArray");function oce(){if(Qu.get(As.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=bo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Qu.get(As.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(oce,"getRoutes");function ace(e){let t=YG.deleteRoutesValidator(e);if(t)throw WG(t,t.message,zG.BAD_REQUEST,void 0,void 0,!0);if(Qu.get(As.CONFIG_PARAMS.CLUSTERING_ENABLED))return cce(e);let r=[],n=[],s=Qu.get(As.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{JG(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),bo.updateConfigValue(As.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:QG,deleted:r,skipped:n}}a(ace,"deleteRoutes");function cce(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=LN.isEmptyOrZeroLength(r)?null:r,bo.updateConfigValue(As.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=LN.isEmptyOrZeroLength(n)?null:n,bo.updateConfigValue(As.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:QG,deleted:s,skipped:i}}a(cce,"deleteRoutesNats")});var eq=P((dPe,ZG)=>{"use strict";var ah=require("alasql"),fl=require("recursive-iterator"),ei=X(),lce=oe(),ch=(G(),D($)),MN=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,dce(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=uce(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 uce(e){return e.filter(t=>t[ch.PERMS_CRUD_ENUM.READ])}a(uce,"filterReadRestrictedAttrs");function dce(e,t,r,n,s){fce(e,t,r,n,s)}a(dce,"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 fce(e,t,r,n,s){if(!e){ei.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof ah.yy.Insert?mce(e,t,r):e instanceof ah.yy.Select?_ce(e,t,r,n,s):e instanceof ah.yy.Update?hce(e,t,r):e instanceof ah.yy.Delete?pce(e,t,r):ei.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(fce,"getRecordAttributesAST");function _ce(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(lce.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 fl(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 fl(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 fl(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 fl(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(_ce,"getSelectAttributes");function hce(e,t,r){if(!e){ei.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new fl(e.columns),s=e.table.databaseid;lh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&vN(e.table.tableid,s,i.columnid,t,r)}a(hce,"getUpdateAttributes");function pce(e,t,r){if(!e){ei.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new fl(e.where),s=e.table.databaseid;lh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&vN(e.table.tableid,s,i.columnid,t,r)}a(pce,"getDeleteAttributes");function mce(e,t,r){if(!e){ei.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new fl(e.columns),s=e.into.databaseid;lh(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&vN(e.into.tableid,s,i.columnid,t,r)}a(mce,"getInsertAttributes");function vN(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(vN,"pushAttribute");ZG.exports=MN});var rq=P((_Pe,tq)=>{"use strict";var Fg=(G(),D($)),Gg=class{static{a(this,"BaseLicense")}constructor(t=0,r=Fg.RAM_ALLOCATION_ENUM.DEFAULT,n=Fg.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},UN=class extends Gg{static{a(this,"ExtendedLicense")}constructor(t=0,r=Fg.RAM_ALLOCATION_ENUM.DEFAULT,n=Fg.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};tq.exports={BaseLicense:Gg,ExtendedLicense:UN}});var Zu=P((pPe,cq)=>{"use strict";var Xu=require("fs-extra"),qg=(Vm(),D($m)),sq=require("crypto"),Ece=require("moment"),gce=require("uuid").v4,Qr=X(),BN=require("path"),Sce=oe(),_l=(G(),D($)),{totalmem:nq}=require("os"),Tce=rq().ExtendedLicense,Ju="invalid license key format",Ace="061183",Rce="mofi25",yce="aes-256-cbc",bce=16,Oce=32,iq=ce(),{resolvePath:oq}=It();iq.initSync();var xN;cq.exports={validateLicense:aq,generateFingerPrint:wce,licenseSearch:FN,getLicense:Pce,checkMemoryLimit:Dce};function HN(){return BN.join(iq.getHdbBasePath(),_l.LICENSE_KEY_DIR_NAME,_l.LICENSE_FILE_NAME)}a(HN,"getLicenseDirPath");function Nce(){let e=HN();return oq(BN.join(e,_l.LICENSE_FILE_NAME))}a(Nce,"getLicenseFilePath");function kN(){let e=HN();return oq(BN.join(e,_l.REG_KEY_FILE_NAME))}a(kN,"getFingerPrintFilePath");async function wce(){let e=kN();try{return await Xu.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Ice();throw Qr.error(`Error writing fingerprint file to ${e}`),Qr.error(t),new Error("There was an error generating the fingerprint")}}a(wce,"generateFingerPrint");async function Ice(){let e=gce(),t=qg.hash(e,qg.HASH_FUNCTION.MD5),r=kN();try{await Xu.mkdirp(HN()),await Xu.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(Ice,"writeFingerprint");function aq(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:_l.RAM_ALLOCATION_ENUM.DEFAULT,version:_l.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return Qr.error("empty license key passed to validate."),r;let n=kN(),s=!1;try{s=Xu.statSync(n)}catch(i){Qr.error(i)}if(s){let i;try{i=Xu.readFileSync(n,"utf8")}catch{Qr.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(Rce),c=o[1];c=Buffer.concat([Buffer.from(c)],bce);let l=Buffer.concat([Buffer.from(i)],Oce),u=sq.createDecipheriv(yce,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 _=Cce(o[0],i);if(_)f=_;else throw r.valid_license=!1,r.valid_machine=!1,console.error(Ju),Qr.error(Ju),new Error(Ju)}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(Ju),Qr.error(Ju),new Error(Ju)}else r.exp_date=f;r.exp_date<Ece().valueOf()&&(r.valid_date=!1),qg.validate(o[1],`${Ace}${i}${t}`,qg.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(aq,"validateLicense");function Cce(e,t){try{let r=sq.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(Cce,"checkOldLicense");function FN(){let e=new Tce,t=[];try{t=Xu.readFileSync(Nce(),"utf-8").split(`\r
|
|
22
|
+
`,"")}a(HH,"runCommand");async function gne(){try{await zre.access(iO)}catch{return!1}let e=await HH(`${iO} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return jre.eq(t,mne)}a(gne,"checkNATSServerInstalled");async function uO(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await xH.getClusterUser();if(Zc(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 ane({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&&kH()}),i}a(uO,"createConnection");function kH(){zr=void 0,Qc=void 0,Jc=void 0,Xc=void 0}a(kH,"clearClientCache");async function Sne(){zr&&(await zr.drain(),zr=void 0,Qc=void 0,Jc=void 0,Xc=void 0)}a(Sne,"closeConnection");var zr,Xc;async function U_(){return Xc||(Xc=uO(Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),zr=await Xc),zr||Xc}a(U_,"getConnection");async function x_(){if(Qc)return Qc;Zc(zr)&&await U_();let{domain:e}=Cu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Zc(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Qc=await zr.jetstreamManager({domain:e,timeout:6e4}),Qc}a(x_,"getJetStreamManager");async function FH(){if(Jc)return Jc;Zc(zr)&&await U_();let{domain:e}=Cu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Zc(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Jc=zr.jetstream({domain:e,timeout:6e4}),Jc}a(FH,"getJetStream");async function Li(){let e=zr||await U_(),t=Qc||await x_(),r=Jc||await FH();return{connection:e,jsm:t,js:r}}a(Li,"getNATSReferences");async function Tne(e){let t=Or.get(je.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await xH.getClusterUser(),s=await uO(t,r,n),i=lO(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=BH.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 VE.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(Tne,"getServerList");async function dO(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:cne.File,retention:lne.Limits,subjects:t,discard:une.Old,max_msgs:s,max_bytes:i,max_age:n})}a(dO,"createLocalStream");async function GH(){let{jsm:e}=await Li(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(GH,"listStreams");async function Ane(e){let{jsm:t}=await Li();await t.streams.delete(e)}a(Ane,"deleteLocalStream");async function Rne(e){let{connection:t}=await Li(),r=[],n=lO(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(BH.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(Rne,"listRemoteStreams");async function yne(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Li(),i=LH(),o={durable_name:i,ack_policy:aO.Explicit};t&&(o.deliver_policy=cO.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=oO(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(yne,"viewStream");async function*bne(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Li(),i=LH(),o={durable_name:i,ack_policy:aO.Explicit};t&&(o.deliver_policy=cO.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=oO(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(bne,"viewStreamIterator");async function One(e,t,r,n){js.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=qH(n,r);let{js:s}=await Li(),i=await YE(),o=`${e}.${i}`,c=await hne(()=>n instanceof Uint8Array?n:UH.encode(n));try{js.trace(`publishToStream publishing to subject: ${o}`),_ne(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 VH(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 dO(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(One,"publishToStream");function qH(e,t){t===void 0&&(t=fne());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(qH,"addNatsMsgHeader");function Cu(e){e=e.toLowerCase();let t=v_.join(Or.get(je.CONFIG_PARAMS.ROOTPATH),pne);if(e===je.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return Zc(sO)&&(sO={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}),sO;if(e===je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return Zc(nO)&&(nO={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}),nO;js.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a(Cu,"getServerConfig");async function $H(e,t,r,n){try{await e.consumers.add(t,{ack_policy:aO.Explicit,durable_name:r,deliver_policy:cO.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a($H,"createConsumer");async function Nne(e,t,r){await e.consumers.delete(t,r)}a(Nne,"removeConsumer");function wne(e){return e.split(".")[1]}a(wne,"extractServerName");async function Ine(e,t,r=6e4,n=lO()){if(!VE.isObject(t))throw new Error("data param must be an object");let s=UH.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 oO(c.data)}a(Ine,"request");function fO(e){return new Promise(async(t,r)=>{let n=Zre(iO,["--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(fO,"reloadNATS");async function Cne(){let{pid_file_path:e}=Cu(je.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await fO(e)}a(Cne,"reloadNATSHub");async function Pne(){let{pid_file_path:e}=Cu(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await fO(e)}a(Pne,"reloadNATSLeaf");function Dne(e,t,r){let n;switch(e.code){case DH.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case DH.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(Dne,"requestErrorHandler");async function Lne(e,t){let r=t+Ur.SERVER_SUFFIX.LEAF,{connection:n}=await Li(),{jsm:s}=await Fne(r),{schema:i,table:o}=e,c=KE.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await VH(async()=>{if(e.subscribe===!0)await $H(s,c,n.info.server_name,l);else try{await Nne(s,c,n.info.server_name)}catch(u){js.trace(u)}})}a(Lne,"updateRemoteConsumer");async function Mne(e,t,r,n){let s=KE.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(!vH&&ine()<Or.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=rO();await c(o)}await nne(o),n==="stop"&&await VE.async_set_timeout(1e3)}a(Mne,"updateConsumerIterator");function VH(e){return rne.writeTransaction(je.SYSTEM_SCHEMA_NAME,je.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(VH,"exclusiveLock");async function KH(e,t){let r=KE.createNatsTableStreamName(e,t),n=await YE(),s=Bne(e,t,n);await dO(r,[s])}a(KH,"createLocalTableStream");async function vne(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await KH(n,s)}}a(vne,"createTableStreams");async function YH(e,t,r=void 0){if(Or.get(je.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=KE.createNatsTableStreamName(e,t),{domain:s}=Cu(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(YH,"purgeTableStream");async function Une(e,t){if(Or.get(je.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await YH(e,t[r])}a(Une,"purgeSchemaTableStreams");async function xne(e){return(await x_()).streams.info(e)}a(xne,"getStreamInfo");function Bne(e,t,r){return`${Ur.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(Bne,"createSubjectName");async function YE(){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(YE,"getJsmServerName");async function Hne(){let e=await x_(),t=await YE(),r=await GH();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=kne(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(Hne,"updateLocalStreams");function kne(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(kne,"updateStreamLimits");async function Fne(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(Fne,"connectToRemoteJS")});function _O(e){let t=e.get(WE),r=t?(0,Pu.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(WE,(0,Pu.pack)(r))}return r}function B_(e){return _O(e).remoteNameToId}function jH(e,t){let r=_O(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(WE,(0,Pu.pack)(r)),s}function zE(e,t){let r=_O(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(WE,(0,Pu.pack)(r))}return zH.trace?.("The remote node name map",e,n,s),s}var zH,Pu,WE,hO=be(()=>{zH=M(mi());Es();Pu=require("msgpackr"),WE=Symbol.for("remote-ids");a(_O,"getIdMappingRecord");a(B_,"exportIdMapping");a(jH,"remoteToLocalNodeId");a(zE,"getIdOfRemoteNode")});var pO={};Be(pO,{commits_awaiting_replication:()=>Lu,getHDBNodeTable:()=>ir,getReplicationSharedStatus:()=>jE,iterateRoutes:()=>F_,shouldReplicateToNode:()=>k_,subscribeToNodeUpdates:()=>Mu});function ir(){return QH||(QH=_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 jE(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Mu(e){ir().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;ek.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 ir().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]&&ir().primaryStore.get(tt())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function Gne(){Mu(e=>{ma({},(t,r)=>{let n=e.name,s=JH.get(n);if(s||JH.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=jE(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of Lu.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=Du.default.get(B.REPLICATION_SECUREPORT)??(!Du.default.get(B.REPLICATION_PORT)&&Du.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||Du.default.get(B.REPLICATION_PORT)||Du.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){XH.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 XH,ZH,Du,ek,QH,JH,Lu,el=be(()=>{Ue();Es();Jp();XH=require("worker_threads"),ZH=M(he()),Du=M(ce());G();ek=M(mi());server.nodes=[];a(ir,"getHDBNodeTable");a(jE,"getReplicationSharedStatus");a(Mu,"subscribeToNodeUpdates");a(k_,"shouldReplicateToNode");JH=new Map;JD((e,t,r)=>{if(r>server.nodes.length)throw new ZH.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);Lu||(Lu=new Map,Gne());let n=Lu.get(e);return n||(n=[],Lu.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(Gne,"startSubscriptionToReplications");a(F_,"iterateRoutes")});var nk={};Be(nk,{connectedToNode:()=>tl,disconnectedFromNode:()=>Uu,ensureNode:()=>Eo,requestClusterStatus:()=>rk,startOnMainThread:()=>gO});async function gO(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){QE.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=ir().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)}Mu(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 ir().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 vu)if(i.url===h.url){vu.delete(d);break}vu.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}];QE.has(d)&&(S.push({replicateByDefault:h,name:tt(),start_time:QE.get(d),end_time:Date.now(),replicates:!0}),QE.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)},qne);else{nt.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],ir().primaryStore.get(tt())?.replicates),ir().primaryStore.get(tt())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};p?p.postMessage(E):XE(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),Uu=a(function(i){try{nt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(vu.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||EO.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=vu.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"),tl=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",Uu),(0,vi.onMessageByType)("connected-to-node",tl),(0,vi.onMessageByType)("request-cluster-status",rk)}function rk(e,t){let r=[];for(let[n,s]of vu)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,mO.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=ir();e=e??Qs(t.url),t.name=e;try{if(t.ca){let s=new tk.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&&!EO.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,mO.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,JE,nt,mO,EO,tk,qne,Mi,Uu,tl,vu,QE,q_=be(()=>{Ue();vi=M(it());Es();JE=require("worker_threads");el();nt=M(X()),mO=require("lodash"),EO=M(ce());G();tk=require("crypto"),qne=200,Mi=new Map,vu=new Map,QE=new Map;a(gO,"startOnMainThread");a(rk,"requestClusterStatus");JE.parentPort&&(Uu=a(e=>{JE.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),tl=a(e=>{JE.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,vi.onMessageByType)("subscribe-to-node",e=>{G_(e)}),(0,vi.onMessageByType)("unsubscribe-from-node",e=>{XE(e)}));a(Eo,"ensureNode")});var Zs=P(Nk=>{"use strict";var or=require("path"),{watch:$ne}=require("chokidar"),Rn=require("fs-extra"),xu=require("node-forge"),lk=require("net"),{generateKeyPair:TO,X509Certificate:go,createPrivateKey:uk}=require("crypto"),Vne=require("util");TO=Vne.promisify(TO);var yt=xu.pki,Js=require("joi"),{v4:dk}=require("uuid"),{validateBySchema:bO}=st(),St=X(),zn=ce(),gs=(G(),D($)),{CONFIG_PARAMS:nl}=gs,Xs=OA(),{ClientError:Sa}=he(),ZE=require("node:tls"),{relative:fk,join:Kne}=require("node:path"),{CERT_PREFERENCE_APP:aIe,CERTIFICATE_VALUES:sk}=Xs,Yne=dc(),AO=It(),{table:Wne,getDatabases:zne,databases:SO}=(Ue(),D(ct)),{getJWTRSAKeys:ik}=(Ou(),D(P_));Object.assign(Nk,{generateKeys:wO,updateConfigCert:Tk,createCsr:tse,signCertificate:rse,setCertTable:Bu,loadCertificates:Ek,reviewSelfSignedCert:CO,createTLSSelector:Rk,listCertificates:bk,addCertificate:cse,removeCertificate:use,createNatsCerts:ise,generateCertsKeys:sse,getReplicationCert:V_,getReplicationCertAuth:ese,renewSelfSigned:ose,hostnamesFromCert:PO,getKey:dse});var{urlToNodeName:_k,getThisNodeUrl:jne,getThisNodeName:tg,clearThisNodeName:Qne}=(Es(),D(Ra)),{readFileSync:Jne,statSync:hk}=require("node:fs"),cIe=ce(),{getTicketKeys:Xne,onMessageFromWorkers:Zne}=it(),ga=X(),{isMainThread:pk}=require("worker_threads"),{TLSSocket:mk,createSecureContext:lIe}=require("node:tls"),OO=3650,$_=["127.0.0.1","localhost","::1"],NO=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];Zne(async e=>{e.type===gs.ITC_EVENT_TYPES.RESTART&&(zn.initSync(!0),await CO())});var xr;function Aa(){return xr||(xr=zne().system.hdb_certificate,xr||(xr=Wne({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=Rk("operations-api"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(tg());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 ese(){Aa();let e=(await V_()).options.cert,r=new go(e).issuer.match(/CN=(.*)/)?.[1];return xr.get(r)}a(ese,"getReplicationCertAuth");var ok,Ta=new Map;function Ek(){if(ok)return;ok=!0;let e=[{configKey:nl.TLS},{configKey:nl.OPERATIONSAPI_TLS}];Aa();let t=or.dirname(AO.getConfigFilePath()),r;for(let{configKey:n}of e){let s=AO.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&fk(Kne(t,"keys"),o);c&&ak(o,l=>{Ta.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&pk){let f;ak(u,d=>{if(sk.cert===d)return;let h=i.hostname??i.hostnames??i.host??i.hosts;h&&!Array.isArray(h)&&(h=[h]);let _=Ak(u),p=new go(_),S;try{S=Ok(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(sk.cert)))return;let g=xr.primaryStore.get(S),R=hk(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(Ek,"loadCertificates");function ak(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&pk&&St.warn(`Reloading ${r}:`,i),n=c,t(Ak(i)))}catch(c){St.error(`Error loading ${r}:`,i,c)}},"loadFile");Rn.existsSync(e)?s(e,hk(e)):St.error(`${r} file not found:`,e),$ne(e,{persistent:!1}).on("change",s)}a(ak,"loadAndWatch");function RO(){let e=jne();if(e==null){let t=$_[0];return St.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return _k(e)}a(RO,"getHost");function eg(){let e=tg();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(eg,"getCommonName");async function tse(){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:eg()},...NO];St.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:gk()}];return St.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),xu.pki.certificationRequestToPem(n)}a(tse,"createCsr");function gk(){let e=$_.includes(eg())?$_:[...$_,eg()];return e.includes(RO())||e.push(RO()),[{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=>lk.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(gk,"certExtensions");async function rse(e){let t={},r=or.join(zn.getHdbBasePath(),gs.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 Rn.exists(or.join(r,f.private_key_name))){n=Rn.readFile(or.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await yO();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=xu.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()+OO),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,xu.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(rse,"signCertificate");async function nse(e,t){await Bu({name:tg(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Bu({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(nse,"createCertificateTable");async function Bu(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(Bu,"setCertTable");async function wO(){let e=await TO("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(wO,"generateKeys");async function IO(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()+OO);let i=[{name:"commonName",value:eg()},...NO];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(gk()),n.sign(e,xu.md.sha256.create()),yt.certificateToPem(n)}a(IO,"generateCertificates");async function yO(){let e=await bk(),t;for(let r of e){if(!r.is_authority)continue;let n=await yk(r.private_key_name);if(r.private_key_name&&n&&new go(r.certificate).checkPrivateKey(uk(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(yO,"getCertAuthority");async function Sk(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()+OO);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${zn.get(nl.REPLICATION_HOSTNAME)??_k(zn.get(nl.REPLICATION_URL))??dk().split("-")[0]}`},...NO];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,xu.md.sha256.create());let o=or.join(zn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),c=or.join(o,Xs.PRIVATEKEY_PEM_NAME);return r&&await Rn.writeFile(c,yt.privateKeyToPem(e)),n}a(Sk,"generateCertAuthority");async function sse(){let{private_key:e,public_key:t}=await wO(),r=await Sk(e,t),n=await IO(e,t,r);await nse(n,r),Tk()}a(sse,"generateCertsKeys");async function ise(){let e=await IO(yt.privateKeyFromPem(Xs.CERTIFICATE_VALUES.key),void 0,yt.certificateFromPem(Xs.CERTIFICATE_VALUES.cert)),t=or.join(zn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),r=or.join(t,Xs.NATS_CERTIFICATE_PEM_NAME);await Rn.exists(r)||await Rn.writeFile(r,e);let n=or.join(t,Xs.NATS_CA_PEM_NAME);await Rn.exists(n)||await Rn.writeFile(n,Xs.CERTIFICATE_VALUES.cert)}a(ise,"createNatsCerts");async function ose(){Aa();for await(let e of xr.search([{attribute:"is_self_signed",value:!0}]))await xr.delete(e.name);await CO()}a(ose,"renewSelfSigned");async function CO(){Qne(),await Ek(),Aa();let e=await yO();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(Rn.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(nl.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(nl.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=or.join(zn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),c=fk(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 wO(),Rn.existsSync(or.join(o,Xs.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${dk().split("-")[0]}.pem`),await Rn.writeFile(or.join(o,c),yt.privateKeyToPem(s)));let l=await Sk(s,yt.setRsaPublicKey(s.n,s.e),!1);await Bu({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=tg();St.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await yO();let n=yt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await IO(yt.privateKeyFromPem(e.private_key),s,n);await Bu({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(CO,"reviewSelfSignedCert");function Tk(){let e=Yne(Object.keys(gs.CONFIG_PARAM_MAP),!0),t=or.join(zn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),r=or.join(t,Xs.PRIVATEKEY_PEM_NAME),n=or.join(t,Xs.NATS_CERTIFICATE_PEM_NAME),s=or.join(t,Xs.NATS_CA_PEM_NAME),i=gs.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),AO.updateConfigValue(void 0,void 0,o,!1,!0)}a(Tk,"updateConfigCert");function Ak(e){return e.startsWith("-----BEGIN")?e:Jne(e,"utf8")}a(Ak,"readPEM");var ck=ZE.createSecureContext;ZE.createSecureContext=function(e){if(!e.cert||!e.key)return ck(e);let t={...e};delete t.key,delete t.cert;let r=ck(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var ase=mk.prototype._init;mk.prototype._init=function(e,t){ase.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 rl=new Map;function Rk(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(),rl.clear();let f=0;for await(let d of SO.system.hdb_certificate.search([])){let h=d.certificate,_=new go(h);d.is_authority&&(_.asString=h,rl.set(_.subject,h))}for await(let d of SO.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 yk(d.private_key_name),S=d.certificate,g=new go(S);if(rl.has(g.issuer)&&(S+=`
|
|
23
|
+
`+rl.get(g.issuer)),!p||!S)throw new Error("Missing private key or certificate for secure server");let R={ciphers:d.ciphers,ticketKeys:Xne(),availableCAs:rl,ca:t&&Array.from(rl.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=ZE.createSecureContext(R);E.name=d.name,E.options=R,E.quality=_,E.certificateAuthorities=Array.from(rl),E.certStart=S.toString().slice(0,100);let T=d.hostnames??PO(g);Array.isArray(T)||(T=[T]);let O;for(let v of T)if(v){v[0]==="*"&&(s=!0,v=v.slice(1)),v===RO()&&(_+=2),lk.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",ZE.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"),SO.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(Rk,"createTLSSelector");async function yk(e){let t=Ta.get(e);return!t&&e?await Rn.readFile(or.join(zn.get(nl.ROOTPATH),gs.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(yk,"getPrivateKeyByName");async function bk(){Aa();let e=[];for await(let t of xr.search([]))e.push(t);return e}a(bk,"listCertificates");async function cse(e){let t=bO(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(uk(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=Ok(o)}catch(_){St.error(_)}if(f==null)throw new Sa("Error extracting certificate common name, please provide a name parameter")}let d=lse(r??f);s&&!c&&!l&&(await Rn.writeFile(or.join(zn.getHdbBasePath(),gs.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 Bu(h),"Successfully added certificate: "+d}a(cse,"addCertificate");function lse(e){return e.replace(/[^a-z0-9\.]/gi,"-")}a(lse,"sanitizeName");async function use(e){let t=bO(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 Rn.remove(or.join(zn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME,s)))}return await xr.delete(r),"Successfully removed "+r}a(use,"removeCertificate");function Ok(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||PO(e)[0]}a(Ok,"getPrimaryHostName");function PO(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(PO,"hostnamesFromCert");async function dse(e){if(e.bypass_auth!==!0)throw new Sa("Unauthorized","401");let t=bO(e,Js.object({name:Js.string().required()}));if(t)throw new Sa(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await ik()).privateKey;if(r===".jwtPublic")return(await ik()).publicKey;if(Ta.get(r))return Ta.get(e.name);throw new Sa("Key not found")}a(dse,"getKey")});var zk={};Be(zk,{CONFIRMATION_STATUS_POSITION:()=>Kk,NodeReplicationConnection:()=>ku,OPERATION_REQUEST:()=>vO,RECEIVED_TIME_POSITION:()=>xO,RECEIVED_VERSION_POSITION:()=>UO,RECEIVING_STATUS_POSITION:()=>BO,RECEIVING_STATUS_RECEIVING:()=>Wk,RECEIVING_STATUS_WAITING:()=>Yk,SENDING_TIME_POSITION:()=>K_,createWebSocket:()=>lg,database_subscriptions:()=>ba,replicateOverWS:()=>Y_,table_update_listeners:()=>kO});async function lg(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(!LO){let l=(0,Gk.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),LO=u.secureContexts}if(i=LO.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,$k.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(ag?.caCount!==So.size&&(ag=qk.createSecureContext({...i.options,ca:[...So,...i.options.availableCAs.values()]}),ag.caCount=So.size),c.secureContext=ag),new kk.WebSocket(e,"harperdb-replication-v1",c)}function Y_(e,t,r){let n=t.port||t.securePort,s=sl.pid%1e3+"-"+Fk.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=Hk.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,xk).unref(),A()}else Pn();e._socket?.setMaxListeners(200);function Pn(){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())},xk*2).unref()}a(Pn,"resetPingTimer");function nn(){return h||(h=jE(d,u,E)),h}a(nn,"getSharedStatus"),u&&zo(u);let wr,Fd,sc=[],ZT=[],eA,Ht=[],Gd=[],qd=[],tA=150,Ap=25,$d=0,De=0,Vd=!1,Wi,Ir,Dn,ic;e.on("message",A=>{ne=performance.now();try{let w=A.dataView=new il(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let N=(0,et.decode)(A),[H,U,Q]=N;switch(H){case Ik:{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)([Hu])),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)([Hu])),sn(1008,Y.message);return}Yo()}break}case vk:{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 Hu:sn();break;case vO: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)([ng,V]))},V=>{e.send((0,et.encode)([ng,{requestId:U.requestId,error:V instanceof Error?V.toString():V}]))})}catch(Y){e.send((0,et.encode)([ng,{requestId:U.requestId,error:Y instanceof Error?Y.toString():Y}]))}break;case ng:let{resolve:J,reject:k}=g.get(U.requestId);U.error?k(new Error(U.error)):J(U),g.delete(U.requestId);break;case DO: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),sc[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 Ck:ic=d?jH(U,d):new Map,eA=N[2],ae.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${eA}`);break;case Pk:let ye=Q;qd[ye]=U;break;case Mk:nn()[Kk]=U,ae.trace?.(s,"received and broadcasting committed update",U),nn().buffer.notify();break;case Lk:T=U,p.send({type:"end_txn",localTime:T,remoteNodeIds:R});break;case sg:{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 MO.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 Dk:{let Y=U,V;try{let ue=N[3],_e=ZT[Q]||(ZT[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)([DO,{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[Oc]&pn&&(We=Buffer.from(We),Nf(()=>_e.primaryStore.decoder.decode(Pe),Ln=>oc(Ln,ue),_e.primaryStore.rootStore)),V=(0,et.encode)([rg,Y,{value:We,expiresAt:Ve.expiresAt,version:Ve.version,residencyId:Ve.residencyId,nodeId:Ve.nodeId,user:Ve.user}])}else V=(0,et.encode)([rg,Y])}catch(ue){V=(0,et.encode)([rg,Y,{error:ue.message}])}e.send(V);break}case rg:{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;pm(()=>{let Pe=sc[ue].decoder.decode(me.value);me.value=Pe,me.key=_e,Y(me)||Te&&setTimeout(()=>Te.forEach(fm),6e4).unref()},Pe=>{let Ve=Kd(Pe,_e);return Te||(Te=[]),Te.push(Ve),Ve})}else Y();g.delete(N[1]);break}case wk:{Dn=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",Dn),!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=ir().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)([Hu])),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)([Hu])),sn(1008,`Unauthorized database subscription to ${u}`);return}if(Ir&&(ae.debug?.(s,"stopping previous subscription",u),Ir.emit("close")),Dn.length===0)return;let _e=Dn[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,Ln,os=a((we,kt)=>{if(we.type==="end_txn"){Te.txnTime&&(o[i]!==66&&ae.error?.("Invalid encoding of message"),K(9),K(cg),y(Ln=kt),yp()),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,Us=Nt.encoder;(we.extendedType&bm||!Us.typedStructs)&&(Us._mergeStructures(Us.getStructures()),Us.typedStructs&&(Us.lastTypedStructuresLength=Us.typedStructs.length));let Gl=Pe[Ot];if(!(Gl&&Gl.startTime<kt&&(!Gl.endTime||Gl.endTime>kt)))return og&&ae.trace?.(s,"skipping replication update",we.recordId,"to:",E,"from:",Ot,"subscribed:",Pe),cP();og&&ae.trace?.(s,"sending replication update",we.recordId,"to:",E,"from:",Ot,"subscribed:",Pe);let rA=we.version;Te.txnTime!==rA&&(Te.txnTime&&(og&&ae.trace?.(s,"new txn time, sending queued txn",Te.txnTime),o[i]!==66&&ae.error?.("Invalid encoding of message"),yp()),Te.txnTime=rA,i=c,y(rA));let lc=we.residencyId,nA=Yd(lc,as),bp;if(nA&&!nA.includes(E)){let xs=Yd(we.previousResidencyId,as);if(xs&&!xs.includes(E)&&(we.type==="put"||we.type==="patch")||as.getResidencyById)return cP();let zd=we.recordId;ae.trace?.(s,"sending invalidation",zd,E,"from",Ot);let jd=0;lc&&(jd|=Ic),we.previousResidencyId&&(jd|=Cc);let oA,Op=null;for(let lP in as.indices){if(!Op){if(oA=we.getValue(Nt,!0),!oA)break;Op={}}Op[lP]=oA[lP]}bp=Nc(we.version,Rr,zd,null,Ot,we.user,we.type==="put"||we.type==="patch"?"invalidate":we.type,Us.encode(Op),jd,lc,we.previousResidencyId,we.expiresAt)}function cP(){return ae.trace?.(s,"skipping audit record",we.recordId),j||(j=setTimeout(()=>{j=null,(Ln||0)+Uk/2<We&&(og&&ae.trace?.(s,"sending skipped sequence update",We),e.send((0,et.encode)([Lk,We])))},Uk).unref()),new Promise(setImmediate)}a(cP,"skipAuditRecord");let sA=Us.typedStructs,iA=Us.structures;if((sA?.length!=At.typed_length||iA?.length!=At.structure_length)&&(At.typed_length=sA?.length,At.structure_length=iA.length,ae.debug?.(s,"send table struct",At.typed_length,At.structure_length),At.sentName||(At.sentName=!0),e.send((0,et.encode)([DO,{typedStructs:sA,structures:iA,attributes:as.attributes,schemaDefined:as.schemaDefined},Rr,At.table.tableName]))),lc&&!Gd[lc]&&(e.send((0,et.encode)([Pk,nA,lc])),Gd[lc]=!0),bp)K(bp.length),m(bp);else{let xs=we.encoded;we.extendedType&pn&&Nf(()=>we.getValue(Nt),jd=>oc(jd,we.recordId),Nt.rootStore);let zd=xs[0]===66?8:0;K(xs.length-zd),m(xs,zd),ae.trace?.("wrote record",we.recordId,"length:",xs.length)}return e._socket.writableNeedDrain?new Promise(xs=>{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",xs)}):Bt>Ap?new Promise(xs=>{dt=xs}):new Promise(setImmediate)},"sendAuditRecord"),yp=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 HO.EventEmitter,Ir.once("close",()=>{ue=!0,Y?.end()});for(let{startTime:we}of Dn)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 Dn){let At=zE(kt,d);ae.debug?.("subscription to",kt,"using local id",At,"starting",Ot),Pe[At]={startTime:Ot,endTime:Rr}}Wd(u),wr||(wr=ol(kt=>{kt.databaseName===u&&Wd(u)}),Fd=W_(kt=>{kt===u&&(e.send((0,et.encode)([Hu])),sn())}),e.on("close",()=>{wr?.remove(),Fd?.remove()})),e.send((0,et.encode)([Ck,B_(p.auditStore),Dn.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=ug(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 Us=Nc(Nt.version,as.tableId,Nt.key,null,Rr,null,"put",Nf(()=>as.primaryStore.encoder.encode(Nt.value),Gl=>oc(Gl,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:Us,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 jk(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)==cg){w.position++,T=x=w.readFloat64(),h[UO]=T,h[xO]=Date.now(),h[BO]=Yk,ae.trace?.("received remote sequence update",T,u);break}let H=w.position,U=Pt(A,H,H+N),Q=sc[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;pm(()=>{I={table:Q.name,id:k,type:U.type,nodeId:ic.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[UO]=U.version,h[xO]=Date.now(),h[BO]=Wk,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>tA&&!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)([Mk,O])),ae.trace?.(s,"sent confirmation of a commit at",O),O=null},_se)),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",Pn),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-q,t.isSubscriptionConnection&&tl({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 oc(A,w){let b=_m(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)([sg,{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)([sg,{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)([sg,{fileId:b,finished:!0,error:I.toString()},Buffer.alloc(0)]))}finally{Cr.delete(b),Bt--,Bt<Ap&&dt?.()}}a(oc,"sendBlobs");function Kd(A,w){let b=_m(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 MO.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&&zE(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&&zE(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&&ig)try{new URL(ig).hostname===I.name&&E===I.name?(ae.warn?.(`Requesting full copy of database ${u} from ${ig}`),J=0):J=Date.now()-6e4}catch(k){ae.error?.("Error parsing leader URL",ig,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)([wk,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 Rp(w,A),!0}a(zo,"setDatabase");function Rp(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)([Ik,A,w,I]))}a(Rp,"sendNodeDBName");function Wd(A){let w=Ze()?.[A],b=[];for(let I in w){if(Dn&&!Dn.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)([vk,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 ac=1,cc=[];return{end(){Wi&&Wi.end(),Ir&&Ir.emit("close")},getRecord(A){let w=ac++;return new Promise((b,I)=>{let x=[Dk,w,A.table.tableId,A.id];cc[A.table.tableId]||(x.push(A.table.tableName),cc[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=ac++;return A.requestId=w,e.send((0,et.encode)([vO,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 Hk,et,kk,Fk,ae,HO,Gk,qk,sl,$k,MO,Vk,wk,Ik,Ck,Hu,Pk,DO,Dk,rg,vO,ng,Lk,Mk,vk,sg,Kk,UO,xO,K_,BO,Yk,Wk,fse,ig,kO,ba,og,Uk,_se,xk,LO,ag,Bk,ku,FO=be(()=>{Ue();so();hO();GO();Es();Hk=M(ce());G();su();et=require("msgpackr"),kk=require("ws"),Fk=require("worker_threads"),ae=M(mi());q_();HO=require("events"),Gk=M(Zs()),qk=M(require("node:tls"));el();sl=M(require("node:process")),$k=require("node:net");Ci();_s();MO=require("node:stream"),Vk=M(require("minimist")),wk=129,Ik=140,Ck=141,Hu=142,Pk=130,DO=132,Dk=133,rg=134,vO=136,ng=137,Lk=143,Mk=144,vk=145,sg=146,Kk=0,UO=1,xO=2,K_=3,BO=4,Yk=0,Wk=1,fse=(0,Vk.default)(sl.argv),ig=fse.HDB_LEADER_URL??sl.env.HDB_LEADER_URL,kO=new Map,ba=new Map,og=!0,Uk=300,_se=2,xk=3e4;a(lg,"createWebSocket");Bk=500,ku=class extends HO.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=Bk;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await lg(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;ae.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${sl.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=Bk,this.nodeSubscriptions&&tl({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&&Uu({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:()=>Rse,disableReplication:()=>Ese,enabled_databases:()=>ya,forEachReplicatedDatabase:()=>ma,getThisNodeId:()=>ug,getThisNodeName:()=>tt,getThisNodeUrl:()=>Ea,hostnameToUrl:()=>pg,lastTimeInAuditStore:()=>H_,monitorNodeCAs:()=>nF,replicateOperation:()=>bse,replication_certificate_authorities:()=>So,sendOperationToNode:()=>z_,servers:()=>pse,setReplicator:()=>iF,start:()=>mse,startOnMainThread:()=>gO,subscribeToNode:()=>G_,unsubscribeFromNode:()=>XE,urlToNodeName:()=>Qs});function mse(e){if(e.port||(e.port=Ss.default.get(B.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=Ss.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);gse(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"&&ar.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&&ar.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=ir().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)){ar.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else ar.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:ar.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=hg.createSecureContext(u)}catch(l){ar.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Ss.default.get(B.REPLICATION_ENABLEROOTCAS)!==!1&&i()}nF(()=>{for(let s of n)s()})}function nF(e){let t=0;Mu(r=>{r?.ca&&(So.add(r.ca),So.size!==t&&(t=So.size,e?.()))})}function Ese(e=!0){rF=e}function gse(e){rF||(Ze(),ya=e.databases,ma(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||ba;for(let[s,i]of fg){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];iF(r,s,e),kO.get(s)?.forEach(i=>i(s))}}))}function iF(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 sF 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(ar.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new xn,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 _=Tse(h,sF.subscription,e);_?.isConnected&&!u.has(_)&&(!f||_.latency<f.latency)&&(f=_)}if(!f)throw l||new eF.ServerError("No connection to any other nodes are available",502);let d={requestId:hse++,table:t,entry:i,id:i.key};u.add(f);try{return await f.getRecord(d)}catch(h){if(f.isConnected)throw h;ar.warn("Error in load from node",_g,h),l||(l=h)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function Sse(e,t,r,n,s){let i=fg.get(e);i||(i=new Map,fg.set(e,i));let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new ku(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function Tse(e,t,r){let n=Qk.get(e);n||(n=new Map,Qk.set(e,n));let s=n.get(r);if(s)return s;let i=ir().primaryStore.get(e);return i?.url&&(s=new ku(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 lg(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=>{ar.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function G_(e){try{tF.isMainThread&&ar.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=>{ar.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,ba.set(e.database,t)}let r=Sse(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){ar.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function XE({name:e,url:t,database:r}){ar.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(ir().primaryStore.getRange({})));let n=fg.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Ase(){if(qO!==void 0)return qO;let e=Ss.default.get(B.OPERATIONSAPI_TLS_CERTIFICATE)||Ss.default.get(B.TLS_CERTIFICATE);if(e)return qO=new Xk.X509Certificate((0,Zk.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function tt(){return _g||(_g=Ss.default.get("replication_hostname")??Qs(Ss.default.get("replication_url"))??Ase()??Jk("operationsapi_network_secureport")??Jk("operationsapi_network_port")??"127.0.0.1")}function Rse(){_g=void 0}function Jk(e){let t=Ss.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function dg(e){let t=Ss.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function ug(e){return B_(e)?.[tt()]}function Ea(){let e=Ss.default.get("replication_url");return e||pg(tt())}function pg(e){let t=dg("replication_port");if(t)return`ws://${e}:${t}`;if(t=dg("replication_secureport"),t)return`wss://${e}:${t}`;if(t=dg("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=dg("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)}),ol((n,s)=>{r(n.databaseName)});function r(n){let s=Ye[n];ar.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):yse(n)&&t(s,n,!1)}a(r,"forDatabase")}function yse(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 bse(e){let t={message:""};if(e.replicated){e.replicated=!1,ar.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 Ss,ar,Xk,Zk,hg,eF,tF,rF,hse,pse,So,ya,fg,Qk,qO,_g,Es=be(()=>{Ue();sa();Wl();FO();Dr();Ss=M(ce()),ar=M(X()),Xk=require("crypto"),Zk=require("fs");q_();el();G();hO();hg=M(require("node:tls")),eF=M(he()),tF=require("worker_threads"),hse=1,pse=[],So=Ss.default.get(B.REPLICATION_ENABLEROOTCAS)!==!1?new Set(hg.rootCertificates):new Set;a(mse,"start");a(nF,"monitorNodeCAs");a(Ese,"disableReplication");a(gse,"assignReplicationSource");a(iF,"setReplicator");fg=new Map;a(Sse,"getSubscriptionConnection");Qk=new Map;a(Tse,"getRetrievalConnectionByName");a(z_,"sendOperationToNode");a(G_,"subscribeToNode");a(XE,"unsubscribeFromNode");a(Ase,"getCommonNameFromCert");a(tt,"getThisNodeName");a(Rse,"clearThisNodeName");Object.defineProperty(Ke,"hostname",{get(){return tt()}});a(Jk,"getHostFromListeningPort");a(dg,"getPortFromListeningPort");a(ug,"getThisNodeId");Ke.replication={getThisNodeId:ug,exportIdMapping:B_};a(Ea,"getThisNodeUrl");a(pg,"hostnameToUrl");a(Qs,"urlToNodeName");a(ma,"forEachReplicatedDatabase");a(yse,"hasExplicitlyReplicatedTable");a(H_,"lastTimeInAuditStore");a(bse,"replicateOperation")});var Tg=P((UIe,uF)=>{"use strict";var Fu=gH(),{validateBySchema:j_}=st(),{common_validators:Gu,schema_regex:$O}=Ri(),cr=require("joi"),Ose=X(),Nse=require("uuid").v4,gg=_o(),qu=(G(),D($)),wse=require("util"),Oa=qn(),{handleHDBError:To,hdb_errors:Ise,ClientError:Q_}=he(),{HDB_ERROR_MSGS:mg,HTTP_STATUS_CODES:Ao}=Ise,{SchemaEventMsg:Sg}=Ks(),oF=sr(),{getDatabases:Cse}=(Ue(),D(ct)),{transformReq:$u}=oe(),{replicateOperation:aF}=(Es(),D(Ra)),Eg=cr.string().min(1).max(Gu.schema_length.maximum).pattern($O).messages({"string.pattern.base":"{:#label} "+Gu.schema_format.message}),Pse=cr.string().min(1).max(Gu.schema_length.maximum).pattern($O).messages({"string.pattern.base":"{:#label} "+Gu.schema_format.message}).required(),Dse=cr.string().min(1).max(Gu.schema_length.maximum).pattern($O).messages({"string.pattern.base":"{:#label} "+Gu.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();uF.exports={createSchema:Lse,createSchemaStructure:cF,createTable:Mse,createTableStructure:lF,createAttribute:Hse,dropSchema:vse,dropTable:Use,dropAttribute:xse,getBackup:kse};async function Lse(e){let t=await cF(e);return gg.signalSchemaChange(new Sg(process.pid,e.operation,e.schema)),t}a(Lse,"createSchema");async function cF(e){let t=j_(e,cr.object({database:Eg,schema:Eg}));if(t)throw new Q_(t.message);if($u(e),!await Fu.checkSchemaExists(e.schema))throw To(new Error,mg.SCHEMA_EXISTS_ERR(e.schema),Ao.BAD_REQUEST,qu.LOG_LEVELS.ERROR,mg.SCHEMA_EXISTS_ERR(e.schema),!0);return await Oa.createSchema(e),`database '${e.schema}' successfully created`}a(cF,"createSchemaStructure");async function Mse(e){return $u(e),e.hash_attribute=e.primary_key??e.hash_attribute,await lF(e)}a(Mse,"createTable");async function lF(e){let t=j_(e,cr.object({database:Eg,schema:Eg,table:Pse,residence:cr.array().items(cr.string().min(1)).optional(),hash_attribute:Dse}));if(t)throw new Q_(t.message);if(!await Fu.checkSchemaTableExists(e.schema,e.table))throw To(new Error,mg.TABLE_EXISTS_ERR(e.schema,e.table),Ao.BAD_REQUEST,qu.LOG_LEVELS.ERROR,mg.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Nse(),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(lF,"createTableStructure");async function vse(e){let t=j_(e,cr.object({database:cr.string(),schema:cr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Q_(t.message);$u(e);let r=await Fu.checkSchemaExists(e.schema);if(r)throw To(new Error,r,Ao.NOT_FOUND,qu.LOG_LEVELS.ERROR,r,!0);let n=await Fu.schema_describe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await Oa.dropSchema(e),gg.signalSchemaChange(new Sg(process.pid,e.operation,e.schema)),await oF.purgeSchemaTableStreams(e.schema,s);let i=await aF(e);return i.message=`successfully deleted '${e.schema}'`,i}a(vse,"dropSchema");async function Use(e){let t=j_(e,cr.object({database:cr.string(),schema:cr.string(),table:cr.string().required()}));if(t)throw new Q_(t.message);$u(e);let r=await Fu.checkSchemaTableExists(e.schema,e.table);if(r)throw To(new Error,r,Ao.NOT_FOUND,qu.LOG_LEVELS.ERROR,r,!0);await Oa.dropTable(e),await oF.purgeTableStream(e.schema,e.table);let n=await aF(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(Use,"dropTable");async function xse(e){let t=j_(e,cr.object({database:cr.string(),schema:cr.string(),table:cr.string().required(),attribute:cr.string().required()}));if(t)throw new Q_(t.message);$u(e);let r=await Fu.checkSchemaTableExists(e.schema,e.table);if(r)throw To(new Error,r,Ao.NOT_FOUND,qu.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(qu.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),Bse(e),gg.signalSchemaChange(new Sg(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw Ose.error(`Got an error deleting attribute ${wse.inspect(e)}.`),n}}a(xse,"dropAttribute");function Bse(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(Bse,"dropAttributeFromGlobal");async function Hse(e){$u(e);let t=Cse()[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),gg.signalSchemaChange(new Sg(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(Hse,"createAttribute");function kse(e){return Oa.getBackup(e)}a(kse,"getBackup")});var fF=P((BIe,dF)=>{"use strict";var{OPERATIONS_ENUM:Fse}=(G(),D($)),VO=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Fse.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};dF.exports=VO});var KO=P((FIe,EF)=>{"use strict";var Gse=qn(),kIe=fF(),Ag=oe(),Rg=(G(),D($)),qse=ce(),{handleHDBError:_F,hdb_errors:$se}=he(),{HDB_ERROR_MSGS:hF,HTTP_STATUS_CODES:pF}=$se,Vse=Object.values(Rg.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),mF="To use this operation audit log must be enabled in harperdb-config.yaml";EF.exports=Kse;async function Kse(e){if(Ag.isEmpty(e.schema))throw new Error(hF.SCHEMA_REQUIRED_ERR);if(Ag.isEmpty(e.table))throw new Error(hF.TABLE_REQUIRED_ERR);if(!qse.get(Rg.CONFIG_PARAMS.LOGGING_AUDITLOG))throw _F(new Error,mF,pF.BAD_REQUEST,Rg.LOG_LEVELS.ERROR,mF,!0);let t=Ag.checkSchemaTableExist(e.schema,e.table);if(t)throw _F(new Error,t,pF.NOT_FOUND,Rg.LOG_LEVELS.ERROR,t,!0);if(!Ag.isEmpty(e.search_type)&&Vse.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await Gse.readAuditLog(e)}a(Kse,"readAuditLog")});var SF=P((qIe,gF)=>{"use strict";var{OPERATIONS_ENUM:Yse}=(G(),D($)),YO=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Yse.GET_BACKUP,this.schema=t,this.table=r}};gF.exports=YO});var RF=P((YIe,AF)=>{"use strict";var Wse=qn(),VIe=SF(),WO=oe(),zse=(G(),D($)),KIe=ce(),{handleHDBError:jse,hdb_errors:Qse}=he(),{HDB_ERROR_MSGS:TF,HTTP_STATUS_CODES:Jse}=Qse;AF.exports=Xse;async function Xse(e){if(WO.isEmpty(e.schema))throw new Error(TF.SCHEMA_REQUIRED_ERR);if(WO.isEmpty(e.table))throw new Error(TF.TABLE_REQUIRED_ERR);let t=WO.checkSchemaTableExist(e.schema,e.table);if(t)throw jse(new Error,t,Jse.NOT_FOUND,zse.LOG_LEVELS.ERROR,t,!0);return await Wse.getBackup(read_audit_log_object)}a(Xse,"getBackup")});var NF=P((zIe,OF)=>{"use strict";var Zse=ce(),Na=require("joi"),eie=st(),yF=require("moment"),tie=require("fs-extra"),zO=require("path"),rie=require("lodash"),J_=(G(),D($)),{LOG_LEVELS:al}=(G(),D($)),nie="YYYY-MM-DD hh:mm:ss",sie=zO.resolve(__dirname,"../logs");OF.exports=function(e){return eie.validateBySchema(e,iie)};var iie=Na.object({from:Na.custom(bF),until:Na.custom(bF),level:Na.valid(al.NOTIFY,al.FATAL,al.ERROR,al.WARN,al.INFO,al.DEBUG,al.TRACE),order:Na.valid("asc","desc"),limit:Na.number().min(1),start:Na.number().min(0),log_name:Na.custom(oie)});function bF(e,t){if(yF(e,yF.ISO_8601).format(nie)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(bF,"validateDatetime");function oie(e,t){if(rie.invert(J_.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Zse.get(J_.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?J_.LOG_NAMES.HDB:e,i=s===J_.LOG_NAMES.INSTALL?zO.join(sie,J_.LOG_NAMES.INSTALL):zO.join(n,s);return tie.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(oie,"validateReadLogPath")});var QO=P((QIe,IF)=>{"use strict";var yg=(G(),D($)),aie=X(),cie=ce(),lie=NF(),jO=require("path"),wF=require("fs-extra"),{once:uie}=require("events"),{handleHDBError:die,hdb_errors:fie}=he(),{PACKAGE_ROOT:_ie}=Et(),hie=jO.join(_ie,"logs"),pie=1e3,mie=200;IF.exports=Eie;async function Eie(e){let t=lie(e);if(t)throw die(t,t.message,fie.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=cie.get(yg.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?yg.LOG_NAMES.HDB:e.log_name,s=n===yg.LOG_NAMES.INSTALL?jO.join(hie,yg.LOG_NAMES.INSTALL):jO.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?pie: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(wF.statSync(s).size-(p+5)*mie,0));let g=wF.createReadStream(s,{start:S});g.on("error",F=>{aie.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 uie(g,"close"),E}a(Eie,"readLog");function wa(e,t,r){t==="desc"?gie(e,r):t==="asc"?Sie(e,r):r.push(e)}a(wa,"pushLineToResult");function gie(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(gie,"insertDescending");function Sie(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(Sie,"insertAscending")});var bg=P((rCe,LF)=>{"use strict";var JO=require("joi"),{string:Vu,boolean:CF,date:Tie}=JO.types(),Aie=st(),{validateSchemaExists:XIe,validateTableExists:ZIe,validateSchemaName:eCe}=Ri(),Rie=(G(),D($)),yie=Dt(),PF=ce();PF.initSync();var tCe=Vu.invalid(PF.get(Rie.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(yie.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),DF={operation:Vu.valid("add_node","update_node","set_node_replication"),node_name:Vu.optional(),subscriptions:JO.array().items({table:Vu.optional(),schema:Vu.optional(),database:Vu.optional(),subscribe:CF.required(),publish:CF.required().custom(Oie),start_time:Tie.iso()})};function bie(e){return Aie.validateBySchema(e,JO.object(DF))}a(bie,"addUpdateNodeValidator");function Oie(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(Oie,"checkForFalsy");LF.exports={addUpdateNodeValidator:bie,validation_schema:DF}});var Ku=P((sCe,MF)=>{"use strict";var XO=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}};MF.exports={Node:XO,NodeSubscription:ZO}});var UF=P((oCe,vF)=>{"use strict";var Nie=(G(),D($)).OPERATIONS_ENUM,eN=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Nie.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};vF.exports=eN});var X_=P((cCe,xF)=>{"use strict";var tN=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},rN=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)}};xF.exports={RemotePayloadObject:tN,RemotePayloadSubscription:rN}});var HF=P((uCe,BF)=>{"use strict";var nN=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}};BF.exports=nN});var FF=P((mCe,kF)=>{"use strict";var wie=HF(),fCe=Ft(),_Ce=ht(),Iie=X(),{getSchemaPath:hCe,getTransactionAuditStorePath:pCe}=gt(),{getDatabases:Cie}=(Ue(),D(ct));kF.exports=Pie;async function Pie(e){let t=new wie;try{let r=Cie()[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){Iie.warn(`unable to stat table dbi due to ${r}`)}return t}a(Pie,"lmdbGetTableSize")});var qF=P((gCe,GF)=>{"use strict";var sN=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}};GF.exports=sN});var Wu=P((bCe,YF)=>{"use strict";var Die=require("fs-extra"),Lie=require("path"),jr=require("systeminformation"),Ia=X(),$F=sr(),TCe=Dt(),Yu=(G(),D($)),Mie=FF(),vie=uo(),{getThreadInfo:VF}=it(),Z_=ce();Z_.initSync();var Uie=qF(),{openEnvironment:ACe}=ht(),{getSchemaPath:RCe}=gt(),{database:yCe,databases:iN}=(Ue(),D(ct)),Og;YF.exports={getHDBProcessInfo:lN,getNetworkInfo:dN,getDiskInfo:uN,getMemoryInfo:cN,getCPUInfo:aN,getTimeInfo:oN,getSystemInformation:fN,systemInformation:xie,getTableSize:_N,getMetrics:hN};function oN(){return jr.time()}a(oN,"getTimeInfo");async function aN(){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(aN,"getCPUInfo");async function cN(){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(cN,"getMemoryInfo");async function lN(){let e={core:[],clustering:[]};try{let t=await jr.processes(),r;try{r=Number.parseInt(await Die.readFile(Lie.join(Z_.get(Yu.CONFIG_PARAMS.ROOTPATH),Yu.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===Yu.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(lN,"getHDBProcessInfo");async function uN(){let e={};try{if(!Z_.get(Yu.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(uN,"getDiskInfo");async function dN(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Z_.get(Yu.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(dN,"getNetworkInfo");async function fN(){if(Og!==void 0)return Og;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,Og=e,Og}catch(t){return Ia.error(`error in getSystemInformation: ${t}`),e}}a(fN,"getSystemInformation");async function _N(){let e=[],t=await vie.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await Mie(n));return e}a(_N,"getTableSize");async function hN(){let e={};for(let t in iN){let r=e[t]={},n=r.tables={};for(let s in iN[t])try{let i=iN[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(hN,"getMetrics");async function KF(){if(Z_.get(Yu.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await $F.getNATSReferences(),t=await $F.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(KF,"getNatsStreamInfo");async function xie(e){let t=new Uie;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await fN(),t.time=oN(),t.cpu=await aN(),t.memory=await cN(),t.disk=await uN(),t.network=await dN(),t.harperdb_processes=await lN(),t.table_size=await _N(),t.metrics=await hN(),t.threads=await VF(),t.replication=await KF(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await fN();break;case"time":t.time=oN();break;case"cpu":t.cpu=await aN();break;case"memory":t.memory=await cN();break;case"disk":t.disk=await uN();break;case"network":t.network=await dN();break;case"harperdb_processes":t.harperdb_processes=await lN();break;case"table_size":t.table_size=await _N();break;case"database_metrics":case"metrics":t.metrics=await hN();break;case"threads":t.threads=await VF();break;case"replication":t.replication=await KF();break;default:break}return t}a(xie,"systemInformation")});var Ro=P((CCe,QF)=>{"use strict";var Bie=Sn(),pN=oe(),Hie=require("util"),cl=(G(),D($)),WF=ce();WF.initSync();var kie=Wb(),zF=Vr(),{Node:NCe,NodeSubscription:wCe}=Ku(),Fie=pu(),Gie=UF(),{RemotePayloadObject:qie,RemotePayloadSubscription:$ie}=X_(),{handleHDBError:Vie,hdb_errors:Kie}=he(),{HTTP_STATUS_CODES:Yie,HDB_ERROR_MSGS:Wie}=Kie,zie=Ys(),jie=Wu(),{packageJson:Qie}=Et(),{getDatabases:Jie}=(Ue(),D(ct)),ICe=Hie.promisify(kie.authorize),Xie=zF.searchByHash,Zie=zF.searchByValue;QF.exports={isEmpty:eoe,getNodeRecord:toe,upsertNodeRecord:roe,buildNodePayloads:noe,checkClusteringEnabled:soe,getAllNodeRecords:ioe,getSystemInfo:ooe,reverseSubscription:jF};function eoe(e){return e==null}a(eoe,"isEmpty");async function toe(e){let t=new Fie(cl.SYSTEM_SCHEMA_NAME,cl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Xie(t)}a(toe,"getNodeRecord");async function roe(e){let t=new Gie(cl.SYSTEM_SCHEMA_NAME,cl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Bie.upsert(t)}a(roe,"upsertNodeRecord");function jF(e){if(pN.isEmpty(e.subscribe)||pN.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(jF,"reverseSubscription");function noe(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=pN.getTableHashAttribute(l,u),{subscribe:d,publish:h}=jF(c),_=Jie()[l]?.[u],p=new $ie(l,u,f,h,d,c.start_time,_.schemaDefined?_.attributes:void 0);s.push(p)}return new qie(r,t,s,n)}a(noe,"buildNodePayloads");function soe(){if(!WF.get(cl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw Vie(new Error,Wie.CLUSTERING_NOT_ENABLED,Yie.BAD_REQUEST,void 0,void 0,!0)}a(soe,"checkClusteringEnabled");async function ioe(){let e=new zie(cl.SYSTEM_SCHEMA_NAME,cl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await Zie(e))}a(ioe,"getAllNodeRecords");async function ooe(){let e=await jie.getSystemInformation();return{hdb_version:Qie.version,node_version:e.node_version,platform:e.platform}}a(ooe,"getSystemInfo")});var mN=P((DCe,sG)=>{"use strict";var Ng=sr(),JF=oe(),XF=Dt(),ZF=(G(),D($)),wg=X(),eG=Tg(),aoe=d_(),{RemotePayloadObject:coe}=X_(),{handleHDBError:tG,hdb_errors:loe}=he(),{HTTP_STATUS_CODES:rG}=loe,{NodeSubscription:nG}=Ku();sG.exports=uoe;async function uoe(e,t){let r;try{r=await Ng.request(`${t}.${XF.REQUEST_SUFFIX}`,new coe(ZF.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),wg.trace("Response from remote describe all request:",r)}catch(o){wg.error(`addNode received error from describe all request to remote node: ${o}`);let c=Ng.requestErrorHandler(o,"add_node",t);throw tG(new Error,c,rG.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===XF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw tG(new Error,o,rG.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===ZF.SYSTEM_SCHEMA_NAME){await Ng.createLocalTableStream(l,c);let p=new nG(l,c,o.publish,o.subscribe);p.start_time=o.start_time,i.push(p);continue}let u=JF.doesSchemaExist(l),f=n[l]!==void 0,d=c?JF.doesTableExist(l,c):!0,h=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!f||!d&&!h){s.push(o);continue}if(!u&&f&&(wg.trace(`addNode creating schema: ${l}`),await eG.createSchema({operation:"create_schema",schema:l})),!d&&h){wg.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let p=new aoe(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(p.attributes=n[l][c].attributes),await eG.createTable(p)}await Ng.createLocalTableStream(l,c);let _=new nG(l,c,o.publish,o.subscribe);_.start_time=o.start_time,i.push(_)}return{added:i,skipped:s}}a(uoe,"reviewSubscriptions")});var ll={};Be(ll,{addNodeBack:()=>poe,removeNodeBack:()=>moe,setNode:()=>hoe});async function hoe(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=pg(r);let n=(0,oG.validateBySchema)(e,_oe);if(n)throw(0,yo.handleHDBError)(n,n.message,foe.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=ir(),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,Ts.getReplicationCert)();let _=await(0,Ts.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,Ts.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(iG):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let _=iG(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,Ts.setCertTable)({name:doe.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ts.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 poe(e){jn.trace("addNodeBack received request:",e);let t=await(0,Ts.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,Ts.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 moe(e){jn.trace("removeNodeBack received request:",e),await ir().delete(e.name)}function iG(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ts,oG,Ca,Pa,jn,yo,doe,foe,_oe,ul=be(()=>{Ts=M(Zs()),oG=M(st()),Ca=M(require("joi")),Pa=M(ce());G();q_();el();Es();jn=M(X()),yo=M(he()),{pki:doe}=require("node-forge"),{HTTP_STATUS_CODES:foe}=yo.hdb_errors,_oe=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(hoe,"setNode");a(poe,"addNodeBack");a(moe,"removeNodeBack");a(iG,"reverseSubscription")});var Lg=P((FCe,cG)=>{"use strict";var{handleHDBError:Ig,hdb_errors:Eoe}=he(),{HTTP_STATUS_CODES:Cg}=Eoe,{addUpdateNodeValidator:goe}=bg(),Pg=X(),Dg=(G(),D($)),aG=Dt(),Soe=oe(),eh=sr(),th=Ro(),EN=ce(),Toe=mN(),{Node:Aoe,NodeSubscription:Roe}=Ku(),{broadcast:yoe}=it(),{setNode:boe}=(ul(),D(ll)),HCe=ce(),kCe=(G(),D($)),Ooe="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Noe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",woe=EN.get(Dg.CONFIG_PARAMS.CLUSTERING_NODENAME);cG.exports=Ioe;async function Ioe(e,t=!1){if(Pg.trace("addNode called with:",e),EN.get(Dg.CONFIG_PARAMS.REPLICATION_URL)||EN.get(Dg.CONFIG_PARAMS.REPLICATION_HOSTNAME))return boe(e);th.checkClusteringEnabled();let r=goe(e);if(r)throw Ig(r,r.message,Cg.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let d=await th.getNodeRecord(n);if(!Soe.isEmptyOrZeroLength(d))throw Ig(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,Cg.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Toe(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=Ooe,o;let c=th.buildNodePayloads(s,woe,Dg.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 Roe(_.schema,_.table,_.publish,_.subscribe))}Pg.trace("addNode sending remote payload:",c);let u;try{u=await eh.request(`${n}.${aG.REQUEST_SUFFIX}`,c)}catch(d){Pg.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 Ig(new Error,h,Cg.INTERNAL_SERVER_ERROR,"error",h)}if(u.status===aG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${n}: ${u.message}`;throw Ig(new Error,d,Cg.INTERNAL_SERVER_ERROR,"error",d)}Pg.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 Aoe(n,l,u.system_info);return await th.upsertNodeRecord(f),yoe({type:"nats_update"}),i.length>0?o.message=Noe:o.message=`Successfully added '${n}' to manifest`,o}a(Ioe,"addNode")});var AN=P(($Ce,uG)=>{"use strict";var{handleHDBError:gN,hdb_errors:Coe}=he(),{HTTP_STATUS_CODES:SN}=Coe,{addUpdateNodeValidator:Poe}=bg(),rh=X(),Mg=(G(),D($)),lG=Dt(),qCe=oe(),nh=sr(),sh=Ro(),TN=ce(),{cloneDeep:Doe}=require("lodash"),Loe=mN(),{Node:Moe,NodeSubscription:voe}=Ku(),{broadcast:Uoe}=it(),{setNode:xoe}=(ul(),D(ll)),Boe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",Hoe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",koe=TN.get(Mg.CONFIG_PARAMS.CLUSTERING_NODENAME);uG.exports=Foe;async function Foe(e){if(rh.trace("updateNode called with:",e),TN.get(Mg.CONFIG_PARAMS.REPLICATION_URL)??TN.get(Mg.CONFIG_PARAMS.REPLICATION_HOSTNAME))return xoe(e);sh.checkClusteringEnabled();let t=Poe(e);if(t)throw gN(t,t.message,SN.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await sh.getNodeRecord(r);s.length>0&&(n=Doe(s));let{added:i,skipped:o}=await Loe(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=Boe,c;let l=sh.buildNodePayloads(i,koe,Mg.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}.${lG.REQUEST_SUFFIX}`,l)}catch(f){rh.error(`updateNode received error from request: ${f}`);let d=nh.requestErrorHandler(f,"update_node",r);throw gN(new Error,d,SN.INTERNAL_SERVER_ERROR,"error",d)}if(u.status===lG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${r}: ${u.message}`;throw gN(new Error,f,SN.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 Moe(r,[],u.system_info)]),await Goe(n[0],i,u.system_info),o.length>0?c.message=Hoe:c.message=`Successfully updated '${r}'`,c}a(Foe,"updateNode");async function Goe(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 voe(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await sh.upsertNodeRecord(n),Uoe({type:"nats_update"})}a(Goe,"updateNodeTable")});var pG=P((KCe,hG)=>{"use strict";var _G=require("joi"),{string:dG}=_G.types(),qoe=st(),fG=(G(),D($)),$oe=ce(),Voe=Dt();hG.exports=Koe;function Koe(e){let t=dG.invalid($oe.get(fG.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(Voe.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=_G.object({operation:dG.valid(fG.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return qoe.validateBySchema(e,r)}a(Koe,"removeNodeValidator")});var vg=P((WCe,TG)=>{"use strict";var{handleHDBError:mG,hdb_errors:Yoe}=he(),{HTTP_STATUS_CODES:EG}=Yoe,Woe=pG(),ih=X(),gG=Ro(),zoe=oe(),zu=(G(),D($)),SG=Dt(),RN=sr(),yN=ce(),{RemotePayloadObject:joe}=X_(),{NodeSubscription:Qoe}=Ku(),Joe=u_(),Xoe=Bc(),{broadcast:Zoe}=it(),{setNode:eae}=(ul(),D(ll)),tae=yN.get(zu.CONFIG_PARAMS.CLUSTERING_NODENAME);TG.exports=rae;async function rae(e){if(ih.trace("removeNode called with:",e),yN.get(zu.CONFIG_PARAMS.REPLICATION_URL)??yN.get(zu.CONFIG_PARAMS.REPLICATION_HOSTNAME))return eae(e);gG.checkClusteringEnabled();let t=Woe(e);if(t)throw mG(t,t.message,EG.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await gG.getNodeRecord(r);if(zoe.isEmptyOrZeroLength(n))throw mG(new Error,`Node '${r}' was not found.`,EG.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new joe(zu.OPERATIONS_ENUM.REMOVE_NODE,tae,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let f=n.subscriptions[l];f.subscribe===!0&&await RN.updateConsumerIterator(f.schema,f.table,r,"stop");try{await RN.updateRemoteConsumer(new Qoe(f.schema,f.table,!1,!1),r)}catch(d){ih.error(d)}}try{i=await RN.request(`${r}.${SG.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 Joe(zu.SYSTEM_SCHEMA_NAME,zu.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await Xoe.deleteRecord(c),Zoe({type:"nats_update"}),i?.status===SG.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(rae,"removeNode")});var yG=P((jCe,RG)=>{"use strict";var AG=require("joi"),{string:nae,array:sae}=AG.types(),iae=st(),oae=bg();RG.exports=aae;function aae(e){let t=AG.object({operation:nae.valid("configure_cluster").required(),connections:sae.items(oae.validation_schema).required()});return iae.validateBySchema(e,t)}a(aae,"configureClusterValidator")});var bN=P((JCe,IG)=>{"use strict";var bG=(G(),D($)),Ug=X(),cae=oe(),lae=ce(),uae=vg(),dae=Lg(),fae=Ro(),_ae=yG(),{handleHDBError:OG,hdb_errors:hae}=he(),{HTTP_STATUS_CODES:NG}=hae,pae="Configure cluster complete.",mae="Failed to configure the cluster. Check the logs for more details.",Eae="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";IG.exports=gae;async function gae(e){Ug.trace("configure cluster called with:",e);let t=_ae(e);if(t)throw OG(t,t.message,NG.BAD_REQUEST,void 0,void 0,!0);let r=await fae.getAllNodeRecords(),n=[];if(lae.get(bG.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let f=0,d=r.length;f<d;f++){let h=await wG(uae,{operation:bG.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[f].name},r[f].name);n.push(h)}Ug.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 wG(dae,d,d.node_name);s.push(h)}Ug.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"&&(Ug.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(cae.isEmptyOrZeroLength(o))return{message:pae,connections:c};if(l)return{message:Eae,failed_nodes:o,connections:c};throw OG(new Error,mae,NG.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(gae,"configureCluster");async function wG(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(wG,"functionWrapper")});var LG=P((ZCe,DG)=>{"use strict";var oh=require("joi"),Sae=st(),{validateSchemaExists:CG,validateTableExists:Tae,validateSchemaName:PG}=Ri(),Aae=oh.object({operation:oh.string().valid("purge_stream"),schema:oh.string().custom(CG).custom(PG).optional(),database:oh.string().custom(CG).custom(PG).optional(),table:oh.string().custom(Tae).required()});function Rae(e){return Sae.validateBySchema(e,Aae)}a(Rae,"purgeStreamValidator");DG.exports=Rae});var ON=P((tPe,MG)=>{"use strict";var{handleHDBError:yae,hdb_errors:bae}=he(),{HTTP_STATUS_CODES:Oae}=bae,Nae=LG(),wae=sr(),Iae=Ro();MG.exports=Cae;async function Cae(e){e.schema=e.schema??e.database;let t=Nae(e);if(t)throw yae(t,t.message,Oae.BAD_REQUEST,void 0,void 0,!0);Iae.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await wae.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(Cae,"purgeStream")});var IN=P((nPe,FG)=>{"use strict";var wN=Ro(),Pae=sr(),Bg=ce(),ju=(G(),D($)),dl=Dt(),Dae=oe(),NN=X(),{RemotePayloadObject:Lae}=X_(),{ErrorCode:vG}=require("nats"),{parentPort:UG}=require("worker_threads"),{onMessageByType:Mae}=it(),{getThisNodeName:vae}=(Es(),D(Ra)),{requestClusterStatus:Uae}=(q_(),D(nk)),{getReplicationSharedStatus:xae,getHDBNodeTable:Bae}=(el(),D(pO)),{CONFIRMATION_STATUS_POSITION:Hae,RECEIVED_VERSION_POSITION:kae,RECEIVED_TIME_POSITION:Fae,SENDING_TIME_POSITION:Gae,RECEIVING_STATUS_POSITION:qae,RECEIVING_STATUS_RECEIVING:$ae}=(FO(),D(zk)),xG=Bg.get(ju.CONFIG_PARAMS.CLUSTERING_ENABLED),BG=Bg.get(ju.CONFIG_PARAMS.CLUSTERING_NODENAME);FG.exports={clusterStatus:Vae,buildNodeStatus:kG};var HG;Mae("cluster-status",async e=>{HG(e)});async function Vae(){if(Bg.get(ju.CONFIG_PARAMS.REPLICATION_URL)||Bg.get(ju.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(UG){UG.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{HG=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=xae(u,l,o);c.lastCommitConfirmed=xg(f[Hae]),c.lastReceivedRemoteTime=xg(f[kae]),c.lastReceivedLocalTime=xg(f[Fae]),c.sendingMessage=xg(f[Gae]),c.lastReceivedStatus=f[qae]===$ae?"Receiving":"Waiting"}}}else n=Uae();n.node_name=vae();let s=Bae().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:BG,is_enabled:xG,connections:[]};if(!xG)return e;let t=await wN.getAllNodeRecords();if(Dae.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(kG(t[n],e.connections));return await Promise.allSettled(r),e}a(Vae,"clusterStatus");function xg(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}a(xg,"asDate");async function kG(e,t){let r=e.name,n=new Lae(ju.OPERATIONS_ENUM.CLUSTER_STATUS,BG,void 0,await wN.getSystemInfo()),s,i,o=dl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Pae.request(dl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===dl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=dl.CLUSTER_STATUS_STATUSES.CLOSED,NN.error(`Error getting node status from ${r} `,s))}catch(l){NN.warn(`Error getting node status from ${r}`,l),l.code===vG.NoResponders?o=dl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===vG.Timeout?o=dl.CLUSTER_STATUS_STATUSES.TIMEOUT:o=dl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Kae(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!==ju.PRE_4_0_0_VERSION&&await wN.upsertNodeRecord(l)}catch(l){NN.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(kG,"buildNodeStatus");function Kae(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(Kae,"NodeStatusObject")});var PN=P((iPe,GG)=>{"use strict";var{handleHDBError:Yae,hdb_errors:Wae}=he(),{HTTP_STATUS_CODES:zae}=Wae,jae=sr(),Qae=Ro(),CN=oe(),Hg=require("joi"),Jae=st(),Xae=2e3,Zae=Hg.object({timeout:Hg.number().min(1),connected_nodes:Hg.boolean(),routes:Hg.boolean()});GG.exports=ece;async function ece(e){Qae.checkClusteringEnabled();let t=Jae.validateBySchema(e,Zae);if(t)throw Yae(t,t.message,zae.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||CN.autoCastBoolean(n),o=s===void 0||CN.autoCastBoolean(s),c={nodes:[]},l=await jae.getServerList(r??Xae),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:CN.autoCast(S.split(":")[1])})):[]),c.nodes.push(p)}}return c}a(ece,"clusterNetwork")});var KG=P((aPe,VG)=>{"use strict";var DN=require("joi"),qG=st(),{route_constraints:$G}=wA();VG.exports={setRoutesValidator:tce,deleteRoutesValidator:rce};function tce(e){let t=DN.object({server:DN.valid("hub","leaf"),routes:$G.required()});return qG.validateBySchema(e,t)}a(tce,"setRoutesValidator");function rce(e){let t=DN.object({routes:$G.required()});return qG.validateBySchema(e,t)}a(rce,"deleteRoutesValidator")});var kg=P((lPe,XG)=>{"use strict";var bo=It(),LN=oe(),As=(G(),D($)),Qu=ce(),YG=KG(),{handleHDBError:WG,hdb_errors:nce}=he(),{HTTP_STATUS_CODES:zG}=nce,jG="cluster routes successfully set",QG="cluster routes successfully deleted";XG.exports={setRoutes:ice,getRoutes:oce,deleteRoutes:ace};function sce(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=LN.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(As.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):bo.updateConfigValue(As.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:jG,set:i,skipped:s}}a(sce,"setRoutesNats");function ice(e){let t=YG.setRoutesValidator(e);if(t)throw WG(t,t.message,zG.BAD_REQUEST,void 0,void 0,!0);if(Qu.get(As.CONFIG_PARAMS.CLUSTERING_ENABLED))return sce(e);let r=[],n=[],s=Qu.get(As.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{JG(s,i)?n.push(i):(s.push(i),r.push(i))}),bo.updateConfigValue(As.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:jG,set:r,skipped:n}}a(ice,"setRoutes");function JG(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(JG,"existsInArray");function oce(){if(Qu.get(As.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=bo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Qu.get(As.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(oce,"getRoutes");function ace(e){let t=YG.deleteRoutesValidator(e);if(t)throw WG(t,t.message,zG.BAD_REQUEST,void 0,void 0,!0);if(Qu.get(As.CONFIG_PARAMS.CLUSTERING_ENABLED))return cce(e);let r=[],n=[],s=Qu.get(As.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{JG(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),bo.updateConfigValue(As.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:QG,deleted:r,skipped:n}}a(ace,"deleteRoutes");function cce(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=LN.isEmptyOrZeroLength(r)?null:r,bo.updateConfigValue(As.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=LN.isEmptyOrZeroLength(n)?null:n,bo.updateConfigValue(As.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:QG,deleted:s,skipped:i}}a(cce,"deleteRoutesNats")});var eq=P((dPe,ZG)=>{"use strict";var ah=require("alasql"),fl=require("recursive-iterator"),ei=X(),lce=oe(),ch=(G(),D($)),MN=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,dce(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=uce(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 uce(e){return e.filter(t=>t[ch.PERMS_CRUD_ENUM.READ])}a(uce,"filterReadRestrictedAttrs");function dce(e,t,r,n,s){fce(e,t,r,n,s)}a(dce,"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 fce(e,t,r,n,s){if(!e){ei.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof ah.yy.Insert?mce(e,t,r):e instanceof ah.yy.Select?_ce(e,t,r,n,s):e instanceof ah.yy.Update?hce(e,t,r):e instanceof ah.yy.Delete?pce(e,t,r):ei.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(fce,"getRecordAttributesAST");function _ce(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(lce.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 fl(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 fl(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 fl(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 fl(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(_ce,"getSelectAttributes");function hce(e,t,r){if(!e){ei.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new fl(e.columns),s=e.table.databaseid;lh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&vN(e.table.tableid,s,i.columnid,t,r)}a(hce,"getUpdateAttributes");function pce(e,t,r){if(!e){ei.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new fl(e.where),s=e.table.databaseid;lh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&vN(e.table.tableid,s,i.columnid,t,r)}a(pce,"getDeleteAttributes");function mce(e,t,r){if(!e){ei.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new fl(e.columns),s=e.into.databaseid;lh(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&vN(e.into.tableid,s,i.columnid,t,r)}a(mce,"getInsertAttributes");function vN(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(vN,"pushAttribute");ZG.exports=MN});var rq=P((_Pe,tq)=>{"use strict";var Fg=(G(),D($)),Gg=class{static{a(this,"BaseLicense")}constructor(t=0,r=Fg.RAM_ALLOCATION_ENUM.DEFAULT,n=Fg.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},UN=class extends Gg{static{a(this,"ExtendedLicense")}constructor(t=0,r=Fg.RAM_ALLOCATION_ENUM.DEFAULT,n=Fg.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};tq.exports={BaseLicense:Gg,ExtendedLicense:UN}});var Zu=P((pPe,cq)=>{"use strict";var Xu=require("fs-extra"),qg=(Vm(),D($m)),sq=require("crypto"),Ece=require("moment"),gce=require("uuid").v4,Qr=X(),BN=require("path"),Sce=oe(),_l=(G(),D($)),{totalmem:nq}=require("os"),Tce=rq().ExtendedLicense,Ju="invalid license key format",Ace="061183",Rce="mofi25",yce="aes-256-cbc",bce=16,Oce=32,iq=ce(),{resolvePath:oq}=It();iq.initSync();var xN;cq.exports={validateLicense:aq,generateFingerPrint:wce,licenseSearch:FN,getLicense:Pce,checkMemoryLimit:Dce};function HN(){return BN.join(iq.getHdbBasePath(),_l.LICENSE_KEY_DIR_NAME,_l.LICENSE_FILE_NAME)}a(HN,"getLicenseDirPath");function Nce(){let e=HN();return oq(BN.join(e,_l.LICENSE_FILE_NAME))}a(Nce,"getLicenseFilePath");function kN(){let e=HN();return oq(BN.join(e,_l.REG_KEY_FILE_NAME))}a(kN,"getFingerPrintFilePath");async function wce(){let e=kN();try{return await Xu.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Ice();throw Qr.error(`Error writing fingerprint file to ${e}`),Qr.error(t),new Error("There was an error generating the fingerprint")}}a(wce,"generateFingerPrint");async function Ice(){let e=gce(),t=qg.hash(e,qg.HASH_FUNCTION.MD5),r=kN();try{await Xu.mkdirp(HN()),await Xu.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(Ice,"writeFingerprint");function aq(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:_l.RAM_ALLOCATION_ENUM.DEFAULT,version:_l.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return Qr.error("empty license key passed to validate."),r;let n=kN(),s=!1;try{s=Xu.statSync(n)}catch(i){Qr.error(i)}if(s){let i;try{i=Xu.readFileSync(n,"utf8")}catch{Qr.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(Rce),c=o[1];c=Buffer.concat([Buffer.from(c)],bce);let l=Buffer.concat([Buffer.from(i)],Oce),u=sq.createDecipheriv(yce,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 _=Cce(o[0],i);if(_)f=_;else throw r.valid_license=!1,r.valid_machine=!1,console.error(Ju),Qr.error(Ju),new Error(Ju)}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(Ju),Qr.error(Ju),new Error(Ju)}else r.exp_date=f;r.exp_date<Ece().valueOf()&&(r.valid_date=!1),qg.validate(o[1],`${Ace}${i}${t}`,qg.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(aq,"validateLicense");function Cce(e,t){try{let r=sq.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(Cce,"checkOldLicense");function FN(){let e=new Tce,t=[];try{t=Xu.readFileSync(Nce(),"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(Sce.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=aq(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=_l.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return xN=e,e}a(FN,"licenseSearch");async function Pce(){return xN||await FN(),xN}a(Pce,"getLicense");function Dce(){let e=FN().ram_allocation,t=process.constrainedMemory?.()||nq();if(t=Math.round(Math.min(t,nq())/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(Dce,"checkMemoryLimit")});var $N=P((EPe,fq)=>{var $g=Zu(),lq=require("chalk"),Qn=X(),uq=require("prompt"),{promisify:Lce}=require("util"),GN=(G(),D($)),Mce=require("fs-extra"),vce=require("path"),Uce=oe(),{packageJson:xce}=Et(),dq=ce();dq.initSync();var Bce=require("moment"),Hce=Lce(uq.get),kce=vce.join(dq.getHdbBasePath(),GN.LICENSE_KEY_DIR_NAME,GN.LICENSE_FILE_NAME,GN.LICENSE_FILE_NAME);fq.exports={getFingerprint:Gce,setLicense:Fce,parseLicense:qN,register:qce,getRegistrationInfo:Vce};async function Fce(e){if(e&&e.key&&e.company){try{Qn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await qN(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(Fce,"setLicense");async function Gce(){let e={};try{e=await $g.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw Qn.error(r),Qn.error(t),new Error(r)}return e}a(Gce,"getFingerprint");async function qN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");Qn.info("Validating license input...");let r=$g.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 Mce.writeFile(kce,JSON.stringify({license_key:e,company:t}))}catch(n){throw Qn.error("Failed to write License"),n}return"Registration successful."}a(qN,"parseLicense");async function qce(){let e=await $ce();return qN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(qce,"register");async function $ce(){let e=await $g.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:lq.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:lq.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{uq.start()}catch(n){Qn.error(n)}let r;try{r=await Hce(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a($ce,"promptForRegistration");async function Vce(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await $g.getLicense()}catch(r){throw Qn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(Uce.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=xce.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=Bce.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(Vce,"getRegistrationInfo")});var hq=P((SPe,_q)=>{"use strict";var Kce=Dt(),VN=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+Kce.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"}};_q.exports=VN});var Eq=P((APe,mq)=>{"use strict";var pq=Dt(),KN=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+pq.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+pq.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"}};mq.exports=KN});var Sq=P((yPe,gq)=>{"use strict";var YN=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};gq.exports=YN});var Aq=P((OPe,Tq)=>{"use strict";var Yce=Dt(),WN=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+Yce.SERVER_SUFFIX.ADMIN,this.password=r}};Tq.exports=WN});var Wg=P((wPe,bq)=>{"use strict";var hl=require("path"),pl=require("fs-extra"),Wce=hq(),zce=Eq(),jce=Sq(),Qce=Aq(),zN=gn(),td=oe(),yn=It(),Kg=(G(),D($)),uh=Dt(),{CONFIG_PARAMS:Qt}=Kg,rd=X(),dh=ce(),Rq=lo(),jN=sr(),Jce=Zs(),ed="clustering",Xce=1e4,yq=50;bq.exports={generateNatsConfig:ele,removeNatsConfig:tle,getHubConfigPath:Zce};function Zce(){let e=dh.get(Qt.ROOTPATH);return hl.join(e,ed,uh.NATS_CONFIG_FILES.HUB_SERVER)}a(Zce,"getHubConfigPath");async function ele(e=!1,t=void 0){let r=dh.get(Qt.ROOTPATH);pl.ensureDirSync(hl.join(r,"clustering","leaf")),dh.initSync();let n=yn.getConfigFromFile(Qt.CLUSTERING_TLS_CERT_AUTH),s=yn.getConfigFromFile(Qt.CLUSTERING_TLS_PRIVATEKEY),i=yn.getConfigFromFile(Qt.CLUSTERING_TLS_CERTIFICATE);!await pl.exists(i)&&!await pl.exists(!n)&&await Jce.createNatsCerts();let o=hl.join(r,ed,uh.PID_FILES.HUB),c=hl.join(r,ed,uh.PID_FILES.LEAF),l=yn.getConfigFromFile(Qt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=hl.join(r,ed,uh.NATS_CONFIG_FILES.HUB_SERVER),f=hl.join(r,ed,uh.NATS_CONFIG_FILES.LEAF_SERVER),d=yn.getConfigFromFile(Qt.CLUSTERING_TLS_INSECURE),h=yn.getConfigFromFile(Qt.CLUSTERING_TLS_VERIFY),_=yn.getConfigFromFile(Qt.CLUSTERING_NODENAME),p=yn.getConfigFromFile(Qt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await jN.checkNATSServerInstalled()||Yg("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await zN.listUsers(),g=yn.getConfigFromFile(Qt.CLUSTERING_USER),R=await zN.getClusterUser();(td.isEmpty(R)||R.active!==!0)&&Yg(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await Vg(Qt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await Vg(Qt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await Vg(Qt.CLUSTERING_HUBSERVER_NETWORK_PORT),await Vg(Qt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[se,z]of S.entries())z.role?.role===Kg.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(E.push(new Qce(z.username,Rq.decrypt(z.hash))),T.push(new jce(z.username,Rq.decrypt(z.hash))));let O=[],{hub_routes:v}=yn.getClusteringRoutes();if(!td.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 Wce(yn.getConfigFromFile(Qt.CLUSTERING_HUBSERVER_NETWORK_PORT),_,o,i,s,n,d,h,p,yn.getConfigFromFile(Qt.CLUSTERING_HUBSERVER_CLUSTER_NAME),yn.getConfigFromFile(Qt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),O,E,T);n==null&&(delete F.tls.ca_file,delete F.leafnodes.tls.ca_file),t=td.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===Kg.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await pl.writeJson(u,F),rd.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 zce(yn.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===Kg.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await pl.writeJson(f,te),rd.trace(`Leaf server config written to ${f}`))}a(ele,"generateNatsConfig");async function Vg(e){let t=dh.get(e);return td.isEmpty(t)&&Yg(`port undefined for '${e}'`),await td.isPortTaken(t)&&Yg(`'${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(Vg,"isPortAvailable");function Yg(e){let t=`Error generating clustering config: ${e}`;rd.error(t),console.error(t),process.exit(1)}a(Yg,"generateNatsConfigError");async function tle(e){let{port:t,config_file:r}=jN.getServerConfig(e),{username:n,decrypt_hash:s}=await zN.getClusterUser(),i=0,o=2e3;for(;i<yq;){try{let f=await jN.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){rd.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=yq)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&&rd.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await td.async_set_timeout(u)}let c="0".repeat(Xce),l=hl.join(dh.get(Qt.ROOTPATH),ed,r);await pl.writeFile(l,c),await pl.remove(l),rd.notify(e,"started.")}a(tle,"removeNatsConfig")});var Pq=P((CPe,Cq)=>{"use strict";var Jn=ce(),rle=Zu(),qe=(G(),D($)),fh=Dt(),Oo=require("path"),{PACKAGE_ROOT:jg}=Et(),Oq=ce(),zg=oe(),nd="/dev/null",nle=Oo.join(jg,"launchServiceScripts"),Nq=Oo.join(jg,"utility/scripts"),sle=Oo.join(Nq,qe.HDB_RESTART_SCRIPT),wq=Oo.resolve(jg,"dependencies",`${process.platform}-${process.arch}`,fh.NATS_BINARY_NAME);function Iq(){let t=rle.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 zg.noBootFile()&&(n[qe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=zg.getEnvCliRootPath()),{name:qe.PROCESS_DESCRIPTORS.HDB,script:qe.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:jg}}a(Iq,"generateMainServerConfig");var ile=9930;function ole(){Jn.initSync(!0);let e=Jn.get(qe.CONFIG_PARAMS.ROOTPATH),t=Oo.join(e,"clustering",fh.NATS_CONFIG_FILES.HUB_SERVER),r=Oo.join(Jn.get(qe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),qe.LOG_NAMES.HDB),n=Oq.get(qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=fh.LOG_LEVEL_FLAGS[Jn.get(qe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==ile?"-"+n:""),script:wq,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 Jn.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=nd,i.error_file=nd),i}a(ole,"generateNatsHubServerConfig");var ale=9940;function cle(){Jn.initSync(!0);let e=Jn.get(qe.CONFIG_PARAMS.ROOTPATH),t=Oo.join(e,"clustering",fh.NATS_CONFIG_FILES.LEAF_SERVER),r=Oo.join(Jn.get(qe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),qe.LOG_NAMES.HDB),n=Oq.get(qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=fh.LOG_LEVEL_FLAGS[Jn.get(qe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==ale?"-"+n:""),script:wq,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 Jn.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=nd,i.error_file=nd),i}a(cle,"generateNatsLeafServerConfig");function lle(){Jn.initSync();let e=Oo.join(Jn.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:nle,autorestart:!1};return Jn.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=nd,t.error_file=nd),t}a(lle,"generateClusteringUpgradeV4ServiceConfig");function ule(){let e={[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.RESTART_HDB};return zg.noBootFile()&&(e[qe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=zg.getEnvCliRootPath()),{...{name:qe.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:Nq},script:sle}}a(ule,"generateRestart");function dle(){return{apps:[Iq()]}}a(dle,"generateAllServiceConfigs");Cq.exports={generateAllServiceConfigs:dle,generateMainServerConfig:Iq,generateRestart:ule,generateNatsHubServerConfig:ole,generateNatsLeafServerConfig:cle,generateClusteringUpgradeV4ServiceConfig:lle}});var hh=P((LPe,Vq)=>{"use strict";var rt=(G(),D($)),fle=oe(),wo=Wg(),Qg=sr(),No=Dt(),Da=Pq(),Jg=ce(),ml=X(),_le=Ro(),{startWorker:Dq,onMessageFromWorkers:hle}=it(),ple=Wu(),DPe=require("util"),mle=require("child_process"),Ele=require("fs"),{execFile:gle}=mle,Qe;Vq.exports={enterPM2Mode:Sle,start:La,stop:QN,reload:Mq,restart:vq,list:JN,describe:Bq,connect:Io,kill:ble,startAllServices:Ole,startService:XN,getUniqueServicesList:Hq,restartAllServices:Nle,isServiceRegistered:kq,reloadStopStart:Fq,restartHdb:xq,deleteProcess:Rle,startClusteringProcesses:qq,startClusteringThreads:$q,isHdbRestartRunning:yle,isClusteringRunning:Ile,stopClustering:wle,reloadClustering:Cle,expectedRestartOfChildren:Uq};var _h=!1;hle(e=>{e.type==="restart"&&Jg.initSync(!0)});function Sle(){_h=!0}a(Sle,"enterPM2Mode");function Io(){return Qe||(Qe=require("pm2")),new Promise((e,t)=>{Qe.connect((r,n)=>{r&&t(r),e(n)})})}a(Io,"connect");var Jr,Tle=10,Lq;function La(e,t=!1){if(_h)return Ale(e);let r=gle(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=Jr.indexOf(r);o>-1&&Jr.splice(o,1),!Lq&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<Tle&&(Ele.existsSync(wo.getHubConfigPath())?La(e):(await wo.generateNatsConfig(!0),La(e),await new Promise(c=>setTimeout(c,3e3)),await wo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await wo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=Jg.get(rt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&No.LOG_LEVEL_HIERARCHY[o]>=No.LOG_LEVEL_HIERARCHY[f||"info"]){let _=f===No.LOG_LEVELS.ERR||f===No.LOG_LEVELS.WRN?ml.OUTPUTS.STDERR:ml.OUTPUTS.STDOUT;ml.logCustomLevel(f||"info",_,n,i.slice(u,l.index).trim())}let[d,h]=l;u=l.index+d.length,f=No.LOG_LEVELS[h]}if(No.LOG_LEVEL_HIERARCHY[o]>=No.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===No.LOG_LEVELS.ERR||f===No.LOG_LEVELS.WRN?ml.OUTPUTS.STDERR:ml.OUTPUTS.STDOUT;ml.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(),!Jr&&(Jr=[],!t)){let i=a(()=>{Lq=!0,Jr&&(Jr.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)}Jr.push(r)}a(La,"start");function Ale(e){return new Promise(async(t,r)=>{try{await Io()}catch(n){r(n)}Qe.start(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Ale,"startWithPM2");function QN(e){if(!_h){for(let t of Jr||[])t.name===e&&(Jr.splice(Jr.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Io()}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(QN,"stop");function Mq(e){return new Promise(async(t,r)=>{try{await Io()}catch(n){r(n)}Qe.reload(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Mq,"reload");function vq(e){if(!_h){Uq();for(let t of Jr||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Io()}catch(n){r(n)}Qe.restart(e,(n,s)=>{Qe.disconnect(),t(s)})})}a(vq,"restart");function Uq(){for(let e of Jr||[])e.config&&(e.config.restarts=0)}a(Uq,"expectedRestartOfChildren");function Rle(e){return new Promise(async(t,r)=>{try{await Io()}catch(n){r(n)}Qe.delete(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Rle,"deleteProcess");async function xq(){await La(Da.generateRestart())}a(xq,"restartHdb");async function yle(){let e=await JN();for(let t in e)if(e[t].name===rt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(yle,"isHdbRestartRunning");function JN(){return new Promise(async(e,t)=>{try{await Io()}catch(r){t(r)}Qe.list((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}a(JN,"list");function Bq(e){return new Promise(async(t,r)=>{try{await Io()}catch(n){r(n)}Qe.describe(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Bq,"describe");function ble(){if(!_h){for(let e of Jr||[])e.kill();Jr=[];return}return new Promise(async(e,t)=>{try{await Io()}catch(r){t(r)}Qe.killDaemon((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}a(ble,"kill");async function Ole(){try{await qq(),await $q(),await La(Da.generateAllServiceConfigs())}catch(e){throw Qe?.disconnect(),e}}a(Ole,"startAllServices");async function XN(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case rt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Da.generateMainServerConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Da.generateNatsIngestServiceConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Da.generateNatsReplyServiceConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Da.generateNatsHubServerConfig(),await La(r,t),await wo.removeNatsConfig(e);return;case rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Da.generateNatsLeafServerConfig(),await La(r,t),await wo.removeNatsConfig(e);return;case rt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Da.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await La(r)}catch(r){throw Qe?.disconnect(),r}}a(XN,"startService");async function Hq(){try{let e=await JN(),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(Hq,"getUniqueServicesList");async function Nle(e=[]){try{let t=!1,r=await Hq();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 vq(o))}t&&await Fq(rt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Qe?.disconnect(),t}}a(Nle,"restartAllServices");async function kq(e){if(Jr?.find(r=>r.name===e))return!0;let t=await ple.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(kq,"isServiceRegistered");async function Fq(e){let t=Jg.get(rt.CONFIG_PARAMS.THREADS_COUNT)??Jg.get(rt.CONFIG_PARAMS.THREADS),r=await Bq(e),n=fle.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await QN(e),await XN(e)):e===rt.PROCESS_DESCRIPTORS.HDB?await xq():await Mq(e)}a(Fq,"reloadStopStart");var Gq;async function qq(e=!1){for(let t in rt.CLUSTERING_PROCESSES){let r=rt.CLUSTERING_PROCESSES[t];await XN(r,e)}}a(qq,"startClusteringProcesses");async function $q(){Gq=Dq(rt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:rt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await Qg.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await Qg.updateLocalStreams();let e=await _le.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===rt.PRE_4_0_0_VERSION){ml.info("Starting clustering upgrade 4.0.0 process"),Dq(rt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a($q,"startClusteringThreads");async function wle(){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 Gq.terminate();else{let t=rt.CLUSTERING_PROCESSES[e];await QN(t)}}a(wle,"stopClustering");async function Ile(){for(let e in rt.CLUSTERING_PROCESSES){let t=rt.CLUSTERING_PROCESSES[e];if(await kq(t)===!1)return!1}return!0}a(Ile,"isClusteringRunning");async function Cle(){await wo.generateNatsConfig(!0),await Qg.reloadNATSHub(),await Qg.reloadNATSLeaf(),await wo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await wo.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(Cle,"reloadClustering")});var tw={};Be(tw,{compactOnStart:()=>Ple,copyDb:()=>Qq});async function Ple(){Ma.notify("Running compact on start"),console.log("Running compact on start");let e=(0,ZN.get)(B.ROOTPATH),t=new Map,r=Ze();(0,ew.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,Xg.join)(e,"backup",n+".mdb"),o=(0,Xg.join)(e,uc,n+"-copy.mdb"),c=0;try{c=await Kq(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){Ma.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 Qq(n,o),console.log("Backing up",n,"to",i),await(0,El.move)(s,i,{overwrite:!0})}try{sd()}catch(n){Ma.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,El.move)(i,s,{overwrite:!0}),await(0,El.remove)((0,Xg.join)(e,uc,`${n}-copy.mdb-lock`));try{sd()}catch(n){Ma.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){Ma.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,ew.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,El.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw sd(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await Kq(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}`;Ma.error(l),console.error(l)}(0,ZN.get)(B.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||o===!1||(console.log("Removing backup",s),await(0,El.remove)(s))}}async function Kq(e){let t=await(0,jq.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}async function Qq(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 Wq.default(t)),c=o.openDB(Zg.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=eS(),g?_.compression=g:delete _.compression,S?.dictionary?.toString()===g?.dictionary?.toString()&&(S=null,g=null)),c.put(h,_),!(p||_.indexed))continue;let R=new zq.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(Zg.AUDIT_STORE_NAME,ph);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,Xg,El,ZN,Wq,zq,Zg,jq,ew,Ma,rw=be(()=>{Ue();Yq=require("lmdb"),Xg=require("path"),El=require("fs-extra"),ZN=M(ce()),Wq=M(Hf()),zq=M(Bf()),Zg=M(Ft());G();so();jq=M(uo()),ew=M(It()),Ma=M(X());a(Ple,"compactOnStart");a(Kq,"getTotalDBRecordCount");a(Qq,"copyDb")});var od=P((GPe,n$)=>{"use strict";var Dle=require("minimist"),{isMainThread:sw,parentPort:Eh,threadId:HPe}=require("worker_threads"),ot=(G(),D($)),Ui=X(),iw=oe(),rS=Wg(),tS=sr(),kPe=Dt(),e$=It(),ti=hh(),Jq=Wu(),{compactOnStart:Lle}=(rw(),D(tw)),Mle=dc(),{restartWorkers:nS,onMessageByType:vle}=it(),{handleHDBError:Ule,hdb_errors:xle}=he(),{HTTP_STATUS_CODES:Ble}=xle,gh=ce(),{sendOperationToNode:Xq,getThisNodeName:Hle,monitorNodeCAs:kle}=(Es(),D(Ra)),{getHDBNodeTable:FPe}=(el(),D(pO));gh.initSync();var mh=`Restarting HarperDB. This may take up to ${ot.RESTART_TIMEOUT_MS/1e3} seconds.`,Fle="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",Zq="Clustering is not enabled so cannot be restarted",Gle="Invalid service",id,Rs;n$.exports={restart:t$,restartService:ow};sw&&vle(ot.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await ow({service:e.workerType}):t$({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function t$(e){Rs=Object.keys(e).length===0,id=await ti.isServiceRegistered(ot.PROCESS_DESCRIPTORS.HDB);let t=Dle(process.argv);if(t.service){await ow(t);return}if(Rs&&!id){console.error(Fle);return}if(Rs&&console.log(mh),id){ti.enterPM2Mode(),Ui.notify(mh);let r=Mle(Object.keys(ot.CONFIG_PARAM_MAP),!0);return iw.isEmptyOrZeroLength(Object.keys(r))||e$.updateConfigValue(void 0,void 0,r,!0,!0),qle(),mh}return sw?(Ui.notify(mh),gh.get(ot.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await Lle(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{nS()},50)):Eh.postMessage({type:ot.ITC_EVENT_TYPES.RESTART}),mh}a(t$,"restart");async function ow(e){let{service:t}=e;if(ot.HDB_PROCESS_SERVICES[t]===void 0)throw Ule(new Error,Gle,Ble.BAD_REQUEST,void 0,void 0,!0);if(ti.expectedRestartOfChildren(),id=await ti.isServiceRegistered(ot.PROCESS_DESCRIPTORS.HDB),!sw){e.replicated&&kle(),Eh.postMessage({type:ot.ITC_EVENT_TYPES.RESTART,workerType:t}),Eh.ref(),await new Promise(s=>{Eh.on("message",i=>{i.type==="restart-complete"&&(s(),Eh.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===Hle())continue;let i;try{({job_id:i}=await Xq(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 Xq(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(!gh.get(ot.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Zq;break}Rs&&console.log("Restarting clustering"),Ui.notify("Restarting clustering"),await r$();break;case ot.HDB_PROCESS_SERVICES.clustering_config:case ot.HDB_PROCESS_SERVICES["clustering config"]:if(!gh.get(ot.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Zq;break}Rs&&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(Rs&&!id){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}Rs&&console.log("Restarting http_workers"),Ui.notify("Restarting http_workers"),Rs?await ti.restart(ot.PROCESS_DESCRIPTORS.HDB):await nS("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Ui.error(r),Rs&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(ow,"restartService");async function qle(){await r$(),await ti.restart(ot.PROCESS_DESCRIPTORS.HDB),await iw.async_set_timeout(2e3),gh.get(ot.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await nw(),Rs&&(await tS.closeConnection(),process.exit(0))}a(qle,"restartPM2Mode");async function r$(){if(!e$.getConfigFromFile(ot.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await Jq.getHDBProcessInfo()).clustering.length===0)Ui.trace("Clustering not running, restart will start clustering services"),await rS.generateNatsConfig(!0),await ti.startClusteringProcesses(),await ti.startClusteringThreads(),await nw(),Rs&&await tS.closeConnection();else{await rS.generateNatsConfig(!0),id?(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 Jq.getHDBProcessInfo()).clustering.forEach(s=>{Ui.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await iw.async_set_timeout(3e3),await nw(),await tS.updateLocalStreams(),Rs&&await tS.closeConnection(),Ui.trace("Restart clustering restarting ingest and reply service threads");let t=nS(ot.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=nS(ot.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(r$,"restartClustering");async function nw(){await rS.removeNatsConfig(ot.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await rS.removeNatsConfig(ot.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(nw,"removeNatsConfig")});var h$=P((VPe,_$)=>{"use strict";var $Pe=require("lodash"),bn=(G(),D($)),{handleHDBError:s$,hdb_errors:$le}=he(),{HDB_ERROR_MSGS:Vle,HTTP_STATUS_CODES:Kle}=$le,aw=X();_$.exports={getRolePermissions:Wle};var gl=Object.create(null),Yle=a(e=>({key:e,perms:{}}),"perms_template_obj"),c$=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),l$=a((e=!1,t=!1,r=!1,n=!1)=>({[bn.PERMS_CRUD_ENUM.READ]:e,[bn.PERMS_CRUD_ENUM.INSERT]:t,[bn.PERMS_CRUD_ENUM.UPDATE]:r,[bn.PERMS_CRUD_ENUM.DELETE]:n}),"permissions_template"),cw=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...l$(t,r,n,s)}),"table_perms_template"),i$=a((e,t=l$())=>({attribute_name:e,describe:f$(t),[Sh]:t[Sh],[lw]:t[lw],[uw]:t[uw]}),"attr_perms_template"),o$=a((e,t=!1)=>({attribute_name:e,describe:t,[Sh]:t}),"timestamp_attr_perms_template"),{READ:Sh,INSERT:lw,UPDATE:uw}=bn.PERMS_CRUD_ENUM,u$=Object.values(bn.PERMS_CRUD_ENUM),d$=[Sh,lw,uw];function Wle(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[bn.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(gl[t]&&gl[t].key===n)return gl[t].perms;let s=zle(e,r);return gl[t]?gl[t].key=n:gl[t]=Yle(n),gl[t].perms=s,s}catch(r){if(!e[bn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[bn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<bn.PERMS_UPDATE_RELEASE_TIMESTAMP){let n=`Role permissions for role '${t}' must be updated to align with new structure from the 2.2.0 release.`;throw aw.error(n),aw.debug(r),s$(new Error,Vle.OUTDATED_PERMS_TRANSLATION_ERROR,Kle.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)&&Od()==0)try{SW(RW(at.get(Xt.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)))}catch{}clearInterval(c),setTimeout(()=>{console.log("forced close server",i,uT),o.cantCleanupProperly||In.warn("Had to forcefully exit the thread",uT),process.exit(0)},5e3).unref()})}if(yW||process.env.DEV_MODE)try{require("inspector").close()}catch(i){In.info("Could not close debugger",i)}}}).ref();let e;rp&&!_ge&&(e=OW()),Promise.resolve(e).then(()=>{if(Od()===0)try{uge(rC)}catch(t){console.error("Error displaying start-up log",t)}np?.postMessage({type:Xt.ITC_EVENT_TYPES.CHILD_STARTED})})})}a(bW,"startServers");function OW(){let e=[];for(let t in qi){let r=qi[t];if(t.includes?.("/")&&Od()==0){nge(t)&&SW(t),e.push(new Promise((o,c)=>{r.listen({path:t},()=>{o({port:t,name:r.name,protocol_name:r.protocol_name}),In.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=Od();if(c<o[0]||c>o[1])continue}let i;try{let o=t.lastIndexOf(":");o>0?rp?n={fd:rp(+t.slice(o+1).replace(/[\[\]]/g,""),t.slice(0,o))}:n={host:+t.slice(o+1).replace(/[\[\]]/g,""),port:t.slice(0,o)}:rp?n={fd:rp(+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}),In.trace("Listening on port "+t,uT)}).on("error",c)}))}return Promise.all(e)}a(OW,"listenOnPorts");!eC&&!jEe?.noServerStart&&bW();function iC(e,t,r){let n=e?.read?e:new QEe({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):(In.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}a(iC,"deliverSocket");var hW=new Map;function hge(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=hW.get(s),r){case"connection":i=iC(void 0,t),hW.set(s,i),i.write=(c,l,u)=>(np.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(np.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let o=i.destroy;i.destroy=()=>{o.call(i),np.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(hge,"proxyRequest");var{getComponentName:fT}=(Ih(),D(wh));function oC(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",gW),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",gW)}a(oC,"registerServer");function aC(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:RW(at.get(Xt.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}a(aC,"getPorts");function cC(e,t){let r=[];for(let{port:n,secure:s}of aC(t))r.push(NW(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?nC[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,oC(e,n,!1)),dT[n]=hT(nC,n);return r}a(cC,"httpServer");function _T(e,t){let r=rC.get(e)??[];rC.set(e,[...r,t])}a(_T,"setPortServerMap");function NW(e,t,r,n){if(_T(e,{protocol_name:t?"HTTPS":"HTTP",name:fT()}),!lT[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:oge(),SNICallback:AW(r?"operations-api":"server",u),ciphers:p.ciphers??p[0]?.ciphers})}let h=lge(),_=lT[e]=(t?d?tge:ege:XEe)(l,async(p,S)=>{try{let R=performance.now(),E=new TW(p,S);r&&(E.isOperationsServer=!0);let T=await dT[e](E);if(!T){if(E._nodeResponse.statusCode)return;T=wW(E)}if(T.headers?.set||(T.headers=new tC(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,lT[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 tC;q?q.length>=0?(typeof q=="string"?ne.set("Content-Length",Buffer.byteLength(q)):ne.set("Content-Length",q.length),j=!0):q instanceof rge&&(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"),cge(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(ep(F,"duration",se,z,T.wasCacheMiss==null?void 0:T.wasCacheMiss?"cache-miss":"cache-hit"),fW(O<400,"success",se,z),fW(1,"response_"+O,se,z),!j)if(q instanceof ReadableStream&&(q=_W.fromWeb(q)),(q[Symbol.iterator]||q[Symbol.asyncIterator])&&(q=_W.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",()=>{ep(performance.now()-v,"transfer",se,z),ep(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?In.warn(R):In.info(R):In.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&&ep(performance.now()-p._parent.startTime,"tls-handshake",e),ep(p.isSessionReused(),"tls-reused",e)}),_.isSecure=!0),oC(_,e)}return lT[e]}a(NW,"getHTTPServer");function hT(e,t){let r=wW;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(hT,"makeCallbackChain");function wW(e){return e.user&&(e._nodeRequest.user=e.user),{status:-1,body:"Not found",headers:new tC}}a(wW,"unhandled");function pge(e,t){cC(e,{requestOnly:!0,...t})}a(pge,"onRequest");function mge(e,t){let r;if(t.securePort){_T(t.securePort,{protocol_name:"TLS",name:fT()});let n=AW("server",t.mtls),s=at.get("tls");r=ige({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&&(_T(t.port,{protocol_name:"TCP",name:fT()}),r=JEe(e,{noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600}),qi[t.port]=r),r}a(mge,"onSocket");Object.defineProperty(ZEe.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 pW=[],sC={};function IW(e,t){for(let{port:r}of aC(t))pW[t?.runFirst?"unshift":"push"]({listener:e,port:r}),sC[r]=hT(pW,r)}a(IW,"onUpgrade");var mW=[],EW={};function Ege(e,t){let r=[];for(let{port:n,secure:s}of aC(t)){_T(n,{protocol_name:s?"WSS":"WS",name:fT()});let i=NW(n,s,t?.isOperationsServer,t?.mtls);tp[n]||(tp[n]=new sge({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),tp[n].on("connection",(o,c)=>{let l=new TW(c);l.isWebSocket=!0;let u=dT[n](l);EW[n](o,l,u)}),IW((o,c,l,u)=>o.__harperdb_request_upgraded?u(o,c,l):tp[n].handleUpgrade(o,c,l,f=>{o.__harperdb_request_upgraded=!0,u(o,c,l),tp[n].emit("connection",f,o)}),{port:n}),i.on("upgrade",(o,c,l)=>{sC[n]&&sC[n](o,c,l)})),r.push(i),mW[t?.runFirst?"unshift":"push"]({listener:e,port:n}),EW[n]=hT(mW,n),dT[n]=hT(nC,n)}return r}a(Ege,"onWebSocket");function gW(e,t){t.writeHead(404),t.end(`Not found
|
|
131
131
|
`)}a(gW,"defaultNotFound")});var dW={};Be(dW,{startHTTPThreads:()=>Sge,startSocketServer:()=>hC,updateWorkerIdleness:()=>BW});async function Sge(e=2,t){try{if(t)fC(0,1,!0);else{let{loadRootComponents:r}=pT();if(e===0)return(0,Ds.setMainIsWorker)(!0),await lC().startServers(),Promise.resolve([]);await r()}xW();for(let r=0;r<e;r++)fC(r,e);return Promise.all(UW)}finally{(0,Ds.threadsHaveStarted)()}}function xW(){let e=(0,LW.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),dC=setInterval(()=>{gT.notify(e)},gge).unref())}function fC(e,t=1,r){if(uC++,(0,Ds.startWorker)("server/threads/threadServer.js",{name:mA.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((o,c)=>{function l(u){u.type===_A.CHILD_STARTED&&(n.removeListener("message",l),o(n))}a(l,"onMessage"),n.on("message",l),n.on("error",c)});UW.push(s),await s,Nd.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",o=>{if(o.requestId){let c=ET.get(o.requestId);c&&c(o)}}),n.on("exit",i),n.on("shutdown",i);function i(){let o=Nd.indexOf(n);o>-1&&Nd.splice(o,1)}if(a(i,"removeWorker"),wd){let o=wd;wd=[];for(let c of o)vW[c.localPort](null,c)}}}),r){let n=setInterval(()=>{_C?_C=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,Ds.shutdownWorkers)(),uC=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function hC(e=0,t){if(typeof e=="string")try{(0,ST.existsSync)(e)&&(0,ST.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=Tge:r=Age(t):r=pC;let n=(0,Id.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);return n._handle&&(n._handle.onconnection=vW[e]=function(s,i){r.readsData||(i.reading=!1,i.readStop()),_C=!0,r(i,(o,c)=>{if(!o){if(CW){let u=i._socket||new Id.Socket({handle:i,writable:!0,readable:!0});CW.deliverSocket(u,e,c),u.resume()}else uC>0?(wd.length===0&&setTimeout(()=>{wd.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,wd.push(i)):(console.log("start up a dynamic thread to handle request"),fC(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 Id.Socket({handle:i,writable:!0,readable:!0});bge(u,o,e)}Lt(!0,"socket-routed")})},gT.info(`HarperDB ${MW.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 pC(e,t){let r,n=0;for(let s of Nd){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=mT)return mT=i,t(r);n=i}mT=0,t(r)}function Tge(e,t){let r={};e.getpeername(r);let n=r.address,s=Cd.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);pC(e,o=>{Cd.set(n,{worker:o,lastUsed:i}),t(o)})}function Age(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new Id.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=Cd.get(l),f=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=f,s(u.worker);pC(n,d=>{Cd.set(l,{worker:d,lastUsed:f}),s(d,o)})})}a(r,"findByHeaderAffinity")}function BW(){mT=0;for(let e of Nd)e.expectedIdle=e.recentELU.idle+Rge,e.requests=1;Nd.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function bge(e,t,r){let n=yge++;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(),ET.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")),ET.delete(n)),s.event=="destroy"&&(e.destroy(),ET.delete(n))})}var Ds,Id,gT,ST,DW,LW,MW,Nd,wd,vW,CW,uC,UW,dC,gge,_C,mT,PW,Cd,Rge,ET,yge,ZI=be(()=>{Ds=M(it()),Id=require("net");G();gT=M(X()),ST=require("fs");Ci();DW=require("worker_threads"),LW=M(Zu()),MW=M(Et()),Nd=[],wd=[],vW=[],uC=0,UW=[];DW.isMainThread&&(process.on("uncaughtException",e=>{e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,Ds.onMessageFromWorkers)(e=>{e.type===pA.RESTART&&dC&&(clearInterval(dC),xW())}));gge=6e5;a(Sge,"startHTTPThreads");a(xW,"licenseWarning");a(fC,"startHTTPWorker");a(hC,"startSocketServer");mT=0;a(pC,"findMostIdleWorker");PW=36e5,Cd=new Map;a(Tge,"findByRemoteAddressAffinity");a(Age,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of Cd)r.lastUsed+PW<e&&Cd.delete(t)},PW).unref();Rge=1e3;a(BW,"updateWorkerIdleness");(0,Ds.setMonitorListener)(BW);ET=new Map,yge=1;a(bge,"proxySocket")});var XW=P((bMe,JW)=>{var kW=M(require("cluster")),ja=M(ce());G();var $i=M(X()),FW=M(require("fastify")),GW=M(require("@fastify/cors")),qW=M(require("@fastify/compress")),$W=M(require("@fastify/static")),VW=M(qb()),KW=M(require("path")),YW=M(Et()),WW=M(ms()),zW=M(oe()),jW=M(gn()),QW=M(Zu());Dr();var Qa=M(qS());eo();ja.default.initSync();var Oge=6e4,Nge=1024*1024*1024,wge="TRUE",{CONFIG_PARAMS:ip}=$,Pd;JW.exports={hdbServer:HW,start:HW};async function HW(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=kW.default.isMaster,await Ige();let t=e.securePort>0;Pd=Cge(t),await Pd.ready(),e||(e={}),e.isOperationsServer=!0;try{Ke.http(Pd.server,e),Pd.server.closeIdleConnections||await Pd.listen({port:0,host:"::"})}catch(r){throw Pd.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(HW,"operationsServer");async function Ige(){$i.default.trace("Configuring HarperDB process."),WW.default.setSchemaDataToGlobal(),await jW.default.setUsersWithRolesCache(),await QW.default.getLicense()}a(Ige,"setUp");function Cge(e){$i.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=Pge(e),r=(0,FW.default)(t);r.server.headersTimeout=Lge(),r.setErrorHandler(Qa.serverErrorHandler);let n=Dge();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(VW.default),r.register(qW.default),r.register($W.default,{root:KW.default.join(YW.PACKAGE_ROOT,"studio/build-local")}),Cf(r);let s=ja.default.get(fA.LOCAL_STUDIO_ON);return r.get("/",function(i,o){return!zW.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?o.sendFile("index.html"):o.sendFile("running.html")}),r.post("/",{preValidation:[Qa.reqBodyValidationHandler,Qa.authHandler],config:{isOperation:!0}},async function(i,o){return i.body?.operation?.startsWith("restart")&&o.header("Connection","close"),(0,Qa.handlePostRequest)(i,o)}),r.get("/health",()=>"HarperDB is running."),$i.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}a(Cge,"buildServer");function Pge(e){let t=ja.default.get(ip.OPERATIONSAPI_NETWORK_TIMEOUT),r=ja.default.get(ip.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:Nge,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}a(Pge,"getServerOptions");function Dge(){let e=ja.default.get(ip.OPERATIONSAPI_NETWORK_CORS),t=ja.default.get(ip.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===wge)&&(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(Dge,"getCORSOpts");function Lge(){return ja.default.get(ip.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??Oge}a(Lge,"getHeaderTimeoutConfig")});var yT={};Be(yT,{disableNATS:()=>vge,publishToStream:()=>RT,setNATSReplicator:()=>mC,setPublishToStream:()=>Uge,setSubscription:()=>TC,start:()=>Mge});function Mge(){op.default.get(B.CLUSTERING_ENABLED)&&Bge()}function vge(e=!0){nz=e}function Uge(e,t){RT=e,TC=t}function Bge(){if(nz||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];mC(s,r,i)}}ol((r,n)=>{mC(r.tableName,r.databaseName,r),n&&iz(r)}),!ZW&&(ZW=!0)}function mC(e,t,r){if(t==="system"&&Hge.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){iz(i)}static subscribe(){let i=new xn;return TC(t,e,i),i}static subscribeOnThisThread(i){return i<(op.default.get(B.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??xge)}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 TT(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=sz;return i}a(n,"getNATSTransaction")}function iz(e){let t=op.default.get(B.CLUSTERING_NODENAME);RT(`${gC.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,SC.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 ez,gC,SC,tz,rz,op,AT,nz,RT,TC,xge,sz,ZW,Hge,TT,EC,AC=be(()=>{Ue();sa();ez=M(sr()),gC=M(Dt()),SC=M(lo());Wl();tz=M(rO()),rz=M(ln()),op=M(ce());G();AT=M(X());a(Mge,"start");a(vge,"disableNATS");RT=ez.publishToStream,TC=tz.setSubscription;a(Uge,"setPublishToStream");xge=2;a(Bge,"assignReplicationSource");Hge=["hdb_job","hdb_analytics","hdb_raw_analytics","hdb_info","hdb_license"];a(mC,"setNATSReplicator");a(iz,"publishSchema");TT=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=op.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||(AT.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(RT(`${gC.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,SC.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(f=>{throw AT.error("An error has occurred trying to replicate transaction",l,f),f.statusCode=504,f}))}return Promise.all(n)}},EC=class extends TT{static{a(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,rz.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};sz=new EC});async function uz({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let o=await RC.get(e,{returnNonexistent:!0});i=new OC(e,t,o),o&&(i.sessionWasPresent=!0)}else{if(e){let o=await RC.get(e);o&&o.delete()}i=new OT(e,t)}return n&&(n.id=e,n.user={username:t?.username},ap.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function yC(){return bT++,bT>65500&&(bT=1),bT}function bC(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 az,Ja,cz,lz,oz,RC,ap,bT,OT,OC,dz=be(()=>{Ue();Zl();az=M(ln()),Ja=M(X());mc();cz=M(it()),lz=M(lC());Dr();oz=100,RC=_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"}]}}]}),ap=_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,cz.getWorkerIndex)()===0&&(async()=>{await lz.when_components_loaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of ap.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await Ke.getUser(r.user.username));try{await bC(r,t,r)}catch{(0,Ja.warn)("Failed to publish will",t)}ap.delete(e.id)}})();a(uz,"getSession");bT=1;a(yC,"getNextMessageId");OT=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=yC());let F=O.id;if(Array.isArray(F)&&(F=Xl(F)),F==null&&(F=""),await this.listener(p+"/"+F,O.value,v,t)===!1)break;this.awaitingAcks?.size>oz?await new Promise(j=>setTimeout(j,this.awaitingAcks.size-oz)):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=yC();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 bC(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 ap.get(this.sessionId);n?.doesExist()&&await bC(n,n.data,r)}}finally{await ap.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(bC,"publish");OC=class extends OT{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=yC(),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,az.getNextMonotonicTime)()),(0,Ja.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),RC.put(this.sessionRecord)}}});var wC={};Be(wC,{bypassAuth:()=>kge,start:()=>Fge});function kge(){mz=!0}function Fge({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new pz.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),hr.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:_,onClose:p}=_z(u,S=>{u.send(S)},f,Promise.resolve(d).then(()=>f?.user),o);u.on("message",_),u.on("close",p),u.on("error",S=>{hr.info?.("WebSocket error",S)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let f;if(o.events.emit("connection",u),hr.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,Dd.get)(B.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&wT.notify?.({username:f?.username,status:Bs.SUCCESS,type:jo.AUTHENTICATION,auth_strategy:"MQTT mTLS",remote_address:u.remoteAddress})}catch(p){throw(0,Dd.get)(B.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&wT.error?.({username:_,status:Bs.FAILURE,type:jo.AUTHENTICATION,auth_strategy:"mqtt",remote_address:u.remoteAddress}),p}}else hr.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(_){o.events.emit("error",_,u),hr.error?.(_)}else if(l.required)return hr.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!f&&mz&&u.remoteAddress.includes("127.0.0.1")&&(f=await(0,hz.getSuperUser)(),hr.debug?.("Auto-authorizing local connection",f?.username));let{onMessage:d,onClose:h}=_z(u,_=>u.write(_),null,f,o);u.on("data",d),u.on("close",h),u.on("error",_=>{hr.info?.("Socket error",_)})},{port:t,securePort:s,mtls:l})),c}function _z(e,t,r,n,s){fz||(fz=!0,y_(d=>{NT>0&&d.push({metric:"mqtt-connections",connections:NT,byThread:!0})}));let i;NT++;let o,c={protocolVersion:4},l=(0,IT.parser)({protocolVersion:5});function u(d){l.parse(d)}a(u,"onMessage");function f(){NT--,i||(i=!0,o?.disconnect?.(),s.events.emit("disconnected",o,e),s.sessions.delete(o),Wn(!1,"connection","mqtt","disconnect"),hr.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"){hr.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,Dd.get)(B.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&wT.notify?.({username:n?.username,status:Bs.SUCCESS,type:jo.AUTHENTICATION,auth_strategy:"MQTT",remote_address:e.remoteAddress})}catch(se){return(0,Dd.get)(B.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&wT.error?.({username:d.username,status:Bs.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=uz({user:n,...d}),o=await o,o.socket=e,r&&(o.request=r),s.sessions.add(o)}catch(se){return hr.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 hr.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?hr.warn?.(ne):hr.info?.(ne):hr.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),hr.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"),hr.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),hr.error?.(T),g({cmd:"disconnect"})}function g(T,O){let v=(0,IT.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=>{hr.warn("MQTT parsing error, closing connection:",d.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:f}}var IT,hz,Dd,NC,pz,wT,hr,mz,fz,NT,Ez=be(()=>{IT=require("mqtt-packet");dz();hz=M(gn());eo();Ci();Dr();Dd=M(ce());G();NC=M(mi()),pz=require("events"),wT=(0,NC.loggerWithTag)("auth-event"),hr=(0,NC.loggerWithTag)("mqtt"),mz=(0,Dd.get)(B.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;a(kge,"bypassAuth");a(Fge,"start");NT=0;a(_z,"onSocket")});var wh={};Be(wh,{component_errors:()=>Md,getComponentName:()=>Kge,loadComponent:()=>DT,loadComponentDirectories:()=>Rz,setErrorReporter:()=>Vge});function Rz(e,t){t&&(CC=t),e&&(LC=e);let r=[];if((0,ut.existsSync)(IC)){let s=(0,ut.readdirSync)(IC,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let o=i.name,c=(0,Tt.join)(IC,o);r.push(DT(c,CC,cA,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(DT(n,CC,n,!1,null,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{Az=!0})}function Vge(e){cp=e}function Yge(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)(UC.PACKAGE_ROOT,t,"dir"),r()}finally{s.primaryStore.unlock(e,0)}})}async function DT(e,t,r,n,s,i){let o=(0,ut.realpathSync)(e);if(CT.has(o))return CT.get(o);CT.set(o,!0),s&&(LC=s);try{let c;n&&(Md=new Map);let l=(0,Tt.join)(e,"harperdb-config.yaml");(0,ut.existsSync)(l)?c=n?(0,LT.getConfigObj)():(0,PC.parseDocument)((0,ut.readFileSync)(l,"utf8")).toJSON():!n&&(0,ut.existsSync)(l=(0,Tt.join)(e,"config.yaml"))?c=(0,PC.parseDocument)((0,ut.readFileSync)(l,"utf8")).toJSON():c=MC;try{let d=(0,Tt.join)(e,"node_modules","harperdb");(n||((0,ut.existsSync)(d)||!e.startsWith((0,DC.getHdbBasePath)()))&&(!(0,ut.existsSync)(d)||(0,ut.realpathSync)(UC.PACKAGE_ROOT)!==(0,ut.realpathSync)(d)))&&await Yge(e,d)}catch(d){Ul.default.error("Error symlinking harperdb module",d),d.code=="EPERM"&&process.platform==="win32"&&Ul.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=PT,f=n;for(let d in c){PT=d;let h=c[d];if(Md.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,DC.getHdbBasePath)().length){O=null;break}if(O)_=await DT(O,t,r,!1),f=!0;else throw new Error(`Unable to find package ${d}:${p}`)}else _=$ge[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(Ld.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&&!gz.includes(T)){let O=vC.get(B.HTTP_SESSIONAFFINITY);O&&Ul.default.warn("Session affinity is not recommended and may cause memory leaks"),(O||!OE)&&(gz.push(T),hC(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})||_),LC.set(_,!0),(_.handleFile||_.handleDirectory||_.setupFile||_.setupDirectory)&&h.files!=null){if(h.files.includes(".."))throw(0,Tz.handleHDBError)("Can not reference parent directories");let T=(0,Tt.join)(e,h.files).replace(/\\/g,"/"),O=T.indexOf("/*");if(O>-1&&h.files!==MC[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(Ld.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,Sz.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 qge(ne);Ld.isMainThread&&await _.setupFile?.(pe,Re,ne,t),t.isWorker&&await _.handleFile?.(pe,Re,ne,t)}else Ld.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}`,cp?.(pe),Ul.default.error(pe),t.set(h.path||"/",new ia(pe)),Md.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}`,cp?.(S),((0,lp.getWorkerIndex)()===0?console:Ul.default).error(S),t.set(h.path||"/",new ia(S),null,!0),Md.set(n?d:(0,Tt.basename)(e),S.message)}}if(PT=u,Ld.isMainThread&&!Az&&i&&(0,lp.watchDir)(e,async()=>Rz()),c.extensionModule){let d=await TE((0,Tt.join)(e,c.extensionModule));return CT.set(o,d),d}if(!f&&t.isWorker){let d=`${e} did not load any modules, resources, or files, is this a valid component?`;cp?.(new Error(d)),((0,lp.getWorkerIndex)()===0?console:Ul.default).error(d),Md.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}`,cp?.(c),t.set("",new ia(c))}}var ut,Tt,Ld,PC,vC,UC,Sz,lp,Ul,Tz,DC,Gge,LT,qge,IC,LC,Az,CC,Md,$ge,MC,gz,CT,cp,PT,Kge,Ih=be(()=>{ut=require("fs"),Tt=require("path"),Ld=require("worker_threads"),PC=require("yaml"),vC=M(ce()),UC=M(Et());G();fL();WL();nB();aB();cB();YB();IK();vK();xK();Sz=M(require("fast-glob")),lp=M(it()),Ul=M(X());bb();Dr();Tz=M(he());Ue();ZI();DC=M(ce()),Gge=M(XW());iS();AC();Es();Ez();LT=M(It());NE();VA();({readFile:qge}=ut.promises),IC=(0,LT.resolvePath)(vC.get(B.COMPONENTSROOT)),LC=new Map,Md=new Map;a(Rz,"loadComponentDirectories");$ge={REST:IE,rest:IE,graphql:lR,graphqlSchema:WA,roles:yb,jsResource:Nb,fastifyRoutes:pI,login:Ib,static:mI,operationsApi:Gge,customFunctions:{},http:{},clustering:yT,replication:Ra,authentication:Th,mqtt:wC,loadEnv:EI},MC={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js",path:"."}};Object.defineProperty(MC,"static",{value:{files:"web/**"}});gz=[],CT=new Map;a(Vge,"setErrorReporter");Kge=a(()=>PT,"getComponentName");a(Yge,"symlinkHarperModule");a(DT,"loadComponent")});var pT=P((eve,bz)=>{var{isMainThread:yz}=require("worker_threads"),{getTables:Wge,getDatabases:XMe,table:ZMe}=(Ue(),D(ct)),{loadComponentDirectories:zge,loadComponent:jge}=(Ih(),D(wh)),{resetResources:Qge}=(Zl(),D(lL)),Jge=pw(),Xge=It(),{dirname:Zge}=require("path"),{getConnection:eSe}=sr(),tSe=ce(),{CONFIG_PARAMS:rSe}=(G(),D($)),{loadCertificates:nSe}=Zs(),xC=new Map;async function sSe(e=!1){!yz&&tSe.get(rSe.CLUSTERING_ENABLED)&&eSe();try{yz&&await Jge()}catch(n){console.error(n)}let t=Qge();Wge(),t.isWorker=e,await nSe(),await jge(Zge(Xge.getConfigFilePath()),t,"hdb",!0,xC),await zge(xC,t);let r=[];for(let[n]of xC)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}a(sSe,"loadRootComponents");bz.exports.loadRootComponents=sSe});var it=P((rve,li)=>{"use strict";Np();var{Worker:iSe,MessageChannel:oSe,parentPort:Vi,isMainThread:GC,threadId:aSe,workerData:Ki}=require("worker_threads"),{PACKAGE_ROOT:cSe}=Et(),{join:Iz,isAbsolute:lSe,extname:uSe}=require("path"),{server:Cz}=(Dr(),D(Vl)),{watch:dSe,readdir:fSe}=require("fs/promises"),{totalmem:Oz}=require("os"),vd=(G(),D($)),Pz=ce(),ci=X(),{randomBytes:_Se}=require("crypto"),{_assignPackageExport:hSe}=ui(),Nz=1024*1024,Xa=[],Ls=[],pSe=50,qC=1e4,mSe="restart",Dz="request_thread_info",Lz="resource_report",Mz="thread_info",vz="added-port",ESe="ack",BC;hSe("threads",Ls);li.exports={startWorker:HC,restartWorkers:VC,shutdownWorkers:RSe,workers:Xa,setMonitorListener:PSe,onMessageFromWorkers:ySe,onMessageByType:Gz,broadcast:OSe,broadcastWithAcknowledgement:wSe,setChildListenerByType:ASe,getWorkerIndex:Uz,getWorkerCount:xz,getTicketKeys:Hz,setMainIsWorker:SSe,setTerminateTimeout:gSe,restartNumber:Ki?.restartNumber||1};Ls.onMessageByType=Gz;Ls.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=Ls.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};li.exports.whenThreadsStarted=new Promise(e=>{li.exports.threadsHaveStarted=e});var $C;function gSe(e){qC=e}a(gSe,"setTerminateTimeout");function Uz(){return Ki?Ki.workerIndex:$C?0:void 0}a(Uz,"getWorkerIndex");function xz(){return Ki?Ki.workerCount:$C?1:void 0}a(xz,"getWorkerCount");function SSe(e){$C=e,li.exports.threadsHaveStarted()}a(SSe,"setMainIsWorker");var Bz=1,MT;function Hz(){return MT||(MT=GC?_Se(48):Ki.ticketKeys,MT)}a(Hz,"getTicketKeys");Object.defineProperty(Cz,"workerIndex",{get(){return Uz()}});Object.defineProperty(Cz,"workerCount",{get(){return xz()}});var kz={[Dz](e,t){ISe(t)},[Lz](e,t){CSe(t,e)}};function HC(e,t={}){let r=process.constrainedMemory?.()||Oz();r=Math.min(r,Oz(),2e4*Nz);let n=Pz.get(vd.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/Nz/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],o=[];for(let l of Ls){let u=new oSe;u.existingPort=l,i.push(u),o.push(u.port2)}uSe(e)||(e+=".js");let c=new iSe(lSe(e)?e:Iz(cSe,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:Bz=t.threadCount,name:t.name,restartNumber:li.exports.restartNumber,ticketKeys:Hz()},transferList:o,...t});for(let{port1:l,existingPort:u}of i)u.postMessage({type:vz,port:l,threadId:c.threadId},[l]);return UT(c,!0),c.unexpectedRestarts=t.unexpectedRestarts||0,c.startCopy=()=>HC(e,t),c.on("error",l=>{ci.error(`Worker index ${t.workerIndex} error:`,l)}),c.on("exit",l=>{Xa.splice(Xa.indexOf(c),1),!c.wasShutdown&&t.autoRestart!==!1&&(c.unexpectedRestarts<pSe?(t.unexpectedRestarts=c.unexpectedRestarts+1,HC(e,t)):ci.error(`Thread has been restarted ${c.restarts} times and will not be restarted`))}),c.on("message",l=>{kz[l.type]?.(l,c)}),Xa.push(c),LSe(),t.onStarted&&t.onStarted(c),c.name=t.name,c}a(HC,"startWorker");var TSe=[vd.THREAD_TYPES.HTTP];async function VC(e=null,t=Math.max(Bz>3,1),r=!0){if(GC){try{process.chdir(process.cwd())}catch(o){ci.error("Unable to reestablish current working directory",o)}if(r){let{loadRootComponents:o}=pT();await o()}li.exports.restartNumber++,t<1&&(t=t*Xa.length);let n=[],s=[];for(let o of Xa.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:vd.ITC_EVENT_TYPES.SHUTDOWN}),o.wasShutdown=!0,o.emit("shutdown",{});let c=TSe.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()},qC*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===vd.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}=od();r&&(e==="http"||!e)&&Pz.get(vd.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else Vi.postMessage({type:mSe,workerType:e})}a(VC,"restartWorkers");function ASe(e,t){kz[e]=t}a(ASe,"setChildListenerByType");function RSe(e){return VC(e,1/0,!1)}a(RSe,"shutdownWorkers");var Fz=[];function ySe(e){Fz.push(e)}a(ySe,"onMessageFromWorkers");var kC=new Map;function Gz(e,t){let r=kC.get(e);r||kC.set(e,r=[]),r.push(t)}a(Gz,"onMessageByType");var bSe=10;async function OSe(e,t){let r=0;for(let n of Ls)try{n.postMessage(e),r++>bSe&&(r=0,await new Promise(setImmediate))}catch(s){ci.error("Unable to send message to worker",s)}t&&$z(e,null)}a(OSe,"broadcast");var vT=new Map,NSe=1;function wSe(e){return new Promise(t=>{let r=0;for(let n of Ls)try{let s=NSe++,i=a(()=>{vT.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,vT.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,o]of vT)o.port===n&&o()})),n.postMessage(e),r++}catch(s){ci.error("Unable to send message to worker",s)}r===0&&t()})}a(wSe,"broadcastWithAcknowledgement");function ISe(e){e.postMessage({type:Mz,workers:qz()})}a(ISe,"sendThreadInfo");function qz(){let e=Date.now();return Xa.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(qz,"getChildWorkerInfo");function CSe(e,t){e.resources=t,e.resources.updated=Date.now()}a(CSe,"recordResourceReport");var FC;function PSe(e){FC=e}a(PSe,"setMonitorListener");var DSe=1e3,wz=!1;function LSe(){wz||(wz=!0,setInterval(()=>{for(let e of Xa){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}FC&&FC()},DSe).unref())}a(LSe,"startMonitoring");var MSe=1e3;if(Vi&&Ki?.addPorts){UT(Vi);for(let e=0,t=Ki.addPorts.length;e<t;e++){let r=Ki.addPorts[e];r.threadId=Ki.addThreadIds[e],UT(r)}setInterval(()=>{let e=process.memoryUsage();Vi.postMessage({type:Lz,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},MSe).unref(),BC=a(()=>new Promise((e,t)=>{Vi.on("message",r),Vi.postMessage({type:Dz});function r(n){n.type===Mz&&(Vi.off("message",r),e(n.workers))}a(r,"receiveThreadInfo")}),"getThreadInfo")}else BC=qz;li.exports.getThreadInfo=BC;function UT(e,t){Ls.push(e),e.on("message",r=>{if(r.type===vz)r.port.threadId=r.threadId,UT(r.port);else if(r.type===ESe){let n=vT.get(r.id);n&&n()}else $z(r,e)}).on("close",()=>{Ls.splice(Ls.indexOf(e),1)}).on("exit",()=>{Ls.splice(Ls.indexOf(e),1)}),t?e.refCount=100:e.unref()}a(UT,"addPort");function $z(e,t){for(let n of Fz)n(e,t);let r=kC.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){ci.error(s)}}a($z,"notifyMessageListeners");if(GC){let e,t,r=new Set,n=a(async(s,i)=>{i&&(e=i);for(let o of await fSe(s,{withFileTypes:!0}))o.isDirectory()&&o.name!=="node_modules"&&n(Iz(s,o.name));try{for await(let{filename:o}of dSe(s,{persistent:!1}))r.add(o),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await VC(),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===vd.ITC_EVENT_TYPES.SHUTDOWN&&(li.exports.restartNumber=e.restartNumber,Vi.unref(),setTimeout(()=>{ci.warn("Thread did not voluntarily terminate",aSe),process.exit(0)},qC).unref())})});var Rx={};Be(Rx,{ACTION_32_BIT:()=>ym,ACTION_64_BIT:()=>BSe,AUDIT_STORE_OPTIONS:()=>ph,Decoder:()=>il,HAS_BLOBS:()=>pn,HAS_CURRENT_RESIDENCY_ID:()=>Ic,HAS_EXPIRATION_EXTENDED_TYPE:()=>xf,HAS_ORIGINATING_OPERATION:()=>Uf,HAS_PREVIOUS_RESIDENCY_ID:()=>Cc,REMOTE_SEQUENCE_UPDATE:()=>cg,createAuditEntry:()=>Nc,getLastRemoved:()=>USe,openAuditStore:()=>HT,readAuditEntry:()=>Pt,removeAuditEntry:()=>kT,setAuditRetention:()=>xSe,transactionKeyEncoder:()=>Xz});function HT(e){let t=e.auditStore=e.openDB(KC.AUDIT_STORE_NAME,{create:!1,...ph});t||(t=e.auditStore=e.openDB(KC.AUDIT_STORE_NAME,ph),Kz(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=WC;Zh(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()-YC/(1+i*i)})){try{h=kT(t,p,S)}catch(g){Ud.warn("Error removing audit entry",g)}if(_=p,await new Promise(setImmediate),++d>=vSe){o=10;break}}await h}finally{d===0?o=Math.min(o<<1,YC/10):(Kz(t,_),o>100&&(o=o>>1)),f(void 0),c()}},o).unref()});return u}if(a(c,"scheduleAuditCleanup"),t.scheduleAuditCleanup=c,(0,dp.getWorkerIndex)()===(0,dp.getWorkerCount)()-1&&c(),(0,dp.getWorkerIndex)()===0&&!Vz)for(let l of t.getKeys({reverse:!0,limit:1}))l>Date.now()&&(Vz=!0,Ud.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 kT(e,t,r){let n=HSe(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)&&Ac(()=>oa(s.getValue(i)),i.rootStore)}if((n&15)===zC){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 Kz(e,t){jC[0]=t,e.put(Symbol.for("last-removed"),Zz)}function USe(e){let t=e.get(Symbol.for("last-removed"));if(t)return Zz.set(t),jC[0]}function xSe(e,t=WC){YC=e,WC=t}function Nc(e,t,r,n,s,i,o,c,l,u,f,d,h){let _=ej[o];if(!_)throw new Error(`Invalid audit entry type ${o}`);let p=1;if(n&&(n>1?Za.setFloat64(0,n):Ms.set(SR),p=9),l){if(l&255)throw new Error("Illegal extended type");p+=3}R(s),R(t),g(r),Za.setFloat64(p,e),p+=8,l&Ic&&R(u),l&Cc&&R(f),l&xf&&(Za.setFloat64(p,d),p+=8),l&Uf&&R(tj[h]),i?g(i):Ms[p++]=0,l?Za.setUint32(n?8:0,_|l|3221225472):Ms[n?8:0]=_;let S=Ms.subarray(0,p);if(c)return Buffer.concat([S,c]);return S;function g(E){let T=p;p+=1,p=(0,xl.writeKey)(E,Ms,p);let O=p-T-1;O>127?O>16383?(Ud.error("Key or username was too large for audit entry",E),p=T+1,Ms[T]=0):(Ms.copyWithin(T+2,T+1,p),Za.setUint16(T,O|32768),p++):Ms[T]=O}function R(E){E<128?Ms[p++]=E:E<16384?(Za.setUint16(p,E|32768),p+=2):E<1056964608?(Za.setUint32(p,E|3221225472),p+=4):(Ms[p]=255,Za.setUint32(p+1,E),p+=5)}}function HSe(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 il(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 il(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&Ic&&(h=n.readInt()),i&Cc&&(_=n.readInt()),i&xf&&(p=n.readFloat64()),i&Uf){let T=n.readInt();S=tj[T]}l=n.readInt();let g=n.position,R=n.position+=l,E;return{type:ej[i&7],tableId:c,nodeId:o,get recordId(){return(0,xl.readKey)(e,u,f)},getBinaryRecordId(){return e.subarray(u,f)},version:d,previousLocalTime:s,get user(){return R>g?(0,xl.readKey)(e,g,R):void 0},get encoded(){return t?e.subarray(t,r):e},getValue(T,O,v){if(i&xT||i&up&&!O)return E||(E=Ac(()=>T.decoder.decode(e.subarray(n.position,r)),T.rootStore)),E;if(i&up&&v)return cb(T.getEntry(this.recordId),v,T)},getBinaryValue(){return i&(xT|up)?e.subarray(n.position,r):void 0},extendedType:i,residencyId:h,previousResidencyId:_,expiresAt:p,originatingOperation:S}}catch(n){return Ud.error("Reading audit entry error",n,e),{}}}var xl,BT,KC,dp,Jz,Ud,Ms,Za,Xz,ph,YC,vSe,jC,Zz,WC,Vz,xT,up,Yz,zC,Wz,zz,jz,Qz,ym,BSe,cg,Ic,Cc,Uf,xf,pn,ej,tj,il,so=be(()=>{xl=require("ordered-binary"),BT=M(ce()),KC=M(Ft());G();dp=M(it()),Jz=M(oe());su();Ud=M(X());aE();_s();aT();(0,BT.initSync)();Ms=Buffer.alloc(2816),Za=new DataView(Ms.buffer,Ms.byteOffset,2816),Xz={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,xl.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,xl.readKey)(e,t,r)}},ph={encoding:"binary",keyEncoder:Xz},YC=(0,Jz.convertToMS)((0,BT.get)(B.LOGGING_AUDITRETENTION))||86400*3,vSe=1e3,jC=new Float64Array(1),Zz=new Uint8Array(jC.buffer),WC=1e4,Vz=!1;a(HT,"openAuditStore");a(kT,"removeAuditEntry");a(Kz,"updateLastRemoved");a(USe,"getLastRemoved");a(xSe,"setAuditRetention");xT=16,up=32,Yz=1,zC=2,Wz=3,zz=4,jz=5,Qz=6,ym=14,BSe=15,cg=11,Ic=512,Cc=1024,Uf=2048,xf=4096,pn=8192,ej={put:Yz|xT,[Yz]:"put",delete:zC,[zC]:"delete",message:Wz|xT,[Wz]:"message",invalidate:zz|up,[zz]:"invalidate",patch:jz|up,[jz]:"patch",relocate:Qz,[Qz]:"relocate"},tj={insert:1,update:2,upsert:3,1:"insert",2:"update",3:"upsert"};a(Nc,"createAuditEntry");a(HSe,"readAction");a(Pt,"readAuditEntry");il=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 XC(e,t,r,n,s){let i=e.primaryStore.env.path,o=e.primaryStore.tableId,c;s?.crossThreads===!1?(c=nj,kSe(e.primaryStore,e.auditStore)):(c=rj,e.primaryStore.env.hasSubscriptionCommitListener||(e.primaryStore.env.hasSubscriptionCommitListener=!0,e.primaryStore.on("committed",()=>{sj(rj[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=Xl(t);let f=new JC(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 sj(e){if(!e)return;let t=e.auditStore;t.resetReadTxn(),ij(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=Xl(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,QC.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,QC.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 kSe(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=nj[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{sj(l)}finally{r.threadLocalWrites[0]=l.lastTxnTime,r.unlock("thread-local-writes")}},"acquiredLock");r.attemptLock("thread-local-writes",u)&&u()})}}function ij(e){e.nextTransaction?.resolve();let t;e.nextTransaction=new Promise(r=>{t=r}),e.nextTransaction.resolve=t}function jk(e){return e.nextTransaction||(XC({primaryStore:e,auditStore:e},null,null,0,{scope:"full-database"}),ij(e)),e.nextTransaction}var QC,rj,nj,JC,GO=be(()=>{QC=M(X());Wl();Zl();so();rj=Object.create(null),nj=Object.create(null);a(XC,"addSubscription");JC=class extends xn{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(sj,"notifyFromTransactionData");a(kSe,"listenToCommits");a(ij,"nextTransaction");a(jk,"whenNextTransaction")});var Jw={};Be(Jw,{EVICTED:()=>na,INVALIDATED:()=>fn,coerceType:()=>qT,makeTable:()=>VT,setServerUtilities:()=>WSe});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=RR(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,Pn,nn,wr,Fd=!1,sc,ZT=new Map,eA=new Map,Ht,Gd,qd=Hl.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 tA=i.getRange({start:!1,end:!1}).constructor,Ap=10,$d=6;g&&Rp(),Zh(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===ql.ROLE_TABLE_NAME||N.table===ql.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:cc(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,Bl.getWorkerIndex)(),H):(0,Bl.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"}),_p.signalSchemaChange(new hp.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(()=>_p.signalUserChange(new hp.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 Dn(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,eP(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,eP(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&&(!jSe(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&&Rp(),De.audit=m}static coerceId(m){return m===""?null:qT(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 GT.default.remove(data_path),await GT.default.remove(data_path===standard_path?data_path+MDB_LOCK_FILE_SUFFIX:path.join(path.dirname(data_path),MDB_LEGACY_LOCK_FILE_NAME));_p.signalSchemaChange(new hp.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=ic(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&&ZC(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=ic(m);if(L?.update){let C=L.attribute_permissions;if(C?.length>0){let A=ZC(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=ic(m);if(L?.insert){let C=L.attribute_permissions;if(C?.length>0){let A=ZC(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 ic(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===aj?this.set(m,(+this.getProperty(m)||0)+y):(this.#s||this.update(),this.set(m,new uE(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=ac(this.getResidency(y.value,L)),A;if(C){if(!C.includes(server.hostname))return!1;A=cc(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);wc(i,A??i.getEntry(m),L)}}lock(){throw new Error("Not yet implemented")}static operation(m,y){return m.table||=s,m.schema||=c,pj.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?aj:VSe;let I={key:w,store:i,entry:b,nodeName:C?.nodeName,validate:a(x=>{m||(m=this.#t),y||m&&cE(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=Vc(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,Vc(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,Vc(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=oE(Q,Pe,y),xe.default.debug?.("Rebuilding update with future patch:",Q),!Q)return}}else{if(y)return;Q=oE(Q,U,y),xe.default.debug?.("Rebuilding update without audit:",Q)}let de;if(y?de=Q:(this.#e=U,de=Vc(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=ac(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=cc(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()):wc(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||kA[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,Ln;if(Ve.comparator==="gt"||Ve.comparator==="greater_than"||Ve.comparator==="ge"||Ve.comparator==="greater_than_equal"?(We=me,Ln=Ve):(We=Ve,Ln=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=Ln.comparator==="ge"||Ln.comparator==="greater_than_equal",yp=We.comparator==="le"||We.comparator==="less_than_equal";me.comparator=(os?"ge":"gt")+(yp?"le":"lt"),me.value=[Ln.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,_j.sortBy)(V,Zp(De)):V}a(I,"orderConditions");function x(V,ue){return Array.isArray(V)?V.map(_e=>qT(_e,ue)):qT(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=>Jl(ue.attribute)===Jl(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=FA(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 tA;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=oc(_e,Y.attribute,C),Pe=oc(me,Y.attribute,C),Ve=ue?(0,kl.compareKeys)(Pe,Te):(0,kl.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=oc(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 tc.SKIP;if(N=Dn(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?tc.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]:Jl(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"),Ln=We(Ve.next());Ln&&(U||(U=[]),U.push(Ln));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=XC(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||dj(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>lj&&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||dj(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,kl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(H&&(A.send({id:N,localTime:Q,value:H,version:U,type:"put"}),A.queue?.length>lj&&await A.waitForDrain()===!1))return}}else{I&&!x&&(x=0);let N=this.#r?.localTime;if(N===AR&&(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 ${vs(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 ${vs(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 ${vs(A)} in property ${b} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof A!="number"&&(L||(L=[])).push(`Value ${vs(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 ${vs(A)} in property ${b} must be a string, or an array of strings`);break;case"String":typeof A!="string"&&(L||(L=[])).push(`Value ${vs(A)} in property ${b} must be a string`);break;case"Boolean":typeof A!="boolean"&&(L||(L=[])).push(`Value ${vs(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 ${vs(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 ${vs(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 ${vs(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 ${vs(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 ${vs(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,hj.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=GT.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 ec(),!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 ec();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?Ql({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(fj)):N.filter(fj):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]=()=>{}})}dE(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 ec(),Pt(A).tableId===n&&(L=kT(l,C,A));if(y)for(let C of i.getRange({start:0,versions:!0})){let{key:A,value:w,localTime:b}=C;await ec(),w===null&&b<m&&(L=wc(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 ec();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 ec();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,fp.getIndexedValues)(I,N),U=(0,fp.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)&&oj){let J=U.concat(H).map(k=>({key:k,value:K}));A.prefetch(J,uj)}for(let J=0,k=U.length;J<k;J++)A.remove(U[J],K)}else H?.length>0&&oj&&A.prefetch(H.map(Q=>({key:Q,value:K})),uj);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>cj)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,kl.writeKey)(K,KSe,0)>cj)throw new Error("Primary key size is too large: "+K.length);return!0}a(Ir,"checkValidId");function Dn(K,m,y,L,C){if(De.getResidencyById&&y.ensureLoaded&&m?.replicateFrom!==!1){let w=ac(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<Ap&&Re++}a(I,"prefetch");function x(){try{w(A())}catch(N){b(N)}}a(x,"load")})}a(Dn,"loadLocalRecord");function ic(K){if(!K?.role)return;let m=K.role.permission;if(m.super_user)return YSe;let y=m[c],L,C=y?.tables;if(C)return C[s];if(c==="data"&&(L=m[s])&&!L.tables)return L}a(ic,"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 pc,m.lmdbDb=i,m;m=y}while(!0)}else return new Qp}a(Cr,"txnForContext");function oc(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(oc,"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 tc.SKIP;for(let U=0;U<A;U++)if(!b?.includes(U)&&!C[U](H,x))return tc.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 tc.SKIP;for(let H=0;H<A;H++){let Q=C[H].idFilter;if(Q){if(!Q(N))return tc.SKIP;b||(b=[]),b.push(H)}}return Dn(N,y,w,!1,I)});return Array.isArray(K)&&(x=x.filter(N=>N!==tc.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)},$Se)});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;eP(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,fp.getNextMonotonicTime)());let V=performance.now()-J;if(Lt(V,"cache-resolution",s,null,"success"),x&&bE(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&&bE(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=ac(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=cc(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):wc(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===Pn&&!m)&&(Pn=Bt,(0,Bl.getWorkerIndex)()===(0,Bl.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)*(Hl.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&&tu(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+qSe<Date.now()?ue=wc(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 ec()}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 Rp(){z=l?.addDeleteRemovalCallback(n,i,(K,m)=>{i.remove(K,m)})}a(Rp,"addDeleteRemoval");function Wd(){(0,Bl.getWorkerIndex)()===0&&setInterval(async()=>{if(!sc){sc=!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 ec()}}catch(K){xe.default.error?.("Error in evicting old records",K)}finally{sc=!1}}},GSe).unref()}a(Wd,"runRecordExpirationEviction");function ac(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(ac,"residencyFromFunction");function cc(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(cc,"getResidencyId")}function ZC(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 uj(){}function WSe(e){pj=e}function qT(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 FT(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return FT(+e);case"Float":return e==="null"?null:FT(+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;zSe.test(e)||(e+="Z");let n=new Date(e);return FT(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,$T.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function FT(e){if(isNaN(e))throw new SyntaxError;return e}function dj(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 eP(e,t,r){return e?.then?e.then(t,r):t(e)}function fj(e){return e!=null}function vs(e){try{return JSON.stringify(e)}catch{return e}}function jSe(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var tc,fp,_j,hj,Hl,Nr,_p,hp,xe,kl,Bl,$T,GT,FSe,pj,GSe,qSe,oj,$Se,aj,VSe,fn,na,KSe,cj,lj,YSe,Mve,zSe,ec,Tf=be(()=>{G();tc=require("lmdb"),fp=M(ln()),_j=require("lodash"),hj=M(hf());sa();Jp();Hl=M(ce());GO();Nr=M(he()),_p=M(_o()),hp=M(Ks());Ue();Sf();xe=M(mi());db();mc();kl=require("ordered-binary"),Bl=M(it());so();$T=M(oe());su();Ci();aE();O_();GT=M(require("node:fs"));_s();aT();FSe=new Uint8Array(9);FSe[8]=192;GSe=6e4,qSe=864e5;Hl.initSync();oj=Hl.get(B.STORAGE_PREFETCHWRITES),$Se=1e4,aj=1,VSe=2,fn=1,na=8,KSe=Buffer.allocUnsafeSlow(8192),cj=1978,lj=100,YSe={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},Mve=(0,$T.convertToMS)(Hl.get(B.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;a(VT,"makeTable");a(ZC,"attributesAsObject");a(uj,"noop");a(WSe,"setServerUtilities");zSe=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;a(qT,"coerceType");a(FT,"rejectNaN");a(dj,"isDescendantId");ec=a(()=>new Promise(setImmediate),"rest");a(eP,"when");a(fj,"exists");a(vs,"stringify");a(jSe,"hasOtherProcesses")});var ct={};Be(ct,{database:()=>Eu,database_envs:()=>Ko,databases:()=>Ye,dropDatabase:()=>mb,dropTableMeta:()=>eTe,getDatabases:()=>Ze,getDefaultCompression:()=>eS,getTables:()=>QSe,onRemovedDB:()=>W_,onUpdatedTable:()=>ol,readMetaDb:()=>pp,resetDatabases:()=>sd,table:()=>_t,tables:()=>Yn});function QSe(){return zT||Ze(),Yn||{}}function Ze(){if(zT)return Ye;zT=!0,Hd=new Map;let e=(0,Zt.getHdbBasePath)()&&(0,Ut.join)((0,Zt.getHdbBasePath)(),uc),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,ss.existsSync)(e)?e:(0,Ut.join)((0,Zt.getHdbBasePath)(),Cp)),!e)return;if((0,ss.existsSync)(e))for(let n of(0,ss.readdirSync)(e,{withFileTypes:!0})){let s=(0,Ut.basename)(n.name,".mdb");n.isFile()&&(0,Ut.extname)(n.name).toLowerCase()===".mdb"&&!t[s]?.path&&pp((0,Ut.join)(e,n.name),null,s)}if((0,ss.existsSync)((0,Bd.getBaseSchemaPath)())){for(let n of(0,ss.readdirSync)((0,Bd.getBaseSchemaPath)(),{withFileTypes:!0}))if(!n.isFile()){let s=(0,Ut.join)((0,Bd.getBaseSchemaPath)(),n.name),i=(0,Ut.join)((0,Bd.getTransactionAuditStoreBasePath)(),n.name);for(let o of(0,ss.readdirSync)(s,{withFileTypes:!0}))if(o.isFile()&&(0,Ut.extname)(o.name).toLowerCase()===".mdb"){let c=(0,Ut.join)(i,o.name);pp((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,ss.existsSync)(i))for(let c of(0,ss.readdirSync)(i,{withFileTypes:!0}))c.isFile()&&(0,Ut.extname)(c.name).toLowerCase()===".mdb"&&pp((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,ss.existsSync)(u)&&pp(u,c,n,null,!0)}}for(let n in Ye){let s=Hd.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[jT]}}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 Hd=null,Ye}function sd(){zT=!1;for(let[,e]of Ko)e.needsDeletion=!0;Ze();for(let[e,t]of Ko)t.needsDeletion&&!e.endsWith("system.mdb")&&(t.close(),Ko.delete(e),delete Ye[t.databaseName],Ep.forEach(r=>r(t.databaseName)));return Ye}function pp(e,t,r=nP,n,s){let i=new tP.default(e,!1);try{let o=Ko.get(e);o?o.needsDeletion=!1:(o=(0,kd.open)(i),Ko.set(e,o));let c=new Fl.default(!1),l=o.dbisDb||(o.dbisDb=o.openDB(KT.INTERNAL_DBIS_NAME,c)),u=o.auditStore;u||(n?(0,ss.existsSync)(n)&&(i.path=n,u=(0,kd.open)(i),u.isLegacy=!0):u=HT(o));let f=Sj(r),d=f[jT],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(xd)||0)&&(l.putSync(xd,O+1),xt.info(`Updating next table id (it was out of sync) to ${O+1} for ${_}`)):(g.tableId=O=l.get(xd),O||(O=1),xt.debug("Table {table_name} missing an id, assigning {table_id}"),l.putSync(xd,O+1),l.putSync(g.key,g));let ie=new Fl.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)||gj;ie.compression.threshold=Re}v=Om(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 Fl.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=Tj(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 mp)ie(R)}}return o}catch(o){throw o.message+=` opening database ${e}`,o}}function Sj(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)),Hd&&!Hd.has(e)){let r=new Set;t[jT]=r,Hd.set(e,r)}return t}function Tj(e,t,r){return e[t]=r,r}function Eu({database:e,table:t}){e||(e=nP),Ze();let r=Sj(e),n=(0,Ut.join)((0,Zt.getHdbBasePath)(),uc),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,ss.existsSync)(n)?n:(0,Ut.join)((0,Zt.getHdbBasePath)(),Cp));let o=(0,Ut.join)(n,(i?t:e)+".mdb"),c=Ko.get(o);if(!c||c.status==="closed"){let l=new tP.default(o,!1);c=(0,kd.open)(l),Ko.set(o,c)}return c.auditStore||(c.auditStore=HT(c)),c}async function mb(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,Ko.delete(r.path),r.status==="open"&&(await r.close(),await gp.remove(r.path));if(r||(r=Eu({database:e,table:null}),r.status==="open"&&(await r.close(),await gp.remove(r.path))),e==="data"){for(let n in Yn)delete Yn[n];delete Yn[jT]}delete Ye[e],Ep.forEach(n=>n(e)),await tR(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=nP);let p=Eu({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 Fl.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=eS(),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 Fl.default(!1,!0);ne.compression=E.compression;let le=t+"/";if(T=p.dbisDb=p.openDB(KT.INTERNAL_DBIS_NAME,O),se(),T.get(le))return F&&F(),sd(),_t(e);let ie=Om(p.openDB(le,ne),p);p.databaseName=r,ie.tableId=T.get(xd),xt.trace(`Assigning new table id ${ie.tableId} for ${t}`),ie.tableId||(ie.tableId=1),T.put(xd,ie.tableId+1),E.tableId=ie.tableId,g=Tj(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(KT.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 Fl.default(!0,!1),pe=p.openDB(ne,Re);(ie||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<Sp.workerData?.restartNumber)&&(v=!0,se(),le=T.get(ne),(ie||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<Sp.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=ZSe(g,te,j):v&&YT.signalSchemaChange(new WT.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=_,v)for(let z of mp)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 ZSe(e,t,r){try{xt.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await YT.signalSchemaChange(new WT.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,kd.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,mj.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)}),Sp.workerData&&Sp.workerData.restartNumber!==Ej.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>JSe?await s:f>XSe&&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 YT.signalSchemaChange(new WT.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 eTe({table:e,database:t}){let r=Eu({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 ol(e){return mp.push(e),{remove(){let t=mp.indexOf(e);t>-1&&mp.splice(t,1)}}}function W_(e){return Ep.push(e),{remove(){let t=Ep.indexOf(e);t>-1&&Ep.splice(t,1)}}}function eS(){let e=(0,Zt.get)(B.STORAGE_COMPRESSION),t=(0,Zt.get)(B.STORAGE_COMPRESSION_DICTIONARY),r=(0,Zt.get)(B.STORAGE_COMPRESSION_THRESHOLD)||gj,n={startingOffset:32};return t&&(n.dictionary=gp.readFileSync(t)),r&&(n.threshold=r),e&&n}var Zt,KT,kd,Ut,ss,Bd,Fl,tP,gp,rP,mj,YT,WT,Sp,xt,Ej,nP,jT,gj,Yn,Ye,xd,mp,Ep,zT,Ko,Hd,JSe,XSe,Ue=be(()=>{Zt=M(ce()),KT=M(Ft()),kd=require("lmdb"),Ut=require("path"),ss=require("fs"),Bd=M(gt());Tf();Fl=M(Bf()),tP=M(Hf());G();gp=M(require("fs-extra")),rP=M(ui()),mj=M(ln()),YT=M(_o()),WT=M(Ks()),Sp=require("worker_threads"),xt=M(X()),Ej=M(it());so();su();_s();nP="data",jT=Symbol("defined-tables"),gj=((0,Zt.get)(B.STORAGE_PAGESIZE)||4096)-60;(0,Zt.initSync)();Yn=Object.create(null),Ye=Object.create(null);(0,rP._assignPackageExport)("databases",Ye);(0,rP._assignPackageExport)("tables",Yn);xd=Symbol.for("next-table-id"),mp=[],Ep=[],Ko=new Map;a(QSe,"getTables");a(Ze,"getDatabases");a(sd,"resetDatabases");a(pp,"readMetaDb");a(Sj,"ensureDB");a(Tj,"setTable");a(Eu,"database");a(mb,"dropDatabase");a(_t,"table");JSe=1e3,XSe=10;a(ZSe,"runIndexing");a(eTe,"dropTableMeta");a(ol,"onUpdatedTable");a(W_,"onRemovedDB");a(eS,"getDefaultCompression")});var oe=P((Vve,vj)=>{"use strict";var rc=require("path"),Oj=require("fs-extra"),Cn=X(),Aj=require("fs-extra"),QT=require("os"),tTe=require("net"),rTe=require("recursive-iterator"),Ar=(G(),D($)),{PACKAGE_ROOT:nTe}=Et(),sTe=RA(),Rj=require("papaparse"),JT=require("moment"),{inspect:iTe}=require("util"),yj=require("is-number"),$ve=require("lodash"),oTe=require("minimist"),aTe=require("https"),cTe=require("http"),{hdb_errors:XT}=he(),lTe=/^((\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)))$/,Nj=require("util").promisify(setTimeout),uTe=100,dTe=5,fTe="",_Te=4,bj={true:!0,TRUE:!0,FALSE:!1,false:!1,undefined:null,null:null,NULL:null,NaN:NaN};vj.exports={isEmpty:is,isEmptyOrZeroLength:Yi,arrayHasEmptyValues:mTe,arrayHasEmptyOrZeroLengthValues:ETe,buildFolderPath:gTe,isBoolean:wj,errorizeMessage:hTe,stripFileExtension:TTe,autoCast:ATe,autoCastJSON:Ij,autoCastJSONDeep:iP,removeDir:RTe,compareVersions:yTe,isCompatibleDataVersion:bTe,escapeRawValue:OTe,unescapeValue:NTe,stringifyProps:wTe,timeoutPromise:CTe,isClusterOperation:DTe,getClusterUser:MTe,checkGlobalSchemaTable:LTe,getHomeDir:Pj,getPropsFilePath:ITe,promisifyPapaParse:vTe,removeBOM:Dj,createEventPromise:UTe,checkProcessRunning:xTe,checkSchemaTableExist:BTe,checkSchemaExists:Lj,checkTableExists:Mj,getStartOfTomorrowInSeconds:HTe,getLimitKey:kTe,isObject:STe,isNotEmptyAndHasValue:pTe,autoCasterIsNumberCheck:Cj,backtickASTSchemaItems:FTe,isPortTaken:PTe,createForkArgs:GTe,autoCastBoolean:qTe,async_set_timeout:Nj,getTableHashAttribute:$Te,doesSchemaExist:VTe,doesTableExist:KTe,stringifyObj:YTe,ms_to_time:WTe,changeExtension:zTe,getEnvCliRootPath:oP,noBootFile:jTe,httpRequest:QTe,transformReq:JTe,convertToMS:XTe,PACKAGE_ROOT:nTe};function hTe(e){return e instanceof Error?e:new Error(e)}a(hTe,"errorizeMessage");function is(e){return e==null}a(is,"isEmpty");function pTe(e){return!is(e)&&(e||e===0||e===""||wj(e))}a(pTe,"isNotEmptyAndHasValue");function Yi(e){return is(e)||e.length===0||e.size===0}a(Yi,"isEmptyOrZeroLength");function mTe(e){if(is(e))return!0;for(let t=0;t<e.length;t++)if(is(e[t]))return!0;return!1}a(mTe,"arrayHasEmptyValues");function ETe(e){if(Yi(e))return!0;for(let t=0;t<e.length;t++)if(Yi(e[t]))return!0;return!1}a(ETe,"arrayHasEmptyOrZeroLengthValues");function gTe(...e){try{return e.join(rc.sep)}catch{console.error(e)}}a(gTe,"buildFolderPath");function wj(e){return is(e)?!1:e===!0||e===!1}a(wj,"isBoolean");function STe(e){return is(e)?!1:typeof e=="object"}a(STe,"isObject");function TTe(e){return Yi(e)?fTe:e.slice(0,-_Te)}a(TTe,"stripFileExtension");function ATe(e){return is(e)||e===""||typeof e!="string"?e:bj[e]!==void 0?bj[e]:Cj(e)===!0?Number(e):lTe.test(e)?new Date(e):e}a(ATe,"autoCast");function Ij(e){if(typeof e=="string"&&(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]")))try{return JSON.parse(e)}catch{}return e}a(Ij,"autoCastJSON");function iP(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=iP(n);s!==n&&(e[t]=s)}else for(let t in e){let r=e[t],n=iP(r);n!==r&&(e[t]=n)}return e}else return Ij(e)}a(iP,"autoCastJSONDeep");function Cj(e){if(e.startsWith("0.")&&yj(e))return!0;let t=e.toUpperCase().includes("E");return!!((e!=="0"&&e.startsWith("0"))===!1&&t===!1&&yj(e))}a(Cj,"autoCasterIsNumberCheck");async function RTe(e){if(Yi(e))throw new Error(`Directory path: ${e} does not exist`);try{await Aj.emptyDir(e),await Aj.remove(e)}catch(t){throw Cn.error(`Error removing files in ${e} -- ${t}`),t}}a(RTe,"removeDir");function yTe(e,t){if(Yi(e)){Cn.info("Invalid current version sent as parameter.");return}if(Yi(t)){Cn.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(yTe,"compareVersions");function bTe(e,t,r=!1){let n=e.toString().split("."),s=t.toString().split(".");return n[0]===s[0]&&(!r||n[1]===s[1])}a(bTe,"isCompatibleDataVersion");function OTe(e){if(is(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(OTe,"escapeRawValue");function NTe(e){if(is(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(NTe,"unescapeValue");function wTe(e,t){if(is(e))return Cn.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+QT.EOL}!Yi(n)&&n[0]===";"?r+=" "+n+s+QT.EOL:Yi(n)||(r+=n+"="+s+QT.EOL)}catch{Cn.error(`Found bad property during upgrade with key ${n} and value: ${s}`)}}),r}a(wTe,"stringifyProps");function Pj(){let e;try{e=QT.homedir()}catch{e=process.env.HOME}return e}a(Pj,"getHomeDir");function ITe(){let e=rc.join(Pj(),Ar.HDB_HOME_DIR_NAME,Ar.BOOT_PROPS_FILE_NAME);return Oj.existsSync(e)||(e=rc.join(__dirname,"../","hdb_boot_properties.file")),e}a(ITe,"getPropsFilePath");function CTe(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(CTe,"timeoutPromise");async function PTe(e){if(!e)throw new Error("Invalid port passed as parameter");return new Promise((t,r)=>{let n=tTe.createServer().once("error",s=>{s.code==="EADDRINUSE"?t(!0):r(s)}).once("listening",()=>n.once("close",()=>t(!1)).close()).listen(e)})}a(PTe,"isPortTaken");function DTe(e){try{return Ar.CLUSTER_OPERATIONS[e.toLowerCase()]!==void 0}catch(t){Cn.error(`Error checking operation against cluster ops ${t}`)}return!1}a(DTe,"isClusterOperation");function LTe(e,t){let r=(Ue(),D(ct)).getDatabases();if(!r[e])return XT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e);if(!r[e][t])return XT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(LTe,"checkGlobalSchemaTable");function MTe(e,t){if(is(t)){Cn.warn("No CLUSTERING_USER defined, clustering disabled");return}if(is(e)||Yi(e)){Cn.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){Cn.error(`unable to find cluster_user due to: ${n.message}`);return}if(r===void 0){Cn.warn(`CLUSTERING_USER: ${t} not found or is not active.`);return}return r}a(MTe,"getClusterUser");function vTe(){Rj.parsePromise=function(e,t,r){return new Promise(function(n,s){Rj.parse(e,{header:!0,transformHeader:Dj,chunk:t.bind(null,s),skipEmptyLines:!0,transform:r,dynamicTyping:!1,error:s,complete:n})})}}a(vTe,"promisifyPapaParse");function Dj(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return e.charCodeAt(0)===65279?e.slice(1):e}a(Dj,"removeBOM");function UTe(e,t,r){return new Promise(n=>{t.once(e,s=>{let i=r;Cn.info(`Got cluster status event response: ${iTe(s)}`);try{i.cancel()}catch{Cn.error("Error trying to cancel timeout.")}n(s)})})}a(UTe,"createEventPromise");async function xTe(e){let t=!0,r=0;do await Nj(uTe*r++),(await sTe.findPs(e)).length>0&&(t=!1);while(t&&r<dTe);if(t)throw new Error(`process ${e} was not started`)}a(xTe,"checkProcessRunning");function BTe(e,t){let r=Lj(e);if(r)return r;let n=Mj(e,t);if(n)return n}a(BTe,"checkSchemaTableExist");function Lj(e){let{getDatabases:t}=(Ue(),D(ct));if(!t()[e])return XT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(Lj,"checkSchemaExists");function Mj(e,t){let{getDatabases:r}=(Ue(),D(ct));if(!r()[e][t])return XT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(Mj,"checkTableExists");function HTe(){let e=JT().utc().add(1,"d").startOf("d").unix(),t=JT().utc().unix();return e-t}a(HTe,"getStartOfTomorrowInSeconds");function kTe(){return JT().utc().format("DD-MM-YYYY")}a(kTe,"getLimitKey");function FTe(e){try{let t=new rTe(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){Cn.error("Got an error back ticking items."),Cn.error(t)}}a(FTe,"backtickASTSchemaItems");function GTe(e){return[e]}a(GTe,"createForkArgs");function qTe(e){return e===!0||typeof e=="string"&&e.toLowerCase()==="true"}a(qTe,"autoCastBoolean");function $Te(e,t){let{getDatabases:r}=(Ue(),D(ct)),n=r()[e]?.[t];return n?.primaryKey||n?.hash_attribute}a($Te,"getTableHashAttribute");function VTe(e){let{getDatabases:t}=(Ue(),D(ct));return t()[e]!==void 0}a(VTe,"doesSchemaExist");function KTe(e,t){let{getDatabases:r}=(Ue(),D(ct));return r()[e]?.[t]!==void 0}a(KTe,"doesTableExist");function YTe(e){try{return JSON.stringify(e)}catch{return e}}a(YTe,"stringifyObj");function WTe(e){let t=JT.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(WTe,"ms_to_time");function zTe(e,t){let r=rc.basename(e,rc.extname(e));return rc.join(rc.dirname(e),r+t)}a(zTe,"changeExtension");function oP(){if(process.env[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return process.env[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()];let e=oTe(process.argv);if(e[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return e[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()]}a(oP,"getEnvCliRootPath");var sP;function jTe(){if(sP)return sP;let e=oP();if(oP()&&Oj.pathExistsSync(rc.join(e,Ar.HDB_CONFIG_FILE)))return sP=!0,!0}a(jTe,"noBootFile");function QTe(e,t){let r;return e.protocol==="http:"?r=cTe:r=aTe,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(QTe,"httpRequest");function JTe(e){if(!e.schema&&!e.database){e.schema=Ar.DEFAULT_DATABASE_NAME;return}e.database&&(e.schema=e.database)}a(JTe,"transformReq");function XTe(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(XTe,"convertToMS")});Np();var aP=(G(),D($)),Uj=oe(),Tp=X(),ZTe=ms(),eAe=gn(),tAe=dS(),{start:rAe}=(AC(),D(yT)),{closeConnection:nAe}=sr(),xj=require("moment"),Bj=MS(),{cloneDeep:sAe}=require("lodash"),iAe=process.env[aP.PROCESS_NAME_ENV_PROP],nc=iAe.substring(4);a(async function(){let t={id:nc,request:void 0},r=0;try{Tp.notify("Starting job:",nc),rAe(),ZTe.setSchemaDataToGlobal(),await eAe.setUsersWithRolesCache();let n=await Bj.getJobById(nc);if(Uj.isEmptyOrZeroLength(n))throw new Error(`Unable to find a record in hdb_job for job: ${nc}`);let{request:s}=n[0];if(Uj.isEmptyOrZeroLength(s))throw new Error("Did not find job request in hdb_job table, unable to proceed");s=sAe(s);let i=tAe.getOperationFunction(s);Tp.trace("Running operation:",s.operation,"for job",nc);let o=await i.job_operation_function(s);Tp.trace("Result from job:",nc,o),t.status=aP.JOB_STATUS_ENUM.COMPLETE,typeof o=="string"?t.message=o:(t.result=o,t.message="Successfully completed job: "+nc),t.end_datetime=xj().valueOf(),Tp.notify("Successfully completed job:",nc)}catch(n){r=1,Tp.error(n),t.status=aP.JOB_STATUS_ENUM.ERROR,t.message=n.message?n.message:n,t.end_datetime=xj().valueOf()}finally{await Bj.updateJob(t),await nAe(),setTimeout(()=>{process.exit(r)},3e3).unref()}},"job")();
|
|
132
|
+
`;pe.message=`${Ae}${pe.message}`,pe.stack=`${Ae}${pe.stack}`,cp?.(pe),Ul.default.error(pe),t.set(h.path||"/",new ia(pe)),Md.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}`,cp?.(S),((0,lp.getWorkerIndex)()===0?console:Ul.default).error(S),t.set(h.path||"/",new ia(S),null,!0),Md.set(n?d:(0,Tt.basename)(e),S.message)}}if(PT=u,Ld.isMainThread&&!Az&&i&&(0,lp.watchDir)(e,async()=>Rz()),c.extensionModule){let d=await TE((0,Tt.join)(e,c.extensionModule));return CT.set(o,d),d}if(!f&&t.isWorker){let d=`${e} did not load any modules, resources, or files, is this a valid component?`;cp?.(new Error(d)),((0,lp.getWorkerIndex)()===0?console:Ul.default).error(d),Md.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}`,cp?.(c),t.set("",new ia(c))}}var ut,Tt,Ld,PC,vC,UC,Sz,lp,Ul,Tz,DC,Gge,LT,qge,IC,LC,Az,CC,Md,$ge,MC,gz,CT,cp,PT,Kge,Ih=be(()=>{ut=require("fs"),Tt=require("path"),Ld=require("worker_threads"),PC=require("yaml"),vC=M(ce()),UC=M(Et());G();fL();WL();nB();aB();cB();YB();IK();vK();xK();Sz=M(require("fast-glob")),lp=M(it()),Ul=M(X());bb();Dr();Tz=M(he());Ue();ZI();DC=M(ce()),Gge=M(XW());iS();AC();Es();Ez();LT=M(It());NE();VA();({readFile:qge}=ut.promises),IC=(0,LT.resolvePath)(vC.get(B.COMPONENTSROOT)),LC=new Map,Md=new Map;a(Rz,"loadComponentDirectories");$ge={REST:IE,rest:IE,graphql:lR,graphqlSchema:WA,roles:yb,jsResource:Nb,fastifyRoutes:pI,login:Ib,static:mI,operationsApi:Gge,customFunctions:{},http:{},clustering:yT,replication:Ra,authentication:Th,mqtt:wC,loadEnv:EI},MC={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js",path:"."}};Object.defineProperty(MC,"static",{value:{files:"web/**"}});gz=[],CT=new Map;a(Vge,"setErrorReporter");Kge=a(()=>PT,"getComponentName");a(Yge,"symlinkHarperModule");a(DT,"loadComponent")});var pT=P((eve,bz)=>{var{isMainThread:yz}=require("worker_threads"),{getTables:Wge,getDatabases:XMe,table:ZMe}=(Ue(),D(ct)),{loadComponentDirectories:zge,loadComponent:jge}=(Ih(),D(wh)),{resetResources:Qge}=(Zl(),D(lL)),Jge=pw(),Xge=It(),{dirname:Zge}=require("path"),{getConnection:eSe}=sr(),tSe=ce(),{CONFIG_PARAMS:rSe}=(G(),D($)),{loadCertificates:nSe}=Zs(),xC=new Map;async function sSe(e=!1){!yz&&tSe.get(rSe.CLUSTERING_ENABLED)&&eSe();try{yz&&await Jge()}catch(n){console.error(n)}let t=Qge();Wge(),t.isWorker=e,await nSe(),await jge(Zge(Xge.getConfigFilePath()),t,"hdb",!0,xC),await zge(xC,t);let r=[];for(let[n]of xC)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}a(sSe,"loadRootComponents");bz.exports.loadRootComponents=sSe});var it=P((rve,li)=>{"use strict";Np();var{Worker:iSe,MessageChannel:oSe,parentPort:Vi,isMainThread:GC,threadId:aSe,workerData:Ki}=require("worker_threads"),{PACKAGE_ROOT:cSe}=Et(),{join:Iz,isAbsolute:lSe,extname:uSe}=require("path"),{server:Cz}=(Dr(),D(Vl)),{watch:dSe,readdir:fSe}=require("fs/promises"),{totalmem:Oz}=require("os"),vd=(G(),D($)),Pz=ce(),ci=X(),{randomBytes:_Se}=require("crypto"),{_assignPackageExport:hSe}=ui(),Nz=1024*1024,Xa=[],Ls=[],pSe=50,qC=1e4,mSe="restart",Dz="request_thread_info",Lz="resource_report",Mz="thread_info",vz="added-port",ESe="ack",BC;hSe("threads",Ls);li.exports={startWorker:HC,restartWorkers:VC,shutdownWorkers:RSe,workers:Xa,setMonitorListener:PSe,onMessageFromWorkers:ySe,onMessageByType:Gz,broadcast:OSe,broadcastWithAcknowledgement:wSe,setChildListenerByType:ASe,getWorkerIndex:Uz,getWorkerCount:xz,getTicketKeys:Hz,setMainIsWorker:SSe,setTerminateTimeout:gSe,restartNumber:Ki?.restartNumber||1};Ls.onMessageByType=Gz;Ls.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=Ls.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};li.exports.whenThreadsStarted=new Promise(e=>{li.exports.threadsHaveStarted=e});var $C;function gSe(e){qC=e}a(gSe,"setTerminateTimeout");function Uz(){return Ki?Ki.workerIndex:$C?0:void 0}a(Uz,"getWorkerIndex");function xz(){return Ki?Ki.workerCount:$C?1:void 0}a(xz,"getWorkerCount");function SSe(e){$C=e,li.exports.threadsHaveStarted()}a(SSe,"setMainIsWorker");var Bz=1,MT;function Hz(){return MT||(MT=GC?_Se(48):Ki.ticketKeys,MT)}a(Hz,"getTicketKeys");Object.defineProperty(Cz,"workerIndex",{get(){return Uz()}});Object.defineProperty(Cz,"workerCount",{get(){return xz()}});var kz={[Dz](e,t){ISe(t)},[Lz](e,t){CSe(t,e)}};function HC(e,t={}){let r=process.constrainedMemory?.()||Oz();r=Math.min(r,Oz(),2e4*Nz);let n=Pz.get(vd.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/Nz/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],o=[];for(let l of Ls){let u=new oSe;u.existingPort=l,i.push(u),o.push(u.port2)}uSe(e)||(e+=".js");let c=new iSe(lSe(e)?e:Iz(cSe,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:Bz=t.threadCount,name:t.name,restartNumber:li.exports.restartNumber,ticketKeys:Hz()},transferList:o,...t});for(let{port1:l,existingPort:u}of i)u.postMessage({type:vz,port:l,threadId:c.threadId},[l]);return UT(c,!0),c.unexpectedRestarts=t.unexpectedRestarts||0,c.startCopy=()=>HC(e,t),c.on("error",l=>{ci.error(`Worker index ${t.workerIndex} error:`,l)}),c.on("exit",l=>{Xa.splice(Xa.indexOf(c),1),!c.wasShutdown&&t.autoRestart!==!1&&(c.unexpectedRestarts<pSe?(t.unexpectedRestarts=c.unexpectedRestarts+1,HC(e,t)):ci.error(`Thread has been restarted ${c.restarts} times and will not be restarted`))}),c.on("message",l=>{kz[l.type]?.(l,c)}),Xa.push(c),LSe(),t.onStarted&&t.onStarted(c),c.name=t.name,c}a(HC,"startWorker");var TSe=[vd.THREAD_TYPES.HTTP];async function VC(e=null,t=Math.max(Bz>3,1),r=!0){if(GC){try{process.chdir(process.cwd())}catch(o){ci.error("Unable to reestablish current working directory",o)}if(r){let{loadRootComponents:o}=pT();await o()}li.exports.restartNumber++,t<1&&(t=t*Xa.length);let n=[],s=[];for(let o of Xa.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:vd.ITC_EVENT_TYPES.SHUTDOWN}),o.wasShutdown=!0,o.emit("shutdown",{});let c=TSe.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()},qC*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===vd.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}=od();r&&(e==="http"||!e)&&Pz.get(vd.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else Vi.postMessage({type:mSe,workerType:e})}a(VC,"restartWorkers");function ASe(e,t){kz[e]=t}a(ASe,"setChildListenerByType");function RSe(e){return VC(e,1/0,!1)}a(RSe,"shutdownWorkers");var Fz=[];function ySe(e){Fz.push(e)}a(ySe,"onMessageFromWorkers");var kC=new Map;function Gz(e,t){let r=kC.get(e);r||kC.set(e,r=[]),r.push(t)}a(Gz,"onMessageByType");var bSe=10;async function OSe(e,t){let r=0;for(let n of Ls)try{n.postMessage(e),r++>bSe&&(r=0,await new Promise(setImmediate))}catch(s){ci.error("Unable to send message to worker",s)}t&&$z(e,null)}a(OSe,"broadcast");var vT=new Map,NSe=1;function wSe(e){return new Promise(t=>{let r=0;for(let n of Ls)try{let s=NSe++,i=a(()=>{vT.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,vT.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,o]of vT)o.port===n&&o()})),n.postMessage(e),r++}catch(s){ci.error("Unable to send message to worker",s)}r===0&&t()})}a(wSe,"broadcastWithAcknowledgement");function ISe(e){e.postMessage({type:Mz,workers:qz()})}a(ISe,"sendThreadInfo");function qz(){let e=Date.now();return Xa.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(qz,"getChildWorkerInfo");function CSe(e,t){e.resources=t,e.resources.updated=Date.now()}a(CSe,"recordResourceReport");var FC;function PSe(e){FC=e}a(PSe,"setMonitorListener");var DSe=1e3,wz=!1;function LSe(){wz||(wz=!0,setInterval(()=>{for(let e of Xa){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}FC&&FC()},DSe).unref())}a(LSe,"startMonitoring");var MSe=1e3;if(Vi&&Ki?.addPorts){UT(Vi);for(let e=0,t=Ki.addPorts.length;e<t;e++){let r=Ki.addPorts[e];r.threadId=Ki.addThreadIds[e],UT(r)}setInterval(()=>{let e=process.memoryUsage();Vi.postMessage({type:Lz,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},MSe).unref(),BC=a(()=>new Promise((e,t)=>{Vi.on("message",r),Vi.postMessage({type:Dz});function r(n){n.type===Mz&&(Vi.off("message",r),e(n.workers))}a(r,"receiveThreadInfo")}),"getThreadInfo")}else BC=qz;li.exports.getThreadInfo=BC;function UT(e,t){Ls.push(e),e.on("message",r=>{if(r.type===vz)r.port.threadId=r.threadId,UT(r.port);else if(r.type===ESe){let n=vT.get(r.id);n&&n()}else $z(r,e)}).on("close",()=>{Ls.splice(Ls.indexOf(e),1)}).on("exit",()=>{Ls.splice(Ls.indexOf(e),1)}),t?e.refCount=100:e.unref()}a(UT,"addPort");function $z(e,t){for(let n of Fz)n(e,t);let r=kC.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){ci.error(s)}}a($z,"notifyMessageListeners");if(GC){let e,t,r=new Set,n=a(async(s,i)=>{i&&(e=i);for(let o of await fSe(s,{withFileTypes:!0}))o.isDirectory()&&o.name!=="node_modules"&&n(Iz(s,o.name));try{for await(let{filename:o}of dSe(s,{persistent:!1}))r.add(o),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await VC(),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===vd.ITC_EVENT_TYPES.SHUTDOWN&&(li.exports.restartNumber=e.restartNumber,Vi.unref(),setTimeout(()=>{ci.warn("Thread did not voluntarily terminate",aSe),process.exit(0)},qC).unref())})});var Rx={};Be(Rx,{ACTION_32_BIT:()=>ym,ACTION_64_BIT:()=>BSe,AUDIT_STORE_OPTIONS:()=>ph,Decoder:()=>il,HAS_BLOBS:()=>pn,HAS_CURRENT_RESIDENCY_ID:()=>Ic,HAS_EXPIRATION_EXTENDED_TYPE:()=>xf,HAS_ORIGINATING_OPERATION:()=>Uf,HAS_PREVIOUS_RESIDENCY_ID:()=>Cc,REMOTE_SEQUENCE_UPDATE:()=>cg,createAuditEntry:()=>Nc,getLastRemoved:()=>USe,openAuditStore:()=>HT,readAuditEntry:()=>Pt,removeAuditEntry:()=>kT,setAuditRetention:()=>xSe,transactionKeyEncoder:()=>Xz});function HT(e){let t=e.auditStore=e.openDB(KC.AUDIT_STORE_NAME,{create:!1,...ph});t||(t=e.auditStore=e.openDB(KC.AUDIT_STORE_NAME,ph),Kz(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=WC;Zh(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()-YC/(1+i*i)})){try{h=kT(t,p,S)}catch(g){Ud.warn("Error removing audit entry",g)}if(_=p,await new Promise(setImmediate),++d>=vSe){o=10;break}}await h}finally{d===0?o=Math.min(o<<1,YC/10):(Kz(t,_),o>100&&(o=o>>1)),f(void 0),c()}},o).unref()});return u}if(a(c,"scheduleAuditCleanup"),t.scheduleAuditCleanup=c,(0,dp.getWorkerIndex)()===(0,dp.getWorkerCount)()-1&&c(),(0,dp.getWorkerIndex)()===0&&!Vz)for(let l of t.getKeys({reverse:!0,limit:1}))l>Date.now()&&(Vz=!0,Ud.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 kT(e,t,r){let n=HSe(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)&&Ac(()=>oa(s.getValue(i)),i.rootStore)}if((n&15)===zC){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 Kz(e,t){jC[0]=t,e.put(Symbol.for("last-removed"),Zz)}function USe(e){let t=e.get(Symbol.for("last-removed"));if(t)return Zz.set(t),jC[0]}function xSe(e,t=WC){YC=e,WC=t}function Nc(e,t,r,n,s,i,o,c,l,u,f,d,h){let _=ej[o];if(!_)throw new Error(`Invalid audit entry type ${o}`);let p=1;if(n&&(n>1?Za.setFloat64(0,n):Ms.set(SR),p=9),l){if(l&255)throw new Error("Illegal extended type");p+=3}R(s),R(t),g(r),Za.setFloat64(p,e),p+=8,l&Ic&&R(u),l&Cc&&R(f),l&xf&&(Za.setFloat64(p,d),p+=8),l&Uf&&R(tj[h]),i?g(i):Ms[p++]=0,l?Za.setUint32(n?8:0,_|l|3221225472):Ms[n?8:0]=_;let S=Ms.subarray(0,p);if(c)return Buffer.concat([S,c]);return S;function g(E){let T=p;p+=1,p=(0,xl.writeKey)(E,Ms,p);let O=p-T-1;O>127?O>16383?(Ud.error("Key or username was too large for audit entry",E),p=T+1,Ms[T]=0):(Ms.copyWithin(T+2,T+1,p),Za.setUint16(T,O|32768),p++):Ms[T]=O}function R(E){E<128?Ms[p++]=E:E<16384?(Za.setUint16(p,E|32768),p+=2):E<1056964608?(Za.setUint32(p,E|3221225472),p+=4):(Ms[p]=255,Za.setUint32(p+1,E),p+=5)}}function HSe(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 il(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 il(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&Ic&&(h=n.readInt()),i&Cc&&(_=n.readInt()),i&xf&&(p=n.readFloat64()),i&Uf){let T=n.readInt();S=tj[T]}l=n.readInt();let g=n.position,R=n.position+=l,E;return{type:ej[i&7],tableId:c,nodeId:o,get recordId(){return(0,xl.readKey)(e,u,f)},getBinaryRecordId(){return e.subarray(u,f)},version:d,previousLocalTime:s,get user(){return R>g?(0,xl.readKey)(e,g,R):void 0},get encoded(){return t?e.subarray(t,r):e},getValue(T,O,v){if(i&xT||i&up&&!O)return E||(E=Ac(()=>T.decoder.decode(e.subarray(n.position,r)),T.rootStore)),E;if(i&up&&v)return cb(T.getEntry(this.recordId),v,T)},getBinaryValue(){return i&(xT|up)?e.subarray(n.position,r):void 0},extendedType:i,residencyId:h,previousResidencyId:_,expiresAt:p,originatingOperation:S}}catch(n){return Ud.error("Reading audit entry error",n,e),{}}}var xl,BT,KC,dp,Jz,Ud,Ms,Za,Xz,ph,YC,vSe,jC,Zz,WC,Vz,xT,up,Yz,zC,Wz,zz,jz,Qz,ym,BSe,cg,Ic,Cc,Uf,xf,pn,ej,tj,il,so=be(()=>{xl=require("ordered-binary"),BT=M(ce()),KC=M(Ft());G();dp=M(it()),Jz=M(oe());su();Ud=M(X());aE();_s();aT();(0,BT.initSync)();Ms=Buffer.alloc(2816),Za=new DataView(Ms.buffer,Ms.byteOffset,2816),Xz={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,xl.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,xl.readKey)(e,t,r)}},ph={encoding:"binary",keyEncoder:Xz},YC=(0,Jz.convertToMS)((0,BT.get)(B.LOGGING_AUDITRETENTION))||86400*3,vSe=1e3,jC=new Float64Array(1),Zz=new Uint8Array(jC.buffer),WC=1e4,Vz=!1;a(HT,"openAuditStore");a(kT,"removeAuditEntry");a(Kz,"updateLastRemoved");a(USe,"getLastRemoved");a(xSe,"setAuditRetention");xT=16,up=32,Yz=1,zC=2,Wz=3,zz=4,jz=5,Qz=6,ym=14,BSe=15,cg=11,Ic=512,Cc=1024,Uf=2048,xf=4096,pn=8192,ej={put:Yz|xT,[Yz]:"put",delete:zC,[zC]:"delete",message:Wz|xT,[Wz]:"message",invalidate:zz|up,[zz]:"invalidate",patch:jz|up,[jz]:"patch",relocate:Qz,[Qz]:"relocate"},tj={insert:1,update:2,upsert:3,1:"insert",2:"update",3:"upsert"};a(Nc,"createAuditEntry");a(HSe,"readAction");a(Pt,"readAuditEntry");il=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 XC(e,t,r,n,s){let i=e.primaryStore.env.path,o=e.primaryStore.tableId,c;s?.crossThreads===!1?(c=nj,kSe(e.primaryStore,e.auditStore)):(c=rj,e.primaryStore.env.hasSubscriptionCommitListener||(e.primaryStore.env.hasSubscriptionCommitListener=!0,e.primaryStore.on("committed",()=>{sj(rj[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=Xl(t);let f=new JC(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 sj(e){if(!e)return;let t=e.auditStore;t.resetReadTxn(),ij(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=Xl(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,QC.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,QC.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 kSe(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=nj[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{sj(l)}finally{r.threadLocalWrites[0]=l.lastTxnTime,r.unlock("thread-local-writes")}},"acquiredLock");r.attemptLock("thread-local-writes",u)&&u()})}}function ij(e){e.nextTransaction?.resolve();let t;e.nextTransaction=new Promise(r=>{t=r}),e.nextTransaction.resolve=t}function jk(e){return e.nextTransaction||(XC({primaryStore:e,auditStore:e},null,null,0,{scope:"full-database"}),ij(e)),e.nextTransaction}var QC,rj,nj,JC,GO=be(()=>{QC=M(X());Wl();Zl();so();rj=Object.create(null),nj=Object.create(null);a(XC,"addSubscription");JC=class extends xn{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(sj,"notifyFromTransactionData");a(kSe,"listenToCommits");a(ij,"nextTransaction");a(jk,"whenNextTransaction")});var Jw={};Be(Jw,{EVICTED:()=>na,INVALIDATED:()=>fn,coerceType:()=>qT,makeTable:()=>VT,setServerUtilities:()=>WSe});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=RR(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,Pn,nn,wr,Fd=!1,sc,ZT=new Map,eA=new Map,Ht,Gd,qd=Hl.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 tA=i.getRange({start:!1,end:!1}).constructor,Ap=10,$d=6;g&&Rp(),Zh(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===ql.ROLE_TABLE_NAME||N.table===ql.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:cc(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,Bl.getWorkerIndex)(),H):(0,Bl.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"}),_p.signalSchemaChange(new hp.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(()=>_p.signalUserChange(new hp.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 Dn(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,eP(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,eP(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&&(!jSe(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&&Rp(),De.audit=m}static coerceId(m){return m===""?null:qT(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 GT.default.remove(data_path),await GT.default.remove(data_path===standard_path?data_path+MDB_LOCK_FILE_SUFFIX:path.join(path.dirname(data_path),MDB_LEGACY_LOCK_FILE_NAME));_p.signalSchemaChange(new hp.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=ic(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&&ZC(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=ic(m);if(L?.update){let C=L.attribute_permissions;if(C?.length>0){let A=ZC(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=ic(m);if(L?.insert){let C=L.attribute_permissions;if(C?.length>0){let A=ZC(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 ic(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===aj?this.set(m,(+this.getProperty(m)||0)+y):(this.#s||this.update(),this.set(m,new uE(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=ac(this.getResidency(y.value,L)),A;if(C){if(!C.includes(server.hostname))return!1;A=cc(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);wc(i,A??i.getEntry(m),L)}}lock(){throw new Error("Not yet implemented")}static operation(m,y){return m.table||=s,m.schema||=c,pj.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?aj:VSe;let I={key:w,store:i,entry:b,nodeName:C?.nodeName,validate:a(x=>{m||(m=this.#t),y||m&&cE(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=Vc(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,Vc(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,Vc(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=oE(Q,Pe,y),xe.default.debug?.("Rebuilding update with future patch:",Q),!Q)return}}else{if(y)return;Q=oE(Q,U,y),xe.default.debug?.("Rebuilding update without audit:",Q)}let de;if(y?de=Q:(this.#e=U,de=Vc(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=ac(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=cc(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()):wc(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||kA[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,Ln;if(Ve.comparator==="gt"||Ve.comparator==="greater_than"||Ve.comparator==="ge"||Ve.comparator==="greater_than_equal"?(We=me,Ln=Ve):(We=Ve,Ln=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=Ln.comparator==="ge"||Ln.comparator==="greater_than_equal",yp=We.comparator==="le"||We.comparator==="less_than_equal";me.comparator=(os?"ge":"gt")+(yp?"le":"lt"),me.value=[Ln.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,_j.sortBy)(V,Zp(De)):V}a(I,"orderConditions");function x(V,ue){return Array.isArray(V)?V.map(_e=>qT(_e,ue)):qT(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=>Jl(ue.attribute)===Jl(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=FA(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 tA;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=oc(_e,Y.attribute,C),Pe=oc(me,Y.attribute,C),Ve=ue?(0,kl.compareKeys)(Pe,Te):(0,kl.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=oc(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 tc.SKIP;if(N=Dn(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?tc.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]:Jl(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"),Ln=We(Ve.next());Ln&&(U||(U=[]),U.push(Ln));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=XC(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||dj(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>lj&&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||dj(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,kl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(H&&(A.send({id:N,localTime:Q,value:H,version:U,type:"put"}),A.queue?.length>lj&&await A.waitForDrain()===!1))return}}else{I&&!x&&(x=0);let N=this.#r?.localTime;if(N===AR&&(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 ${vs(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 ${vs(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 ${vs(A)} in property ${b} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof A!="number"&&(L||(L=[])).push(`Value ${vs(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 ${vs(A)} in property ${b} must be a string, or an array of strings`);break;case"String":typeof A!="string"&&(L||(L=[])).push(`Value ${vs(A)} in property ${b} must be a string`);break;case"Boolean":typeof A!="boolean"&&(L||(L=[])).push(`Value ${vs(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 ${vs(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 ${vs(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 ${vs(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 ${vs(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 ${vs(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,hj.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=GT.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 ec(),!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 ec();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?Ql({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(fj)):N.filter(fj):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]=()=>{}})}dE(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 ec(),Pt(A).tableId===n&&(L=kT(l,C,A));if(y)for(let C of i.getRange({start:0,versions:!0})){let{key:A,value:w,localTime:b}=C;await ec(),w===null&&b<m&&(L=wc(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 ec();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 ec();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,fp.getIndexedValues)(I,N),U=(0,fp.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)&&oj){let J=U.concat(H).map(k=>({key:k,value:K}));A.prefetch(J,uj)}for(let J=0,k=U.length;J<k;J++)A.remove(U[J],K)}else H?.length>0&&oj&&A.prefetch(H.map(Q=>({key:Q,value:K})),uj);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>cj)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,kl.writeKey)(K,KSe,0)>cj)throw new Error("Primary key size is too large: "+K.length);return!0}a(Ir,"checkValidId");function Dn(K,m,y,L,C){if(De.getResidencyById&&y.ensureLoaded&&m?.replicateFrom!==!1){let w=ac(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<Ap&&Re++}a(I,"prefetch");function x(){try{w(A())}catch(N){b(N)}}a(x,"load")})}a(Dn,"loadLocalRecord");function ic(K){if(!K?.role)return;let m=K.role.permission;if(m.super_user)return YSe;let y=m[c],L,C=y?.tables;if(C)return C[s];if(c==="data"&&(L=m[s])&&!L.tables)return L}a(ic,"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 pc,m.lmdbDb=i,m;m=y}while(!0)}else return new Qp}a(Cr,"txnForContext");function oc(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(oc,"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 tc.SKIP;for(let U=0;U<A;U++)if(!b?.includes(U)&&!C[U](H,x))return tc.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 tc.SKIP;for(let H=0;H<A;H++){let Q=C[H].idFilter;if(Q){if(!Q(N))return tc.SKIP;b||(b=[]),b.push(H)}}return Dn(N,y,w,!1,I)});return Array.isArray(K)&&(x=x.filter(N=>N!==tc.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)},$Se)});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;eP(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,fp.getNextMonotonicTime)());let V=performance.now()-J;if(Lt(V,"cache-resolution",s,null,"success"),x&&bE(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&&bE(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=ac(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=cc(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):wc(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===Pn&&!m)&&(Pn=Bt,(0,Bl.getWorkerIndex)()===(0,Bl.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)*(Hl.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&&tu(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+qSe<Date.now()?ue=wc(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 ec()}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 Rp(){z=l?.addDeleteRemovalCallback(n,i,(K,m)=>{i.remove(K,m)})}a(Rp,"addDeleteRemoval");function Wd(){(0,Bl.getWorkerIndex)()===0&&setInterval(async()=>{if(!sc){sc=!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 ec()}}catch(K){xe.default.error?.("Error in evicting old records",K)}finally{sc=!1}}},GSe).unref()}a(Wd,"runRecordExpirationEviction");function ac(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(ac,"residencyFromFunction");function cc(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(cc,"getResidencyId")}function ZC(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 uj(){}function WSe(e){pj=e}function qT(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 FT(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return FT(+e);case"Float":return e==="null"?null:FT(+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;zSe.test(e)||(e+="Z");let n=new Date(e);return FT(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,$T.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function FT(e){if(isNaN(e))throw new SyntaxError;return e}function dj(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 eP(e,t,r){return e?.then?e.then(t,r):t(e)}function fj(e){return e!=null}function vs(e){try{return JSON.stringify(e)}catch{return e}}function jSe(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var tc,fp,_j,hj,Hl,Nr,_p,hp,xe,kl,Bl,$T,GT,FSe,pj,GSe,qSe,oj,$Se,aj,VSe,fn,na,KSe,cj,lj,YSe,Mve,zSe,ec,Tf=be(()=>{G();tc=require("lmdb"),fp=M(ln()),_j=require("lodash"),hj=M(hf());sa();Jp();Hl=M(ce());GO();Nr=M(he()),_p=M(_o()),hp=M(Ks());Ue();Sf();xe=M(mi());db();mc();kl=require("ordered-binary"),Bl=M(it());so();$T=M(oe());su();Ci();aE();O_();GT=M(require("node:fs"));_s();aT();FSe=new Uint8Array(9);FSe[8]=192;GSe=6e4,qSe=864e5;Hl.initSync();oj=Hl.get(B.STORAGE_PREFETCHWRITES),$Se=1e4,aj=1,VSe=2,fn=1,na=8,KSe=Buffer.allocUnsafeSlow(8192),cj=1978,lj=100,YSe={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},Mve=(0,$T.convertToMS)(Hl.get(B.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;a(VT,"makeTable");a(ZC,"attributesAsObject");a(uj,"noop");a(WSe,"setServerUtilities");zSe=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;a(qT,"coerceType");a(FT,"rejectNaN");a(dj,"isDescendantId");ec=a(()=>new Promise(setImmediate),"rest");a(eP,"when");a(fj,"exists");a(vs,"stringify");a(jSe,"hasOtherProcesses")});var ct={};Be(ct,{database:()=>Eu,database_envs:()=>Ko,databases:()=>Ye,dropDatabase:()=>mb,dropTableMeta:()=>eTe,getDatabases:()=>Ze,getDefaultCompression:()=>eS,getTables:()=>QSe,onRemovedDB:()=>W_,onUpdatedTable:()=>ol,readMetaDb:()=>pp,resetDatabases:()=>sd,table:()=>_t,tables:()=>Yn});function QSe(){return zT||Ze(),Yn||{}}function Ze(){if(zT)return Ye;zT=!0,Hd=new Map;let e=(0,Zt.getHdbBasePath)()&&(0,Ut.join)((0,Zt.getHdbBasePath)(),uc),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,ss.existsSync)(e)?e:(0,Ut.join)((0,Zt.getHdbBasePath)(),Cp)),!e)return;if((0,ss.existsSync)(e))for(let n of(0,ss.readdirSync)(e,{withFileTypes:!0})){let s=(0,Ut.basename)(n.name,".mdb");n.isFile()&&(0,Ut.extname)(n.name).toLowerCase()===".mdb"&&!t[s]?.path&&pp((0,Ut.join)(e,n.name),null,s)}if((0,ss.existsSync)((0,Bd.getBaseSchemaPath)())){for(let n of(0,ss.readdirSync)((0,Bd.getBaseSchemaPath)(),{withFileTypes:!0}))if(!n.isFile()){let s=(0,Ut.join)((0,Bd.getBaseSchemaPath)(),n.name),i=(0,Ut.join)((0,Bd.getTransactionAuditStoreBasePath)(),n.name);for(let o of(0,ss.readdirSync)(s,{withFileTypes:!0}))if(o.isFile()&&(0,Ut.extname)(o.name).toLowerCase()===".mdb"){let c=(0,Ut.join)(i,o.name);pp((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,ss.existsSync)(i))for(let c of(0,ss.readdirSync)(i,{withFileTypes:!0}))c.isFile()&&(0,Ut.extname)(c.name).toLowerCase()===".mdb"&&pp((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,ss.existsSync)(u)&&pp(u,c,n,null,!0)}}for(let n in Ye){let s=Hd.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[jT]}}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 Hd=null,Ye}function sd(){zT=!1;for(let[,e]of Ko)e.needsDeletion=!0;Ze();for(let[e,t]of Ko)t.needsDeletion&&!e.endsWith("system.mdb")&&(t.close(),Ko.delete(e),delete Ye[t.databaseName],Ep.forEach(r=>r(t.databaseName)));return Ye}function pp(e,t,r=nP,n,s){let i=new tP.default(e,!1);try{let o=Ko.get(e);o?o.needsDeletion=!1:(o=(0,kd.open)(i),Ko.set(e,o));let c=new Fl.default(!1),l=o.dbisDb||(o.dbisDb=o.openDB(KT.INTERNAL_DBIS_NAME,c)),u=o.auditStore;u||(n?(0,ss.existsSync)(n)&&(i.path=n,u=(0,kd.open)(i),u.isLegacy=!0):u=HT(o));let f=Sj(r),d=f[jT],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(xd)||0)&&(l.putSync(xd,O+1),xt.info(`Updating next table id (it was out of sync) to ${O+1} for ${_}`)):(g.tableId=O=l.get(xd),O||(O=1),xt.debug("Table {table_name} missing an id, assigning {table_id}"),l.putSync(xd,O+1),l.putSync(g.key,g));let ie=new Fl.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)||gj;ie.compression.threshold=Re}v=Om(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 Fl.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=Tj(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 mp)ie(R)}}return o}catch(o){throw o.message+=` opening database ${e}`,o}}function Sj(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)),Hd&&!Hd.has(e)){let r=new Set;t[jT]=r,Hd.set(e,r)}return t}function Tj(e,t,r){return e[t]=r,r}function Eu({database:e,table:t}){e||(e=nP),Ze();let r=Sj(e),n=(0,Ut.join)((0,Zt.getHdbBasePath)(),uc),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,ss.existsSync)(n)?n:(0,Ut.join)((0,Zt.getHdbBasePath)(),Cp));let o=(0,Ut.join)(n,(i?t:e)+".mdb"),c=Ko.get(o);if(!c||c.status==="closed"){let l=new tP.default(o,!1);c=(0,kd.open)(l),Ko.set(o,c)}return c.auditStore||(c.auditStore=HT(c)),c}async function mb(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,Ko.delete(r.path),r.status==="open"&&(await r.close(),await gp.remove(r.path));if(r||(r=Eu({database:e,table:null}),r.status==="open"&&(await r.close(),await gp.remove(r.path))),e==="data"){for(let n in Yn)delete Yn[n];delete Yn[jT]}delete Ye[e],Ep.forEach(n=>n(e)),await tR(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=nP);let p=Eu({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 Fl.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=eS(),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 Fl.default(!1,!0);ne.compression=E.compression;let le=t+"/";if(T=p.dbisDb=p.openDB(KT.INTERNAL_DBIS_NAME,O),se(),T.get(le))return F&&F(),sd(),_t(e);let ie=Om(p.openDB(le,ne),p);p.databaseName=r,ie.tableId=T.get(xd),xt.trace(`Assigning new table id ${ie.tableId} for ${t}`),ie.tableId||(ie.tableId=1),T.put(xd,ie.tableId+1),E.tableId=ie.tableId,g=Tj(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(KT.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 Fl.default(!0,!1),pe=p.openDB(ne,Re);(ie||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<Sp.workerData?.restartNumber)&&(v=!0,se(),le=T.get(ne),(ie||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<Sp.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=ZSe(g,te,j):v&&YT.signalSchemaChange(new WT.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=_,v)for(let z of mp)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 ZSe(e,t,r){try{xt.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await YT.signalSchemaChange(new WT.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,kd.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,mj.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)}),Sp.workerData&&Sp.workerData.restartNumber!==Ej.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>JSe?await s:f>XSe&&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 YT.signalSchemaChange(new WT.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 eTe({table:e,database:t}){let r=Eu({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 ol(e){return mp.push(e),{remove(){let t=mp.indexOf(e);t>-1&&mp.splice(t,1)}}}function W_(e){return Ep.push(e),{remove(){let t=Ep.indexOf(e);t>-1&&Ep.splice(t,1)}}}function eS(){let e=(0,Zt.get)(B.STORAGE_COMPRESSION),t=(0,Zt.get)(B.STORAGE_COMPRESSION_DICTIONARY),r=(0,Zt.get)(B.STORAGE_COMPRESSION_THRESHOLD)||gj,n={startingOffset:32};return t&&(n.dictionary=gp.readFileSync(t)),r&&(n.threshold=r),e&&n}var Zt,KT,kd,Ut,ss,Bd,Fl,tP,gp,rP,mj,YT,WT,Sp,xt,Ej,nP,jT,gj,Yn,Ye,xd,mp,Ep,zT,Ko,Hd,JSe,XSe,Ue=be(()=>{Zt=M(ce()),KT=M(Ft()),kd=require("lmdb"),Ut=require("path"),ss=require("fs"),Bd=M(gt());Tf();Fl=M(Bf()),tP=M(Hf());G();gp=M(require("fs-extra")),rP=M(ui()),mj=M(ln()),YT=M(_o()),WT=M(Ks()),Sp=require("worker_threads"),xt=M(X()),Ej=M(it());so();su();_s();nP="data",jT=Symbol("defined-tables"),gj=((0,Zt.get)(B.STORAGE_PAGESIZE)||4096)-60;(0,Zt.initSync)();Yn=Object.create(null),Ye=Object.create(null);(0,rP._assignPackageExport)("databases",Ye);(0,rP._assignPackageExport)("tables",Yn);xd=Symbol.for("next-table-id"),mp=[],Ep=[],Ko=new Map;a(QSe,"getTables");a(Ze,"getDatabases");a(sd,"resetDatabases");a(pp,"readMetaDb");a(Sj,"ensureDB");a(Tj,"setTable");a(Eu,"database");a(mb,"dropDatabase");a(_t,"table");JSe=1e3,XSe=10;a(ZSe,"runIndexing");a(eTe,"dropTableMeta");a(ol,"onUpdatedTable");a(W_,"onRemovedDB");a(eS,"getDefaultCompression")});var oe=P((Vve,vj)=>{"use strict";var rc=require("path"),Oj=require("fs-extra"),Cn=X(),Aj=require("fs-extra"),QT=require("os"),tTe=require("net"),rTe=require("recursive-iterator"),Ar=(G(),D($)),{PACKAGE_ROOT:nTe}=Et(),sTe=RA(),Rj=require("papaparse"),JT=require("moment"),{inspect:iTe}=require("util"),yj=require("is-number"),$ve=require("lodash"),oTe=require("minimist"),aTe=require("https"),cTe=require("http"),{hdb_errors:XT}=he(),lTe=/^((\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)))$/,Nj=require("util").promisify(setTimeout),uTe=100,dTe=5,fTe="",_Te=4,bj={true:!0,TRUE:!0,FALSE:!1,false:!1,undefined:null,null:null,NULL:null,NaN:NaN};vj.exports={isEmpty:is,isEmptyOrZeroLength:Yi,arrayHasEmptyValues:mTe,arrayHasEmptyOrZeroLengthValues:ETe,buildFolderPath:gTe,isBoolean:wj,errorizeMessage:hTe,stripFileExtension:TTe,autoCast:ATe,autoCastJSON:Ij,autoCastJSONDeep:iP,removeDir:RTe,compareVersions:yTe,isCompatibleDataVersion:bTe,escapeRawValue:OTe,unescapeValue:NTe,stringifyProps:wTe,timeoutPromise:CTe,isClusterOperation:DTe,getClusterUser:MTe,checkGlobalSchemaTable:LTe,getHomeDir:Pj,getPropsFilePath:ITe,promisifyPapaParse:vTe,removeBOM:Dj,createEventPromise:UTe,checkProcessRunning:xTe,checkSchemaTableExist:BTe,checkSchemaExists:Lj,checkTableExists:Mj,getStartOfTomorrowInSeconds:HTe,getLimitKey:kTe,isObject:STe,isNotEmptyAndHasValue:pTe,autoCasterIsNumberCheck:Cj,backtickASTSchemaItems:FTe,isPortTaken:PTe,createForkArgs:GTe,autoCastBoolean:qTe,async_set_timeout:Nj,getTableHashAttribute:$Te,doesSchemaExist:VTe,doesTableExist:KTe,stringifyObj:YTe,ms_to_time:WTe,changeExtension:zTe,getEnvCliRootPath:oP,noBootFile:jTe,httpRequest:QTe,transformReq:JTe,convertToMS:XTe,PACKAGE_ROOT:nTe};function hTe(e){return e instanceof Error?e:new Error(e)}a(hTe,"errorizeMessage");function is(e){return e==null}a(is,"isEmpty");function pTe(e){return!is(e)&&(e||e===0||e===""||wj(e))}a(pTe,"isNotEmptyAndHasValue");function Yi(e){return is(e)||e.length===0||e.size===0}a(Yi,"isEmptyOrZeroLength");function mTe(e){if(is(e))return!0;for(let t=0;t<e.length;t++)if(is(e[t]))return!0;return!1}a(mTe,"arrayHasEmptyValues");function ETe(e){if(Yi(e))return!0;for(let t=0;t<e.length;t++)if(Yi(e[t]))return!0;return!1}a(ETe,"arrayHasEmptyOrZeroLengthValues");function gTe(...e){try{return e.join(rc.sep)}catch{console.error(e)}}a(gTe,"buildFolderPath");function wj(e){return is(e)?!1:e===!0||e===!1}a(wj,"isBoolean");function STe(e){return is(e)?!1:typeof e=="object"}a(STe,"isObject");function TTe(e){return Yi(e)?fTe:e.slice(0,-_Te)}a(TTe,"stripFileExtension");function ATe(e){return is(e)||e===""||typeof e!="string"?e:bj[e]!==void 0?bj[e]:Cj(e)===!0?Number(e):lTe.test(e)?new Date(e):e}a(ATe,"autoCast");function Ij(e){if(typeof e=="string"&&(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]")))try{return JSON.parse(e)}catch{}return e}a(Ij,"autoCastJSON");function iP(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=iP(n);s!==n&&(e[t]=s)}else for(let t in e){let r=e[t],n=iP(r);n!==r&&(e[t]=n)}return e}else return Ij(e)}a(iP,"autoCastJSONDeep");function Cj(e){if(e.startsWith("0.")&&yj(e))return!0;let t=e.toUpperCase().includes("E");return!!((e!=="0"&&e.startsWith("0"))===!1&&t===!1&&yj(e))}a(Cj,"autoCasterIsNumberCheck");async function RTe(e){if(Yi(e))throw new Error(`Directory path: ${e} does not exist`);try{await Aj.emptyDir(e),await Aj.remove(e)}catch(t){throw Cn.error(`Error removing files in ${e} -- ${t}`),t}}a(RTe,"removeDir");function yTe(e,t){if(Yi(e)){Cn.info("Invalid current version sent as parameter.");return}if(Yi(t)){Cn.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(yTe,"compareVersions");function bTe(e,t,r=!1){let n=e.toString().split("."),s=t.toString().split(".");return n[0]===s[0]&&(!r||n[1]===s[1])}a(bTe,"isCompatibleDataVersion");function OTe(e){if(is(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(OTe,"escapeRawValue");function NTe(e){if(is(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(NTe,"unescapeValue");function wTe(e,t){if(is(e))return Cn.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+QT.EOL}!Yi(n)&&n[0]===";"?r+=" "+n+s+QT.EOL:Yi(n)||(r+=n+"="+s+QT.EOL)}catch{Cn.error(`Found bad property during upgrade with key ${n} and value: ${s}`)}}),r}a(wTe,"stringifyProps");function Pj(){let e;try{e=QT.homedir()}catch{e=process.env.HOME}return e}a(Pj,"getHomeDir");function ITe(){let e=rc.join(Pj(),Ar.HDB_HOME_DIR_NAME,Ar.BOOT_PROPS_FILE_NAME);return Oj.existsSync(e)||(e=rc.join(__dirname,"../","hdb_boot_properties.file")),e}a(ITe,"getPropsFilePath");function CTe(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(CTe,"timeoutPromise");async function PTe(e){if(!e)throw new Error("Invalid port passed as parameter");return new Promise((t,r)=>{let n=tTe.createServer().once("error",s=>{s.code==="EADDRINUSE"?t(!0):r(s)}).once("listening",()=>n.once("close",()=>t(!1)).close()).listen(e)})}a(PTe,"isPortTaken");function DTe(e){try{return Ar.CLUSTER_OPERATIONS[e.toLowerCase()]!==void 0}catch(t){Cn.error(`Error checking operation against cluster ops ${t}`)}return!1}a(DTe,"isClusterOperation");function LTe(e,t){let r=(Ue(),D(ct)).getDatabases();if(!r[e])return XT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e);if(!r[e][t])return XT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(LTe,"checkGlobalSchemaTable");function MTe(e,t){if(is(t)){Cn.warn("No CLUSTERING_USER defined, clustering disabled");return}if(is(e)||Yi(e)){Cn.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){Cn.error(`unable to find cluster_user due to: ${n.message}`);return}if(r===void 0){Cn.warn(`CLUSTERING_USER: ${t} not found or is not active.`);return}return r}a(MTe,"getClusterUser");function vTe(){Rj.parsePromise=function(e,t,r){return new Promise(function(n,s){Rj.parse(e,{header:!0,transformHeader:Dj,chunk:t.bind(null,s),skipEmptyLines:!0,transform:r,dynamicTyping:!1,error:s,complete:n})})}}a(vTe,"promisifyPapaParse");function Dj(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return e.charCodeAt(0)===65279?e.slice(1):e}a(Dj,"removeBOM");function UTe(e,t,r){return new Promise(n=>{t.once(e,s=>{let i=r;Cn.info(`Got cluster status event response: ${iTe(s)}`);try{i.cancel()}catch{Cn.error("Error trying to cancel timeout.")}n(s)})})}a(UTe,"createEventPromise");async function xTe(e){let t=!0,r=0;do await Nj(uTe*r++),(await sTe.findPs(e)).length>0&&(t=!1);while(t&&r<dTe);if(t)throw new Error(`process ${e} was not started`)}a(xTe,"checkProcessRunning");function BTe(e,t){let r=Lj(e);if(r)return r;let n=Mj(e,t);if(n)return n}a(BTe,"checkSchemaTableExist");function Lj(e){let{getDatabases:t}=(Ue(),D(ct));if(!t()[e])return XT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(Lj,"checkSchemaExists");function Mj(e,t){let{getDatabases:r}=(Ue(),D(ct));if(!r()[e][t])return XT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(Mj,"checkTableExists");function HTe(){let e=JT().utc().add(1,"d").startOf("d").unix(),t=JT().utc().unix();return e-t}a(HTe,"getStartOfTomorrowInSeconds");function kTe(){return JT().utc().format("DD-MM-YYYY")}a(kTe,"getLimitKey");function FTe(e){try{let t=new rTe(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){Cn.error("Got an error back ticking items."),Cn.error(t)}}a(FTe,"backtickASTSchemaItems");function GTe(e){return[e]}a(GTe,"createForkArgs");function qTe(e){return e===!0||typeof e=="string"&&e.toLowerCase()==="true"}a(qTe,"autoCastBoolean");function $Te(e,t){let{getDatabases:r}=(Ue(),D(ct)),n=r()[e]?.[t];return n?.primaryKey||n?.hash_attribute}a($Te,"getTableHashAttribute");function VTe(e){let{getDatabases:t}=(Ue(),D(ct));return t()[e]!==void 0}a(VTe,"doesSchemaExist");function KTe(e,t){let{getDatabases:r}=(Ue(),D(ct));return r()[e]?.[t]!==void 0}a(KTe,"doesTableExist");function YTe(e){try{return JSON.stringify(e)}catch{return e}}a(YTe,"stringifyObj");function WTe(e){let t=JT.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(WTe,"ms_to_time");function zTe(e,t){let r=rc.basename(e,rc.extname(e));return rc.join(rc.dirname(e),r+t)}a(zTe,"changeExtension");function oP(){if(process.env[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return process.env[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()];let e=oTe(process.argv);if(e[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return e[Ar.CONFIG_PARAMS.ROOTPATH.toUpperCase()]}a(oP,"getEnvCliRootPath");var sP;function jTe(){if(sP)return sP;let e=oP();if(oP()&&Oj.pathExistsSync(rc.join(e,Ar.HDB_CONFIG_FILE)))return sP=!0,!0}a(jTe,"noBootFile");function QTe(e,t){let r;return e.protocol==="http:"?r=cTe:r=aTe,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(QTe,"httpRequest");function JTe(e){if(!e.schema&&!e.database){e.schema=Ar.DEFAULT_DATABASE_NAME;return}e.database&&(e.schema=e.database)}a(JTe,"transformReq");function XTe(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(XTe,"convertToMS")});Np();var aP=(G(),D($)),Uj=oe(),Tp=X(),ZTe=ms(),eAe=gn(),tAe=dS(),{start:rAe}=(AC(),D(yT)),{closeConnection:nAe}=sr(),xj=require("moment"),Bj=MS(),{cloneDeep:sAe}=require("lodash"),iAe=process.env[aP.PROCESS_NAME_ENV_PROP],nc=iAe.substring(4);a(async function(){let t={id:nc,request:void 0},r=0;try{Tp.notify("Starting job:",nc),rAe(),ZTe.setSchemaDataToGlobal(),await eAe.setUsersWithRolesCache();let n=await Bj.getJobById(nc);if(Uj.isEmptyOrZeroLength(n))throw new Error(`Unable to find a record in hdb_job for job: ${nc}`);let{request:s}=n[0];if(Uj.isEmptyOrZeroLength(s))throw new Error("Did not find job request in hdb_job table, unable to proceed");s=sAe(s);let i=tAe.getOperationFunction(s);Tp.trace("Running operation:",s.operation,"for job",nc);let o=await i.job_operation_function(s);Tp.trace("Result from job:",nc,o),t.status=aP.JOB_STATUS_ENUM.COMPLETE,typeof o=="string"?t.message=o:(t.result=o,t.message="Successfully completed job: "+nc),t.end_datetime=xj().valueOf(),Tp.notify("Successfully completed job:",nc)}catch(n){r=1,Tp.error(n),t.status=aP.JOB_STATUS_ENUM.ERROR,t.message=n.message?n.message:n,t.end_datetime=xj().valueOf()}finally{await Bj.updateJob(t),await nAe(),setTimeout(()=>{process.exit(r)},3e3).unref()}},"job")();
|