harperdb 4.5.2 → 4.5.3
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 +2 -2
- package/bin/lite.js +2 -2
- package/launchServiceScripts/launchNatsIngestService.js +2 -2
- package/launchServiceScripts/launchNatsReplyService.js +2 -2
- package/launchServiceScripts/launchUpdateNodes4-0-0.js +2 -2
- package/npm-shrinkwrap.json +75 -66
- package/package.json +2 -1
- package/server/jobs/jobProcess.js +2 -2
- package/server/threads/threadServer.js +2 -2
- package/studio/build-local/asset-manifest.json +34 -34
- package/studio/build-local/index.html +1 -1
- package/studio/build-local/static/js/{164.f552d832.chunk.js → 164.13a1ca36.chunk.js} +1 -1
- package/studio/build-local/static/js/{833.5847bc85.chunk.js → 833.0adf7923.chunk.js} +1 -1
- package/studio/build-local/static/js/86.5d79defb.chunk.js +2 -0
- package/studio/build-local/static/js/{browse-csvupload.97e20c4a.chunk.js → browse-csvupload.aceb2454.chunk.js} +1 -1
- package/studio/build-local/static/js/{browse-datatable.339fb83c.chunk.js → browse-datatable.170a2dc3.chunk.js} +1 -1
- package/studio/build-local/static/js/{browse-entitymanager.fd37a083.chunk.js → browse-entitymanager.bab20377.chunk.js} +1 -1
- package/studio/build-local/static/js/{browse-jsonviewer.f57cc39c.chunk.js → browse-jsonviewer.62991eaa.chunk.js} +1 -1
- package/studio/build-local/static/js/{custom-functions.f682aa33.chunk.js → custom-functions.fc08c212.chunk.js} +1 -1
- package/studio/build-local/static/js/{instance-cluster.e2dba73f.chunk.js → instance-cluster.b1cecd22.chunk.js} +1 -1
- package/studio/build-local/static/js/{instance-config.4e2c4644.chunk.js → instance-config.3b4c8bb2.chunk.js} +1 -1
- package/studio/build-local/static/js/{instance-logs.bcec2256.chunk.js → instance-logs.7ffbdb78.chunk.js} +1 -1
- package/studio/build-local/static/js/{instance-roles.1ad69c74.chunk.js → instance-roles.0496670c.chunk.js} +1 -1
- package/studio/build-local/static/js/{instance-status.4e190908.chunk.js → instance-status.e1d264ed.chunk.js} +1 -1
- package/studio/build-local/static/js/{instance-users-datatable.4a2c57e4.chunk.js → instance-users-datatable.74be158e.chunk.js} +1 -1
- package/studio/build-local/static/js/{instance-users-edit.ecf717d1.chunk.js → instance-users-edit.f6546639.chunk.js} +1 -1
- package/studio/build-local/static/js/{instance-users.967796d9.chunk.js → instance-users.9f8c9ce8.chunk.js} +1 -1
- package/studio/build-local/static/js/{instance.809ece1e.chunk.js → instance.7f8bc10e.chunk.js} +1 -1
- package/studio/build-local/static/js/{instances.2eb16b86.chunk.js → instances.b9528378.chunk.js} +1 -1
- package/studio/build-local/static/js/{main.2384076c.js → main.055e9e0e.js} +2 -2
- package/studio/build-local/static/js/{offline-app.86377447.chunk.js → offline-app.2b3d559a.chunk.js} +1 -1
- package/studio/build-local/static/js/{online-app.e65f9ef3.chunk.js → online-app.75d38a43.chunk.js} +1 -1
- package/studio/build-local/static/js/{organization-billing.1c318ac1.chunk.js → organization-billing.eb5f253c.chunk.js} +1 -1
- package/studio/build-local/static/js/{organization-users.36a2ed5a.chunk.js → organization-users.6e22a1a5.chunk.js} +1 -1
- package/studio/build-local/static/js/{organization.9a81d022.chunk.js → organization.42c0f784.chunk.js} +1 -1
- package/studio/build-local/static/js/{organizations.af48c8e8.chunk.js → organizations.44dd3bd2.chunk.js} +1 -1
- package/studio/build-local/static/js/{profile.190afea3.chunk.js → profile.97200a91.chunk.js} +1 -1
- package/studio/build-local/static/js/{resetPassword.50fa5b91.chunk.js → resetPassword.a3406893.chunk.js} +1 -1
- package/studio/build-local/static/js/{roles-jsonviewer.b5d5a908.chunk.js → roles-jsonviewer.b6e22a22.chunk.js} +1 -1
- package/studio/build-local/static/js/{signIn.8fbf4021.chunk.js → signIn.6aa68409.chunk.js} +1 -1
- package/studio/build-local/static/js/{signUp.459d42df.chunk.js → signUp.1df9eab1.chunk.js} +1 -1
- package/studio/build-local/static/js/{structure-reloader.ceaf6675.chunk.js → structure-reloader.b808fbf1.chunk.js} +1 -1
- package/studio/build-local/static/js/{topnav.79dbd3ab.chunk.js → topnav.64ebd91d.chunk.js} +1 -1
- package/studio/build-local/static/js/{updatePassword.b05821cb.chunk.js → updatePassword.a3c0ffcf.chunk.js} +1 -1
- package/utility/scripts/restartHdb.js +2 -2
- package/studio/build-local/static/js/708.1805e937.chunk.js +0 -2
- /package/studio/build-local/static/js/{708.1805e937.chunk.js.LICENSE.txt → 86.5d79defb.chunk.js.LICENSE.txt} +0 -0
- /package/studio/build-local/static/js/{main.2384076c.js.LICENSE.txt → main.055e9e0e.js.LICENSE.txt} +0 -0
package/bin/harperdb.js
CHANGED
|
@@ -17,10 +17,10 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
|
|
|
17
17
|
`},"serialize"),compressible:!1,q:.8});Yr.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()}});uM={type:"application/json",serializeStream:Vf,serialize:zf,deserialize:w3,q:.5};Yr.set("*/*",uM);Yr.set("",uM);a(w3,"tryJSONParse");a(Jf,"registerContentHandlers");I3=require("fastify-plugin"),C3=I3(function(e,t,r){e.addHook("preSerialization",async(n,s)=>{if(s.raw.getHeader("content-type"))return;let{serializer:o,type:c}=Vm(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(Vm,"findBestSerializer");iM=vR.default.get(x.HTTP_COMPRESSIONTHRESHOLD);a(Qf,"serialize");a(Ra,"serializeMessage");a(LR,"asyncSerialization");a(MR,"hasAsyncSerialization");a(P3,"streamToBuffer");D3=["ascii","utf8","utf-8","utf16le","utf-16le","ucs2","ucs-2","base64","base64url","latin1","binary","hex"];a(L3,"isBufferEncoding");a(M3,"parseContentType");a(fo,"getDeserializer");a(v3,"deserializerUnknownType");a(U3,"transformIterable");a($m,"toCsvStream")});var kR={};Ue(kR,{start:()=>V3});function x3(e){if(e.kind!==Le.Kind.OPERATION_DEFINITION&&e.kind!==Le.Kind.FRAGMENT_DEFINITION)throw new Or(`Unexpected non-executable definition type ${e.kind}.`)}function fM(e){if(typeof e!="object"||e===null)throw new Pi("Request body must be an object.");if(!("query"in e))throw new Pi("Request body must contain a `query` field.");if(typeof e.query!="string")throw new Pi("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new Pi("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new Pi("Request body `operationName` field must be a string.")}function HR(e){return parseInt(e.value,10)}function pM(e){return parseFloat(e.value)}function hM(e,t,r){let n=r.get(e.name.value);return mM(n)?EM(n,t):{attribute:t,value:n}}function mM(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function EM(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],mM(n)?EM(n,t):{attribute:t,value:n}))}function B3(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case Le.Kind.NULL:return{attribute:t,value:null};case Le.Kind.INT:return{attribute:t,value:HR(e.value)};case Le.Kind.FLOAT:return{attribute:t,value:pM(e.value)};case Le.Kind.BOOLEAN:case Le.Kind.STRING:return{attribute:t,value:e.value.value};case Le.Kind.VARIABLE:return hM(e.value,t,r);case Le.Kind.OBJECT:return gM(e.value,t,r);case Le.Kind.LIST:case Le.Kind.ENUM:default:throw new Or(`Value type, ${e.value.kind}, is not supported.`)}}function gM(e,t,r){return e.fields.flatMap(n=>B3(n,t,r))}function H3(e,t){switch(e.value.kind){case Le.Kind.NULL:return{attribute:e.name.value,value:null};case Le.Kind.INT:return{attribute:e.name.value,value:HR(e.value)};case Le.Kind.FLOAT:return{attribute:e.name.value,value:pM(e.value)};case Le.Kind.BOOLEAN:case Le.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case Le.Kind.VARIABLE:return hM(e.value,e.name.value,t);case Le.Kind.OBJECT:return gM(e.value,[e.name.value],t);case Le.Kind.LIST:case Le.Kind.ENUM:default:throw new Or(`Argument type, ${e.value.kind}, is not supported.`)}}function k3(e,t){return e.flatMap(r=>H3(r,t))}function Km(e,t){return e.selections.flatMap(r=>{switch(r.kind){case Le.Kind.FIELD:return r;case Le.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new Or(`Fragment \`${n}\` not found.`);return Km(s.selectionSet,t)}case Le.Kind.INLINE_FRAGMENT:return Km(r.selectionSet,t)}})}function SM(e,t){return Km(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:SM(r.selectionSet,t)}:r.name.value)}async function F3(e,t,r,n){let s=Ni.getMatch(e.name.value,"graphql");if(s===void 0)throw new Or(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,o={select:SM(e.selectionSet,r),conditions:k3(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 TM(e){switch(e.kind){case Le.Kind.NULL:return null;case Le.Kind.INT:return HR(e);case Le.Kind.FLOAT:return parseFloat(e.value);case Le.Kind.STRING:case Le.Kind.BOOLEAN:return e.value;case Le.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:TM(r.value),...t}),{});case Le.Kind.LIST:case Le.Kind.ENUM:default:throw new Or(`Value type, ${e.kind}, is not supported.`)}}function G3(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=TM(n.defaultValue)),n.type.kind===Le.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new Or(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function q3(e,t,r,n){if(e.operation===Le.OperationTypeNode.SUBSCRIPTION)throw new Or("Subscriptions are not supported.");if(e.operation===Le.OperationTypeNode.MUTATION)throw new Or("Mutations are not supported yet.");let s=G3(e.variableDefinitions,t),i=await Promise.all(Km(e.selectionSet,r).map(c=>F3(c,s,r,n))),o={data:{}};for(let[c,l]of i)o.data[c]=l;return o}async function _M({query:e,variables:t={},operationName:r},n){let s=Le.parse(e),i=new Map,o=new Map;for(let u of s.definitions)if(x3(u),u.kind===Le.Kind.FRAGMENT_DEFINITION)o.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new Or("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 Or(`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 Or("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new Or(`Operation \`${r}\` not found.`);let l=await q3(c,t,o,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function $3(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 fM(r),_M(r,e)}case"POST":{let r=await fo(e.headers.get("content-type"),!0)(e._nodeRequest);return fM(r),_M(r,e)}default:throw new Pi("Method Not Allowed",405,{Allow:"GET, POST"})}}function V3(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await $3(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof Pi)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof Le.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof Or)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 Pi)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof Le.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof Or)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 Le,Or,Pi,AM=be(()=>{Le=M(require("graphql"));co();Au();a(x3,"assertExecutableDefinitionNode");a(fM,"assertRequestParams");a(HR,"processIntValueNode");a(pM,"processFloatValueNode");a(hM,"processVariableNode");a(mM,"isObject");a(EM,"transformObjectIntoQueryCondition");a(B3,"processObjectFieldNode");a(gM,"processObjectValueNode");a(H3,"processArgumentNode");a(k3,"buildConditionsQuery");a(Km,"fillInFragments");a(SM,"buildSelectQuery");a(F3,"processFieldNode");a(TM,"processConstValueNode");a(G3,"resolveVariables");a(q3,"executeOperation");a(_M,"resolver");Or=class extends Error{static{a(this,"GraphQLQueryingError")}},Pi=class extends Error{static{a(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};a($3,"graphqlQueryingHandler");a(V3,"start")});var Li=I((Wbe,bM)=>{"use strict";var yM=ae(),RM=(H(),P(G)),Ou=/^[\x20-\x2E|\x30-\x5F|\x61-\x7E]*$/,Di=require("joi"),ya={schema_format:{pattern:Ou,message:"names cannot include backticks or forward slashes"},schema_length:{minimum:1,maximum:250,tooLong:"cannot exceed 250 characters"}},K3=Di.alternatives(Di.string().min(1).max(ya.schema_length.maximum).pattern(Ou).messages({"string.pattern.base":"{:#label} "+ya.schema_format.message}),Di.number(),Di.array()).required(),Y3=Di.alternatives(Di.string().min(1).max(ya.schema_length.maximum).pattern(Ou).messages({"string.pattern.base":"{:#label} "+ya.schema_format.message}),Di.number()),W3=Di.alternatives(Di.string().min(1).max(ya.schema_length.maximum).pattern(Ou).messages({"string.pattern.base":"{:#label} "+ya.schema_format.message}),Di.number()).required();function z3(e,t){return t?typeof t!="string"?`'${e}' must be a string`:t.length?t.length>ya.schema_length.maximum?`'${e}' maximum of 250 characters`:Ou.test(t)?"":`'${e}' has illegal characters`:`'${e}' must be at least one character`:`'${e}' is required`}a(z3,"checkValidTable");function j3(e,t){return yM.doesSchemaExist(e)?e:t.message(`Database '${e}' does not exist`)}a(j3,"validateSchemaExists");function J3(e,t){let r=t.state.ancestors[0].schema;return yM.doesTableExist(r,e)?e:t.message(`Table '${e}' does not exist`)}a(J3,"validateTableExists");function Q3(e,t){return e.toLowerCase()===RM.SYSTEM_SCHEMA_NAME?t.message(`'subscriptions[${t.state.path[1]}]' invalid database name, '${RM.SYSTEM_SCHEMA_NAME}' name is reserved`):e}a(Q3,"validateSchemaName");bM.exports={common_validators:ya,schema_regex:Ou,hdb_schema_table:K3,validateSchemaExists:j3,validateTableExists:J3,validateSchemaName:Q3,checkValidTable:z3,hdb_database:Y3,hdb_table:W3}});var it=I((jbe,OM)=>{"use strict";var Sn=require("validate.js");Sn.validators.type=function(e,t,r,n){return e===null||typeof e>"u"||Sn.validators.type.checks[t](e)?null:` must be a '${t}' value`};Sn.validators.type.checks={Object:a(function(e){return Sn.isObject(e)&&!Sn.isArray(e)},"Object"),Array:Sn.isArray,Integer:Sn.isInteger,Number:Sn.isNumber,String:Sn.isString,Date:Sn.isDate,Boolean:a(function(e){return typeof e=="boolean"},"Boolean")};Sn.validators.hasValidFileExt=function(e,t){return Sn.isString(e)?e===""?"can't be blank":t.filter(r=>e.endsWith(r)).length>0?null:`must include one of the following valid file extensions - '${t.join("', '")}'`:null};OM.exports={validateObject:X3,validateObjectAsync:Z3,validateBySchema:eX};function X3(e,t){if(!e||!t)return new Error("validateObject parameters were null");let r=Sn(e,t,{format:"flat"});return r?new Error(r):null}a(X3,"validateObject");async function Z3(e,t){if(!e||!t)return new Error("validateObject parameters were null");try{await Sn.async(e,t,{format:"flat"})}catch(r){let n=r.join(",");return new Error(n)}return null}a(Z3,"validateObjectAsync");function eX(e,t){let r=t.validate(e,{allowUnknown:!0,abortEarly:!1,errors:{wrap:{label:"'"}}});if(r.error)return new Error(r.error.message)}a(eX,"validateBySchema")});var GR=I((Qbe,wM)=>{var{hdb_table:tX,hdb_database:NM}=Li(),rX=it(),FR=require("joi"),nX={undefined:"undefined",null:"null"},sX=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||nX[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"),iX=FR.object({database:NM,schema:NM,table:tX,records:FR.array().items(FR.object().custom(sX)).required()});wM.exports=function(e){return rX.validateBySchema(e,iX)}});var CM=I((Zbe,IM)=>{"use strict";var qR=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")}};IM.exports=qR});var DM=I((tOe,PM)=>{"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}};PM.exports=$R});var xM={};Ue(xM,{HAS_EXPIRATION:()=>zm,HAS_RESIDENCY_ID:()=>JR,HAS_STRUCTURE_UPDATE:()=>Jm,LAST_TIMESTAMP_PLACEHOLDER:()=>r_,LOCAL_TIMESTAMP:()=>oX,METADATA:()=>Xf,NEW_TIMESTAMP_PLACEHOLDER:()=>MM,NO_TIMESTAMP:()=>VR,PENDING_LOCAL_TIME:()=>QR,PREVIOUS_TIMESTAMP_PLACEHOLDER:()=>jR,RecordEncoder:()=>zR,TIMESTAMP_ASSIGN_LAST:()=>cX,TIMESTAMP_ASSIGN_NEW:()=>vM,TIMESTAMP_ASSIGN_PREVIOUS:()=>UM,TIMESTAMP_PLACEHOLDER:()=>Ym,TIMESTAMP_RECORD_PREVIOUS:()=>KR,handleLocalTimeForGets:()=>Qm,recordUpdater:()=>XR,removeEntry:()=>kc});function uX(){return t_[0]=t_[0]^64,aX.getFloat64(0)}function Qm(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?.[Xf];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?.[Xf]>=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[Xf];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,Hc.push(new WeakRef(this))),c.call(this)},o.prototype.done=function(){if(l.call(this),this.isDone)for(let u=0;u<Hc.length;u++){let f=Hc[u].deref();(!f||f.isDone||f.isCommitted)&&Hc.splice(u--,1)}},o.prototype.done.isTracked=!0}return e}function XR(e,t,r){return function(n,s,i,o,c=-1,l,u,f="put",d,p){d||l==null?Nu=i?.localTime?KR|UM:VR:Nu=l?i?.localTime?KR|16384:vM|16384:VR;let _=u?.expiresAt;if(_>=0&&(c|=zm),e_=c,YR=_,i?.version===o&&l===!1)throw new Error("Must retain local time if version is not changed");let h={version:o,instructedWrite:Nu>0},S,g=0;try{let R=i?.residencyId,E=u?.residencyId;E&&(WR=E,e_|=JR,g|=Fc),R!==E&&(g|=Gc,R||(R=0)),c&zm&&(g|=s_),u?.originatingOperation&&(g|=n_),d&&(h.ifVersion=S=i?.version??null),i&&i.value&&i.metadataFlags&Gn&&(r.getBinaryFast(i.localTime)||Aa(i.value));let A;if(s!==void 0&&(A=Gm(()=>e.put(n,s,h),n,e.rootStore),vc&&(g|=Gn)),l){let N=u?.user?.username;if(p&&(Gm(()=>e.encoder.encode(p),n,e.rootStore),vc&&(g|=Gn)),e.encoder.hasStructureUpdate&&(g|=Jm,e.encoder.hasStructureUpdate=!1),d&&i?.localTime){let v=i?.localTime,F=r.get(v);if(F){let $=wt(F).previousLocalTime;return A=r.put(v,wu(o,t,n,$,u?.nodeId??server.replication.getThisNodeId(r)??0,N,f,Zf,g,E,R,_),{ifVersion:S}),A}}A=r.put(s===void 0?MM:r_,wu(o,t,n,i?.localTime?1:0,u?.nodeId??server.replication?.getThisNodeId(r)??0,N,f,Zf,g,E,R,_,u?.originatingOperation),{append:f!=="invalidate",instructedWrite:!0,ifVersion:S})}return A}catch(R){throw R.message+=" id: "+n+" options: "+h,R}}}function kc(e,t,r){if(t)return t.value&&t.metadataFlags&Gn&&!e.auditStore.getBinaryFast(t.localTime)&&Aa(t.value),e.remove(t.key,r)}var LM,Wm,Ym,r_,jR,MM,oX,Xf,t_,aX,VR,vM,cX,UM,KR,zm,JR,QR,Jm,lX,Zf,Nu,e_,YR,WR,zR,Hc,Iu=be(()=>{LM=require("msgpackr");_o();Wm=M(W());Ss();Ss();Ym=new Uint8Array([1,1,1,1,4,64,0,0]),r_=new Uint8Array([1,1,1,1,1,0,0,0]),jR=new Uint8Array([1,1,1,1,3,64,0,0]),MM=new Uint8Array([1,1,1,1,0,64,0,0]),oX=Symbol("local-timestamp"),Xf=Symbol("metadata"),t_=new Uint8Array(8),aX=new DataView(t_.buffer,0,8),VR=0,vM=0,cX=1,UM=3,KR=4,zm=16,JR=32,QR=1,Jm=256,Nu=0,e_=-1,YR=-1,WR=0,zR=class extends LM.Encoder{static{a(this,"RecordEncoder")}constructor(t){t.useBigIntExtension=!0,super(t);let r=this.encode;this.encode=function(s,i){if(Nu||e_>=0){let o=0,c=Nu;c&&(o+=8,Nu=0);let l=e_,u=YR,f=WR;l>=0&&(o+=4,e_=-1,u>=0&&(o+=8,YR=-1),f&&(o+=4,WR=0));let d=lX=r.call(this,s,i|2048|o);Zf=d.subarray((d.start||0)+o,d.end);let p=d.start||0;return c&&(Ym[4]=c,Ym[5]=c>>8,d.set(Ym,p),p+=8),vc&&(l|=Gn),l>=0&&((d.dataView||(d.dataView=new DataView(d.buffer,d.byteOffset,d.byteLength))).setUint32(p,l|jm<<24),p+=4,u>=0&&((d.dataView||(d.dataView=new DataView(d.buffer,d.byteOffset,d.byteLength))).setFloat64(p,u),p+=8),f&&(d.dataView||(d.dataView=new DataView(d.buffer,d.byteOffset,d.byteLength))).setUint32(p,f)),d}else return Zf=r.call(this,s,i),Zf};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(t_,0,c),c+=8;else for(let p=0;p<8;p++)t_[p]=t[c++];l=uX(),i=t[c]}let u,f;i<32&&(i===jm?(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&zm&&(u=(t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).getFloat64(c),c+=8),o&JR&&(f=(t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).getUint32(c),c+=4));let d=Uc(()=>r?.valueAsBuffer?t.subarray(c,s):super.decode(t.subarray(c,s),s-c),this.rootStore);return{localTime:l,value:d,[Xf]:o,expiresAt:u,residencyId:f}}return r?.valueAsBuffer?t:Uc(()=>super.decode(t,r),this.rootStore)}catch(c){return Wm.error("Error decoding record",c,"data: "+t.slice(0,40).toString("hex")),null}}};a(uX,"getTimestamp");a(Qm,"handleLocalTimeForGets");Hc=[];setInterval(()=>{for(let e=0;e<Hc.length;e++){let t=Hc[e].deref();!t||t.isDone||t.isCommitted?Hc.splice(e--,1):t.notCurrent&&(t.openTimer?(t.openTimer>3&&(t.openTimer>60?(Wm.error("Read transaction detected that has been open too long (over 15 minutes), ending transaction",t),t.done()):Wm.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(XR,"recordUpdater");a(kc,"removeEntry")});var i_=I((aOe,HM)=>{"use strict";var BM=ce(),dX=(H(),P(G)),{RecordEncoder:fX}=(Iu(),P(xM));BM.initSync();var _X=BM.get(dX.CONFIG_PARAMS.STORAGE_CACHING)!==!1,ZR=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=_X&&{validated:!0},this.randomAccessStructure=!0,this.freezeData=!0,this.encoder={Encoder:fX})}};HM.exports=ZR});var o_=I((lOe,kM)=>{"use strict";var qn=ce(),Ts=(H(),P(G));qn.initSync();var Xm=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=qn.get(Ts.CONFIG_PARAMS.STORAGE_WRITEASYNC)===!0||qn.get(Ts.CONFIG_PARAMS.STORAGE_WRITEASYNC)==="true"||qn.get(Ts.CONFIG_PARAMS.STORAGE_WRITEASYNC)==="TRUE",qn.get(Ts.CONFIG_PARAMS.STORAGE_OVERLAPPINGSYNC)!==void 0&&(this.overlappingSync=qn.get(Ts.CONFIG_PARAMS.STORAGE_OVERLAPPINGSYNC)),qn.get(Ts.CONFIG_PARAMS.STORAGE_MAXFREESPACETOLOAD)&&(this.maxFreeSpaceToLoad=qn.get(Ts.CONFIG_PARAMS.STORAGE_MAXFREESPACETOLOAD)),qn.get(Ts.CONFIG_PARAMS.STORAGE_MAXFREESPACETORETAIN)&&(this.maxFreeSpaceToRetain=qn.get(Ts.CONFIG_PARAMS.STORAGE_MAXFREESPACETORETAIN)),qn.get(Ts.CONFIG_PARAMS.STORAGE_PAGESIZE)&&(this.pageSize=qn.get(Ts.CONFIG_PARAMS.STORAGE_PAGESIZE)),this.noReadAhead=qn.get(Ts.CONFIG_PARAMS.STORAGE_NOREADAHEAD)}};kM.exports=Xm;Xm.MAX_DBS=1e4});var ft=I((dOe,jM)=>{"use strict";var ty=require("lmdb"),Xs=require("fs-extra"),$n=require("path"),Zm=pn(),qM=W(),Tn=Bn().LMDB_ERRORS_ENUM,eE=DM(),ry=i_(),$M=o_(),ba=xt(),FM=(H(),P(G)),{table:pX,resetDatabases:hX}=(De(),P(nt)),GM=ce(),Zs=ba.INTERNAL_DBIS_NAME,VM=ba.DBI_DEFINITION_NAME,mX="data.mdb",EX="lock.mdb",a_=".mdb",gX="-lock",ey=class{static{a(this,"TransactionCursor")}constructor(t,r,n=!1){this.dbi=As(t,r),this.key_type=this.dbi[ba.DBI_DEFINITION_NAME].key_type,this.is_hash_attribute=this.dbi[ba.DBI_DEFINITION_NAME].is_hash_attribute,this.txn=t.beginTxn({readOnly:n===!1}),this.cursor=new ty.Cursor(this.txn,this.dbi)}close(){this.cursor.close(),this.txn.abort()}commit(){this.cursor.close(),this.txn.commit()}};function tE(e,t){if(e===void 0)throw new Error(Tn.BASE_PATH_REQUIRED);if(t===void 0)throw new Error(Tn.ENV_NAME_REQUIRED)}a(tE,"pathEnvNameValidation");async function ny(e,t,r=!0){try{await Xs.access(e)}catch(n){throw n.code==="ENOENT"?new Error(Tn.INVALID_BASE_PATH):n}try{let n=$n.join(e,t+a_);return await Xs.access(n,Xs.constants.R_OK|Xs.constants.F_OK),n}catch(n){if(n.code==="ENOENT")if(r)try{return await Xs.access($n.join(e,t,mX),Xs.constants.R_OK|Xs.constants.F_OK),$n.join(e,t)}catch(s){if(s.code==="ENOENT")throw new Error(Tn.INVALID_ENVIRONMENT)}else throw new Error(Tn.INVALID_ENVIRONMENT);throw n}}a(ny,"validateEnvironmentPath");function rE(e,t){if(Zm.validateEnv(e),t===void 0)throw new Error(Tn.DBI_NAME_REQUIRED)}a(rE,"validateEnvDBIName");async function SX(e,t,r=!1,n=!1){tE(e,t);let s=$n.basename(e);t=t.toString();let i=GM.get(FM.CONFIG_PARAMS.DATABASES);i||GM.setProperty(FM.CONFIG_PARAMS.DATABASES,i={}),i[s]||(i[s]={}),i[s].path=e;try{return await ny(e,t,n),KM(e,t,r)}catch(o){if(o.message===Tn.INVALID_ENVIRONMENT){let c=$n.join(e,t);await Xs.mkdirp(n?c:e);let l=new $M(n?c:c+a_,!1),u=ty.open(l);u.dbis=Object.create(null);let f=new ry(!1);u.openDB(Zs,f),global.lmdb_map===void 0&&(global.lmdb_map=Object.create(null));let d=sy(e,t,r);return u[ba.ENVIRONMENT_NAME_KEY]=d,global.lmdb_map[d]=u,u}throw o}}a(SX,"createEnvironment");async function TX(e,t,r,n=!0){tE(e,t),t=t.toString();let s=$n.join(e,t);return pX({table:t,database:$n.parse(e).name,path:s,attributes:[{name:"id",isPrimaryKey:!0}]})}a(TX,"copyEnvironment");async function KM(e,t,r=!1){tE(e,t),t=t.toString();let n=sy(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 ny(e,t),i=$n.join(e,t+a_),o=s!=i,c=new $M(s,o),l=ty.open(c);l.dbis=Object.create(null);let u=WM(l);for(let f=0;f<u.length;f++)As(l,u[f]);return l[ba.ENVIRONMENT_NAME_KEY]=n,global.lmdb_map[n]=l,l}a(KM,"openEnvironment");async function AX(e,t,r=!1){tE(e,t),t=t.toString();let n=$n.join(e,t+a_),s=await ny(e,t);if(global.lmdb_map!==void 0){let i=sy(e,t,r);if(global.lmdb_map[i]){let o=global.lmdb_map[i];await YM(o),delete global.lmdb_map[i]}}await Xs.remove(s),await Xs.remove(s===n?s+gX:$n.join($n.dirname(s),EX))}a(AX,"deleteEnvironment");async function YM(e){Zm.validateEnv(e);let t=e[ba.ENVIRONMENT_NAME_KEY];await e.close(),t!==void 0&&global.lmdb_map!==void 0&&delete global.lmdb_map[t]}a(YM,"closeEnvironment");function sy(e,t,r=!1){let s=`${$n.basename(e)}.${t}`;return r===!0&&(s=`txn.${s}`),s}a(sy,"getCachedEnvironmentName");function RX(e){Zm.validateEnv(e);let t=Object.create(null),r=As(e,Zs);for(let{key:n,value:s}of r.getRange({start:!1}))if(n!==Zs)try{t[n]=Object.assign(new eE,s)}catch{qM.warn(`an internal error occurred: unable to parse DBI Definition for ${n}`)}return t}a(RX,"listDBIDefinitions");function WM(e){Zm.validateEnv(e);let t=[],r=As(e,Zs);for(let{key:n}of r.getRange({start:!1}))n!==Zs&&t.push(n);return t}a(WM,"listDBIs");function yX(e,t){let n=As(e,Zs).getEntry(t),s=new eE;if(n!==void 0){try{s=Object.assign(s,n.value)}catch{qM.warn(`an internal error occurred: unable to parse DBI Definition for ${n}`)}return s}}a(yX,"getDBIDefinition");function zM(e,t,r,n=!r){if(rE(e,t),t=t.toString(),t===Zs)throw new Error(Tn.CANNOT_CREATE_INTERNAL_DBIS_NAME);try{return As(e,t)}catch(s){if(s.message===Tn.DBI_DOES_NOT_EXIST){let i=new ry(r,n===!0),o=e.openDB(t,i),c=new eE(r===!0,n);return o[VM]=c,As(e,Zs).putSync(t,c),e.dbis[t]=o,o}throw s}}a(zM,"createDBI");function As(e,t){if(rE(e,t),t=t.toString(),e.dbis[t]!==void 0)return e.dbis[t];let r;if(t!==Zs?r=yX(e,t):r=new eE,r===void 0)throw new Error(Tn.DBI_DOES_NOT_EXIST);let n;try{let s=new ry(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(Tn.DBI_DOES_NOT_EXIST):s}return n[VM]=r,e.dbis[t]=n,n}a(As,"openDBI");function bX(e,t){rE(e,t),t=t.toString();let r=As(e,t),n=r.getStats();return r[ba.DBI_DEFINITION_NAME].is_hash_attribute&&n.entryCount>0&&n.entryCount--,n}a(bX,"statDBI");async function OX(e,t){try{let r=$n.join(e,t+a_);return(await Xs.stat(r)).size}catch{throw new Error(Tn.INVALID_ENVIRONMENT)}}a(OX,"environmentDataSize");function NX(e,t){if(rE(e,t),t=t.toString(),t===Zs)throw new Error(Tn.CANNOT_DROP_INTERNAL_DBIS_NAME);As(e,t).dropSync(),e.dbis!==void 0&&delete e.dbis[t],As(e,Zs).removeSync(t)}a(NX,"dropDBI");function wX(e,t,r){let n;for(let s=0;s<r.length;s++){let i=r[s];if(!e.dbis[i])try{As(e,i)}catch(o){if(o.message===Tn.DBI_DOES_NOT_EXIST)zM(e,i,i!==t,i===t),n=!0;else throw o}}n&&hX()}a(wX,"initializeDBIs");jM.exports={openDBI:As,openEnvironment:KM,createEnvironment:SX,listDBIs:WM,listDBIDefinitions:RX,createDBI:zM,dropDBI:NX,statDBI:bX,deleteEnvironment:AX,initializeDBIs:wX,TransactionCursor:ey,environmentDataSize:OX,copyEnvironment:TX,closeEnvironment:YM}});var QM=I((_Oe,JM)=>{"use strict";var iy=class{static{a(this,"InsertRecordsResponseObject")}constructor(t=[],r=[],n=void 0){this.written_hashes=t,this.skipped_hashes=r,this.txn_time=n}};JM.exports=iy});var ZM=I((hOe,XM)=>{"use strict";var oy=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}};XM.exports=oy});var tv=I((EOe,ev)=>{"use strict";var ay=class{static{a(this,"UpsertRecordsResponseObject")}constructor(t=[],r=void 0,n=[]){this.written_hashes=t,this.txn_time=r,this.original_records=n}};ev.exports=ay});var $c=I((ROe,sv)=>{"use strict";var IX=ft(),CX=QM(),PX=ZM(),DX=tv(),Mi=pn(),c_=Bn().LMDB_ERRORS_ENUM,LX=xt(),po=(H(),P(G)),MX=ae(),vX=require("uuid"),SOe=require("lmdb"),{handleHDBError:UX,hdb_errors:xX}=pe(),{OVERFLOW_MARKER:TOe,MAX_SEARCH_KEY_LENGTH:AOe}=LX,rv=ce();rv.initSync();var nE=rv.get(po.CONFIG_PARAMS.STORAGE_PREFETCHWRITES),cy=po.TIME_STAMP_NAMES_ENUM.CREATED_TIME,qc=po.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function BX(e,t,r,n,s=Mi.getNextMonotonicTime()){fy(e,t,r,n),ly(e,t,r);let i=new CX,o=[],c=[];for(let l=0;l<n.length;l++){let u=n[l];nv(u,!0,s);let f=HX(e,t,r,u),d=u[t];o.push(f),c.push(d)}return uy(o,c,n,i,s)}a(BX,"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][po.FUNC_VAL],n[o]=c)}let l=Mi.getIndexedValues(c),u=e.dbis[o];if(l){nE&&u.prefetch(l.map(f=>({key:f,value:s})),sE);for(let f=0,d=l.length;f<d;f++)u.put(l[f],s)}}nE&&e.dbis[t].prefetch([s],sE),e.dbis[t].put(s,n,n[qc])})}a(HX,"insertRecord");function kX(e,t=[]){let r=0;for(let n=0;n<t.length;n++){let s=t[n];e.splice(s-r,1),r++}}a(kX,"removeSkippedRecords");function nv(e,t,r){let n=r>0;(n||!Number.isInteger(e[qc]))&&(e[qc]=r||(r=Mi.getNextMonotonicTime())),t===!0?(n||!Number.isInteger(e[cy]))&&(e[cy]=r||Mi.getNextMonotonicTime()):delete e[cy]}a(nv,"setTimestamps");function ly(e,t,r){r.indexOf(po.TIME_STAMP_NAMES_ENUM.CREATED_TIME)<0&&r.push(po.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.indexOf(po.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)<0&&r.push(po.TIME_STAMP_NAMES_ENUM.UPDATED_TIME),IX.initializeDBIs(e,t,r)}a(ly,"initializeTransaction");async function FX(e,t,r,n,s=Mi.getNextMonotonicTime()){fy(e,t,r,n),ly(e,t,r);let i=new PX,o=[],c=[],l=[];for(let u=0;u<n.length;u++){let f=n[u],d=f[t],p;try{p=dy(e,t,f,d,i,!0,s)}catch{i.skipped_hashes.push(d),o.push(u);continue}c.push(p),l.push(d)}return uy(c,l,n,i,s,o)}a(FX,"updateRecords");async function GX(e,t,r,n,s=Mi.getNextMonotonicTime()){try{fy(e,t,r,n)}catch(l){throw UX(l,l.message,xX.HTTP_STATUS_CODES.BAD_REQUEST)}ly(e,t,r);let i=new DX,o=[],c=[];for(let l=0;l<n.length;l++){let u=n[l],f;MX.isEmpty(u[t])?(f=vX.v4(),u[t]=f):f=u[t];let d=dy(e,t,u,f,i,!1,s);o.push(d),c.push(f)}return uy(o,c,n,i,s)}a(GX,"upsertRecords");async function uy(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||Mi.getNextMonotonicTime(),kX(r,i),n}a(uy,"finalizeWrite");function dy(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(nv(r,!f,o),Number.isInteger(r[qc])&&u[qc]>r[qc])return!1;f&&s.original_records.push(u);let d,p=a(()=>{for(let h in r){if(!r.hasOwnProperty(h)||h===t)continue;let S=r[h],g=e.dbis[h];if(g===void 0)continue;let R=u[h];if(typeof S=="function"){let A=S([[u]]);Array.isArray(A)&&(S=A[0][po.FUNC_VAL],r[h]=S)}if(S===R)continue;let E=Mi.getIndexedValues(R);if(E){nE&&g.prefetch(E.map(A=>({key:A,value:n})),sE);for(let A=0,N=E.length;A<N;A++)g.remove(E[A],n)}if(E=Mi.getIndexedValues(S),E){nE&&g.prefetch(E.map(A=>({key:A,value:n})),sE);for(let A=0,N=E.length;A<N;A++)g.put(E[A],n)}}let _={...u,...r};c.put(n,_,_[qc])},"do_put");return l?d=c.ifVersion(n,l.version,p):d=c.ifNoExists(n,p),d.then(_=>_?!0:dy(e,t,r,n,s,i,o))}a(dy,"updateUpsertRecord");function qX(e,t,r){if(Mi.validateEnv(e),t===void 0)throw new Error(c_.HASH_ATTRIBUTE_REQUIRED);if(!Array.isArray(r))throw r===void 0?new Error(c_.WRITE_ATTRIBUTES_REQUIRED):new Error(c_.WRITE_ATTRIBUTES_MUST_BE_ARRAY)}a(qX,"validateBasic");function fy(e,t,r,n){if(qX(e,t,r),!Array.isArray(n))throw n===void 0?new Error(c_.RECORDS_REQUIRED):new Error(c_.RECORDS_MUST_BE_ARRAY)}a(fy,"validateWrite");function sE(){}a(sE,"noop");sv.exports={insertRecords:BX,updateRecords:FX,upsertRecords:GX}});var ho=I((bOe,$X)=>{$X.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 ov=I((OOe,iv)=>{"use strict";var VX=require("uuid"),_y=class{static{a(this,"CreateAttributeObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.attribute=n,this.id=s||VX.v4(),this.schema_table=`${this.schema}.${this.table}`}};iv.exports=_y});var iE=I((wOe,av)=>{"use strict";var KX=ov(),py=class extends KX{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}};av.exports=py});var lv=I((COe,cv)=>{"use strict";cv.exports=WX;var YX="inserted";function WX(e,t,r,n){let s={message:`${e} ${t.length} of ${r.records.length} records`,skipped_hashes:n};return e===YX?(s.inserted_hashes=t,s):(s.update_hashes=t,s)}a(WX,"returnObject")});var oE=I((LOe,dv)=>{"use strict";var zX=(H(),P(G)),hy=ft(),jX=$c(),{getSystemSchemaPath:JX,getSchemaPath:QX}=Et(),DOe=ho(),{validateBySchema:XX}=it(),l_=require("joi"),ZX=iE(),e6=lv(),{handleHDBError:t6,hdb_errors:r6,ClientError:n6}=pe(),uv=ae(),{HTTP_STATUS_CODES:s6}=r6,i6="inserted";dv.exports=o6;async function o6(e){let t=XX(e,l_.object({database:l_.string(),schema:l_.string(),table:l_.string().required(),attribute:l_.string().required()}));if(t)throw new n6(t.message);let r=!e.skip_table_check&&uv.checkGlobalSchemaTable(e.schema,e.table);if(r)throw t6(new Error,r,s6.NOT_FOUND);e.is_hash_attribute=e.is_hash_attribute=="true",e.dup_sort=uv.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 ZX(e.schema,e.table,e.attribute,e.id);try{let i=await hy.openEnvironment(QX(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}`);hy.createDBI(i,e.attribute,e.dup_sort,e.is_hash_attribute);let o=await hy.openEnvironment(JX(),zX.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),{written_hashes:c,skipped_hashes:l}=await jX.insertRecords(o,HDB_TABLE_INFO.hash_attribute,hdb_attribute_attributes,[s]);return e6(i6,c,{records:[s]},l)}catch(i){throw i}}a(o6,"lmdbCreateAttribute")});var u_=I((UOe,_v)=>{"use strict";var mo=ae(),fv=W(),vOe=GR(),{getDatabases:a6}=(De(),P(nt)),{ClientError:Vc}=pe();_v.exports=c6;function c6(e){if(mo.isEmpty(e))throw new Vc("invalid update parameters defined.");if(mo.isEmptyOrZeroLength(e.schema))throw new Vc("invalid schema specified.");if(mo.isEmptyOrZeroLength(e.table))throw new Vc("invalid table specified.");if(!Array.isArray(e.records))throw new Vc("records must be an array");let t=a6()[e.schema]?.[e.table];if(mo.isEmpty(t))throw new Vc(`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&&mo.isEmptyOrZeroLength(o[r]))throw fv.error("a valid hash attribute must be provided with update record:",o),new Vc("a valid hash attribute must be provided with update record, check log for more info");if(!mo.isEmptyOrZeroLength(o[r])&&(o[r]==="null"||o[r]==="undefined"))throw fv.error(`a valid hash value must be provided with ${e.operation} record:`,o),new Vc(`Invalid hash value: '${o[r]}' is not a valid hash attribute value, check log for more info`);!mo.isEmpty(o[r])&&o[r]!==""&&n.has(mo.autoCast(o[r]))&&(o.skip=!0),n.add(mo.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(c6,"insertUpdateValidate")});var hv=I((BOe,pv)=>{"use strict";var my=class{static{a(this,"ITCEventObject")}constructor(t,r){this.type=t,this.message=r}};pv.exports=my});var gv=I((kOe,Ev)=>{"use strict";var Ey=ft(),l6=W(),mv=Bn().LMDB_ERRORS_ENUM;Ev.exports=u6;async function u6(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 Ey.closeEnvironment(global.lmdb_map[o])}catch(c){if(c.message!==mv.ENV_REQUIRED)throw c}}break;case"drop_table":let n=`${e.schema}.${e.table}`,s=`txn.${n}`;try{await Ey.closeEnvironment(global.lmdb_map[n]),await Ey.closeEnvironment(global.lmdb_map[s])}catch(i){if(i.message!==mv.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){l6.error(t)}}a(u6,"cleanLMDBMap")});var Dv=I((qOe,Pv)=>{"use strict";var gy=require("recursive-iterator"),d6=require("alasql"),Sy=require("clone"),Sv=ae(),{handleHDBError:Tv,hdb_errors:f6}=pe(),{HDB_ERROR_MSGS:Av,HTTP_STATUS_CODES:Rv}=f6,{getDatabases:_6}=(De(),P(nt)),p6=["DISTINCT_ARRAY"],yv=Symbol("validateTables"),Ty=Symbol("validateTable"),GOe=Symbol("getAllColumns"),bv=Symbol("validateAllColumns"),aE=Symbol("findColumn"),Ov=Symbol("validateOrderBy"),d_=Symbol("validateSegment"),Ay=Symbol("validateColumn"),Nv=Symbol("setColumnsForTable"),wv=Symbol("checkColumnsForAsterisk"),Iv=Symbol("validateGroupBy"),Cv=Symbol("hasColumns"),Ry=class{static{a(this,"SelectValidator")}constructor(t){this.statement=t,this.attributes=[]}validate(){if(!this.statement)throw new Error("invalid sql statement");this[yv](),this[wv](),this[bv]()}[yv](){if(this[Cv]()){if(!this.statement.from||this.statement.from.length===0)throw"no from clause";this.statement.from.forEach(t=>{this[Ty](t)}),this.statement.joins&&this.statement.joins.forEach(t=>{t.table.as=t.as,this[Ty](t.table)})}}[Cv](){let t=!1,r=new gy(this.statement);for(let{node:n,path:s}of r)if(n&&n.columnid){t=!0;break}return t}[Ty](t){if(!t.databaseid)throw`schema not defined for table ${t.tableid}`;let r=_6();if(!r[t.databaseid])throw Tv(new Error,Av.SCHEMA_NOT_FOUND(t.databaseid),Rv.NOT_FOUND);if(!r[t.databaseid][t.tableid])throw Tv(new Error,Av.TABLE_NOT_FOUND(t.databaseid,t.tableid),Rv.NOT_FOUND);r[t.databaseid][t.tableid].attributes.forEach(s=>{let i=Sy(s);i.table=Sy(t),this.attributes.push(i)})}[aE](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)}[wv](){let t=new gy(this.statement.columns);for(let{node:r,path:n}of t)r&&r.columnid==="*"&&n.indexOf("expression")<0&&this[Nv](r.tableid)}[Nv](t){this.attributes.forEach(r=>{(!t||t&&(r.table.tableid===t||r.table.as===t))&&!r.relation&&this.statement.columns.push(new d6.yy.Column({columnid:r.attribute,tableid:r.table.as?r.table.as:r.table.tableid}))})}[bv](){this[d_](this.statement.columns,!1),this[d_](this.statement.joins,!1),this[d_](this.statement.where,!1),this[Iv](this.statement.group,!1),this[d_](this.statement.order,!0)}[d_](t,r){if(!t)return;let n=new gy(t),s=[];for(let{node:i,path:o}of n)!Sv.isEmpty(i)&&!Sv.isEmpty(i.columnid)&&i.columnid!=="*"&&(r?this[Ov](i):s.push(this[Ay](i)));return s}[Iv](t){if(!t)return;let r=[];if(this.statement.columns.forEach(n=>{if(!(n.funcid&&p6.indexOf(n.funcid.toUpperCase())>=0)){if(!n.aggregatorid&&!n.columnid){let s=Sy(n);delete s.as,r.push(s)}else if(n.columnid){let s=this[aE](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[aE](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`}[Ov](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[Ay](t)}[Ay](t){let r=this[aE](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]}};Pv.exports=Ry});var Uv=I((VOe,vv)=>{"use strict";var Lv=require("lodash"),f_=require("mathjs"),h6=require("jsonata"),Mv=ae();vv.exports={distinct_array:a(e=>Array.isArray(e)&&e.length>1?Lv.uniqWith(e,Lv.isEqual):e,"distinct_array"),searchJSON:m6,mad:__.bind(null,f_.mad),mean:__.bind(null,f_.mean),mode:__.bind(null,f_.mode),prod:__.bind(null,f_.prod),median:__.bind(null,f_.median)};function __(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(__,"aggregateFunction");function m6(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(Mv.isEmpty(this.__ala__.res)&&(this.__ala__.res={}),Mv.isEmpty(this.__ala__.res[r])){let n=h6(e);this.__ala__.res[r]=n}return this.__ala__.res[r].evaluate(t)}a(m6,"searchJSON")});var Bv=I((YOe,xv)=>{"use strict";var er=require("moment"),yy="YYYY-MM-DDTHH:mm:ss.SSSZZ";er.suppressDeprecationWarnings=!0;xv.exports={current_date:a(()=>er().utc().format("YYYY-MM-DD"),"current_date"),current_time:a(()=>er().utc().format("HH:mm:ss.SSS"),"current_time"),extract:a((e,t)=>{switch(t.toLowerCase()){case"year":return er(e).utc().format("YYYY");case"month":return er(e).utc().format("MM");case"day":return er(e).utc().format("DD");case"hour":return er(e).utc().format("HH");case"minute":return er(e).utc().format("mm");case"second":return er(e).utc().format("ss");case"millisecond":return er(e).utc().format("SSS");default:break}},"extract"),date:a(e=>er(e).utc().format(yy),"date"),date_format:a((e,t)=>er(e).utc().format(t),"date_format"),date_add:a((e,t,r)=>er(e).utc().add(t,r).valueOf(),"date_add"),date_sub:a((e,t,r)=>er(e).utc().subtract(t,r).valueOf(),"date_sub"),date_diff:a((e,t,r)=>{let n=er(e).utc(),s=er(t).utc();return r?n.diff(s,r,!0):n.diff(s)},"date_diff"),now:a(()=>er().utc().valueOf(),"now"),get_server_time:a(()=>er().format(yy),"get_server_time"),offset_utc:a((e,t)=>er(e).utc().utcOffset(t).format(yy),"offset_utc")}});var Gv=I((zOe,Fv)=>{"use strict";var E6=require("@turf/area"),g6=require("@turf/length"),S6=require("@turf/circle"),T6=require("@turf/difference"),A6=require("@turf/distance"),R6=require("@turf/boolean-contains"),y6=require("@turf/boolean-equal"),b6=require("@turf/boolean-disjoint"),O6=require("@turf/helpers"),Hv=(H(),P(G)),qe=ae(),Eo=W();Fv.exports={geoArea:N6,geoLength:w6,geoCircle:I6,geoDifference:C6,geoDistance:kv,geoNear:P6,geoContains:D6,geoEqual:L6,geoCrosses:M6,geoConvert:v6};function N6(e){if(qe.isEmpty(e))return NaN;typeof e=="string"&&(e=qe.autoCastJSON(e));try{return E6.default(e)}catch(t){return Eo.trace(t,e),NaN}}a(N6,"geoArea");function w6(e,t){if(qe.isEmpty(e))return NaN;typeof e=="string"&&(e=qe.autoCastJSON(e));try{return g6.default(e,{units:t||"kilometers"})}catch(r){return Eo.trace(r,e),NaN}}a(w6,"geoLength");function I6(e,t,r){if(qe.isEmpty(e))return NaN;if(qe.isEmpty(t))return NaN;typeof e=="string"&&(e=qe.autoCastJSON(e));try{return S6.default(e,t,{units:r||"kilometers"})}catch(n){return Eo.trace(n,e,t),NaN}}a(I6,"geoCircle");function C6(e,t){if(qe.isEmpty(e))return NaN;if(qe.isEmpty(t))return NaN;typeof e=="string"&&(e=qe.autoCastJSON(e)),typeof t=="string"&&(t=qe.autoCastJSON(t));try{return T6(e,t)}catch(r){return Eo.trace(r,e,t),NaN}}a(C6,"geoDifference");function kv(e,t,r){if(qe.isEmpty(e))return NaN;if(qe.isEmpty(t))return NaN;typeof e=="string"&&(e=qe.autoCastJSON(e)),typeof t=="string"&&(t=qe.autoCastJSON(t));try{return A6.default(e,t,{units:r||"kilometers"})}catch(n){return Eo.trace(n,e,t),NaN}}a(kv,"geoDistance");function P6(e,t,r,n){if(qe.isEmpty(e)||qe.isEmpty(t))return!1;if(qe.isEmpty(r))throw new Error("distance is required");if(typeof e=="string"&&(e=qe.autoCastJSON(e)),typeof t=="string"&&(t=qe.autoCastJSON(t)),isNaN(r))throw new Error("distance must be a number");try{return kv(e,t,n)<=r}catch(s){return Eo.trace(s,e,t),!1}}a(P6,"geoNear");function D6(e,t){if(qe.isEmpty(e)||qe.isEmpty(t)||e.coordinates&&e.coordinates.includes?.(null)||t.coordinates&&t.coordinates.includes?.(null))return!1;typeof e=="string"&&(e=qe.autoCastJSON(e)),typeof t=="string"&&(t=qe.autoCastJSON(t));try{return R6.default(e,t)}catch(r){return Eo.trace(r,e,t),!1}}a(D6,"geoContains");function L6(e,t){if(qe.isEmpty(e)||qe.isEmpty(t)||e.coordinates&&e.coordinates.includes?.(null)||t.coordinates&&t.coordinates.includes?.(null))return!1;typeof e=="string"&&(e=qe.autoCastJSON(e)),typeof t=="string"&&(t=qe.autoCastJSON(t));try{return y6.default(e,t)}catch(r){return Eo.trace(r,e,t),!1}}a(L6,"geoEqual");function M6(e,t){if(qe.isEmpty(e)||qe.isEmpty(t)||e.coordinates&&e.coordinates.includes?.(null)||t.coordinates&&t.coordinates.includes?.(null))return!1;typeof e=="string"&&(e=qe.autoCastJSON(e)),typeof t=="string"&&(t=qe.autoCastJSON(t));try{return!b6.default(e,t)}catch(r){return Eo.trace(r,e,t),!1}}a(M6,"geoCrosses");function v6(e,t,r){if(qe.isEmptyOrZeroLength(e))throw new Error("coordinates is required");if(qe.isEmpty(t))throw new Error("geo_type is required");if(qe.isEmpty(Hv.GEO_CONVERSION_ENUM[t]))throw new Error(`geo_type of ${t} is invalid please use one of the following types: ${Object.keys(Hv.GEO_CONVERSION_ENUM).join(",")}`);return typeof e=="string"&&(e=qe.autoCastJSON(e)),O6[t](e,r)}a(v6,"geoConvert")});var cE=I((JOe,qv)=>{var Kc=Uv(),Vn=Bv(),vi=Gv();qv.exports=e=>{e.aggr.mad=e.aggr.MAD=Kc.mad,e.aggr.mean=e.aggr.MEAN=Kc.mean,e.aggr.mode=e.aggr.MODE=Kc.mode,e.aggr.prod=e.aggr.PROD=Kc.prod,e.aggr.median=e.aggr.MEDIAN=Kc.median,e.fn.distinct_array=e.fn.DISTINCT_ARRAY=Kc.distinct_array,e.fn.search_json=e.fn.SEARCH_JSON=Kc.searchJSON,e.fn.__ala__=e,e.fn.current_date=e.fn.CURRENT_DATE=Vn.current_date,e.fn.current_time=e.fn.CURRENT_TIME=Vn.current_time,e.fn.extract=e.fn.EXTRACT=Vn.extract,e.fn.date=e.fn.DATE=Vn.date,e.fn.date_format=e.fn.DATE_FORMAT=Vn.date_format,e.fn.date_add=e.fn.DATE_ADD=Vn.date_add,e.fn.date_sub=e.fn.DATE_SUB=Vn.date_sub,e.fn.date_diff=e.fn.DATE_DIFF=e.fn.datediff=e.fn.DATEDIFF=Vn.date_diff,e.fn.now=e.fn.NOW=Vn.now,e.fn.offset_utc=e.fn.OFFSET_UTC=Vn.offset_utc,e.fn.get_server_time=e.fn.GET_SERVER_TIME=Vn.get_server_time,e.fn.getdate=e.fn.GETDATE=Vn.now,e.fn.current_timestamp=e.fn.CURRENT_TIMESTAMP=Vn.now,e.fn.geoarea=e.fn.GEOAREA=e.fn.geoArea=vi.geoArea,e.fn.geocircle=e.fn.GEOCIRCLE=e.fn.geoCircle=vi.geoCircle,e.fn.geocontains=e.fn.GEOCONTAINS=e.fn.geoContains=vi.geoContains,e.fn.geoconvert=e.fn.GEOCONVERT=e.fn.geoConvert=vi.geoConvert,e.fn.geocrosses=e.fn.GEOCROSSES=e.fn.geoCrosses=vi.geoCrosses,e.fn.geodifference=e.fn.GEODIFFERENCE=e.fn.geoDifference=vi.geoDifference,e.fn.geodistance=e.fn.GEODISTANCE=e.fn.geoDistance=vi.geoDistance,e.fn.geoequal=e.fn.GEOEQUAL=e.fn.geoEqual=vi.geoEqual,e.fn.geolength=e.fn.GEOLENGTH=e.fn.geoLength=vi.geoLength,e.fn.geonear=e.fn.GEONEAR=e.fn.geoNear=vi.geoNear}});var Yv=I((QOe,Kv)=>{"use strict";var p_=require("lodash"),An=require("alasql");An.options.cache=!1;var U6=cE(),$v=require("clone"),lE=require("recursive-iterator"),Be=W(),ze=ae(),Cu=Kn(),x6=(H(),P(G)),{hdb_errors:B6}=pe(),{getDatabases:Vv}=(De(),P(nt)),H6="IS NULL",ei="There was a problem performing this search. Please check the logs and try again.";U6(An);var by=class{static{a(this,"SQLSearch")}constructor(t,r){if(ze.isEmpty(t))throw Be.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(),ze.backtickASTSchemaItems(this.statement)}async search(){let t;try{let n=await this._checkEmptySQL();if(!ze.isEmptyOrZeroLength(n))return Be.trace("No results returned from checkEmptySQL SQLSearch method."),n}catch(n){throw Be.error("Error thrown from checkEmptySQL in SQLSearch class method search."),Be.error(n),new Error(ei)}try{let n=await this._getFetchAttributeValues();if(n)return n}catch(n){throw Be.error("Error thrown from getFetchAttributeValues in SQLSearch class method search."),Be.error(n),new Error(ei)}if(Object.keys(this.data).length===0)return Be.trace('SQLSearch class field: "data" is empty.'),[];let r;try{r=await this._processJoins()}catch(n){throw Be.error("Error thrown from processJoins in SQLSearch class method search."),Be.error(n),new Error(ei)}try{await this._getFinalAttributeData(r.existing_attributes,r.joined_length)}catch(n){throw Be.error("Error thrown from getFinalAttributeData in SQLSearch class method search."),Be.error(n),new Error(ei)}try{return t=await this._finalSQL(),t}catch(n){throw Be.error("Error thrown from finalSQL in SQLSearch class method search."),Be.error(n),new Error(ei)}}_getColumns(){let t=new lE(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($v(r)))}_getTables(){let t=[];this.all_table_attributes.forEach(r=>{t.push(r.table)}),this.tables=p_.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=Vv()[r.databaseid][r.tableid].primaryKey,this.data[n].__merged_data={},this.data[n].__merged_attributes=[],this.data[n].__merged_attr_map={}})}_conditionsToFetchAttributeValues(){if(ze.isEmpty(this.statement.where)){Be.trace('AST "where" statement is empty.');return}let t=!1;for(let{node:r}of new lE(this.statement.where))if(r&&r.op&&r.op==="OR"&&(t=!0),!ze.isEmpty(r)&&r.right)if(ze.isNotEmptyAndHasValue(r.right.value)){let n=ze.autoCast(r.right.value);[!0,!1].indexOf(n)>=0&&(r.right=new An.yy.LogicValue({value:n}))}else Array.isArray(r.right)&&r.right.forEach((n,s)=>{let i=ze.autoCast(n.value);[!0,!1].indexOf(i)>=0?r.right[s]=new An.yy.LogicValue({value:i}):n instanceof An.yy.StringValue&&ze.autoCasterIsNumberCheck(i.toString())&&(r.right[s]=new An.yy.NumValue({value:i}))});if(t){Be.trace('Where clause contains "OR", exact match search not performed on attributes.');return}for(let{node:r}of new lE(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(!ze.isEmpty(x6.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[r.op])){if(ze.isEmpty(this.comparator_search_values[o])&&(this.comparator_search_values[o]={ignore:!1,comparators:[]}),!this.comparator_search_values[o].ignore){if(ze.isEmptyOrZeroLength(r.left.columnid)||ze.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(ze.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"=":!ze.isEmpty(r.right.value)||!ze.isEmpty(r.left.value)?n.add(ze.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(ze.isEmptyOrZeroLength(this.all_table_attributes)&&ze.isEmptyOrZeroLength(this.statement.from)&&ze.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&&p_.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(ze.isEmptyOrZeroLength(r)){let n=this.columns.columns.filter(s=>s.as?t.columnid===s.as:!1);ze.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(ze.isEmptyOrZeroLength(this.all_table_attributes)&&!ze.isEmptyOrZeroLength(this.columns.columns))return t;if(ze.isEmptyOrZeroLength(this.all_table_attributes)&&ze.isEmptyOrZeroLength(this.statement.from))try{let r=this._buildSQL(!1);t=await An.promise(r)}catch(r){throw Be.error("Error thrown from AlaSQL in SQLSearch class method checkEmptySQL."),Be.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($v(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(ze.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:Vv()[s.databaseid][s.tableid].primaryKey,tableid:s.tableid};this._addFetchColumns([i])}),this.statement.order&&(this._updateOrderByToAliases(),this._addNonAggregatorsToFetchColumns()),this.fetch_attributes=p_.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),!ze.isEmpty(this.exact_search_values[u])&&!this.exact_search_values[u].ignore&&!ze.isEmptyOrZeroLength(this.exact_search_values[u].values))if(l)try{c.hash_values=Array.from(this.exact_search_values[u].values);let f=await Cu.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 Be.error("Error thrown from getDataByHash function in SQLSearch class method getFetchAttributeValues exact match."),Be.error(f),new Error(ei)}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 p=await Cu.getDataByValue(d);for(let[_,h]of p)this.data[i].__merged_data[_]?this._updateMergedAttribute(i,_,s.attribute,h[s.attribute]):(this.data[i].__merged_data[_]=[...n[i]],this._updateMergedAttribute(i,_,s.attribute,h[s.attribute]),this._setMergedHashAttribute(i,_))}))}catch(f){throw Be.error("Error thrown from getDataByValue function in SQLSearch class method getFetchAttributeValues exact match."),Be.error(f),new Error(ei)}else if(!ze.isEmpty(this.comparator_search_values[u])&&!this.comparator_search_values[u].ignore&&!ze.isEmptyOrZeroLength(this.comparator_search_values[u].comparators))try{let f=this.comparator_search_values[u].comparators;for(let d=0,p=f.length;d<p;d++){let _=f[d];c.search_attribute=_.attribute,c.search_value=_.search_value;let h=await Cu.getDataByValue(c,_.operation);if(l)for(let[S]of h)this.data[i].__merged_data[S]||(this.data[i].__merged_data[S]=[...n[i]],this._setMergedHashAttribute(i,S));else for(let[S,g]of h)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 Be.error("Error thrown from getDataByValue function in SQLSearch class method getFetchAttributeValues comparator search values."),Be.error(f),new Error(ei)}else try{c.search_attribute=s.attribute,c.search_value="*";let f=await Cu.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,p]of f)this.data[i].__merged_data[d]?this._updateMergedAttribute(i,d,s.attribute,p[s.attribute]):(this.data[i].__merged_data[d]=[...n[i]],this._updateMergedAttribute(i,d,s.attribute,p[s.attribute]),this._setMergedHashAttribute(i,d))}catch(f){throw Be.error("Error thrown from getDataByValue function in SQLSearch class method getFetchAttributeValues no comparator search values."),Be.error(f),new Error(ei)}}}_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 An.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 An.yy.Column;s.columnid=n.as,s.columnid_orig=n.as_orig,t.expression=s}else{t.initial_select_column=Object.assign(new An.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 An.yy.FuncValue:new An.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 h=_.joinmode+" JOIN ? AS "+(_.as?_.as:_.table.tableid);_.on&&(h+=" ON "+_.on.toString()),i.push(h),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 h=this.data[`${_.databaseid_orig}_${_.as?_.as_orig:_.tableid_orig}`].__hash_name,S=_.as?_.as_orig:_.tableid_orig;o.push({key:`'${S}.${h}'`,schema:_.databaseid_orig,table:_.as?_.as_orig:_.tableid_orig,keys:new Set}),r.push(`${_.as?_.as:_.tableid}.\`${h}\` AS "${S}.${h}"`),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 p=[];try{let _=`SELECT ${r.join(", ")} FROM ${i.join(" ")} ${l} ${u} ${f} ${d}`,h=this._convertColumnsToIndexes(_,s);p=await An.promise(h,t),t=null}catch(_){throw Be.error("Error thrown from AlaSQL in SQLSearch class method processJoins."),Be.error(_),new Error("There was a problem processing the data.")}if(p&&p.length>0){for(let _=0,h=p.length;_<h;_++){let S=p[_];o.forEach(g=>{S[g.key]!==null&&S[g.key]!==void 0&&g.keys.add(S[g.key])})}o.forEach(_=>{let h=Object.keys(this.data[`${_.schema}_${_.table}`].__merged_data),S=p_.difference(h,[..._.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:p?p.length:0}}async _getFinalAttributeData(t,r){if(r===0)return;let n=[],s=new lE(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=p_.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 Be.error("Error thrown from getData in SQLSearch class method getFinalAttributeData."),Be.error(i),new Error(ei)}}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 Cu.getDataByHash(c),u=s.columns.length;for(let f=0,d=o.length;f<d;f++){let p=o[f],_=l.get(p);for(let h=0;h<u;h++){let S=s.columns[h],g=_[S]===void 0?null:_[S];this.data[n].__merged_data[p].push(g)}}}}catch(r){throw Be.error("Error thrown from getDataByHash function in SQLSearch class method getData."),Be.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();Be.trace(`Final SQL: ${s}`),n=await An.promise(s,t),this.has_outer_join&&(n=this._translateUndefinedValues(n)),Be.trace(`Final AlaSQL results data included ${n.length} rows`)}catch(s){throw Be.error("Error thrown from AlaSQL in SQLSearch class method finalSQL."),Be.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 Be.error(B6.HDB_ERROR_MSGS.OUTER_JOIN_TRANSLATION_ERROR),Be.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 Cu.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 Be.error("There was an error when processing this SQL operation. Check your logs"),Be.error(o),new Error(ei)}}return Object.values(Object.values(this.data)[0].__merged_data)}};Kv.exports=by});var Wr=I((ZOe,Wv)=>{"use strict";var k6=Dv();Wv.exports={searchByConditions:G6,searchByHash:q6,searchByValue:$6,search:V6};var Oy=Kn(),{transformReq:Ny}=ae(),F6=Yv();async function G6(e){return Ny(e),Oy.searchByConditions(e)}a(G6,"searchByConditions");async function q6(e){Ny(e),e.ids&&(e.hash_values=e.ids);let t=[];for await(let r of Oy.searchByHash(e))r&&t.push(r);return t}a(q6,"searchByHash");async function $6(e){Ny(e),e.hasOwnProperty("desc")===!0&&(e.reverse=e.desc);let t=[];for await(let r of Oy.searchByValue(e))t.push(r);return t}a($6,"searchByValue");function V6(e,t){try{let r=new k6(e);r.validate(),new F6(r.statement,r.attributes).search().then(s=>{t(null,s)}).catch(s=>{t(s,null)})}catch(r){return t(r)}}a(V6,"search")});var go=I((tNe,Qv)=>{"use strict";var h_=require("crypto"),K6=ce(),{CONFIG_PARAMS:Y6}=(H(),P(G)),jv="aes-256-cbc",W6=32,z6=16,wy=64,Jv=32,j6=wy+Jv,zv=new Map;Qv.exports={encrypt:J6,decrypt:Q6,createNatsTableStreamName:X6};function J6(e){let t=h_.randomBytes(W6),r=h_.randomBytes(z6),n=h_.createCipheriv(jv,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(J6,"encrypt");function Q6(e){let t=e.substr(0,wy),r=e.substr(wy,Jv),n=e.substr(j6,e.length),s=Buffer.from(r,"hex"),i=Buffer.from(n,"hex"),o=h_.createDecipheriv(jv,Buffer.from(t,"hex"),s),c=o.update(i);return c=Buffer.concat([c,o.final()]),c.toString()}a(Q6,"decrypt");function X6(e,t){let r=K6.get(Y6.CLUSTERING_DATABASELEVEL)?e:`${e}.${t}`,n=zv.get(r);return n||(n=h_.createHash("md5").update(r).digest("hex"),zv.set(r,n)),n}a(X6,"createNatsTableStreamName")});var So=I((sNe,tU)=>{"use strict";var nNe=Wr(),m_=W(),{validateBySchema:Xv}=it(),Yc=require("joi"),Z6=go(),uE=ae(),{handleHDBError:dE,hdb_errors:eZ,ClientError:Zv}=pe(),{HDB_ERROR_MSGS:fE,HTTP_STATUS_CODES:Iy}=eZ,eU=ce();eU.initSync();var{getDatabases:Cy}=(De(),P(nt)),tZ=require("fs-extra"),rZ=(H(),P(G));tU.exports={describeAll:nZ,describeTable:_E,describeSchema:sZ};async function nZ(e={}){try{let t=uE.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=Cy(),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 p=i[d];for(let _ in p)try{let h;if(t||s||r)h=await _E({schema:d,table:_,exact_count:u});else if(n&&n[d].describe&&n[d].tables[_].describe){let S=n[d].tables[_].attribute_permissions;h=await _E({schema:d,table:_,exact_count:u},S)}h&&l.push(h)}catch(h){m_.error(h)}}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 m_.error("Got an error in describeAll"),m_.error(t),dE(new Error,fE.DESCRIBE_ALL_ERR)}}a(nZ,"describeAll");async function _E(e,t){uE.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=Xv(e,Yc.object({database:Yc.string(),table:Yc.string().required(),exact_count:Yc.boolean().strict()}));if(i)throw new Zv(i.message);let c=Cy()[r];if(!c)throw dE(new Error,fE.SCHEMA_NOT_FOUND(e.schema),Iy.NOT_FOUND);let l=c[n];if(!l)throw dE(new Error,fE.TABLE_NOT_FOUND(e.schema,e.table),Iy.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(h=>({type:h.type,name:h.name})):void 0})}a(u,"pushAtt");let f=[];if(s){let _={};s.forEach(h=>{h.describe&&(_[h.attribute_name]=!0)}),l.attributes.forEach(h=>{_[h.name]&&u(h)})}else l.attributes?.forEach(_=>u(_));let d;try{d=(await tZ.stat(l.primaryStore.env.path)).size}catch(_){m_.warn("unable to get database size",_)}let p={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&&(p.replicate=l.replicate),l.expirationMS!==void 0&&(p.expiration=l.expirationMS/1e3+"s"),l.sealed!==void 0&&(p.sealed=l.sealed),l.sources?.length>0&&(p.sources=l.sources.map(_=>_.name).filter(_=>_&&_!=="NATSReplicator"&&_!=="Replicator")),eU.get(rZ.CONFIG_PARAMS.CLUSTERING_ENABLED)&&(p.clustering_stream_name=Z6.createNatsTableStreamName(p.schema,p.name));try{let _=await l.getRecordCount({exactCount:!!e.exact_count});p.record_count=_.recordCount,p.table_size=l.getSize(),p.db_audit_size=l.getAuditSize(),p.estimated_record_range=_.estimatedRange;let h=l.auditStore;if(h)for(let S of h.getKeys({reverse:!0,limit:1}))p.last_updated_record=S[0];if(!p.last_updated_record&&l.indices.__updatedtime__)for(let S of l.indices.__updatedtime__.getKeys({reverse:!0,limit:1}))p.last_updated_record=S}catch(_){m_.warn(`unable to stat table dbi due to ${_}`)}return p}a(_E,"descTable");async function sZ(e){uE.transformReq(e);let t=Xv(e,Yc.object({database:Yc.string(),exact_count:Yc.boolean().strict()}));if(t)throw new Zv(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=Cy()[n];if(!i)throw dE(new Error,fE.SCHEMA_NOT_FOUND(e.schema),Iy.NOT_FOUND);let o={};for(let c in i){let l;if(r&&r.tables[c]&&(l=r.tables[c]),uE.isEmpty(l)||l.describe){let u=await _E({schema:e.schema,table:c,exact_count:e.exact_count},l?l.attribute_permissions:null);u&&(o[u.name]=u)}}return o}a(sZ,"describeSchema")});var Rs=I((cNe,oU)=>{var iZ=ho(),{callbackify:nU,promisify:oZ}=require("util"),{getDatabases:sU}=(De(),P(nt));oU.exports={setSchemaDataToGlobal:rU,getTableSchema:aZ,getSystemSchema:cZ,setSchemaDataToGlobalAsync:oZ(rU)};var iU=So(),oNe=nU(iU.describeAll),aNe=nU(iU.describeTable);function rU(e){global.hdb_schema=sU(),e&&e()}a(rU,"setSchemaDataToGlobal");function aZ(e,t,r){let n=sU()[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(aZ,"getTableSchema");function cZ(){return iZ}a(cZ,"getSystemSchema")});var Dy=I((uNe,lU)=>{var lZ=it(),Py=require("joi"),{hdb_table:uZ,hdb_database:aU}=Li(),cU={schema:aU,database:aU,table:uZ},dZ={date:Py.date().iso().required()},fZ={timestamp:Py.date().timestamp().required().messages({"date.format":"'timestamp' is invalid"})};lU.exports=function(e,t){let r=t==="timestamp"?{...cU,...fZ}:{...cU,...dZ},n=Py.object(r);return lZ.validateBySchema(e,n)}});var fU=I((dNe,dU)=>{var _Z=it(),Ly=require("joi"),{hdb_table:pZ,hdb_database:uU}=Li(),hZ=Ly.object({schema:uU,database:uU,table:pZ,hash_values:Ly.array().required(),ids:Ly.array()});dU.exports=function(e){return _Z.validateBySchema(e,hZ)}});var xy=I((fNe,_U)=>{"use strict";var My=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}},vy=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}},Uy=class{static{a(this,"DeleteResponseObject")}constructor(){this.message=void 0,this.deleted_hashes=[],this.skipped_hashes=[]}};_U.exports={InsertObject:My,NoSQLSeachObject:vy,DeleteResponseObject:Uy}});var jc=I((pNe,gU)=>{"use strict";var hU=Dy(),mZ=fU(),Wc=ae(),pU=require("moment"),mU=W(),{promisify:EZ,callbackify:gZ}=require("util"),zc=(H(),P(G)),SZ=Rs(),By=EZ(SZ.getTableSchema),Hy=Kn(),{DeleteResponseObject:TZ}=xy(),{handleHDBError:Oa,hdb_errors:AZ}=pe(),{HDB_ERROR_MSGS:pE,HTTP_STATUS_CODES:Na}=AZ,RZ="records successfully deleted",yZ=gZ(EU);gU.exports={delete:yZ,deleteRecord:EU,deleteFilesBefore:bZ,deleteAuditLogsBefore:OZ};async function bZ(e){let t=hU(e,"date");if(t)throw Oa(t,t.message,Na.BAD_REQUEST,void 0,void 0,!0);if(Wc.transformReq(e),!pU(e.date,pU.ISO_8601).isValid())throw Oa(new Error,pE.INVALID_DATE,Na.BAD_REQUEST,zc.LOG_LEVELS.ERROR,pE.INVALID_DATE,!0);let n=Wc.checkSchemaTableExist(e.schema,e.table);if(n)throw Oa(new Error,n,Na.NOT_FOUND,zc.LOG_LEVELS.ERROR,n,!0);let s=await Hy.deleteRecordsBefore(e);if(await By(e.schema,e.table),mU.info(`Finished deleting files before ${e.date}`),s&&s.message)return s.message}a(bZ,"deleteFilesBefore");async function OZ(e){let t=hU(e,"timestamp");if(t)throw Oa(t,t.message,Na.BAD_REQUEST,void 0,void 0,!0);if(Wc.transformReq(e),isNaN(e.timestamp))throw Oa(new Error,pE.INVALID_VALUE("Timestamp"),Na.BAD_REQUEST,zc.LOG_LEVELS.ERROR,pE.INVALID_VALUE("Timestamp"),!0);let r=Wc.checkSchemaTableExist(e.schema,e.table);if(r)throw Oa(new Error,r,Na.NOT_FOUND,zc.LOG_LEVELS.ERROR,r,!0);let n=await Hy.deleteAuditLogsBefore(e);return await By(e.schema,e.table),mU.info(`Finished deleting audit logs before ${e.timestamp}`),n}a(OZ,"deleteAuditLogsBefore");async function EU(e){e.ids&&(e.hash_values=e.ids);let t=mZ(e);if(t)throw Oa(t,t.message,Na.BAD_REQUEST,void 0,void 0,!0);Wc.transformReq(e);let r=Wc.checkSchemaTableExist(e.schema,e.table);if(r)throw Oa(new Error,r,Na.NOT_FOUND,zc.LOG_LEVELS.ERROR,r,!0);try{await By(e.schema,e.table);let n=await Hy.deleteRecords(e);return Wc.isEmptyOrZeroLength(n.message)&&(n.message=`${n.deleted_hashes.length} of ${e.hash_values.length} ${RZ}`),n}catch(n){if(n.message===zc.SEARCH_NOT_FOUND_MESSAGE){let s=new TZ;return s.message=zc.SEARCH_NOT_FOUND_MESSAGE,s.skipped_hashes=e.hash_values.length,s.deleted_hashes=0,s}throw n}}a(EU,"deleteRecord")});var hE={};Ue(hE,{HASH_FUNCTION:()=>S_,hash:()=>Gy,validate:()=>qy});function ky(e=g_){let t="0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";return Array.from(E_.randomBytes(e)).map(r=>t[r%t.length]).join("")}function Gy(e,t=S_[TU?.toUpperCase()]??"sha256"){return Fy[t](e)}function qy(e,t,r=S_[TU?.toUpperCase()]??"sha256"){return e?NZ[r](e,t):!1}var E_,Pu,SU,TU,g_,AU,S_,Fy,NZ,mE=be(()=>{E_=M(require("node:crypto")),Pu=M(require("argon2")),SU=M(ce());H();TU=(0,SU.get)(x.AUTHENTICATION_HASHFUNCTION)?.toLowerCase(),g_=16,AU=9,S_=(n=>(n.MD5="md5",n.SHA256="sha256",n.ARGON2ID="argon2id",n))(S_||{});a(ky,"generateSalt");Fy={md5:a((e,t=void 0)=>{t=t??ky(AU);let r=E_.createHash("md5").update(e+t).digest("hex");return t+r},"md5"),sha256:a((e,t=void 0)=>{t=t??ky(g_);let r=E_.createHash("sha256").update(e+t).digest("hex");return t+r},"sha256"),argon2id:a(async e=>{let t=ky(g_),r=await Pu.hash(e,{type:Pu.argon2id,salt:Buffer.from(t)});return t+r},"argon2id")},NZ={md5:a((e,t)=>{let r=e.slice(0,AU);return e===Fy.md5(t,r)},"md5"),sha256:a((e,t)=>{let r=e.slice(0,g_);return e===Fy.sha256(t,r)},"sha256"),argon2id:a(async(e,t)=>await Pu.verify(e.slice(g_),t),"argon2id")};a(Gy,"hash");a(qy,"validate")});var yU=I((gNe,RU)=>{var $y=it(),zr={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 wZ(e){return zr.password.presence=!0,zr.username.presence=!0,zr.role.presence=!0,zr.active.presence=!0,$y.validateObject(e,zr)}a(wZ,"addUserValidation");function IZ(e){return zr.password.presence=!1,zr.username.presence=!0,zr.role.presence=!1,zr.active.presence=!1,$y.validateObject(e,zr)}a(IZ,"alterUserValidation");function CZ(e){return zr.password.presence=!1,zr.username.presence=!0,zr.role.presence=!1,zr.active.presence=!1,$y.validateObject(e,zr)}a(CZ,"dropUserValidation");RU.exports={addUserValidation:wZ,alterUserValidation:IZ,dropUserValidation:CZ}});var St=I((ANe,OU)=>{"use strict";var{platform:TNe}=require("os"),PZ="nats-server.zip",Vy="nats-server",DZ=process.platform==="win32"?`${Vy}.exe`:Vy,LZ=/^[^\s.,*>]+$/,bU="__request__",MZ=a(e=>`${e}.${bU}`,"REQUEST_SUBJECT"),vZ={NATS_MSG_ID:"Nats-Msg-Id",ORIGIN:"origin",TRANSACTED_NODES:"transacted_nodes"},UZ={HUB_SERVER:"hub.json",LEAF_SERVER:"leaf.json"},xZ={HUB:"hub.pid",LEAF:"leaf.pid"},BZ={HUB:"-hub",LEAF:"-leaf",ADMIN:"-admin"},HZ={SUCCESS:"success",ERROR:"error"},kZ={OPEN:"open",CLOSED:"closed",NO_RESPONDERS:"NoResponders",TIMEOUT:"Timeout"},FZ={TXN:"txn",MSGID:"msgid"},Du={ERR:"error",WRN:"warn",INF:"info",DBG:"debug",TRC:"trace"},GZ={[Du.ERR]:1,[Du.WRN]:2,[Du.INF]:3,[Du.DBG]:4,[Du.TRC]:5},qZ={debug:"-D",trace:"-DVV"};OU.exports={NATS_SERVER_ZIP:PZ,NATS_SERVER_NAME:Vy,NATS_BINARY_NAME:DZ,PID_FILES:xZ,NATS_CONFIG_FILES:UZ,SERVER_SUFFIX:BZ,NATS_TERM_CONSTRAINTS_RX:LZ,REQUEST_SUFFIX:bU,UPDATE_REMOTE_RESPONSE_STATUSES:HZ,CLUSTER_STATUS_STATUSES:kZ,REQUEST_SUBJECT:MZ,SUBJECT_PREFIXES:FZ,MSG_HEADERS:vZ,LOG_LEVELS:Du,LOG_LEVEL_FLAGS:qZ,LOG_LEVEL_HIERARCHY:GZ}});var Ky=I(NU=>{"use strict";var $Z={cert:"-----BEGIN CERTIFICATE-----\rMIIDXDCCAkSgAwIBAgIFNTE4MzQwDQYJKoZIhvcNAQELBQAwXTEXMBUGA1UEAxMO\rSGFycGVyREIsIEluYy4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UE\rBxMGRGVudmVyMRcwFQYDVQQKEw5IYXJwZXJEQiwgSW5jLjAeFw0yMjAzMTEyMzAz\rNDlaFw0yNzAzMTAyMzAzNDlaMF0xFzAVBgNVBAMTDkhhcnBlckRCLCBJbmMuMQsw\rCQYDVQQGEwJVUzELMAkGA1UECBMCQ08xDzANBgNVBAcTBkRlbnZlcjEXMBUGA1UE\rChMOSGFycGVyREIsIEluYy4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\rAQCsEUlBF8WImS78rCFXVKyntxfrW++4qZ3hGnoD2MHZAuDHyeP/5eGnaE9GQhKc\r4DwG4DGvh0wP2zIYnBfiQ3L2ZtnlDR9ZkKIQYGlVxTUn6T43krhK5nZKqDF43Yg3\rZEvO3cbJBjiKZx0eA2/toehdSsTAHHQx5gTDcggNe2tgoJHYPwi9YF/AxSBZrbgb\ryWlYgtYDmF32ytHP03GUCIdKOFuBPsHTGu4SkdEIdLIqO9oglW1YFH5qZ6NiwApW\rsP+GCuqOwDXXbdjr75iq9Tq/CDrjGFLaTPmvd2Q0qG/BtaCll0ghpG+yIHvt/iQs\rajS+LxEWAnVlGMaDdFErbDUtAgMBAAGjIzAhMA8GA1UdEwEB/wQFMAMBAf8wDgYD\rVR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4IBAQASR4YW/rPK7PNArHVe9zzM\rb0rKNX/2T9/0nybRhmE/+hdlSgliTAeebmwkUS2APckmekYt/q2ZY2NS65Fo/jjp\rG8TJrtcF4h+ylVqUp0ZXQLFtIsr7r2JZA7hJ6njW6G4DHSZ0gxtECLi4CBlTjzm5\rNmnmIDObvGRTuqmcdAZmXeObbta/He2XIzietukPAYX062pNM+G5XT5UM1eG/Vlp\rN86vjhpyI+ffKy+C60SJqxmKM3ydgN7oLscE7+2wLPN25XqN4W99OwGsp5dTdu/f\r5lPtFayXdJ55e/sNQKmGN+UGLrL05c2MWgjb8U/LFilnupUianceoeSERZmVjzKX\r-----END CERTIFICATE-----\r".replace(/\r/g,`\r
|
|
18
18
|
`),key:"-----BEGIN RSA PRIVATE KEY-----\rMIIEowIBAAKCAQEArBFJQRfFiJku/KwhV1Ssp7cX61vvuKmd4Rp6A9jB2QLgx8nj\r/+Xhp2hPRkISnOA8BuAxr4dMD9syGJwX4kNy9mbZ5Q0fWZCiEGBpVcU1J+k+N5K4\rSuZ2SqgxeN2IN2RLzt3GyQY4imcdHgNv7aHoXUrEwBx0MeYEw3IIDXtrYKCR2D8I\rvWBfwMUgWa24G8lpWILWA5hd9srRz9NxlAiHSjhbgT7B0xruEpHRCHSyKjvaIJVt\rWBR+amejYsAKVrD/hgrqjsA1123Y6++YqvU6vwg64xhS2kz5r3dkNKhvwbWgpZdI\rIaRvsiB77f4kLGo0vi8RFgJ1ZRjGg3RRK2w1LQIDAQABAoIBAQCEOmh78EOpnGZC\rYBjjHrvrysVD5gvLcfVUtl8Ls7gMB60re1eOIF+PoZZCHKZnDd6zPfiQtj1adg0C\rYnnsM/8VoaZS4gm0b3RLd3ubIQifWhuo40RissY2yxfxlPSH9LhZCY8ojnJG0cTL\resK579E8WCfopjUY33XLqEbN7Ylv39J+DSqInjqV3efJZUa+HqUJ98VxxzodcKMD\rP3bwUU4gHoSSp4pAsOFH5sQhaIWH1IcNjrAwpee2cJQuh4G157RRIuuUpagtaEG/\rXJIiAyBguJyu3JQFnIBQF01N5+omJgXYJ1L0m54543/iIRThmF3zDCDgCyUzmOk+\rH6As9fv1AoGBANOpOtOZLSAScjGsgJamT3ceJ2wCa86g2j8Oxu8lJUmUp5s3tA0v\rBFW5O3S4KR1EXwkLMBUMrfFM8YvzHWxsXBI6XV8azGLvyqPHxr65OhmpGYkGZMXu\rn9okgjkqlewnY2I073gvyK7ppX51UL5y9fF1vlsk+UlW+Rgx/vMHbdcjAoGBANAc\rxRUsxs4QJpbS4zD3JOkHjr24a97TrS3kCybAHUMpR2NrEHPZw9zex0/aphOJUHfL\rIMkOZdpfDqMfxWy4FAEmqBEMkO2SB+h0Wp4P+qp81ax4vGFiB0cD3wtixr11U1tt\rlZ/ZTdv4VDpDFNK1KaplhTDeyuCjeYfS3/GJia9vAoGAcOsAgjBevZR5rXx84WH6\rVO8WUu37u7FenXNxt9VWTinrPMh72uixZFY8nOk+rely1e1NCn3IMko9Ns9NbDFm\r8SaH95vhXArXTYbfxZIlp9jp0YtCqcHDL+p4Oq04bFMbFyJseu7rHj1x18QYfnHw\rOY/6LL/N6k1m+Hx7qgXVmIcCgYB/w0nTCBw84XlvWqSTqQaF8VfWbWP79mP5KmkW\rLxdH5g2noVEGbohqDnK6OXd/wusdwByukiJBf94Skyy25AOT+VFwthA7aU1ljhkb\rtJ+lDuJ28eBkwLPLCzthWBC+u0qjdJFJAzVjd/7tjcU43nNn4s90AzL12iaAFhvZ\rwyA+DQKBgGc/4cdyGJ3YkcA8150gQBawgJZ7q8V1JND87ggWA8wnK3cHn7rMZQl2\r3emDp9HEFXFex5dbGDDqZFAoesZCDxjknIn9oNfW4PvaWS8q7b6ZKLZG1p03Pu7/\rtYaD0kPbo0kysfFT/co+NgHbdykvIyboomfGdNLTUjYuy6lpwpvs\r-----END RSA PRIVATE KEY-----\r".replace(/\r/g,`\r
|
|
19
19
|
`)},VZ="certificate.pem",KZ="privateKey.pem",YZ="caCertificate.pem",WZ="natsCertificate.pem",zZ="natsCaCertificate.pem",Tt={DEFAULT:"default","DEFAULT-CA":"default-ca",SERVER:"server",CA:"ca","OPERATIONS-API":"operations-api","OPERATIONS-CA":"operations-ca"},jZ={tls_certificate:Tt.SERVER,tls_certificateAuthority:Tt.CA,customFunctions_tls_certificate:Tt.SERVER,customFunctions_tls_certificateAuthority:Tt.CA,operationsApi_tls_certificate:Tt["OPERATIONS-API"],operationsApi_tls_certificateAuthority:Tt["OPERATIONS-CA"]},JZ={[Tt.SERVER]:2,[Tt.DEFAULT]:1},QZ={[Tt["OPERATIONS-API"]]:3,[Tt.SERVER]:2,[Tt.DEFAULT]:1},XZ={[Tt["OPERATIONS-API"]]:3,[Tt.SERVER]:2,[Tt.DEFAULT]:1},ZZ={[Tt["OPERATIONS-CA"]]:3,[Tt.CA]:2,[Tt["DEFAULT-CA"]]:1},e8={[Tt["OPERATIONS-CA"]]:3,[Tt.CA]:2,[Tt["DEFAULT-CA"]]:1},t8={[Tt.CA]:2,[Tt["DEFAULT-CA"]]:1};Object.assign(NU,{CERTIFICATE_PEM_NAME:VZ,PRIVATEKEY_PEM_NAME:KZ,CA_PEM_NAME:YZ,CERT_NAME:Tt,CERT_CONFIG_NAME_MAP:jZ,CERT_PREFERENCE_APP:JZ,CERT_PREFERENCE_OPS:QZ,CERT_PREFERENCE_REP:XZ,CA_CERT_PREFERENCE_REP:ZZ,CA_CERT_PREFERENCE_OPS:e8,CA_CERT_PREFERENCE_APP:t8,CERTIFICATE_VALUES:$Z,NATS_CERTIFICATE_PEM_NAME:WZ,NATS_CA_PEM_NAME:zZ})});var Wy=I((ONe,LU)=>{"use strict";var PU=require("fs-extra"),Se=require("joi"),r8=require("os"),{boolean:He,string:At,number:tr,array:Qc}=Se.types(),{totalmem:wU}=require("os"),Jc=require("path"),n8=W(),Yy=ae(),bNe=Ky(),IU=(H(),P(G)),s8=it(),CU="log",i8="components",o8="Invalid logging.rotation.maxSize unit. Available units are G, M or K",a8="Invalid logging.rotation.interval unit. Available units are D, H or M (minutes)",c8="Invalid logging.rotation.maxSize value. Value should be a number followed by unit e.g. '10M'",l8="Invalid logging.rotation.interval value. Value should be a number followed by unit e.g. '10D'",u8="rootPath config parameter is undefined",Rn=Se.alternatives([tr.min(0),At]).optional().empty(null),EE=Se.alternatives([Qc.items(At,{host:At.required(),port:Rn},{hostname:At.required(),port:Rn}).empty(null),Qc.items(At)]),Ui,DU=!1;LU.exports={configValidator:d8,routesValidator:E8,route_constraints:EE};function d8(e,t=!1){if(DU=t,Ui=e.rootPath,Yy.isEmpty(Ui))throw u8;let r=He.optional(),n=tr.min(0).max(1e3).empty(null).default(m8),s=At.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").empty(null).default(T_),i=At.optional().empty(null),o=At.pattern(/^[^\s.,*>]+$/).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >"}).empty(null).required(),c=Se.string().empty(null).default(T_),l=Se.custom(_8).empty(null).default(T_),u=e.clustering?.enabled,f=Se.object({certificate:i,certificateAuthority:i,privateKey:i}),d;return u===!0?d=Se.object({enabled:r,hubServer:Se.object({cluster:Se.object({name:Se.required().empty(null),network:Se.object({port:Rn,routes:EE}).required()}).required(),leafNodes:Se.object({network:Se.object({port:Rn}).required()}).required(),network:Se.object({port:Rn}).required()}).required(),leafServer:Se.object({network:Se.object({port:Rn,routes:EE}).required(),streams:Se.object({maxAge:tr.min(120).allow(null).optional(),maxBytes:tr.min(1).allow(null).optional(),maxMsgs:tr.min(1).allow(null).optional(),path:c}).required()}).required(),logLevel:Se.valid("error","warn","info","debug","trace"),nodeName:o,republishMessages:He.optional(),databaseLevel:He.optional(),tls:Se.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:He.required(),verify:He.optional()}),user:At.optional().empty(null)}).optional():d=Se.object({enabled:r,tls:Se.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:He.optional()})}).optional(),Se.object({authentication:Se.alternatives(Se.object({authorizeLocal:He,cacheTTL:tr.required(),enableSessions:He,hashFunction:At.valid("md5","sha256","argon2id").optional().empty(null)}),He).optional(),analytics:Se.object({aggregatePeriod:tr}),replication:Se.object({hostname:Se.alternatives(At,tr).optional().empty(null),url:At.optional().empty(null),port:Rn,securePort:Rn,routes:Qc.optional().empty(null),databases:Se.alternatives(At,Qc),enableRootCAs:He.optional(),copyTablesToCatchUp:He.optional()}).optional(),componentsRoot:s.optional(),clustering:d,localStudio:Se.object({enabled:r}).required(),logging:Se.object({auditAuthEvents:Se.object({logFailed:He,logSuccessful:He}),file:He.required(),level:Se.valid("notify","fatal","error","warn","info","debug","trace"),rotation:Se.object({enabled:He.optional(),compress:He.optional(),interval:At.custom(h8).optional().empty(null),maxSize:At.custom(p8).optional().empty(null),path:At.optional().empty(null).default(T_)}).required(),root:s,stdStreams:He.required(),auditLog:He.required()}).required(),operationsApi:Se.object({network:Se.object({cors:He.optional(),corsAccessList:Qc.optional(),headersTimeout:tr.min(1).optional(),keepAliveTimeout:tr.min(1).optional(),port:Rn,domainSocket:Se.optional().empty("hdb/operations-server").default(T_),securePort:Rn,timeout:tr.min(1).optional()}).optional(),tls:Se.alternatives([Se.array().items(f),f])}).required(),rootPath:At.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").required(),mqtt:Se.object({network:Se.object({port:Rn,securePort:Rn,mtls:Se.alternatives([He.optional(),Se.object({user:At.optional(),certificateAuthority:i,required:He.optional()})])}).required(),webSocket:He.optional(),requireAuthentication:He.optional()}),http:Se.object({compressionThreshold:tr.optional(),cors:He.optional(),corsAccessList:Qc.optional(),headersTimeout:tr.min(1).optional(),port:Rn,securePort:Rn,maxHeaderSize:tr.optional(),mtls:Se.alternatives([He.optional(),Se.object({user:At.optional(),certificateAuthority:i,required:He.optional()})]),threadRange:Se.alternatives([Qc.optional(),At.optional()])}).required(),threads:Se.alternatives(n.optional(),Se.object({count:n.optional(),debug:Se.alternatives(He.optional(),Se.object({startingPort:tr.min(1).optional(),host:At.optional(),waitForDebugger:He.optional()})),maxHeapMemory:tr.min(0).optional()})),storage:Se.object({writeAsync:He.required(),overlappingSync:He.optional(),caching:He.optional(),compression:Se.alternatives([He.optional(),Se.object({dictionary:At.optional(),threshold:tr.optional()})]),compactOnStart:He.optional(),compactOnStartKeepBackup:He.optional(),noReadAhead:He.optional(),path:l,prefetchWrites:He.optional(),maxFreeSpaceToLoad:tr.optional(),maxFreeSpaceToRetain:tr.optional()}).required(),ignoreScripts:He.optional(),tls:Se.alternatives([Se.array().items(f),f])}).validate(e,{allowUnknown:!0,abortEarly:!1,errors:{wrap:{label:"'"}}})}a(d8,"configValidator");function f8(e){return DU||PU.existsSync(e)?null:`Specified path ${e} does not exist.`}a(f8,"doesPathExist");function _8(e,t){Se.assert(e,At.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path"));let r=f8(e);if(r)return t.message(r)}a(_8,"validatePath");function p8(e,t){let r=e.slice(-1);if(r!=="G"&&r!=="M"&&r!=="K")return t.message(o8);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(c8):e}a(p8,"validateRotationMaxSize");function h8(e,t){let r=e.slice(-1);if(r!=="D"&&r!=="H"&&r!=="M")return t.message(a8);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(l8):e}a(h8,"validateRotationInterval");function m8(e,t){let r=t.state.path.join("."),n=r8.cpus().length,s=n-1;s<=2&&(s=2);let i=process.constrainedMemory?.()||wU();return i=Math.round(Math.min(i,wU())/1e6),s=Math.max(Math.min(s,Math.round((i-750)/300)),1),n8.info(`Detected ${n} cores and ${i}MB on this machine, defaulting ${r} to ${s}`),s}a(m8,"setDefaultThreads");function T_(e,t){let r=t.state.path.join(".");if(!Yy.isEmpty(t.original)&&r!=="operationsApi.network.domainSocket")return t.original;if(Yy.isEmpty(Ui))throw new Error(`Error setting default root for: ${r}. HDB root is not defined`);switch(r){case"componentsRoot":return Jc.join(Ui,i8);case"logging.root":return Jc.join(Ui,CU);case"clustering.leafServer.streams.path":return Jc.join(Ui,"clustering","leaf");case"storage.path":let n=Jc.join(Ui,IU.LEGACY_DATABASES_DIR_NAME);return PU.existsSync(n)?n:Jc.join(Ui,IU.DATABASES_DIR_NAME);case"logging.rotation.path":return Jc.join(Ui,CU);case"operationsApi.network.domainSocket":return r==null?null:Jc.join(Ui,"operations-server");default:throw new Error(`Error setting default root for config parameter: ${r}. Unrecognized config parameter`)}}a(T_,"setDefaultRoot");function E8(e){let t=Se.object({routes:EE});return s8.validateBySchema({routes:e},t)}a(E8,"routesValidator")});var Rt=I($U=>{"use strict";var ys=(H(),P(G)),Sr=ae(),rr=W(),{configValidator:g8,routesValidator:MU}=Wy(),jr=require("fs-extra"),UU=require("yaml"),Wn=require("path"),S8=require("is-number"),xU=require("properties-reader"),T8=require("lodash"),{handleHDBError:A8}=pe(),{HTTP_STATUS_CODES:R8,HDB_ERROR_MSGS:Lu}=Bn(),{server:y8}=(Kr(),P(Ru)),{PACKAGE_ROOT:BU}=st(),{DATABASES_PARAM_CONFIG:A_,CONFIG_PARAMS:Yn,CONFIG_PARAM_MAP:ti}=ys,b8="Unable to get config value because config is uninitialized",O8="Config successfully initialized",N8="Error backing up config file",w8="Empty parameter sent to getConfigValue",HU=Wn.join(BU,"config","yaml",ys.HDB_DEFAULT_CONFIG_FILE),I8=Wn.join(BU,"config","yaml","defaultNatsConfig.yaml"),C8="Configuration successfully set. You must restart HarperDB for new config settings to take effect.",vU={logging_rotation_retain:"logging.rotation.retain",logging_rotation_rotate:"logging.rotation.rotate",logging_rotation_rotateinterval:"logging.rotation.rotateInterval",logging_rotation_rotatemodule:"logging.rotation.rotateModule",logging_rotation_timezone:"logging.rotation.timezone",logging_rotation_workerinterval:"logging.rotation.workerInterval"},gE,It,SE;Object.assign($U,{createConfigFile:P8,getDefaultConfig:D8,getConfigValue:FU,initConfig:TE,flattenConfig:Mu,updateConfigValue:GU,updateConfigObject:M8,getConfiguration:x8,setConfiguration:B8,readConfigFile:Qy,getClusteringRoutes:H8,initOldConfig:qU,getConfigFromFile:k8,getConfigFilePath:Xc,addConfig:F8,deleteConfigFromFile:G8,getConfigObj:q8,resolvePath:zy,getFlatConfigObj:$8});function zy(e){if(e?.startsWith("~/"))return Wn.join(Sr.getHomeDir(),e.slice(1));let t=ce();return Wn.resolve(t.getHdbBasePath(),e)}a(zy,"resolvePath");function P8(e,t=!1){let r=wa(HU);if(e.clustering_enabled||e.CLUSTERING_ENABLED||e.clustering){let c=UU.parseDocument(jr.readFileSync(I8,"utf8"),{simpleKeys:!0});r.addIn(["clustering"],c.toJSON().clustering)}gE=Mu(r.toJSON());let n;for(let c in e){let l=ti[c.toLowerCase()];if(l===Yn.DATABASES){Array.isArray(e[c])?n=e[c]:n=Object.keys(e[c]).map(u=>({[u]:e[c][u]}));continue}if(!l&&(c.endsWith("_package")||c.endsWith("_port"))&&(l=c),l!==void 0){let u=l.split("_"),f=jy(l,e[c]);l==="rootPath"&&f?.endsWith("/")&&(f=f.slice(0,-1));try{r.setIn([...u],f)}catch(d){rr.error(d)}}}n&&kU(r,n),Jy(r,t);let s=r.toJSON();It=Mu(s);let i=r.getIn(["rootPath"]),o=Wn.join(i,ys.HDB_CONFIG_FILE);if(jr.createFileSync(o),r.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${r.errors}`);jr.writeFileSync(o,String(r)),rr.trace(`Config file written to ${o}`)}a(P8,"createConfigFile");function kU(e,t){let r;try{try{r=JSON.parse(t)}catch(n){if(!Sr.isObject(t))throw n;r=t}for(let n of r){let s=Object.keys(n)[0];if(n[s].hasOwnProperty(A_.TABLES))for(let i in n[s][A_.TABLES])for(let o in n[s][A_.TABLES][i]){let c=n[s][A_.TABLES][i][o],l=[Yn.DATABASES,s,A_.TABLES,i,o];e.hasIn(l)?e.setIn(l,c):e.addIn(l,c)}else for(let i in n[s]){let o=n[s][i],c=[Yn.DATABASES,s,i];e.hasIn(c)?e.setIn(c,o):e.addIn(c,o)}}}catch(n){rr.error("Error parsing schemas CLI/env config arguments",n)}}a(kU,"setSchemasConfig");function D8(e){if(gE===void 0){let r=wa(HU);gE=Mu(r.toJSON())}let t=ti[e.toLowerCase()];if(t!==void 0)return gE[t.toLowerCase()]}a(D8,"getDefaultConfig");function FU(e){if(e==null){rr.info(w8);return}if(It===void 0){rr.trace(b8);return}let t=ti[e.toLowerCase()];if(t!==void 0)return It[t.toLowerCase()]}a(FU,"getConfigValue");function Xc(e=Sr.getPropsFilePath()){let t=Sr.getEnvCliRootPath();if(t)return zy(Wn.join(t,ys.HDB_CONFIG_FILE));let r=xU(e);return zy(r.get(ys.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY))}a(Xc,"getConfigFilePath");function TE(e=!1){if(It===void 0||e){let t;if(!Sr.noBootFile()){t=Sr.getPropsFilePath();try{jr.accessSync(t,jr.constants.F_OK|jr.constants.R_OK)}catch(i){throw rr.error(i),new Error(`HarperDB properties file at path ${t} does not exist`)}}let r=Xc(t),n;if(r.includes("config/settings.js"))try{qU(r);return}catch(i){if(i.code!==ys.NODE_ERROR_CODES.ENOENT)throw i}try{n=wa(r)}catch(i){if(i.code===ys.NODE_ERROR_CODES.ENOENT){rr.trace(`HarperDB config file not found at ${r}.
|
|
20
|
-
This can occur during early stages of install where the config file has not yet been created`);return}else throw rr.error(i),new Error(`Error reading HarperDB config file at ${r}`)}L8(n,r),Jy(n);let s=n.toJSON();if(y8.config=s,It=Mu(s),It.logging_rotation_rotate)for(let i in vU)It[i]&&rr.error(`Config ${vU[i]} has been deprecated. Please check https://docs.harperdb.io/docs/ for further details.`);rr.trace(O8)}}a(TE,"initConfig");function L8(e,t){let r=e.getIn(["rootPath"]),n=!1;if(e.hasIn(["storage","path"])||(e.setIn(["storage","path"],Wn.join(r,"database")),n=!0),e.hasIn(["logging","rotation","path"])||(e.setIn(["logging","rotation","path"],Wn.join(r,"log")),n=!0),e.hasIn(["authentication"])||(e.addIn(["authentication"],{cacheTTL:3e4,enableSessions:!0,operationTokenTimeout:e.getIn(["operationsApi","authentication","operationTokenTimeout"])??"1d",refreshTokenTimeout:e.getIn(["operationsApi","authentication","refreshTokenTimeout"])??"30d"}),n=!0),e.hasIn(["analytics"])||(e.addIn(["analytics"],{aggregatePeriod:60}),n=!0),n){if(rr.trace("Updating config file with missing config params"),e.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${e.errors}`);jr.writeFileSync(t,String(e))}}a(L8,"checkForUpdatedConfig");function Jy(e,t=!1){let r=e.toJSON();if(r.componentsRoot=r.componentsRoot??r?.customFunctions?.root,r?.http?.threads&&(r.threads=r?.http?.threads),r.http?.port&&r.http?.port===r.http?.securePort)throw Lu.CONFIG_VALIDATION("http.port and http.securePort cannot be the same value");if(r.operationsApi?.network?.port&&r.operationsApi?.network?.port===r.operationsApi?.network?.securePort)throw Lu.CONFIG_VALIDATION("operationsApi.network.port and operationsApi.network.securePort cannot be the same value");let n=g8(r,t);if(n.error)throw Lu.CONFIG_VALIDATION(n.error.message);typeof n.value.threads=="object"?e.setIn(["threads","count"],n.value.threads.count):e.setIn(["threads"],n.value.threads),e.setIn(["componentsRoot"],n.value.componentsRoot),e.setIn(["logging","root"],n.value.logging.root),e.setIn(["storage","path"],n.value.storage.path),e.setIn(["logging","rotation","path"],n.value.logging.rotation.path),e.setIn(["operationsApi","network","domainSocket"],n.value?.operationsApi?.network?.domainSocket),r?.clustering?.enabled&&e.setIn(["clustering","leafServer","streams","path"],n.value.clustering.leafServer.streams?.path)}a(Jy,"validateConfig");function M8(e,t){It===void 0&&(It={});let r=ti[e.toLowerCase()];if(r===void 0){rr.trace(`Unable to update config object because config param '${e}' does not exist`);return}It[r.toLowerCase()]=t}a(M8,"updateConfigObject");function GU(e,t,r=void 0,n=!1,s=!1,i=!1){It===void 0&&TE();let o=FU(ti.hdb_root),c=Wn.join(o,ys.HDB_CONFIG_FILE),l=wa(c),u;if(r&&It){let p=!1;for(let _ in r)if(r[_]!=It[_.toLowerCase()]){p=!0;break}if(!p){rr.trace("No changes detected in config parameters, skipping update");return}}if(r===void 0&&e.toLowerCase()===Yn.DATABASES)u=t;else if(r===void 0){let p;if(i)p=e;else if(p=ti[e.toLowerCase()],p===void 0)throw new Error(`Unable to update config, unrecognized config parameter: ${e}`);let _=p.split("_"),h=jy(p,t);l.setIn([..._],h)}else for(let p in r){let _=ti[p.toLowerCase()];if(_===Yn.HTTP_SECUREPORT&&r[p]===It[Yn.HTTP_PORT]?.toString()&&l.setIn(["http","port"],null),_===Yn.OPERATIONSAPI_NETWORK_SECUREPORT&&r[p]===It[Yn.OPERATIONSAPI_NETWORK_PORT.toLowerCase()]?.toString()&&l.setIn(["operationsApi","network","port"],null),_===Yn.DATABASES){u=r[p];continue}if(_?.startsWith("threads_")){let h=l.getIn(["threads"]);h>=0&&(l.deleteIn(["threads"]),l.setIn(["threads","count"],h))}if(!_&&(p.endsWith("_package")||p.endsWith("_port"))&&(_=p),_!==void 0){let h=_.split("_"),S=ys.LEGACY_CONFIG_PARAMS[p.toUpperCase()];S&&S.startsWith("customFunctions")&&l.hasIn(S.split("_"))&&(_=S,h=S.split("_"));let g=jy(_,r[p]);_==="rootPath"&&g?.endsWith("/")&&(g=g.slice(0,-1));try{h.length>1&&typeof l.getIn(h.slice(0,-1))=="boolean"&&l.deleteIn(h.slice(0,-1)),l.setIn([...h],g)}catch(R){rr.error(R)}}}u&&kU(l,u),Jy(l);let f=l.getIn(["rootPath"]),d=Wn.join(f,ys.HDB_CONFIG_FILE);if(n===!0&&v8(c,f),l.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${l.errors}`);jr.writeFileSync(d,String(l)),s&&(It=Mu(l.toJSON())),rr.trace(`Config parameter: ${e} updated with value: ${t}`)}a(GU,"updateConfigValue");function v8(e,t){try{let r=Wn.join(t,"backup",`${new Date(Date.now()).toISOString().replaceAll(":","-")}-${ys.HDB_CONFIG_FILE}.bak`);jr.copySync(e,r),rr.trace(`Config file: ${e} backed up to: ${r}`)}catch(r){rr.error(N8),rr.error(r)}}a(v8,"backupConfigFile");var U8=["databases"];function Mu(e){return e.http&&Object.assign(e.http,e?.customFunctions?.network),e?.operationsApi?.network&&(e.operationsApi.network={...e.http,...e.operationsApi.network}),e?.operationsApi&&(e.operationsApi.tls={...e.tls,...e.operationsApi.tls}),SE=e,r(e);function r(n){let s={};for(let i in n)if(n.hasOwnProperty(i)){if(typeof n[i]=="object"&&n[i]!==null&&!Array.isArray(n[i])&&!U8.includes(i)){let o=r(n[i]);for(let c in o){if(!o.hasOwnProperty(c))continue;c!=="package"&&(i=i.toLowerCase());let l=i+"_"+c;!Yn[l.toUpperCase()]&&ti[l]&&(s[ti[l].toLowerCase()]=o[c]),s[l]=o[c]}}n[i]!==void 0&&(s[i.toLowerCase()]=n[i])}return s}a(r,"squashObj")}a(Mu,"flattenConfig");function jy(e,t){if(e===Yn.CLUSTERING_NODENAME||e===Yn.CLUSTERING_USER){if(t==null)return t;if(!isNaN(t))return t.toString();if(typeof t=="string"&&t.toLowerCase()==="true"||typeof t=="string"&&t.toLowerCase()==="false")return t}else{if(S8(t))return parseFloat(t);if(t===!0||t===!1||Array.isArray(t)||Sr.isObject(t)||t===null)return t;if(typeof t=="string"&&t.toLowerCase()==="true")return!0;if(typeof t=="string"&&t.toLowerCase()==="false")return!1}if(t===void 0||t.toLowerCase()==="undefined")return null;if(typeof t=="string"&&(t.startsWith("{")&&t.endsWith("}")||t.startsWith("[")&&t.endsWith("]")))try{return JSON.parse(t)}catch{}return Sr.autoCast(t)}a(jy,"castConfigValue");function x8(){let e=Sr.getPropsFilePath(),t=Xc(e);return wa(t).toJSON()}a(x8,"getConfiguration");async function B8(e){let{operation:t,hdb_user:r,hdb_auth_header:n,...s}=e;try{return GU(void 0,void 0,s,!0),C8}catch(i){throw typeof i=="string"||i instanceof String?A8(i,i,R8.BAD_REQUEST,void 0,void 0,!0):i}}a(B8,"setConfiguration");function Qy(){let e=Sr.getPropsFilePath();try{jr.accessSync(e,jr.constants.F_OK|jr.constants.R_OK)}catch(n){if(!Sr.noBootFile())throw rr.error(n),new Error(`HarperDB properties file at path ${e} does not exist`)}let t=Xc(e);return wa(t).toJSON()}a(Qy,"readConfigFile");function wa(e){return UU.parseDocument(jr.readFileSync(e,"utf8"),{simpleKeys:!0})}a(wa,"parseYamlDoc");function H8(){let e=Qy(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=Sr.isEmptyOrZeroLength(t)?[]:t;let r=MU(t);if(r)throw Lu.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=Sr.isEmptyOrZeroLength(n)?[]:n;let s=MU(n);if(s)throw Lu.CONFIG_VALIDATION(s.message);if(!Sr.isEmptyOrZeroLength(n)&&!Sr.isEmptyOrZeroLength(t)){let i=t.filter(o=>n.some(c=>c.host===o.host&&c.port===o.port));if(!Sr.isEmptyOrZeroLength(i)){let o=`Duplicate hub and leaf routes found ${JSON.stringify(i)}`;throw Lu.CONFIG_VALIDATION(o)}}return{hub_routes:t,leaf_routes:n}}a(H8,"getClusteringRoutes");function qU(e){let t=xU(e);It={};for(let r in ti){let n=t.get(r.toUpperCase());if(Sr.isEmpty(n)||typeof n=="string"&&n.trim().length===0)continue;let s=ti[r].toLowerCase();s===Yn.LOGGING_ROOT?It[s]=Wn.dirname(n):It[s]=n}return It}a(qU,"initOldConfig");function k8(e){let t=Qy();return T8.get(t,e.replaceAll("_","."))}a(k8,"getConfigFromFile");async function F8(e,t){let r=wa(Xc());if(r.hasIn([e])?r.setIn([e],t):r.addIn([e],t),r.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${r.errors}`);await jr.writeFile(Xc(),String(r))}a(F8,"addConfig");function G8(e){let t=Xc(Sr.getPropsFilePath()),r=wa(t);r.deleteIn(e);let n=r.getIn(["rootPath"]),s=Wn.join(n,ys.HDB_CONFIG_FILE);jr.writeFileSync(s,String(r))}a(G8,"deleteConfigFromFile");function q8(){return SE||(TE(),SE)}a(q8,"getConfigObj");function $8(){return It||TE(),It}a($8,"getFlatConfigObj")});var yn=I((CNe,Nr)=>{"use strict";var YU="username is required",WU="nothing to update, must supply active, role or password to update",zU="password cannot be an empty string",jU="If role is specified, it cannot be empty.",JU="active must be true or false";Nr.exports.addUser=X8;Nr.exports.alterUser=Z8;Nr.exports.dropUser=t5;Nr.exports.getSuperUser=o5;Nr.exports.userInfo=r5;Nr.exports.listUsers=RE;Nr.exports.listUsersExternal=n5;Nr.exports.setUsersWithRolesCache=Zc;Nr.exports.findAndValidateUser=ob;Nr.exports.getClusterUser=a5;Nr.exports.getUsersWithRolesCache=i5;Nr.exports.USERNAME_REQUIRED=YU;Nr.exports.ALTERUSER_NOTHING_TO_UPDATE=WU;Nr.exports.EMPTY_PASSWORD=zU;Nr.exports.EMPTY_ROLE=jU;Nr.exports.ACTIVE_BOOLEAN=JU;var QU=bn(),V8=jc(),R_=(mE(),P(hE)),XU=yU(),y_=Wr(),rb=Ao(),xi=ae(),ZU=require("validate.js"),nb=W(),{promisify:K8}=require("util"),sb=go(),Zy=(H(),P(G)),VU=St(),Y8=Rt(),W8=ce(),z8=ho(),{hdb_errors:j8,ClientError:ri}=pe(),{HTTP_STATUS_CODES:To,AUTHENTICATION_ERROR_MSGS:Xy,HDB_ERROR_MSGS:vu}=j8,{UserEventMsg:ib}=ni(),eb=require("lodash"),{server:AE}=(Kr(),P(Ru)),J8=W();AE.getUser=(e,t)=>ob(e,t,t!=null);AE.authenticateUser=(e,t)=>ob(e,t);var e0={username:!0,active:!0,role:!0,password:!0},KU=new Map,Q8=K8(V8.delete),tb=W8.get(Zy.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??R_.HASH_FUNCTION.SHA256,Bi;async function X8(e){let t=ZU.cleanAttributes(e,e0),r=XU.addUserValidation(t);if(r)throw new ri(r.message);let n=await y_.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 ri(vu.ROLE_NAME_NOT_FOUND(t.role),To.NOT_FOUND);if(n.length>1)throw new ri(vu.DUP_ROLES_FOUND(t.role),To.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=sb.encrypt(t.password)),t.password=await R_.hash(t.password,tb),t.hash_function=tb,t.role=n[0].id;let s=await QU.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(nb.debug(s),await Zc(),s.skipped_hashes.length===1)throw new ri(vu.USER_ALREADY_EXISTS(t.username),To.CONFLICT);return rb.signalUserChange(new ib(process.pid)),`${t.username} successfully added`}a(X8,"addUser");async function Z8(e){let t=ZU.cleanAttributes(e,e0);if(xi.isEmptyOrZeroLength(t.username))throw new Error(YU);if(xi.isEmptyOrZeroLength(t.password)&&xi.isEmptyOrZeroLength(t.role)&&xi.isEmptyOrZeroLength(t.active))throw new Error(WU);if(!xi.isEmpty(t.password)&&xi.isEmptyOrZeroLength(t.password.trim()))throw new Error(zU);if(!xi.isEmpty(t.active)&&!xi.isBoolean(t.active))throw new Error(JU);if(!xi.isEmpty(t.password)&&!xi.isEmptyOrZeroLength(t.password.trim())&&(e5(t.username)&&(t.hash=sb.encrypt(t.password)),t.password=await R_.hash(t.password,tb)),t.role==="")throw new Error(jU);if(t.role){let n=await y_.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["*"]});if(!n||n.length===0)throw new ri(vu.ALTER_USER_ROLE_NOT_FOUND(t.role),To.NOT_FOUND);if(n.length>1)throw new ri(vu.DUP_ROLES_FOUND(t.role),To.CONFLICT);t.role=n[0].id}let r=await QU.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await Zc(),rb.signalUserChange(new ib(process.pid)),r}a(Z8,"alterUser");function e5(e){let t=!1,r=Bi.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}a(e5,"isClusterUser");async function t5(e){let t=XU.dropUserValidation(e);if(t)throw new ri(t.message);if(Bi.get(e.username)===void 0)throw new ri(vu.USER_NOT_EXIST(e.username),To.NOT_FOUND);let r=await Q8({table:"hdb_user",schema:"system",hash_values:[e.username]});return nb.debug(r),await Zc(),rb.signalUserChange(new ib(process.pid)),`${e.username} successfully deleted`}a(t5,"dropUser");async function r5(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=eb.cloneDeep(e.hdb_user);let r=await y_.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(r5,"userInfo");async function n5(){let e=await RE();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}a(n5,"listUsersExternal");async function RE(){let e=await y_.searchByValue({schema:"system",table:"hdb_role",search_value:"*",search_attribute:"role",get_attributes:["*"]}),t={};for(let s of e)t[s.id]=eb.cloneDeep(s);if(Object.keys(t).length===0)return null;let r=await y_.searchByValue({schema:"system",table:"hdb_user",search_value:"*",search_attribute:"username",get_attributes:["*"]}),n=new Map;for(let s of r)s=eb.cloneDeep(s),s.role=t[s.role],s5(s.role),n.set(s.username,s);return n}a(RE,"listUsers");function s5(e){if(!e){nb.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(z8)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}a(s5,"appendSystemTablesToRole");async function Zc(e=void 0){e?Bi=e:Bi=await RE()}a(Zc,"setUsersWithRolesCache");async function i5(){return Bi||await Zc(),Bi}a(i5,"getUsersWithRolesCache");async function ob(e,t,r=!0){Bi||await Zc();let n=Bi.get(e);if(!n){if(!r)return{username:e};throw new ri(Xy.GENERIC_AUTH_FAIL,To.UNAUTHORIZED)}if(n&&!n.active)throw new ri(Xy.USER_INACTIVE,To.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(KU.get(t)===n.password)return s;{let i=R_.validate(n.password,t,n.hash_function||R_.HASH_FUNCTION.MD5);if(i?.then&&(i=await i),i===!0)KU.set(t,n.password);else throw new ri(Xy.GENERIC_AUTH_FAIL,To.UNAUTHORIZED)}}return s}a(ob,"findAndValidateUser");async function o5(){Bi||await Zc();for(let[,e]of Bi)if(e.role.role==="super_user")return e}a(o5,"getSuperUser");async function a5(){let e=await RE(),t=Y8.getConfigFromFile(Zy.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==Zy.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=sb.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+VU.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+VU.SERVER_SUFFIX.ADMIN,r}a(a5,"getClusterUser");var t0=[];AE.invalidateUser=function(e){for(let t of t0)try{t(e)}catch(r){J8.error("Error invalidating user",r)}};AE.onInvalidatedUser=function(e){t0.push(e)}});var O_=I((MNe,i0)=>{"use strict";var el=W(),zn=(H(),P(G)),c5=gv(),DNe=Rs(),LNe=So(),l5=yn(),{validateEvent:r0}=ni(),b_=Kn(),u5=require("process"),{resetDatabases:d5}=(De(),P(nt)),f5={[zn.ITC_EVENT_TYPES.SCHEMA]:_5,[zn.ITC_EVENT_TYPES.USER]:s0};async function _5(e){let t=r0(e);if(t){el.error(t);return}el.trace("ITC schemaHandler received schema event:",e),await c5(e.message),await p5(e.message)}a(_5,"schemaHandler");async function p5(e){try{b_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),b_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),b_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=d5();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){el.error(t)}}a(p5,"syncSchemaMetadata");var n0=[];async function s0(e){try{try{b_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),b_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){el.warn(r)}let t=r0(e);if(t){el.error(t);return}el.trace(`ITC userHandler ${zn.HDB_ITC_CLIENT_PREFIX}${u5.pid} received user event:`,e),await l5.setUsersWithRolesCache();for(let r of n0)r()}catch(t){el.error(t)}}a(s0,"userHandler");s0.addListener=function(e){n0.push(e)};i0.exports=f5});var ni=I((kNe,a0)=>{"use strict";var UNe=W(),ab=ae(),h5=(H(),P(G)),{ITC_ERRORS:N_}=Bn(),{parentPort:xNe,threadId:m5,isMainThread:E5,workerData:BNe}=require("worker_threads"),{onMessageFromWorkers:g5,broadcast:HNe,broadcastWithAcknowledgement:S5}=rt();a0.exports={sendItcEvent:T5,validateEvent:o0,SchemaEventMsg:A5,UserEventMsg:R5};var yE;g5(async(e,t)=>{yE=yE||O_(),o0(e),yE[e.type]&&await yE[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function T5(e){return!E5&&e.message&&(e.message.originator=m5),S5(e)}a(T5,"sendItcEvent");function o0(e){if(typeof e!="object")return N_.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||ab.isEmpty(e.type))return N_.MISSING_TYPE;if(!e.hasOwnProperty("message")||ab.isEmpty(e.message))return N_.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||ab.isEmpty(e.message.originator))return N_.MISSING_ORIGIN;if(h5.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return N_.INVALID_EVENT(e.type)}a(o0,"validateEvent");function A5(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(A5,"SchemaEventMsg");function R5(e){this.originator=e}a(R5,"UserEventMsg")});var Ao=I((qNe,d0)=>{"use strict";var c0=(H(),P(G)),GNe=ae(),bE=W(),l0=hv(),Uu,{sendItcEvent:u0}=ni();function y5(e){try{bE.info("signalSchemaChange called with message:",e),Uu=Uu||O_();let t=new l0(c0.ITC_EVENT_TYPES.SCHEMA,e);return Uu.schema(t),u0(t)}catch(t){bE.error(t)}}a(y5,"signalSchemaChange");function b5(e){try{bE.trace("signalUserChange called with message:",e),Uu=Uu||O_();let t=new l0(c0.ITC_EVENT_TYPES.USER,e);return Uu.user(t),u0(t)}catch(t){bE.error(t)}}a(b5,"signalUserChange");d0.exports={signalSchemaChange:y5,signalUserChange:b5}});var OE=I((VNe,_0)=>{"use strict";var f0=ae(),O5=(H(),P(G)),N5=W(),w5=oE(),I5=iE(),C5=Ao(),{SchemaEventMsg:P5}=ni(),D5="already exists in";_0.exports=L5;async function L5(e,t,r){if(f0.isEmptyOrZeroLength(r))return r;let n=[];f0.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 M5(e,t.schema,t.name,i)})),s}a(L5,"lmdbCheckForNewAttributes");async function M5(e,t,r,n){let s=new I5(t,r,n,void 0,!0);e&&(s.hdb_auth_header=e);try{await v5(s)}catch(i){if(typeof i=="object"&&i.message!==void 0&&i.message.includes(D5))N5.warn(`attribute ${t}.${r}.${n} already exists`);else throw i}}a(M5,"createNewAttribute");async function v5(e){let t;return t=await w5(e),C5.signalSchemaChange(new P5(process.pid,O5.OPERATIONS_ENUM.CREATE_ATTRIBUTE,e.schema,e.table,e.attribute)),t}a(v5,"createAttribute")});var xu=I((YNe,p0)=>{"use strict";var cb=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}};p0.exports=cb});var m0=I((zNe,h0)=>{"use strict";var U5=xu(),x5=(H(),P(G)).OPERATIONS_ENUM,lb=class extends U5{static{a(this,"LMDBInsertTransactionObject")}constructor(t,r,n,s,i=void 0){super(x5.INSERT,r,n,s,i),this.records=t}};h0.exports=lb});var g0=I((JNe,E0)=>{"use strict";var B5=xu(),H5=(H(),P(G)).OPERATIONS_ENUM,ub=class extends B5{static{a(this,"LMDBUpdateTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(H5.UPDATE,n,s,i,o),this.records=t,this.original_records=r}};E0.exports=ub});var T0=I((XNe,S0)=>{"use strict";var k5=xu(),F5=(H(),P(G)).OPERATIONS_ENUM,db=class extends k5{static{a(this,"LMDBUpsertTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(F5.UPSERT,n,s,i,o),this.records=t,this.original_records=r}};S0.exports=db});var R0=I((ewe,A0)=>{"use strict";var G5=xu(),q5=(H(),P(G)).OPERATIONS_ENUM,fb=class extends G5{static{a(this,"LMDBDeleteTransactionObject")}constructor(t,r,n,s,i=void 0){super(q5.DELETE,n,s,t,i),this.original_records=r}};A0.exports=fb});var w_=I((nwe,N0)=>{"use strict";var rwe=require("path"),y0=ft(),$5=m0(),V5=g0(),K5=T0(),Y5=R0(),Bu=xt(),b0=ae(),{CONFIG_PARAMS:W5}=(H(),P(G)),O0=ce();O0.initSync();var NE=(H(),P(G)).OPERATIONS_ENUM,{getTransactionAuditStorePath:z5}=Et();N0.exports=j5;async function j5(e,t){if(O0.get(W5.LOGGING_AUDITLOG)===!1)return;let r=z5(e.schema,e.table),n=await y0.openEnvironment(r,e.table,!0),s=J5(e,t);if(!(s===void 0||s.hash_values.length===0)&&n!==void 0){y0.initializeDBIs(n,Bu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,Bu.TRANSACTIONS_DBIS);let i=s.timestamp;return await n.dbis[Bu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].ifNoExists(i,()=>{n.dbis[Bu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].put(i,s),b0.isEmpty(s.user_name)||n.dbis[Bu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].put(s.user_name,i);for(let o=0;o<s.hash_values.length;o++)n.dbis[Bu.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].put(s.hash_values[o],i)})}}a(j5,"writeTransaction");function J5(e,t){let r=b0.isEmpty(e.hdb_user)?void 0:e.hdb_user?.username;if(e.operation===NE.INSERT)return new $5(e.records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===NE.UPDATE)return new V5(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===NE.UPSERT)return new K5(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===NE.DELETE)return new Y5(t.deleted,t.original_records,r,t.txn_time,e.__origin)}a(J5,"createTransactionObject")});var _b=I((owe,w0)=>{"use strict";var Q5=u_(),iwe=xf(),I_=(H(),P(G)),X5=Bf(),Z5=$c().insertRecords,e9=ft(),t9=W(),r9=OE(),{getSchemaPath:n9}=Et(),s9=w_();w0.exports=i9;async function i9(e){try{let{schema_table:t,attributes:r}=Q5(e);X5(e,r,t.hash_attribute),e.schema!==I_.SYSTEM_SCHEMA_NAME&&(r.includes(I_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(I_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(I_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(I_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await r9(e.hdb_auth_header,t,r),s=n9(e.schema,e.table),i=await e9.openEnvironment(s,e.table),o=await Z5(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await s9(e,o)}catch(c){t9.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(i9,"lmdbCreateRecords")});var P0=I((cwe,C0)=>{"use strict";var I0=(H(),P(G)),o9=_b(),a9=xf(),c9=require("fs-extra"),{getSchemaPath:l9}=Et();C0.exports=u9;async function u9(e){let t=[{name:e.schema,createddate:Date.now()}],r=new a9(I0.SYSTEM_SCHEMA_NAME,I0.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,void 0,t);await o9(r),await c9.mkdirp(l9(e.schema))}a(u9,"lmdbCreateSchema")});var L0=I((uwe,D0)=>{"use strict";var pb=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}};D0.exports=pb});var x0=I((hwe,U0)=>{"use strict";var M0=ft(),hb=pn(),mb=Bn().LMDB_ERRORS_ENUM,d9=xt(),v0=W(),fwe=ae(),f9=require("lmdb"),_9=L0(),p9=(H(),P(G)),{OVERFLOW_MARKER:_we,MAX_SEARCH_KEY_LENGTH:pwe}=d9,h9=p9.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function m9(e,t,r,n){if(hb.validateEnv(e),t===void 0)throw new Error(mb.HASH_ATTRIBUTE_REQUIRED);if(!Array.isArray(r))throw r===void 0?new Error(mb.IDS_REQUIRED):new Error(mb.IDS_MUST_BE_ITERABLE);try{let s=M0.listDBIs(e);M0.initializeDBIs(e,t,s);let i=new _9,o,c=[],l=[];for(let p=0,_=r.length;p<_;p++)try{o=r[p];let h=e.dbis[t].get(o);if(!h||n&&h[h9]>n){i.skipped.push(o);continue}let S=e.dbis[t].ifVersion(o,f9.IF_EXISTS,()=>{e.dbis[t].remove(o);for(let g=0;g<s.length;g++){let R=s[g];if(!h.hasOwnProperty(R)||R===t)continue;let E=e.dbis[R],A=h[R];if(A!=null)try{let N=hb.getIndexedValues(A);if(N)for(let v=0,F=N.length;v<F;v++)E.remove(N[v],o)}catch{v0.warn(`cannot delete from attribute: ${R}, ${A}:${o}`)}}});c.push(S),l.push(o),i.original_records.push(h)}catch(h){v0.warn(h),i.skipped.push(o)}let u=[],f=await Promise.all(c);for(let p=0,_=f.length;p<_;p++)f[p]===!0?i.deleted.push(l[p]):(i.skipped.push(l[p]),u.push(p));let d=0;for(let p=0;p<u.length;p++){let _=u[p];i.original_records.splice(_-d,1),d++}return i.txn_time=hb.getNextMonotonicTime(),i}catch(s){throw s}}a(m9,"deleteRecords");U0.exports={deleteRecords:m9}});var C_=I((Ewe,H0)=>{"use strict";var Hu=ae(),E9=x0(),g9=ft(),{getSchemaPath:S9}=Et(),T9=w_(),A9=W();H0.exports=R9;async function R9(e,t=!0){let n=global.hdb_schema[e.schema][e.table].hash_attribute;if(Hu.isEmpty(n))throw new Error(`could not retrieve hash attribute for schema:${e.schema} and table ${e.table}`);try{if(Hu.isEmptyOrZeroLength(e.hash_values)&&!Hu.isEmptyOrZeroLength(e.records)){e.hash_values=[];for(let c=0;c<e.records.length;c++){let l=e.records[c][n];Hu.isEmpty(l)||e.hash_values.push(l)}}if(Hu.isEmptyOrZeroLength(e.hash_values))return B0([],[]);if(!Array.isArray(e.hash_values))throw new Error("hash_values must be an array");if(Hu.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=S9(e.schema,e.table),i=await g9.openEnvironment(s,e.table),o=await E9.deleteRecords(i,n,e.hash_values,e.__origin?.timestamp);try{t===!0&&await T9(e,o)}catch(c){A9.error(`unable to write transaction due to ${c.message}`)}return B0(o.deleted,o.skipped,o.txn_time)}catch(s){throw s}}a(R9,"lmdbDeleteRecords");function B0(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(B0,"createDeleteResponse")});var gb=I((Twe,k0)=>{"use strict";var y9=(H(),P(G)),Swe=pn();function Eb(e,t){let r=Object.create(null);if(t.length===1&&y9.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(Eb,"parseRow");function b9(e,t,r,n){let s=Eb(r,e);n.push(s)}a(b9,"searchAll");function O9(e,t,r,n){let s=Eb(r,e);n[t]=s}a(O9,"searchAllToMap");function N9(e,t,r){r[e]===void 0&&(r[e]=[]),r[e].push(t)}a(N9,"iterateDBI");function tl(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(tl,"pushResults");function w9(e,t,r,n,s,i){t.toString().endsWith(e)&&tl(t,r,n,s,i)}a(w9,"endsWith");function I9(e,t,r,n,s,i){t.toString().includes(e)&&tl(t,r,n,s,i)}a(I9,"contains");function C9(e,t,r,n,s,i){t>e&&tl(t,r,n,s,i)}a(C9,"greaterThanCompare");function P9(e,t,r,n,s,i){t>=e&&tl(t,r,n,s,i)}a(P9,"greaterThanEqualCompare");function D9(e,t,r,n,s,i){t<e&&tl(t,r,n,s,i)}a(D9,"lessThanCompare");function L9(e,t,r,n,s,i){t<=e&&tl(t,r,n,s,i)}a(L9,"lessThanEqualCompare");k0.exports={parseRow:Eb,searchAll:b9,searchAllToMap:O9,iterateDBI:N9,endsWith:w9,contains:I9,greaterThanCompare:C9,greaterThanEqualCompare:P9,lessThanCompare:D9,lessThanEqualCompare:L9,pushResults:tl}});var ku=I((Owe,Y0)=>{"use strict";var Ia=ft(),Rwe=W(),jn=pn(),wE=xt(),Wt=Bn().LMDB_ERRORS_ENUM,ywe=ae(),M9=(H(),P(G)),IE=gb(),{parseRow:v9}=IE,bwe=require("lmdb"),{OVERFLOW_MARKER:F0,MAX_SEARCH_KEY_LENGTH:U9}=wE;function G0(e,t,r,n=!1,s=void 0,i=void 0){return rl(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(G0,"iterateFullIndex");function P_(e,t,r,n,s,i=!1,o=void 0,c=void 0,l=!1,u=!1){return rl(e,t,r,(f,d,p,_)=>{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(A=>({value:A}))):d.getRange(E)})}a(P_,"iterateRangeBetween");function rl(e,t,r,n){let s=e.database||e,i=Ia.openDBI(s,r);i[wE.DBI_DEFINITION_NAME].is_hash_attribute?t=r:t&&Ia.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(rl,"setupTransaction");function q0(e,t,r,n){let s;return function(i,o){if(typeof i=="string"&&i.endsWith(F0)){if(!s)if(r)s=Ia.openDBI(e,r);else{let l=Ia.listDBIs(e);for(let u=0,f=l.length;u<f&&(s=Ia.openDBI(e,l[u]),!s[wE.DBI_DEFINITION_NAME].is_hash_attribute);u++);}i=s.get(o,{transaction:t,lazy:!0})[n]}return i}}a(q0,"getOverflowCheck");function x9(e,t,r,n=!1,s=void 0,i=void 0){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);return rl(e,t,t,(o,c,l)=>(CE(r),r=D_(l,r),c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}).map(u=>v9(u.value,r))))}a(x9,"searchAll");function B9(e,t,r,n=!1,s=void 0,i=void 0){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);CE(r),r=D_(e.database||e,r);let o=new Map;for(let{key:c,value:l}of G0(e,t,t,n,s,i))o.set(c,IE.parseRow(l,r));return o}a(B9,"searchAllToMap");function H9(e,t,r=!1,n=void 0,s=void 0){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.ATTRIBUTE_REQUIRED);let i=Object.create(null),o=G0(e,void 0,t,r,n,s),c=o.transaction,l=q0(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(H9,"iterateDBI");function k9(e,t){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);return Ia.statDBI(e,t).entryCount}a(k9,"countAll");function F9(e,t,r,n,s=!1,i=void 0,o=void 0){return Ca(e,r,n),rl(e,t,r,(c,l,u,f)=>(n=jn.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(F9,"equals");function G9(e,t,r){return Ca(e,t,r),Ia.openDBI(e,t).getValuesCount(r)}a(G9,"count");function q9(e,t,r,n,s=!1,i=void 0,o=void 0){return Ca(e,r,n),rl(e,null,r,(c,l)=>{n=jn.convertKeyValueToWrite(n);let u=!0;typeof n=="number"&&(u=!1);let f;if(s===!0){let d;for(let p of l.getKeys({transaction:c,start:n}))if(!p.startsWith(n)){d=p;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(p=>{let{key:_}=p;if(_!==d){if(_.toString().startsWith(n))return p;if(u===!0)return f.DONE}}),f.filter(p=>p)}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(q9,"startsWith");function $9(e,t,r,n,s=!1,i=void 0,o=void 0){return $0(e,t,r,n,s,i,o,!0)}a($9,"endsWith");function $0(e,t,r,n,s=!1,i=void 0,o=void 0,c=!1){return Ca(e,r,n),rl(e,null,r,(l,u,f,d)=>{let p=q0(f,l,d,r);return o=Number.isInteger(o)?o:0,u.getKeys({transaction:l,end:s?!1:void 0,reverse:s}).flatMap(_=>{let h=_.toString();return h.endsWith(F0)?u.getValues(_,{transaction:l}).map(S=>{let g=p(_,S);if(c?g.endsWith(n):g.includes(n))return{key:g,value:S}}).filter(S=>S):(c?h.endsWith(n):h.includes(n))?u[wE.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($0,"contains");function V9(e,t,r,n,s=!1,i=void 0,o=void 0){Ca(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),P_(e,t,r,n,l,s,i,o,!0,!1)}a(V9,"greaterThan");function K9(e,t,r,n,s=!1,i=void 0,o=void 0){Ca(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),P_(e,t,r,n,l,s,i,o,!1,!1)}a(K9,"greaterThanEqual");function Y9(e,t,r,n,s=!1,i=void 0,o=void 0){Ca(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),P_(e,t,r,l,n,s,i,o,!1,!0)}a(Y9,"lessThan");function W9(e,t,r,n,s=!1,i=void 0,o=void 0){Ca(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),P_(e,t,r,l,n,s,i,o,!1,!1)}a(W9,"lessThanEqual");function z9(e,t,r,n,s,i=!1,o=void 0,c=void 0){if(jn.validateEnv(e),r===void 0)throw new Error(Wt.ATTRIBUTE_REQUIRED);if(n===void 0)throw new Error(Wt.START_VALUE_REQUIRED);if(s===void 0)throw new Error(Wt.END_VALUE_REQUIRED);if(n=jn.convertKeyValueToWrite(n),s=jn.convertKeyValueToWrite(s),n>s)throw new Error(Wt.END_VALUE_MUST_BE_GREATER_THAN_START_VALUE);return P_(e,t,r,n,s,i,o,c)}a(z9,"between");function j9(e,t,r,n){jn.validateEnv(e);let s=e.database||e,i=e.database?e:null;if(t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);if(CE(r),r=D_(s,r),n===void 0)throw new Error(Wt.ID_REQUIRED);let o=null,c=s.dbis[t].get(n,{transaction:i,lazy:r.length<3});return c&&(o=IE.parseRow(c,r)),o}a(j9,"searchByHash");function J9(e,t,r){jn.validateEnv(e);let n=e.database||e,s=e.database?e:null;if(t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(Wt.ID_REQUIRED);let i=!0;return n.dbis[t].get(r,{transaction:s,lazy:!0})===void 0&&(i=!1),i}a(J9,"checkHashExists");function Q9(e,t,r,n,s=[]){return K0(e,t,r,n,s),V0(e,t,r,n,s).map(i=>i[1])}a(Q9,"batchSearchByHash");function X9(e,t,r,n,s=[]){K0(e,t,r,n,s);let i=new Map;for(let[o,c]of V0(e,t,r,n,s))i.set(o,c);return i}a(X9,"batchSearchByHashToMap");function V0(e,t,r,n,s=[]){return rl(e,t,t,(i,o,c)=>{r=D_(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,IE.parseRow(f,r)];s.push(u)}).filter(u=>u)})}a(V0,"batchHashSearch");function K0(e,t,r,n,s){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);if(CE(r),n==null)throw new Error(Wt.IDS_REQUIRED);if(!n[Symbol.iterator])throw new Error(Wt.IDS_MUST_BE_ITERABLE)}a(K0,"initializeBatchSearchByHash");function CE(e){if(!Array.isArray(e))throw e===void 0?new Error(Wt.FETCH_ATTRIBUTES_REQUIRED):new Error(Wt.FETCH_ATTRIBUTES_MUST_BE_ARRAY)}a(CE,"validateFetchAttributes");function Ca(e,t,r){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(Wt.SEARCH_VALUE_REQUIRED);if(r?.length>U9)throw new Error(Wt.SEARCH_VALUE_TOO_LARGE)}a(Ca,"validateComparisonFunctions");function D_(e,t){return t.length===1&&M9.SEARCH_WILDCARDS.indexOf(t[0])>=0&&(t=Ia.listDBIs(e)),t}a(D_,"setGetWholeRowAttributes");Y0.exports={searchAll:x9,searchAllToMap:B9,count:G9,countAll:k9,equals:F9,startsWith:q9,endsWith:$9,contains:$0,searchByHash:j9,setGetWholeRowAttributes:D_,batchSearchByHash:Q9,batchSearchByHashToMap:X9,checkHashExists:J9,iterateDBI:H9,greaterThan:V9,greaterThanEqual:K9,lessThan:Y9,lessThanEqual:W9,between:z9}});var Fu=I((wwe,Q0)=>{var W0=require("lodash"),z0=it(),ke=require("joi"),Z9=ae(),{hdb_schema_table:L_,checkValidTable:j0,hdb_table:J0,hdb_database:PE}=Li(),{handleHDBError:e7,hdb_errors:t7}=pe(),{getDatabases:r7}=(De(),P(nt)),{HTTP_STATUS_CODES:n7}=t7,s7=ke.object({database:PE,schema:PE,table:J0,search_attribute:L_,search_value:ke.any().required(),get_attributes:ke.array().min(1).items(ke.alternatives(L_,ke.object())).optional(),desc:ke.bool(),limit:ke.number().integer().min(1),offset:ke.number().integer().min(0)}),i7=ke.object({database:PE,schema:PE,table:J0,operator:ke.string().valid("and","or").default("and").lowercase(),offset:ke.number().integer().min(0),limit:ke.number().integer().min(1),get_attributes:ke.array().min(1).items(ke.alternatives(L_,ke.object())).optional(),sort:ke.object({attribute:ke.alternatives(L_,ke.array().min(1)),descending:ke.bool().optional()}).optional(),conditions:ke.array().min(1).items(ke.alternatives(ke.object({operator:ke.string().valid("and","or").default("and").lowercase(),conditions:ke.array()}),ke.object({search_attribute:ke.alternatives(L_,ke.array().min(1)),search_type:ke.string().valid("equals","contains","starts_with","ends_with","greater_than","greater_than_equal","less_than","less_than_equal","between","not_equal").optional(),search_value:ke.when("search_type",{switch:[{is:"equals",then:ke.any()},{is:"between",then:ke.array().items(ke.alternatives([ke.string(),ke.number()])).length(2)}],otherwise:ke.alternatives(ke.string(),ke.number())}).required()}))).required()});Q0.exports=function(e,t){let r=null;switch(t){case"value":r=z0.validateBySchema(e,s7);break;case"hashes":let i=function(o){s?s+=". "+o:s=o};var n=i;a(i,"addError");let s;i(j0("database",e.schema)),i(j0("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=z0.validateBySchema(e,i7);break;default:throw new Error(`Error validating search, unknown type: ${t}`)}if(!r&&e.schema!=="system"){let s=Z9.checkGlobalSchemaTable(e.schema,e.table);if(s)return e7(new Error,s,n7.NOT_FOUND);let o=r7()[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,p=f.conditions.length;d<p;d++){let _=f.conditions[d];_.conditions?l(_):c.push(_.search_attribute)}},"addConditions");t==="conditions"&&l(e);let u=W0.filter(c,f=>f!=="*"&&!f.startsWith?.("$")&&f.attribute!=="*"&&!Array.isArray(f)&&!f.name&&!W0.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 Sb=I((Cwe,X0)=>{"use strict";var o7=ft(),a7=Fu(),{getSchemaPath:c7}=Et();X0.exports=l7;function l7(e){let t=a7(e,"hashes");if(t)throw t;let r=c7(e.schema,e.table);return o7.openEnvironment(r,e.table)}a(l7,"initialize")});var Tb=I((Dwe,Z0)=>{"use strict";var u7=ku(),d7=Sb();Z0.exports=f7;async function f7(e){let t=await d7(e),r=t.useReadTransaction();r.database=t;let n=global.hdb_schema[e.schema][e.table];try{return u7.batchSearchByHashToMap(r,n.hash_attribute,e.get_attributes,e.hash_values)}finally{r.done()}}a(f7,"lmdbGetDataByHash")});var Gu=I((Mwe,ex)=>{"use strict";var Ab=class{static{a(this,"SearchByHashObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.hash_values=n,this.get_attributes=s}};ex.exports=Ab});var rx=I((xwe,tx)=>{"use strict";var Uwe=Gu(),_7=ku(),p7=Sb();tx.exports=h7;async function h7(e){let t=await p7(e),r=global.hdb_schema[e.schema][e.table];return _7.batchSearchByHash(t,r.hash_attribute,e.get_attributes,e.hash_values)}a(h7,"lmdbSearchByHash")});var si=I((Hwe,nx)=>{"use strict";var Rb=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}};nx.exports=Rb});var DE=I((Fwe,lx)=>{"use strict";var Jr=ku(),m7=ft(),E7=ae(),Fe=xt(),nl=(H(),P(G)),g7=ho(),sx=Bn().LMDB_ERRORS_ENUM,{getSchemaPath:S7}=Et(),Ro=nl.SEARCH_WILDCARDS;async function T7(e,t,r){let n;e.schema===nl.SYSTEM_SCHEMA_NAME?n=g7[e.table]:n=global.hdb_schema[e.schema][e.table];let s=cx(e,n.hash_attribute,r,t);return ox(e,s,n.hash_attribute,r)}a(T7,"prepSearch");async function ox(e,t,r,n){let s=S7(e.schema,e.table),i=await m7.openEnvironment(s,e.table),o=ax(i,e,t,r),c=o.transaction||i;if([Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH,Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP,Fe.SEARCH_TYPES.SEARCH_ALL,Fe.SEARCH_TYPES.SEARCH_ALL_TO_MAP].indexOf(t)>=0)return o;if(A7(e,r)===!1){let f=e.search_attribute;if(f===r)return n?ix(o,()=>!0):o.map(p=>({[r]:p.key}));let d=a(p=>({[r]:p.value,[f]:p.key}),"toObject");return n?ix(o,d):o.map(d)}let u=e.search_attribute===r?o.map(f=>f.key):o.map(f=>f.value);return n===!0?Jr.batchSearchByHashToMap(c,r,e.get_attributes,u):Jr.batchSearchByHash(c,r,e.get_attributes,u)}a(ox,"executeSearch");function ax(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 Fe.SEARCH_TYPES.EQUALS:s=Jr.equals(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.CONTAINS:s=Jr.contains(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.ENDS_WITH:case Fe.SEARCH_TYPES._ENDS_WITH:s=Jr.endsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.STARTS_WITH:case Fe.SEARCH_TYPES._STARTS_WITH:s=Jr.startsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:return Jr.batchSearchByHash(e,t.search_attribute,t.get_attributes,[t.search_value]);case Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:return Jr.batchSearchByHashToMap(e,t.search_attribute,t.get_attributes,[t.search_value]);case Fe.SEARCH_TYPES.SEARCH_ALL:return Jr.searchAll(e,n,t.get_attributes,o,c,l);case Fe.SEARCH_TYPES.SEARCH_ALL_TO_MAP:return Jr.searchAllToMap(e,n,t.get_attributes,o,c,l);case Fe.SEARCH_TYPES.BETWEEN:s=Jr.between(e,i,t.search_attribute,t.search_value,t.end_value,o,c,l);break;case Fe.SEARCH_TYPES.GREATER_THAN:case Fe.SEARCH_TYPES._GREATER_THAN:s=Jr.greaterThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.GREATER_THAN_EQUAL:case Fe.SEARCH_TYPES._GREATER_THAN_EQUAL:s=Jr.greaterThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.LESS_THAN:case Fe.SEARCH_TYPES._LESS_THAN:s=Jr.lessThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.LESS_THAN_EQUAL:case Fe.SEARCH_TYPES._LESS_THAN_EQUAL:s=Jr.lessThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;default:return Object.create(null)}return s}a(ax,"searchByType");function ix(e,t){let r=new Map;for(let n of e)r.set(n.value,t(n));return r}a(ix,"createMapFromIterable");function A7(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(A7,"checkToFetchMore");function cx(e,t,r,n){if(E7.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),Ro.indexOf(s)>-1)return r===!0?Fe.SEARCH_TYPES.SEARCH_ALL_TO_MAP:Fe.SEARCH_TYPES.SEARCH_ALL;if(s.indexOf(Ro[0])<0&&s.indexOf(Ro[1])<0)return c===!0?r===!0?Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:Fe.SEARCH_TYPES.EQUALS;if(Ro.indexOf(i)>=0&&Ro.indexOf(o)>=0)return e.search_value=e.search_value.slice(1,-1),Fe.SEARCH_TYPES.CONTAINS;if(Ro.indexOf(i)>=0)return e.search_value=e.search_value.substr(1),Fe.SEARCH_TYPES.ENDS_WITH;if(Ro.indexOf(o)>=0)return e.search_value=e.search_value.slice(0,-1),Fe.SEARCH_TYPES.STARTS_WITH;if(s.includes(Ro[0])||s.includes(Ro[1]))return Fe.SEARCH_TYPES.EQUALS;throw new Error(sx.UNKNOWN_SEARCH_TYPE)}else switch(n){case nl.VALUE_SEARCH_COMPARATORS.BETWEEN:return Fe.SEARCH_TYPES.BETWEEN;case nl.VALUE_SEARCH_COMPARATORS.GREATER:return Fe.SEARCH_TYPES.GREATER_THAN;case nl.VALUE_SEARCH_COMPARATORS.GREATER_OR_EQ:return Fe.SEARCH_TYPES.GREATER_THAN_EQUAL;case nl.VALUE_SEARCH_COMPARATORS.LESS:return Fe.SEARCH_TYPES.LESS_THAN;case nl.VALUE_SEARCH_COMPARATORS.LESS_OR_EQ:return Fe.SEARCH_TYPES.LESS_THAN_EQUAL;default:throw new Error(sx.UNKNOWN_SEARCH_TYPE)}}a(cx,"createSearchTypeFromSearchObject");lx.exports={executeSearch:ox,createSearchTypeFromSearchObject:cx,prepSearch:T7,searchByType:ax}});var dx=I(($we,ux)=>{"use strict";var qwe=si(),R7=Fu(),y7=ae(),b7=(H(),P(G)),O7=DE();ux.exports=N7;function N7(e,t){if(!y7.isEmpty(t)&&b7.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=R7(e,"value");if(n)throw n;return O7.prepSearch(e,t,!0)}a(N7,"lmdbGetDataByValue")});var M_=I((Ywe,fx)=>{"use strict";var Kwe=si(),w7=Fu(),I7=ae(),C7=(H(),P(G)),P7=DE();fx.exports=D7;async function D7(e,t){if(!I7.isEmpty(t)&&C7.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=w7(e,"value");if(n)throw n;return P7.prepSearch(e,t,!1)}a(D7,"lmdbSearchByValue")});var px=I((jwe,_x)=>{"use strict";var zwe=xt(),yb=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}},bb=class{static{a(this,"SearchCondition")}constructor(t,r,n){this.search_attribute=t,this.search_type=r,this.search_value=n}},Ob=class{static{a(this,"SortAttribute")}constructor(t,r){this.attribute=t,this.desc=r}};_x.exports={SearchByConditionsObject:yb,SearchCondition:bb,SortAttribute:Ob}});var Sx=I((Zwe,gx)=>{"use strict";var Qwe=px().SearchByConditionsObject,L7=si(),M7=Fu(),Nb=ku(),LE=xt(),{Resource:Xwe}=(ga(),P(SR)),Ex=DE(),v7=gb(),U7=require("lodash"),{getSchemaPath:x7}=Et(),hx=ft(),{handleHDBError:B7,hdb_errors:H7}=pe(),{HTTP_STATUS_CODES:k7}=H7,F7=1e8;gx.exports=G7;async function G7(e){let t=M7(e,"conditions");if(t)throw B7(t,t.message,k7.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=x7(e.schema,e.table),n=await hx.openEnvironment(r,e.table),s=global.hdb_schema[e.schema][e.table];for(let u of e.conditions)hx.openDBI(n,u.search_attribute);let i=U7.sortBy(e.conditions,u=>{if(u.estimated_count===void 0){let f=u.search_type;f===LE.SEARCH_TYPES.EQUALS?u.estimated_count=Nb.count(n,u.search_attribute,u.search_value):f===LE.SEARCH_TYPES.CONTAINS||f===LE.SEARCH_TYPES.ENDS_WITH?u.estimated_count=1/0:u.estimated_count=F7}return u.estimated_count}),o=n.useReadTransaction();o.database=n;let c=await mx(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(Ex.filterByType),d=f.length,p=Nb.setGetWholeRowAttributes(n,e.get_attributes);l=c.map(_=>u.get(_,{transaction:o,lazy:!0})),d>0&&(l=l.filter(_=>{for(let h=0;h<d;h++)if(!f[h](_))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(_=>v7.parseRow(_,p))}else{for(let d=1;d<i.length;d++){let p=i[d],_=await mx(o,e,p,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=Nb.batchSearchByHash(o,s.hash_attribute,e.get_attributes,c)}return l.onDone=()=>{o.done()},l}a(G7,"lmdbSearchByConditions");async function mx(e,t,r,n){let s=new L7(t.schema,t.table,void 0,void 0,n,t.get_attributes),i=r.search_type;return s.search_attribute=r.search_attribute,i===LE.SEARCH_TYPES.BETWEEN?(s.search_value=r.search_value[0],s.end_value=r.search_value[1]):s.search_value=r.search_value,Ex.searchByType(e,s,i,n).map(o=>o.value)}a(mx,"executeConditionSearch")});var v_=I((tIe,Tx)=>{"use strict";var q7=(H(),P(G)).OPERATIONS_ENUM,wb=class{static{a(this,"DeleteObject")}constructor(t,r,n,s=void 0){this.operation=q7.DELETE,this.schema=t,this.table=r,this.hash_values=n,this.__origin=s}};Tx.exports=wb});var Ib=I((nIe,Ix)=>{"use strict";var bx=si(),Ox=v_(),Nx=M_(),wx=C_(),On=(H(),P(G)),Ax=ae(),Rx=ft(),{getTransactionAuditStorePath:$7,getSchemaPath:V7}=Et(),yx=W();Ix.exports=K7;async function K7(e){try{if(Ax.isEmpty(global.hdb_schema[e.schema])||Ax.isEmpty(global.hdb_schema[e.schema][e.table]))throw new Error(`unknown schema:${e.schema} and table ${e.table}`);await Y7(e),await W7(e);let t=V7(e.schema,e.table);try{await Rx.deleteEnvironment(t,e.table)}catch(r){if(r.message==="invalid environment")yx.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}try{let r=$7(e.schema,e.table);await Rx.deleteEnvironment(r,e.table,!0)}catch(r){if(r.message==="invalid environment")yx.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}}catch(t){throw t}}a(K7,"lmdbDropTable");async function Y7(e){let t=new bx(On.SYSTEM_SCHEMA_NAME,On.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r=Array.from(await Nx(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 Ox(On.SYSTEM_SCHEMA_NAME,On.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,n);await wx(s)}a(Y7,"deleteAttributesFromSystem");async function W7(e){let t=new bx(On.SYSTEM_SCHEMA_NAME,On.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,e.table,void 0,[On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r,n;try{r=Array.from(await Nx(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 Ox(On.SYSTEM_SCHEMA_NAME,On.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,[n.id]);try{await wx(s)}catch(i){throw i}}a(W7,"dropTableFromSystem")});var Px=I((iIe,Cx)=>{"use strict";var z7=require("fs-extra"),j7=si(),J7=Gu(),Q7=v_(),X7=Ib(),Z7=C_(),eee=Tb(),tee=M_(),yo=(H(),P(G)),{getSchemaPath:ree}=Et(),{handleHDBError:nee,hdb_errors:see}=pe(),{HDB_ERROR_MSGS:iee,HTTP_STATUS_CODES:oee}=see;Cx.exports=aee;async function aee(e){let t;try{t=await cee(e.schema);let r=new j7(yo.SYSTEM_SCHEMA_NAME,yo.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,yo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,t,void 0,[yo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),n=Array.from(await tee(r));for(let o=0;o<n.length;o++){let c={schema:t,table:n[o].name};try{await X7(c)}catch(l){if(l.message!=="invalid environment")throw l}}let s=new Q7(yo.SYSTEM_SCHEMA_NAME,yo.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[t]);await Z7(s);let i=ree(t);await z7.remove(i)}catch(r){throw r}}a(aee,"lmdbDropSchema");async function cee(e){let t=new J7(yo.SYSTEM_SCHEMA_NAME,yo.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[e],[yo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),r,n;try{r=Array.from(await eee(t))}catch(s){throw s}for(let[,s]of r)s.name===e&&(n=e);if(!n)throw nee(new Error,iee.SCHEMA_NOT_FOUND(e),oee.NOT_FOUND,void 0,void 0,!0);return n}a(cee,"validateDropSchema")});var U_=I((aIe,Dx)=>{"use strict";var Cb=class{static{a(this,"CreateTableObject")}constructor(t,r,n){this.schema=t,this.table=r,this.hash_attribute=n}};Dx.exports=Cb});var Db=I((uIe,Lx)=>{"use strict";var lee=require("fs-extra"),ME=ft(),{getTransactionAuditStorePath:uee}=Et(),Pb=xt(),lIe=U_();Lx.exports=dee;async function dee(e){let t;try{let r=uee(e.schema,e.table);await lee.mkdirp(r),t=await ME.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{ME.createDBI(t,Pb.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,!1,!0),ME.createDBI(t,Pb.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,!0,!1),ME.createDBI(t,Pb.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(dee,"createTransactionsAuditEnvironment")});var Ux=I((_Ie,vx)=>{"use strict";var Lb=(H(),P(G)),Mx=ft(),fee=$c(),{getSystemSchemaPath:_ee,getSchemaPath:pee}=Et(),fIe=ho(),hee=oE(),Mb=iE(),mee=W(),Eee=Db();vx.exports=gee;async function gee(e,t){let r=pee(t.schema,t.table),n=new Mb(t.schema,t.table,Lb.TIME_STAMP_NAMES_ENUM.CREATED_TIME,void 0,!0),s=new Mb(t.schema,t.table,Lb.TIME_STAMP_NAMES_ENUM.UPDATED_TIME,void 0,!0),i=new Mb(t.schema,t.table,t.hash_attribute,void 0,!1,!0);try{if(await Mx.createEnvironment(r,t.table),e!==void 0){let o=await Mx.openEnvironment(_ee(),Lb.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME);await fee.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 vb(n),await vb(s),await vb(i)}await Eee(t)}catch(o){throw o}}a(gee,"lmdbCreateTable");async function vb(e){try{await hee(e)}catch(t){mee.warn(`failed to create attribute ${e.attribute} due to ${t.message}`)}}a(vb,"createAttribute")});var Bx=I((hIe,xx)=>{"use strict";var See=u_(),Tee=Bf(),Aee=OE(),x_=(H(),P(G)),Ree=$c().updateRecords,yee=ft(),{getSchemaPath:bee}=Et(),Oee=w_(),Nee=W();xx.exports=wee;async function wee(e){try{let{schema_table:t,attributes:r}=See(e);Tee(e,r,t.hash_attribute),e.schema!==x_.SYSTEM_SCHEMA_NAME&&(r.includes(x_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(x_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(x_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(x_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await Aee(e.hdb_auth_header,t,r),s=bee(e.schema,e.table),i=await yee.openEnvironment(s,e.table),o=await Ree(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await Oee(e,o)}catch(c){Nee.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(wee,"lmdbUpdateRecords")});var kx=I((EIe,Hx)=>{"use strict";var Iee=(H(),P(G)).OPERATIONS_ENUM,Ub=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Iee.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};Hx.exports=Ub});var Gx=I((TIe,Fx)=>{"use strict";var SIe=kx(),Cee=u_(),Pee=Bf(),Dee=OE(),B_=(H(),P(G)),Lee=$c().upsertRecords,Mee=ft(),{getSchemaPath:vee}=Et(),Uee=w_(),xee=W(),{handleHDBError:Bee,hdb_errors:Hee}=pe();Fx.exports=kee;async function kee(e){let t;try{t=Cee(e)}catch(l){throw Bee(l,l.message,Hee.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}let{schema_table:r,attributes:n}=t;Pee(e,n,r.hash_attribute),e.schema!==B_.SYSTEM_SCHEMA_NAME&&(n.includes(B_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||n.push(B_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),n.includes(B_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||n.push(B_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let s=await Dee(e.hdb_auth_header,r,n),i=vee(e.schema,e.table),o=await Mee.openEnvironment(i,e.table),c=await Lee(o,r.hash_attribute,n,e.records,e.__origin?.timestamp);try{await Uee(e,c)}catch(l){xee.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(kee,"lmdbUpsertRecords")});var $x=I((RIe,qx)=>{"use strict";var xb=class{static{a(this,"DeleteBeforeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.timestamp=n}};qx.exports=xb});var Kx=I((bIe,Vx)=>{"use strict";var Bb=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}};Vx.exports=Bb});var zx=I((wIe,Wx)=>{"use strict";var Hb=ft(),{getTransactionAuditStorePath:Fee}=Et(),NIe=$x(),H_=xt(),Gee=ae(),Yx=Kx(),qee=require("util").promisify,$ee=qee(setTimeout),Vee=1e4,Kee=100;Wx.exports=Yee;async function Yee(e){let t=Fee(e.schema,e.table),r=await Hb.openEnvironment(t,e.table,!0),n=Hb.listDBIs(r);Hb.initializeDBIs(r,H_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s,i=new Yx;do s=await Wee(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 $ee(Kee);while(s.transactions_deleted>0);return i}a(Yee,"deleteAuditLogsBefore");async function Wee(e,t){let r=new Yx;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];Gee.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>Vee)break}return await s,r}catch(n){throw n}}a(Wee,"deleteTransactions")});var Jx=I((CIe,jx)=>{"use strict";var kb=class{static{a(this,"DropAttributeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.attribute=n}};jx.exports=kb});var Xx=I((LIe,Qx)=>{"use strict";var zee=si(),jee=v_(),DIe=Jx(),Hi=(H(),P(G)),Jee=ae(),Fb=ft(),Qee=ho(),Xee=M_(),Zee=C_(),{getSchemaPath:ete}=Et();Qx.exports=tte;async function tte(e,t=!0){let r;e.schema===Hi.SYSTEM_SCHEMA_NAME?r=Qee[e.table]:r=global.hdb_schema[e.schema][e.table];let n=await nte(e),s=ete(e.schema,e.table),i=await Fb.openEnvironment(s,e.table);return t===!0&&await rte(e,i,r.hash_attribute),Fb.dropDBI(i,e.attribute),n}a(tte,"lmdbDropAttribute");async function rte(e,t,r){let n=Fb.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(rte,"removeAttributeFromAllObjects");async function nte(e){let t=new zee(Hi.SYSTEM_SCHEMA_NAME,Hi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,Hi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[Hi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY,Hi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]),n=Array.from(await Xee(t)).filter(o=>o[Hi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]===e.attribute);if(Jee.isEmptyOrZeroLength(n))throw new Error(`Attribute '${e.attribute}' was not found in '${e.schema}.${e.table}'`);let s=n.map(o=>o[Hi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),i=new jee(Hi.SYSTEM_SCHEMA_NAME,Hi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,s);return Zee(i)}a(nte,"dropAttributeFromSystem")});var sB=I((UIe,nB)=>{"use strict";var Gb=ft(),qu=xt(),vIe=pn(),qb=(H(),P(G)),Zx=ae(),{getTransactionAuditStorePath:ste}=Et(),ite=ku(),vE=xu(),ote=W();nB.exports=ate;async function ate(e){let t=ste(e.schema,e.table),r=await Gb.openEnvironment(t,e.table,!0),n=Gb.listDBIs(r);Gb.initializeDBIs(r,qu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s;switch(e.search_type){case qb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.TIMESTAMP:return eB(r,e.search_values);case qb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:return s=global.hdb_schema[e.schema][e.table].hash_attribute,lte(r,e.search_values,s);case qb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME:return cte(r,e.search_values);default:return eB(r)}}a(ate,"readAuditLog");function eB(e,t=[0,Date.now()]){Zx.isEmpty(t[0])&&(t[0]=0),Zx.isEmpty(t[1])&&(t[1]=Date.now());let r=e.dbis[qu.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 vE,s))}a(eB,"searchTransactionsByTimestamp");function cte(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[qu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].getValues(s))i.push(o);r.set(s,rB(e,i))}return Object.fromEntries(r)}a(cte,"searchTransactionsByUsername");function lte(e,t,r){let n=new Map;for(let c=0,l=t.length;c<l;c++){let u=t[c],f=ite.equals(e,qu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,qu.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,u);for(let{value:d}of f){let p=Number(d);n.has(p)?n.get(p).push(u.toString()):n.set(p,[u.toString()])}}let s=Array.from(n.keys()),i=rB(e,s),o=new Map;for(let c=0;c<i.length;c++){let l=i[c],u=l.timestamp,f=n.get(u);tB(l,"records",r,f,o),tB(l,"original_records",r,f,o)}return Object.fromEntries(o)}a(lte,"searchTransactionsByHashValues");function tB(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 vE(e.operation,e.user_name,i,void 0);d[t]=[c],u.push(d)}}else{let u=new vE(e.operation,e.user_name,i,void 0);u[t]=[c],s.set(l,[u])}}}a(tB,"loopRecords");function rB(e,t){let r=[];try{let n=e.dbis[qu.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 vE,i);r.push(o)}}catch(i){ote.warn(i)}return r}catch(n){throw n}}a(rB,"batchSearchTransactions")});var oB=I((kIe,iB)=>{"use strict";var{getSchemaPath:BIe}=Et(),HIe=ft(),{database:ute}=(De(),P(nt));iB.exports={writeTransaction:dte};async function dte(e,t,r){return ute({database:e,table:t}).transaction(r)}a(dte,"writeTransaction")});var uB=I((GIe,lB)=>{"use strict";var{getSchemaPath:aB}=Et(),cB=ft();lB.exports={flush:fte,resetReadTxn:_te};async function fte(e,t){return(await cB.openEnvironment(aB(e,t),t.toString())).flushed}a(fte,"flush");async function _te(e,t){try{(await cB.openEnvironment(aB(e,t),t.toString())).resetReadTxn()}catch{}}a(_te,"resetReadTxn")});var pB=I(($Ie,_B)=>{"use strict";var{Readable:pte}=require("stream"),{getDatabases:hte}=(De(),P(nt)),{readSync:mte,openSync:Ete,createReadStream:dB}=require("fs"),{open:gte}=require("lmdb"),fB=i_(),Ste=o_(),{AUDIT_STORE_OPTIONS:Tte}=(_o(),P(hB)),{INTERNAL_DBIS_NAME:Ate,AUDIT_STORE_NAME:Rte}=xt();_B.exports=bte;var $b=32768,yte=100;async function bte(e){let t=e.database||e.schema||"data",r=hte()[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=gte({noSync:!0,maxDbs:Ste.MAX_DBS}),p,_=d.openDB(Ate,new fB(!1)),h=f.useReadTransaction(),S=0,g=a(async function(E,A){A.encoding="binary",A.encoder=void 0;let N=d.openDB(E,A),v=f.openDB(E,A);for(let{key:F,version:$,value:Y}of v.getRange({start:null,transaction:h,versions:v.useVersions}))p=N.put(F,Y,$),S++%yte===0&&(await new Promise(ee=>setTimeout(ee,20)),h.openTimer&&(h.openTimer=0))},"copyDatabase");for(let{key:E,value:A}of f.getRange({transaction:h,start:!1}))if(s.some(N=>E.startsWith?.(N+"/"))){_.put(E,A);let[,N]=E.split("/"),v=!N,F=new fB(!v,v);await g(E,F)}e.include_audit&&await g(Rte,{...Tte}),await p;let R=dB(d.path);return R.headers=l(),R.on("close",()=>{h.done(),d.close()}),R}let o=r[Object.keys(r)[0]].primaryStore,c=Ete(o.path);return o.transaction(()=>{let u=Buffer.alloc($b);mte(c,u,0,$b),o.resetReadTxn();let f=o.useReadTransaction();f.renew();let d=dB(null,{fd:c,start:$b}),p=new pte.from(async function*(){yield u;for await(let _ of d)f.openTimer&&(f.openTimer=0),yield _;f.done()}());return p.headers=l(),p});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(bte,"getBackup")});var gB=I((KIe,EB)=>{"use strict";var Ote=W(),{handleHDBError:Nte}=pe(),wte=CM(),Ite=oE(),Cte=_b(),Pte=P0(),Dte=C_(),Lte=Tb(),Mte=rx(),vte=dx(),Ute=M_(),xte=Sx(),Bte=Px(),Hte=Ux(),kte=Bx(),Fte=Gx(),Gte=zx(),qte=Ib(),$te=Xx(),Vte=sB(),Kte=oB(),mB=uB(),Yte=pB(),Vb=class extends wte{static{a(this,"LMDBBridge")}async searchByConditions(t){return xte(t)}async getDataByHash(t){return await Lte(t)}async searchByHash(t){return await Mte(t)}async getDataByValue(t,r){return await vte(t,r)}async searchByValue(t){return await Ute(t)}async createSchema(t){return await Pte(t)}async dropSchema(t){return await Bte(t)}async createTable(t,r){return await Hte(t,r)}async dropTable(t){return await qte(t)}async createAttribute(t){return await Ite(t)}async createRecords(t){return await Cte(t)}async updateRecords(t){return await kte(t)}async upsertRecords(t){try{return await Fte(t)}catch(r){throw Nte(r,null,null,Ote.ERR,r)}}async deleteRecords(t){return await Dte(t)}async dropAttribute(t){return await $te(t)}async deleteAuditLogsBefore(t){return await Gte(t)}async readAuditLog(t){return await Vte(t)}writeTransaction(t,r,n){return Kte.writeTransaction(t,r,n)}flush(t,r){return mB.flush(t,r)}resetReadTxn(t,r){return mB.resetReadTxn(t,r)}getBackup(t){return Yte(t)}};EB.exports=Vb});var Yb={};Ue(Yb,{add:()=>UE,applyReverse:()=>SB,getRecordAtTime:()=>Kb,rebuildUpdateBefore:()=>xE});function UE(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 xE(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,UE(n,s,i)}else r&&(n||(n={}),n[s]=i)}else n||(n={}),n[s]=e[s];return n}function SB(e,t){for(let r in t){let n=t[r];if(n?.__op__){let s=Wte[n.__op__]?.reverse;if(s)s(e,r,{value:n.value});else throw new Error(`Unsupported operation ${n.__op__}`)}else e[r]=TB}}function Kb(e,t,r){let n=r.rootStore.auditStore,s={...e.value},i=e.localTime;for(;i>t;){let l=n.get(i),u=wt(l);switch(u.type){case"put":s=u.getValue(r);break;case"patch":SB(s,u.getValue(r));break;case"delete":s=null}i=u.previousLocalTime}let o={},c=0;for(let l in s)s[l]===TB&&(o[l]=!0,c++);for(;c>0&&i>0;){let l=n.get(i),u=wt(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 Wte,TB,BE=be(()=>{_o();a(UE,"add");UE.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)};Wte={add:UE};a(xE,"rebuildUpdateBefore");a(SB,"applyReverse");TB={};a(Kb,"getRecordAtTime")});function Nn(e){let t=e.getChanges();return t||(t=Object.create(null),e._setChanges(t)),t}function GE(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 Jn.ClientError(`${l} must be a string, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"ID":u=a(function(d){if(!(typeof d=="string"||d?.length>0&&d.every?.(p=>typeof p=="string")||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be a string, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Float":case"Number":u=a(function(d){let p=d?.__op__?d.value:d;if(!(typeof p=="number"||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be a number, attempt to assign ${p}`);Nn(this)[l]=d},"set");break;case"Int":u=a(function(d){let p=d?.__op__?d.value:d;if(!(p>>0===p||d==null&&c.nullable!==!1))if(typeof p=="number"&&Math.abs((p>>0)-p)<=1)p=Math.round(p),d?.__op__?d.value=p:d=p;else throw new Jn.ClientError(`${l} must be an integer between -2147483648 and 2147483647, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Long":u=a(function(d){let p=d?.__op__?d.value:d;if(!(Math.round(p)===d&&Math.abs(p)<=9007199254740992||d==null&&c.nullable!==!1))if(typeof p=="number"&&Math.abs(p)<=9007199254740992)p=Math.round(p),d?.__op__?d.value=p:d=p;else throw new Jn.ClientError(`${l} must be an integer between -9007199254740992 and 9007199254740992, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"BigInt":u=a(function(d){let p=d?.__op__?d.value:d;if(!(typeof p=="bigint"||d==null&&c.nullable!==!1))if(typeof p=="string"||typeof p=="number")p=BigInt(p),d?.__op__?d.value=p:d=p;else throw new Jn.ClientError(`${l} must be a number, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Boolean":u=a(function(d){if(!(typeof d=="boolean"||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be a boolean, attempt to assign ${d}`);Nn(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 Jn.ClientError(`${l} must be a Date, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Bytes":u=a(function(d){if(!(d instanceof Uint8Array||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be a Buffer or Uint8Array, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Blob":u=a(function(d){if(!(d instanceof Ii||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be a Blob, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Any":case void 0:u=a(function(d){Nn(this)[l]=d},"set");break;default:u=a(function(d){if(!(typeof d=="object"||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be an object, attempt to assign ${d}`);Nn(this)[l]=d},"set")}f={get(){let d=this.getChanges?.();if(d&&l in d){let _=d[l];if(_?.__op__){let h=this.getRecord()?.[l];return _.update(h)}return _}let p=this.getRecord()?.[l];if(p&&typeof p=="object"){let _=Wb(p,c);if(_)return d||this._setChanges(d=Object.create(null)),d[l]=_}return p},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 Jn.ClientError("Can not add a property to a sealed table schema");Nn(this)[c]=l}),i("deleteProperty",function(c){Nn(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 p=l[f];d=d.update(p)}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,RB);break}o=c}while(o&&o!==RB)}function Wb(e,t){let r;switch(e.constructor){case Object:return t?(r=t.TrackedObject,r||(t.TrackedObject=r=class extends k_{static{a(this,"TrackedObject")}},GE(r,t)),new r(e)):new k_(e);case Array:let n=new kE(e.length,e);for(let s=0,i=e.length;s<i;s++){let o=e[s];o&&typeof o=="object"&&(o=Wb(o,t?.elements)),n[s]=o}return n;default:return e}}function qE(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=qE(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 il(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=il(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=Yb[s?.__op__];if(i)i(r,n,s);else throw new Error("Invalid CRDT operation "+s.__op__);continue}else s=il(s);r[n]=s}if(!Array.isArray(e))for(let n in e)zte.call(e,n)&&(r||(r={...e.getRecord?.()}),r[n]=e[n]);return r?Object.freeze(r):e.getRecord?.()??e}function HE(e){let t=e.getRecord?.();if(t===void 0)return!0;if(e.constructor===Array){if(!t||e[sl]||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(HE(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(HE(s))return!0}else return!0}else return!0}}return!1}var Jn,AB,RB,k_,zte,sl,kE,FE,zb=be(()=>{Jn=M(pe());BE();Ss();a(Nn,"getChanges");a(GE,"assignTrackedAccessors");AB=Object.prototype,RB=new Proxy({},{get(e,t,r){if(typeof t=="string"){if(t==="then"||t==="getRecord"||t==="getChanges")return;if(AB[t])return AB[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=Wb(s);if(i)return n||(n=Object.create(null),r._setChanges(n)),n[t]=i,i}return s}}});a(Wb,"trackObject");k_=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}};GE(k_,{});a(qE,"collapseData");zte=Object.prototype.hasOwnProperty;a(il,"updateAndFreeze");a(HE,"hasChanges");sl=Symbol.for("has-array-changes"),kE=class extends Array{static{a(this,"TrackedArray")}#e;[sl];constructor(t,r){super(t),this.#e=r}getRecord(){return this.#e}splice(...t){return this[sl]=!0,super.splice(...t)}push(...t){return this[sl]=!0,super.push(...t)}pop(){return this[sl]=!0,super.pop()}unshift(...t){return this[sl]=!0,super.unshift(...t)}shift(){return this[sl]=!0,super.shift()}};kE.prototype.constructor=Array;FE=class{constructor(t){this.value=t}static{a(this,"Addition")}__op__="add";update(t){return(+t||0)+this.value}}});var PB={};Ue(PB,{ResourceBridge:()=>Qb});function Xb({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 bB(e,t){let r=ki(e),n=Xb(e,r);if(!r)throw new ii.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;Nt(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&&qE(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 ki(e){let t=e.database||e.schema||Jte,r=Xe()[t];if(!r)throw(0,ii.handleHDBError)(new Error,jte.SCHEMA_NOT_FOUND(t),404);return r[e.table]}function OB(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*NB(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 wB,$E,ii,IB,jb,Jb,CB,jte,Jte,Qte,Xte,yB,Qb,DB=be(()=>{"use strict";wB=M(gB()),$E=M(Fu()),ii=M(pe());De();IB=M(u_());H();jb=M(Ao()),Jb=M(ni()),CB=M(ae());Cc();zb();({HDB_ERROR_MSGS:jte}=ii.hdb_errors),Jte="data",Qte=1e4,Xte=10,Qb=class extends wB.default{static{a(this,"ResourceBridge")}constructor(t){super(t),yB=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,ii.handleHDBError)(r,r.message,400,void 0,void 0,!0);let n=ki(t);if(!n)throw new ii.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:Xb(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 ii.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}]}dt({database:r.database??r.schema,table:r.table,attributes:n,schemaDefined:s,expiration:r.expiration,audit:r.audit})}async createAttribute(t){return await ki(t).addAttributes([{name:t.attribute,indexed:t.indexed??!0}]),`attribute ${t.schema}.${t.table}.${t.attribute} successfully created.`}async dropAttribute(t){let r=ki(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){ki(t).dropTable()}createSchema(t){return $u({database:t.schema,table:null}),jb.signalSchemaChange(new Jb.SchemaEventMsg(process.pid,Kt.CREATE_SCHEMA,t.schema))}async dropSchema(t){await Zb(t.schema),jb.signalSchemaChange(new Jb.SchemaEventMsg(process.pid,Kt.DROP_SCHEMA,t.schema))}async updateRecords(t){return t.requires_existing=!0,this.upsertRecords(t)}async createRecords(t){return t.requires_no_existing=!0,yB.upsertRecords(t)}async upsertRecords(t){let{schema_table:r,attributes:n}=(0,IB.default)(t),s,i=Xe()[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),Nt(o,async c=>{if(!i.schemaDefined){s=[];for(let f of n)i.attributes.find(p=>p.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],p=d!=null&&await i.get(d,o);if(t.requires_existing&&!p||t.requires_no_existing&&p){u.push(f[i.primaryKey]);continue}p&&(p=qE(p));for(let _ in f)if(Object.prototype.hasOwnProperty.call(f,_)){let h=f[_];if(typeof h=="function")try{let S=h([[p]]);Array.isArray(S)&&(h=S[0].func_val,f[_]=h)}catch(S){throw S.message+="Trying to set key "+_+" on object"+JSON.stringify(f),S}}if(p)for(let _ in p)Object.prototype.hasOwnProperty.call(f,_)||(f[_]=p[_]);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=Xe()[t.schema][t.table],n={user:t.hdb_user};return t.replicateTo&&(n.replicateTo=t.replicateTo),t.replicatedConfirmation&&(n.replicatedConfirmation=t.replicatedConfirmation),Nt(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 OB(o,c,s.timestamp)})}async deleteRecordsBefore(t){let r=Xe()[t.schema][t.table];if(!r.createdTimeProperty)throw new ii.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:cm.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,CB.async_set_timeout)(Xte),l=[],s=!0},"chunkDelete");for await(let f of n)l.push(f[r.primaryKey]),c++,c%Qte===0&&await u();return l.length>0&&await u(),s?OB(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 bB(t)}async getDataByHash(t){let r=new Map;t._returnKeyValue=!0;for await(let{key:n,value:s}of bB(t,!0))r.set(n,s);return r}searchByValue(t,r){if(r&&XA[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=ki(t);if(!s)throw new ii.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===cm.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:Xb(t,s)},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async getDataByValue(t,r){let n=new Map,s=ki(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){ki({schema:t,table:r})?.primaryStore.resetReadTxn()}async deleteAuditLogsBefore(t){return ki(t).deleteHistory(t.timestamp,t.cleanup_deleted_records)}async readAuditLog(t){let r=ki(t),n={};switch(t.search_type){case lm.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 lm.USERNAME:let s=t.search_values;for await(let i of NB(r))s.includes(i.user_name)&&(n[i.user_name]||(n[i.user_name]=[])).push(i);return n;default:return NB(r,t.search_values?.[0],t.search_values?.[1],t.limit)}}};a(Xb,"getSelect");a(bB,"getRecords");a(ki,"getTable");a(OB,"createDeleteResponse");a(NB,"groupRecordsInHistory")});var Kn=I((sCe,LB)=>{"use strict";var{ResourceBridge:Zte}=(DB(),P(PB)),ere=ce();ere.initSync();var VE;function tre(){return VE||(VE=new Zte,VE)}a(tre,"getBridge");LB.exports=tre()});var bn=I((oCe,xB)=>{"use strict";var YE=GR(),Lr=ae(),rre=require("util"),WE=Kn(),nre=Rs(),MB=W(),{handleHDBError:ol,hdb_errors:sre}=pe(),{HTTP_STATUS_CODES:al}=sre,ire=rre.promisify(nre.getTableSchema),ore="updated",vB="inserted",UB="upserted";xB.exports={insert:cre,update:lre,upsert:ure,validation:are,flush:dre};async function are(e){if(Lr.isEmpty(e))throw new Error("invalid update parameters defined.");if(Lr.isEmptyOrZeroLength(e.schema))throw new Error("invalid database specified.");if(Lr.isEmptyOrZeroLength(e.table))throw new Error("invalid table specified.");let t=await ire(e.schema,e.table),r=YE(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&&Lr.isEmptyOrZeroLength(c[n]))throw MB.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(!Lr.isEmptyOrZeroLength(c[n])&&(c[n]==="null"||c[n]==="undefined"))throw MB.error(`a valid hash value must be provided with ${e.operation} record:`,c),new Error(`"${c[n]}" is not a valid hash attribute value`);!Lr.isEmpty(c[n])&&c[n]!==""&&s.has(Lr.autoCast(c[n]))&&(c.skip=!0),s.add(Lr.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(are,"validation");async function cre(e){if(e.operation!=="insert")throw new Error("invalid operation, must be insert");let t=YE(e);if(t)throw ol(new Error,t.message,al.BAD_REQUEST);Lr.transformReq(e);let r=Lr.checkSchemaTableExist(e.schema,e.table);if(r)throw ol(new Error,r,al.BAD_REQUEST);let n=await WE.createRecords(e);return KE(vB,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time)}a(cre,"insertData");async function lre(e){if(e.operation!=="update")throw new Error("invalid operation, must be update");let t=YE(e);if(t)throw ol(new Error,t.message,al.BAD_REQUEST);Lr.transformReq(e);let r=Lr.checkSchemaTableExist(e.schema,e.table);if(r)throw ol(new Error,r,al.BAD_REQUEST);let n=await WE.updateRecords(e);return Lr.isEmpty(n.existing_rows)?KE(ore,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time):KE(n.update_action,[],e,n.hashes,void 0,n.txn_time)}a(lre,"updateData");async function ure(e){if(e.operation!=="upsert")throw ol(new Error,"invalid operation, must be upsert",al.INTERNAL_SERVER_ERROR);let t=YE(e);if(t)throw ol(new Error,t.message,al.BAD_REQUEST);Lr.transformReq(e);let r=Lr.checkSchemaTableExist(e.schema,e.table);if(r)throw ol(new Error,r,al.BAD_REQUEST);let n=await WE.upsertRecords(e);return KE(UB,n.written_hashes,e,[],n.new_attributes,n.txn_time)}a(ure,"upsertData");function KE(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===vB?(o.inserted_hashes=t,o.skipped_hashes=n,o):e===UB?(o.upserted_hashes=t,o):(o.update_hashes=t,o.skipped_hashes=n,o)}a(KE,"returnObject");function dre(e){return Lr.transformReq(e),WE.flush(e.schema,e.table)}a(dre,"flush")});var qB=I((cCe,GB)=>{var Vu=require("validate.js"),HB=it(),Ku=(H(),P(G)),{handleHDBError:fre,hdb_errors:_re}=pe(),{HDB_ERROR_MSGS:zt,HTTP_STATUS_CODES:pre}=_re,eO=a(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),hre={STRUCTURE_USER:"structure_user"},BB=Object.values(Ku.ROLE_TYPES_ENUM),mre="attribute_permissions",Ere="attribute_name",{PERMS_CRUD_ENUM:Yu}=Ku,gre=[mre,...Object.values(Yu)],kB=[Yu.READ,Yu.INSERT,Yu.UPDATE],Sre=[Ere,...kB];function Tre(e){let t=eO();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,FB(e,t)}a(Tre,"addRoleValidation");function Are(e){let t=eO();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,FB(e,t)}a(Are,"alterRoleValidation");function Rre(e){let t=eO();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,HB.validateObject(e,t)}a(Rre,"dropRoleValidation");var yre=["operation","role","id","permission","hdb_user","access"];function FB(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let o=0,c=n.length;o<c;o++)yre.includes(n[o])||s.push(n[o]);s.length>0&&nr(zt.INVALID_ROLE_JSON_KEYS(s),r);let i=HB.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{nr(o,r)}),e.permission){let o=bre(e);o&&nr(o,r),BB.forEach(c=>{e.permission[c]&&!Vu.isBoolean(e.permission[c])&&nr(zt.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let o in e.permission)if(BB.indexOf(o)<0){if(o===hre.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(zt.SCHEMA_NOT_FOUND(d),r)}continue}nr(zt.STRUCTURE_USER_ROLE_TYPE_ERROR(o),r);continue}let c=e.permission[o];if(!o||!global.hdb_schema[o]){nr(zt.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(zt.TABLE_NOT_FOUND(o,l),r);continue}if(Object.keys(u).forEach(f=>{gre.includes(f)||nr(zt.INVALID_PERM_KEY(f),r,o,l)}),Object.values(Yu).forEach(f=>{Vu.isDefined(u[f])?Vu.isBoolean(u[f])||nr(zt.TABLE_PERM_NOT_BOOLEAN(f),r,o,l):nr(zt.TABLE_PERM_MISSING(f),r,o,l)}),u.attribute_permissions===void 0){nr(zt.ATTR_PERMS_ARRAY_MISSING,r,o,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){nr(zt.ATTR_PERMS_NOT_ARRAY,r,o,l);continue}if(u.attribute_permissions){let f=global.hdb_schema[o][l].attributes.map(({attribute:p})=>p),d={read:!1,insert:!1,update:!1};for(let p in u.attribute_permissions){let _=u.attribute_permissions[p];if(Object.keys(_).forEach(S=>{!Sre.includes(S)&&S!==Yu.DELETE&&nr(zt.INVALID_ATTR_PERM_KEY(S),r,o,l)}),!Vu.isDefined(_.attribute_name)){nr(zt.ATTR_PERM_MISSING_NAME,r,o,l);continue}let h=_.attribute_name;if(!f.includes(h)){nr(zt.INVALID_ATTRIBUTE_IN_PERMS(h),r,o,l);continue}kB.forEach(S=>{Vu.isDefined(_[S])?Vu.isBoolean(_[S])||nr(zt.ATTR_PERM_NOT_BOOLEAN(S,h),r,o,l):nr(zt.ATTR_PERM_MISSING(S,h),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 p=`${o}.${l}`;nr(zt.MISMATCHED_TABLE_ATTR_PERMS(p),r,o,l)}}}}return Ore(r)}a(FB,"customValidate");GB.exports={addRoleValidation:Tre,alterRoleValidation:Are,dropRoleValidation:Rre};function bre(e){let{operation:t,permission:r}=e;if(t===Ku.OPERATIONS_ENUM.ADD_ROLE||t===Ku.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 zt.SU_CU_ROLE_COMBINED_ERROR;{let o=r.super_user?Ku.ROLE_TYPES_ENUM.SUPER_USER:Ku.ROLE_TYPES_ENUM.CLUSTER_USER;return zt.SU_CU_ROLE_NO_PERMS_ALLOWED(o)}}}return null}a(bre,"validateNoSUPerms");function Ore(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:zt.ROLE_PERMS_ERROR,...e};return fre(new Error,n,pre.BAD_REQUEST)}else return null}a(Ore,"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 G_=I((dCe,YB)=>{"use strict";var $B=bn(),VB=Wr(),Nre=jc(),rO=qB(),nO=Ao(),uCe=require("uuid").v4,wre=require("util"),zE=(H(),P(G)),Ire=ae(),sO=VB.searchByValue,Cre=VB.searchByHash,Pre=wre.promisify(Nre.delete),Dre=si(),Lre=Gu(),{hdb_errors:Mre,handleHDBError:cl}=pe(),{HDB_ERROR_MSGS:KB,HTTP_STATUS_CODES:F_}=Mre,{UserEventMsg:iO}=ni();YB.exports={addRole:vre,alterRole:Ure,dropRole:xre,listRoles:Bre};function tO(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(tO,"scrubRoleDetails");async function vre(e){let t=rO.addRoleValidation(e);if(t)throw t;e=tO(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 sO(r)||[])}catch(i){throw cl(i)}if(n&&n.length>0)throw cl(new Error,KB.ROLE_ALREADY_EXISTS(e.role),F_.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 $B.insert(s),nO.signalUserChange(new iO(process.pid)),e=tO(e),e}a(vre,"addRole");async function Ure(e){let t=rO.alterRoleValidation(e);if(t)throw t;e=tO(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await $B.update(r)}catch(s){throw cl(s)}if(n&&n?.message==="updated 0 of 1 records")throw cl(new Error,"Invalid role id",F_.BAD_REQUEST,void 0,void 0,!0);return await nO.signalUserChange(new iO(process.pid)),e}a(Ure,"alterRole");async function xre(e){let t=rO.dropRoleValidation(e);if(t)throw cl(new Error,t,F_.BAD_REQUEST,void 0,void 0,!0);let r=new Lre(zE.SYSTEM_SCHEMA_NAME,zE.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Cre(r));if(n.length===0)throw cl(new Error,KB.ROLE_NOT_FOUND,F_.NOT_FOUND,void 0,void 0,!0);let s=new Dre(zE.SYSTEM_SCHEMA_NAME,zE.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await sO(s)),o=!1;if(Ire.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){o=!0;break}}if(o===!0)throw cl(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,F_.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Pre(c),nO.signalUserChange(new iO(process.pid)),`${n[0].role} successfully deleted`}a(xre,"dropRole");async function Bre(){return sO({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}a(Bre,"listRoles")});var oO={};Ue(oO,{start:()=>jB,startOnMainThread:()=>Fre});function jB({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,WB.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(Hre.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 p=u.attributes[d];p.attribute_name=d,f.push(p)}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 kre(i)}}}async function kre(e){let t=Xe().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,zB.isEqual)(i,e)?void 0:(e.id=r.id,(0,jE.alterRole)(e))}return(0,jE.addRole)(e)}var jE,WB,zB,Hre,Fre,JB=be(()=>{De();jE=M(G_()),WB=require("yaml"),zB=require("lodash"),Hre=["super_user","cluster_user","structure_user"];a(jB,"start");a(kre,"ensureRole");Fre=jB});async function JE(e){let t=(0,ZB.pathToFileURL)(e).toString();if(Gre)return q_||(q_=qre(Vre)),(await(await q_).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function qre(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),q_=new Compartment({console,Math,Date,fetch:$re,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,XB.extname)(r)||(r+=".js"),r)},importHook:a(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){Object.assign(s,{Resource:Vr,tables:Qn,databases:$e})}};let n=await(0,QB.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),q_}function $re(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 Vre(){return{Resource:Vr,tables:Qn}}var QB,XB,ZB,Gre,q_,aO=be(()=>{ga();De();QB=require("fs/promises"),XB=require("path"),ZB=require("url"),Gre=!1;a(JE,"secureImport");a(qre,"getCompartment");a($re,"secureOnlyFetch");a(Vre,"getGlobalVars")});var lO={};Ue(lO,{handleFile:()=>Kre});async function Kre(e,t,r,n){let s=new Map,i=await JE(r);c(i.default)&&n.set((0,cO.dirname)(t),i.default),o(i,(0,cO.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 cO,eH=be(()=>{aO();cO=require("path");a(Kre,"handleFile")});var dO={};Ue(dO,{start:()=>Yre});function Yre({resources:e}){e.set("login",uO),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var uO,tH=be(()=>{ga();a(Yre,"start");uO=class extends Vr{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 z_={};Ue(z_,{addAnalyticsListener:()=>W_,calculateCPUUtilization:()=>TH,diffResourceUsage:()=>AH,recordAction:()=>sr,recordActionBinary:()=>Xn,setAnalyticsEnabled:()=>Wre});function Wre(e){hH=e}function zre(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 jre(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},XE.set(e,o)}function sr(e,t,r,n,s){if(!hH)return;let i=t+(r?"-"+r:"");n!==void 0&&(i+="-"+n),s!==void 0&&(i+="-"+s);let o=XE.get(i);o?zre(e,o):jre(i,e,t,r,n,s),QE||Jre()}function Xn(e,t,r,n,s){sr(!!e,t,r,n,s)}function W_(e){gH.push(e)}function Jre(){QE=performance.now(),setTimeout(async()=>{let e=performance.now()-QE;QE=0;let t=[],r={time:Date.now(),period:e,threadId:ll.threadId,metrics:t};for(let[s,i]of XE){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 SH){let p=Math.floor(c*d),_=o[p-1];if(p>l){let h=p-l;if(_===f){let S=u[u.length-1];typeof S=="number"?u[u.length-1]={value:S,count:1+h}:S.count+=h}else u.push(h>1?{value:_,count:h}:_),f=_;l=p}}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 RH()}let n=process.memoryUsage();t.push({metric:"memory",threadId:ll.threadId,byThread:!0,...n});for(let s of gH)s(t);XE=new Map,ll.parentPort?ll.parentPort.postMessage({type:EH,report:r}):OH({report:r})},mH).unref()}function ZE(e,t,r){let n={id:(0,K_.getNextMonotonicTime)(),metric:t,...r};e.primaryStore.put(n.id,n,{append:!0}).then(s=>{s||e.primaryStore.put(n.id,n)})}function TH(e,t){let r=e.userCPUTime+e.systemCPUTime;return Math.round(r/t*100)/100}function AH(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 Qre(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};ZE(e,"table-size",l),ul.trace?.(`table ${o} size metric: ${JSON.stringify(l)}`),n+=c}return n}function rH(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s.getAuditSize(),o=pH.default.statSync(s.primaryStore.env.path).size,c=Qre(e,r,n),l=o-c,u={database:r,size:o,used:c,free:l,audit:i};ZE(e,"database-size",u),ul.trace?.(`database ${r} size metric: ${JSON.stringify(u)}`)}catch(s){ul.warn?.("Error getting DB size metrics",s)}}function nH(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s.getStorageStats(),o={database:r,...i};ZE(e,"storage-volume",o),ul.trace?.(`db ${r} storage volume metrics: ${JSON.stringify(o)}`)}catch(s){ul.warn?.("Error getting DB volumne metrics",s)}}async function Xre(e,t=6e4){let r=_O(),n=yH(),s=new Promise(E=>{let A=performance.now();setImmediate(()=>{let N=performance.now();N-A>5e3&&ul.warn?.("Unusually high event queue latency on the main thread of "+Math.round(N-A)+"ms"),A=performance.now()}),n.primaryStore.prefetch([1],()=>{let N=performance.now();N-A>5e3&&ul.warn?.("Unusually high task queue latency on the main thread of "+Math.round(N-A)+"ms"),E(N-A)})}),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:A}of r.primaryStore.getRange({start:i||!1,exclusiveStart:!0,end:1/0})){if(!A)continue;if(o){if(E>o+t)break}else o=E;f=E;let{metrics:N,threadId:v}=A;for(let F of N||[]){let{path:$,method:Y,type:ee,metric:oe,count:j,total:se,distribution:z,threads:me,...Ae}=F;j||(j=1);let Pe=oe+($?"-"+$:"");Y!==void 0&&(Pe+="-"+Y),ee!==void 0&&(Pe+="-"+ee);let he=c.get(Pe);if(he){if(he.threads){let ut=he.threads[v];if(ut)he=ut;else{he.threads[v]={...Ae};continue}}he.count||(he.count=1);let Ot=he.count;for(let ut in Ae){let br=Ae[ut];typeof br=="number"&&(he[ut]=(he[ut]*Ot+br*j)/(Ot+j))}he.count+=j,se>=0&&(he.total+=se,he.ratio=he.total/he.count)}else he={period:t,...F},delete he.distribution,c.set(Pe,he),he.byThread&&(he.threads=[],he.threads[v]={...Ae},u.push(he));if(z){z=z.map(ut=>typeof ut=="number"?{value:ut,count:1}:ut);let Ot=l.get(Pe);Ot?Ot.push(...z):l.set(Pe,z)}}await RH()}for(let E of u){let{path:A,method:N,type:v,metric:F,count:$,total:Y,distribution:ee,threads:oe,...j}=E;oe=oe.filter(se=>se);for(let se in j){if(typeof E[se]!="number")continue;let z=0;for(let me of oe){let Ae=me[se];typeof Ae=="number"&&(z+=Ae)}E[se]=z}E.count=oe.length,delete E.threads,delete E.byThread}for(let[E,A]of l){let N=c.get(E);A.sort((ut,br)=>ut.value>br.value?1:-1);let v=N.count-1,F=[],$=0,Y=0,ee;for(let ut of SH){let br=v*ut;for(;$<br;)ee=A[Y++],$+=ee.count,Y===1&&$--;let ms=A[Y>1?Y-2:0];ee||(ee=A[0]),F.push(ee.value-(ee.value-ms.value)*($-br)/ee.count)}let[oe,j,se,z,me,Ae,Pe,he,Ot]=F;Object.assign(N,{p1:oe,p10:j,p25:se,median:z,p75:me,p90:Ae,p95:Pe,p99:he,p999:Ot})}let d;for(let[E,A]of c)A.id=(0,K_.getNextMonotonicTime)(),A.time=f,n.primaryStore.put(A.id,A,{append:!0}).then(N=>{N||n.primaryStore.put(A.id,A)}),d=!0;let p=Date.now(),{idle:_,active:h}=performance.eventLoopUtilization();if(d||h*10>_){let E=(0,K_.getNextMonotonicTime)(),A={id:E,metric:"main-thread-utilization",idle:_-sH,active:h-iH,taskQueueLatency:await s,time:p,...process.memoryUsage()};n.primaryStore.put(E,A,{append:!0}).then(N=>{N||n.primaryStore.put(E,A)})}sH=_,iH=h;let S=process.resourceUsage(),g=AH($_,S);g.time=p,g.period=$_.time?p-$_.time:t,g.cpuUtilization=TH($_,g.period),ZE(n,"resource-usage",g),$_=g;let R=Xe();rH(n,R),rH(n,{system:R.system}),nH(n,R),nH(n,{system:R.system})}async function oH(e,t){let r=Date.now()-t;for(let n of e.primaryStore.getKeys({start:!1,end:r}))e.primaryStore.remove(n)}function _O(){return aH||(aH=dt({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function yH(){return cH||(cH=dt({table:"hdb_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]}))}function tne(){bH=!0;let e=(0,Y_.get)(x.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await Xre(mH,e),await oH(_O(),Zre),await oH(yH(),ene)},Math.min(e/2,2147483647)).unref()}function OH(e,t){let r=e.report;r.threadId=t?.threadId||ll.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(lH+=n.mean*n.count);r.totalBytesProcessed=lH,t&&(r.metrics.push({metric:"utilization",...t.performance.eventLoopUtilization(uH.get(t))}),uH.set(t,t.performance.eventLoopUtilization())),r.id=(0,K_.getNextMonotonicTime)(),_O().primaryStore.put(r.id,r),bH||tne(),rne&&(NH=sne(r))}async function sne(e){if(await NH,!Pa){let r=(0,V_.dirname)((0,fH.getLogFilePath)());try{Pa=await(0,fO.open)((0,V_.join)(r,"analytics.log"),"r+")}catch{Pa=await(0,fO.open)((0,V_.join)(r,"analytics.log"),"w+")}}let t=(await Pa.stat()).size;if(t>nne){let r=Buffer.alloc(t);await Pa.read(r,{position:0}),r=r.subarray(r.indexOf(10,r.length/2)+1),await Pa.write(r,{position:0}),await Pa.truncate(r.length),t=r.length}await Pa.write(JSON.stringify(e)+`
|
|
20
|
+
This can occur during early stages of install where the config file has not yet been created`);return}else throw rr.error(i),new Error(`Error reading HarperDB config file at ${r}`)}L8(n,r),Jy(n);let s=n.toJSON();if(y8.config=s,It=Mu(s),It.logging_rotation_rotate)for(let i in vU)It[i]&&rr.error(`Config ${vU[i]} has been deprecated. Please check https://docs.harperdb.io/docs/ for further details.`);rr.trace(O8)}}a(TE,"initConfig");function L8(e,t){let r=e.getIn(["rootPath"]),n=!1;if(e.hasIn(["storage","path"])||(e.setIn(["storage","path"],Wn.join(r,"database")),n=!0),e.hasIn(["logging","rotation","path"])||(e.setIn(["logging","rotation","path"],Wn.join(r,"log")),n=!0),e.hasIn(["authentication"])||(e.addIn(["authentication"],{cacheTTL:3e4,enableSessions:!0,operationTokenTimeout:e.getIn(["operationsApi","authentication","operationTokenTimeout"])??"1d",refreshTokenTimeout:e.getIn(["operationsApi","authentication","refreshTokenTimeout"])??"30d"}),n=!0),e.hasIn(["analytics"])||(e.addIn(["analytics"],{aggregatePeriod:60}),n=!0),n){if(rr.trace("Updating config file with missing config params"),e.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${e.errors}`);jr.writeFileSync(t,String(e))}}a(L8,"checkForUpdatedConfig");function Jy(e,t=!1){let r=e.toJSON();if(r.componentsRoot=r.componentsRoot??r?.customFunctions?.root,r?.http?.threads&&(r.threads=r?.http?.threads),r.http?.port&&r.http?.port===r.http?.securePort)throw Lu.CONFIG_VALIDATION("http.port and http.securePort cannot be the same value");if(r.operationsApi?.network?.port&&r.operationsApi?.network?.port===r.operationsApi?.network?.securePort)throw Lu.CONFIG_VALIDATION("operationsApi.network.port and operationsApi.network.securePort cannot be the same value");let n=g8(r,t);if(n.error)throw Lu.CONFIG_VALIDATION(n.error.message);typeof n.value.threads=="object"?e.setIn(["threads","count"],n.value.threads.count):e.setIn(["threads"],n.value.threads),e.setIn(["componentsRoot"],n.value.componentsRoot),e.setIn(["logging","root"],n.value.logging.root),e.setIn(["storage","path"],n.value.storage.path),e.setIn(["logging","rotation","path"],n.value.logging.rotation.path),e.setIn(["operationsApi","network","domainSocket"],n.value?.operationsApi?.network?.domainSocket),r?.clustering?.enabled&&e.setIn(["clustering","leafServer","streams","path"],n.value.clustering.leafServer.streams?.path)}a(Jy,"validateConfig");function M8(e,t){It===void 0&&(It={});let r=ti[e.toLowerCase()];if(r===void 0){rr.trace(`Unable to update config object because config param '${e}' does not exist`);return}It[r.toLowerCase()]=t}a(M8,"updateConfigObject");function GU(e,t,r=void 0,n=!1,s=!1,i=!1){It===void 0&&TE();let o=FU(ti.hdb_root),c=Wn.join(o,ys.HDB_CONFIG_FILE),l=wa(c),u;if(r&&It){let p=!1;for(let _ in r)if(r[_]!=It[_.toLowerCase()]){p=!0;break}if(!p){rr.trace("No changes detected in config parameters, skipping update");return}}if(r===void 0&&e.toLowerCase()===Yn.DATABASES)u=t;else if(r===void 0){let p;if(i)p=e;else if(p=ti[e.toLowerCase()],p===void 0)throw new Error(`Unable to update config, unrecognized config parameter: ${e}`);let _=p.split("_"),h=jy(p,t);l.setIn([..._],h)}else for(let p in r){let _=ti[p.toLowerCase()];if(_===Yn.HTTP_SECUREPORT&&r[p]===It[Yn.HTTP_PORT]?.toString()&&l.setIn(["http","port"],null),_===Yn.OPERATIONSAPI_NETWORK_SECUREPORT&&r[p]===It[Yn.OPERATIONSAPI_NETWORK_PORT.toLowerCase()]?.toString()&&l.setIn(["operationsApi","network","port"],null),_===Yn.DATABASES){u=r[p];continue}if(_?.startsWith("threads_")){let h=l.getIn(["threads"]);h>=0&&(l.deleteIn(["threads"]),l.setIn(["threads","count"],h))}if(!_&&(p.endsWith("_package")||p.endsWith("_port"))&&(_=p),_!==void 0){let h=_.split("_"),S=ys.LEGACY_CONFIG_PARAMS[p.toUpperCase()];S&&S.startsWith("customFunctions")&&l.hasIn(S.split("_"))&&(_=S,h=S.split("_"));let g=jy(_,r[p]);_==="rootPath"&&g?.endsWith("/")&&(g=g.slice(0,-1));try{h.length>1&&typeof l.getIn(h.slice(0,-1))=="boolean"&&l.deleteIn(h.slice(0,-1)),l.setIn([...h],g)}catch(R){rr.error(R)}}}u&&kU(l,u),Jy(l);let f=l.getIn(["rootPath"]),d=Wn.join(f,ys.HDB_CONFIG_FILE);if(n===!0&&v8(c,f),l.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${l.errors}`);jr.writeFileSync(d,String(l)),s&&(It=Mu(l.toJSON())),rr.trace(`Config parameter: ${e} updated with value: ${t}`)}a(GU,"updateConfigValue");function v8(e,t){try{let r=Wn.join(t,"backup",`${new Date(Date.now()).toISOString().replaceAll(":","-")}-${ys.HDB_CONFIG_FILE}.bak`);jr.copySync(e,r),rr.trace(`Config file: ${e} backed up to: ${r}`)}catch(r){rr.error(N8),rr.error(r)}}a(v8,"backupConfigFile");var U8=["databases"];function Mu(e){return e.http&&Object.assign(e.http,e?.customFunctions?.network),e?.operationsApi?.network&&(e.operationsApi.network={...e.http,...e.operationsApi.network}),e?.operationsApi&&(e.operationsApi.tls={...e.tls,...e.operationsApi.tls}),SE=e,r(e);function r(n){let s={};for(let i in n)if(n.hasOwnProperty(i)){if(typeof n[i]=="object"&&n[i]!==null&&!Array.isArray(n[i])&&!U8.includes(i)){let o=r(n[i]);for(let c in o){if(!o.hasOwnProperty(c))continue;c!=="package"&&(i=i.toLowerCase());let l=i+"_"+c;!Yn[l.toUpperCase()]&&ti[l]&&(s[ti[l].toLowerCase()]=o[c]),s[l]=o[c]}}n[i]!==void 0&&(s[i.toLowerCase()]=n[i])}return s}a(r,"squashObj")}a(Mu,"flattenConfig");function jy(e,t){if(e===Yn.CLUSTERING_NODENAME||e===Yn.CLUSTERING_USER){if(t==null)return t;if(!isNaN(t))return t.toString();if(typeof t=="string"&&t.toLowerCase()==="true"||typeof t=="string"&&t.toLowerCase()==="false")return t}else{if(S8(t))return parseFloat(t);if(t===!0||t===!1||Array.isArray(t)||Sr.isObject(t)||t===null)return t;if(typeof t=="string"&&t.toLowerCase()==="true")return!0;if(typeof t=="string"&&t.toLowerCase()==="false")return!1}if(t===void 0||t.toLowerCase()==="undefined")return null;if(typeof t=="string"&&(t.startsWith("{")&&t.endsWith("}")||t.startsWith("[")&&t.endsWith("]")))try{return JSON.parse(t)}catch{}return Sr.autoCast(t)}a(jy,"castConfigValue");function x8(){let e=Sr.getPropsFilePath(),t=Xc(e);return wa(t).toJSON()}a(x8,"getConfiguration");async function B8(e){let{operation:t,hdb_user:r,hdb_auth_header:n,...s}=e;try{return GU(void 0,void 0,s,!0),C8}catch(i){throw typeof i=="string"||i instanceof String?A8(i,i,R8.BAD_REQUEST,void 0,void 0,!0):i}}a(B8,"setConfiguration");function Qy(){let e=Sr.getPropsFilePath();try{jr.accessSync(e,jr.constants.F_OK|jr.constants.R_OK)}catch(n){if(!Sr.noBootFile())throw rr.error(n),new Error(`HarperDB properties file at path ${e} does not exist`)}let t=Xc(e);return wa(t).toJSON()}a(Qy,"readConfigFile");function wa(e){return UU.parseDocument(jr.readFileSync(e,"utf8"),{simpleKeys:!0})}a(wa,"parseYamlDoc");function H8(){let e=Qy(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=Sr.isEmptyOrZeroLength(t)?[]:t;let r=MU(t);if(r)throw Lu.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=Sr.isEmptyOrZeroLength(n)?[]:n;let s=MU(n);if(s)throw Lu.CONFIG_VALIDATION(s.message);if(!Sr.isEmptyOrZeroLength(n)&&!Sr.isEmptyOrZeroLength(t)){let i=t.filter(o=>n.some(c=>c.host===o.host&&c.port===o.port));if(!Sr.isEmptyOrZeroLength(i)){let o=`Duplicate hub and leaf routes found ${JSON.stringify(i)}`;throw Lu.CONFIG_VALIDATION(o)}}return{hub_routes:t,leaf_routes:n}}a(H8,"getClusteringRoutes");function qU(e){let t=xU(e);It={};for(let r in ti){let n=t.get(r.toUpperCase());if(Sr.isEmpty(n)||typeof n=="string"&&n.trim().length===0)continue;let s=ti[r].toLowerCase();s===Yn.LOGGING_ROOT?It[s]=Wn.dirname(n):It[s]=n}return It}a(qU,"initOldConfig");function k8(e){let t=Qy();return T8.get(t,e.replaceAll("_","."))}a(k8,"getConfigFromFile");async function F8(e,t){let r=wa(Xc());if(r.hasIn([e])?r.setIn([e],t):r.addIn([e],t),r.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${r.errors}`);await jr.writeFile(Xc(),String(r))}a(F8,"addConfig");function G8(e){let t=Xc(Sr.getPropsFilePath()),r=wa(t);r.deleteIn(e);let n=r.getIn(["rootPath"]),s=Wn.join(n,ys.HDB_CONFIG_FILE);jr.writeFileSync(s,String(r))}a(G8,"deleteConfigFromFile");function q8(){return SE||(TE(),SE)}a(q8,"getConfigObj");function $8(){return It||TE(),It}a($8,"getFlatConfigObj")});var yn=I((CNe,Nr)=>{"use strict";var YU="username is required",WU="nothing to update, must supply active, role or password to update",zU="password cannot be an empty string",jU="If role is specified, it cannot be empty.",JU="active must be true or false";Nr.exports.addUser=X8;Nr.exports.alterUser=Z8;Nr.exports.dropUser=t5;Nr.exports.getSuperUser=o5;Nr.exports.userInfo=r5;Nr.exports.listUsers=RE;Nr.exports.listUsersExternal=n5;Nr.exports.setUsersWithRolesCache=Zc;Nr.exports.findAndValidateUser=ob;Nr.exports.getClusterUser=a5;Nr.exports.getUsersWithRolesCache=i5;Nr.exports.USERNAME_REQUIRED=YU;Nr.exports.ALTERUSER_NOTHING_TO_UPDATE=WU;Nr.exports.EMPTY_PASSWORD=zU;Nr.exports.EMPTY_ROLE=jU;Nr.exports.ACTIVE_BOOLEAN=JU;var QU=bn(),V8=jc(),R_=(mE(),P(hE)),XU=yU(),y_=Wr(),rb=Ao(),xi=ae(),ZU=require("validate.js"),nb=W(),{promisify:K8}=require("util"),sb=go(),Zy=(H(),P(G)),VU=St(),Y8=Rt(),W8=ce(),z8=ho(),{hdb_errors:j8,ClientError:ri}=pe(),{HTTP_STATUS_CODES:To,AUTHENTICATION_ERROR_MSGS:Xy,HDB_ERROR_MSGS:vu}=j8,{UserEventMsg:ib}=ni(),eb=require("lodash"),{server:AE}=(Kr(),P(Ru)),J8=W();AE.getUser=(e,t)=>ob(e,t,t!=null);AE.authenticateUser=(e,t)=>ob(e,t);var e0={username:!0,active:!0,role:!0,password:!0},KU=new Map,Q8=K8(V8.delete),tb=W8.get(Zy.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??R_.HASH_FUNCTION.SHA256,Bi;async function X8(e){let t=ZU.cleanAttributes(e,e0),r=XU.addUserValidation(t);if(r)throw new ri(r.message);let n=await y_.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 ri(vu.ROLE_NAME_NOT_FOUND(t.role),To.NOT_FOUND);if(n.length>1)throw new ri(vu.DUP_ROLES_FOUND(t.role),To.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=sb.encrypt(t.password)),t.password=await R_.hash(t.password,tb),t.hash_function=tb,t.role=n[0].id;let s=await QU.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(nb.debug(s),await Zc(),s.skipped_hashes.length===1)throw new ri(vu.USER_ALREADY_EXISTS(t.username),To.CONFLICT);return rb.signalUserChange(new ib(process.pid)),`${t.username} successfully added`}a(X8,"addUser");async function Z8(e){let t=ZU.cleanAttributes(e,e0);if(xi.isEmptyOrZeroLength(t.username))throw new Error(YU);if(xi.isEmptyOrZeroLength(t.password)&&xi.isEmptyOrZeroLength(t.role)&&xi.isEmptyOrZeroLength(t.active))throw new Error(WU);if(!xi.isEmpty(t.password)&&xi.isEmptyOrZeroLength(t.password.trim()))throw new Error(zU);if(!xi.isEmpty(t.active)&&!xi.isBoolean(t.active))throw new Error(JU);if(!xi.isEmpty(t.password)&&!xi.isEmptyOrZeroLength(t.password.trim())&&(e5(t.username)&&(t.hash=sb.encrypt(t.password)),t.password=await R_.hash(t.password,tb)),t.role==="")throw new Error(jU);if(t.role){let n=await y_.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["*"]});if(!n||n.length===0)throw new ri(vu.ALTER_USER_ROLE_NOT_FOUND(t.role),To.NOT_FOUND);if(n.length>1)throw new ri(vu.DUP_ROLES_FOUND(t.role),To.CONFLICT);t.role=n[0].id}let r=await QU.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await Zc(),rb.signalUserChange(new ib(process.pid)),r}a(Z8,"alterUser");function e5(e){let t=!1,r=Bi.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}a(e5,"isClusterUser");async function t5(e){let t=XU.dropUserValidation(e);if(t)throw new ri(t.message);if(Bi.get(e.username)===void 0)throw new ri(vu.USER_NOT_EXIST(e.username),To.NOT_FOUND);let r=await Q8({table:"hdb_user",schema:"system",hash_values:[e.username]});return nb.debug(r),await Zc(),rb.signalUserChange(new ib(process.pid)),`${e.username} successfully deleted`}a(t5,"dropUser");async function r5(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=eb.cloneDeep(e.hdb_user);let r=await y_.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(r5,"userInfo");async function n5(){let e=await RE();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}a(n5,"listUsersExternal");async function RE(){let e=await y_.searchByValue({schema:"system",table:"hdb_role",search_value:"*",search_attribute:"role",get_attributes:["*"]}),t={};for(let s of e)t[s.id]=eb.cloneDeep(s);if(Object.keys(t).length===0)return null;let r=await y_.searchByValue({schema:"system",table:"hdb_user",search_value:"*",search_attribute:"username",get_attributes:["*"]}),n=new Map;for(let s of r)s=eb.cloneDeep(s),s.role=t[s.role],s5(s.role),n.set(s.username,s);return n}a(RE,"listUsers");function s5(e){if(!e){nb.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(z8)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}a(s5,"appendSystemTablesToRole");async function Zc(e=void 0){e?Bi=e:Bi=await RE()}a(Zc,"setUsersWithRolesCache");async function i5(){return Bi||await Zc(),Bi}a(i5,"getUsersWithRolesCache");async function ob(e,t,r=!0){Bi||await Zc();let n=Bi.get(e);if(!n){if(!r)return{username:e};throw new ri(Xy.GENERIC_AUTH_FAIL,To.UNAUTHORIZED)}if(n&&!n.active)throw new ri(Xy.USER_INACTIVE,To.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(KU.get(t)===n.password)return s;{let i=R_.validate(n.password,t,n.hash_function||R_.HASH_FUNCTION.MD5);if(i?.then&&(i=await i),i===!0)KU.set(t,n.password);else throw new ri(Xy.GENERIC_AUTH_FAIL,To.UNAUTHORIZED)}}return s}a(ob,"findAndValidateUser");async function o5(){Bi||await Zc();for(let[,e]of Bi)if(e.role.role==="super_user")return e}a(o5,"getSuperUser");async function a5(){let e=await RE(),t=Y8.getConfigFromFile(Zy.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==Zy.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=sb.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+VU.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+VU.SERVER_SUFFIX.ADMIN,r}a(a5,"getClusterUser");var t0=[];AE.invalidateUser=function(e){for(let t of t0)try{t(e)}catch(r){J8.error("Error invalidating user",r)}};AE.onInvalidatedUser=function(e){t0.push(e)}});var O_=I((MNe,i0)=>{"use strict";var el=W(),zn=(H(),P(G)),c5=gv(),DNe=Rs(),LNe=So(),l5=yn(),{validateEvent:r0}=ni(),b_=Kn(),u5=require("process"),{resetDatabases:d5}=(De(),P(nt)),f5={[zn.ITC_EVENT_TYPES.SCHEMA]:_5,[zn.ITC_EVENT_TYPES.USER]:s0};async function _5(e){let t=r0(e);if(t){el.error(t);return}el.trace("ITC schemaHandler received schema event:",e),await c5(e.message),await p5(e.message)}a(_5,"schemaHandler");async function p5(e){try{b_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),b_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),b_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=d5();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){el.error(t)}}a(p5,"syncSchemaMetadata");var n0=[];async function s0(e){try{try{b_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),b_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){el.warn(r)}let t=r0(e);if(t){el.error(t);return}el.trace(`ITC userHandler ${zn.HDB_ITC_CLIENT_PREFIX}${u5.pid} received user event:`,e),await l5.setUsersWithRolesCache();for(let r of n0)r()}catch(t){el.error(t)}}a(s0,"userHandler");s0.addListener=function(e){n0.push(e)};i0.exports=f5});var ni=I((kNe,a0)=>{"use strict";var UNe=W(),ab=ae(),h5=(H(),P(G)),{ITC_ERRORS:N_}=Bn(),{parentPort:xNe,threadId:m5,isMainThread:E5,workerData:BNe}=require("worker_threads"),{onMessageFromWorkers:g5,broadcast:HNe,broadcastWithAcknowledgement:S5}=rt();a0.exports={sendItcEvent:T5,validateEvent:o0,SchemaEventMsg:A5,UserEventMsg:R5};var yE;g5(async(e,t)=>{yE=yE||O_(),o0(e),yE[e.type]&&await yE[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function T5(e){return!E5&&e.message&&(e.message.originator=m5),S5(e)}a(T5,"sendItcEvent");function o0(e){if(typeof e!="object")return N_.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||ab.isEmpty(e.type))return N_.MISSING_TYPE;if(!e.hasOwnProperty("message")||ab.isEmpty(e.message))return N_.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||ab.isEmpty(e.message.originator))return N_.MISSING_ORIGIN;if(h5.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return N_.INVALID_EVENT(e.type)}a(o0,"validateEvent");function A5(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(A5,"SchemaEventMsg");function R5(e){this.originator=e}a(R5,"UserEventMsg")});var Ao=I((qNe,d0)=>{"use strict";var c0=(H(),P(G)),GNe=ae(),bE=W(),l0=hv(),Uu,{sendItcEvent:u0}=ni();function y5(e){try{bE.info("signalSchemaChange called with message:",e),Uu=Uu||O_();let t=new l0(c0.ITC_EVENT_TYPES.SCHEMA,e);return Uu.schema(t),u0(t)}catch(t){bE.error(t)}}a(y5,"signalSchemaChange");function b5(e){try{bE.trace("signalUserChange called with message:",e),Uu=Uu||O_();let t=new l0(c0.ITC_EVENT_TYPES.USER,e);return Uu.user(t),u0(t)}catch(t){bE.error(t)}}a(b5,"signalUserChange");d0.exports={signalSchemaChange:y5,signalUserChange:b5}});var OE=I((VNe,_0)=>{"use strict";var f0=ae(),O5=(H(),P(G)),N5=W(),w5=oE(),I5=iE(),C5=Ao(),{SchemaEventMsg:P5}=ni(),D5="already exists in";_0.exports=L5;async function L5(e,t,r){if(f0.isEmptyOrZeroLength(r))return r;let n=[];f0.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 M5(e,t.schema,t.name,i)})),s}a(L5,"lmdbCheckForNewAttributes");async function M5(e,t,r,n){let s=new I5(t,r,n,void 0,!0);e&&(s.hdb_auth_header=e);try{await v5(s)}catch(i){if(typeof i=="object"&&i.message!==void 0&&i.message.includes(D5))N5.warn(`attribute ${t}.${r}.${n} already exists`);else throw i}}a(M5,"createNewAttribute");async function v5(e){let t;return t=await w5(e),C5.signalSchemaChange(new P5(process.pid,O5.OPERATIONS_ENUM.CREATE_ATTRIBUTE,e.schema,e.table,e.attribute)),t}a(v5,"createAttribute")});var xu=I((YNe,p0)=>{"use strict";var cb=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}};p0.exports=cb});var m0=I((zNe,h0)=>{"use strict";var U5=xu(),x5=(H(),P(G)).OPERATIONS_ENUM,lb=class extends U5{static{a(this,"LMDBInsertTransactionObject")}constructor(t,r,n,s,i=void 0){super(x5.INSERT,r,n,s,i),this.records=t}};h0.exports=lb});var g0=I((JNe,E0)=>{"use strict";var B5=xu(),H5=(H(),P(G)).OPERATIONS_ENUM,ub=class extends B5{static{a(this,"LMDBUpdateTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(H5.UPDATE,n,s,i,o),this.records=t,this.original_records=r}};E0.exports=ub});var T0=I((XNe,S0)=>{"use strict";var k5=xu(),F5=(H(),P(G)).OPERATIONS_ENUM,db=class extends k5{static{a(this,"LMDBUpsertTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(F5.UPSERT,n,s,i,o),this.records=t,this.original_records=r}};S0.exports=db});var R0=I((ewe,A0)=>{"use strict";var G5=xu(),q5=(H(),P(G)).OPERATIONS_ENUM,fb=class extends G5{static{a(this,"LMDBDeleteTransactionObject")}constructor(t,r,n,s,i=void 0){super(q5.DELETE,n,s,t,i),this.original_records=r}};A0.exports=fb});var w_=I((nwe,N0)=>{"use strict";var rwe=require("path"),y0=ft(),$5=m0(),V5=g0(),K5=T0(),Y5=R0(),Bu=xt(),b0=ae(),{CONFIG_PARAMS:W5}=(H(),P(G)),O0=ce();O0.initSync();var NE=(H(),P(G)).OPERATIONS_ENUM,{getTransactionAuditStorePath:z5}=Et();N0.exports=j5;async function j5(e,t){if(O0.get(W5.LOGGING_AUDITLOG)===!1)return;let r=z5(e.schema,e.table),n=await y0.openEnvironment(r,e.table,!0),s=J5(e,t);if(!(s===void 0||s.hash_values.length===0)&&n!==void 0){y0.initializeDBIs(n,Bu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,Bu.TRANSACTIONS_DBIS);let i=s.timestamp;return await n.dbis[Bu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].ifNoExists(i,()=>{n.dbis[Bu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].put(i,s),b0.isEmpty(s.user_name)||n.dbis[Bu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].put(s.user_name,i);for(let o=0;o<s.hash_values.length;o++)n.dbis[Bu.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].put(s.hash_values[o],i)})}}a(j5,"writeTransaction");function J5(e,t){let r=b0.isEmpty(e.hdb_user)?void 0:e.hdb_user?.username;if(e.operation===NE.INSERT)return new $5(e.records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===NE.UPDATE)return new V5(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===NE.UPSERT)return new K5(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===NE.DELETE)return new Y5(t.deleted,t.original_records,r,t.txn_time,e.__origin)}a(J5,"createTransactionObject")});var _b=I((owe,w0)=>{"use strict";var Q5=u_(),iwe=xf(),I_=(H(),P(G)),X5=Bf(),Z5=$c().insertRecords,e9=ft(),t9=W(),r9=OE(),{getSchemaPath:n9}=Et(),s9=w_();w0.exports=i9;async function i9(e){try{let{schema_table:t,attributes:r}=Q5(e);X5(e,r,t.hash_attribute),e.schema!==I_.SYSTEM_SCHEMA_NAME&&(r.includes(I_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(I_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(I_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(I_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await r9(e.hdb_auth_header,t,r),s=n9(e.schema,e.table),i=await e9.openEnvironment(s,e.table),o=await Z5(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await s9(e,o)}catch(c){t9.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(i9,"lmdbCreateRecords")});var P0=I((cwe,C0)=>{"use strict";var I0=(H(),P(G)),o9=_b(),a9=xf(),c9=require("fs-extra"),{getSchemaPath:l9}=Et();C0.exports=u9;async function u9(e){let t=[{name:e.schema,createddate:Date.now()}],r=new a9(I0.SYSTEM_SCHEMA_NAME,I0.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,void 0,t);await o9(r),await c9.mkdirp(l9(e.schema))}a(u9,"lmdbCreateSchema")});var L0=I((uwe,D0)=>{"use strict";var pb=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}};D0.exports=pb});var x0=I((hwe,U0)=>{"use strict";var M0=ft(),hb=pn(),mb=Bn().LMDB_ERRORS_ENUM,d9=xt(),v0=W(),fwe=ae(),f9=require("lmdb"),_9=L0(),p9=(H(),P(G)),{OVERFLOW_MARKER:_we,MAX_SEARCH_KEY_LENGTH:pwe}=d9,h9=p9.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function m9(e,t,r,n){if(hb.validateEnv(e),t===void 0)throw new Error(mb.HASH_ATTRIBUTE_REQUIRED);if(!Array.isArray(r))throw r===void 0?new Error(mb.IDS_REQUIRED):new Error(mb.IDS_MUST_BE_ITERABLE);try{let s=M0.listDBIs(e);M0.initializeDBIs(e,t,s);let i=new _9,o,c=[],l=[];for(let p=0,_=r.length;p<_;p++)try{o=r[p];let h=e.dbis[t].get(o);if(!h||n&&h[h9]>n){i.skipped.push(o);continue}let S=e.dbis[t].ifVersion(o,f9.IF_EXISTS,()=>{e.dbis[t].remove(o);for(let g=0;g<s.length;g++){let R=s[g];if(!h.hasOwnProperty(R)||R===t)continue;let E=e.dbis[R],A=h[R];if(A!=null)try{let N=hb.getIndexedValues(A);if(N)for(let v=0,F=N.length;v<F;v++)E.remove(N[v],o)}catch{v0.warn(`cannot delete from attribute: ${R}, ${A}:${o}`)}}});c.push(S),l.push(o),i.original_records.push(h)}catch(h){v0.warn(h),i.skipped.push(o)}let u=[],f=await Promise.all(c);for(let p=0,_=f.length;p<_;p++)f[p]===!0?i.deleted.push(l[p]):(i.skipped.push(l[p]),u.push(p));let d=0;for(let p=0;p<u.length;p++){let _=u[p];i.original_records.splice(_-d,1),d++}return i.txn_time=hb.getNextMonotonicTime(),i}catch(s){throw s}}a(m9,"deleteRecords");U0.exports={deleteRecords:m9}});var C_=I((Ewe,H0)=>{"use strict";var Hu=ae(),E9=x0(),g9=ft(),{getSchemaPath:S9}=Et(),T9=w_(),A9=W();H0.exports=R9;async function R9(e,t=!0){let n=global.hdb_schema[e.schema][e.table].hash_attribute;if(Hu.isEmpty(n))throw new Error(`could not retrieve hash attribute for schema:${e.schema} and table ${e.table}`);try{if(Hu.isEmptyOrZeroLength(e.hash_values)&&!Hu.isEmptyOrZeroLength(e.records)){e.hash_values=[];for(let c=0;c<e.records.length;c++){let l=e.records[c][n];Hu.isEmpty(l)||e.hash_values.push(l)}}if(Hu.isEmptyOrZeroLength(e.hash_values))return B0([],[]);if(!Array.isArray(e.hash_values))throw new Error("hash_values must be an array");if(Hu.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=S9(e.schema,e.table),i=await g9.openEnvironment(s,e.table),o=await E9.deleteRecords(i,n,e.hash_values,e.__origin?.timestamp);try{t===!0&&await T9(e,o)}catch(c){A9.error(`unable to write transaction due to ${c.message}`)}return B0(o.deleted,o.skipped,o.txn_time)}catch(s){throw s}}a(R9,"lmdbDeleteRecords");function B0(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(B0,"createDeleteResponse")});var gb=I((Twe,k0)=>{"use strict";var y9=(H(),P(G)),Swe=pn();function Eb(e,t){let r=Object.create(null);if(t.length===1&&y9.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(Eb,"parseRow");function b9(e,t,r,n){let s=Eb(r,e);n.push(s)}a(b9,"searchAll");function O9(e,t,r,n){let s=Eb(r,e);n[t]=s}a(O9,"searchAllToMap");function N9(e,t,r){r[e]===void 0&&(r[e]=[]),r[e].push(t)}a(N9,"iterateDBI");function tl(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(tl,"pushResults");function w9(e,t,r,n,s,i){t.toString().endsWith(e)&&tl(t,r,n,s,i)}a(w9,"endsWith");function I9(e,t,r,n,s,i){t.toString().includes(e)&&tl(t,r,n,s,i)}a(I9,"contains");function C9(e,t,r,n,s,i){t>e&&tl(t,r,n,s,i)}a(C9,"greaterThanCompare");function P9(e,t,r,n,s,i){t>=e&&tl(t,r,n,s,i)}a(P9,"greaterThanEqualCompare");function D9(e,t,r,n,s,i){t<e&&tl(t,r,n,s,i)}a(D9,"lessThanCompare");function L9(e,t,r,n,s,i){t<=e&&tl(t,r,n,s,i)}a(L9,"lessThanEqualCompare");k0.exports={parseRow:Eb,searchAll:b9,searchAllToMap:O9,iterateDBI:N9,endsWith:w9,contains:I9,greaterThanCompare:C9,greaterThanEqualCompare:P9,lessThanCompare:D9,lessThanEqualCompare:L9,pushResults:tl}});var ku=I((Owe,Y0)=>{"use strict";var Ia=ft(),Rwe=W(),jn=pn(),wE=xt(),Wt=Bn().LMDB_ERRORS_ENUM,ywe=ae(),M9=(H(),P(G)),IE=gb(),{parseRow:v9}=IE,bwe=require("lmdb"),{OVERFLOW_MARKER:F0,MAX_SEARCH_KEY_LENGTH:U9}=wE;function G0(e,t,r,n=!1,s=void 0,i=void 0){return rl(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(G0,"iterateFullIndex");function P_(e,t,r,n,s,i=!1,o=void 0,c=void 0,l=!1,u=!1){return rl(e,t,r,(f,d,p,_)=>{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(A=>({value:A}))):d.getRange(E)})}a(P_,"iterateRangeBetween");function rl(e,t,r,n){let s=e.database||e,i=Ia.openDBI(s,r);i[wE.DBI_DEFINITION_NAME].is_hash_attribute?t=r:t&&Ia.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(rl,"setupTransaction");function q0(e,t,r,n){let s;return function(i,o){if(typeof i=="string"&&i.endsWith(F0)){if(!s)if(r)s=Ia.openDBI(e,r);else{let l=Ia.listDBIs(e);for(let u=0,f=l.length;u<f&&(s=Ia.openDBI(e,l[u]),!s[wE.DBI_DEFINITION_NAME].is_hash_attribute);u++);}i=s.get(o,{transaction:t,lazy:!0})[n]}return i}}a(q0,"getOverflowCheck");function x9(e,t,r,n=!1,s=void 0,i=void 0){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);return rl(e,t,t,(o,c,l)=>(CE(r),r=D_(l,r),c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}).map(u=>v9(u.value,r))))}a(x9,"searchAll");function B9(e,t,r,n=!1,s=void 0,i=void 0){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);CE(r),r=D_(e.database||e,r);let o=new Map;for(let{key:c,value:l}of G0(e,t,t,n,s,i))o.set(c,IE.parseRow(l,r));return o}a(B9,"searchAllToMap");function H9(e,t,r=!1,n=void 0,s=void 0){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.ATTRIBUTE_REQUIRED);let i=Object.create(null),o=G0(e,void 0,t,r,n,s),c=o.transaction,l=q0(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(H9,"iterateDBI");function k9(e,t){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);return Ia.statDBI(e,t).entryCount}a(k9,"countAll");function F9(e,t,r,n,s=!1,i=void 0,o=void 0){return Ca(e,r,n),rl(e,t,r,(c,l,u,f)=>(n=jn.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(F9,"equals");function G9(e,t,r){return Ca(e,t,r),Ia.openDBI(e,t).getValuesCount(r)}a(G9,"count");function q9(e,t,r,n,s=!1,i=void 0,o=void 0){return Ca(e,r,n),rl(e,null,r,(c,l)=>{n=jn.convertKeyValueToWrite(n);let u=!0;typeof n=="number"&&(u=!1);let f;if(s===!0){let d;for(let p of l.getKeys({transaction:c,start:n}))if(!p.startsWith(n)){d=p;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(p=>{let{key:_}=p;if(_!==d){if(_.toString().startsWith(n))return p;if(u===!0)return f.DONE}}),f.filter(p=>p)}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(q9,"startsWith");function $9(e,t,r,n,s=!1,i=void 0,o=void 0){return $0(e,t,r,n,s,i,o,!0)}a($9,"endsWith");function $0(e,t,r,n,s=!1,i=void 0,o=void 0,c=!1){return Ca(e,r,n),rl(e,null,r,(l,u,f,d)=>{let p=q0(f,l,d,r);return o=Number.isInteger(o)?o:0,u.getKeys({transaction:l,end:s?!1:void 0,reverse:s}).flatMap(_=>{let h=_.toString();return h.endsWith(F0)?u.getValues(_,{transaction:l}).map(S=>{let g=p(_,S);if(c?g.endsWith(n):g.includes(n))return{key:g,value:S}}).filter(S=>S):(c?h.endsWith(n):h.includes(n))?u[wE.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($0,"contains");function V9(e,t,r,n,s=!1,i=void 0,o=void 0){Ca(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),P_(e,t,r,n,l,s,i,o,!0,!1)}a(V9,"greaterThan");function K9(e,t,r,n,s=!1,i=void 0,o=void 0){Ca(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),P_(e,t,r,n,l,s,i,o,!1,!1)}a(K9,"greaterThanEqual");function Y9(e,t,r,n,s=!1,i=void 0,o=void 0){Ca(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),P_(e,t,r,l,n,s,i,o,!1,!0)}a(Y9,"lessThan");function W9(e,t,r,n,s=!1,i=void 0,o=void 0){Ca(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),P_(e,t,r,l,n,s,i,o,!1,!1)}a(W9,"lessThanEqual");function z9(e,t,r,n,s,i=!1,o=void 0,c=void 0){if(jn.validateEnv(e),r===void 0)throw new Error(Wt.ATTRIBUTE_REQUIRED);if(n===void 0)throw new Error(Wt.START_VALUE_REQUIRED);if(s===void 0)throw new Error(Wt.END_VALUE_REQUIRED);if(n=jn.convertKeyValueToWrite(n),s=jn.convertKeyValueToWrite(s),n>s)throw new Error(Wt.END_VALUE_MUST_BE_GREATER_THAN_START_VALUE);return P_(e,t,r,n,s,i,o,c)}a(z9,"between");function j9(e,t,r,n){jn.validateEnv(e);let s=e.database||e,i=e.database?e:null;if(t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);if(CE(r),r=D_(s,r),n===void 0)throw new Error(Wt.ID_REQUIRED);let o=null,c=s.dbis[t].get(n,{transaction:i,lazy:r.length<3});return c&&(o=IE.parseRow(c,r)),o}a(j9,"searchByHash");function J9(e,t,r){jn.validateEnv(e);let n=e.database||e,s=e.database?e:null;if(t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(Wt.ID_REQUIRED);let i=!0;return n.dbis[t].get(r,{transaction:s,lazy:!0})===void 0&&(i=!1),i}a(J9,"checkHashExists");function Q9(e,t,r,n,s=[]){return K0(e,t,r,n,s),V0(e,t,r,n,s).map(i=>i[1])}a(Q9,"batchSearchByHash");function X9(e,t,r,n,s=[]){K0(e,t,r,n,s);let i=new Map;for(let[o,c]of V0(e,t,r,n,s))i.set(o,c);return i}a(X9,"batchSearchByHashToMap");function V0(e,t,r,n,s=[]){return rl(e,t,t,(i,o,c)=>{r=D_(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,IE.parseRow(f,r)];s.push(u)}).filter(u=>u)})}a(V0,"batchHashSearch");function K0(e,t,r,n,s){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.HASH_ATTRIBUTE_REQUIRED);if(CE(r),n==null)throw new Error(Wt.IDS_REQUIRED);if(!n[Symbol.iterator])throw new Error(Wt.IDS_MUST_BE_ITERABLE)}a(K0,"initializeBatchSearchByHash");function CE(e){if(!Array.isArray(e))throw e===void 0?new Error(Wt.FETCH_ATTRIBUTES_REQUIRED):new Error(Wt.FETCH_ATTRIBUTES_MUST_BE_ARRAY)}a(CE,"validateFetchAttributes");function Ca(e,t,r){if(jn.validateEnv(e),t===void 0)throw new Error(Wt.ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(Wt.SEARCH_VALUE_REQUIRED);if(r?.length>U9)throw new Error(Wt.SEARCH_VALUE_TOO_LARGE)}a(Ca,"validateComparisonFunctions");function D_(e,t){return t.length===1&&M9.SEARCH_WILDCARDS.indexOf(t[0])>=0&&(t=Ia.listDBIs(e)),t}a(D_,"setGetWholeRowAttributes");Y0.exports={searchAll:x9,searchAllToMap:B9,count:G9,countAll:k9,equals:F9,startsWith:q9,endsWith:$9,contains:$0,searchByHash:j9,setGetWholeRowAttributes:D_,batchSearchByHash:Q9,batchSearchByHashToMap:X9,checkHashExists:J9,iterateDBI:H9,greaterThan:V9,greaterThanEqual:K9,lessThan:Y9,lessThanEqual:W9,between:z9}});var Fu=I((wwe,Q0)=>{var W0=require("lodash"),z0=it(),ke=require("joi"),Z9=ae(),{hdb_schema_table:L_,checkValidTable:j0,hdb_table:J0,hdb_database:PE}=Li(),{handleHDBError:e7,hdb_errors:t7}=pe(),{getDatabases:r7}=(De(),P(nt)),{HTTP_STATUS_CODES:n7}=t7,s7=ke.object({database:PE,schema:PE,table:J0,search_attribute:L_,search_value:ke.any().required(),get_attributes:ke.array().min(1).items(ke.alternatives(L_,ke.object())).optional(),desc:ke.bool(),limit:ke.number().integer().min(1),offset:ke.number().integer().min(0)}),i7=ke.object({database:PE,schema:PE,table:J0,operator:ke.string().valid("and","or").default("and").lowercase(),offset:ke.number().integer().min(0),limit:ke.number().integer().min(1),get_attributes:ke.array().min(1).items(ke.alternatives(L_,ke.object())).optional(),sort:ke.object({attribute:ke.alternatives(L_,ke.array().min(1)),descending:ke.bool().optional()}).optional(),conditions:ke.array().min(1).items(ke.alternatives(ke.object({operator:ke.string().valid("and","or").default("and").lowercase(),conditions:ke.array()}),ke.object({search_attribute:ke.alternatives(L_,ke.array().min(1)),search_type:ke.string().valid("equals","contains","starts_with","ends_with","greater_than","greater_than_equal","less_than","less_than_equal","between","not_equal").optional(),search_value:ke.when("search_type",{switch:[{is:"equals",then:ke.any()},{is:"between",then:ke.array().items(ke.alternatives([ke.string(),ke.number()])).length(2)}],otherwise:ke.alternatives(ke.string(),ke.number())}).required()}))).required()});Q0.exports=function(e,t){let r=null;switch(t){case"value":r=z0.validateBySchema(e,s7);break;case"hashes":let i=function(o){s?s+=". "+o:s=o};var n=i;a(i,"addError");let s;i(j0("database",e.schema)),i(j0("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=z0.validateBySchema(e,i7);break;default:throw new Error(`Error validating search, unknown type: ${t}`)}if(!r&&e.schema!=="system"){let s=Z9.checkGlobalSchemaTable(e.schema,e.table);if(s)return e7(new Error,s,n7.NOT_FOUND);let o=r7()[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,p=f.conditions.length;d<p;d++){let _=f.conditions[d];_.conditions?l(_):c.push(_.search_attribute)}},"addConditions");t==="conditions"&&l(e);let u=W0.filter(c,f=>f!=="*"&&!f.startsWith?.("$")&&f.attribute!=="*"&&!Array.isArray(f)&&!f.name&&!W0.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 Sb=I((Cwe,X0)=>{"use strict";var o7=ft(),a7=Fu(),{getSchemaPath:c7}=Et();X0.exports=l7;function l7(e){let t=a7(e,"hashes");if(t)throw t;let r=c7(e.schema,e.table);return o7.openEnvironment(r,e.table)}a(l7,"initialize")});var Tb=I((Dwe,Z0)=>{"use strict";var u7=ku(),d7=Sb();Z0.exports=f7;async function f7(e){let t=await d7(e),r=t.useReadTransaction();r.database=t;let n=global.hdb_schema[e.schema][e.table];try{return u7.batchSearchByHashToMap(r,n.hash_attribute,e.get_attributes,e.hash_values)}finally{r.done()}}a(f7,"lmdbGetDataByHash")});var Gu=I((Mwe,ex)=>{"use strict";var Ab=class{static{a(this,"SearchByHashObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.hash_values=n,this.get_attributes=s}};ex.exports=Ab});var rx=I((xwe,tx)=>{"use strict";var Uwe=Gu(),_7=ku(),p7=Sb();tx.exports=h7;async function h7(e){let t=await p7(e),r=global.hdb_schema[e.schema][e.table];return _7.batchSearchByHash(t,r.hash_attribute,e.get_attributes,e.hash_values)}a(h7,"lmdbSearchByHash")});var si=I((Hwe,nx)=>{"use strict";var Rb=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}};nx.exports=Rb});var DE=I((Fwe,lx)=>{"use strict";var Jr=ku(),m7=ft(),E7=ae(),Fe=xt(),nl=(H(),P(G)),g7=ho(),sx=Bn().LMDB_ERRORS_ENUM,{getSchemaPath:S7}=Et(),Ro=nl.SEARCH_WILDCARDS;async function T7(e,t,r){let n;e.schema===nl.SYSTEM_SCHEMA_NAME?n=g7[e.table]:n=global.hdb_schema[e.schema][e.table];let s=cx(e,n.hash_attribute,r,t);return ox(e,s,n.hash_attribute,r)}a(T7,"prepSearch");async function ox(e,t,r,n){let s=S7(e.schema,e.table),i=await m7.openEnvironment(s,e.table),o=ax(i,e,t,r),c=o.transaction||i;if([Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH,Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP,Fe.SEARCH_TYPES.SEARCH_ALL,Fe.SEARCH_TYPES.SEARCH_ALL_TO_MAP].indexOf(t)>=0)return o;if(A7(e,r)===!1){let f=e.search_attribute;if(f===r)return n?ix(o,()=>!0):o.map(p=>({[r]:p.key}));let d=a(p=>({[r]:p.value,[f]:p.key}),"toObject");return n?ix(o,d):o.map(d)}let u=e.search_attribute===r?o.map(f=>f.key):o.map(f=>f.value);return n===!0?Jr.batchSearchByHashToMap(c,r,e.get_attributes,u):Jr.batchSearchByHash(c,r,e.get_attributes,u)}a(ox,"executeSearch");function ax(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 Fe.SEARCH_TYPES.EQUALS:s=Jr.equals(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.CONTAINS:s=Jr.contains(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.ENDS_WITH:case Fe.SEARCH_TYPES._ENDS_WITH:s=Jr.endsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.STARTS_WITH:case Fe.SEARCH_TYPES._STARTS_WITH:s=Jr.startsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:return Jr.batchSearchByHash(e,t.search_attribute,t.get_attributes,[t.search_value]);case Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:return Jr.batchSearchByHashToMap(e,t.search_attribute,t.get_attributes,[t.search_value]);case Fe.SEARCH_TYPES.SEARCH_ALL:return Jr.searchAll(e,n,t.get_attributes,o,c,l);case Fe.SEARCH_TYPES.SEARCH_ALL_TO_MAP:return Jr.searchAllToMap(e,n,t.get_attributes,o,c,l);case Fe.SEARCH_TYPES.BETWEEN:s=Jr.between(e,i,t.search_attribute,t.search_value,t.end_value,o,c,l);break;case Fe.SEARCH_TYPES.GREATER_THAN:case Fe.SEARCH_TYPES._GREATER_THAN:s=Jr.greaterThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.GREATER_THAN_EQUAL:case Fe.SEARCH_TYPES._GREATER_THAN_EQUAL:s=Jr.greaterThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.LESS_THAN:case Fe.SEARCH_TYPES._LESS_THAN:s=Jr.lessThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case Fe.SEARCH_TYPES.LESS_THAN_EQUAL:case Fe.SEARCH_TYPES._LESS_THAN_EQUAL:s=Jr.lessThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;default:return Object.create(null)}return s}a(ax,"searchByType");function ix(e,t){let r=new Map;for(let n of e)r.set(n.value,t(n));return r}a(ix,"createMapFromIterable");function A7(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(A7,"checkToFetchMore");function cx(e,t,r,n){if(E7.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),Ro.indexOf(s)>-1)return r===!0?Fe.SEARCH_TYPES.SEARCH_ALL_TO_MAP:Fe.SEARCH_TYPES.SEARCH_ALL;if(s.indexOf(Ro[0])<0&&s.indexOf(Ro[1])<0)return c===!0?r===!0?Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:Fe.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:Fe.SEARCH_TYPES.EQUALS;if(Ro.indexOf(i)>=0&&Ro.indexOf(o)>=0)return e.search_value=e.search_value.slice(1,-1),Fe.SEARCH_TYPES.CONTAINS;if(Ro.indexOf(i)>=0)return e.search_value=e.search_value.substr(1),Fe.SEARCH_TYPES.ENDS_WITH;if(Ro.indexOf(o)>=0)return e.search_value=e.search_value.slice(0,-1),Fe.SEARCH_TYPES.STARTS_WITH;if(s.includes(Ro[0])||s.includes(Ro[1]))return Fe.SEARCH_TYPES.EQUALS;throw new Error(sx.UNKNOWN_SEARCH_TYPE)}else switch(n){case nl.VALUE_SEARCH_COMPARATORS.BETWEEN:return Fe.SEARCH_TYPES.BETWEEN;case nl.VALUE_SEARCH_COMPARATORS.GREATER:return Fe.SEARCH_TYPES.GREATER_THAN;case nl.VALUE_SEARCH_COMPARATORS.GREATER_OR_EQ:return Fe.SEARCH_TYPES.GREATER_THAN_EQUAL;case nl.VALUE_SEARCH_COMPARATORS.LESS:return Fe.SEARCH_TYPES.LESS_THAN;case nl.VALUE_SEARCH_COMPARATORS.LESS_OR_EQ:return Fe.SEARCH_TYPES.LESS_THAN_EQUAL;default:throw new Error(sx.UNKNOWN_SEARCH_TYPE)}}a(cx,"createSearchTypeFromSearchObject");lx.exports={executeSearch:ox,createSearchTypeFromSearchObject:cx,prepSearch:T7,searchByType:ax}});var dx=I(($we,ux)=>{"use strict";var qwe=si(),R7=Fu(),y7=ae(),b7=(H(),P(G)),O7=DE();ux.exports=N7;function N7(e,t){if(!y7.isEmpty(t)&&b7.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=R7(e,"value");if(n)throw n;return O7.prepSearch(e,t,!0)}a(N7,"lmdbGetDataByValue")});var M_=I((Ywe,fx)=>{"use strict";var Kwe=si(),w7=Fu(),I7=ae(),C7=(H(),P(G)),P7=DE();fx.exports=D7;async function D7(e,t){if(!I7.isEmpty(t)&&C7.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=w7(e,"value");if(n)throw n;return P7.prepSearch(e,t,!1)}a(D7,"lmdbSearchByValue")});var px=I((jwe,_x)=>{"use strict";var zwe=xt(),yb=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}},bb=class{static{a(this,"SearchCondition")}constructor(t,r,n){this.search_attribute=t,this.search_type=r,this.search_value=n}},Ob=class{static{a(this,"SortAttribute")}constructor(t,r){this.attribute=t,this.desc=r}};_x.exports={SearchByConditionsObject:yb,SearchCondition:bb,SortAttribute:Ob}});var Sx=I((Zwe,gx)=>{"use strict";var Qwe=px().SearchByConditionsObject,L7=si(),M7=Fu(),Nb=ku(),LE=xt(),{Resource:Xwe}=(ga(),P(SR)),Ex=DE(),v7=gb(),U7=require("lodash"),{getSchemaPath:x7}=Et(),hx=ft(),{handleHDBError:B7,hdb_errors:H7}=pe(),{HTTP_STATUS_CODES:k7}=H7,F7=1e8;gx.exports=G7;async function G7(e){let t=M7(e,"conditions");if(t)throw B7(t,t.message,k7.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=x7(e.schema,e.table),n=await hx.openEnvironment(r,e.table),s=global.hdb_schema[e.schema][e.table];for(let u of e.conditions)hx.openDBI(n,u.search_attribute);let i=U7.sortBy(e.conditions,u=>{if(u.estimated_count===void 0){let f=u.search_type;f===LE.SEARCH_TYPES.EQUALS?u.estimated_count=Nb.count(n,u.search_attribute,u.search_value):f===LE.SEARCH_TYPES.CONTAINS||f===LE.SEARCH_TYPES.ENDS_WITH?u.estimated_count=1/0:u.estimated_count=F7}return u.estimated_count}),o=n.useReadTransaction();o.database=n;let c=await mx(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(Ex.filterByType),d=f.length,p=Nb.setGetWholeRowAttributes(n,e.get_attributes);l=c.map(_=>u.get(_,{transaction:o,lazy:!0})),d>0&&(l=l.filter(_=>{for(let h=0;h<d;h++)if(!f[h](_))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(_=>v7.parseRow(_,p))}else{for(let d=1;d<i.length;d++){let p=i[d],_=await mx(o,e,p,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=Nb.batchSearchByHash(o,s.hash_attribute,e.get_attributes,c)}return l.onDone=()=>{o.done()},l}a(G7,"lmdbSearchByConditions");async function mx(e,t,r,n){let s=new L7(t.schema,t.table,void 0,void 0,n,t.get_attributes),i=r.search_type;return s.search_attribute=r.search_attribute,i===LE.SEARCH_TYPES.BETWEEN?(s.search_value=r.search_value[0],s.end_value=r.search_value[1]):s.search_value=r.search_value,Ex.searchByType(e,s,i,n).map(o=>o.value)}a(mx,"executeConditionSearch")});var v_=I((tIe,Tx)=>{"use strict";var q7=(H(),P(G)).OPERATIONS_ENUM,wb=class{static{a(this,"DeleteObject")}constructor(t,r,n,s=void 0){this.operation=q7.DELETE,this.schema=t,this.table=r,this.hash_values=n,this.__origin=s}};Tx.exports=wb});var Ib=I((nIe,Ix)=>{"use strict";var bx=si(),Ox=v_(),Nx=M_(),wx=C_(),On=(H(),P(G)),Ax=ae(),Rx=ft(),{getTransactionAuditStorePath:$7,getSchemaPath:V7}=Et(),yx=W();Ix.exports=K7;async function K7(e){try{if(Ax.isEmpty(global.hdb_schema[e.schema])||Ax.isEmpty(global.hdb_schema[e.schema][e.table]))throw new Error(`unknown schema:${e.schema} and table ${e.table}`);await Y7(e),await W7(e);let t=V7(e.schema,e.table);try{await Rx.deleteEnvironment(t,e.table)}catch(r){if(r.message==="invalid environment")yx.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}try{let r=$7(e.schema,e.table);await Rx.deleteEnvironment(r,e.table,!0)}catch(r){if(r.message==="invalid environment")yx.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}}catch(t){throw t}}a(K7,"lmdbDropTable");async function Y7(e){let t=new bx(On.SYSTEM_SCHEMA_NAME,On.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r=Array.from(await Nx(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 Ox(On.SYSTEM_SCHEMA_NAME,On.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,n);await wx(s)}a(Y7,"deleteAttributesFromSystem");async function W7(e){let t=new bx(On.SYSTEM_SCHEMA_NAME,On.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,e.table,void 0,[On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,On.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r,n;try{r=Array.from(await Nx(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 Ox(On.SYSTEM_SCHEMA_NAME,On.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,[n.id]);try{await wx(s)}catch(i){throw i}}a(W7,"dropTableFromSystem")});var Px=I((iIe,Cx)=>{"use strict";var z7=require("fs-extra"),j7=si(),J7=Gu(),Q7=v_(),X7=Ib(),Z7=C_(),eee=Tb(),tee=M_(),yo=(H(),P(G)),{getSchemaPath:ree}=Et(),{handleHDBError:nee,hdb_errors:see}=pe(),{HDB_ERROR_MSGS:iee,HTTP_STATUS_CODES:oee}=see;Cx.exports=aee;async function aee(e){let t;try{t=await cee(e.schema);let r=new j7(yo.SYSTEM_SCHEMA_NAME,yo.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,yo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,t,void 0,[yo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),n=Array.from(await tee(r));for(let o=0;o<n.length;o++){let c={schema:t,table:n[o].name};try{await X7(c)}catch(l){if(l.message!=="invalid environment")throw l}}let s=new Q7(yo.SYSTEM_SCHEMA_NAME,yo.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[t]);await Z7(s);let i=ree(t);await z7.remove(i)}catch(r){throw r}}a(aee,"lmdbDropSchema");async function cee(e){let t=new J7(yo.SYSTEM_SCHEMA_NAME,yo.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[e],[yo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),r,n;try{r=Array.from(await eee(t))}catch(s){throw s}for(let[,s]of r)s.name===e&&(n=e);if(!n)throw nee(new Error,iee.SCHEMA_NOT_FOUND(e),oee.NOT_FOUND,void 0,void 0,!0);return n}a(cee,"validateDropSchema")});var U_=I((aIe,Dx)=>{"use strict";var Cb=class{static{a(this,"CreateTableObject")}constructor(t,r,n){this.schema=t,this.table=r,this.hash_attribute=n}};Dx.exports=Cb});var Db=I((uIe,Lx)=>{"use strict";var lee=require("fs-extra"),ME=ft(),{getTransactionAuditStorePath:uee}=Et(),Pb=xt(),lIe=U_();Lx.exports=dee;async function dee(e){let t;try{let r=uee(e.schema,e.table);await lee.mkdirp(r),t=await ME.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{ME.createDBI(t,Pb.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,!1,!0),ME.createDBI(t,Pb.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,!0,!1),ME.createDBI(t,Pb.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(dee,"createTransactionsAuditEnvironment")});var Ux=I((_Ie,vx)=>{"use strict";var Lb=(H(),P(G)),Mx=ft(),fee=$c(),{getSystemSchemaPath:_ee,getSchemaPath:pee}=Et(),fIe=ho(),hee=oE(),Mb=iE(),mee=W(),Eee=Db();vx.exports=gee;async function gee(e,t){let r=pee(t.schema,t.table),n=new Mb(t.schema,t.table,Lb.TIME_STAMP_NAMES_ENUM.CREATED_TIME,void 0,!0),s=new Mb(t.schema,t.table,Lb.TIME_STAMP_NAMES_ENUM.UPDATED_TIME,void 0,!0),i=new Mb(t.schema,t.table,t.hash_attribute,void 0,!1,!0);try{if(await Mx.createEnvironment(r,t.table),e!==void 0){let o=await Mx.openEnvironment(_ee(),Lb.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME);await fee.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 vb(n),await vb(s),await vb(i)}await Eee(t)}catch(o){throw o}}a(gee,"lmdbCreateTable");async function vb(e){try{await hee(e)}catch(t){mee.warn(`failed to create attribute ${e.attribute} due to ${t.message}`)}}a(vb,"createAttribute")});var Bx=I((hIe,xx)=>{"use strict";var See=u_(),Tee=Bf(),Aee=OE(),x_=(H(),P(G)),Ree=$c().updateRecords,yee=ft(),{getSchemaPath:bee}=Et(),Oee=w_(),Nee=W();xx.exports=wee;async function wee(e){try{let{schema_table:t,attributes:r}=See(e);Tee(e,r,t.hash_attribute),e.schema!==x_.SYSTEM_SCHEMA_NAME&&(r.includes(x_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(x_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(x_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(x_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await Aee(e.hdb_auth_header,t,r),s=bee(e.schema,e.table),i=await yee.openEnvironment(s,e.table),o=await Ree(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await Oee(e,o)}catch(c){Nee.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(wee,"lmdbUpdateRecords")});var kx=I((EIe,Hx)=>{"use strict";var Iee=(H(),P(G)).OPERATIONS_ENUM,Ub=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Iee.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};Hx.exports=Ub});var Gx=I((TIe,Fx)=>{"use strict";var SIe=kx(),Cee=u_(),Pee=Bf(),Dee=OE(),B_=(H(),P(G)),Lee=$c().upsertRecords,Mee=ft(),{getSchemaPath:vee}=Et(),Uee=w_(),xee=W(),{handleHDBError:Bee,hdb_errors:Hee}=pe();Fx.exports=kee;async function kee(e){let t;try{t=Cee(e)}catch(l){throw Bee(l,l.message,Hee.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}let{schema_table:r,attributes:n}=t;Pee(e,n,r.hash_attribute),e.schema!==B_.SYSTEM_SCHEMA_NAME&&(n.includes(B_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||n.push(B_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),n.includes(B_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||n.push(B_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let s=await Dee(e.hdb_auth_header,r,n),i=vee(e.schema,e.table),o=await Mee.openEnvironment(i,e.table),c=await Lee(o,r.hash_attribute,n,e.records,e.__origin?.timestamp);try{await Uee(e,c)}catch(l){xee.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(kee,"lmdbUpsertRecords")});var $x=I((RIe,qx)=>{"use strict";var xb=class{static{a(this,"DeleteBeforeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.timestamp=n}};qx.exports=xb});var Kx=I((bIe,Vx)=>{"use strict";var Bb=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}};Vx.exports=Bb});var zx=I((wIe,Wx)=>{"use strict";var Hb=ft(),{getTransactionAuditStorePath:Fee}=Et(),NIe=$x(),H_=xt(),Gee=ae(),Yx=Kx(),qee=require("util").promisify,$ee=qee(setTimeout),Vee=1e4,Kee=100;Wx.exports=Yee;async function Yee(e){let t=Fee(e.schema,e.table),r=await Hb.openEnvironment(t,e.table,!0),n=Hb.listDBIs(r);Hb.initializeDBIs(r,H_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s,i=new Yx;do s=await Wee(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 $ee(Kee);while(s.transactions_deleted>0);return i}a(Yee,"deleteAuditLogsBefore");async function Wee(e,t){let r=new Yx;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];Gee.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>Vee)break}return await s,r}catch(n){throw n}}a(Wee,"deleteTransactions")});var Jx=I((CIe,jx)=>{"use strict";var kb=class{static{a(this,"DropAttributeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.attribute=n}};jx.exports=kb});var Xx=I((LIe,Qx)=>{"use strict";var zee=si(),jee=v_(),DIe=Jx(),Hi=(H(),P(G)),Jee=ae(),Fb=ft(),Qee=ho(),Xee=M_(),Zee=C_(),{getSchemaPath:ete}=Et();Qx.exports=tte;async function tte(e,t=!0){let r;e.schema===Hi.SYSTEM_SCHEMA_NAME?r=Qee[e.table]:r=global.hdb_schema[e.schema][e.table];let n=await nte(e),s=ete(e.schema,e.table),i=await Fb.openEnvironment(s,e.table);return t===!0&&await rte(e,i,r.hash_attribute),Fb.dropDBI(i,e.attribute),n}a(tte,"lmdbDropAttribute");async function rte(e,t,r){let n=Fb.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(rte,"removeAttributeFromAllObjects");async function nte(e){let t=new zee(Hi.SYSTEM_SCHEMA_NAME,Hi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,Hi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[Hi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY,Hi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]),n=Array.from(await Xee(t)).filter(o=>o[Hi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]===e.attribute);if(Jee.isEmptyOrZeroLength(n))throw new Error(`Attribute '${e.attribute}' was not found in '${e.schema}.${e.table}'`);let s=n.map(o=>o[Hi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),i=new jee(Hi.SYSTEM_SCHEMA_NAME,Hi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,s);return Zee(i)}a(nte,"dropAttributeFromSystem")});var sB=I((UIe,nB)=>{"use strict";var Gb=ft(),qu=xt(),vIe=pn(),qb=(H(),P(G)),Zx=ae(),{getTransactionAuditStorePath:ste}=Et(),ite=ku(),vE=xu(),ote=W();nB.exports=ate;async function ate(e){let t=ste(e.schema,e.table),r=await Gb.openEnvironment(t,e.table,!0),n=Gb.listDBIs(r);Gb.initializeDBIs(r,qu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s;switch(e.search_type){case qb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.TIMESTAMP:return eB(r,e.search_values);case qb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:return s=global.hdb_schema[e.schema][e.table].hash_attribute,lte(r,e.search_values,s);case qb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME:return cte(r,e.search_values);default:return eB(r)}}a(ate,"readAuditLog");function eB(e,t=[0,Date.now()]){Zx.isEmpty(t[0])&&(t[0]=0),Zx.isEmpty(t[1])&&(t[1]=Date.now());let r=e.dbis[qu.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 vE,s))}a(eB,"searchTransactionsByTimestamp");function cte(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[qu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].getValues(s))i.push(o);r.set(s,rB(e,i))}return Object.fromEntries(r)}a(cte,"searchTransactionsByUsername");function lte(e,t,r){let n=new Map;for(let c=0,l=t.length;c<l;c++){let u=t[c],f=ite.equals(e,qu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,qu.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,u);for(let{value:d}of f){let p=Number(d);n.has(p)?n.get(p).push(u.toString()):n.set(p,[u.toString()])}}let s=Array.from(n.keys()),i=rB(e,s),o=new Map;for(let c=0;c<i.length;c++){let l=i[c],u=l.timestamp,f=n.get(u);tB(l,"records",r,f,o),tB(l,"original_records",r,f,o)}return Object.fromEntries(o)}a(lte,"searchTransactionsByHashValues");function tB(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 vE(e.operation,e.user_name,i,void 0);d[t]=[c],u.push(d)}}else{let u=new vE(e.operation,e.user_name,i,void 0);u[t]=[c],s.set(l,[u])}}}a(tB,"loopRecords");function rB(e,t){let r=[];try{let n=e.dbis[qu.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 vE,i);r.push(o)}}catch(i){ote.warn(i)}return r}catch(n){throw n}}a(rB,"batchSearchTransactions")});var oB=I((kIe,iB)=>{"use strict";var{getSchemaPath:BIe}=Et(),HIe=ft(),{database:ute}=(De(),P(nt));iB.exports={writeTransaction:dte};async function dte(e,t,r){return ute({database:e,table:t}).transaction(r)}a(dte,"writeTransaction")});var uB=I((GIe,lB)=>{"use strict";var{getSchemaPath:aB}=Et(),cB=ft();lB.exports={flush:fte,resetReadTxn:_te};async function fte(e,t){return(await cB.openEnvironment(aB(e,t),t.toString())).flushed}a(fte,"flush");async function _te(e,t){try{(await cB.openEnvironment(aB(e,t),t.toString())).resetReadTxn()}catch{}}a(_te,"resetReadTxn")});var pB=I(($Ie,_B)=>{"use strict";var{Readable:pte}=require("stream"),{getDatabases:hte}=(De(),P(nt)),{readSync:mte,openSync:Ete,createReadStream:dB}=require("fs"),{open:gte}=require("lmdb"),fB=i_(),Ste=o_(),{AUDIT_STORE_OPTIONS:Tte}=(_o(),P(hB)),{INTERNAL_DBIS_NAME:Ate,AUDIT_STORE_NAME:Rte}=xt();_B.exports=bte;var $b=32768,yte=100;async function bte(e){let t=e.database||e.schema||"data",r=hte()[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=gte({noSync:!0,maxDbs:Ste.MAX_DBS}),p,_=d.openDB(Ate,new fB(!1)),h=f.useReadTransaction(),S=0,g=a(async function(E,A){A.encoding="binary",A.encoder=void 0;let N=d.openDB(E,A),v=f.openDB(E,A);for(let{key:F,version:$,value:Y}of v.getRange({start:null,transaction:h,versions:v.useVersions}))p=N.put(F,Y,$),S++%yte===0&&(await new Promise(ee=>setTimeout(ee,20)),h.openTimer&&(h.openTimer=0))},"copyDatabase");for(let{key:E,value:A}of f.getRange({transaction:h,start:!1}))if(s.some(N=>E.startsWith?.(N+"/"))){_.put(E,A);let[,N]=E.split("/"),v=!N,F=new fB(!v,v);await g(E,F)}e.include_audit&&await g(Rte,{...Tte}),await p;let R=dB(d.path);return R.headers=l(),R.on("close",()=>{h.done(),d.close()}),R}let o=r[Object.keys(r)[0]].primaryStore,c=Ete(o.path);return o.transaction(()=>{let u=Buffer.alloc($b);mte(c,u,0,$b),o.resetReadTxn();let f=o.useReadTransaction();f.renew();let d=dB(null,{fd:c,start:$b}),p=new pte.from(async function*(){yield u;for await(let _ of d)f.openTimer&&(f.openTimer=0),yield _;f.done()}());return p.headers=l(),p});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(bte,"getBackup")});var gB=I((KIe,EB)=>{"use strict";var Ote=W(),{handleHDBError:Nte}=pe(),wte=CM(),Ite=oE(),Cte=_b(),Pte=P0(),Dte=C_(),Lte=Tb(),Mte=rx(),vte=dx(),Ute=M_(),xte=Sx(),Bte=Px(),Hte=Ux(),kte=Bx(),Fte=Gx(),Gte=zx(),qte=Ib(),$te=Xx(),Vte=sB(),Kte=oB(),mB=uB(),Yte=pB(),Vb=class extends wte{static{a(this,"LMDBBridge")}async searchByConditions(t){return xte(t)}async getDataByHash(t){return await Lte(t)}async searchByHash(t){return await Mte(t)}async getDataByValue(t,r){return await vte(t,r)}async searchByValue(t){return await Ute(t)}async createSchema(t){return await Pte(t)}async dropSchema(t){return await Bte(t)}async createTable(t,r){return await Hte(t,r)}async dropTable(t){return await qte(t)}async createAttribute(t){return await Ite(t)}async createRecords(t){return await Cte(t)}async updateRecords(t){return await kte(t)}async upsertRecords(t){try{return await Fte(t)}catch(r){throw Nte(r,null,null,Ote.ERR,r)}}async deleteRecords(t){return await Dte(t)}async dropAttribute(t){return await $te(t)}async deleteAuditLogsBefore(t){return await Gte(t)}async readAuditLog(t){return await Vte(t)}writeTransaction(t,r,n){return Kte.writeTransaction(t,r,n)}flush(t,r){return mB.flush(t,r)}resetReadTxn(t,r){return mB.resetReadTxn(t,r)}getBackup(t){return Yte(t)}};EB.exports=Vb});var Yb={};Ue(Yb,{add:()=>UE,applyReverse:()=>SB,getRecordAtTime:()=>Kb,rebuildUpdateBefore:()=>xE});function UE(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 xE(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,UE(n,s,i)}else r&&(n||(n={}),n[s]=i)}else n||(n={}),n[s]=e[s];return n}function SB(e,t){for(let r in t){let n=t[r];if(n?.__op__){let s=Wte[n.__op__]?.reverse;if(s)s(e,r,{value:n.value});else throw new Error(`Unsupported operation ${n.__op__}`)}else e[r]=TB}}function Kb(e,t,r){let n=r.rootStore.auditStore,s={...e.value},i=e.localTime;for(;i>t;){let l=n.get(i),u=wt(l);switch(u.type){case"put":s=u.getValue(r);break;case"patch":SB(s,u.getValue(r));break;case"delete":s=null}i=u.previousLocalTime}let o={},c=0;for(let l in s)s[l]===TB&&(o[l]=!0,c++);for(;c>0&&i>0;){let l=n.get(i),u=wt(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 Wte,TB,BE=be(()=>{_o();a(UE,"add");UE.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)};Wte={add:UE};a(xE,"rebuildUpdateBefore");a(SB,"applyReverse");TB={};a(Kb,"getRecordAtTime")});function Nn(e){let t=e.getChanges();return t||(t=Object.create(null),e._setChanges(t)),t}function GE(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 Jn.ClientError(`${l} must be a string, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"ID":u=a(function(d){if(!(typeof d=="string"||d?.length>0&&d.every?.(p=>typeof p=="string")||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be a string, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Float":case"Number":u=a(function(d){let p=d?.__op__?d.value:d;if(!(typeof p=="number"||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be a number, attempt to assign ${p}`);Nn(this)[l]=d},"set");break;case"Int":u=a(function(d){let p=d?.__op__?d.value:d;if(!(p>>0===p||d==null&&c.nullable!==!1))if(typeof p=="number"&&Math.abs((p>>0)-p)<=1)p=Math.round(p),d?.__op__?d.value=p:d=p;else throw new Jn.ClientError(`${l} must be an integer between -2147483648 and 2147483647, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Long":u=a(function(d){let p=d?.__op__?d.value:d;if(!(Math.round(p)===d&&Math.abs(p)<=9007199254740992||d==null&&c.nullable!==!1))if(typeof p=="number"&&Math.abs(p)<=9007199254740992)p=Math.round(p),d?.__op__?d.value=p:d=p;else throw new Jn.ClientError(`${l} must be an integer between -9007199254740992 and 9007199254740992, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"BigInt":u=a(function(d){let p=d?.__op__?d.value:d;if(!(typeof p=="bigint"||d==null&&c.nullable!==!1))if(typeof p=="string"||typeof p=="number")p=BigInt(p),d?.__op__?d.value=p:d=p;else throw new Jn.ClientError(`${l} must be a number, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Boolean":u=a(function(d){if(!(typeof d=="boolean"||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be a boolean, attempt to assign ${d}`);Nn(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 Jn.ClientError(`${l} must be a Date, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Bytes":u=a(function(d){if(!(d instanceof Uint8Array||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be a Buffer or Uint8Array, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Blob":u=a(function(d){if(!(d instanceof Ii||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be a Blob, attempt to assign ${d}`);Nn(this)[l]=d},"set");break;case"Any":case void 0:u=a(function(d){Nn(this)[l]=d},"set");break;default:u=a(function(d){if(!(typeof d=="object"||d==null&&c.nullable!==!1))throw new Jn.ClientError(`${l} must be an object, attempt to assign ${d}`);Nn(this)[l]=d},"set")}f={get(){let d=this.getChanges?.();if(d&&l in d){let _=d[l];if(_?.__op__){let h=this.getRecord()?.[l];return _.update(h)}return _}let p=this.getRecord()?.[l];if(p&&typeof p=="object"){let _=Wb(p,c);if(_)return d||this._setChanges(d=Object.create(null)),d[l]=_}return p},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 Jn.ClientError("Can not add a property to a sealed table schema");Nn(this)[c]=l}),i("deleteProperty",function(c){Nn(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 p=l[f];d=d.update(p)}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,RB);break}o=c}while(o&&o!==RB)}function Wb(e,t){let r;switch(e.constructor){case Object:return t?(r=t.TrackedObject,r||(t.TrackedObject=r=class extends k_{static{a(this,"TrackedObject")}},GE(r,t)),new r(e)):new k_(e);case Array:let n=new kE(e.length,e);for(let s=0,i=e.length;s<i;s++){let o=e[s];o&&typeof o=="object"&&(o=Wb(o,t?.elements)),n[s]=o}return n;default:return e}}function qE(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=qE(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 il(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=il(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=Yb[s?.__op__];if(i)i(r,n,s);else throw new Error("Invalid CRDT operation "+s.__op__);continue}else s=il(s);r[n]=s}if(!Array.isArray(e))for(let n in e)zte.call(e,n)&&(r||(r={...e.getRecord?.()}),r[n]=e[n]);return r?Object.freeze(r):e.getRecord?.()??e}function HE(e){let t=e.getRecord?.();if(t===void 0)return!0;if(e.constructor===Array){if(!t||e[sl]||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(HE(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(HE(s))return!0}else return!0}else return!0}}return!1}var Jn,AB,RB,k_,zte,sl,kE,FE,zb=be(()=>{Jn=M(pe());BE();Ss();a(Nn,"getChanges");a(GE,"assignTrackedAccessors");AB=Object.prototype,RB=new Proxy({},{get(e,t,r){if(typeof t=="string"){if(t==="then"||t==="getRecord"||t==="getChanges")return;if(AB[t])return AB[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=Wb(s);if(i)return n||(n=Object.create(null),r._setChanges(n)),n[t]=i,i}return s}}});a(Wb,"trackObject");k_=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}};GE(k_,{});a(qE,"collapseData");zte=Object.prototype.hasOwnProperty;a(il,"updateAndFreeze");a(HE,"hasChanges");sl=Symbol.for("has-array-changes"),kE=class extends Array{static{a(this,"TrackedArray")}#e;[sl];constructor(t,r){super(t),this.#e=r}getRecord(){return this.#e}splice(...t){return this[sl]=!0,super.splice(...t)}push(...t){return this[sl]=!0,super.push(...t)}pop(){return this[sl]=!0,super.pop()}unshift(...t){return this[sl]=!0,super.unshift(...t)}shift(){return this[sl]=!0,super.shift()}};kE.prototype.constructor=Array;FE=class{constructor(t){this.value=t}static{a(this,"Addition")}__op__="add";update(t){return(+t||0)+this.value}}});var PB={};Ue(PB,{ResourceBridge:()=>Qb});function Xb({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 bB(e,t){let r=ki(e),n=Xb(e,r);if(!r)throw new ii.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;Nt(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&&qE(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 ki(e){let t=e.database||e.schema||Jte,r=Xe()[t];if(!r)throw(0,ii.handleHDBError)(new Error,jte.SCHEMA_NOT_FOUND(t),404);return r[e.table]}function OB(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*NB(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 wB,$E,ii,IB,jb,Jb,CB,jte,Jte,Qte,Xte,yB,Qb,DB=be(()=>{"use strict";wB=M(gB()),$E=M(Fu()),ii=M(pe());De();IB=M(u_());H();jb=M(Ao()),Jb=M(ni()),CB=M(ae());Cc();zb();({HDB_ERROR_MSGS:jte}=ii.hdb_errors),Jte="data",Qte=1e4,Xte=10,Qb=class extends wB.default{static{a(this,"ResourceBridge")}constructor(t){super(t),yB=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,ii.handleHDBError)(r,r.message,400,void 0,void 0,!0);let n=ki(t);if(!n)throw new ii.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:Xb(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 ii.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}]}dt({database:r.database??r.schema,table:r.table,attributes:n,schemaDefined:s,expiration:r.expiration,audit:r.audit})}async createAttribute(t){return await ki(t).addAttributes([{name:t.attribute,indexed:t.indexed??!0}]),`attribute ${t.schema}.${t.table}.${t.attribute} successfully created.`}async dropAttribute(t){let r=ki(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){ki(t).dropTable()}createSchema(t){return $u({database:t.schema,table:null}),jb.signalSchemaChange(new Jb.SchemaEventMsg(process.pid,Kt.CREATE_SCHEMA,t.schema))}async dropSchema(t){await Zb(t.schema),jb.signalSchemaChange(new Jb.SchemaEventMsg(process.pid,Kt.DROP_SCHEMA,t.schema))}async updateRecords(t){return t.requires_existing=!0,this.upsertRecords(t)}async createRecords(t){return t.requires_no_existing=!0,yB.upsertRecords(t)}async upsertRecords(t){let{schema_table:r,attributes:n}=(0,IB.default)(t),s,i=Xe()[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),Nt(o,async c=>{if(!i.schemaDefined){s=[];for(let f of n)i.attributes.find(p=>p.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],p=d!=null&&await i.get(d,o);if(t.requires_existing&&!p||t.requires_no_existing&&p){u.push(f[i.primaryKey]);continue}p&&(p=qE(p));for(let _ in f)if(Object.prototype.hasOwnProperty.call(f,_)){let h=f[_];if(typeof h=="function")try{let S=h([[p]]);Array.isArray(S)&&(h=S[0].func_val,f[_]=h)}catch(S){throw S.message+="Trying to set key "+_+" on object"+JSON.stringify(f),S}}if(p)for(let _ in p)Object.prototype.hasOwnProperty.call(f,_)||(f[_]=p[_]);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=Xe()[t.schema][t.table],n={user:t.hdb_user};return t.replicateTo&&(n.replicateTo=t.replicateTo),t.replicatedConfirmation&&(n.replicatedConfirmation=t.replicatedConfirmation),Nt(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 OB(o,c,s.timestamp)})}async deleteRecordsBefore(t){let r=Xe()[t.schema][t.table];if(!r.createdTimeProperty)throw new ii.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:cm.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,CB.async_set_timeout)(Xte),l=[],s=!0},"chunkDelete");for await(let f of n)l.push(f[r.primaryKey]),c++,c%Qte===0&&await u();return l.length>0&&await u(),s?OB(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 bB(t)}async getDataByHash(t){let r=new Map;t._returnKeyValue=!0;for await(let{key:n,value:s}of bB(t,!0))r.set(n,s);return r}searchByValue(t,r){if(r&&XA[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=ki(t);if(!s)throw new ii.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===cm.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:Xb(t,s)},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async getDataByValue(t,r){let n=new Map,s=ki(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){ki({schema:t,table:r})?.primaryStore.resetReadTxn()}async deleteAuditLogsBefore(t){return ki(t).deleteHistory(t.timestamp,t.cleanup_deleted_records)}async readAuditLog(t){let r=ki(t),n={};switch(t.search_type){case lm.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 lm.USERNAME:let s=t.search_values;for await(let i of NB(r))s.includes(i.user_name)&&(n[i.user_name]||(n[i.user_name]=[])).push(i);return n;default:return NB(r,t.search_values?.[0],t.search_values?.[1],t.limit)}}};a(Xb,"getSelect");a(bB,"getRecords");a(ki,"getTable");a(OB,"createDeleteResponse");a(NB,"groupRecordsInHistory")});var Kn=I((sCe,LB)=>{"use strict";var{ResourceBridge:Zte}=(DB(),P(PB)),ere=ce();ere.initSync();var VE;function tre(){return VE||(VE=new Zte,VE)}a(tre,"getBridge");LB.exports=tre()});var bn=I((oCe,xB)=>{"use strict";var YE=GR(),Lr=ae(),rre=require("util"),WE=Kn(),nre=Rs(),MB=W(),{handleHDBError:ol,hdb_errors:sre}=pe(),{HTTP_STATUS_CODES:al}=sre,ire=rre.promisify(nre.getTableSchema),ore="updated",vB="inserted",UB="upserted";xB.exports={insert:cre,update:lre,upsert:ure,validation:are,flush:dre};async function are(e){if(Lr.isEmpty(e))throw new Error("invalid update parameters defined.");if(Lr.isEmptyOrZeroLength(e.schema))throw new Error("invalid database specified.");if(Lr.isEmptyOrZeroLength(e.table))throw new Error("invalid table specified.");let t=await ire(e.schema,e.table),r=YE(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&&Lr.isEmptyOrZeroLength(c[n]))throw MB.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(!Lr.isEmptyOrZeroLength(c[n])&&(c[n]==="null"||c[n]==="undefined"))throw MB.error(`a valid hash value must be provided with ${e.operation} record:`,c),new Error(`"${c[n]}" is not a valid hash attribute value`);!Lr.isEmpty(c[n])&&c[n]!==""&&s.has(Lr.autoCast(c[n]))&&(c.skip=!0),s.add(Lr.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(are,"validation");async function cre(e){if(e.operation!=="insert")throw new Error("invalid operation, must be insert");let t=YE(e);if(t)throw ol(new Error,t.message,al.BAD_REQUEST);Lr.transformReq(e);let r=Lr.checkSchemaTableExist(e.schema,e.table);if(r)throw ol(new Error,r,al.BAD_REQUEST);let n=await WE.createRecords(e);return KE(vB,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time)}a(cre,"insertData");async function lre(e){if(e.operation!=="update")throw new Error("invalid operation, must be update");let t=YE(e);if(t)throw ol(new Error,t.message,al.BAD_REQUEST);Lr.transformReq(e);let r=Lr.checkSchemaTableExist(e.schema,e.table);if(r)throw ol(new Error,r,al.BAD_REQUEST);let n=await WE.updateRecords(e);return Lr.isEmpty(n.existing_rows)?KE(ore,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time):KE(n.update_action,[],e,n.hashes,void 0,n.txn_time)}a(lre,"updateData");async function ure(e){if(e.operation!=="upsert")throw ol(new Error,"invalid operation, must be upsert",al.INTERNAL_SERVER_ERROR);let t=YE(e);if(t)throw ol(new Error,t.message,al.BAD_REQUEST);Lr.transformReq(e);let r=Lr.checkSchemaTableExist(e.schema,e.table);if(r)throw ol(new Error,r,al.BAD_REQUEST);let n=await WE.upsertRecords(e);return KE(UB,n.written_hashes,e,[],n.new_attributes,n.txn_time)}a(ure,"upsertData");function KE(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===vB?(o.inserted_hashes=t,o.skipped_hashes=n,o):e===UB?(o.upserted_hashes=t,o):(o.update_hashes=t,o.skipped_hashes=n,o)}a(KE,"returnObject");function dre(e){return Lr.transformReq(e),WE.flush(e.schema,e.table)}a(dre,"flush")});var qB=I((cCe,GB)=>{var Vu=require("validate.js"),HB=it(),Ku=(H(),P(G)),{handleHDBError:fre,hdb_errors:_re}=pe(),{HDB_ERROR_MSGS:zt,HTTP_STATUS_CODES:pre}=_re,eO=a(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),hre={STRUCTURE_USER:"structure_user"},BB=Object.values(Ku.ROLE_TYPES_ENUM),mre="attribute_permissions",Ere="attribute_name",{PERMS_CRUD_ENUM:Yu}=Ku,gre=[mre,...Object.values(Yu)],kB=[Yu.READ,Yu.INSERT,Yu.UPDATE],Sre=[Ere,...kB];function Tre(e){let t=eO();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,FB(e,t)}a(Tre,"addRoleValidation");function Are(e){let t=eO();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,FB(e,t)}a(Are,"alterRoleValidation");function Rre(e){let t=eO();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,HB.validateObject(e,t)}a(Rre,"dropRoleValidation");var yre=["operation","role","id","permission","hdb_user","access"];function FB(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let o=0,c=n.length;o<c;o++)yre.includes(n[o])||s.push(n[o]);s.length>0&&nr(zt.INVALID_ROLE_JSON_KEYS(s),r);let i=HB.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{nr(o,r)}),e.permission){let o=bre(e);o&&nr(o,r),BB.forEach(c=>{e.permission[c]&&!Vu.isBoolean(e.permission[c])&&nr(zt.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let o in e.permission)if(BB.indexOf(o)<0){if(o===hre.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(zt.SCHEMA_NOT_FOUND(d),r)}continue}nr(zt.STRUCTURE_USER_ROLE_TYPE_ERROR(o),r);continue}let c=e.permission[o];if(!o||!global.hdb_schema[o]){nr(zt.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(zt.TABLE_NOT_FOUND(o,l),r);continue}if(Object.keys(u).forEach(f=>{gre.includes(f)||nr(zt.INVALID_PERM_KEY(f),r,o,l)}),Object.values(Yu).forEach(f=>{Vu.isDefined(u[f])?Vu.isBoolean(u[f])||nr(zt.TABLE_PERM_NOT_BOOLEAN(f),r,o,l):nr(zt.TABLE_PERM_MISSING(f),r,o,l)}),u.attribute_permissions===void 0){nr(zt.ATTR_PERMS_ARRAY_MISSING,r,o,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){nr(zt.ATTR_PERMS_NOT_ARRAY,r,o,l);continue}if(u.attribute_permissions){let f=global.hdb_schema[o][l].attributes.map(({attribute:p})=>p),d={read:!1,insert:!1,update:!1};for(let p in u.attribute_permissions){let _=u.attribute_permissions[p];if(Object.keys(_).forEach(S=>{!Sre.includes(S)&&S!==Yu.DELETE&&nr(zt.INVALID_ATTR_PERM_KEY(S),r,o,l)}),!Vu.isDefined(_.attribute_name)){nr(zt.ATTR_PERM_MISSING_NAME,r,o,l);continue}let h=_.attribute_name;if(!f.includes(h)){nr(zt.INVALID_ATTRIBUTE_IN_PERMS(h),r,o,l);continue}kB.forEach(S=>{Vu.isDefined(_[S])?Vu.isBoolean(_[S])||nr(zt.ATTR_PERM_NOT_BOOLEAN(S,h),r,o,l):nr(zt.ATTR_PERM_MISSING(S,h),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 p=`${o}.${l}`;nr(zt.MISMATCHED_TABLE_ATTR_PERMS(p),r,o,l)}}}}return Ore(r)}a(FB,"customValidate");GB.exports={addRoleValidation:Tre,alterRoleValidation:Are,dropRoleValidation:Rre};function bre(e){let{operation:t,permission:r}=e;if(t===Ku.OPERATIONS_ENUM.ADD_ROLE||t===Ku.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 zt.SU_CU_ROLE_COMBINED_ERROR;{let o=r.super_user?Ku.ROLE_TYPES_ENUM.SUPER_USER:Ku.ROLE_TYPES_ENUM.CLUSTER_USER;return zt.SU_CU_ROLE_NO_PERMS_ALLOWED(o)}}}return null}a(bre,"validateNoSUPerms");function Ore(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:zt.ROLE_PERMS_ERROR,...e};return fre(new Error,n,pre.BAD_REQUEST)}else return null}a(Ore,"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 G_=I((dCe,YB)=>{"use strict";var $B=bn(),VB=Wr(),Nre=jc(),rO=qB(),nO=Ao(),uCe=require("uuid").v4,wre=require("util"),zE=(H(),P(G)),Ire=ae(),sO=VB.searchByValue,Cre=VB.searchByHash,Pre=wre.promisify(Nre.delete),Dre=si(),Lre=Gu(),{hdb_errors:Mre,handleHDBError:cl}=pe(),{HDB_ERROR_MSGS:KB,HTTP_STATUS_CODES:F_}=Mre,{UserEventMsg:iO}=ni();YB.exports={addRole:vre,alterRole:Ure,dropRole:xre,listRoles:Bre};function tO(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(tO,"scrubRoleDetails");async function vre(e){let t=rO.addRoleValidation(e);if(t)throw t;e=tO(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 sO(r)||[])}catch(i){throw cl(i)}if(n&&n.length>0)throw cl(new Error,KB.ROLE_ALREADY_EXISTS(e.role),F_.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 $B.insert(s),nO.signalUserChange(new iO(process.pid)),e=tO(e),e}a(vre,"addRole");async function Ure(e){let t=rO.alterRoleValidation(e);if(t)throw t;e=tO(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await $B.update(r)}catch(s){throw cl(s)}if(n&&n?.message==="updated 0 of 1 records")throw cl(new Error,"Invalid role id",F_.BAD_REQUEST,void 0,void 0,!0);return await nO.signalUserChange(new iO(process.pid)),e}a(Ure,"alterRole");async function xre(e){let t=rO.dropRoleValidation(e);if(t)throw cl(new Error,t,F_.BAD_REQUEST,void 0,void 0,!0);let r=new Lre(zE.SYSTEM_SCHEMA_NAME,zE.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Cre(r));if(n.length===0)throw cl(new Error,KB.ROLE_NOT_FOUND,F_.NOT_FOUND,void 0,void 0,!0);let s=new Dre(zE.SYSTEM_SCHEMA_NAME,zE.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await sO(s)),o=!1;if(Ire.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){o=!0;break}}if(o===!0)throw cl(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,F_.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Pre(c),nO.signalUserChange(new iO(process.pid)),`${n[0].role} successfully deleted`}a(xre,"dropRole");async function Bre(){return sO({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}a(Bre,"listRoles")});var oO={};Ue(oO,{start:()=>jB,startOnMainThread:()=>Fre});function jB({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,WB.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(Hre.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 p=u.attributes[d];p.attribute_name=d,f.push(p)}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 kre(i)}}}async function kre(e){let t=Xe().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,zB.isEqual)(i,e)?void 0:(e.id=r.id,(0,jE.alterRole)(e))}return(0,jE.addRole)(e)}var jE,WB,zB,Hre,Fre,JB=be(()=>{De();jE=M(G_()),WB=require("yaml"),zB=require("lodash"),Hre=["super_user","cluster_user","structure_user"];a(jB,"start");a(kre,"ensureRole");Fre=jB});async function JE(e){let t=(0,ZB.pathToFileURL)(e).toString();if(Gre)return q_||(q_=qre(Vre)),(await(await q_).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function qre(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),q_=new Compartment({console,Math,Date,fetch:$re,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,XB.extname)(r)||(r+=".js"),r)},importHook:a(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){Object.assign(s,{Resource:Vr,tables:Qn,databases:$e})}};let n=await(0,QB.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),q_}function $re(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 Vre(){return{Resource:Vr,tables:Qn}}var QB,XB,ZB,Gre,q_,aO=be(()=>{ga();De();QB=require("fs/promises"),XB=require("path"),ZB=require("url"),Gre=!1;a(JE,"secureImport");a(qre,"getCompartment");a($re,"secureOnlyFetch");a(Vre,"getGlobalVars")});var lO={};Ue(lO,{handleFile:()=>Kre});async function Kre(e,t,r,n){let s=new Map,i=await JE(r);c(i.default)&&n.set((0,cO.dirname)(t),i.default),o(i,(0,cO.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 cO,eH=be(()=>{aO();cO=require("path");a(Kre,"handleFile")});var dO={};Ue(dO,{start:()=>Yre});function Yre({resources:e}){e.set("login",uO),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var uO,tH=be(()=>{ga();a(Yre,"start");uO=class extends Vr{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 z_={};Ue(z_,{addAnalyticsListener:()=>W_,calculateCPUUtilization:()=>TH,diffResourceUsage:()=>AH,recordAction:()=>sr,recordActionBinary:()=>Xn,setAnalyticsEnabled:()=>Wre});function Wre(e){hH=e}function zre(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 jre(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},XE.set(e,o)}function sr(e,t,r,n,s){if(!hH)return;let i=t+(r?"-"+r:"");n!==void 0&&(i+="-"+n),s!==void 0&&(i+="-"+s);let o=XE.get(i);o?zre(e,o):jre(i,e,t,r,n,s),QE||Jre()}function Xn(e,t,r,n,s){sr(!!e,t,r,n,s)}function W_(e){gH.push(e)}function Jre(){QE=performance.now(),setTimeout(async()=>{let e=performance.now()-QE;QE=0;let t=[],r={time:Date.now(),period:e,threadId:ll.threadId,metrics:t};for(let[s,i]of XE){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 SH){let p=Math.floor(c*d),_=o[p-1];if(p>l){let h=p-l;if(_===f){let S=u[u.length-1];typeof S=="number"?u[u.length-1]={value:S,count:1+h}:S.count+=h}else u.push(h>1?{value:_,count:h}:_),f=_;l=p}}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 RH()}let n=process.memoryUsage();t.push({metric:"memory",threadId:ll.threadId,byThread:!0,...n});for(let s of gH)s(t);XE=new Map,ll.parentPort?ll.parentPort.postMessage({type:EH,report:r}):OH({report:r})},mH).unref()}function ZE(e,t,r){let n={id:(0,K_.getNextMonotonicTime)(),metric:t,...r};e.primaryStore.put(n.id,n,{append:!0}).then(s=>{s||e.primaryStore.put(n.id,n)})}function TH(e,t){let r=e.userCPUTime+e.systemCPUTime;return Math.round(r/t*100)/100}function AH(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 Qre(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};ZE(e,"table-size",l),ul.trace?.(`table ${o} size metric: ${JSON.stringify(l)}`),n+=c}return n}function rH(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getAuditSize();if(!i)return;let o=pH.default.statSync(s.primaryStore.env.path).size,c=Qre(e,r,n),l=o-c,u={database:r,size:o,used:c,free:l,audit:i};ZE(e,"database-size",u),ul.trace?.(`database ${r} size metric: ${JSON.stringify(u)}`)}catch(s){ul.warn?.("Error getting DB size metrics",s)}}function nH(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};ZE(e,"storage-volume",o),ul.trace?.(`db ${r} storage volume metrics: ${JSON.stringify(o)}`)}catch(s){ul.warn?.("Error getting DB volume metrics",s)}}async function Xre(e,t=6e4){let r=_O(),n=yH(),s=new Promise(E=>{let A=performance.now();setImmediate(()=>{let N=performance.now();N-A>5e3&&ul.warn?.("Unusually high event queue latency on the main thread of "+Math.round(N-A)+"ms"),A=performance.now()}),n.primaryStore.prefetch([1],()=>{let N=performance.now();N-A>5e3&&ul.warn?.("Unusually high task queue latency on the main thread of "+Math.round(N-A)+"ms"),E(N-A)})}),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:A}of r.primaryStore.getRange({start:i||!1,exclusiveStart:!0,end:1/0})){if(!A)continue;if(o){if(E>o+t)break}else o=E;f=E;let{metrics:N,threadId:v}=A;for(let F of N||[]){let{path:$,method:Y,type:ee,metric:oe,count:j,total:se,distribution:z,threads:me,...Ae}=F;j||(j=1);let Pe=oe+($?"-"+$:"");Y!==void 0&&(Pe+="-"+Y),ee!==void 0&&(Pe+="-"+ee);let he=c.get(Pe);if(he){if(he.threads){let ut=he.threads[v];if(ut)he=ut;else{he.threads[v]={...Ae};continue}}he.count||(he.count=1);let Ot=he.count;for(let ut in Ae){let br=Ae[ut];typeof br=="number"&&(he[ut]=(he[ut]*Ot+br*j)/(Ot+j))}he.count+=j,se>=0&&(he.total+=se,he.ratio=he.total/he.count)}else he={period:t,...F},delete he.distribution,c.set(Pe,he),he.byThread&&(he.threads=[],he.threads[v]={...Ae},u.push(he));if(z){z=z.map(ut=>typeof ut=="number"?{value:ut,count:1}:ut);let Ot=l.get(Pe);Ot?Ot.push(...z):l.set(Pe,z)}}await RH()}for(let E of u){let{path:A,method:N,type:v,metric:F,count:$,total:Y,distribution:ee,threads:oe,...j}=E;oe=oe.filter(se=>se);for(let se in j){if(typeof E[se]!="number")continue;let z=0;for(let me of oe){let Ae=me[se];typeof Ae=="number"&&(z+=Ae)}E[se]=z}E.count=oe.length,delete E.threads,delete E.byThread}for(let[E,A]of l){let N=c.get(E);A.sort((ut,br)=>ut.value>br.value?1:-1);let v=N.count-1,F=[],$=0,Y=0,ee;for(let ut of SH){let br=v*ut;for(;$<br;)ee=A[Y++],$+=ee.count,Y===1&&$--;let ms=A[Y>1?Y-2:0];ee||(ee=A[0]),F.push(ee.value-(ee.value-ms.value)*($-br)/ee.count)}let[oe,j,se,z,me,Ae,Pe,he,Ot]=F;Object.assign(N,{p1:oe,p10:j,p25:se,median:z,p75:me,p90:Ae,p95:Pe,p99:he,p999:Ot})}let d;for(let[E,A]of c)A.id=(0,K_.getNextMonotonicTime)(),A.time=f,n.primaryStore.put(A.id,A,{append:!0}).then(N=>{N||n.primaryStore.put(A.id,A)}),d=!0;let p=Date.now(),{idle:_,active:h}=performance.eventLoopUtilization();if(d||h*10>_){let E=(0,K_.getNextMonotonicTime)(),A={id:E,metric:"main-thread-utilization",idle:_-sH,active:h-iH,taskQueueLatency:await s,time:p,...process.memoryUsage()};n.primaryStore.put(E,A,{append:!0}).then(N=>{N||n.primaryStore.put(E,A)})}sH=_,iH=h;let S=process.resourceUsage(),g=AH($_,S);g.time=p,g.period=$_.time?p-$_.time:t,g.cpuUtilization=TH($_,g.period),ZE(n,"resource-usage",g),$_=g;let R=Xe();rH(n,R),rH(n,{system:R.system}),nH(n,R),nH(n,{system:R.system})}async function oH(e,t){let r=Date.now()-t;for(let n of e.primaryStore.getKeys({start:!1,end:r}))e.primaryStore.remove(n)}function _O(){return aH||(aH=dt({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function yH(){return cH||(cH=dt({table:"hdb_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]}))}function tne(){bH=!0;let e=(0,Y_.get)(x.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await Xre(mH,e),await oH(_O(),Zre),await oH(yH(),ene)},Math.min(e/2,2147483647)).unref()}function OH(e,t){let r=e.report;r.threadId=t?.threadId||ll.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(lH+=n.mean*n.count);r.totalBytesProcessed=lH,t&&(r.metrics.push({metric:"utilization",...t.performance.eventLoopUtilization(uH.get(t))}),uH.set(t,t.performance.eventLoopUtilization())),r.id=(0,K_.getNextMonotonicTime)(),_O().primaryStore.put(r.id,r),bH||tne(),rne&&(NH=sne(r))}async function sne(e){if(await NH,!Pa){let r=(0,V_.dirname)((0,fH.getLogFilePath)());try{Pa=await(0,fO.open)((0,V_.join)(r,"analytics.log"),"r+")}catch{Pa=await(0,fO.open)((0,V_.join)(r,"analytics.log"),"w+")}}let t=(await Pa.stat()).size;if(t>nne){let r=Buffer.alloc(t);await Pa.read(r,{position:0}),r=r.subarray(r.indexOf(10,r.length/2)+1),await Pa.write(r,{position:0}),await Pa.truncate(r.length),t=r.length}await Pa.write(JSON.stringify(e)+`
|
|
21
21
|
`,t)}var ll,dH,fH,_H,V_,fO,K_,Y_,pH,ul,XE,hH,QE,mH,EH,gH,SH,sH,iH,$_,RH,Zre,ene,aH,cH,bH,lH,uH,rne,NH,Pa,nne,Fi=be(()=>{ll=require("worker_threads"),dH=M(rt());De();fH=M(W()),_H=M(wi()),V_=require("path"),fO=require("fs/promises"),K_=M(pn()),Y_=M(ce());H();Kr();pH=M(require("node:fs")),ul=(0,_H.loggerWithTag)("analytics");(0,Y_.initSync)();XE=new Map,hH=(0,Y_.get)(x.ANALYTICS_AGGREGATEPERIOD)>-1;a(Wre,"setAnalyticsEnabled");a(zre,"recordExistingAction");a(jre,"recordNewAction");a(sr,"recordAction");We.recordAnalytics=sr;a(Xn,"recordActionBinary");QE=0,mH=1e3,EH="analytics-report",gH=[];a(W_,"addAnalyticsListener");SH=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Jre,"sendAnalytics");a(ZE,"storeMetric");a(TH,"calculateCPUUtilization");a(AH,"diffResourceUsage");a(Qre,"storeTableSizeMetrics");a(rH,"storeDBSizeMetrics");a(nH,"storeVolumeMetrics");a(Xre,"aggregation");sH=0,iH=0,$_={},RH=a(()=>new Promise(setImmediate),"rest");a(oH,"cleanup");Zre=36e5,ene=31536e6;a(_O,"getRawAnalyticsTable");a(yH,"getAnalyticsTable");(0,dH.setChildListenerByType)(EH,OH);a(tne,"startScheduledTasks");lH=0,uH=new Map,rne=!1;a(OH,"recordAnalytics");nne=1e6;a(sne,"logAnalytics")});var wH={};Ue(wH,{Headers:()=>bo,appendHeader:()=>eg,mergeHeaders:()=>pO});function eg(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 pO(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new bo(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 bo,j_=be(()=>{bo=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(eg,"appendHeader");a(pO,"mergeHeaders")});function LH(e){let t={openapi:ine,info:{title:"HarperDB HTTP REST interface",version:DH.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:A,name:N,elements:v,relationship:F,definition:$}of o){if(F)A==="array"?u[N]={type:"array",items:{$ref:Da+v.type}}:u[N]={$ref:Da+A};else{let Y=$??v?.definition;if(Y){if(!t.components.schemas[Y.type]){let ee={};Y.properties.forEach(oe=>{ee[oe.name]=new gO(hO[oe.type],oe.type)}),t.components.schemas[Y.type]=new PH(ee)}A==="array"?u[N]={type:"array",items:{$ref:Da+Y.type}}:u[N]={$ref:Da+Y.type}}else A==="array"?v.type==="Any"||v.type=="ID"?u[N]={type:"array",items:{format:v.type}}:u[N]={type:"array",items:new gO(hO[v.type],v.type)}:A==="Any"||A=="ID"?u[N]={format:A}:u[N]=new gO(hO[A],A)}f.push(new SO(N,"query",u[N]))}let d=Object.keys(u),p=new SO(c,"path",{format:"ID"});p.required=!0,p.description="primary key of record";let _=new SO("property","path",{enum:d});_.required=!0,t.components.schemas[i]=new PH(u);let h=l.post!==Resource.prototype.post||l.update,S=typeof l.put=="function",g=typeof l.get=="function",R=typeof l.delete=="function",E="/"+s+"/";h&&(t.paths[E]={},t.paths[E].post=new one(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[E]||(t.paths[E]={}),t.paths[E].get=new mO(f,r,{200:new EO({$ref:Da+i})},"search for records by the specified property name and value pairs")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new CH(f,r,"delete all the records that match the provided query",{204:new IH})),E="/"+s+"/{"+c+"}",g&&(t.paths[E]={},t.paths[E].get=new mO([p],r,{200:new EO({$ref:Da+i})},"retrieve a record by its primary key")),S&&(t.paths[E]||(t.paths[E]={}),t.paths[E].put=new ane([p],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 CH([p],r,"delete a record with the given primary key",{204:new IH})),g&&_.schema.enum.length>0&&(E="/"+s+"/{"+c+"}.{property}",t.paths[E]={},t.paths[E].get=new mO([p,_],r,{200:new EO({enum:d})},"used to retrieve the specified property of the specified record"))}return t}function one(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:Da+e}}}},this.security=t,this.responses={200:{description:TO,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function mO(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function EO(e){this.description=TO,this.content={"application/json":{schema:e}}}function IH(){this.description="successfully processed request, no content returned to client"}function ane(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Da+r}}}},this.responses={200:{description:TO}}}function CH(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function PH(e){this.type="object",this.properties=e}function gO(e,t){this.type=e,this.format=t}function SO(e,t,r){this.name=e,this.in=t,this.schema=r}var DH,ine,hO,Da,TO,MH=be(()=>{DH=M(st()),ine="3.0.3",hO={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},Da="#/components/schemas/",TO="successful operation";a(LH,"generateJsonApi");a(one,"Post");a(mO,"Get");a(EO,"Response200");a(IH,"Response204");a(ane,"Put");a(CH,"Delete");a(PH,"ResourceSchema");a(gO,"Type");a(SO,"Parameter")});var rg={};Ue(rg,{parseHeaderValue:()=>RO,start:()=>une});async function lne(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&Nm(e);let i=new bo;try{e.responseHeaders=i;let o=e.url.slice(1),c,l;if(o!==vH){let g=tg.getMatch(o,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new Pc(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=RO(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=RO(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 Nt(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=fo(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new Wu.ClientError(g,400)}if(e.authorize=!0,o===vH&&s==="GET"){if(e?.user?.role?.permission?.super_user)return LH(tg);throw new Wu.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 Wu.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Wu.ServerError(`Method ${s} is not recognized`,501)}}),p=200,_;if(d==null)p=s==="GET"||s==="HEAD"?404:204,AO.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(d.status>0&&d.headers){let g=pO(d.headers,i);return d.headers!==g&&(d.headers=g),d.data!==void 0&&(d.body=Qf(d.data,e,d)),d}else if(_=e.lastModified){cne[0]=_;let g=String.fromCharCode(34,(Mr[0]&63)+62,(Mr[0]>>6)+(Mr[1]<<2&63)+62,(Mr[1]>>4)+(Mr[2]<<4&63)+62,(Mr[2]>>2)+62,(Mr[3]&63)+62,(Mr[3]>>6)+(Mr[4]<<2&63)+62,(Mr[4]>>4)+(Mr[5]<<4&63)+62,(Mr[5]>>2)+62,(Mr[6]&63)+62,(Mr[6]>>6)+(Mr[7]<<2&63)+62,34),R=r["if-none-match"];R&&g==R?(d?.onDone&&d.onDone(),p=304,d=void 0):i.setIfNone("ETag",g),AO.lastModified&&i.setIfNone("Last-Modified",new Date(_).toUTCString())}e.createdResource&&(p=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let h={status:p,headers:i,body:void 0},S=d?.wasLoadedFromSource?.();return S!==void 0&&(h.wasCacheMiss=S,!S&&_&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||_))/1e3))),d!==void 0&&(h.body=Qf(d,e,h),s==="HEAD"&&(h.body=void 0)),h}catch(o){o.statusCode?o.statusCode===500?Gi.warn(o):Gi.info(o):Gi.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=Qf(o.contentType?o:o.toString(),e,c),c}}function une(e){AO=e,!UH&&(UH=!0,tg=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return lne(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{J_++;let s=new Hn;xH||(xH=!0,W_(l=>{J_>0&&l.push({metric:"ws-connections",connections:J_,byThread:!0})}));let i;t.on("error",l=>{i=!0,Gi.warn(l)});let o;t.on("message",a(function(u){o||(o=fo(r.requestedContentType??r.headers.asObject["content-type"],!1));let f=o(u);sr(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(f)},"message"));let c;t.on("close",()=>{J_--,Xn(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=tg.getMatch(l,"ws");if(Xn(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,sr(h=>({count:h.count,total:J_}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let f=new Pc(u.relativeURL),d=u.Resource;c=(await Nt(r,()=>d.connect(f,s,r)))[Symbol.asyncIterator]();let _;for(;!(_=await c.next()).done;){let h=await Ra(_.value,r);t.send(h),sr(h.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?Gi.warn(l):Gi.info(l):Gi.error(l),t.close(dne[l.statusCode]||1011,l.toString())}t.close()},e))}function RO(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 Gi,Wu,Mr,cne,AO,vH,UH,tg,xH,J_,dne,BH=be(()=>{co();Fi();Gi=M(W()),Wu=M(pe());qf();hu();Cc();j_();MH();qf();Mr=new Uint8Array(8),cne=new Float64Array(Mr.buffer,0,1),AO={},vH="openapi";a(lne,"http");J_=0;a(une,"start");dne={401:3e3,403:3003};a(RO,"parseHeaderValue")});var yO=I((FCe,kH)=>{var{recordAction:ng,recordActionBinary:HH}=(Fi(),P(z_)),fne=require("fastify-plugin"),_ne=200;kH.exports=fne(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),ng(o,"duration",u,d,f),HH(s.raw.statusCode<400,"success",u,d,f),HH(1,"response_"+s.raw.statusCode,u,d,f);let p=_ne;i?.pipe?(i.on("data",g=>{p+=g.length}),i.on("end",()=>{ng(performance.now()-c,"transfer",u,d,f),ng(p,"bytes-sent",u,d,f)})):(p+=i?.length||0,ng(p,"bytes-sent",u,d,f));let _=o.toFixed(3),h=s.getHeader("Server-Timing"),S=`db;dur=${_}`;s.header("Server-Timing",h?`${h}, ${S}`:S)}),r()},{name:"hdb-request-time"})});var GH=I((GCe,FH)=>{var pne=it(),hne={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};FH.exports=function(e){return pne.validateObject(e,hne)}});var sg=I((qCe,qH)=>{"use strict";var mne=(H(),P(G)).OPERATIONS_ENUM,bO=class{static{a(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=mne.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};qH.exports=bO});var Z_={};Ue(Z_,{createTokens:()=>gne,getJWTRSAKeys:()=>lg,refreshOperationToken:()=>Sne,validateOperationToken:()=>wO,validateRefreshToken:()=>ug});async function lg(){if(ig)return ig;try{let e=Q_.default.join(X_.default.getHdbBasePath(),jA),t=await og.default.readFile(Q_.default.join(e,Nf.JWT_PASSPHRASE_NAME),"utf8"),r=await og.default.readFile(Q_.default.join(e,Nf.JWT_PRIVATE_KEY_NAME),"utf8");return ig={publicKey:await og.default.readFile(Q_.default.join(e,Nf.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},ig}catch(e){throw cg.default.error(e),new oi.ClientError(ju.NO_ENCRYPTION_KEYS,zu.INTERNAL_SERVER_ERROR)}}async function gne(e){let t=(0,OO.validateBySchema)(e,qi.default.object({username:qi.default.string().optional(),password:qi.default.string().optional(),role:qi.default.string().optional(),expires_in:qi.default.alternatives(qi.default.string(),qi.default.number()).optional()}));if(t)throw new oi.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,NO.findAndValidateUser)(e.username,e.password,d)}catch(d){throw cg.default.error(d),new oi.ClientError(ju.INVALID_CREDENTIALS,zu.UNAUTHORIZED)}if(!r)throw new oi.ClientError(ju.INVALID_CREDENTIALS,zu.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 lg(),c=await Ju.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:e.expires_in??WH,algorithm:ag,subject:"operation"}),l=await Ju.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:Ene,algorithm:ag,subject:"refresh"}),u=Gy(l,"sha256");if((await(0,$H.update)(new VH.default(Of,_u.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new oi.ClientError(ju.REFRESH_TOKEN_SAVE_FAILED,zu.INTERNAL_SERVER_ERROR);return KH.default.signalUserChange(new YH.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function Sne(e){let t=(0,OO.validateBySchema)(e,qi.default.object({refresh_token:qi.default.string().required()}).required());if(t)throw new oi.ClientError(t.message);let{refresh_token:r}=e;await ug(r);let n=await lg(),s=await Ju.default.decode(r);return{operation_token:await Ju.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:WH,algorithm:ag,subject:"operation"})}}async function wO(e){return zH(e,"operation")}async function ug(e){return zH(e,"refresh")}async function zH(e,t){try{let r=await lg(),n=await Ju.default.verify(e,r.publicKey,{algorithms:ag,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,NO.findAndValidateUser)(n.username,void 0,!1);if(t==="refresh"&&!qy(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw cg.default.warn(r),r?.name==="TokenExpiredError"?new oi.ClientError(ju.TOKEN_EXPIRED,zu.FORBIDDEN):new oi.ClientError(ju.INVALID_TOKEN,zu.UNAUTHORIZED)}}var Ju,og,Q_,qi,OO,oi,cg,NO,$H,VH,KH,YH,X_,zu,ju,WH,Ene,ag,ig,Qu=be(()=>{Ju=M(require("jsonwebtoken")),og=M(require("fs-extra")),Q_=M(require("node:path")),qi=M(require("joi")),OO=M(it());H();oi=M(pe()),cg=M(W());mE();NO=M(yn()),$H=M(bn()),VH=M(sg()),KH=M(Ao()),YH=M(ni()),X_=M(ce()),{HTTP_STATUS_CODES:zu,AUTHENTICATION_ERROR_MSGS:ju}=oi.hdb_errors;X_.default.initSync();WH=X_.default.get(x.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",Ene=X_.default.get(x.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",ag="RS256";a(lg,"getJWTRSAKeys");a(gne,"createTokens");a(Sne,"refreshOperationToken");a(wO,"validateOperationToken");a(ug,"validateRefreshToken");a(zH,"validateToken")});var IO=I((WCe,QH)=>{"use strict";var Tne=GH(),Xu=require("passport"),Ane=require("passport-local").Strategy,Rne=require("passport-http").BasicStrategy,yne=require("util"),bne=yn(),JH=yne.callbackify(bne.findAndValidateUser),YCe=Bn(),One=(H(),P(G)),jH=(Qu(),P(Z_));Xu.use(new Ane(function(e,t,r){JH(e,t,r)}));Xu.use(new Rne(function(e,t,r){JH(e,t,r)}));Xu.serializeUser(function(e,t){t(null,e)});Xu.deserializeUser(function(e,t){t(null,e)});function Nne(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":Xu.authenticate("basic",{session:!1},(o,c)=>{i(o,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===One.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?jH.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):jH.validateOperationToken(s).then(o=>{r(null,o)}).catch(o=>{r(o)});break;default:Xu.authenticate("local",{session:!1},function(o,c){i(o,c)})(e,t,r);break}}a(Nne,"authorize");function wne(e,t){let r=Tne(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(wne,"checkPermissions");QH.exports={authorize:Nne,checkPermissions:wne}});var dg=I((jCe,XH)=>{"use strict";var Ine=Kn();XH.exports={writeTransaction:Cne};function Cne(e,t,r){return Ine.writeTransaction(e,t,r)}a(Cne,"writeTransaction")});var rk=I((XCe,tk)=>{"use strict";var Pne=Wr(),Dne=Rs(),ZH=W(),Lne=bn(),QCe=dg(),Mne=require("clone"),PO=require("alasql"),vne=cE(),ek=require("util"),Une=ek.promisify(Dne.getTableSchema),xne=ek.promisify(Pne.search),Bne=(H(),P(G)),CO=ae();vne(PO);tk.exports={update:kne};var Hne="There was a problem performing this update. Please check the logs and try again.";async function kne({statement:e,hdb_user:t}){let r=await Une(e.table.databaseid,e.table.tableid),n=Fne(e.columns);CO.backtickASTSchemaItems(e);let{table:s,where:i}=e,o=Mne(s),c=CO.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=PO.parse(l).statements[0],f=await xne(u),d=Gne(n,f);return qne(o,d,t)}a(kne,"update");function Fne(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=PO.compile(`SELECT ${r.expression.toString()} AS [${Bne.FUNC_VAL}] FROM ?`)}),t}catch(t){throw ZH.error(t),new Error(Hne)}}a(Fne,"createUpdateRecord");function Gne(e,t){return CO.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}a(Gne,"buildUpdateRecords");async function qne(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await Lne.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){ZH.error(`Error delete new_attributes from update response: ${i}`)}return s}a(qne,"updateRecords")});var sk=I((rPe,nk)=>{var $ne=require("alasql"),Vne=Wr(),Kne=W(),Yne=Kn(),LO=require("util"),DO=ae(),Wne=(H(),P(G)),zne=Rs(),ePe=dg(),tPe=bn(),jne="record",Jne="successfully deleted",Qne=LO.callbackify(tse),Xne=LO.promisify(Vne.search),Zne=LO.promisify(zne.getTableSchema);nk.exports={convertDelete:Qne};function ese(e){return`${e.deleted_hashes.length} ${jne}${e.deleted_hashes.length===1?"":"s"} ${Jne}`}a(ese,"generateReturnMessage");async function tse({statement:e,hdb_user:t}){let r=await Zne(e.table.databaseid,e.table.tableid);DO.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=DO.isEmpty(s)?"":` WHERE ${s.toString()}`,o=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=$ne.parse(o).statements[0],l={operation:Wne.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await Xne(c);let u=await Yne.deleteRecords(l);return DO.isEmptyOrZeroLength(u.message)&&(u.message=ese(u)),delete u.txn_time,u}catch(u){throw Kne.error(u),u.hdb_code?u.message:u}}a(tse,"convertDelete")});var lk=I((sPe,ck)=>{"use strict";var rse=So(),{hdb_errors:ik}=pe(),{getDatabases:ok}=(De(),P(nt));ck.exports={checkSchemaExists:ak,checkSchemaTableExists:nse,schema_describe:rse};async function ak(e){if(!ok()[e])return ik.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(ak,"checkSchemaExists");async function nse(e,t){let r=await ak(e);if(r)return r;if(!ok()[e][t])return ik.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(nse,"checkSchemaTableExists")});var BO=I((lPe,Ak)=>{"use strict";var{decode:sse}=require("msgpackr"),{isMainThread:oPe,parentPort:aPe,threadId:cPe}=require("worker_threads"),pg=ir(),Zu=St(),UO=(H(),P(G)),Qr=W(),vO=ce(),ise=(H(),P(G)),{onMessageByType:ose}=rt(),_k=go(),{recordAction:uk,recordActionBinary:ase}=(Fi(),P(z_)),{publishToStream:cse}=pg,{ConsumerEvents:dk}=require("nats"),lse=Wr(),{promisify:use}=require("util"),{decodeBlobsWithWrites:dse}=(Ss(),P(qm)),pk=use(setTimeout),hg=1e4,mg,_g,fse,_se,hk,ep=new Map,ed=new Map;Ak.exports={initialize:mk,ingestConsumer:xO,setSubscription:pse,setIgnoreOrigin:Ese,getDatabaseSubscriptions:mse,updateConsumer:Ek};async function mk(){ose(UO.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,async n=>{await Ek(n)}),hk=!0,Qr.notify("Initializing clustering ingest service.");let{connection:e,jsm:t,js:r}=await pg.getNATSReferences();mg=e,_g=e.info.server_name,fse=t,_se=r}a(mk,"initialize");async function Ek(e){if(e.status==="start"){let{js:t,jsm:r}=await gk(e.node_domain_name);xO(e.stream_name,t,r,e.node_domain_name)}else if(e.status==="stop"){let t=ep.get(e.stream_name+e.node_domain_name);t&&(Qr.notify("Closing ingest consumer for node:",e.node_domain_name,"stream:",e.stream_name),await t.close?.(),ep.set(e.stream_name+e.node_domain_name,"close")),ed.get(e.node_domain_name)==="failed"&&ed.set(e.node_domain_name,"close")}}a(Ek,"updateConsumer");var Eg=new Map;function pse(e,t,r){let n=Eg.get(e);n||Eg.set(e,n=new Map),n.set(t,r),hk||mk().then(hse)}a(pse,"setSubscription");async function hse(){let e=await lse.searchByValue({database:"system",table:"hdb_nodes",search_attribute:"name",search_value:"*"});for await(let t of e){let r=t.name+Zu.SERVER_SUFFIX.LEAF,n,s;for(let i of t.subscriptions||[])if(i.subscribe===!0){if(!n&&({js:n,jsm:s}=await gk(r),!n))break;let{schema:o,table:c}=i,l=_k.createNatsTableStreamName(o,c);xO(l,n,s,r)}}}a(hse,"accessConsumers");async function gk(e){let t,r,n=1;for(;!r;)try{t=await mg.jetstream({domain:e}),r=await mg.jetstreamManager({domain:e,checkAPI:!1})}catch(s){if(ed.get(e)==="close")break;ed.set(e,"failed"),n%10===1&&Qr.warn("Nats ingest attempting to connect to:",e,"Nats error:",s.message);let i=n++*100<hg?n++*100:hg;await pk(i)}return{js:t,jsm:r}}a(gk,"connectToRemoteJS");function mse(){return Eg}a(mse,"getDatabaseSubscriptions");var Sk;function Ese(e){Sk=e}a(Ese,"setIgnoreOrigin");var Tk=100,fk=new Array(Tk),fg=0;async function xO(e,t,r,n){let{connection:s}=await pg.getNATSReferences();mg=s,_g=s.info.server_name;let i,o=1;for(;!i;)try{i=await t.consumers.get(e,_g),Qr.notify("Initializing ingest consumer for node:",n,"stream:",e)}catch(u){if(ed.get(n)==="close")break;o%10===1&&Qr.warn("Nats ingest error getting consumer:",n,"stream:",e,"Nats error:",u.message),u.code==="404"&&(Qr.notify("Nats ingest creating consumer for node:",n,"stream:",e),i=await pg.createConsumer(r,e,_g,new Date(Date.now()).toISOString()));let f=o++*100<hg?o++*100:hg;await pk(f)}let c=!1,l;for(;!c;){if(ep.get(e+n)==="close"||ed.get(n)==="close"){ep.delete(e+n),c=!0;continue}l=await i.consume({max_messages:vO.get(UO.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXCONSUMEMSGS)??100,bind:!0}),ep.set(e+n,l);let u=!1;(async()=>{for await(let f of await l.status())if(f.type===dk.ConsumerDeleted&&(await l.close(),c=!0),f.type===dk.HeartbeatsMissed){let d=f.data;Qr.trace(`${d} clustering ingest consumer heartbeats missed, node: ${n} stream: ${l.consumer.stream}`),d===100&&(Qr.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 fk[fg],fk[fg]=gse(f).catch(d=>{Qr.error(d)}),++fg>=Tk&&(fg=0)}catch(f){f.message==="consumer deleted"?(Qr.notify("Nats consumer deleted, closing messages for node:",n,"stream:",l.consumer.stream),await l.close(),c=!0):Qr.error("Error consuming clustering ingest, restarting consumer",f)}}}a(xO,"ingestConsumer");async function gse(e){let t;await dse(()=>{t=sse(e.data)}),uk(e.data.length,"bytes-received",e.subject,t.operation,"ingest"),Qr.trace("Nats message processor message size:",e?.msg?._msg?.size,"bytes");let r=e.headers,n=!1,s=vO.get(UO.CONFIG_PARAMS.CLUSTERING_NODENAME);r.has(Zu.MSG_HEADERS.TRANSACTED_NODES)&&r.values(Zu.MSG_HEADERS.TRANSACTED_NODES).indexOf(s)>-1&&(n=!0);let i=r.get(Zu.MSG_HEADERS.ORIGIN);if(n||(n=i===s&&!Sk),ase(n,"echo",e.subject,t.operation,"ingest"),n){e.ack();return}r.append(Zu.MSG_HEADERS.TRANSACTED_NODES,s);try{let{operation:o,schema:c,next:l,table:u,records:f,hash_values:d,__origin:p,expiresAt:_}=t;Qr.trace("processing message:",o,c,u,(f?"records: "+f.map(v=>v?.id):"")+(d?"ids: "+d:""),"with sequence:",e.seq),Qr.trace(`messageProcessor nats msg id: ${e.headers.get(Zu.MSG_HEADERS.NATS_MSG_ID)}`);let h;f||(f=d);let S=new Promise(v=>h=v),{timestamp:g,user:R,node_name:E}=p||{},A=Eg.get(c)?.get(u);if(!A)throw new Error(`Missing table for replication message: ${u}`);if(o==="define_schema")t.type=o,t.onCommit=h,A.send(t);else if(f.length===1&&!l)A.send({type:MO(o),value:f[0],id:d?.[0],expiresAt:_,timestamp:g,table:u,onCommit:h,user:R,nodeName:E});else{let v=f.map((F,$)=>({type:MO(o),value:F,expiresAt:_,id:d?.[$],table:u}));for(;l;)v.push({type:MO(l.operation),value:l.record,expiresAt:l.expiresAt,id:l.id,table:l.table}),l=l.next;A.send({type:"transaction",writes:v,table:u,timestamp:g,onCommit:h,user:R,nodeName:E})}vO.get(ise.CONFIG_PARAMS.CLUSTERING_REPUBLISHMESSAGES)!==!1&&cse(e.subject.split(".").slice(0,-1).join("."),_k.createNatsTableStreamName(c,u),e.headers,e.data),await S;let N=Date.now()-g;g&&uk(N,"replication-latency",e.subject,o,"ingest")}catch(o){Qr.error(o)}e.ack()}a(gse,"messageProcessor");function MO(e){switch(e){case"insert":case"upsert":case"update":return"put"}return e}a(MO,"convertOperation")});var ir=I((mPe,Hk)=>{"use strict";var wr=ce();wr.initSync();var Sse=require("fs-extra"),Tse=require("semver"),np=require("path"),{monotonicFactory:Ase}=require("ulidx"),yk=Ase(),Rse=require("util"),bk=require("child_process"),yse=Rse.promisify(bk.exec),bse=bk.spawn,vr=St(),Ve=(H(),P(G)),{packageJson:Ose,PACKAGE_ROOT:Nse}=st(),gg=ae(),ai=W(),Sg=go(),wse=dg(),tp=Rt(),{broadcast:Ise,onMessageByType:Cse,getWorkerIndex:Pse}=rt(),{isMainThread:Ok}=require("worker_threads"),{Encoder:Dse,decode:GO}=require("msgpackr"),Nk=new Dse,{isEmpty:pl}=gg,wk=yn(),dPe=48*36e11;Ok&&Cse(Ve.ITC_EVENT_TYPES.RESTART,()=>{Xr=void 0,_l=void 0});var{connect:Lse,StorageType:Mse,RetentionPolicy:vse,AckPolicy:qO,DeliverPolicy:$O,DiscardPolicy:Use,NatsConnection:fPe,JetStreamManager:_Pe,JetStreamClient:pPe,StringCodec:hPe,JSONCodec:xse,createInbox:VO,headers:Bse,ErrorCode:Rk}=require("nats"),{recordAction:Hse}=(Fi(),P(z_)),{encodeBlobsAsBuffers:kse}=(Ss(),P(qm)),Ik=xse(),Fse="clustering",Gse=Ose.engines[vr.NATS_SERVER_NAME],qse=np.join(Nse,"dependencies"),FO=np.join(qse,`${process.platform}-${process.arch}`,vr.NATS_BINARY_NAME),HO,kO,rp,dl,fl;Hk.exports={runCommand:Ck,checkNATSServerInstalled:$se,createConnection:KO,getConnection:sp,getJetStreamManager:ip,getJetStream:Dk,getNATSReferences:$i,getServerList:Kse,createLocalStream:YO,listStreams:Lk,deleteLocalStream:Yse,getServerConfig:td,listRemoteStreams:Wse,viewStream:zse,viewStreamIterator:jse,publishToStream:Jse,request:Zse,reloadNATS:WO,reloadNATSHub:eie,reloadNATSLeaf:tie,extractServerName:Xse,requestErrorHandler:rie,createLocalTableStream:xk,createTableStreams:iie,purgeTableStream:Bk,purgeSchemaTableStreams:oie,getStreamInfo:aie,updateLocalStreams:lie,closeConnection:Vse,getJsmServerName:Tg,addNatsMsgHeader:Mk,clearClientCache:Pk,updateRemoteConsumer:nie,createConsumer:vk,updateConsumerIterator:sie};async function Ck(e,t=void 0){let{stdout:r,stderr:n}=await yse(e,{cwd:t});if(n)throw new Error(n.replace(`
|
|
22
22
|
`,""));return r.replace(`
|
|
23
|
-
`,"")}a(Ck,"runCommand");async function $se(){try{await Sse.access(FO)}catch{return!1}let e=await Ck(`${FO} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return Tse.eq(t,Gse)}a($se,"checkNATSServerInstalled");async function KO(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await wk.getClusterUser();if(pl(o))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=o.username,r=o.decrypt_hash}ai.trace("create nats connection called");let i=await Lse({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:wr.get(Ve.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:wr.get(Ve.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:wr.get(Ve.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),ai.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(o=>{o&&ai.error("Error with Nats client connection, connection closed",o),i===Xr&&Pk()}),i}a(KO,"createConnection");function Pk(){Xr=void 0,dl=void 0,fl=void 0,_l=void 0}a(Pk,"clearClientCache");async function Vse(){Xr&&(await Xr.drain(),Xr=void 0,dl=void 0,fl=void 0,_l=void 0)}a(Vse,"closeConnection");var Xr,_l;async function sp(){return _l||(_l=KO(wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),Xr=await _l),Xr||_l}a(sp,"getConnection");async function ip(){if(dl)return dl;pl(Xr)&&await sp();let{domain:e}=td(Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(pl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return dl=await Xr.jetstreamManager({domain:e,timeout:6e4}),dl}a(ip,"getJetStreamManager");async function Dk(){if(fl)return fl;pl(Xr)&&await sp();let{domain:e}=td(Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(pl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return fl=Xr.jetstream({domain:e,timeout:6e4}),fl}a(Dk,"getJetStream");async function $i(){let e=Xr||await sp(),t=dl||await ip(),r=fl||await Dk();return{connection:e,jsm:t,js:r}}a($i,"getNATSReferences");async function Kse(e){let t=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await wk.getClusterUser(),s=await KO(t,r,n),i=VO(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=Ik.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 gg.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(Kse,"getServerList");async function YO(e,t){let{jsm:r}=await $i(),n=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:Mse.File,retention:vse.Limits,subjects:t,discard:Use.Old,max_msgs:s,max_bytes:i,max_age:n})}a(YO,"createLocalStream");async function Lk(){let{jsm:e}=await $i(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(Lk,"listStreams");async function Yse(e){let{jsm:t}=await $i();await t.streams.delete(e)}a(Yse,"deleteLocalStream");async function Wse(e){let{connection:t}=await $i(),r=[],n=VO(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(Ik.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(Wse,"listRemoteStreams");async function zse(e,t=void 0,r=void 0){let{jsm:n,js:s}=await $i(),i=yk(),o={durable_name:i,ack_policy:qO.Explicit};t&&(o.deliver_policy=$O.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=GO(f.data),p={nats_timestamp:f.info.timestampNanos,nats_sequence:f.info.streamSequence,entry:d};if(f.headers&&(p.origin=f.headers.get(vr.MSG_HEADERS.ORIGIN)),u.push(p),f.ack(),f.info.pending===0)break}return await c.delete(),u}a(zse,"viewStream");async function*jse(e,t=void 0,r=void 0){let{jsm:n,js:s}=await $i(),i=yk(),o={durable_name:i,ack_policy:qO.Explicit};t&&(o.deliver_policy=$O.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=GO(u.data);f[0]||(f=[f]);for(let d of f){let p={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:d};u.headers&&(p.origin=u.headers.get(vr.MSG_HEADERS.ORIGIN)),yield p}if(u.ack(),u.info.pending===0)break}await c.delete()}a(jse,"viewStreamIterator");async function Jse(e,t,r,n){ai.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=Mk(n,r);let{js:s}=await $i(),i=await Tg(),o=`${e}.${i}`,c=await kse(()=>n instanceof Uint8Array?n:Nk.encode(n));try{ai.trace(`publishToStream publishing to subject: ${o}`),Hse(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 Uk(async()=>{try{await s.publish(o,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){ai.trace(`publishToStream creating stream: ${t}`);let f=o.split(".");f[2]="*",await YO(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(Jse,"publishToStream");function Mk(e,t){t===void 0&&(t=Bse());let r=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(vr.MSG_HEADERS.ORIGIN)&&r&&t.append(vr.MSG_HEADERS.ORIGIN,r),t}a(Mk,"addNatsMsgHeader");function td(e){e=e.toLowerCase();let t=np.join(wr.get(Ve.CONFIG_PARAMS.ROOTPATH),Fse);if(e===Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return pl(kO)&&(kO={port:tp.getConfigFromFile(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:tp.getConfigFromFile(Ve.CONFIG_PARAMS.CLUSTERING_NODENAME)+vr.SERVER_SUFFIX.HUB,config_file:vr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:np.join(t,vr.PID_FILES.HUB),hdb_nats_path:t}),kO;if(e===Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return pl(HO)&&(HO={port:tp.getConfigFromFile(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:tp.getConfigFromFile(Ve.CONFIG_PARAMS.CLUSTERING_NODENAME)+vr.SERVER_SUFFIX.LEAF,config_file:vr.NATS_CONFIG_FILES.LEAF_SERVER,domain:tp.getConfigFromFile(Ve.CONFIG_PARAMS.CLUSTERING_NODENAME)+vr.SERVER_SUFFIX.LEAF,pid_file_path:np.join(t,vr.PID_FILES.LEAF),hdb_nats_path:t}),HO;ai.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a(td,"getServerConfig");async function vk(e,t,r,n){try{await e.consumers.add(t,{ack_policy:qO.Explicit,durable_name:r,deliver_policy:$O.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a(vk,"createConsumer");async function Qse(e,t,r){await e.consumers.delete(t,r)}a(Qse,"removeConsumer");function Xse(e){return e.split(".")[1]}a(Xse,"extractServerName");async function Zse(e,t,r=6e4,n=VO()){if(!gg.isObject(t))throw new Error("data param must be an object");let s=Nk.encode(t),{connection:i}=await $i(),o={timeout:r};n&&(o.reply=n,o.noMux=!0);let c=await i.request(e,s,o);return GO(c.data)}a(Zse,"request");function WO(e){return new Promise(async(t,r)=>{let n=bse(FO,["--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(WO,"reloadNATS");async function eie(){let{pid_file_path:e}=td(Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await WO(e)}a(eie,"reloadNATSHub");async function tie(){let{pid_file_path:e}=td(Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await WO(e)}a(tie,"reloadNATSLeaf");function rie(e,t,r){let n;switch(e.code){case Rk.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case Rk.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(rie,"requestErrorHandler");async function nie(e,t){let r=t+vr.SERVER_SUFFIX.LEAF,{connection:n}=await $i(),{jsm:s}=await die(r),{schema:i,table:o}=e,c=Sg.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await Uk(async()=>{if(e.subscribe===!0)await vk(s,c,n.info.server_name,l);else try{await Qse(s,c,n.info.server_name)}catch(u){ai.trace(u)}})}a(nie,"updateRemoteConsumer");async function sie(e,t,r,n){let s=Sg.createNatsTableStreamName(e,t),i=r+vr.SERVER_SUFFIX.LEAF,o={type:Ve.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!Ok&&Pse()<wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=BO();await c(o)}await Ise(o),n==="stop"&&await gg.async_set_timeout(1e3)}a(sie,"updateConsumerIterator");function Uk(e){return wse.writeTransaction(Ve.SYSTEM_SCHEMA_NAME,Ve.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(Uk,"exclusiveLock");async function xk(e,t){let r=Sg.createNatsTableStreamName(e,t),n=await Tg(),s=cie(e,t,n);await YO(r,[s])}a(xk,"createLocalTableStream");async function iie(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await xk(n,s)}}a(iie,"createTableStreams");async function Bk(e,t,r=void 0){if(wr.get(Ve.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=Sg.createNatsTableStreamName(e,t),{domain:s}=td(Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await sp()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")ai.warn(n);else throw n}}a(Bk,"purgeTableStream");async function oie(e,t){if(wr.get(Ve.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await Bk(e,t[r])}a(oie,"purgeSchemaTableStreams");async function aie(e){return(await ip()).streams.info(e)}a(aie,"getStreamInfo");function cie(e,t,r){return`${vr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(cie,"createSubjectName");async function Tg(){if(rp)return rp;if(rp=(await ip())?.nc?.info?.server_name,rp===void 0)throw new Error("Unable to get jetstream manager server name");return rp}a(Tg,"getJsmServerName");async function lie(){let e=await ip(),t=await Tg(),r=await Lk();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=uie(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(".");ai.trace(`Updating stream subject name from: ${i} to: ${f}`),s.subjects[0]=f,await e.streams.update(s.name,s)}}a(lie,"updateLocalStreams");function uie(e){let{config:t}=e,r=!1,n=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=wr.get(Ve.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(uie,"updateStreamLimits");async function die(e){let t,r;try{t=await Xr.jetstream({domain:e}),r=await Xr.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw ai.error("Unable to connect to:",e),n}return{js:t,jsm:r}}a(die,"connectToRemoteJS")});function zO(e){let t=e.get(Ag),r=t?(0,rd.unpack)(t):null;r||(r={remoteNameToId:{}});let n=Ze(),s=!1;r.nodeName=Ze();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:ap(e)??1,nodes:[]})})}i[n]=0,e.putSync(Ag,(0,rd.pack)(r))}return r}function op(e){return zO(e).remoteNameToId}function Fk(e,t){let r=zO(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(Ag,(0,rd.pack)(r)),s}function Rg(e,t){let r=zO(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(Ag,(0,rd.pack)(r))}return kk.trace?.("The remote node name map",e,n,s),s}var kk,rd,Ag,jO=be(()=>{kk=M(wi());Zn();rd=require("msgpackr"),Ag=Symbol.for("remote-ids");a(zO,"getIdMappingRecord");a(op,"exportIdMapping");a(Fk,"remoteToLocalNodeId");a(Rg,"getIdOfRemoteNode")});var JO={};Ue(JO,{commits_awaiting_replication:()=>sd,getHDBNodeTable:()=>or,getReplicationSharedStatus:()=>yg,iterateRoutes:()=>lp,shouldReplicateToNode:()=>cp,subscribeToNodeUpdates:()=>id});function or(){return Gk||(Gk=dt({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 yg(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(32),n&&{callback:n}))}function id(e){or().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;Kk.debug?.("adding node",n,"on node",Ze()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==Ze()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of or().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 cp(e,t){return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&or().primaryStore.get(Ze())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function fie(){id(e=>{La({},(t,r)=>{let n=e.name,s=qk.get(n);if(s||qk.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=yg(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of sd.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*lp(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=nd.default.get(x.REPLICATION_SECUREPORT)??(!nd.default.get(x.REPLICATION_PORT)&&nd.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||nd.default.get(x.REPLICATION_PORT)||nd.default.get(x.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){$k.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,shard:t.shard}}}var $k,Vk,nd,Kk,Gk,qk,sd,hl=be(()=>{De();Zn();ym();$k=require("worker_threads"),Vk=M(pe()),nd=M(ce());H();Kk=M(wi());server.nodes=[];a(or,"getHDBNodeTable");a(yg,"getReplicationSharedStatus");a(id,"subscribeToNodeUpdates");a(cp,"shouldReplicateToNode");qk=new Map;RL((e,t,r)=>{if(r>server.nodes.length)throw new Vk.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);sd||(sd=new Map,fie());let n=sd.get(e);return n||(n=[],sd.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(fie,"startSubscriptionToReplications");a(lp,"iterateRoutes")});var jk={};Ue(jk,{connectedToNode:()=>ml,disconnectedFromNode:()=>cd,ensureNode:()=>No,requestClusterStatus:()=>zk,startOnMainThread:()=>XO});async function XO(e){let t=0,r=Xe();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){bg.set(i,ap(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 lp(e))try{let c=!o.subscriptions;if(c){let u=Ze(),f=or().primaryStore.get(u);if(f!==null){let d=e.url??Ma();(f===void 0||f.url!==d||f.shard!==e.shard)&&await No(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)}id(s)});let n;function s(i,o=i?.name){let c=Ze()&&o===Ze()||Ma()&&i?.url===Ma();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let p of or().search([]))p.replicates&&p.name!==o&&s(p,p.name);n=d}if(at.trace("Setting up node replication for",i),!i){for(let[d,p]of Oo){let _;for(let[h,{worker:S,nodes:g}]of p){let R=g[0];if(R&&R.name==o){_=!0;for(let[E,{worker:A}]of p)p.delete(E),at.warn("Node was deleted, unsubscribing from node",o,E,d),A?.postMessage({type:"unsubscribe-from-node",node:o,database:E,url:d});break}}if(_){Oo.get(d).iterator.remove(),Oo.delete(d);return}}return}if(c)return;if(!i.url){at.info(`Node ${i.name} is missing url`);return}let l=Oo.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(at.info(`Added node ${i.name} at ${i.url} for process ${Ze()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[d,p]of od)if(i.url===p.url){od.delete(d);break}od.set(i.name,i)}let u=Xe();if(l||(l=new Map,Oo.set(i.url,l)),l.iterator=La(e,(d,p,_)=>{_?f(p,!0):f(p,!1)}),i.subscriptions)for(let d of i.subscriptions){let p=d.database||d.schema;u[p]||(at.warn(`Database ${p} not found for node ${i.name}, making a subscription anyway`),f(p,!1))}function f(d,p){at.trace("Setting up replication for database",d,"on node",i.name);let _=l.get(d),h,S=[{replicateByDefault:p,...i}];bg.has(d)&&(S.push({replicateByDefault:p,name:Ze(),start_time:bg.get(d),end_time:Date.now(),replicates:!0}),bg.delete(d));let g=cp(i,d),R=Vi.workers.filter(E=>E.name==="http");if(_?(h=_.worker,_.nodes=S):g&&(t=t%R.length,h=R[t++],l.set(d,{worker:h,nodes:S,url:i.url}),h?.on("exit",()=>{l.get(d)?.worker===h&&(l.delete(d),f(d,p))})),g)setTimeout(()=>{let E={type:"subscribe-to-node",database:d,nodes:S};h?h.postMessage(E):ad(E)},_ie);else{at.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],or().primaryStore.get(Ze())?.replicates),or().primaryStore.get(Ze())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};h?h.postMessage(E):Ng(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),cd=a(function(i){try{at.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(od.keys()),c=o.sort(),l=c.indexOf(i.name||ci(i.url));if(l===-1){at.warn("Disconnected node not found in node map",i.name,o);return}let u=Oo.get(i.url),f=u?.get(i.database);if(!f){at.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 p=(l+1)%c.length;for(;l!==p;){let _=c[p],h=od.get(_);u=Oo.get(h.url);let S=u?.get(i.database);if(!S){p=(p+1)%c.length;continue}let{worker:g,nodes:R}=S,E=!1;for(let A of f.nodes){if(R.some(N=>N.name===A.name)){at.info(`Disconnected node is already failing over to ${_} for ${i.database}`);continue}R.push(A),E=!0}if(!E){at.info(`Disconnected node ${i.name} has no nodes to fail over to ${_}`);return}f.redirectingTo=S,at.info(`Failing over ${i.database} from ${i.name} to ${_}`),g?g.postMessage({type:"subscribe-to-node",database:i.database,nodes:R}):ad({database:i.database,nodes:R});return}at.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){at.error("Error failing over node",o)}},"disconnectedFromNode"),ml=a(function(i){let o=Oo.get(i.url),c=o?.get(i.database);if(!c){at.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}if(c.connected=!0,c.latency=i.latency,c.redirectingTo){let{worker:l,nodes:u}=c.redirectingTo,f=u.find(d=>d.name===i.name);c.redirectingTo=null,f&&(u.splice(u.indexOf(f),1),l?l.postMessage({type:"subscribe-to-node",database:i.database,nodes:u}):ad({database:i.database,nodes:u}))}},"connectedToNode"),(0,Vi.onMessageByType)("disconnected-from-node",cd),(0,Vi.onMessageByType)("connected-to-node",ml),(0,Vi.onMessageByType)("request-cluster-status",zk)}function zk(e,t){let r=[];for(let[n,s]of od)try{let i=Oo.get(s.url);at.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:p}]of i)o.push({database:l,connected:f,latency:p,thread_id:u?.threadId,nodes:d.map(_=>_.name)});let c=(0,QO.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){at.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function No(e,t){let r=or();e=e??ci(t.url),t.name=e;try{if(t.ca){let s=new Wk.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){at.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(at.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.put(t);else{t.replicates&&!Yk.default.get(x.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,QO.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])]}at.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var Vi,Og,at,QO,Yk,Wk,_ie,Oo,cd,ml,od,bg,up=be(()=>{De();Vi=M(rt());Zn();Og=require("worker_threads");hl();at=M(W()),QO=require("lodash"),Yk=M(ce());H();Wk=require("crypto"),_ie=200,Oo=new Map,od=new Map,bg=new Map;a(XO,"startOnMainThread");a(zk,"requestClusterStatus");Og.parentPort&&(cd=a(e=>{Og.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),ml=a(e=>{Og.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Vi.onMessageByType)("subscribe-to-node",e=>{ad(e)}),(0,Vi.onMessageByType)("unsubscribe-from-node",e=>{Ng(e)}));a(No,"ensureNode")});var es=I(gF=>{"use strict";var ar=require("path"),wn=require("fs-extra"),ld=require("node-forge"),tF=require("net"),{generateKeyPair:eN,X509Certificate:wo,createPrivateKey:rF}=require("crypto"),pie=require("util");eN=pie.promisify(eN);var yt=ld.pki,li=require("joi"),{v4:nF}=require("uuid"),{validateBySchema:sN}=it(),_t=W(),bs=ce(),Os=(H(),P(G)),{CONFIG_PARAMS:ud}=Os,ui=Ky(),{ClientError:Ua}=pe(),wg=require("node:tls"),{relative:sF,join:hie}=require("node:path"),{CERT_PREFERENCE_APP:MPe,CERTIFICATE_VALUES:Jk}=ui,mie=da(),tN=Rt(),{table:Eie,getDatabases:gie,databases:ZO}=(De(),P(nt)),{getJWTRSAKeys:Qk}=(Qu(),P(Z_));Object.assign(gF,{generateKeys:aN,updateConfigCert:fF,createCsr:Nie,signCertificate:wie,setCertTable:dd,loadCertificates:lF,reviewSelfSignedCert:lN,createTLSSelector:pF,listCertificates:mF,addCertificate:Mie,removeCertificate:Uie,createNatsCerts:Pie,generateCertsKeys:Cie,getReplicationCert:fp,getReplicationCertAuth:Oie,renewSelfSigned:Die,hostnamesFromCert:EF,getKey:xie});var{urlToNodeName:iF,getThisNodeUrl:Sie,getThisNodeName:Cg,clearThisNodeName:Tie}=(Zn(),P(Io)),{readFileSync:Aie,watchFile:Rie,statSync:oF}=require("node:fs"),vPe=ce(),{getTicketKeys:yie,onMessageFromWorkers:bie}=rt(),va=W(),{isMainThread:aF}=require("worker_threads"),{TLSSocket:cF,createSecureContext:UPe}=require("node:tls"),iN=3650,dp=["127.0.0.1","localhost","::1"],oN=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];bie(async e=>{e.type===Os.ITC_EVENT_TYPES.RESTART&&(bs.initSync(!0),await lN())});var Ur;function Ba(){return Ur||(Ur=gie().system.hdb_certificate,Ur||(Ur=Eie({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__"}]}))),Ur}a(Ba,"getCertTable");async function fp(){let e=pF("operations-api"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(Cg());if(!r)return;let n=new wo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(fp,"getReplicationCert");async function Oie(){Ba();let e=(await fp()).options.cert,r=new wo(e).issuer.match(/CN=(.*)/)?.[1];return Ur.get(r)}a(Oie,"getReplicationCertAuth");var Xk,xa=new Map;function lF(){if(Xk)return;Xk=!0;let e=[{configKey:ud.TLS},{configKey:ud.OPERATIONSAPI_TLS}];Ba();let t=ar.dirname(tN.getConfigFilePath()),r;for(let{configKey:n}of e){let s=tN.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&sF(hie(t,"keys"),o);c&&Zk(o,l=>{xa.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&aF){let f;Zk(u,d=>{if(Jk.cert===d)return;let p=i.hostname??i.hostnames??i.host??i.hosts;p&&!Array.isArray(p)&&(p=[p]);let _=_F(u),h=new wo(_),S;try{S=uN(h)}catch(A){_t.error("error extracting common name from certificate",A);return}if(S==null){_t.error("error extracting common name from certificate");return}if(h.checkIssued(new wo(Jk.cert)))return;let g=Ur.primaryStore.get(S),R=oF(u).mtimeMs,E=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&R<=E){R<E&&_t.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=Ur.put({name:S,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:_,private_key_name:c,is_authority:l,hostnames:p,file_timestamp:R,details:{issuer:h.issuer.replace(/\n/g," "),subject:h.subject.replace(/\n/g," "),subject_alt_name:h.subjectAltName,serial_number:h.serialNumber,valid_from:h.validFrom,valid_to:h.validTo}})},l?"certificate authority":"certificate")}}}}}return r}a(lF,"loadCertificates");function Zk(e,t,r){let n,s=a((i,o)=>{try{let c=i.mtimeMs;c&&c!==n&&(o&&aF&&_t.warn(`Reloading ${r}:`,e),n=c,t(_F(e)))}catch(c){_t.error(`Error loading ${r}:`,e,c)}},"loadFile");wn.existsSync(e)?s(oF(e)):_t.error(`${r} file not found:`,e),Rie(e,{persistent:!1},s)}a(Zk,"loadAndWatch");function rN(){let e=Sie();if(e==null){let t=dp[0];return _t.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return iF(e)}a(rN,"getHost");function Ig(){let e=Cg();if(e==null){let t=dp[0];return _t.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(Ig,"getCommonName");async function Nie(){let e=await fp(),t=yt.certificateFromPem(e.options.cert),r=yt.privateKeyFromPem(e.options.key);_t.info("Creating CSR with cert named:",e.name);let n=yt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:Ig()},...oN];_t.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:uF()}];return _t.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),ld.pki.certificationRequestToPem(n)}a(Nie,"createCsr");function uF(){let e=dp.includes(Ig())?dp:[...dp,Ig()];return e.includes(rN())||e.push(rN()),[{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=>tF.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(uF,"certExtensions");async function wie(e){let t={},r=ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Ba();for await(let f of Ur.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if(xa.has(f.private_key_name)){n=xa.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await wn.exists(ar.join(r,f.private_key_name))){n=wn.readFile(ar.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await nN();s=f.ca,n=f.private_key}n=yt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=yt.certificateFromPem(s.certificate);_t.info("Signing CSR with cert named",s.name);let o=yt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return _t.error(f),new Error("Error verifying CSR: "+f.message)}let c=ld.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()+iN),_t.info("sign cert setting validity:",c.validity),_t.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),_t.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;_t.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,ld.md.sha256.create()),t.certificate=yt.certificateToPem(c)}else _t.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(wie,"signCertificate");async function Iie(e,t){await dd({name:Cg(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await dd({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(Iie,"createCertificateTable");async function dd(e){let t=new wo(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},Ba(),await Ur.patch(e)}a(dd,"setCertTable");async function aN(){let e=await eN("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(aN,"generateKeys");async function cN(e,t,r){let n=yt.createCertificate();if(!t){let o=await fp();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()+iN);let i=[{name:"commonName",value:Ig()},...oN];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(uF()),n.sign(e,ld.md.sha256.create()),yt.certificateToPem(n)}a(cN,"generateCertificates");async function nN(){let e=await mF(),t;for(let r of e){if(!r.is_authority)continue;let n=await hF(r.private_key_name);if(r.private_key_name&&n&&new wo(r.certificate).checkPrivateKey(rF(n))){_t.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;_t.trace("No CA found with matching private key")}a(nN,"getCertAuthority");async function dF(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()+iN);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${bs.get(ud.REPLICATION_HOSTNAME)??iF(bs.get(ud.REPLICATION_URL))??nF().split("-")[0]}`},...oN];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,ld.md.sha256.create());let o=ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME),c=ar.join(o,ui.PRIVATEKEY_PEM_NAME);return r&&await wn.writeFile(c,yt.privateKeyToPem(e)),n}a(dF,"generateCertAuthority");async function Cie(){let{private_key:e,public_key:t}=await aN(),r=await dF(e,t),n=await cN(e,t,r);await Iie(n,r),fF()}a(Cie,"generateCertsKeys");async function Pie(){let e=await cN(yt.privateKeyFromPem(ui.CERTIFICATE_VALUES.key),void 0,yt.certificateFromPem(ui.CERTIFICATE_VALUES.cert)),t=ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME),r=ar.join(t,ui.NATS_CERTIFICATE_PEM_NAME);await wn.exists(r)||await wn.writeFile(r,e);let n=ar.join(t,ui.NATS_CA_PEM_NAME);await wn.exists(n)||await wn.writeFile(n,ui.CERTIFICATE_VALUES.cert)}a(Pie,"createNatsCerts");async function Die(){Ba();for await(let e of Ur.search([{attribute:"is_self_signed",value:!0}]))await Ur.delete(e.name);await lN()}a(Die,"renewSelfSigned");async function lN(){Tie(),await lF(),Ba();let e=await nN();if(!e){_t.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=bs.get(ud.TLS_PRIVATEKEY),n=ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME),s,i=sF(n,r);try{s=yt.privateKeyFromPem(await wn.readFile(r))}catch(c){_t.warn("Unable to parse the TLS key",r,"A new key will be generated and used to create Certificate Authority",c),{private_key:s}=await aN(),await wn.exists(ar.join(n,ui.PRIVATEKEY_PEM_NAME))&&(i=`privateKey${nF().split("-")[0]}.pem`),await wn.writeFile(ar.join(n,i),yt.privateKeyToPem(s))}let o=await dF(s,yt.setRsaPublicKey(s.n,s.e),!1);await dd({name:o.subject.getField("CN").value,uses:["https"],certificate:yt.certificateToPem(o),private_key_name:i,is_authority:!0,is_self_signed:!0})}if(!await fp()){let r=Cg();_t.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await nN();let n=yt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await cN(yt.privateKeyFromPem(e.private_key),s,n);await dd({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(lN,"reviewSelfSignedCert");function fF(){let e=mie(Object.keys(Os.CONFIG_PARAM_MAP),!0),t=ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME),r=ar.join(t,ui.PRIVATEKEY_PEM_NAME),n=ar.join(t,ui.NATS_CERTIFICATE_PEM_NAME),s=ar.join(t,ui.NATS_CA_PEM_NAME),i=Os.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),tN.updateConfigValue(void 0,void 0,o,!1,!0)}a(fF,"updateConfigCert");function _F(e){return e.startsWith("-----BEGIN")?e:Aie(e,"utf8")}a(_F,"readPEM");var eF=wg.createSecureContext;wg.createSecureContext=function(e){if(!e.cert||!e.key)return eF(e);let t={...e};delete t.key,delete t.cert;let r=eF(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var Lie=cF.prototype._init;cF.prototype._init=function(e,t){Lie.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 El=new Map;function pF(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(),El.clear();let f=0;for await(let d of ZO.system.hdb_certificate.search([])){let p=d.certificate,_=new wo(p);d.is_authority&&(_.asString=p,El.set(_.subject,p))}for await(let d of ZO.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let p=e==="operations-api",_=d.is_self_signed?1:2;p&&d.uses?.includes?.("operations")&&(_+=1);let h=await hF(d.private_key_name),S=d.certificate,g=new wo(S);if(El.has(g.issuer)&&(S+=`
|
|
23
|
+
`,"")}a(Ck,"runCommand");async function $se(){try{await Sse.access(FO)}catch{return!1}let e=await Ck(`${FO} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return Tse.eq(t,Gse)}a($se,"checkNATSServerInstalled");async function KO(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await wk.getClusterUser();if(pl(o))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=o.username,r=o.decrypt_hash}ai.trace("create nats connection called");let i=await Lse({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:wr.get(Ve.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:wr.get(Ve.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:wr.get(Ve.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),ai.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(o=>{o&&ai.error("Error with Nats client connection, connection closed",o),i===Xr&&Pk()}),i}a(KO,"createConnection");function Pk(){Xr=void 0,dl=void 0,fl=void 0,_l=void 0}a(Pk,"clearClientCache");async function Vse(){Xr&&(await Xr.drain(),Xr=void 0,dl=void 0,fl=void 0,_l=void 0)}a(Vse,"closeConnection");var Xr,_l;async function sp(){return _l||(_l=KO(wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),Xr=await _l),Xr||_l}a(sp,"getConnection");async function ip(){if(dl)return dl;pl(Xr)&&await sp();let{domain:e}=td(Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(pl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return dl=await Xr.jetstreamManager({domain:e,timeout:6e4}),dl}a(ip,"getJetStreamManager");async function Dk(){if(fl)return fl;pl(Xr)&&await sp();let{domain:e}=td(Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(pl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return fl=Xr.jetstream({domain:e,timeout:6e4}),fl}a(Dk,"getJetStream");async function $i(){let e=Xr||await sp(),t=dl||await ip(),r=fl||await Dk();return{connection:e,jsm:t,js:r}}a($i,"getNATSReferences");async function Kse(e){let t=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await wk.getClusterUser(),s=await KO(t,r,n),i=VO(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=Ik.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 gg.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(Kse,"getServerList");async function YO(e,t){let{jsm:r}=await $i(),n=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:Mse.File,retention:vse.Limits,subjects:t,discard:Use.Old,max_msgs:s,max_bytes:i,max_age:n})}a(YO,"createLocalStream");async function Lk(){let{jsm:e}=await $i(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(Lk,"listStreams");async function Yse(e){let{jsm:t}=await $i();await t.streams.delete(e)}a(Yse,"deleteLocalStream");async function Wse(e){let{connection:t}=await $i(),r=[],n=VO(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(Ik.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(Wse,"listRemoteStreams");async function zse(e,t=void 0,r=void 0){let{jsm:n,js:s}=await $i(),i=yk(),o={durable_name:i,ack_policy:qO.Explicit};t&&(o.deliver_policy=$O.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=GO(f.data),p={nats_timestamp:f.info.timestampNanos,nats_sequence:f.info.streamSequence,entry:d};if(f.headers&&(p.origin=f.headers.get(vr.MSG_HEADERS.ORIGIN)),u.push(p),f.ack(),f.info.pending===0)break}return await c.delete(),u}a(zse,"viewStream");async function*jse(e,t=void 0,r=void 0){let{jsm:n,js:s}=await $i(),i=yk(),o={durable_name:i,ack_policy:qO.Explicit};t&&(o.deliver_policy=$O.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=GO(u.data);f[0]||(f=[f]);for(let d of f){let p={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:d};u.headers&&(p.origin=u.headers.get(vr.MSG_HEADERS.ORIGIN)),yield p}if(u.ack(),u.info.pending===0)break}await c.delete()}a(jse,"viewStreamIterator");async function Jse(e,t,r,n){ai.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=Mk(n,r);let{js:s}=await $i(),i=await Tg(),o=`${e}.${i}`,c=await kse(()=>n instanceof Uint8Array?n:Nk.encode(n));try{ai.trace(`publishToStream publishing to subject: ${o}`),Hse(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 Uk(async()=>{try{await s.publish(o,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){ai.trace(`publishToStream creating stream: ${t}`);let f=o.split(".");f[2]="*",await YO(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(Jse,"publishToStream");function Mk(e,t){t===void 0&&(t=Bse());let r=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(vr.MSG_HEADERS.ORIGIN)&&r&&t.append(vr.MSG_HEADERS.ORIGIN,r),t}a(Mk,"addNatsMsgHeader");function td(e){e=e.toLowerCase();let t=np.join(wr.get(Ve.CONFIG_PARAMS.ROOTPATH),Fse);if(e===Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return pl(kO)&&(kO={port:tp.getConfigFromFile(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:tp.getConfigFromFile(Ve.CONFIG_PARAMS.CLUSTERING_NODENAME)+vr.SERVER_SUFFIX.HUB,config_file:vr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:np.join(t,vr.PID_FILES.HUB),hdb_nats_path:t}),kO;if(e===Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return pl(HO)&&(HO={port:tp.getConfigFromFile(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:tp.getConfigFromFile(Ve.CONFIG_PARAMS.CLUSTERING_NODENAME)+vr.SERVER_SUFFIX.LEAF,config_file:vr.NATS_CONFIG_FILES.LEAF_SERVER,domain:tp.getConfigFromFile(Ve.CONFIG_PARAMS.CLUSTERING_NODENAME)+vr.SERVER_SUFFIX.LEAF,pid_file_path:np.join(t,vr.PID_FILES.LEAF),hdb_nats_path:t}),HO;ai.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a(td,"getServerConfig");async function vk(e,t,r,n){try{await e.consumers.add(t,{ack_policy:qO.Explicit,durable_name:r,deliver_policy:$O.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a(vk,"createConsumer");async function Qse(e,t,r){await e.consumers.delete(t,r)}a(Qse,"removeConsumer");function Xse(e){return e.split(".")[1]}a(Xse,"extractServerName");async function Zse(e,t,r=6e4,n=VO()){if(!gg.isObject(t))throw new Error("data param must be an object");let s=Nk.encode(t),{connection:i}=await $i(),o={timeout:r};n&&(o.reply=n,o.noMux=!0);let c=await i.request(e,s,o);return GO(c.data)}a(Zse,"request");function WO(e){return new Promise(async(t,r)=>{let n=bse(FO,["--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(WO,"reloadNATS");async function eie(){let{pid_file_path:e}=td(Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await WO(e)}a(eie,"reloadNATSHub");async function tie(){let{pid_file_path:e}=td(Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await WO(e)}a(tie,"reloadNATSLeaf");function rie(e,t,r){let n;switch(e.code){case Rk.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case Rk.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(rie,"requestErrorHandler");async function nie(e,t){let r=t+vr.SERVER_SUFFIX.LEAF,{connection:n}=await $i(),{jsm:s}=await die(r),{schema:i,table:o}=e,c=Sg.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await Uk(async()=>{if(e.subscribe===!0)await vk(s,c,n.info.server_name,l);else try{await Qse(s,c,n.info.server_name)}catch(u){ai.trace(u)}})}a(nie,"updateRemoteConsumer");async function sie(e,t,r,n){let s=Sg.createNatsTableStreamName(e,t),i=r+vr.SERVER_SUFFIX.LEAF,o={type:Ve.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!Ok&&Pse()<wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=BO();await c(o)}await Ise(o),n==="stop"&&await gg.async_set_timeout(1e3)}a(sie,"updateConsumerIterator");function Uk(e){return wse.writeTransaction(Ve.SYSTEM_SCHEMA_NAME,Ve.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(Uk,"exclusiveLock");async function xk(e,t){let r=Sg.createNatsTableStreamName(e,t),n=await Tg(),s=cie(e,t,n);await YO(r,[s])}a(xk,"createLocalTableStream");async function iie(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await xk(n,s)}}a(iie,"createTableStreams");async function Bk(e,t,r=void 0){if(wr.get(Ve.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=Sg.createNatsTableStreamName(e,t),{domain:s}=td(Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await sp()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")ai.warn(n);else throw n}}a(Bk,"purgeTableStream");async function oie(e,t){if(wr.get(Ve.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await Bk(e,t[r])}a(oie,"purgeSchemaTableStreams");async function aie(e){return(await ip()).streams.info(e)}a(aie,"getStreamInfo");function cie(e,t,r){return`${vr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(cie,"createSubjectName");async function Tg(){if(rp)return rp;if(rp=(await ip())?.nc?.info?.server_name,rp===void 0)throw new Error("Unable to get jetstream manager server name");return rp}a(Tg,"getJsmServerName");async function lie(){let e=await ip(),t=await Tg(),r=await Lk();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=uie(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(".");ai.trace(`Updating stream subject name from: ${i} to: ${f}`),s.subjects[0]=f,await e.streams.update(s.name,s)}}a(lie,"updateLocalStreams");function uie(e){let{config:t}=e,r=!1,n=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=wr.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=wr.get(Ve.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(uie,"updateStreamLimits");async function die(e){let t,r;try{t=await Xr.jetstream({domain:e}),r=await Xr.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw ai.error("Unable to connect to:",e),n}return{js:t,jsm:r}}a(die,"connectToRemoteJS")});function zO(e){let t=e.get(Ag),r=t?(0,rd.unpack)(t):null;r||(r={remoteNameToId:{}});let n=Ze(),s=!1;r.nodeName=Ze();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:ap(e)??1,nodes:[]})})}i[n]=0,e.putSync(Ag,(0,rd.pack)(r))}return r}function op(e){return zO(e).remoteNameToId}function Fk(e,t){let r=zO(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(Ag,(0,rd.pack)(r)),s}function Rg(e,t){let r=zO(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(Ag,(0,rd.pack)(r))}return kk.trace?.("The remote node name map",e,n,s),s}var kk,rd,Ag,jO=be(()=>{kk=M(wi());Zn();rd=require("msgpackr"),Ag=Symbol.for("remote-ids");a(zO,"getIdMappingRecord");a(op,"exportIdMapping");a(Fk,"remoteToLocalNodeId");a(Rg,"getIdOfRemoteNode")});var JO={};Ue(JO,{commits_awaiting_replication:()=>sd,getHDBNodeTable:()=>or,getReplicationSharedStatus:()=>yg,iterateRoutes:()=>lp,shouldReplicateToNode:()=>cp,subscribeToNodeUpdates:()=>id});function or(){return Gk||(Gk=dt({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 yg(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(32),n&&{callback:n}))}function id(e){or().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;Kk.debug?.("adding node",n,"on node",Ze()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==Ze()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of or().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 cp(e,t){return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&or().primaryStore.get(Ze())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function fie(){id(e=>{La({},(t,r)=>{let n=e.name,s=qk.get(n);if(s||qk.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=yg(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of sd.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*lp(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=nd.default.get(x.REPLICATION_SECUREPORT)??(!nd.default.get(x.REPLICATION_PORT)&&nd.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||nd.default.get(x.REPLICATION_PORT)||nd.default.get(x.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){$k.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,shard:t.shard}}}var $k,Vk,nd,Kk,Gk,qk,sd,hl=be(()=>{De();Zn();ym();$k=require("worker_threads"),Vk=M(pe()),nd=M(ce());H();Kk=M(wi());server.nodes=[];a(or,"getHDBNodeTable");a(yg,"getReplicationSharedStatus");a(id,"subscribeToNodeUpdates");a(cp,"shouldReplicateToNode");qk=new Map;RL((e,t,r)=>{if(r>server.nodes.length)throw new Vk.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);sd||(sd=new Map,fie());let n=sd.get(e);return n||(n=[],sd.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(fie,"startSubscriptionToReplications");a(lp,"iterateRoutes")});var jk={};Ue(jk,{connectedToNode:()=>ml,disconnectedFromNode:()=>cd,ensureNode:()=>No,requestClusterStatus:()=>zk,startOnMainThread:()=>XO});async function XO(e){let t=0,r=Xe();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){bg.set(i,ap(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 lp(e))try{let c=!o.subscriptions;if(c){let u=Ze(),f=or().primaryStore.get(u);if(f!==null){let d=e.url??Ma();(f===void 0||f.url!==d||f.shard!==e.shard)&&await No(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)}id(s)});let n;function s(i,o=i?.name){let c=Ze()&&o===Ze()||Ma()&&i?.url===Ma();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let p of or().search([]))p.replicates&&p.name!==o&&s(p,p.name);n=d}if(at.trace("Setting up node replication for",i),!i){for(let[d,p]of Oo){let _;for(let[h,{worker:S,nodes:g}]of p){let R=g[0];if(R&&R.name==o){_=!0;for(let[E,{worker:A}]of p)p.delete(E),at.warn("Node was deleted, unsubscribing from node",o,E,d),A?.postMessage({type:"unsubscribe-from-node",node:o,database:E,url:d});break}}if(_){Oo.get(d).iterator.remove(),Oo.delete(d);return}}return}if(c)return;if(!i.url){at.info(`Node ${i.name} is missing url`);return}let l=Oo.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(at.info(`Added node ${i.name} at ${i.url} for process ${Ze()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[d,p]of od)if(i.url===p.url){od.delete(d);break}od.set(i.name,i)}let u=Xe();if(l||(l=new Map,Oo.set(i.url,l)),l.iterator=La(e,(d,p,_)=>{_?f(p,!0):f(p,!1)}),i.subscriptions)for(let d of i.subscriptions){let p=d.database||d.schema;u[p]||(at.warn(`Database ${p} not found for node ${i.name}, making a subscription anyway`),f(p,!1))}function f(d,p){at.trace("Setting up replication for database",d,"on node",i.name);let _=l.get(d),h,S=[{replicateByDefault:p,...i}];bg.has(d)&&(S.push({replicateByDefault:p,name:Ze(),start_time:bg.get(d),end_time:Date.now(),replicates:!0}),bg.delete(d));let g=cp(i,d),R=Vi.workers.filter(E=>E.name==="http");if(_?(h=_.worker,_.nodes=S):g&&(t=t%R.length,h=R[t++],l.set(d,{worker:h,nodes:S,url:i.url}),h?.on("exit",()=>{l.get(d)?.worker===h&&(l.delete(d),f(d,p))})),g)setTimeout(()=>{let E={type:"subscribe-to-node",database:d,nodes:S};h?h.postMessage(E):ad(E)},_ie);else{at.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],or().primaryStore.get(Ze())?.replicates),or().primaryStore.get(Ze())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};h?h.postMessage(E):Ng(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),cd=a(function(i){try{at.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(od.keys()),c=o.sort(),l=c.indexOf(i.name||ci(i.url));if(l===-1){at.warn("Disconnected node not found in node map",i.name,o);return}let u=Oo.get(i.url),f=u?.get(i.database);if(!f){at.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 p=(l+1)%c.length;for(;l!==p;){let _=c[p],h=od.get(_);u=Oo.get(h.url);let S=u?.get(i.database);if(!S){p=(p+1)%c.length;continue}let{worker:g,nodes:R}=S,E=!1;for(let A of f.nodes){if(R.some(N=>N.name===A.name)){at.info(`Disconnected node is already failing over to ${_} for ${i.database}`);continue}R.push(A),E=!0}if(!E){at.info(`Disconnected node ${i.name} has no nodes to fail over to ${_}`);return}f.redirectingTo=S,at.info(`Failing over ${i.database} from ${i.name} to ${_}`),g?g.postMessage({type:"subscribe-to-node",database:i.database,nodes:R}):ad({database:i.database,nodes:R});return}at.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){at.error("Error failing over node",o)}},"disconnectedFromNode"),ml=a(function(i){let o=Oo.get(i.url),c=o?.get(i.database);if(!c){at.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}if(c.connected=!0,c.latency=i.latency,c.redirectingTo){let{worker:l,nodes:u}=c.redirectingTo,f=u.find(d=>d.name===i.name);c.redirectingTo=null,f&&(u.splice(u.indexOf(f),1),l?l.postMessage({type:"subscribe-to-node",database:i.database,nodes:u}):ad({database:i.database,nodes:u}))}},"connectedToNode"),(0,Vi.onMessageByType)("disconnected-from-node",cd),(0,Vi.onMessageByType)("connected-to-node",ml),(0,Vi.onMessageByType)("request-cluster-status",zk)}function zk(e,t){let r=[];for(let[n,s]of od)try{let i=Oo.get(s.url);at.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:p}]of i)o.push({database:l,connected:f,latency:p,thread_id:u?.threadId,nodes:d.map(_=>_.name)});let c=(0,QO.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){at.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function No(e,t){let r=or();e=e??ci(t.url),t.name=e;try{if(t.ca){let s=new Wk.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){at.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(at.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.put(t);else{t.replicates&&!Yk.default.get(x.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,QO.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])]}at.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var Vi,Og,at,QO,Yk,Wk,_ie,Oo,cd,ml,od,bg,up=be(()=>{De();Vi=M(rt());Zn();Og=require("worker_threads");hl();at=M(W()),QO=require("lodash"),Yk=M(ce());H();Wk=require("crypto"),_ie=200,Oo=new Map,od=new Map,bg=new Map;a(XO,"startOnMainThread");a(zk,"requestClusterStatus");Og.parentPort&&(cd=a(e=>{Og.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),ml=a(e=>{Og.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Vi.onMessageByType)("subscribe-to-node",e=>{ad(e)}),(0,Vi.onMessageByType)("unsubscribe-from-node",e=>{Ng(e)}));a(No,"ensureNode")});var es=I(gF=>{"use strict";var ar=require("path"),{watch:pie}=require("chokidar"),wn=require("fs-extra"),ld=require("node-forge"),tF=require("net"),{generateKeyPair:eN,X509Certificate:wo,createPrivateKey:rF}=require("crypto"),hie=require("util");eN=hie.promisify(eN);var yt=ld.pki,li=require("joi"),{v4:nF}=require("uuid"),{validateBySchema:sN}=it(),_t=W(),bs=ce(),Os=(H(),P(G)),{CONFIG_PARAMS:ud}=Os,ui=Ky(),{ClientError:Ua}=pe(),wg=require("node:tls"),{relative:sF,join:mie}=require("node:path"),{CERT_PREFERENCE_APP:MPe,CERTIFICATE_VALUES:Jk}=ui,Eie=da(),tN=Rt(),{table:gie,getDatabases:Sie,databases:ZO}=(De(),P(nt)),{getJWTRSAKeys:Qk}=(Qu(),P(Z_));Object.assign(gF,{generateKeys:aN,updateConfigCert:fF,createCsr:Nie,signCertificate:wie,setCertTable:dd,loadCertificates:lF,reviewSelfSignedCert:lN,createTLSSelector:pF,listCertificates:mF,addCertificate:Mie,removeCertificate:Uie,createNatsCerts:Pie,generateCertsKeys:Cie,getReplicationCert:fp,getReplicationCertAuth:Oie,renewSelfSigned:Die,hostnamesFromCert:EF,getKey:xie});var{urlToNodeName:iF,getThisNodeUrl:Tie,getThisNodeName:Cg,clearThisNodeName:Aie}=(Zn(),P(Io)),{readFileSync:Rie,statSync:oF}=require("node:fs"),vPe=ce(),{getTicketKeys:yie,onMessageFromWorkers:bie}=rt(),va=W(),{isMainThread:aF}=require("worker_threads"),{TLSSocket:cF,createSecureContext:UPe}=require("node:tls"),iN=3650,dp=["127.0.0.1","localhost","::1"],oN=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];bie(async e=>{e.type===Os.ITC_EVENT_TYPES.RESTART&&(bs.initSync(!0),await lN())});var Ur;function Ba(){return Ur||(Ur=Sie().system.hdb_certificate,Ur||(Ur=gie({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__"}]}))),Ur}a(Ba,"getCertTable");async function fp(){let e=pF("operations-api"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(Cg());if(!r)return;let n=new wo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(fp,"getReplicationCert");async function Oie(){Ba();let e=(await fp()).options.cert,r=new wo(e).issuer.match(/CN=(.*)/)?.[1];return Ur.get(r)}a(Oie,"getReplicationCertAuth");var Xk,xa=new Map;function lF(){if(Xk)return;Xk=!0;let e=[{configKey:ud.TLS},{configKey:ud.OPERATIONSAPI_TLS}];Ba();let t=ar.dirname(tN.getConfigFilePath()),r;for(let{configKey:n}of e){let s=tN.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&sF(mie(t,"keys"),o);c&&Zk(o,l=>{xa.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&aF){let f;Zk(u,d=>{if(Jk.cert===d)return;let p=i.hostname??i.hostnames??i.host??i.hosts;p&&!Array.isArray(p)&&(p=[p]);let _=_F(u),h=new wo(_),S;try{S=uN(h)}catch(A){_t.error("error extracting common name from certificate",A);return}if(S==null){_t.error("error extracting common name from certificate");return}if(h.checkIssued(new wo(Jk.cert)))return;let g=Ur.primaryStore.get(S),R=oF(u).mtimeMs,E=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&R<=E){R<E&&_t.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=Ur.put({name:S,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:_,private_key_name:c,is_authority:l,hostnames:p,file_timestamp:R,details:{issuer:h.issuer.replace(/\n/g," "),subject:h.subject.replace(/\n/g," "),subject_alt_name:h.subjectAltName,serial_number:h.serialNumber,valid_from:h.validFrom,valid_to:h.validTo}})},l?"certificate authority":"certificate")}}}}}return r}a(lF,"loadCertificates");function Zk(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&aF&&_t.warn(`Reloading ${r}:`,i),n=c,t(_F(i)))}catch(c){_t.error(`Error loading ${r}:`,i,c)}},"loadFile");wn.existsSync(e)?s(e,oF(e)):_t.error(`${r} file not found:`,e),pie(e,{persistent:!1}).on("change",s)}a(Zk,"loadAndWatch");function rN(){let e=Tie();if(e==null){let t=dp[0];return _t.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return iF(e)}a(rN,"getHost");function Ig(){let e=Cg();if(e==null){let t=dp[0];return _t.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(Ig,"getCommonName");async function Nie(){let e=await fp(),t=yt.certificateFromPem(e.options.cert),r=yt.privateKeyFromPem(e.options.key);_t.info("Creating CSR with cert named:",e.name);let n=yt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:Ig()},...oN];_t.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:uF()}];return _t.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),ld.pki.certificationRequestToPem(n)}a(Nie,"createCsr");function uF(){let e=dp.includes(Ig())?dp:[...dp,Ig()];return e.includes(rN())||e.push(rN()),[{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=>tF.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(uF,"certExtensions");async function wie(e){let t={},r=ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Ba();for await(let f of Ur.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if(xa.has(f.private_key_name)){n=xa.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await wn.exists(ar.join(r,f.private_key_name))){n=wn.readFile(ar.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await nN();s=f.ca,n=f.private_key}n=yt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=yt.certificateFromPem(s.certificate);_t.info("Signing CSR with cert named",s.name);let o=yt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return _t.error(f),new Error("Error verifying CSR: "+f.message)}let c=ld.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()+iN),_t.info("sign cert setting validity:",c.validity),_t.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),_t.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;_t.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,ld.md.sha256.create()),t.certificate=yt.certificateToPem(c)}else _t.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(wie,"signCertificate");async function Iie(e,t){await dd({name:Cg(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await dd({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(Iie,"createCertificateTable");async function dd(e){let t=new wo(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},Ba(),await Ur.patch(e)}a(dd,"setCertTable");async function aN(){let e=await eN("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(aN,"generateKeys");async function cN(e,t,r){let n=yt.createCertificate();if(!t){let o=await fp();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()+iN);let i=[{name:"commonName",value:Ig()},...oN];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(uF()),n.sign(e,ld.md.sha256.create()),yt.certificateToPem(n)}a(cN,"generateCertificates");async function nN(){let e=await mF(),t;for(let r of e){if(!r.is_authority)continue;let n=await hF(r.private_key_name);if(r.private_key_name&&n&&new wo(r.certificate).checkPrivateKey(rF(n))){_t.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;_t.trace("No CA found with matching private key")}a(nN,"getCertAuthority");async function dF(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()+iN);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${bs.get(ud.REPLICATION_HOSTNAME)??iF(bs.get(ud.REPLICATION_URL))??nF().split("-")[0]}`},...oN];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,ld.md.sha256.create());let o=ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME),c=ar.join(o,ui.PRIVATEKEY_PEM_NAME);return r&&await wn.writeFile(c,yt.privateKeyToPem(e)),n}a(dF,"generateCertAuthority");async function Cie(){let{private_key:e,public_key:t}=await aN(),r=await dF(e,t),n=await cN(e,t,r);await Iie(n,r),fF()}a(Cie,"generateCertsKeys");async function Pie(){let e=await cN(yt.privateKeyFromPem(ui.CERTIFICATE_VALUES.key),void 0,yt.certificateFromPem(ui.CERTIFICATE_VALUES.cert)),t=ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME),r=ar.join(t,ui.NATS_CERTIFICATE_PEM_NAME);await wn.exists(r)||await wn.writeFile(r,e);let n=ar.join(t,ui.NATS_CA_PEM_NAME);await wn.exists(n)||await wn.writeFile(n,ui.CERTIFICATE_VALUES.cert)}a(Pie,"createNatsCerts");async function Die(){Ba();for await(let e of Ur.search([{attribute:"is_self_signed",value:!0}]))await Ur.delete(e.name);await lN()}a(Die,"renewSelfSigned");async function lN(){Aie(),await lF(),Ba();let e=await nN();if(!e){_t.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=bs.get(ud.TLS_PRIVATEKEY),n=ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME),s,i=sF(n,r);try{s=yt.privateKeyFromPem(await wn.readFile(r))}catch(c){_t.warn("Unable to parse the TLS key",r,"A new key will be generated and used to create Certificate Authority",c),{private_key:s}=await aN(),await wn.exists(ar.join(n,ui.PRIVATEKEY_PEM_NAME))&&(i=`privateKey${nF().split("-")[0]}.pem`),await wn.writeFile(ar.join(n,i),yt.privateKeyToPem(s))}let o=await dF(s,yt.setRsaPublicKey(s.n,s.e),!1);await dd({name:o.subject.getField("CN").value,uses:["https"],certificate:yt.certificateToPem(o),private_key_name:i,is_authority:!0,is_self_signed:!0})}if(!await fp()){let r=Cg();_t.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await nN();let n=yt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await cN(yt.privateKeyFromPem(e.private_key),s,n);await dd({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(lN,"reviewSelfSignedCert");function fF(){let e=Eie(Object.keys(Os.CONFIG_PARAM_MAP),!0),t=ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME),r=ar.join(t,ui.PRIVATEKEY_PEM_NAME),n=ar.join(t,ui.NATS_CERTIFICATE_PEM_NAME),s=ar.join(t,ui.NATS_CA_PEM_NAME),i=Os.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),tN.updateConfigValue(void 0,void 0,o,!1,!0)}a(fF,"updateConfigCert");function _F(e){return e.startsWith("-----BEGIN")?e:Rie(e,"utf8")}a(_F,"readPEM");var eF=wg.createSecureContext;wg.createSecureContext=function(e){if(!e.cert||!e.key)return eF(e);let t={...e};delete t.key,delete t.cert;let r=eF(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var Lie=cF.prototype._init;cF.prototype._init=function(e,t){Lie.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 El=new Map;function pF(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(),El.clear();let f=0;for await(let d of ZO.system.hdb_certificate.search([])){let p=d.certificate,_=new wo(p);d.is_authority&&(_.asString=p,El.set(_.subject,p))}for await(let d of ZO.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let p=e==="operations-api",_=d.is_self_signed?1:2;p&&d.uses?.includes?.("operations")&&(_+=1);let h=await hF(d.private_key_name),S=d.certificate,g=new wo(S);if(El.has(g.issuer)&&(S+=`
|
|
24
24
|
`+El.get(g.issuer)),!h||!S)throw new Error("Missing private key or certificate for secure server");let R={ciphers:d.ciphers,ticketKeys:yie(),availableCAs:El,ca:t&&Array.from(El.values()),cert:S,key:h,key_file:d.private_key_name,is_self_signed:d.is_self_signed};o&&(R.sessionIdContext=o.sessionIdContext);let E=wg.createSecureContext(R);E.name=d.name,E.options=R,E.quality=_,E.certificateAuthorities=Array.from(El),E.certStart=S.toString().slice(0,100);let A=d.hostnames??EF(g);Array.isArray(A)||(A=[A]);let N;for(let v of A)if(v){v[0]==="*"&&(s=!0,v=v.slice(1)),v===rN()&&(_+=2),tF.isIP(v)&&(N=!0);let F=r.get(v)?.quality??0;_>F&&r.set(v,E)}else va.error("No hostname found for certificate at",wg.certificate);va.trace("Adding TLS",E.name,"for",o.ports||"client","cert named",d.name,"hostnames",A,"quality",_,"best quality",f),_>f&&(i.defaultContext=n=E,f=_,o&&(o.defaultContext=E))}catch(p){va.error("Error applying TLS for",d.name,p)}o?.secureContextsListeners.forEach(d=>d()),c(n)}catch(f){l(f)}}a(u,"updateTLS"),ZO.system.hdb_certificate.subscribe({listener:a(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(o,c){va.info("TLS requested for",o||"(no SNI)");let l=o;for(;;){let f=r.get(l);if(f)return va.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?va.debug("No certificate found to match",o,"using the default certificate"):va.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):va.info("No default certificate found"),c(null,u)}a(i,"SNICallback")}a(pF,"createTLSSelector");async function hF(e){let t=xa.get(e);return!t&&e?await wn.readFile(ar.join(bs.get(ud.ROOTPATH),Os.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(hF,"getPrivateKeyByName");async function mF(){Ba();let e=[];for await(let t of Ur.search([]))e.push(t);return e}a(mF,"listCertificates");async function Mie(e){let t=sN(e,li.object({name:li.string().required(),certificate:li.string().required(),is_authority:li.boolean().required(),private_key:li.string(),hosts:li.array(),uses:li.array()}));if(t)throw new Ua(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,o=new wo(n),c=!1,l=!1,u;for(let[_,h]of xa)!s&&!c&&o.checkPrivateKey(rF(h))&&(c=!0,u=_),s&&s===h&&(l=!0,u=_);if(!i&&!s&&!c)throw new Ua("A suitable private key was not found for this certificate");let f;if(!r){try{f=uN(o)}catch(_){_t.error(_)}if(f==null)throw new Ua("Error extracting certificate common name, please provide a name parameter")}let d=vie(r??f);s&&!c&&!l&&(await wn.writeFile(ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME,d+".pem"),s),xa.set(d,s));let p={name:r??f,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(p.private_key_name=u??d+".pem"),await dd(p),"Successfully added certificate: "+d}a(Mie,"addCertificate");function vie(e){return e.replace(/[^a-z0-9\.]/gi,"-")}a(vie,"sanitizeName");async function Uie(e){let t=sN(e,li.object({name:li.string().required()}));if(t)throw new Ua(t.message);let{name:r}=e;Ba();let n=await Ur.get(r);if(!n)throw new Ua(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Ur.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(_t.info("Removing private key named",s),await wn.remove(ar.join(bs.getHdbBasePath(),Os.LICENSE_KEY_DIR_NAME,s)))}return await Ur.delete(r),"Successfully removed "+r}a(Uie,"removeCertificate");function uN(e){return e.subject.match(/CN=(.*)/)?.[1]}a(uN,"extractCommonName");function EF(e){return e.subjectAltName?e.subjectAltName.split(",").map(t=>{let r=t.indexOf(":");if(t=t.slice(r+1),t=t.trim(),t[0]==='"')try{t=JSON.parse(t)}catch{}return t.indexOf("=")>-1?t.match(/CN=([^,]*)/)?.[1]:t}).filter(t=>t):[uN(e)]}a(EF,"hostnamesFromCert");async function xie(e){if(e.bypass_auth!==!0)throw new Ua("Unauthorized","401");let t=sN(e,li.object({name:li.string().required()}));if(t)throw new Ua(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await Qk()).privateKey;if(r===".jwtPublic")return(await Qk()).publicKey;if(xa.get(r))return xa.get(e.name);throw new Ua("Key not found")}a(xie,"getKey")});var BF={};Ue(BF,{CONFIRMATION_STATUS_POSITION:()=>xF,NodeReplicationConnection:()=>_p,OPERATION_REQUEST:()=>pN,RECEIVED_TIME_POSITION:()=>mN,RECEIVED_VERSION_POSITION:()=>hN,SENDING_TIME_POSITION:()=>vg,createWebSocket:()=>xg,database_subscriptions:()=>ka,replicateOverWS:()=>pp,table_update_listeners:()=>gN});async function xg(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=Ze(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!fN){let l=(0,MF.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),fN=u.secureContexts}if(i=fN.get(s),i&&ue.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,UF.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(c.secureContext=vF.createSecureContext({...i.options,ca:Array.from(Sl)})),new DF.WebSocket(e,"harperdb-replication-v1",c)}function pp(e,t,r){let n=t.port||t.securePort,s=gl.pid%1e3+"-"+LF.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||ka,d,p,_=!1,h=t.subscription;h?.then&&h.then(T=>h=T);let S=t.tables||u&&Xe()[u];if(!r){ue.error?.("No authorization provided"),dn(1008,"Unauthorized");return}let g=new Map,R=[],E=r.name;E&&t.connection&&(t.connection.nodeName=E);let A,N,v,F,$,Y,ee,oe=1e3,j,se=0,z=0,me=0,Ae=new Map,Pe=[],he=0,Ot;if(t.url){let T=a(()=>{$&&z===e._socket?.bytesRead&&me===e._socket?.bytesWritten?e.terminate():($=performance.now(),e.ping(),z=e._socket?.bytesRead,me=e._socket?.bytesWritten)},"send_ping");v=setInterval(T,IF).unref(),T()}else ut();e._socket?.setMaxListeners(200);function ut(){clearTimeout(F),z=e._socket?.bytesRead,me=e._socket?.bytesWritten,F=setTimeout(()=>{z===e._socket?.bytesRead&&me===e._socket?.bytesWritten&&(ue.warn?.(`Timeout waiting for ping from ${E}, terminating connection and reconnecting`),e.terminate())},IF*2).unref()}a(ut,"resetPingTimer");function br(){return p||(p=yg(d,u,E)),p}a(br,"getSharedStatus"),u&&oa(u);let ms,xn,au=[],cu=[],kA,FA=[],Mt=[],gf=[],Qh=150,Xh=25,Sf=0,Zh=0,Ie=!1,Tf,un,Cr,lu;e.on("message",T=>{se=performance.now();try{let b=T.dataView=new Tl(T.buffer,T.byteOffset,T.byteLength);if(T[0]>127){let O=(0,je.decode)(T),[U,L,C]=O;switch(U){case TF:{if(L){if(E){if(E!==L){ue.error?.(s,`Node name mismatch, expecting to connect to ${E}, but peer reported name as ${L}, disconnecting`),e.send((0,je.encode)([fd])),dn(1008,"Node name mismatch");return}}else if(E=L,t.connection?.tentativeNode){let de=t.connection.tentativeNode;de.name=E,t.connection.tentativeNode=null,No(E,de)}if(t.connection&&(t.connection.nodeName=E),ue.debug?.(s,"received node name:",E,"db:",u),!u)try{oa(u=O[2]),u==="system"&&(ms=La(t,(de,re)=>{du(re)&&aa(re)}),e.on("close",()=>{ms?.remove()}))}catch(de){ue.warn?.(s,"Error setting database",de),e.send((0,je.encode)([fd])),dn(1008,de.message);return}Gr()}break}case NF:{ue.debug?.(s,"Received table definitions for",L.map(de=>de.table));for(let de of L){let re=O[2];de.database=re;let fe;du(re)&&(re==="system"?$e[re]?.[de.table]||(fe=m(de,$e[re]?.[de.table])):fe=m(de,$e[re]?.[de.table]),d||(d=fe?.auditStore),S||(S=Xe()?.[re]))}break}case fd:dn();break;case pN:try{let de=r?.replicates||r?.subscribers||r?.name;server.operation(L,{user:r},!de).then(re=>{Array.isArray(re)&&(re={results:re}),re.requestId=L.requestId,e.send((0,je.encode)([Dg,re]))},re=>{e.send((0,je.encode)([Dg,{requestId:L.requestId,error:re instanceof Error?re.toString():re}]))})}catch(de){e.send((0,je.encode)([Dg,{requestId:L.requestId,error:de instanceof Error?de.toString():de}]))}break;case Dg:let{resolve:B,reject:q}=g.get(L.requestId);L.error?q(new Error(L.error)):B(L),g.delete(L.requestId);break;case dN:let Q=O[3];S||(u?ue.error?.(s,"No tables found for",u):ue.error?.(s,"Database name never received"));let X=S[Q];X=m({table:Q,database:u,attributes:L.attributes,schemaDefined:L.schemaDefined},X),au[C]={name:Q,decoder:new je.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:L.typedStructs,structures:L.structures}),getEntry(de){return X.primaryStore.getEntry(de)},rootStore:X.primaryStore.rootStore};break;case AF:lu=d?Fk(L,d):new Map,kA=O[2],ue.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${kA}`);break;case RF:let k=C;gf[k]=L;break;case OF:br()[xF]=L,ue.trace?.(s,"received and broadcasting committed update",L),br().buffer.notify();break;case bF:A=L,h.send({type:"end_txn",localTime:A,remoteNodeIds:R});break;case Lg:{let de=O[1],{fileId:re,size:fe,finished:ie,error:J}=de,le=Ae.get(re);ue.debug?.("Received blob",re,"has stream",!!le,"connectedToBlob",!!le?.connectedToBlob,"length",O[2].length,"finished",ie),le||(le=new _N.PassThrough,le.expectedSize=fe,Ae.set(re,le)),le.lastChunk=Date.now(),ie?(J?(le.on("error",()=>{}),le.destroy(new Error("Blob error: "+J))):le.end(O[2]),le.connectedToBlob&&Ae.delete(re)):le.write(O[2]);break}case yF:{let de=L,re;try{let fe=O[3],ie=cu[C]||(cu[C]=S[O[4]]);if(!ie)return ue.warn?.("Unknown table id trying to handle record request",C);let J=ie.primaryStore.getBinaryFast(Symbol.for("structures")),le=J.length;if(le!==Zh){Zh=le;let Te=(0,je.decode)(J);e.send((0,je.encode)([dN,{typedStructs:Te.typed,structures:Te.named},C,ie.tableName]))}let Re=ie.primaryStore.getBinaryFast(fe);if(Re){let Te=ie.primaryStore.decoder.decode(Re,{valueAsBuffer:!0});re=(0,je.encode)([Pg,de,{value:Te.value,expiresAt:Te.expiresAt,version:Te.version,residencyId:Te.residencyId,nodeId:Te.nodeId,user:Te.user}])}else re=(0,je.encode)([Pg,de])}catch(fe){re=(0,je.encode)([Pg,de,{error:fe.message}])}e.send(re);break}case Pg:{let{resolve:de,reject:re,tableId:fe,key:ie}=g.get(O[1]),J=O[2];if(J?.error)re(new Error(J.error));else if(J){let le=au[fe].decoder.decode(J.value);J.value=le,J.key=ie,de(J)}else de();g.delete(O[1]);break}case SF:{Cr=L;let de,re,fe=!1;if(h){if(u!==h.databaseName&&!h.then){ue.error?.("Subscription request for wrong database",u,h.databaseName);return}}else h=f.get(u);if(ue.debug?.(s,"received subscription request for",u,"at",Cr),!h){let ye;h=new Promise(tt=>{ue.debug?.("Waiting for subscription to database "+u),ye=tt}),h.ready=ye,ka.set(u,h)}if(r.name)re=or().subscribe(r.name),re.then(async ye=>{de=ye;for await(let tt of de){let vt=tt.value;if(!(vt?.replicates===!0||vt?.replicates?.receives||vt?.subscriptions?.some(mr=>(mr.database||mr.schema)===u&&mr.publish!==!1))){fe=!0,e.send((0,je.encode)([fd])),dn(1008,`Unauthorized database subscription to ${u}`);return}}},ye=>{ue.error?.(s,"Error subscribing to HDB nodes",ye)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,je.encode)([fd])),dn(1008,`Unauthorized database subscription to ${u}`);return}if(un&&(ue.debug?.(s,"stopping previous subscription",u),un.emit("close")),Cr.length===0)return;let ie=Cr[0],J=a(ye=>{if(ye&&(ie.replicateByDefault?!ie.tables.includes(ye.tableName):ie.tables.includes(ye.tableName)))return{table:ye}},"tableToTableEntry"),le={txnTime:0},Re,Te,ve=1/0,Je,Zt=a((ye,tt)=>{if(ye.type==="end_txn"){le.txnTime&&(o[i]!==66&&ue.error?.("Invalid encoding of message"),fu(9),fu(Ug),yc(Je=tt),qr()),i=c,le.txnTime=0;return}let vt=ye.nodeId,mr=ye.tableId,Vt=Te[mr];if(!Vt&&(Vt=Te[mr]=J(h.tableById[mr]),!Vt))return ue.debug?.("Not subscribed to table",mr);let $r=Vt.table,bc=$r.primaryStore,Ut=bc.encoder;(ye.extendedType&Jm||!Ut.typedStructs)&&(Ut._mergeStructures(Ut.getStructures()),Ut.typedStructs&&(Ut.lastTypedStructuresLength=Ut.typedStructs.length));let tm=Re[vt];if(!(tm&&tm.startTime<tt&&(!tm.endTime||tm.endTime>tt)))return Mg&&ue.trace?.(s,"skipping replication update",ye.recordId,"to:",E,"from:",vt,"subscribed:",Re),oD();Mg&&ue.trace?.(s,"sending replication update",ye.recordId,"to:",E,"from:",vt,"subscribed:",Re);let GA=ye.version;le.txnTime!==GA&&(le.txnTime&&(Mg&&ue.trace?.(s,"new txn time, sending queued txn",le.txnTime),o[i]!==66&&ue.error?.("Invalid encoding of message"),qr()),le.txnTime=GA,i=c,yc(GA));let Oc=ye.residencyId,qA=uu(Oc,$r),rm;if(qA&&!qA.includes(E)){let Nc=uu(ye.previousResidencyId,$r);if(Nc&&!Nc.includes(E)&&(ye.type==="put"||ye.type==="patch")||$r.getResidencyById)return oD();let yf=ye.recordId;ue.trace?.(s,"sending invalidation",yf,E,"from",vt);let la=0;Oc&&(la|=Fc),ye.previousResidencyId&&(la|=Gc);let Ys,fn=null;for(let nm in $r.indices){if(!fn){if(Ys=ye.getValue(bc,!0),!Ys)break;fn={}}fn[nm]=Ys[nm]}rm=wu(ye.version,mr,yf,null,vt,ye.user,ye.type==="put"||ye.type==="patch"?"invalidate":ye.type,Ut.encode(fn),la,Oc,ye.previousResidencyId,ye.expiresAt)}function oD(){ue.trace?.(s,"skipping audit record",ye.recordId),Y||(Y=setTimeout(()=>{Y=null,(Je||0)+wF/2<ve&&(Mg&&ue.trace?.(s,"sending skipped sequence update",ve),e.send((0,je.encode)([bF,ve])))},wF).unref())}a(oD,"skipAuditRecord");let $A=Ut.typedStructs,VA=Ut.structures;if(($A?.length!=Vt.typed_length||VA?.length!=Vt.structure_length)&&(Vt.typed_length=$A?.length,Vt.structure_length=VA.length,ue.debug?.(s,"send table struct",Vt.typed_length,Vt.structure_length),Vt.sentName||(Vt.sentName=!0),e.send((0,je.encode)([dN,{typedStructs:$A,structures:VA,attributes:$r.attributes,schemaDefined:$r.schemaDefined},mr,Vt.table.tableName]))),Oc&&!Mt[Oc]&&(e.send((0,je.encode)([RF,qA,Oc])),Mt[Oc]=!0),rm)fu(rm.length),Rc(rm);else{let Nc=ye.encoded;ye.extendedType&Gn&&DR(()=>ye.getValue(bc),async la=>{let Ys=km(la);try{let fn;he++;for await(let nm of la.stream()){if(fn&&(ue.debug?.("Sending blob chunk",Ys,"length",fn.length),e.send((0,je.encode)([Lg,{fileId:Ys,size:la.size},fn]))),fn=nm,fe)return;e._socket.writableNeedDrain&&(ue.debug?.("draining",Ys),await new Promise(g2=>e._socket.once("drain",g2)),ue.debug?.("drained",Ys))}ue.debug?.("Sending final blob chunk",Ys,"length",fn.length),e.send((0,je.encode)([Lg,{fileId:Ys,size:la.size,finished:!0},fn]))}catch(fn){ue.debug?.("Error sending blob",fn),e.send((0,je.encode)([Lg,{fileId:Ys,finished:!0,error:fn.toString()},Buffer.alloc(0)]))}finally{he--,he<Xh&&Ot?.()}});let yf=Nc[0]===66?8:0;fu(Nc.length-yf),Rc(Nc,yf),ue.trace?.("wrote record",ye.recordId,"length:",Nc.length)}},"sendAuditRecord"),qr=a(()=>{c-i>8?(e.send(o.subarray(i,c)),ue.debug?.(s,"Sent message, size:",c-i)):ue.debug?.(s,"skipping empty transaction")},"sendQueuedData");un=new EN.EventEmitter,un.once("close",()=>{fe=!0,de?.end()});for(let{startTime:ye}of Cr)ye<ve&&(ve=ye);(re||Promise.resolve()).then(async()=>{h=await h,d=h.auditStore,Te=h.tableById.map(J),Re=[];for(let{name:tt,startTime:vt,endTime:mr}of Cr){let Vt=Rg(tt,d);ue.debug?.("subscription to",tt,"using local id",Vt,"starting",vt),Re[Vt]={startTime:vt,endTime:mr}}aa(u),ms||(ms=Al(tt=>{tt.databaseName===u&&aa(u)}),xn=hp(tt=>{tt===u&&(e.send((0,je.encode)([fd])),dn())}),e.on("close",()=>{ms?.remove(),xn?.remove()})),e.send((0,je.encode)([AF,op(h.auditStore),Cr.map(({name:tt})=>tt)]));let ye=!0;do{isFinite(ve)||(ue.warn?.("Invalid sequence id "+ve),dn(1008,"Invalid sequence id"+ve));let tt;if(ye&&!fe&&(ye=!1,!(TN(d)<=ve)&&(PF.default.get(x.REPLICATION_COPYTABLESTOCATCHUP)??Bie)&&server.nodes[0]?.name===E)){ue.info?.("Replicating all tables to",E);let mr=ve,Vt=Bg(d);for(let $r in S){if(!J($r))continue;let bc=S[$r];for(let Ut of bc.primaryStore.getRange({snapshot:!1})){if(fe)return;Ut.localTime>=ve&&(ue.trace?.(s,"Copying record from",u,$r,Ut.key,Ut.localTime),mr=Math.max(Ut.localTime,mr),tt=!0,br()[vg]=1,Zt({recordId:Ut.key,tableId:bc.tableId,type:"put",getValue(){return Ut.value},encoded:bc.primaryStore.getBinary(Ut.key),version:Ut.version,residencyId:Ut.residencyId,nodeId:Vt,extendedType:Ut.metadataFlags},Ut.localTime))}}ve=mr}for(let{key:vt,value:mr}of d.getRange({start:ve||1,exclusiveStart:!0,snapshot:!1})){if(fe)return;let Vt=wt(mr);ue.debug?.("sending audit record",new Date(vt)),br()[vg]=vt,ve=vt,Zt(Vt,vt),e._socket.writableNeedDrain?await new Promise($r=>{ue.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",$r)}):he>Xh?await new Promise($r=>{Ot=$r}):await new Promise(setImmediate),un.startTime=vt,tt=!0}tt&&Zt({type:"end_txn"},ve),br()[vg]=0,await HF(d)}while(!fe)}).catch(ye=>{ue.error?.(s,"Error handling subscription to node",ye),dn(1008,"Error handling subscription to node")});break}}return}b.position=8;let w=!0,y,D;do{br();let O=b.readInt();if(O===9&&b.getUint8(b.position)==Ug){b.position++,A=D=b.readFloat64(),p[hN]=A,p[mN]=Date.now(),ue.trace?.("received remote sequence update",A,u);break}let U=b.position,L=wt(T,U,U+O),C=au[L.tableId];C||ue.error?.(`No table found with an id of ${L.tableId}`);let B;L.residencyId&&(B=gf[L.residencyId],ue.trace?.(s,"received residency list",B,L.type,L.recordId));try{PR(()=>{y={table:C.name,id:L.recordId,type:L.type,nodeId:lu.get(L.nodeId),residencyList:B,timestamp:L.version,value:L.getValue(C),user:L.user,beginTxn:w,expiresAt:L.expiresAt}},q=>{let Q=km(q),X=Ae.get(Q);ue.debug?.("Received transaction with blob",Q,"has stream",!!X,"ended",!!X?.writableEnded),X?X.writableEnded&&Ae.delete(Q):(X=new _N.PassThrough,Ae.set(Q,X)),X.connectedToBlob=!0,X.lastChunk=Date.now(),q.size===void 0&&X.expectedSize&&(q.size=X.expectedSize);let k=createBlob(X,q),de=k.save({primaryStore:h.auditStore});return de&&(de.blobId=Q,Pe.push(de),de.finally(()=>{ue.debug?.(`Finished receiving blob stream ${Q}`),Pe.splice(Pe.indexOf(de),1)})),k})}catch(q){throw q.message+="typed structures for current decoder"+JSON.stringify(C.decoder.typedStructs),q}w=!1,ue.trace?.(s,"received replication message",L.type,"id",y.id,"version",new Date(L.version),"nodeId",y.nodeId),p[hN]=L.version,p[mN]=Date.now(),h.send(y),b.position=U+O}while(b.position<T.byteLength);Sf++,sr(T.byteLength,"bytes-received",`${E}.${u}.${y?.table||"unknown_table"}`,"replication","ingest"),Sf>Qh&&!Ie&&(Ie=!0,e.pause(),ue.debug?.(`Commit backlog causing replication back-pressure, requesting that ${E} pause replication`)),h.send({type:"end_txn",localTime:A,remoteNodeIds:R,async onCommit(){if(y){let O=Date.now()-y.timestamp;sr(O,"replication-latency",E+"."+u+"."+y.table,y.type,"ingest")}Sf--,Ie&&(Ie=!1,e.resume(),ue.debug?.(`Replication resuming ${E}`)),Pe.length>0&&await Promise.all(Pe),ue.trace?.("All blobs finished"),!N&&D&&(ue.trace?.(s,"queuing confirmation of a commit at",D),setTimeout(()=>{e.send((0,je.encode)([OF,N])),ue.trace?.(s,"sent confirmation of a commit at",N),N=null},Hie)),N=D,ue.debug?.("last sequence committed",new Date(D),u)}})}catch(b){ue.error?.(s,"Error handling incoming replication message",b)}}),e.on("ping",ut),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-$,ml({name:E,database:u,url:t.url,latency:t.connection.latency})),$=null}),e.on("close",(T,b)=>{clearInterval(v),clearTimeout(F),clearInterval(ee),un&&un.emit("close"),Tf&&Tf.end();for(let[w,{reject:y}]of g)y(new Error(`Connection closed ${b?.toString()} ${T}`));ue.debug?.(s,"closed",T,b?.toString())});function Af(){}a(Af,"recordRemoteNodeSequence");function dn(T,b){e.isFinished=!0,e.close(T,b)}a(dn,"close");function Gr(){if(_||(_=!0,t.connection?.on("subscriptions-updated",Gr)),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let T=new Map;try{for(let y of h?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let D of y.value.nodes||[])D.lastTxnTime>(T.get(D.id)??0)&&T.set(D.id,D.lastTxnTime)}catch(y){if(!y.message.includes("Can not re"))throw y}let b=t.connection?.nodeSubscriptions?.[0];R=[];let w=t.connection?.nodeSubscriptions.map((y,D)=>{let O=[],{replicateByDefault:U}=y;if(y.subscriptions){for(let q of y.subscriptions)if(q.subscribe&&(q.schema||q.database)===u){let Q=q.table;S?.[Q]?.replicate!==!1&&O.push(Q)}U=!1}else for(let q in S)(U?S[q].replicate===!1:S[q].replicate)&&O.push(q);let L=d&&Rg(y.name,d),C=h?.dbisDB?.get([Symbol.for("seq"),L])??1,B=Math.max(C?.seqId??1,(typeof y.start_time=="string"?new Date(y.start_time).getTime():y.start_time)??1);if(ue.debug?.("Starting time recorded in db",y.name,L,u,C?.seqId,"start time:",B,new Date(B)),b!==y){let q=d&&Rg(b.name,d),Q=h?.dbisDB?.get([Symbol.for("seq"),q])??1;for(let X of Q?.nodes||[])X.name===y.name&&(B=X.seqId,ue.debug?.("Using sequence id from proxy node",b.name,B))}return R.push(L),T.get(L)>B&&(B=T.get(L),ue.debug?.("Updating start time from more recent txn recorded",b.name,B)),{name:y.name,replicateByDefault:U,tables:O,startTime:B,endTime:y.end_time}});if(w)if(ue.debug?.(s,"sending subscription request",w,h?.dbisDB?.path),clearTimeout(j),w.length>0)e.send((0,je.encode)([SF,w]));else{let y=a(()=>{let D=performance.now();j=setTimeout(()=>{se<=D?dn(1008,"No nodes to subscribe to"):y()},oe)},"schedule_close");y()}}a(Gr,"sendSubscriptionRequestUpdate");function uu(T,b){if(!T)return;let w=FA[T];return w||(w=b.getResidencyRecord(T),FA[T]=w),w}a(uu,"getResidence");function du(T){return!(Ha&&Ha!="*"&&!Ha[T]&&!Ha.includes?.(T)&&!Ha.some?.(b=>b.name===T))}a(du,"checkDatabaseAccess");function oa(T){if(h=h||f.get(T),!du(T))throw new Error(`Access to database "${T}" is not permitted`);h||ue.warn?.(`No database named "${T}" was declared and registered`),d=h?.auditStore,S||(S=Xe()?.[T]);let b=Ze();if(b===E)throw b?new Error("Should not connect to self",b):new Error("Node name not defined");return em(b,T),!0}a(oa,"setDatabase");function em(T,b){let w=Xe()?.[b],y=[];for(let D in w){let O=w[D];y.push({table:D,schemaDefined:O.schemaDefined,attributes:O.attributes.map(U=>({name:U.name,type:U.type,isPrimaryKey:U.isPrimaryKey}))})}ue.trace?.("Sending database info for node",T,"database name",b),e.send((0,je.encode)([TF,T,b,y]))}a(em,"sendNodeDBName");function aa(T){let b=Xe()?.[T],w=[];for(let y in b){if(Cr&&!Cr.some(O=>O.replicateByDefault?!O.tables.includes(y):O.tables.includes(y)))continue;let D=b[y];w.push({table:y,schemaDefined:D.schemaDefined,attributes:D.attributes.map(O=>({name:O.name,type:O.type,isPrimaryKey:O.isPrimaryKey}))})}e.send((0,je.encode)([NF,w,T]))}a(aa,"sendDBSchema"),ee=setInterval(()=>{for(let[T,b]of Ae)b.lastChunk+3e4<Date.now()&&(ue.warn?.(`Timeout waiting for blob stream to finish ${T} from ${E}`),Ae.delete(T),b.end())},3e4).unref();let ca=1,Rf=[];return{end(){Tf&&Tf.end(),un&&un.emit("close")},getRecord(T){let b=ca++;return new Promise((w,y)=>{let D=[yF,b,T.table.tableId,T.id];Rf[T.table.tableId]||(D.push(T.table.tableName),Rf[T.table.tableId]=!0),e.send((0,je.encode)(D)),g.set(b,{tableId:T.table.tableId,key:T.id,resolve(O){let{table:U,entry:L}=T;w(O),O&&U._recordRelocate(L,O)},reject:y})})},sendOperation(T){let b=ca++;return T.requestId=b,e.send((0,je.encode)([pN,T])),new Promise((w,y)=>{g.set(b,{resolve:w,reject:y})})}};function fu(T){V(5),T<128?o[c++]=T:T<16384?(l.setUint16(c,T|32768),c+=2):T<1056964608?(l.setUint32(c,T|3221225472),c+=4):(o[c]=255,l.setUint32(c+1,T),c+=5)}function Rc(T,b=0,w=T.length){let y=w-b;V(y),T.copy(o,c,b,w),c+=y}function yc(T){V(8),l.setFloat64(c,T),c+=8}function V(T){if(T+16>o.length-c){let b=Buffer.allocUnsafeSlow(c+T-i+65536>>10<<11);o.copy(b,0,i,c),c=c-i,i=0,o=b,l=new DataView(o.buffer,0,o.length)}}function m(T,b){let w=T.database??"data";if(w!=="data"&&!$e[w]){ue.warn?.("Database not found",T.database);return}b||(b={});let y=b.schemaDefined,D=!1,O=T.schemaDefined,U=b.attributes||[];for(let L=0;L<T.attributes?.length;L++){let C=T.attributes[L],B=U[L];(!B||B.name!==C.name||B.type!==C.type)&&(y?ue.error?.(`Schema for '${u}.${T.table}' is defined locally, but attribute '${C.name}: ${C.type}' from '${E}' does not match local attribute ${B?"'"+B.name+": "+B.type+"'":"which does not exist"}`):(D=!0,O||(C.indexed=!0),U[L]=C))}return D?(ue.debug?.("(Re)creating",T),dt({table:T.table,database:T.database,schemaDefined:T.schemaDefined,attributes:U,...b})):b}}var PF,je,DF,LF,ue,EN,MF,vF,gl,UF,_N,SF,TF,AF,fd,RF,dN,yF,Pg,pN,Dg,bF,OF,NF,Lg,xF,hN,mN,vg,Bie,gN,ka,Mg,wF,Hie,IF,fN,CF,_p,SN=be(()=>{De();_o();jO();AN();Zn();PF=M(ce());H();Iu();je=require("msgpackr"),DF=require("ws"),LF=require("worker_threads"),ue=M(wi());up();EN=require("events"),MF=M(es()),vF=M(require("node:tls"));hl();gl=M(require("node:process")),UF=require("node:net");Fi();Ss();_N=require("node:stream"),SF=129,TF=140,AF=141,fd=142,RF=130,dN=132,yF=133,Pg=134,pN=136,Dg=137,bF=143,OF=144,NF=145,Lg=146,xF=0,hN=1,mN=2,vg=3,Bie=gl.env.HDB_LEADER_URL||gl.argv.includes("--HDB_LEADER_URL"),gN=new Map,ka=new Map,Mg=!0,wF=300,Hie=2,IF=3e4;a(xg,"createWebSocket");CF=1e3,_p=class extends EN.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??ci(r)}static{a(this,"NodeReplicationConnection")}socket;startTime;retryTime=CF;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions=[];latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await xg(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;ue.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${gl.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ue[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=CF,ml({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,n=pp(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this},{replicates:!0}),this.sessionResolve(n)}),this.socket.on("error",s=>{s.code==="SELF_SIGNED_CERT_IN_CHAIN"?(ue.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"?ue.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`):ue.error?.(`Error in connection to ${this.url} due to ${s.message}`)),this.sessionReject(s)}),this.socket.on("close",(s,i)=>{if(this.isConnected&&(cd({name:this.nodeName,database:this.databaseName,url:this.url,finished:this.socket.isFinished}),this.isConnected=!1),this.socket.isFinished){this.isFinished=!0,n?.end(),this.emit("finished");return}if(++this.retries%20===1){let o=i?.toString();ue.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>>3})}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(pp,"replicateOverWS")});var Io={};Ue(Io,{clearThisNodeName:()=>Yie,disableReplication:()=>qie,enabled_databases:()=>Ha,forEachReplicatedDatabase:()=>La,getThisNodeId:()=>Bg,getThisNodeName:()=>Ze,getThisNodeUrl:()=>Ma,hostnameToUrl:()=>Gg,lastTimeInAuditStore:()=>ap,monitorNodeCAs:()=>YF,replicateOperation:()=>zie,replication_certificate_authorities:()=>Sl,sendOperationToNode:()=>Ep,servers:()=>Fie,setReplicator:()=>zF,start:()=>Gie,startOnMainThread:()=>XO,subscribeToNode:()=>ad,unsubscribeFromNode:()=>Ng,urlToNodeName:()=>ci});function Gie(e){if(e.port||(e.port=Ns.default.get(x.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=Ns.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),!Ze())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let n of lp(e))t.set(ci(n.url),n);$ie(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=We.ws(async(n,s,i,o)=>{if(s.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return o(n,s,i);await i,n._socket.unref(),pp(n,e,s?.user),n.on("error",c=>{c.code!=="ECONNREFUSED"&&cr.error("Error in connection to "+this.url,c.message)})},e);e.runFirst=!0,We.http((n,s)=>{if(n.isWebSocket&&n.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){!n.authorized&&n._nodeRequest.socket.authorizationError&&cr.error(`Incoming client connection from ${n.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`,n._nodeRequest.socket.authorizationError);let i=or().primaryStore;if(n.authorized&&n.peerCertificate.subject){let o=n.peerCertificate.subject,c=o&&(i.get(o.CN)||t.get(o.CN));if(c)if(c?.revoked_certificates?.includes(n.peerCertificate.serialNumber)){cr.warn("Revoked certificate used in attempt to connect to node",c.name,"certificate serial number",n.peerCertificate.serialNumber);return}else n.user=c;else cr.warn(`No node found for certificate common name ${o.CN}, available nodes are ${Array.from(i.getRange({}).filter(({value:l})=>l).map(({key:l})=>l)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let o=i.get(n.ip)||t.get(n.ip);o?n.user=o:cr.warn(`No node found for IP address ${n.ip}, available nodes are ${Array.from(new Set([...i.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return s(n)},e);for(let n of r)if(n.secureContexts){let s=a(()=>{let i=new Set(n.secureContexts.values());n.defaultContext&&i.add(n.defaultContext);for(let o of i)try{let c=Array.from(Sl);o.options.availableCAs&&c.push(...o.options.availableCAs.values());let l={...o.options,ca:c};o.updatedContext=Fg.createSecureContext(l)}catch(c){cr.error("Error creating replication TLS config",c)}},"updateContexts");n.secureContextsListeners.push(s),YF(s),Ns.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1&&s()}}function YF(e){let t=0;id(r=>{r?.ca&&(Sl.add(r.ca),Sl.size!==t&&(t=Sl.size,e?.()))})}function qie(e=!0){KF=e}function $ie(e){KF||(Xe(),Ha=e.databases,La(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||ka;for(let[s,i]of mp){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];zF(r,s,e),gN.get(s)?.forEach(i=>i(s))}}))}function zF(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 WF extends Vr{static{a(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||ka,o=i.get(e),c=o?.tableById||[];c[t.tableId]=t;let l=o?.ready;if(cr.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new Hn,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 p of c){let _=Vie(p,WF.subscription,e);_?.isConnected&&!u.has(_)&&(!f||_.latency<f.latency)&&(f=_)}if(!f)throw l||new $F.ServerError("No connection to any other nodes are available",502);let d={requestId:kie++,table:t,entry:i,id:i.key};u.add(f);try{return await f.getRecord(d)}catch(p){if(f.isConnected)throw p;cr.warn("Error in load from node",kg,p),l||(l=p)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function jF(e,t,r,n,s){let i=mp.get(e);i||mp.set(e,i=new Map);let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new _p(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function Vie(e,t,r){let n=kF.get(e)?.get(r);if(n)return n;let s=or().primaryStore.get(e);return s?.url&&(n=jF(s.url,t,r,e,s.authorization),kF.set(e,mp.get(s.url))),n}async function Ep(e,t,r){r||(r={}),r.serverName=e.name;let n=await xg(e.url,r),s=pp(n,{},{});return new Promise((i,o)=>{n.on("open",()=>{i(s.sendOperation(t))}),n.on("error",c=>{o(c)}),n.on("close",c=>{cr.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function ad(e){try{VF.isMainThread&&cr.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=ka.get(e.database);if(!t){let n;t=new Promise(s=>{cr.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,ka.set(e.database,t)}let r=jF(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=>cp(n,e.database)),e.replicateByDefault)}catch(t){cr.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function Ng({name:e,url:t,database:r}){cr.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(or().primaryStore.getRange({})));let n=mp.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Kie(){if(RN!==void 0)return RN;let e=Ns.default.get(x.OPERATIONSAPI_TLS_CERTIFICATE)||Ns.default.get(x.TLS_CERTIFICATE);if(e)return RN=new GF.X509Certificate((0,qF.readFileSync)(e)).subject.match(/CN=(.*)/)?.[1]??null}function Ze(){return kg||(kg=Ns.default.get("replication_hostname")??ci(Ns.default.get("replication_url"))??Kie()??FF("operationsapi_network_secureport")??FF("operationsapi_network_port")??"127.0.0.1")}function Yie(){kg=void 0}function FF(e){let t=Ns.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function Hg(e){let t=Ns.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function Bg(e){return op(e)?.[Ze()]}function Ma(){let e=Ns.default.get("replication_url");return e||Gg(Ze())}function Gg(e){let t=Hg("replication_port");if(t)return`ws://${e}:${t}`;if(t=Hg("replication_secureport"),t)return`wss://${e}:${t}`;if(t=Hg("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=Hg("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function ci(e){if(e)return new URL(e).hostname}function La(e,t){for(let n of Object.getOwnPropertyNames($e))r(n);return hp(n=>{r(n)}),Al((n,s)=>{r(n.databaseName)});function r(n){let s=$e[n];cr.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):Wie(n)&&t(s,n,!1)}a(r,"forDatabase")}function Wie(e){let t=$e[e];for(let r in t)if(t[r].replicate)return!0}function ap(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function zie(e){let t={message:""};if(e.replicated){e.replicated=!1,cr.trace?.("Replicating operation",e.operation,"to nodes",We.nodes.map(n=>n.name));let r=await Promise.allSettled(We.nodes.map(n=>Ep(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=We.nodes[s]?.name,i})}return t}var Ns,cr,GF,qF,Fg,$F,VF,KF,kie,Fie,Sl,Ha,mp,kF,RN,kg,Zn=be(()=>{De();ga();hu();SN();Kr();Ns=M(ce()),cr=M(W()),GF=require("crypto"),qF=require("fs");up();hl();H();jO();Fg=M(require("node:tls")),$F=M(pe()),VF=require("worker_threads"),kie=1,Fie=[],Sl=Ns.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1?new Set(Fg.rootCertificates):new Set;a(Gie,"start");a(YF,"monitorNodeCAs");a(qie,"disableReplication");a($ie,"assignReplicationSource");a(zF,"setReplicator");mp=new Map;a(jF,"getConnection");kF=new Map;a(Vie,"getConnectionByName");a(Ep,"sendOperationToNode");a(ad,"subscribeToNode");a(Ng,"unsubscribeFromNode");a(Kie,"getCommonNameFromCert");a(Ze,"getThisNodeName");a(Yie,"clearThisNodeName");Object.defineProperty(We,"hostname",{get(){return Ze()}});a(FF,"getHostFromListeningPort");a(Hg,"getPortFromListeningPort");a(Bg,"getThisNodeId");We.replication={getThisNodeId:Bg,exportIdMapping:op};a(Ma,"getThisNodeUrl");a(Gg,"hostnameToUrl");a(ci,"urlToNodeName");a(La,"forEachReplicatedDatabase");a(Wie,"hasExplicitlyReplicatedTable");a(ap,"lastTimeInAuditStore");a(zie,"replicateOperation")});var Yg=I((aDe,eG)=>{"use strict";var _d=lk(),{validateBySchema:gp}=it(),{common_validators:pd,schema_regex:yN}=Li(),lr=require("joi"),jie=W(),Jie=require("uuid").v4,Vg=Ao(),hd=(H(),P(G)),Qie=require("util"),Fa=Kn(),{handleHDBError:Co,hdb_errors:Xie,ClientError:Sp}=pe(),{HDB_ERROR_MSGS:qg,HTTP_STATUS_CODES:Po}=Xie,{SchemaEventMsg:Kg}=ni(),JF=ir(),{getDatabases:Zie}=(De(),P(nt)),{transformReq:md}=ae(),{replicateOperation:QF}=(Zn(),P(Io)),$g=lr.string().min(1).max(pd.schema_length.maximum).pattern(yN).messages({"string.pattern.base":"{:#label} "+pd.schema_format.message}),eoe=lr.string().min(1).max(pd.schema_length.maximum).pattern(yN).messages({"string.pattern.base":"{:#label} "+pd.schema_format.message}).required(),toe=lr.string().min(1).max(pd.schema_length.maximum).pattern(yN).messages({"string.pattern.base":"{:#label} "+pd.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();eG.exports={createSchema:roe,createSchemaStructure:XF,createTable:noe,createTableStructure:ZF,createAttribute:coe,dropSchema:soe,dropTable:ioe,dropAttribute:ooe,getBackup:loe};async function roe(e){let t=await XF(e);return Vg.signalSchemaChange(new Kg(process.pid,e.operation,e.schema)),t}a(roe,"createSchema");async function XF(e){let t=gp(e,lr.object({database:$g,schema:$g}));if(t)throw new Sp(t.message);if(md(e),!await _d.checkSchemaExists(e.schema))throw Co(new Error,qg.SCHEMA_EXISTS_ERR(e.schema),Po.BAD_REQUEST,hd.LOG_LEVELS.ERROR,qg.SCHEMA_EXISTS_ERR(e.schema),!0);return await Fa.createSchema(e),`database '${e.schema}' successfully created`}a(XF,"createSchemaStructure");async function noe(e){return md(e),e.hash_attribute=e.primary_key??e.hash_attribute,await ZF(e)}a(noe,"createTable");async function ZF(e){let t=gp(e,lr.object({database:$g,schema:$g,table:eoe,residence:lr.array().items(lr.string().min(1)).optional(),hash_attribute:toe}));if(t)throw new Sp(t.message);if(!await _d.checkSchemaTableExists(e.schema,e.table))throw Co(new Error,qg.TABLE_EXISTS_ERR(e.schema,e.table),Po.BAD_REQUEST,hd.LOG_LEVELS.ERROR,qg.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Jie(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await Fa.createTable(n,e);else throw Co(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Po.BAD_REQUEST);else await Fa.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}a(ZF,"createTableStructure");async function soe(e){let t=gp(e,lr.object({database:lr.string(),schema:lr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Sp(t.message);md(e);let r=await _d.checkSchemaExists(e.schema);if(r)throw Co(new Error,r,Po.NOT_FOUND,hd.LOG_LEVELS.ERROR,r,!0);let n=await _d.schema_describe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await Fa.dropSchema(e),Vg.signalSchemaChange(new Kg(process.pid,e.operation,e.schema)),await JF.purgeSchemaTableStreams(e.schema,s);let i=await QF(e);return i.message=`successfully deleted '${e.schema}'`,i}a(soe,"dropSchema");async function ioe(e){let t=gp(e,lr.object({database:lr.string(),schema:lr.string(),table:lr.string().required()}));if(t)throw new Sp(t.message);md(e);let r=await _d.checkSchemaTableExists(e.schema,e.table);if(r)throw Co(new Error,r,Po.NOT_FOUND,hd.LOG_LEVELS.ERROR,r,!0);await Fa.dropTable(e),await JF.purgeTableStream(e.schema,e.table);let n=await QF(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(ioe,"dropTable");async function ooe(e){let t=gp(e,lr.object({database:lr.string(),schema:lr.string(),table:lr.string().required(),attribute:lr.string().required()}));if(t)throw new Sp(t.message);md(e);let r=await _d.checkSchemaTableExists(e.schema,e.table);if(r)throw Co(new Error,r,Po.NOT_FOUND,hd.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Co(new Error,"You cannot drop a hash attribute",Po.BAD_REQUEST,void 0,void 0,!0);if(hd.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Co(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Po.BAD_REQUEST,void 0,void 0,!0);try{return await Fa.dropAttribute(e),aoe(e),Vg.signalSchemaChange(new Kg(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw jie.error(`Got an error deleting attribute ${Qie.inspect(e)}.`),n}}a(ooe,"dropAttribute");function aoe(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(aoe,"dropAttributeFromGlobal");async function coe(e){md(e);let t=Zie()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Co(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Po.BAD_REQUEST,void 0,void 0,!0);return await Fa.createAttribute(e),Vg.signalSchemaChange(new Kg(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(coe,"createAttribute");function loe(e){return Fa.getBackup(e)}a(loe,"getBackup")});var rG=I((lDe,tG)=>{"use strict";var{OPERATIONS_ENUM:uoe}=(H(),P(G)),bN=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=uoe.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};tG.exports=bN});var ON=I((fDe,aG)=>{"use strict";var doe=Kn(),dDe=rG(),Wg=ae(),zg=(H(),P(G)),foe=ce(),{handleHDBError:nG,hdb_errors:_oe}=pe(),{HDB_ERROR_MSGS:sG,HTTP_STATUS_CODES:iG}=_oe,poe=Object.values(zg.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),oG="To use this operation audit log must be enabled in harperdb-config.yaml";aG.exports=hoe;async function hoe(e){if(Wg.isEmpty(e.schema))throw new Error(sG.SCHEMA_REQUIRED_ERR);if(Wg.isEmpty(e.table))throw new Error(sG.TABLE_REQUIRED_ERR);if(!foe.get(zg.CONFIG_PARAMS.LOGGING_AUDITLOG))throw nG(new Error,oG,iG.BAD_REQUEST,zg.LOG_LEVELS.ERROR,oG,!0);let t=Wg.checkSchemaTableExist(e.schema,e.table);if(t)throw nG(new Error,t,iG.NOT_FOUND,zg.LOG_LEVELS.ERROR,t,!0);if(!Wg.isEmpty(e.search_type)&&poe.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await doe.readAuditLog(e)}a(hoe,"readAuditLog")});var lG=I((pDe,cG)=>{"use strict";var{OPERATIONS_ENUM:moe}=(H(),P(G)),NN=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=moe.GET_BACKUP,this.schema=t,this.table=r}};cG.exports=NN});var fG=I((gDe,dG)=>{"use strict";var Eoe=Kn(),mDe=lG(),wN=ae(),goe=(H(),P(G)),EDe=ce(),{handleHDBError:Soe,hdb_errors:Toe}=pe(),{HDB_ERROR_MSGS:uG,HTTP_STATUS_CODES:Aoe}=Toe;dG.exports=Roe;async function Roe(e){if(wN.isEmpty(e.schema))throw new Error(uG.SCHEMA_REQUIRED_ERR);if(wN.isEmpty(e.table))throw new Error(uG.TABLE_REQUIRED_ERR);let t=wN.checkSchemaTableExist(e.schema,e.table);if(t)throw Soe(new Error,t,Aoe.NOT_FOUND,goe.LOG_LEVELS.ERROR,t,!0);return await Eoe.getBackup(read_audit_log_object)}a(Roe,"getBackup")});var mG=I((TDe,hG)=>{"use strict";var yoe=ce(),Ga=require("joi"),boe=it(),_G=require("moment"),Ooe=require("fs-extra"),IN=require("path"),Noe=require("lodash"),Tp=(H(),P(G)),{LOG_LEVELS:Rl}=(H(),P(G)),woe="YYYY-MM-DD hh:mm:ss",Ioe=IN.resolve(__dirname,"../logs");hG.exports=function(e){return boe.validateBySchema(e,Coe)};var Coe=Ga.object({from:Ga.custom(pG),until:Ga.custom(pG),level:Ga.valid(Rl.NOTIFY,Rl.FATAL,Rl.ERROR,Rl.WARN,Rl.INFO,Rl.DEBUG,Rl.TRACE),order:Ga.valid("asc","desc"),limit:Ga.number().min(1),start:Ga.number().min(0),log_name:Ga.custom(Poe)});function pG(e,t){if(_G(e,_G.ISO_8601).format(woe)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(pG,"validateDatetime");function Poe(e,t){if(Noe.invert(Tp.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=yoe.get(Tp.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?Tp.LOG_NAMES.HDB:e,i=s===Tp.LOG_NAMES.INSTALL?IN.join(Ioe,Tp.LOG_NAMES.INSTALL):IN.join(n,s);return Ooe.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(Poe,"validateReadLogPath")});var PN=I((RDe,gG)=>{"use strict";var jg=(H(),P(G)),Doe=W(),Loe=ce(),Moe=mG(),CN=require("path"),EG=require("fs-extra"),{once:voe}=require("events"),{handleHDBError:Uoe,hdb_errors:xoe}=pe(),{PACKAGE_ROOT:Boe}=st(),Hoe=CN.join(Boe,"logs"),koe=1e3,Foe=200;gG.exports=Goe;async function Goe(e){let t=Moe(e);if(t)throw Uoe(t,t.message,xoe.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=Loe.get(jg.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?jg.LOG_NAMES.HDB:e.log_name,s=n===jg.LOG_NAMES.INSTALL?CN.join(Hoe,jg.LOG_NAMES.INSTALL):CN.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?koe:e.limit,p=e.order===void 0?void 0:e.order,_=e.start===void 0?0:e.start,h=_+d,S=0;p==="desc"&&!l&&!f&&(S=Math.max(EG.statSync(s).size-(h+5)*Foe,0));let g=EG.createReadStream(s,{start:S});g.on("error",F=>{Doe.error(F)});let R=0,E=[],A="",N;g.on("data",F=>{let $=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;F=A+F;let Y=0,ee;for(;(ee=$.exec(F))&&!g.destroyed;){N&&(N.message=F.slice(Y,ee.index),v(N));let[oe,j,se]=ee,z=se.split("] ["),me=z[0],Ae=z[1];z.splice(0,2),N={timestamp:j,thread:me,level:Ae,tags:z,message:""},Y=ee.index+oe.length}A=F.slice(Y)}),g.on("end",F=>{g.destroyed||N&&(N.message=A.trim(),v(N))}),g.resume();function v(F){let $,Y,ee;switch(!0){case(i&&c&&u):$=new Date(F.timestamp),Y=new Date(l),ee=new Date(f),F.level===o&&$>=Y&&$<=ee&&R<_?R++:F.level===o&&$>=Y&&$<=ee&&(qa(F,p,E),R++,R===h&&g.destroy());break;case(i&&c):$=new Date(F.timestamp),Y=new Date(l),F.level===o&&$>=Y&&R<_?R++:F.level===o&&$>=Y&&(qa(F,p,E),R++,R===h&&g.destroy());break;case(i&&u):$=new Date(F.timestamp),ee=new Date(f),F.level===o&&$<=ee&&R<_?R++:F.level===o&&$<=ee&&(qa(F,p,E),R++,R===h&&g.destroy());break;case(c&&u):$=new Date(F.timestamp),Y=new Date(l),ee=new Date(f),$>=Y&&$<=ee&&R<_?R++:$>=Y&&$<=ee&&(qa(F,p,E),R++,R===h&&g.destroy());break;case i:F.level===o&&R<_?R++:F.level===o&&(qa(F,p,E),R++,R===h&&g.destroy());break;case c:$=new Date(F.timestamp),Y=new Date(l),$>=Y&&R<_?R++:$>=Y&&R>=_&&(qa(F,p,E),R++,R===h&&g.destroy());break;case u:$=new Date(F.timestamp),ee=new Date(f),$<=ee&&R<_?R++:$<=ee&&R>=_&&(qa(F,p,E),R++,R===h&&g.destroy());break;default:R<_?R++:(qa(F,p,E),R++,R===h&&g.destroy())}}return a(v,"onLogMessage"),await voe(g,"close"),E}a(Goe,"readLog");function qa(e,t,r){t==="desc"?qoe(e,r):t==="asc"?$oe(e,r):r.push(e)}a(qa,"pushLineToResult");function qoe(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(qoe,"insertDescending");function $oe(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($oe,"insertAscending")});var Jg=I((IDe,RG)=>{"use strict";var DN=require("joi"),{string:Ed,boolean:SG,date:Voe}=DN.types(),Koe=it(),{validateSchemaExists:bDe,validateTableExists:ODe,validateSchemaName:NDe}=Li(),Yoe=(H(),P(G)),Woe=St(),TG=ce();TG.initSync();var wDe=Ed.invalid(TG.get(Yoe.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Woe.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),AG={operation:Ed.valid("add_node","update_node","set_node_replication"),node_name:Ed.optional(),subscriptions:DN.array().items({table:Ed.optional(),schema:Ed.optional(),database:Ed.optional(),subscribe:SG.required(),publish:SG.required().custom(joe),start_time:Voe.iso()})};function zoe(e){return Koe.validateBySchema(e,DN.object(AG))}a(zoe,"addUpdateNodeValidator");function joe(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(joe,"checkForFalsy");RG.exports={addUpdateNodeValidator:zoe,validation_schema:AG}});var gd=I((PDe,yG)=>{"use strict";var LN=class{static{a(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},MN=class{static{a(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};yG.exports={Node:LN,NodeSubscription:MN}});var OG=I((LDe,bG)=>{"use strict";var Joe=(H(),P(G)).OPERATIONS_ENUM,vN=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Joe.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};bG.exports=vN});var Ap=I((vDe,NG)=>{"use strict";var UN=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},xN=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)}};NG.exports={RemotePayloadObject:UN,RemotePayloadSubscription:xN}});var IG=I((xDe,wG)=>{"use strict";var BN=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}};wG.exports=BN});var PG=I((qDe,CG)=>{"use strict";var Qoe=IG(),HDe=xt(),kDe=ft(),Xoe=W(),{getSchemaPath:FDe,getTransactionAuditStorePath:GDe}=Et(),{getDatabases:Zoe}=(De(),P(nt));CG.exports=eae;async function eae(e){let t=new Qoe;try{let r=Zoe()[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){Xoe.warn(`unable to stat table dbi due to ${r}`)}return t}a(eae,"lmdbGetTableSize")});var LG=I((VDe,DG)=>{"use strict";var HN=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}};DG.exports=HN});var Do=I((JDe,xG)=>{"use strict";var tae=require("fs-extra"),rae=require("path"),Zr=require("systeminformation"),$a=W(),MG=ir(),YDe=St(),Sd=(H(),P(G)),nae=PG(),sae=So(),{getThreadInfo:vG}=rt(),Rp=ce();Rp.initSync();var iae=LG(),{openEnvironment:WDe}=ft(),{getSchemaPath:zDe}=Et(),{database:jDe,databases:kN}=(De(),P(nt)),Qg;xG.exports={getHDBProcessInfo:$N,getNetworkInfo:KN,getDiskInfo:VN,getMemoryInfo:qN,getCPUInfo:GN,getTimeInfo:FN,getSystemInformation:YN,systemInformation:oae,getTableSize:WN,getMetrics:zN};function FN(){return Zr.time()}a(FN,"getTimeInfo");async function GN(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:o,governor:c,socket:l,cache:u,...f}=await Zr.cpu();f.cpu_speed=await Zr.cpuCurrentSpeed();let{raw_currentload:d,raw_currentload_idle:p,raw_currentload_irq:_,raw_currentload_nice:h,raw_currentload_system:S,raw_currentload_user:g,cpus:R,...E}=await Zr.currentLoad();return E.cpus=[],R.forEach(A=>{let{raw_load:N,raw_load_idle:v,raw_load_irq:F,raw_load_nice:$,raw_load_system:Y,raw_load_user:ee,...oe}=A;E.cpus.push(oe)}),f.current_load=E,f}catch(e){return $a.error(`error in getCPUInfo: ${e}`),{}}}a(GN,"getCPUInfo");async function qN(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await Zr.mem();return Object.assign(s,process.memoryUsage())}catch(e){return $a.error(`error in getMemoryInfo: ${e}`),{}}}a(qN,"getMemoryInfo");async function $N(){let e={core:[],clustering:[]};try{let t=await Zr.processes(),r;try{r=Number.parseInt(await tae.readFile(rae.join(Rp.get(Sd.CONFIG_PARAMS.ROOTPATH),Sd.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===Sd.NODE_ERROR_CODES.ENOENT)$a.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 $a.error(`error in getHDBProcessInfo: ${t}`),e}}a($N,"getHDBProcessInfo");async function VN(){let e={};try{if(!Rp.get(Sd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await Zr.disksIO();e.io=i;let{rx_sec:o,tx_sec:c,wx_sec:l,...u}=await Zr.fsStats();return e.read_write=u,e.size=await Zr.fsSize(),e}catch(t){return $a.error(`error in getDiskInfo: ${t}`),e}}a(VN,"getDiskInfo");async function KN(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Rp.get(Sd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await Zr.networkInterfaceDefault(),e.latency=await Zr.inetChecksite("google.com"),(await Zr.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:o,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:f,carrier_changes:d,...p}=n;e.interfaces.push(p)}),(await Zr.networkStats()).forEach(n=>{let{rx_sec:s,tx_sec:i,ms:o,...c}=n;e.stats.push(c)})),e}catch(t){return $a.error(`error in getNetworkInfo: ${t}`),e}}a(KN,"getNetworkInfo");async function YN(){if(Qg!==void 0)return Qg;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:o,...c}=await Zr.osInfo();e=c;let l=await Zr.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,Qg=e,Qg}catch(t){return $a.error(`error in getSystemInformation: ${t}`),e}}a(YN,"getSystemInformation");async function WN(){let e=[],t=await sae.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await nae(n));return e}a(WN,"getTableSize");async function zN(){let e={};for(let t in kN){let r=e[t]={},n=r.tables={};for(let s in kN[t])try{let i=kN[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:p}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:p}}let o=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=o[l];n[s]=c}catch(i){$a.notify(`Error getting stats for table ${s}: ${i}`)}}return e}a(zN,"getMetrics");async function UG(){if(Rp.get(Sd.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await MG.getNATSReferences(),t=await MG.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(UG,"getNatsStreamInfo");async function oae(e){let t=new iae;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await YN(),t.time=FN(),t.cpu=await GN(),t.memory=await qN(),t.disk=await VN(),t.network=await KN(),t.harperdb_processes=await $N(),t.table_size=await WN(),t.metrics=await zN(),t.threads=await vG(),t.replication=await UG(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await YN();break;case"time":t.time=FN();break;case"cpu":t.cpu=await GN();break;case"memory":t.memory=await qN();break;case"disk":t.disk=await VN();break;case"network":t.network=await KN();break;case"harperdb_processes":t.harperdb_processes=await $N();break;case"table_size":t.table_size=await WN();break;case"database_metrics":case"metrics":t.metrics=await zN();break;case"threads":t.threads=await vG();break;case"replication":t.replication=await UG();break;default:break}return t}a(oae,"systemInformation")});var Lo=I((tLe,FG)=>{"use strict";var aae=bn(),jN=ae(),cae=require("util"),yl=(H(),P(G)),BG=ce();BG.initSync();var lae=IO(),HG=Wr(),{Node:XDe,NodeSubscription:ZDe}=gd(),uae=Gu(),dae=OG(),{RemotePayloadObject:fae,RemotePayloadSubscription:_ae}=Ap(),{handleHDBError:pae,hdb_errors:hae}=pe(),{HTTP_STATUS_CODES:mae,HDB_ERROR_MSGS:Eae}=hae,gae=si(),Sae=Do(),{packageJson:Tae}=st(),{getDatabases:Aae}=(De(),P(nt)),eLe=cae.promisify(lae.authorize),Rae=HG.searchByHash,yae=HG.searchByValue;FG.exports={isEmpty:bae,getNodeRecord:Oae,upsertNodeRecord:Nae,buildNodePayloads:wae,checkClusteringEnabled:Iae,getAllNodeRecords:Cae,getSystemInfo:Pae,reverseSubscription:kG};function bae(e){return e==null}a(bae,"isEmpty");async function Oae(e){let t=new uae(yl.SYSTEM_SCHEMA_NAME,yl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Rae(t)}a(Oae,"getNodeRecord");async function Nae(e){let t=new dae(yl.SYSTEM_SCHEMA_NAME,yl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return aae.upsert(t)}a(Nae,"upsertNodeRecord");function kG(e){if(jN.isEmpty(e.subscribe)||jN.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(kG,"reverseSubscription");function wae(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=jN.getTableHashAttribute(l,u),{subscribe:d,publish:p}=kG(c),_=Aae()[l]?.[u],h=new _ae(l,u,f,p,d,c.start_time,_.schemaDefined?_.attributes:void 0);s.push(h)}return new fae(r,t,s,n)}a(wae,"buildNodePayloads");function Iae(){if(!BG.get(yl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw pae(new Error,Eae.CLUSTERING_NOT_ENABLED,mae.BAD_REQUEST,void 0,void 0,!0)}a(Iae,"checkClusteringEnabled");async function Cae(){let e=new gae(yl.SYSTEM_SCHEMA_NAME,yl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await yae(e))}a(Cae,"getAllNodeRecords");async function Pae(){let e=await Sae.getSystemInformation();return{hdb_version:Tae.version,node_version:e.node_version,platform:e.platform}}a(Pae,"getSystemInfo")});var JN=I((nLe,zG)=>{"use strict";var Xg=ir(),GG=ae(),qG=St(),$G=(H(),P(G)),Zg=W(),VG=Yg(),Dae=U_(),{RemotePayloadObject:Lae}=Ap(),{handleHDBError:KG,hdb_errors:Mae}=pe(),{HTTP_STATUS_CODES:YG}=Mae,{NodeSubscription:WG}=gd();zG.exports=vae;async function vae(e,t){let r;try{r=await Xg.request(`${t}.${qG.REQUEST_SUFFIX}`,new Lae($G.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),Zg.trace("Response from remote describe all request:",r)}catch(o){Zg.error(`addNode received error from describe all request to remote node: ${o}`);let c=Xg.requestErrorHandler(o,"add_node",t);throw KG(new Error,c,YG.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===qG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw KG(new Error,o,YG.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===$G.SYSTEM_SCHEMA_NAME){await Xg.createLocalTableStream(l,c);let h=new WG(l,c,o.publish,o.subscribe);h.start_time=o.start_time,i.push(h);continue}let u=GG.doesSchemaExist(l),f=n[l]!==void 0,d=c?GG.doesTableExist(l,c):!0,p=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!f||!d&&!p){s.push(o);continue}if(!u&&f&&(Zg.trace(`addNode creating schema: ${l}`),await VG.createSchema({operation:"create_schema",schema:l})),!d&&p){Zg.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let h=new Dae(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(h.attributes=n[l][c].attributes),await VG.createTable(h)}await Xg.createLocalTableStream(l,c);let _=new WG(l,c,o.publish,o.subscribe);_.start_time=o.start_time,i.push(_)}return{added:i,skipped:s}}a(vae,"reviewSubscriptions")});var bl={};Ue(bl,{addNodeBack:()=>kae,removeNodeBack:()=>Fae,setNode:()=>Hae});async function Hae(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=ci(t)):t=Gg(r);let n=(0,JG.validateBySchema)(e,Bae);if(n)throw(0,Mo.handleHDBError)(n,n.message,xae.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new Mo.ClientError("url or hostname is required for remove_node operation");let _=r,h=or(),S=await h.get(_);if(!S)throw new Mo.ClientError(_+" does not exist");try{await Ep({url:S.url},{operation:Kt.REMOVE_NODE_BACK,name:S?.subscriptions?.length>0?Ze():_},void 0)}catch(g){ts.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 h.delete(_),`Successfully removed '${_}' from cluster`}if(!t)throw new Mo.ClientError("url required for this operation");let s=Ma();if(s==null)throw new Mo.ClientError("replication url is missing from harperdb-config.yaml");let i,o,c;if(t?.startsWith("wss:")){i=await(0,ws.getReplicationCert)();let _=await(0,ws.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,ws.createCsr)(),ts.info("Sending CSR to target node:",t)):_&&(c=_.certificate,ts.info("Sending CA named",_.name,"to target node",t))}let l={operation:Kt.ADD_NODE_BACK,hostname:(0,Ka.get)(x.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:o,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,Ka.get)(x.REPLICATION_SHARD)!==void 0&&(l.shard=(0,Ka.get)(x.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(jG):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let _=jG(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 Ep({url:t},l,e)}catch(_){_.message=`Error returned from ${t}: `+_.message,ts.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&&(ts.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,ws.setCertTable)({name:Uae.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,ws.setCertTable)({name:Ze(),uses:["https","operations","wss"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let 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),e.shard!==void 0&&(d.shard=e.shard),d.replicates){let _={url:s,ca:c,replicates:!0,subscriptions:null};(0,Ka.get)(x.REPLICATION_SHARD)!==void 0&&(_.shard=(0,Ka.get)(x.REPLICATION_SHARD)),e.retain_authorization&&(_.authorization=e.authorization),e.start_time&&(_.start_time=e.start_time),await No(Ze(),_)}await No(u?u.nodeName:d.name??ci(t),d);let p;return e.operation==="update_node"?p=`Successfully updated '${t}'`:p=`Successfully added '${t}' to cluster`,f&&(p+=" but there was an error updating target node: "+f.message),p}async function kae(e){ts.trace("addNodeBack received request:",e);let t=await(0,ws.signCertificate)(e),r;e.csr?(r=t.signingCA,ts.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,ts.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,ws.getReplicationCertAuth)();if(n.replicates){let i={url:Ma(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,Ka.get)(x.REPLICATION_SHARD)!==void 0&&(i.shard=(0,Ka.get)(x.REPLICATION_SHARD)),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await No(Ze(),i)}return await No(e.hostname,n),t.nodeName=Ze(),t.usingCA=s?.certificate,ts.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function Fae(e){ts.trace("removeNodeBack received request:",e),await or().delete(e.name)}function jG(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var ws,JG,Va,Ka,ts,Mo,Uae,xae,Bae,Ol=be(()=>{ws=M(es()),JG=M(it()),Va=M(require("joi")),Ka=M(ce());H();up();hl();Zn();ts=M(W()),Mo=M(pe()),{pki:Uae}=require("node-forge"),{HTTP_STATUS_CODES:xae}=Mo.hdb_errors,Bae=Va.default.object({hostname:Va.default.string(),verify_tls:Va.default.boolean(),replicates:Va.default.boolean(),subscriptions:Va.default.array(),revoked_certificates:Va.default.array(),shard:Va.default.number()});a(Hae,"setNode");a(kae,"addNodeBack");a(Fae,"removeNodeBack");a(jG,"reverseSubscription")});var Td=I((fLe,XG)=>{"use strict";var{handleHDBError:eS,hdb_errors:Gae}=pe(),{HTTP_STATUS_CODES:tS}=Gae,{addUpdateNodeValidator:qae}=Jg(),rS=W(),nS=(H(),P(G)),QG=St(),$ae=ae(),yp=ir(),bp=Lo(),QN=ce(),Vae=JN(),{Node:Kae,NodeSubscription:Yae}=gd(),{broadcast:Wae}=rt(),{setNode:zae}=(Ol(),P(bl)),uLe=ce(),dLe=(H(),P(G)),jae="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Jae="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Qae=QN.get(nS.CONFIG_PARAMS.CLUSTERING_NODENAME);XG.exports=Xae;async function Xae(e,t=!1){if(rS.trace("addNode called with:",e),QN.get(nS.CONFIG_PARAMS.REPLICATION_URL)||QN.get(nS.CONFIG_PARAMS.REPLICATION_HOSTNAME))return zae(e);bp.checkClusteringEnabled();let r=qae(e);if(r)throw eS(r,r.message,tS.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let d=await bp.getNodeRecord(n);if(!$ae.isEmptyOrZeroLength(d))throw eS(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,tS.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Vae(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=jae,o;let c=bp.buildNodePayloads(s,Qae,nS.OPERATIONS_ENUM.ADD_NODE,await bp.getSystemInfo()),l=[];for(let d=0,p=s.length;d<p;d++){let _=s[d];s[d].start_time===void 0&&delete s[d].start_time,l.push(new Yae(_.schema,_.table,_.publish,_.subscribe))}rS.trace("addNode sending remote payload:",c);let u;try{u=await yp.request(`${n}.${QG.REQUEST_SUFFIX}`,c)}catch(d){rS.error(`addNode received error from request: ${d}`);for(let _=0,h=s.length;_<h;_++){let S=s[_];S.publish=!1,S.subscribe=!1,await yp.updateRemoteConsumer(S,n)}let p=yp.requestErrorHandler(d,"add_node",n);throw eS(new Error,p,tS.INTERNAL_SERVER_ERROR,"error",p)}if(u.status===QG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${n}: ${u.message}`;throw eS(new Error,d,tS.INTERNAL_SERVER_ERROR,"error",d)}rS.trace(u);for(let d=0,p=s.length;d<p;d++){let _=s[d];await yp.updateRemoteConsumer(_,n),_.subscribe===!0&&await yp.updateConsumerIterator(_.schema,_.table,n,"start")}let f=new Kae(n,l,u.system_info);return await bp.upsertNodeRecord(f),Wae({type:"nats_update"}),i.length>0?o.message=Jae:o.message=`Successfully added '${n}' to manifest`,o}a(Xae,"addNode")});var tw=I((hLe,eq)=>{"use strict";var{handleHDBError:XN,hdb_errors:Zae}=pe(),{HTTP_STATUS_CODES:ZN}=Zae,{addUpdateNodeValidator:ece}=Jg(),Op=W(),sS=(H(),P(G)),ZG=St(),pLe=ae(),Np=ir(),wp=Lo(),ew=ce(),{cloneDeep:tce}=require("lodash"),rce=JN(),{Node:nce,NodeSubscription:sce}=gd(),{broadcast:ice}=rt(),{setNode:oce}=(Ol(),P(bl)),ace="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",cce="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",lce=ew.get(sS.CONFIG_PARAMS.CLUSTERING_NODENAME);eq.exports=uce;async function uce(e){if(Op.trace("updateNode called with:",e),ew.get(sS.CONFIG_PARAMS.REPLICATION_URL)??ew.get(sS.CONFIG_PARAMS.REPLICATION_HOSTNAME))return oce(e);wp.checkClusteringEnabled();let t=ece(e);if(t)throw XN(t,t.message,ZN.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await wp.getNodeRecord(r);s.length>0&&(n=tce(s));let{added:i,skipped:o}=await rce(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=ace,c;let l=wp.buildNodePayloads(i,lce,sS.OPERATIONS_ENUM.UPDATE_NODE,await wp.getSystemInfo());for(let f=0,d=i.length;f<d;f++){let p=i[f];Op.trace(`updateNode updating work stream for node: ${r} subscription:`,p),i[f].start_time===void 0&&delete i[f].start_time}Op.trace("updateNode sending remote payload:",l);let u;try{u=await Np.request(`${r}.${ZG.REQUEST_SUFFIX}`,l)}catch(f){Op.error(`updateNode received error from request: ${f}`);let d=Np.requestErrorHandler(f,"update_node",r);throw XN(new Error,d,ZN.INTERNAL_SERVER_ERROR,"error",d)}if(u.status===ZG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${r}: ${u.message}`;throw XN(new Error,f,ZN.INTERNAL_SERVER_ERROR,"error",f)}Op.trace(u);for(let f=0,d=i.length;f<d;f++){let p=i[f];await Np.updateRemoteConsumer(p,r),p.subscribe===!0?await Np.updateConsumerIterator(p.schema,p.table,r,"start"):await Np.updateConsumerIterator(p.schema,p.table,r,"stop")}return n||(n=[new nce(r,[],u.system_info)]),await dce(n[0],i,u.system_info),o.length>0?c.message=cce:c.message=`Successfully updated '${r}'`,c}a(uce,"updateNode");async function dce(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 sce(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await wp.upsertNodeRecord(n),ice({type:"nats_update"})}a(dce,"updateNodeTable")});var iq=I((ELe,sq)=>{"use strict";var nq=require("joi"),{string:tq}=nq.types(),fce=it(),rq=(H(),P(G)),_ce=ce(),pce=St();sq.exports=hce;function hce(e){let t=tq.invalid(_ce.get(rq.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(pce.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=nq.object({operation:tq.valid(rq.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return fce.validateBySchema(e,r)}a(hce,"removeNodeValidator")});var iS=I((SLe,uq)=>{"use strict";var{handleHDBError:oq,hdb_errors:mce}=pe(),{HTTP_STATUS_CODES:aq}=mce,Ece=iq(),Ip=W(),cq=Lo(),gce=ae(),Ad=(H(),P(G)),lq=St(),rw=ir(),nw=ce(),{RemotePayloadObject:Sce}=Ap(),{NodeSubscription:Tce}=gd(),Ace=v_(),Rce=jc(),{broadcast:yce}=rt(),{setNode:bce}=(Ol(),P(bl)),Oce=nw.get(Ad.CONFIG_PARAMS.CLUSTERING_NODENAME);uq.exports=Nce;async function Nce(e){if(Ip.trace("removeNode called with:",e),nw.get(Ad.CONFIG_PARAMS.REPLICATION_URL)??nw.get(Ad.CONFIG_PARAMS.REPLICATION_HOSTNAME))return bce(e);cq.checkClusteringEnabled();let t=Ece(e);if(t)throw oq(t,t.message,aq.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await cq.getNodeRecord(r);if(gce.isEmptyOrZeroLength(n))throw oq(new Error,`Node '${r}' was not found.`,aq.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new Sce(Ad.OPERATIONS_ENUM.REMOVE_NODE,Oce,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let f=n.subscriptions[l];f.subscribe===!0&&await rw.updateConsumerIterator(f.schema,f.table,r,"stop");try{await rw.updateRemoteConsumer(new Tce(f.schema,f.table,!1,!1),r)}catch(d){Ip.error(d)}}try{i=await rw.request(`${r}.${lq.REQUEST_SUFFIX}`,s),Ip.trace("Remove node reply from remote node:",r,i)}catch(l){Ip.error("removeNode received error from request:",l),o=!0}let c=new Ace(Ad.SYSTEM_SCHEMA_NAME,Ad.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await Rce.deleteRecord(c),yce({type:"nats_update"}),i?.status===lq.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(Ip.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(Nce,"removeNode")});var _q=I((ALe,fq)=>{"use strict";var dq=require("joi"),{string:wce,array:Ice}=dq.types(),Cce=it(),Pce=Jg();fq.exports=Dce;function Dce(e){let t=dq.object({operation:wce.valid("configure_cluster").required(),connections:Ice.items(Pce.validation_schema).required()});return Cce.validateBySchema(e,t)}a(Dce,"configureClusterValidator")});var sw=I((yLe,gq)=>{"use strict";var pq=(H(),P(G)),oS=W(),Lce=ae(),Mce=ce(),vce=iS(),Uce=Td(),xce=Lo(),Bce=_q(),{handleHDBError:hq,hdb_errors:Hce}=pe(),{HTTP_STATUS_CODES:mq}=Hce,kce="Configure cluster complete.",Fce="Failed to configure the cluster. Check the logs for more details.",Gce="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";gq.exports=qce;async function qce(e){oS.trace("configure cluster called with:",e);let t=Bce(e);if(t)throw hq(t,t.message,mq.BAD_REQUEST,void 0,void 0,!0);let r=await xce.getAllNodeRecords(),n=[];if(Mce.get(pq.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let f=0,d=r.length;f<d;f++){let p=await Eq(vce,{operation:pq.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[f].name},r[f].name);n.push(p)}oS.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],p=await Eq(Uce,d,d.node_name);s.push(p)}oS.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 p=u[f];p.status==="rejected"&&(oS.error(p.node_name,p?.error?.message,p?.error?.stack),o.includes(p.node_name)||o.push(p.node_name)),(p?.result?.message?.includes?.("Successfully")||p?.result?.includes?.("Successfully"))&&(l=!0),!(typeof p.result=="string"&&p.result.includes("Successfully removed")||p.status==="rejected")&&c.push({node_name:p?.node_name,response:p?.result})}if(Lce.isEmptyOrZeroLength(o))return{message:kce,connections:c};if(l)return{message:Gce,failed_nodes:o,connections:c};throw hq(new Error,Fce,mq.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(qce,"configureCluster");async function Eq(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(Eq,"functionWrapper")});var Rq=I((OLe,Aq)=>{"use strict";var Cp=require("joi"),$ce=it(),{validateSchemaExists:Sq,validateTableExists:Vce,validateSchemaName:Tq}=Li(),Kce=Cp.object({operation:Cp.string().valid("purge_stream"),schema:Cp.string().custom(Sq).custom(Tq).optional(),database:Cp.string().custom(Sq).custom(Tq).optional(),table:Cp.string().custom(Vce).required()});function Yce(e){return $ce.validateBySchema(e,Kce)}a(Yce,"purgeStreamValidator");Aq.exports=Yce});var iw=I((wLe,yq)=>{"use strict";var{handleHDBError:Wce,hdb_errors:zce}=pe(),{HTTP_STATUS_CODES:jce}=zce,Jce=Rq(),Qce=ir(),Xce=Lo();yq.exports=Zce;async function Zce(e){e.schema=e.schema??e.database;let t=Jce(e);if(t)throw Wce(t,t.message,jce.BAD_REQUEST,void 0,void 0,!0);Xce.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Qce.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(Zce,"purgeStream")});var lS=I((CLe,Pq)=>{"use strict";var aw=Lo(),ele=ir(),cS=ce(),Rd=(H(),P(G)),Nl=St(),tle=ae(),ow=W(),{RemotePayloadObject:rle}=Ap(),{ErrorCode:bq}=require("nats"),{parentPort:Oq}=require("worker_threads"),{onMessageByType:nle}=rt(),{getThisNodeName:sle}=(Zn(),P(Io)),{requestClusterStatus:ile}=(up(),P(jk)),{getReplicationSharedStatus:ole,getHDBNodeTable:ale}=(hl(),P(JO)),{CONFIRMATION_STATUS_POSITION:cle,RECEIVED_VERSION_POSITION:lle,RECEIVED_TIME_POSITION:ule,SENDING_TIME_POSITION:dle}=(SN(),P(BF)),Nq=cS.get(Rd.CONFIG_PARAMS.CLUSTERING_ENABLED),wq=cS.get(Rd.CONFIG_PARAMS.CLUSTERING_NODENAME);Pq.exports={clusterStatus:fle,buildNodeStatus:Cq};var Iq;nle("cluster-status",async e=>{Iq(e)});async function fle(){if(cS.get(Rd.CONFIG_PARAMS.REPLICATION_URL)||cS.get(Rd.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(Oq){Oq.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{Iq=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=ole(u,l,o);c.lastCommitConfirmed=aS(f[cle]),c.lastReceivedRemoteTime=aS(f[lle]),c.lastReceivedLocalTime=aS(f[ule]),c.sendingMessage=aS(f[dle])}}}else n=ile();n.node_name=sle();let s=ale().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:wq,is_enabled:Nq,connections:[]};if(!Nq)return e;let t=await aw.getAllNodeRecords();if(tle.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(Cq(t[n],e.connections));return await Promise.allSettled(r),e}a(fle,"clusterStatus");function aS(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}a(aS,"asDate");async function Cq(e,t){let r=e.name,n=new rle(Rd.OPERATIONS_ENUM.CLUSTER_STATUS,wq,void 0,await aw.getSystemInfo()),s,i,o=Nl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await ele.request(Nl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Nl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=Nl.CLUSTER_STATUS_STATUSES.CLOSED,ow.error(`Error getting node status from ${r} `,s))}catch(l){ow.warn(`Error getting node status from ${r}`,l),l.code===bq.NoResponders?o=Nl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===bq.Timeout?o=Nl.CLUSTER_STATUS_STATUSES.TIMEOUT:o=Nl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new _le(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!==Rd.PRE_4_0_0_VERSION&&await aw.upsertNodeRecord(l)}catch(l){ow.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(Cq,"buildNodeStatus");function _le(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(_le,"NodeStatusObject")});var dS=I((DLe,Dq)=>{"use strict";var{handleHDBError:ple,hdb_errors:hle}=pe(),{HTTP_STATUS_CODES:mle}=hle,Ele=ir(),gle=Lo(),cw=ae(),uS=require("joi"),Sle=it(),Tle=2e3,Ale=uS.object({timeout:uS.number().min(1),connected_nodes:uS.boolean(),routes:uS.boolean()});Dq.exports=Rle;async function Rle(e){gle.checkClusteringEnabled();let t=Sle.validateBySchema(e,Ale);if(t)throw ple(t,t.message,mle.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||cw.autoCastBoolean(n),o=s===void 0||cw.autoCastBoolean(s),c={nodes:[]},l=await Ele.getServerList(r??Tle),u={};if(i)for(let f=0,d=l.length;f<d;f++){let p=l[f].statsz;p&&(u[l[f].server.name]=p.routes)}for(let f=0,d=l.length;f<d;f++){if(l[f].statsz)continue;let p=l[f].server,_=l[f].data;if(p.name.endsWith("-hub")){let h={name:p.name.slice(0,-4),response_time:l[f].response_time};i&&(h.connected_nodes=[],u[p.name]&&u[p.name].forEach(S=>{h.connected_nodes.includes(S.name.slice(0,-4))||h.connected_nodes.push(S.name.slice(0,-4))})),o&&(h.routes=_.cluster?.urls?_.cluster?.urls.map(S=>({host:S.split(":")[0],port:cw.autoCast(S.split(":")[1])})):[]),c.nodes.push(h)}}return c}a(Rle,"clusterNetwork")});var Uq=I((MLe,vq)=>{"use strict";var lw=require("joi"),Lq=it(),{route_constraints:Mq}=Wy();vq.exports={setRoutesValidator:yle,deleteRoutesValidator:ble};function yle(e){let t=lw.object({server:lw.valid("hub","leaf"),routes:Mq.required()});return Lq.validateBySchema(e,t)}a(yle,"setRoutesValidator");function ble(e){let t=lw.object({routes:Mq.required()});return Lq.validateBySchema(e,t)}a(ble,"deleteRoutesValidator")});var fS=I((ULe,qq)=>{"use strict";var vo=Rt(),uw=ae(),Is=(H(),P(G)),yd=ce(),xq=Uq(),{handleHDBError:Bq,hdb_errors:Ole}=pe(),{HTTP_STATUS_CODES:Hq}=Ole,kq="cluster routes successfully set",Fq="cluster routes successfully deleted";qq.exports={setRoutes:wle,getRoutes:Ile,deleteRoutes:Cle};function Nle(e){let t=vo.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=uw.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"?vo.updateConfigValue(Is.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):vo.updateConfigValue(Is.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:kq,set:i,skipped:s}}a(Nle,"setRoutesNats");function wle(e){let t=xq.setRoutesValidator(e);if(t)throw Bq(t,t.message,Hq.BAD_REQUEST,void 0,void 0,!0);if(yd.get(Is.CONFIG_PARAMS.CLUSTERING_ENABLED))return Nle(e);let r=[],n=[],s=yd.get(Is.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{Gq(s,i)?n.push(i):(s.push(i),r.push(i))}),vo.updateConfigValue(Is.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:kq,set:r,skipped:n}}a(wle,"setRoutes");function Gq(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(Gq,"existsInArray");function Ile(){if(yd.get(Is.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=vo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return yd.get(Is.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(Ile,"getRoutes");function Cle(e){let t=xq.deleteRoutesValidator(e);if(t)throw Bq(t,t.message,Hq.BAD_REQUEST,void 0,void 0,!0);if(yd.get(Is.CONFIG_PARAMS.CLUSTERING_ENABLED))return Ple(e);let r=[],n=[],s=yd.get(Is.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{Gq(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),vo.updateConfigValue(Is.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:Fq,deleted:r,skipped:n}}a(Cle,"deleteRoutes");function Ple(e){let t=vo.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 p=0,_=r.length;p<_;p++){let h=r[p];if(f.host===h.host&&f.port===h.port){r.splice(p,1),d=!0,o=!0,s.push(f);break}}if(!d){let p=!0;for(let _=0,h=n.length;_<h;_++){let S=n[_];if(f.host===S.host&&f.port===S.port){n.splice(_,1),c=!0,p=!1,s.push(f);break}}p&&i.push(f)}}return o&&(r=uw.isEmptyOrZeroLength(r)?null:r,vo.updateConfigValue(Is.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=uw.isEmptyOrZeroLength(n)?null:n,vo.updateConfigValue(Is.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:Fq,deleted:s,skipped:i}}a(Ple,"deleteRoutesNats")});var Vq=I((BLe,$q)=>{"use strict";var Pp=require("alasql"),wl=require("recursive-iterator"),di=W(),Dle=ae(),Dp=(H(),P(G)),dw=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,Mle(this.ast,this.affected_attributes,this.table_lookup,this.schema_lookup,this.table_to_schema_lookup)}getAttributesBySchemaTableName(t,r){if(!t||!r||!this.affected_attributes)return[];if(this.affected_attributes.has(t))return!this.affected_attributes.get(t).has(r)&&(r=this.table_lookup.get(r),!r)?[]:this.affected_attributes.get(t).get(r)}getAllTables(){let t=[];if(!this.affected_attributes)return t;for(let r of this.affected_attributes.keys())t.push(Array.from(this.affected_attributes.get(r).keys()));return t}getTablesBySchemaName(t){return!t||!this.affected_attributes?[]:Array.from(this.affected_attributes.get(t).keys())}getSchemas(){return this.affected_attributes?Array.from(this.affected_attributes.keys()):[]}getAst(){return this.ast}updateAttributeWildcardsForRolePerms(t){let r=this.ast.columns.filter(s=>Dp.SEARCH_WILDCARDS.includes(s.columnid));if(r.length===0)return this.ast;let n=this.ast.from[0].databaseid;return this.ast.columns=this.ast.columns.filter(s=>!Dp.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,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][Dp.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[o].attribute_permissions.length>0?c=Lle(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=>!Dp.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let f=new Pp.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 Lle(e){return e.filter(t=>t[Dp.PERMS_CRUD_ENUM.READ])}a(Lle,"filterReadRestrictedAttrs");function Mle(e,t,r,n,s){vle(e,t,r,n,s)}a(Mle,"interpretAST");function Lp(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(Lp,"addSchemaTableToMap");function vle(e,t,r,n,s){if(!e){di.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof Pp.yy.Insert?Hle(e,t,r):e instanceof Pp.yy.Select?Ule(e,t,r,n,s):e instanceof Pp.yy.Update?xle(e,t,r):e instanceof Pp.yy.Delete?Ble(e,t,r):di.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(vle,"getRecordAttributesAST");function Ule(e,t,r,n,s){if(!e){di.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(Dle.isEmptyOrZeroLength(i)){di.error("No schema specified");return}e.from.forEach(c=>{Lp(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),Lp(c.table,t,r,n,s)});let o=new wl(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{di.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 wl(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{di.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 wl(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{di.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 wl(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{di.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(Ule,"getSelectAttributes");function xle(e,t,r){if(!e){di.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new wl(e.columns),s=e.table.databaseid;Lp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&fw(e.table.tableid,s,i.columnid,t,r)}a(xle,"getUpdateAttributes");function Ble(e,t,r){if(!e){di.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new wl(e.where),s=e.table.databaseid;Lp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&fw(e.table.tableid,s,i.columnid,t,r)}a(Ble,"getDeleteAttributes");function Hle(e,t,r){if(!e){di.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new wl(e.columns),s=e.into.databaseid;Lp(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&fw(e.into.tableid,s,i.columnid,t,r)}a(Hle,"getInsertAttributes");function fw(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(fw,"pushAttribute");$q.exports=dw});var Yq=I((kLe,Kq)=>{"use strict";var _S=(H(),P(G)),pS=class{static{a(this,"BaseLicense")}constructor(t=0,r=_S.RAM_ALLOCATION_ENUM.DEFAULT,n=_S.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},_w=class extends pS{static{a(this,"ExtendedLicense")}constructor(t=0,r=_S.RAM_ALLOCATION_ENUM.DEFAULT,n=_S.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};Kq.exports={BaseLicense:pS,ExtendedLicense:_w}});var Nd=I((GLe,Xq)=>{"use strict";var Od=require("fs-extra"),hS=(mE(),P(hE)),zq=require("crypto"),kle=require("moment"),Fle=require("uuid").v4,en=W(),hw=require("path"),Gle=ae(),Il=(H(),P(G)),{totalmem:Wq}=require("os"),qle=Yq().ExtendedLicense,bd="invalid license key format",$le="061183",Vle="mofi25",Kle="aes-256-cbc",Yle=16,Wle=32,jq=ce(),{resolvePath:Jq}=Rt();jq.initSync();var pw;Xq.exports={validateLicense:Qq,generateFingerPrint:jle,licenseSearch:gw,getLicense:Xle,checkMemoryLimit:Zle};function mw(){return hw.join(jq.getHdbBasePath(),Il.LICENSE_KEY_DIR_NAME,Il.LICENSE_FILE_NAME)}a(mw,"getLicenseDirPath");function zle(){let e=mw();return Jq(hw.join(e,Il.LICENSE_FILE_NAME))}a(zle,"getLicenseFilePath");function Ew(){let e=mw();return Jq(hw.join(e,Il.REG_KEY_FILE_NAME))}a(Ew,"getFingerPrintFilePath");async function jle(){let e=Ew();try{return await Od.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Jle();throw en.error(`Error writing fingerprint file to ${e}`),en.error(t),new Error("There was an error generating the fingerprint")}}a(jle,"generateFingerPrint");async function Jle(){let e=Fle(),t=hS.hash(e,hS.HASH_FUNCTION.MD5),r=Ew();try{await Od.mkdirp(mw()),await Od.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw en.error(`Error writing fingerprint file to ${r}`),en.error(n),new Error("There was an error generating the fingerprint")}return t}a(Jle,"writeFingerprint");function Qq(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:Il.RAM_ALLOCATION_ENUM.DEFAULT,version:Il.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return en.error("empty license key passed to validate."),r;let n=Ew(),s=!1;try{s=Od.statSync(n)}catch(i){en.error(i)}if(s){let i;try{i=Od.readFileSync(n,"utf8")}catch{en.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(Vle),c=o[1];c=Buffer.concat([Buffer.from(c)],Yle);let l=Buffer.concat([Buffer.from(i)],Wle),u=zq.createDecipheriv(Kle,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 _=Qle(o[0],i);if(_)f=_;else throw r.valid_license=!1,r.valid_machine=!1,console.error(bd),en.error(bd),new Error(bd)}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(bd),en.error(bd),new Error(bd)}else r.exp_date=f;r.exp_date<kle().valueOf()&&(r.valid_date=!1),hS.validate(o[1],`${$le}${i}${t}`,hS.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||en.error("Invalid licence"),r}a(Qq,"validateLicense");function Qle(e,t){try{let r=zq.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{en.warn("Check old license failed")}}a(Qle,"checkOldLicense");function gw(){let e=new qle,t=[];try{t=Od.readFileSync(zle(),"utf-8").split(`\r
|
|
25
25
|
`)}catch(r){r.code==="ENOENT"?en.debug("no license file found"):en.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(Gle.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=Qq(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){en.error("There was an error parsing the license string."),en.error(s),e.ram_allocation=Il.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return pw=e,e}a(gw,"licenseSearch");async function Xle(){return pw||await gw(),pw}a(Xle,"getLicense");function Zle(){let e=gw().ram_allocation,t=process.constrainedMemory?.()||Wq();if(t=Math.round(Math.min(t,Wq())/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(Zle,"checkMemoryLimit")});var ES=I(($Le,r$)=>{var mS=Nd(),Zq=require("chalk"),rs=W(),e$=require("prompt"),{promisify:eue}=require("util"),Sw=(H(),P(G)),tue=require("fs-extra"),rue=require("path"),nue=ae(),{packageJson:sue}=st(),t$=ce();t$.initSync();var iue=require("moment"),oue=eue(e$.get),aue=rue.join(t$.getHdbBasePath(),Sw.LICENSE_KEY_DIR_NAME,Sw.LICENSE_FILE_NAME,Sw.LICENSE_FILE_NAME);r$.exports={getFingerprint:lue,setLicense:cue,parseLicense:Tw,register:uue,getRegistrationInfo:fue};async function cue(e){if(e&&e.key&&e.company){try{rs.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await Tw(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw rs.error(r),rs.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(cue,"setLicense");async function lue(){let e={};try{e=await mS.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw rs.error(r),rs.error(t),new Error(r)}return e}a(lue,"getFingerprint");async function Tw(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");rs.info("Validating license input...");let r=mS.validateLicense(e,t);if(rs.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(rs.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(rs.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{rs.info("writing license to disk"),await tue.writeFile(aue,JSON.stringify({license_key:e,company:t}))}catch(n){throw rs.error("Failed to write License"),n}return"Registration successful."}a(Tw,"parseLicense");async function uue(){let e=await due();return Tw(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(uue,"register");async function due(){let e=await mS.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:Zq.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:Zq.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{e$.start()}catch(n){rs.error(n)}let r;try{r=await oue(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(due,"promptForRegistration");async function fue(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await mS.getLicense()}catch(r){throw rs.error(`There was an error when searching licenses due to: ${r.message}`),r}if(nue.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=sue.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=iue.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(fue,"getRegistrationInfo")});var s$=I((KLe,n$)=>{"use strict";var _ue=St(),Aw=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d,p,_,h){this.port=t,o===null&&(o=void 0),this.server_name=r+_ue.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:p,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l}},this.accounts={SYS:{users:_},HDB:{users:h}},this.system_account="SYS"}};n$.exports=Aw});var a$=I((WLe,o$)=>{"use strict";var i$=St(),Rw=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+i$.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+i$.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"}};o$.exports=Rw});var l$=I((jLe,c$)=>{"use strict";var yw=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};c$.exports=yw});var d$=I((QLe,u$)=>{"use strict";var pue=St(),bw=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+pue.SERVER_SUFFIX.ADMIN,this.password=r}};u$.exports=bw});var AS=I((ZLe,p$)=>{"use strict";var Cl=require("path"),Pl=require("fs-extra"),hue=s$(),mue=a$(),Eue=l$(),gue=d$(),Ow=yn(),Id=ae(),In=Rt(),SS=(H(),P(G)),Mp=St(),{CONFIG_PARAMS:jt}=SS,Cd=W(),vp=ce(),f$=go(),Nw=ir(),Sue=es(),wd="clustering",Tue=1e4,_$=50;p$.exports={generateNatsConfig:Rue,removeNatsConfig:yue,getHubConfigPath:Aue};function Aue(){let e=vp.get(jt.ROOTPATH);return Cl.join(e,wd,Mp.NATS_CONFIG_FILES.HUB_SERVER)}a(Aue,"getHubConfigPath");async function Rue(e=!1,t=void 0){let r=vp.get(jt.ROOTPATH);Pl.ensureDirSync(Cl.join(r,"clustering","leaf")),vp.initSync();let n=In.getConfigFromFile(jt.CLUSTERING_TLS_CERT_AUTH),s=In.getConfigFromFile(jt.CLUSTERING_TLS_PRIVATEKEY),i=In.getConfigFromFile(jt.CLUSTERING_TLS_CERTIFICATE);!await Pl.exists(i)&&!await Pl.exists(!n)&&await Sue.createNatsCerts();let o=Cl.join(r,wd,Mp.PID_FILES.HUB),c=Cl.join(r,wd,Mp.PID_FILES.LEAF),l=In.getConfigFromFile(jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=Cl.join(r,wd,Mp.NATS_CONFIG_FILES.HUB_SERVER),f=Cl.join(r,wd,Mp.NATS_CONFIG_FILES.LEAF_SERVER),d=In.getConfigFromFile(jt.CLUSTERING_TLS_INSECURE),p=In.getConfigFromFile(jt.CLUSTERING_TLS_VERIFY),_=In.getConfigFromFile(jt.CLUSTERING_NODENAME),h=In.getConfigFromFile(jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await Nw.checkNATSServerInstalled()||TS("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await Ow.listUsers(),g=In.getConfigFromFile(jt.CLUSTERING_USER),R=await Ow.getClusterUser();(Id.isEmpty(R)||R.active!==!0)&&TS(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await gS(jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await gS(jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await gS(jt.CLUSTERING_HUBSERVER_NETWORK_PORT),await gS(jt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],A=[];for(let[oe,j]of S.entries())j.role?.role===SS.ROLE_TYPES_ENUM.CLUSTER_USER&&j.active&&(E.push(new gue(j.username,f$.decrypt(j.hash))),A.push(new Eue(j.username,f$.decrypt(j.hash))));let N=[],{hub_routes:v}=In.getClusteringRoutes();if(!Id.isEmptyOrZeroLength(v))for(let oe of v)N.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${oe.host}:${oe.port}`);let F=new hue(In.getConfigFromFile(jt.CLUSTERING_HUBSERVER_NETWORK_PORT),_,o,i,s,n,d,p,h,In.getConfigFromFile(jt.CLUSTERING_HUBSERVER_CLUSTER_NAME),In.getConfigFromFile(jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,A);n==null&&(delete F.tls.ca_file,delete F.leafnodes.tls.ca_file),t=Id.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===SS.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Pl.writeJson(u,F),Cd.trace(`Hub server config written to ${u}`));let $=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,Y=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,ee=new mue(In.getConfigFromFile(jt.CLUSTERING_LEAFSERVER_NETWORK_PORT),_,c,l,[$],[Y],E,A,i,s,n,d);n==null&&delete ee.tls.ca_file,(t===void 0||t===SS.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Pl.writeJson(f,ee),Cd.trace(`Leaf server config written to ${f}`))}a(Rue,"generateNatsConfig");async function gS(e){let t=vp.get(e);return Id.isEmpty(t)&&TS(`port undefined for '${e}'`),await Id.isPortTaken(t)&&TS(`'${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(gS,"isPortAvailable");function TS(e){let t=`Error generating clustering config: ${e}`;Cd.error(t),console.error(t),process.exit(1)}a(TS,"generateNatsConfigError");async function yue(e){let{port:t,config_file:r}=Nw.getServerConfig(e),{username:n,decrypt_hash:s}=await Ow.getClusterUser(),i=0,o=2e3;for(;i<_$;){try{let f=await Nw.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){Cd.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=_$)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&&Cd.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await Id.async_set_timeout(u)}let c="0".repeat(Tue),l=Cl.join(vp.get(jt.ROOTPATH),wd,r);await Pl.writeFile(l,c),await Pl.remove(l),Cd.notify(e,"started.")}a(yue,"removeNatsConfig")});var T$=I((tMe,S$)=>{"use strict";var ns=ce(),bue=Nd(),Ge=(H(),P(G)),Up=St(),Uo=require("path"),{PACKAGE_ROOT:yS}=st(),h$=ce(),RS=ae(),Pd="/dev/null",Oue=Uo.join(yS,"launchServiceScripts"),m$=Uo.join(yS,"utility/scripts"),Nue=Uo.join(m$,Ge.HDB_RESTART_SCRIPT),E$=Uo.resolve(yS,"dependencies",`${process.platform}-${process.arch}`,Up.NATS_BINARY_NAME);function g$(){let t=bue.licenseSearch().ram_allocation||Ge.RAM_ALLOCATION_ENUM.DEFAULT,r=Ge.MEM_SETTING_KEY+t,n={[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return RS.noBootFile()&&(n[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=RS.getEnvCliRootPath()),{name:Ge.PROCESS_DESCRIPTORS.HDB,script:Ge.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:yS}}a(g$,"generateMainServerConfig");var wue=9930;function Iue(){ns.initSync(!0);let e=ns.get(Ge.CONFIG_PARAMS.ROOTPATH),t=Uo.join(e,"clustering",Up.NATS_CONFIG_FILES.HUB_SERVER),r=Uo.join(ns.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=h$.get(Ge.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Up.LOG_LEVEL_FLAGS[ns.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==wue?"-"+n:""),script:E$,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return ns.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Pd,i.error_file=Pd),i}a(Iue,"generateNatsHubServerConfig");var Cue=9940;function Pue(){ns.initSync(!0);let e=ns.get(Ge.CONFIG_PARAMS.ROOTPATH),t=Uo.join(e,"clustering",Up.NATS_CONFIG_FILES.LEAF_SERVER),r=Uo.join(ns.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=h$.get(Ge.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Up.LOG_LEVEL_FLAGS[ns.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Cue?"-"+n:""),script:E$,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return ns.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Pd,i.error_file=Pd),i}a(Pue,"generateNatsLeafServerConfig");function Due(){ns.initSync();let e=Uo.join(ns.get(Ge.CONFIG_PARAMS.LOGGING_ROOT),Ge.LOG_NAMES.HDB),t={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ge.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:Oue,autorestart:!1};return ns.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=Pd,t.error_file=Pd),t}a(Due,"generateClusteringUpgradeV4ServiceConfig");function Lue(){let e={[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.RESTART_HDB};return RS.noBootFile()&&(e[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=RS.getEnvCliRootPath()),{...{name:Ge.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:m$},script:Nue}}a(Lue,"generateRestart");function Mue(){return{apps:[g$()]}}a(Mue,"generateAllServiceConfigs");S$.exports={generateAllServiceConfigs:Mue,generateMainServerConfig:g$,generateRestart:Lue,generateNatsHubServerConfig:Iue,generateNatsLeafServerConfig:Pue,generateClusteringUpgradeV4ServiceConfig:Due}});var Dd=I((sMe,v$)=>{"use strict";var et=(H(),P(G)),vue=ae(),Bo=AS(),bS=ir(),xo=St(),Ya=T$(),OS=ce(),Dl=W(),Uue=Lo(),{startWorker:A$,onMessageFromWorkers:xue}=rt(),Bue=Do(),nMe=require("util"),Hue=require("child_process"),kue=require("fs"),{execFile:Fue}=Hue,Ke;v$.exports={enterPM2Mode:Gue,start:Wa,stop:ww,reload:y$,restart:b$,list:Iw,describe:w$,connect:Ho,kill:Yue,startAllServices:Wue,startService:Cw,getUniqueServicesList:I$,restartAllServices:zue,isServiceRegistered:C$,reloadStopStart:P$,restartHdb:N$,deleteProcess:Vue,startClusteringProcesses:L$,startClusteringThreads:M$,isHdbRestartRunning:Kue,isClusteringRunning:Jue,stopClustering:jue,reloadClustering:Que,expectedRestartOfChildren:O$};var xp=!1;xue(e=>{e.type==="restart"&&OS.initSync(!0)});function Gue(){xp=!0}a(Gue,"enterPM2Mode");function Ho(){return Ke||(Ke=require("pm2")),new Promise((e,t)=>{Ke.connect((r,n)=>{r&&t(r),e(n)})})}a(Ho,"connect");var tn,que=10,R$;function Wa(e,t=!1){if(xp)return $ue(e);let r=Fue(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=tn.indexOf(r);o>-1&&tn.splice(o,1),!R$&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<que&&(kue.existsSync(Bo.getHubConfigPath())?Wa(e):(await Bo.generateNatsConfig(!0),Wa(e),await new Promise(c=>setTimeout(c,3e3)),await Bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=OS.get(et.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&xo.LOG_LEVEL_HIERARCHY[o]>=xo.LOG_LEVEL_HIERARCHY[f||"info"]){let _=f===xo.LOG_LEVELS.ERR||f===xo.LOG_LEVELS.WRN?Dl.OUTPUTS.STDERR:Dl.OUTPUTS.STDOUT;Dl.logCustomLevel(f||"info",_,n,i.slice(u,l.index).trim())}let[d,p]=l;u=l.index+d.length,f=xo.LOG_LEVELS[p]}if(xo.LOG_LEVEL_HIERARCHY[o]>=xo.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===xo.LOG_LEVELS.ERR||f===xo.LOG_LEVELS.WRN?Dl.OUTPUTS.STDERR:Dl.OUTPUTS.STDOUT;Dl.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(),!tn&&(tn=[],!t)){let i=a(()=>{R$=!0,tn&&(tn.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)}tn.push(r)}a(Wa,"start");function $ue(e){return new Promise(async(t,r)=>{try{await Ho()}catch(n){r(n)}Ke.start(e,(n,s)=>{n&&(Ke.disconnect(),r(n)),Ke.disconnect(),t(s)})})}a($ue,"startWithPM2");function ww(e){if(!xp){for(let t of tn||[])t.name===e&&(tn.splice(tn.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Ho()}catch(n){r(n)}Ke.stop(e,async(n,s)=>{n&&(Ke.disconnect(),r(n)),Ke.delete(e,(i,o)=>{i&&(Ke.disconnect(),r(n)),Ke.disconnect(),t(o)})})})}a(ww,"stop");function y$(e){return new Promise(async(t,r)=>{try{await Ho()}catch(n){r(n)}Ke.reload(e,(n,s)=>{n&&(Ke.disconnect(),r(n)),Ke.disconnect(),t(s)})})}a(y$,"reload");function b$(e){if(!xp){O$();for(let t of tn||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Ho()}catch(n){r(n)}Ke.restart(e,(n,s)=>{Ke.disconnect(),t(s)})})}a(b$,"restart");function O$(){for(let e of tn||[])e.config&&(e.config.restarts=0)}a(O$,"expectedRestartOfChildren");function Vue(e){return new Promise(async(t,r)=>{try{await Ho()}catch(n){r(n)}Ke.delete(e,(n,s)=>{n&&(Ke.disconnect(),r(n)),Ke.disconnect(),t(s)})})}a(Vue,"deleteProcess");async function N$(){await Wa(Ya.generateRestart())}a(N$,"restartHdb");async function Kue(){let e=await Iw();for(let t in e)if(e[t].name===et.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(Kue,"isHdbRestartRunning");function Iw(){return new Promise(async(e,t)=>{try{await Ho()}catch(r){t(r)}Ke.list((r,n)=>{r&&(Ke.disconnect(),t(r)),Ke.disconnect(),e(n)})})}a(Iw,"list");function w$(e){return new Promise(async(t,r)=>{try{await Ho()}catch(n){r(n)}Ke.describe(e,(n,s)=>{n&&(Ke.disconnect(),r(n)),Ke.disconnect(),t(s)})})}a(w$,"describe");function Yue(){if(!xp){for(let e of tn||[])e.kill();tn=[];return}return new Promise(async(e,t)=>{try{await Ho()}catch(r){t(r)}Ke.killDaemon((r,n)=>{r&&(Ke.disconnect(),t(r)),Ke.disconnect(),e(n)})})}a(Yue,"kill");async function Wue(){try{await L$(),await M$(),await Wa(Ya.generateAllServiceConfigs())}catch(e){throw Ke?.disconnect(),e}}a(Wue,"startAllServices");async function Cw(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case et.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Ya.generateMainServerConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Ya.generateNatsIngestServiceConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Ya.generateNatsReplyServiceConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Ya.generateNatsHubServerConfig(),await Wa(r,t),await Bo.removeNatsConfig(e);return;case et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Ya.generateNatsLeafServerConfig(),await Wa(r,t),await Bo.removeNatsConfig(e);return;case et.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Ya.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await Wa(r)}catch(r){throw Ke?.disconnect(),r}}a(Cw,"startService");async function I$(){try{let e=await Iw(),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 Ke?.disconnect(),e}}a(I$,"getUniqueServicesList");async function zue(e=[]){try{let t=!1,r=await I$();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===et.PROCESS_DESCRIPTORS.HDB?t=!0:await b$(o))}t&&await P$(et.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Ke?.disconnect(),t}}a(zue,"restartAllServices");async function C$(e){if(tn?.find(r=>r.name===e))return!0;let t=await Bue.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(C$,"isServiceRegistered");async function P$(e){let t=OS.get(et.CONFIG_PARAMS.THREADS_COUNT)??OS.get(et.CONFIG_PARAMS.THREADS),r=await w$(e),n=vue.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await ww(e),await Cw(e)):e===et.PROCESS_DESCRIPTORS.HDB?await N$():await y$(e)}a(P$,"reloadStopStart");var D$;async function L$(e=!1){for(let t in et.CLUSTERING_PROCESSES){let r=et.CLUSTERING_PROCESSES[t];await Cw(r,e)}}a(L$,"startClusteringProcesses");async function M$(){D$=A$(et.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:et.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await bS.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await bS.updateLocalStreams();let e=await Uue.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===et.PRE_4_0_0_VERSION){Dl.info("Starting clustering upgrade 4.0.0 process"),A$(et.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(M$,"startClusteringThreads");async function jue(){for(let e in et.CLUSTERING_PROCESSES)if(e!==et.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===et.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await D$.terminate();else{let t=et.CLUSTERING_PROCESSES[e];await ww(t)}}a(jue,"stopClustering");async function Jue(){for(let e in et.CLUSTERING_PROCESSES){let t=et.CLUSTERING_PROCESSES[e];if(await C$(t)===!1)return!1}return!0}a(Jue,"isClusteringRunning");async function Que(){await Bo.generateNatsConfig(!0),await bS.reloadNATSHub(),await bS.reloadNATSLeaf(),await Bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(Que,"reloadClustering")});var IS={};Ue(IS,{compactOnStart:()=>Xue,copyDb:()=>F$});async function Xue(){za.notify("Running compact on start"),console.log("Running compact on start");let e=(0,Pw.get)(x.ROOTPATH),t=new Map,r=Xe();(0,Dw.updateConfigValue)(x.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,NS.join)(e,"backup",n+".mdb"),o=(0,NS.join)(e,wc,n+"-copy.mdb"),c=0;try{c=await U$(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){za.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 F$(n,o),console.log("Backing up",n,"to",i),await(0,Ll.move)(s,i,{overwrite:!0})}try{Ld()}catch(n){za.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,Ll.move)(i,s,{overwrite:!0}),await(0,Ll.remove)((0,NS.join)(e,wc,`${n}-copy.mdb-lock`));try{Ld()}catch(n){za.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){za.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,Dw.updateConfigValue)(x.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,Ll.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw Ld(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await U$(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}.
|
|
26
26
|
Total record count before compaction: ${i}, total after: ${c}.
|