harperdb 4.4.26 → 4.4.27
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 +1 -1
- package/bin/lite.js +1 -1
- package/launchServiceScripts/launchInstallNATSServer.js +1 -1
- package/launchServiceScripts/launchNatsIngestService.js +1 -1
- package/launchServiceScripts/launchNatsReplyService.js +1 -1
- package/launchServiceScripts/launchUpdateNodes4-0-0.js +1 -1
- package/npm-shrinkwrap.json +8 -8
- package/package.json +1 -1
- package/server/jobs/jobProcess.js +1 -1
- package/server/threads/threadServer.js +1 -1
- package/studio/build-local/asset-manifest.json +2 -2
- package/studio/build-local/index.html +1 -1
- package/studio/build-local/static/js/{main.457cac00.js → main.11792bb9.js} +2 -2
- package/utility/scripts/restartHdb.js +1 -1
- /package/studio/build-local/static/js/{main.457cac00.js.LICENSE.txt → main.11792bb9.js.LICENSE.txt} +0 -0
|
@@ -10,7 +10,7 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
|
|
|
10
10
|
`)},E3="certificate.pem",h3="privateKey.pem",p3="caCertificate.pem",m3="natsCertificate.pem",S3="natsCaCertificate.pem",Rt={DEFAULT:"default","DEFAULT-CA":"default-ca",SERVER:"server",CA:"ca","OPERATIONS-API":"operations-api","OPERATIONS-CA":"operations-ca"},T3={tls_certificate:Rt.SERVER,tls_certificateAuthority:Rt.CA,customFunctions_tls_certificate:Rt.SERVER,customFunctions_tls_certificateAuthority:Rt.CA,operationsApi_tls_certificate:Rt["OPERATIONS-API"],operationsApi_tls_certificateAuthority:Rt["OPERATIONS-CA"]},g3={[Rt.SERVER]:2,[Rt.DEFAULT]:1},A3={[Rt["OPERATIONS-API"]]:3,[Rt.SERVER]:2,[Rt.DEFAULT]:1},R3={[Rt["OPERATIONS-API"]]:3,[Rt.SERVER]:2,[Rt.DEFAULT]:1},y3={[Rt["OPERATIONS-CA"]]:3,[Rt.CA]:2,[Rt["DEFAULT-CA"]]:1},b3={[Rt["OPERATIONS-CA"]]:3,[Rt.CA]:2,[Rt["DEFAULT-CA"]]:1},O3={[Rt.CA]:2,[Rt["DEFAULT-CA"]]:1};Object.assign(rL,{CERTIFICATE_PEM_NAME:E3,PRIVATEKEY_PEM_NAME:h3,CA_PEM_NAME:p3,CERT_NAME:Rt,CERT_CONFIG_NAME_MAP:T3,CERT_PREFERENCE_APP:g3,CERT_PREFERENCE_OPS:A3,CERT_PREFERENCE_REP:R3,CA_CERT_PREFERENCE_REP:y3,CA_CERT_PREFERENCE_OPS:b3,CA_CERT_PREFERENCE_APP:O3,CERTIFICATE_VALUES:f3,NATS_CERTIFICATE_PEM_NAME:m3,NATS_CA_PEM_NAME:S3})});var NA=N((lRe,cL)=>{"use strict";var oL=require("fs-extra"),me=require("joi"),N3=require("os"),{boolean:He,string:wt,number:rr,array:cc}=me.types(),{totalmem:nL}=require("os"),ac=require("path"),I3=j(),OA=re(),cRe=bA(),sL=M(),w3=gt(),iL="log",C3="components",P3="Invalid logging.rotation.maxSize unit. Available units are G, M or K",D3="Invalid logging.rotation.interval unit. Available units are D, H or M (minutes)",L3="Invalid logging.rotation.maxSize value. Value should be a number followed by unit e.g. '10M'",M3="Invalid logging.rotation.interval value. Value should be a number followed by unit e.g. '10D'",U3="rootPath config parameter is undefined",ln=me.alternatives([rr.min(0),wt]).optional().empty(null),Hh=me.alternatives([cc.items(wt,{host:wt.required(),port:ln},{hostname:wt.required(),port:ln}).empty(null),cc.items(wt)]),gi,aL=!1;cL.exports={configValidator:v3,routesValidator:G3,route_constraints:Hh};function v3(e,t=!1){if(aL=t,gi=e.rootPath,OA.isEmpty(gi))throw U3;let r=He.optional(),n=rr.min(0).max(1e3).empty(null).default(F3),s=wt.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").empty(null).default(d_),i=wt.optional().empty(null),o=wt.pattern(/^[^\s.,*>]+$/).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >"}).empty(null).required(),c=me.string().empty(null).default(d_),l=me.custom(H3).empty(null).default(d_),u=e.clustering?.enabled,d=me.object({certificate:i,certificateAuthority:i,privateKey:i}),_;return u===!0?_=me.object({enabled:r,hubServer:me.object({cluster:me.object({name:me.required().empty(null),network:me.object({port:ln,routes:Hh}).required()}).required(),leafNodes:me.object({network:me.object({port:ln}).required()}).required(),network:me.object({port:ln}).required()}).required(),leafServer:me.object({network:me.object({port:ln,routes:Hh}).required(),streams:me.object({maxAge:rr.min(120).allow(null).optional(),maxBytes:rr.min(1).allow(null).optional(),maxMsgs:rr.min(1).allow(null).optional(),path:c}).required()}).required(),logLevel:me.valid("error","warn","info","debug","trace"),nodeName:o,republishMessages:He.optional(),databaseLevel:He.optional(),tls:me.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:He.required(),verify:He.optional()}),user:wt.optional().empty(null)}).optional():_=me.object({enabled:r,tls:me.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:He.optional()})}).optional(),me.object({authentication:me.alternatives(me.object({authorizeLocal:He,cacheTTL:rr.required(),enableSessions:He}),He).optional(),analytics:me.object({aggregatePeriod:rr}),replication:me.object({hostname:me.alternatives(wt,rr).optional().empty(null),url:wt.optional().empty(null),port:ln,securePort:ln,routes:cc.optional().empty(null),databases:me.alternatives(wt,cc),enableRootCAs:He.optional(),copyTablesToCatchUp:He.optional()}).optional(),componentsRoot:s.optional(),clustering:_,localStudio:me.object({enabled:r}).required(),logging:me.object({auditAuthEvents:me.object({logFailed:He,logSuccessful:He}),file:He.required(),level:me.valid("notify","fatal","error","warn","info","debug","trace"),rotation:me.object({enabled:He.optional(),compress:He.optional(),interval:wt.custom(k3).optional().empty(null),maxSize:wt.custom(x3).optional().empty(null),path:wt.optional().empty(null).default(d_)}).required(),root:s,stdStreams:He.required(),auditLog:He.required()}).required(),operationsApi:me.object({network:me.object({cors:He.optional(),corsAccessList:cc.optional(),headersTimeout:rr.min(1).optional(),keepAliveTimeout:rr.min(1).optional(),port:ln,domainSocket:me.optional().empty("hdb/operations-server").default(d_),securePort:ln,timeout:rr.min(1).optional()}).optional(),tls:me.alternatives([me.array().items(d),d])}).required(),rootPath:wt.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").required(),mqtt:me.object({network:me.object({port:ln,securePort:ln,mtls:me.alternatives([He.optional(),me.object({user:wt.optional(),certificateAuthority:i,required:He.optional()})])}).required(),webSocket:He.optional(),requireAuthentication:He.optional()}),http:me.object({compressionThreshold:rr.optional(),cors:He.optional(),corsAccessList:cc.optional(),headersTimeout:rr.min(1).optional(),port:ln,securePort:ln,maxHeaderSize:rr.optional(),mtls:me.alternatives([He.optional(),me.object({user:wt.optional(),certificateAuthority:i,required:He.optional()})]),threadRange:me.alternatives([cc.optional(),wt.optional()])}).required(),threads:me.alternatives(n.optional(),me.object({count:n.optional(),debug:me.alternatives(He.optional(),me.object({startingPort:rr.min(1).optional(),host:wt.optional(),waitForDebugger:He.optional()})),maxHeapMemory:rr.min(0).optional()})),storage:me.object({writeAsync:He.required(),overlappingSync:He.optional(),caching:He.optional(),compression:me.alternatives([He.optional(),me.object({dictionary:wt.optional(),threshold:rr.optional()})]),compactOnStart:He.optional(),compactOnStartKeepBackup:He.optional(),noReadAhead:He.optional(),path:l,prefetchWrites:He.optional(),maxFreeSpaceToLoad:rr.optional(),maxFreeSpaceToRetain:rr.optional()}).required(),ignoreScripts:He.optional(),tls:me.alternatives([me.array().items(d),d])}).validate(e,{allowUnknown:!0,abortEarly:!1,errors:{wrap:{label:"'"}}})}a(v3,"configValidator");function B3(e){return aL||oL.existsSync(e)?null:`Specified path ${e} does not exist.`}a(B3,"doesPathExist");function H3(e,t){me.assert(e,wt.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path"));let r=B3(e);if(r)return t.message(r)}a(H3,"validatePath");function x3(e,t){let r=e.slice(-1);if(r!=="G"&&r!=="M"&&r!=="K")return t.message(P3);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(L3):e}a(x3,"validateRotationMaxSize");function k3(e,t){let r=e.slice(-1);if(r!=="D"&&r!=="H"&&r!=="M")return t.message(D3);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(M3):e}a(k3,"validateRotationInterval");function F3(e,t){let r=t.state.path.join("."),n=N3.cpus().length,s=n-1;s<=2&&(s=2);let i=process.constrainedMemory?.()||nL();return i=Math.round(Math.min(i,nL())/1e6),s=Math.max(Math.min(s,Math.round((i-750)/300)),1),I3.info(`Detected ${n} cores and ${i}MB on this machine, defaulting ${r} to ${s}`),s}a(F3,"setDefaultThreads");function d_(e,t){let r=t.state.path.join(".");if(!OA.isEmpty(t.original)&&r!=="operationsApi.network.domainSocket")return t.original;if(OA.isEmpty(gi))throw new Error(`Error setting default root for: ${r}. HDB root is not defined`);switch(r){case"componentsRoot":return ac.join(gi,C3);case"logging.root":return ac.join(gi,iL);case"clustering.leafServer.streams.path":return ac.join(gi,"clustering","leaf");case"storage.path":let n=ac.join(gi,sL.LEGACY_DATABASES_DIR_NAME);return oL.existsSync(n)?n:ac.join(gi,sL.DATABASES_DIR_NAME);case"logging.rotation.path":return ac.join(gi,iL);case"operationsApi.network.domainSocket":return r==null?null:ac.join(gi,"operations-server");default:throw new Error(`Error setting default root for config parameter: ${r}. Unrecognized config parameter`)}}a(d_,"setDefaultRoot");function G3(e){let t=me.object({routes:Hh});return w3.validateBySchema({routes:e},t)}a(G3,"routesValidator")});var Ct=N(SL=>{"use strict";var un=M(),Er=re(),hr=j(),{configValidator:q3,routesValidator:lL}=NA(),Kr=require("fs-extra"),dL=require("yaml"),Bn=require("path"),$3=require("is-number"),_L=require("properties-reader"),V3=require("lodash"),{handleHDBError:K3}=_e(),{HTTP_STATUS_CODES:Y3,HDB_ERROR_MSGS:vl}=Pn(),{server:W3}=(qr(),oe(ja)),{DATABASES_PARAM_CONFIG:__,CONFIG_PARAMS:vn,CONFIG_PARAM_MAP:Gs}=un,j3="Unable to get config value because config is uninitialized",z3="Config successfully initialized",Q3="Error backing up config file",J3="Empty parameter sent to getConfigValue",fL=Bn.join(un.PACKAGE_ROOT,"config","yaml",un.HDB_DEFAULT_CONFIG_FILE),X3=Bn.join(un.PACKAGE_ROOT,"config","yaml","defaultNatsConfig.yaml"),Z3="Configuration successfully set. You must restart HarperDB for new config settings to take effect.",uL={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"},xh,jt,kh;Object.assign(SL,{createConfigFile:eX,getDefaultConfig:tX,getConfigValue:hL,initConfig:Fh,flattenConfig:Bl,updateConfigValue:pL,updateConfigObject:nX,getConfiguration:oX,setConfiguration:aX,readConfigFile:PA,getClusteringRoutes:cX,initOldConfig:mL,getConfigFromFile:lX,getConfigFilePath:lc,addConfig:uX,deleteConfigFromFile:dX,getConfigObj:_X,resolvePath:IA,getFlatConfigObj:fX});function IA(e){if(e?.startsWith("~/"))return Bn.join(Er.getHomeDir(),e.slice(1));let t=se();return Bn.resolve(t.getHdbBasePath(),e)}a(IA,"resolvePath");function eX(e,t=!1){let r=jo(fL);if(e.clustering_enabled||e.CLUSTERING_ENABLED||e.clustering){let c=dL.parseDocument(Kr.readFileSync(X3,"utf8"),{simpleKeys:!0});r.addIn(["clustering"],c.toJSON().clustering)}xh=Bl(r.toJSON());let n;for(let c in e){let l=Gs[c.toLowerCase()];if(l===vn.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("_"),d=wA(l,e[c]);l==="rootPath"&&d?.endsWith("/")&&(d=d.slice(0,-1));try{r.setIn([...u],d)}catch(_){hr.error(_)}}}n&&EL(r,n),CA(r,t);let s=r.toJSON();jt=Bl(s);let i=r.getIn(["rootPath"]),o=Bn.join(i,un.HDB_CONFIG_FILE);Kr.createFileSync(o),Kr.writeFileSync(o,String(r)),hr.trace(`Config file written to ${o}`)}a(eX,"createConfigFile");function EL(e,t){let r;try{try{r=JSON.parse(t)}catch(n){if(!Er.isObject(t))throw n;r=t}for(let n of r){let s=Object.keys(n)[0];if(n[s].hasOwnProperty(__.TABLES))for(let i in n[s][__.TABLES])for(let o in n[s][__.TABLES][i]){let c=n[s][__.TABLES][i][o],l=[vn.DATABASES,s,__.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=[vn.DATABASES,s,i];e.hasIn(c)?e.setIn(c,o):e.addIn(c,o)}}}catch(n){hr.error("Error parsing schemas CLI/env config arguments",n)}}a(EL,"setSchemasConfig");function tX(e){if(xh===void 0){let r=jo(fL);xh=Bl(r.toJSON())}let t=Gs[e.toLowerCase()];if(t!==void 0)return xh[t.toLowerCase()]}a(tX,"getDefaultConfig");function hL(e){if(e==null){hr.info(J3);return}if(jt===void 0){hr.trace(j3);return}let t=Gs[e.toLowerCase()];if(t!==void 0)return jt[t.toLowerCase()]}a(hL,"getConfigValue");function lc(e=Er.getPropsFilePath()){let t=Er.getEnvCliRootPath();if(t)return IA(Bn.join(t,un.HDB_CONFIG_FILE));let r=_L(e);return IA(r.get(un.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY))}a(lc,"getConfigFilePath");function Fh(e=!1){if(jt===void 0||e){let t;if(!Er.noBootFile()){t=Er.getPropsFilePath();try{Kr.accessSync(t,Kr.constants.F_OK|Kr.constants.R_OK)}catch(i){throw hr.error(i),new Error(`HarperDB properties file at path ${t} does not exist`)}}let r=lc(t),n;if(r.includes("config/settings.js"))try{mL(r);return}catch(i){if(i.code!==un.NODE_ERROR_CODES.ENOENT)throw i}try{n=jo(r)}catch(i){if(i.code===un.NODE_ERROR_CODES.ENOENT){hr.trace(`HarperDB config file not found at ${r}.
|
|
11
11
|
This can occur during early stages of install where the config file has not yet been created`);return}else throw hr.error(i),new Error(`Error reading HarperDB config file at ${r}`)}rX(n,r),CA(n);let s=n.toJSON();if(W3.config=s,jt=Bl(s),jt.logging_rotation_rotate)for(let i in uL)jt[i]&&hr.error(`Config ${uL[i]} has been deprecated. Please check https://docs.harperdb.io/docs/ for further details.`);hr.trace(z3)}}a(Fh,"initConfig");function rX(e,t){let r=e.getIn(["rootPath"]),n=!1;e.hasIn(["storage","path"])||(e.setIn(["storage","path"],Bn.join(r,"database")),n=!0),e.hasIn(["logging","rotation","path"])||(e.setIn(["logging","rotation","path"],Bn.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&&(hr.trace("Updating config file with missing config params"),Kr.writeFileSync(t,String(e)))}a(rX,"checkForUpdatedConfig");function CA(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 vl.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 vl.CONFIG_VALIDATION("operationsApi.network.port and operationsApi.network.securePort cannot be the same value");let n=q3(r,t);if(n.error)throw vl.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(CA,"validateConfig");function nX(e,t){jt===void 0&&(jt={});let r=Gs[e.toLowerCase()];if(r===void 0){hr.trace(`Unable to update config object because config param '${e}' does not exist`);return}jt[r.toLowerCase()]=t}a(nX,"updateConfigObject");function pL(e,t,r=void 0,n=!1,s=!1,i=!1){jt===void 0&&Fh();let o=hL(Gs.hdb_root),c=Bn.join(o,un.HDB_CONFIG_FILE),l=jo(c),u;if(r===void 0&&e.toLowerCase()===vn.DATABASES)u=t;else if(r===void 0){let E;if(i)E=e;else if(E=Gs[e.toLowerCase()],E===void 0)throw new Error(`Unable to update config, unrecognized config parameter: ${e}`);let f=E.split("_"),h=wA(E,t);l.setIn([...f],h)}else for(let E in r){let f=Gs[E.toLowerCase()];if(f===vn.HTTP_SECUREPORT&&r[E]===jt[vn.HTTP_PORT]?.toString()&&l.setIn(["http","port"],null),f===vn.OPERATIONSAPI_NETWORK_SECUREPORT&&r[E]===jt[vn.OPERATIONSAPI_NETWORK_PORT.toLowerCase()]?.toString()&&l.setIn(["operationsApi","network","port"],null),f===vn.DATABASES){u=r[E];continue}if(f?.startsWith("threads_")){let h=l.getIn(["threads"]);h>=0&&(l.deleteIn(["threads"]),l.setIn(["threads","count"],h))}if(!f&&(E.endsWith("_package")||E.endsWith("_port"))&&(f=E),f!==void 0){let h=f.split("_"),T=un.LEGACY_CONFIG_PARAMS[E.toUpperCase()];T&&T.startsWith("customFunctions")&&l.hasIn(T.split("_"))&&(f=T,h=T.split("_"));let m=wA(f,r[E]);f==="rootPath"&&m?.endsWith("/")&&(m=m.slice(0,-1));try{h.length>1&&typeof l.getIn(h.slice(0,-1))=="boolean"&&l.deleteIn(h.slice(0,-1)),l.setIn([...h],m)}catch(g){hr.error(g)}}}u&&EL(l,u),CA(l);let d=l.getIn(["rootPath"]),_=Bn.join(d,un.HDB_CONFIG_FILE);n===!0&&sX(c,d),Kr.writeFileSync(_,String(l)),s&&(jt=Bl(l.toJSON())),hr.trace(`Config parameter: ${e} updated with value: ${t}`)}a(pL,"updateConfigValue");function sX(e,t){try{let r=Bn.join(t,"backup",`${new Date(Date.now()).toISOString().replaceAll(":","-")}-${un.HDB_CONFIG_FILE}.bak`);Kr.copySync(e,r),hr.trace(`Config file: ${e} backed up to: ${r}`)}catch(r){hr.error(Q3),hr.error(r)}}a(sX,"backupConfigFile");var iX=["databases"];function Bl(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}),kh=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])&&!iX.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;!vn[l.toUpperCase()]&&Gs[l]&&(s[Gs[l].toLowerCase()]=o[c]),s[l]=o[c]}}n[i]!==void 0&&(s[i.toLowerCase()]=n[i])}return s}a(r,"squashObj")}a(Bl,"flattenConfig");function wA(e,t){if(e===vn.CLUSTERING_NODENAME||e===vn.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($3(t))return parseFloat(t);if(t===!0||t===!1||Array.isArray(t)||Er.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 Er.autoCast(t)}a(wA,"castConfigValue");function oX(){let e=Er.getPropsFilePath(),t=lc(e);return jo(t).toJSON()}a(oX,"getConfiguration");async function aX(e){let{operation:t,hdb_user:r,hdb_auth_header:n,...s}=e;try{return pL(void 0,void 0,s,!0),Z3}catch(i){throw typeof i=="string"||i instanceof String?K3(i,i,Y3.BAD_REQUEST,void 0,void 0,!0):i}}a(aX,"setConfiguration");function PA(){let e=Er.getPropsFilePath();try{Kr.accessSync(e,Kr.constants.F_OK|Kr.constants.R_OK)}catch(n){if(!Er.noBootFile())throw hr.error(n),new Error(`HarperDB properties file at path ${e} does not exist`)}let t=lc(e);return jo(t).toJSON()}a(PA,"readConfigFile");function jo(e){return dL.parseDocument(Kr.readFileSync(e,"utf8"),{simpleKeys:!0})}a(jo,"parseYamlDoc");function cX(){let e=PA(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=Er.isEmptyOrZeroLength(t)?[]:t;let r=lL(t);if(r)throw vl.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=Er.isEmptyOrZeroLength(n)?[]:n;let s=lL(n);if(s)throw vl.CONFIG_VALIDATION(s.message);if(!Er.isEmptyOrZeroLength(n)&&!Er.isEmptyOrZeroLength(t)){let i=t.filter(o=>n.some(c=>c.host===o.host&&c.port===o.port));if(!Er.isEmptyOrZeroLength(i)){let o=`Duplicate hub and leaf routes found ${JSON.stringify(i)}`;throw vl.CONFIG_VALIDATION(o)}}return{hub_routes:t,leaf_routes:n}}a(cX,"getClusteringRoutes");function mL(e){let t=_L(e);jt={};for(let r in Gs){let n=t.get(r.toUpperCase());if(Er.isEmpty(n)||typeof n=="string"&&n.trim().length===0)continue;let s=Gs[r].toLowerCase();s===vn.LOGGING_ROOT?jt[s]=Bn.dirname(n):jt[s]=n}return jt}a(mL,"initOldConfig");function lX(e){let t=PA();return V3.get(t,e.replaceAll("_","."))}a(lX,"getConfigFromFile");async function uX(e,t){let r=jo(lc());r.hasIn([e])?r.setIn([e],t):r.addIn([e],t),await Kr.writeFile(lc(),String(r))}a(uX,"addConfig");function dX(e){let t=lc(Er.getPropsFilePath()),r=jo(t);r.deleteIn(e);let n=r.getIn(["rootPath"]),s=Bn.join(n,un.HDB_CONFIG_FILE);Kr.writeFileSync(s,String(r))}a(dX,"deleteConfigFromFile");function _X(){return kh||(Fh(),kh)}a(_X,"getConfigObj");function fX(){return jt||Fh(),jt}a(fX,"getFlatConfigObj")});var gL=N((fRe,TL)=>{"use strict";var Gh=M(),qh=class{static{a(this,"BaseLicense")}constructor(t=0,r=Gh.RAM_ALLOCATION_ENUM.DEFAULT,n=Gh.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},DA=class extends qh{static{a(this,"ExtendedLicense")}constructor(t=0,r=Gh.RAM_ALLOCATION_ENUM.DEFAULT,n=Gh.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};TL.exports={BaseLicense:qh,ExtendedLicense:DA}});var uc=N((hRe,IL)=>{"use strict";var xl=require("fs-extra"),RL=Bh(),yL=require("crypto"),EX=require("moment"),hX=require("uuid").v4,Yr=j(),MA=require("path"),pX=re(),zo=M(),{totalmem:AL}=require("os"),mX=gL().ExtendedLicense,Hl="invalid license key format",SX="061183",TX="mofi25",gX="aes-256-cbc",AX=16,RX=32,bL=se(),{resolvePath:OL}=Ct();bL.initSync();var LA;IL.exports={validateLicense:NL,generateFingerPrint:bX,licenseSearch:BA,getLicense:IX,checkMemoryLimit:wX};function UA(){return MA.join(bL.getHdbBasePath(),zo.LICENSE_KEY_DIR_NAME,zo.LICENSE_FILE_NAME)}a(UA,"getLicenseDirPath");function yX(){let e=UA();return OL(MA.join(e,zo.LICENSE_FILE_NAME))}a(yX,"getLicenseFilePath");function vA(){let e=UA();return OL(MA.join(e,zo.REG_KEY_FILE_NAME))}a(vA,"getFingerPrintFilePath");async function bX(){let e=vA();try{return await xl.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await OX();throw Yr.error(`Error writing fingerprint file to ${e}`),Yr.error(t),new Error("There was an error generating the fingerprint")}}a(bX,"generateFingerPrint");async function OX(){let e=hX(),t=RL.hash(e),r=vA();try{await xl.mkdirp(UA()),await xl.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw Yr.error(`Error writing fingerprint file to ${r}`),Yr.error(n),new Error("There was an error generating the fingerprint")}return t}a(OX,"writeFingerprint");function NL(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:zo.RAM_ALLOCATION_ENUM.DEFAULT,version:zo.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return Yr.error("empty license key passed to validate."),r;let n=vA(),s=!1;try{s=xl.statSync(n)}catch(i){Yr.error(i)}if(s){let i;try{i=xl.readFileSync(n,"utf8")}catch{Yr.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(TX),c=o[1];c=Buffer.concat([Buffer.from(c)],AX);let l=Buffer.concat([Buffer.from(i)],RX),u=yL.createDecipheriv(gX,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let d=null;try{d=u.update(o[0],"hex","utf8"),d.trim(),d+=u.final("utf8")}catch{let f=NX(o[0],i);if(f)d=f;else throw r.valid_license=!1,r.valid_machine=!1,console.error(Hl),Yr.error(Hl),new Error(Hl)}let _;if(isNaN(d))try{_=JSON.parse(d),r.version=_.version,r.exp_date=_.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),_.ram_allocation&&(r.ram_allocation=_.ram_allocation)}catch{throw console.error(Hl),Yr.error(Hl),new Error(Hl)}else r.exp_date=d;r.exp_date<EX().valueOf()&&(r.valid_date=!1),RL.validate(o[1],`${SX}${i}${t}`)||(r.valid_license=!1)}else r.valid_license=!1,r.valid_machine=!1;return r.valid_license&&r.valid_machine&&r.valid_date||Yr.error("Invalid licence"),r}a(NL,"validateLicense");function NX(e,t){try{let r=yL.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{Yr.warn("Check old license failed")}}a(NX,"checkOldLicense");function BA(){let e=new mX,t=[];try{t=xl.readFileSync(yX(),"utf-8").split(zo.NEW_LINE)}catch(r){r.code==="ENOENT"?Yr.debug("no license file found"):Yr.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(pX.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=NL(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){Yr.error("There was an error parsing the license string."),Yr.error(s),e.ram_allocation=zo.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return LA=e,e}a(BA,"licenseSearch");async function IX(){return LA||await BA(),LA}a(IX,"getLicense");function wX(){let e=BA().ram_allocation,t=process.constrainedMemory?.()||AL();if(t=Math.round(Math.min(t,AL())/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(wX,"checkMemoryLimit")});var xn=N((gRe,$L)=>{"use strict";var DL="username is required",LL="nothing to update, must supply active, role or password to update",ML="password cannot be an empty string",UL="If role is specified, it cannot be empty.",vL="active must be true or false";$L.exports={addUser:HX,alterUser:xX,dropUser:FX,getSuperUser:VX,userInfo:GX,listUsers:Vh,listUsersExternal:qX,setUsersToGlobal:Fl,findAndValidateUser:GL,getClusterUser:KX,USERNAME_REQUIRED:DL,ALTERUSER_NOTHING_TO_UPDATE:LL,EMPTY_PASSWORD:ML,EMPTY_ROLE:UL,ACTIVE_BOOLEAN:vL};var BL=cn(),CX=oc(),kA=Bh(),HL=ZD(),xL=$r(),FA=eo(),Hn=re(),kL=require("validate.js"),Ke=j(),{promisify:PX}=require("util"),GA=Xi(),wL=M(),CL=It(),DX=Ct(),mRe=se(),SRe=uc(),LX=Qi(),{table:TRe}=(Pe(),oe(lt)),{handleHDBError:Ai,hdb_errors:MX}=_e(),{HTTP_STATUS_CODES:Ri,AUTHENTICATION_ERROR_MSGS:HA,HDB_ERROR_MSGS:kl}=MX,{UserEventMsg:qA}=qs(),xA=require("lodash"),{server:$A}=(qr(),oe(ja)),UX=j();$A.getUser=(e,t)=>GL(e,t,t!=null);var FL={username:!0,active:!0,role:!0,password:!0},PL=new Map,$h=xL.searchByValue,vX=xL.searchByHash,BX=PX(CX.delete);async function HX(e){let t=kL.cleanAttributes(e,FL),r=HL.addUserValidation(t);if(r)throw Ai(new Error,r.message,Ri.BAD_REQUEST,void 0,void 0,!0);let n={schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["id","permission","role"]},s;try{s=await $h(n),s=s&&Array.from(s)}catch(l){throw Ke.error("There was an error searching for a role in add user"),Ke.error(l),l}if(!s||s.length<1)throw Ai(new Error,kl.ROLE_NAME_NOT_FOUND(t.role),Ri.NOT_FOUND,void 0,void 0,!0);if(s.length>1)throw Ai(new Error,kl.DUP_ROLES_FOUND(t.role),Ri.CONFLICT,void 0,void 0,!0);s[0].permission.cluster_user===!0&&(t.hash=GA.encrypt(t.password)),t.password=kA.hash(t.password),t.role=s[0].id;let i={operation:"insert",schema:"system",table:"hdb_user",records:[t]},o;try{o=await BL.insert(i)}catch(l){throw Ke.error("There was an error searching for a user."),Ke.error(l),l}Ke.debug(o);try{await Fl()}catch(l){throw Ke.error("Got an error setting users to global"),Ke.error(l),l}if(o.skipped_hashes.length===1)throw Ai(new Error,kl.USER_ALREADY_EXISTS(t.username),Ri.CONFLICT,void 0,void 0,!0);let c={...t};return c.role=s[0],FA.signalUserChange(new qA(process.pid)),`${c.username} successfully added`}a(HX,"addUser");async function xX(e){let t=kL.cleanAttributes(e,FL);if(Hn.isEmptyOrZeroLength(t.username))throw new Error(DL);if(Hn.isEmptyOrZeroLength(t.password)&&Hn.isEmptyOrZeroLength(t.role)&&Hn.isEmptyOrZeroLength(t.active))throw new Error(LL);if(!Hn.isEmpty(t.password)&&Hn.isEmptyOrZeroLength(t.password.trim()))throw new Error(ML);if(!Hn.isEmpty(t.active)&&!Hn.isBoolean(t.active))throw new Error(vL);let r=kX(t.username);if(!Hn.isEmpty(t.password)&&!Hn.isEmptyOrZeroLength(t.password.trim())&&(r&&(t.hash=GA.encrypt(t.password)),t.password=kA.hash(t.password)),t.role==="")throw new Error(UL);if(t.role){let i={schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["*"]},o;try{o=Array.from(await $h(i)||[])}catch(c){throw Ke.error("Got an error searching for a role."),Ke.error(c),c}if(!o||o.length===0){let c=kl.ALTER_USER_ROLE_NOT_FOUND(t.role);throw Ke.error(c),Ai(new Error,c,Ri.NOT_FOUND,void 0,void 0,!0)}if(o.length>1){let c=kl.ALTER_USER_DUP_ROLES(t.role);throw Ke.error(c),Ai(new Error,c,Ri.CONFLICT,void 0,void 0,!0)}t.role=o[0].id}let n={operation:"update",schema:"system",table:"hdb_user",records:[t]},s;try{s=await BL.update(n)}catch(i){throw Ke.error("Error during update."),Ke.error(i),i}try{await Fl()}catch(i){throw Ke.error("Got an error setting users to global"),Ke.error(i),i}return FA.signalUserChange(new qA(process.pid)),s}a(xX,"alterUser");function kX(e){let t=!1,r=global.hdb_users.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}a(kX,"isClusterUser");async function FX(e){try{let t=HL.dropUserValidation(e);if(t)throw new Error(t);let r={table:"hdb_user",schema:"system",hash_values:[e.username]};if(Hn.isEmpty(global.hdb_users.get(e.username)))throw Ai(new Error,kl.USER_NOT_EXIST(e.username),Ri.NOT_FOUND,void 0,void 0,!0);let n;try{n=await BX(r)}catch(s){throw Ke.error("Got an error deleting a user."),Ke.error(s),s}Ke.debug(n);try{await Fl()}catch(s){throw Ke.error("Got an error setting users to global."),Ke.error(s),s}return FA.signalUserChange(new qA(process.pid)),`${e.username} successfully deleted`}catch(t){throw t}}a(FX,"dropUser");async function GX(e){let t={};try{if(!e||!e.hdb_user)return"There was no user info in the body";t=xA.cloneDeep(e.hdb_user);let r={schema:"system",table:"hdb_role",hash_values:[t.role.id],get_attributes:["*"]},n;try{n=await vX(r)}catch(s){throw Ke.error("Got an error searching for a role."),Ke.error(s),s}t.role=n[0],delete t.password,delete t.refresh_token,delete t.hash}catch(r){throw Ke.error(r),r}return t}a(GX,"userInfo");async function qX(){let e;try{e=await Vh()}catch(t){throw Ke.error("Got an error listing users."),Ke.error(t),t}try{e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token})}catch{throw new Error("there was an error massaging the user data")}return[...e.values()]}a(qX,"listUsersExternal");async function Vh(){try{let e={schema:"system",table:"hdb_role",search_value:"*",search_attribute:"role",get_attributes:["*"]},t;try{t=await $h(e)}catch(o){throw Ke.error("Got an error searching for roles."),Ke.error(o),o}let r={};for(let o of t)r[o.id]=xA.cloneDeep(o);if(Object.keys(r).length===0)return null;let n={schema:"system",table:"hdb_user",search_value:"*",search_attribute:"username",get_attributes:["*"]},s;try{s=await $h(n)}catch(o){throw Ke.error("Got an error searching for users."),Ke.error(o),o}let i=new Map;for(let o of s)o=xA.cloneDeep(o),o.role=r[o.role],$X(o.role),i.set(o.username,o);return i}catch(e){throw Ke.error("got an error listing users"),Ke.error(e),Hn.errorizeMessage(e)}return null}a(Vh,"listUsers");function $X(e){try{if(!e){Ke.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(LX)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}catch(t){Ke.error("Got an error trying to set system permissions."),Ke.error(t)}}a($X,"appendSystemTablesToRole");async function Fl(){try{let e=await Vh();global.hdb_users=e}catch(e){throw Ke.error(e),e}}a(Fl,"setUsersToGlobal");async function GL(e,t,r=!0){global.hdb_users||await Fl();let n=global.hdb_users.get(e);if(!n){if(!r)return{username:e};throw Ai(new Error,HA.GENERIC_AUTH_FAIL,Ri.UNAUTHORIZED,void 0,void 0,!0)}if(n&&!n.active)throw Ai(new Error,HA.USER_INACTIVE,Ri.UNAUTHORIZED,void 0,void 0,!0);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(PL.get(t)===n.password)return s;if(kA.validate(n.password,t))PL.set(t,n.password);else throw Ai(new Error,HA.GENERIC_AUTH_FAIL,Ri.UNAUTHORIZED,void 0,void 0,!0)}return s}a(GL,"findAndValidateUser");async function VX(){global.hdb_users||await Fl();for(let[,e]of global.hdb_users)if(e.role.role==="super_user")return e}a(VX,"getSuperUser");async function KX(){let e=await Vh(),t=DX.getConfigFromFile(wL.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!Hn.isEmpty(r)&&r?.role?.role===wL.ROLE_TYPES_ENUM.CLUSTER_USER)return r.decrypt_hash=GA.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+CL.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+CL.SERVER_SUFFIX.ADMIN,r}a(KX,"getClusterUser");var qL=[];$A.invalidateUser=function(e){for(let t of qL)try{t(e)}catch(r){UX.error("Error invalidating user",r)}};$A.onInvalidatedUser=function(e){qL.push(e)}});var E_=N((bRe,WL)=>{"use strict";var dc=j(),kn=M(),YX=gD(),RRe=Fs(),yRe=Zi(),WX=xn(),{validateEvent:VL}=qs(),f_=Un(),jX=require("process"),{resetDatabases:zX}=(Pe(),oe(lt)),QX={[kn.ITC_EVENT_TYPES.SCHEMA]:JX,[kn.ITC_EVENT_TYPES.USER]:YL};async function JX(e){let t=VL(e);if(t){dc.error(t);return}dc.trace("ITC schemaHandler received schema event:",e),await YX(e.message),await XX(e.message)}a(JX,"schemaHandler");async function XX(e){try{f_.resetReadTxn(kn.SYSTEM_SCHEMA_NAME,kn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),f_.resetReadTxn(kn.SYSTEM_SCHEMA_NAME,kn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),f_.resetReadTxn(kn.SYSTEM_SCHEMA_NAME,kn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=zX();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){dc.error(t)}}a(XX,"syncSchemaMetadata");var KL=[];async function YL(e){try{try{f_.resetReadTxn(kn.SYSTEM_SCHEMA_NAME,kn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),f_.resetReadTxn(kn.SYSTEM_SCHEMA_NAME,kn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){dc.warn(r)}let t=VL(e);if(t){dc.error(t);return}dc.trace(`ITC userHandler ${kn.HDB_ITC_CLIENT_PREFIX}${jX.pid} received user event:`,e),await WX.setUsersToGlobal();for(let r of KL)r()}catch(t){dc.error(t)}}a(YL,"userHandler");YL.addListener=function(e){KL.push(e)};WL.exports=QX});var qs=N((PRe,zL)=>{"use strict";var NRe=j(),VA=re(),ZX=M(),{ITC_ERRORS:h_}=Pn(),{parentPort:IRe,threadId:eZ,isMainThread:tZ,workerData:wRe}=require("worker_threads"),{onMessageFromWorkers:rZ,broadcast:CRe,broadcastWithAcknowledgement:nZ}=dt();zL.exports={sendItcEvent:sZ,validateEvent:jL,SchemaEventMsg:iZ,UserEventMsg:oZ};var Kh;rZ(async(e,t)=>{Kh=Kh||E_(),jL(e),Kh[e.type]&&await Kh[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function sZ(e){return!tZ&&e.message&&(e.message.originator=eZ),nZ(e)}a(sZ,"sendItcEvent");function jL(e){if(typeof e!="object")return h_.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||VA.isEmpty(e.type))return h_.MISSING_TYPE;if(!e.hasOwnProperty("message")||VA.isEmpty(e.message))return h_.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||VA.isEmpty(e.message.originator))return h_.MISSING_ORIGIN;if(ZX.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return h_.INVALID_EVENT(e.type)}a(jL,"validateEvent");function iZ(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(iZ,"SchemaEventMsg");function oZ(e){this.originator=e}a(oZ,"UserEventMsg")});var eo=N((MRe,ZL)=>{"use strict";var QL=M(),LRe=re(),Yh=j(),JL=mD(),Gl,{sendItcEvent:XL}=qs();function aZ(e){try{Yh.info("signalSchemaChange called with message:",e),Gl=Gl||E_();let t=new JL(QL.ITC_EVENT_TYPES.SCHEMA,e);return Gl.schema(t),XL(t)}catch(t){Yh.error(t)}}a(aZ,"signalSchemaChange");function cZ(e){try{Yh.trace("signalUserChange called with message:",e),Gl=Gl||E_();let t=new JL(QL.ITC_EVENT_TYPES.USER,e);return Gl.user(t),XL(t)}catch(t){Yh.error(t)}}a(cZ,"signalUserChange");ZL.exports={signalSchemaChange:aZ,signalUserChange:cZ}});var Wh=N((vRe,tM)=>{"use strict";var eM=re(),lZ=M(),uZ=j(),dZ=Ih(),_Z=Nh(),fZ=eo(),{SchemaEventMsg:EZ}=qs(),hZ="already exists in";tM.exports=pZ;async function pZ(e,t,r){if(eM.isEmptyOrZeroLength(r))return r;let n=[];eM.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 mZ(e,t.schema,t.name,i)})),s}a(pZ,"lmdbCheckForNewAttributes");async function mZ(e,t,r,n){let s=new _Z(t,r,n,void 0,!0);e&&(s.hdb_auth_header=e);try{await SZ(s)}catch(i){if(typeof i=="object"&&i.message!==void 0&&i.message.includes(hZ))uZ.warn(`attribute ${t}.${r}.${n} already exists`);else throw i}}a(mZ,"createNewAttribute");async function SZ(e){let t;return t=await dZ(e),fZ.signalSchemaChange(new EZ(process.pid,lZ.OPERATIONS_ENUM.CREATE_ATTRIBUTE,e.schema,e.table,e.attribute)),t}a(SZ,"createAttribute")});var ql=N((HRe,rM)=>{"use strict";var KA=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}};rM.exports=KA});var sM=N((kRe,nM)=>{"use strict";var TZ=ql(),gZ=M().OPERATIONS_ENUM,YA=class extends TZ{static{a(this,"LMDBInsertTransactionObject")}constructor(t,r,n,s,i=void 0){super(gZ.INSERT,r,n,s,i),this.records=t}};nM.exports=YA});var oM=N((GRe,iM)=>{"use strict";var AZ=ql(),RZ=M().OPERATIONS_ENUM,WA=class extends AZ{static{a(this,"LMDBUpdateTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(RZ.UPDATE,n,s,i,o),this.records=t,this.original_records=r}};iM.exports=WA});var cM=N(($Re,aM)=>{"use strict";var yZ=ql(),bZ=M().OPERATIONS_ENUM,jA=class extends yZ{static{a(this,"LMDBUpsertTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(bZ.UPSERT,n,s,i,o),this.records=t,this.original_records=r}};aM.exports=jA});var uM=N((KRe,lM)=>{"use strict";var OZ=ql(),NZ=M().OPERATIONS_ENUM,zA=class extends OZ{static{a(this,"LMDBDeleteTransactionObject")}constructor(t,r,n,s,i=void 0){super(NZ.DELETE,n,s,t,i),this.original_records=r}};lM.exports=zA});var p_=N((jRe,EM)=>{"use strict";var WRe=require("path"),dM=ht(),IZ=sM(),wZ=oM(),CZ=cM(),PZ=uM(),$l=Ht(),_M=re(),{CONFIG_PARAMS:DZ}=M(),fM=se();fM.initSync();var jh=M().OPERATIONS_ENUM,{getTransactionAuditStorePath:LZ}=Tt();EM.exports=MZ;async function MZ(e,t){if(fM.get(DZ.LOGGING_AUDITLOG)===!1)return;let r=LZ(e.schema,e.table),n=await dM.openEnvironment(r,e.table,!0),s=UZ(e,t);if(!(s===void 0||s.hash_values.length===0)&&n!==void 0){dM.initializeDBIs(n,$l.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,$l.TRANSACTIONS_DBIS);let i=s.timestamp;return await n.dbis[$l.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].ifNoExists(i,()=>{n.dbis[$l.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].put(i,s),_M.isEmpty(s.user_name)||n.dbis[$l.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].put(s.user_name,i);for(let o=0;o<s.hash_values.length;o++)n.dbis[$l.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].put(s.hash_values[o],i)})}}a(MZ,"writeTransaction");function UZ(e,t){let r=_M.isEmpty(e.hdb_user)?void 0:e.hdb_user?.username;if(e.operation===jh.INSERT)return new IZ(e.records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===jh.UPDATE)return new wZ(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===jh.UPSERT)return new CZ(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===jh.DELETE)return new PZ(t.deleted,t.original_records,r,t.txn_time,e.__origin)}a(UZ,"createTransactionObject")});var QA=N((JRe,hM)=>{"use strict";var vZ=c_(),QRe=Kd(),m_=M(),BZ=Yd(),HZ=ec().insertRecords,xZ=ht(),kZ=j(),FZ=Wh(),{getSchemaPath:GZ}=Tt(),qZ=p_();hM.exports=$Z;async function $Z(e){try{let{schema_table:t,attributes:r}=vZ(e);BZ(e,r,t.hash_attribute),e.schema!==m_.SYSTEM_SCHEMA_NAME&&(r.includes(m_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(m_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(m_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(m_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await FZ(e.hdb_auth_header,t,r),s=GZ(e.schema,e.table),i=await xZ.openEnvironment(s,e.table),o=await HZ(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await qZ(e,o)}catch(c){kZ.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($Z,"lmdbCreateRecords")});var SM=N((ZRe,mM)=>{"use strict";var pM=M(),VZ=QA(),KZ=Kd(),YZ=require("fs-extra"),{getSchemaPath:WZ}=Tt();mM.exports=jZ;async function jZ(e){let t=[{name:e.schema,createddate:Date.now()}],r=new KZ(pM.SYSTEM_SCHEMA_NAME,pM.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,void 0,t);await VZ(r),await YZ.mkdirp(WZ(e.schema))}a(jZ,"lmdbCreateSchema")});var gM=N((tye,TM)=>{"use strict";var JA=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}};TM.exports=JA});var bM=N((oye,yM)=>{"use strict";var AM=ht(),XA=sn(),ZA=Pn().LMDB_ERRORS_ENUM,zZ=Ht(),RM=j(),nye=re(),QZ=require("lmdb"),JZ=gM(),XZ=M(),{OVERFLOW_MARKER:sye,MAX_SEARCH_KEY_LENGTH:iye}=zZ,ZZ=XZ.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function e5(e,t,r,n){if(XA.validateEnv(e),t===void 0)throw new Error(ZA.HASH_ATTRIBUTE_REQUIRED);if(!Array.isArray(r))throw r===void 0?new Error(ZA.IDS_REQUIRED):new Error(ZA.IDS_MUST_BE_ITERABLE);try{let s=AM.listDBIs(e);AM.initializeDBIs(e,t,s);let i=new JZ,o,c=[],l=[];for(let E=0,f=r.length;E<f;E++)try{o=r[E];let h=e.dbis[t].get(o);if(!h||n&&h[ZZ]>n){i.skipped.push(o);continue}let T=e.dbis[t].ifVersion(o,QZ.IF_EXISTS,()=>{e.dbis[t].remove(o);for(let m=0;m<s.length;m++){let g=s[m];if(!h.hasOwnProperty(g)||g===t)continue;let S=e.dbis[g],y=h[g];if(y!=null)try{let I=XA.getIndexedValues(y);if(I)for(let U=0,H=I.length;U<H;U++)S.remove(I[U],o)}catch{RM.warn(`cannot delete from attribute: ${g}, ${y}:${o}`)}}});c.push(T),l.push(o),i.original_records.push(h)}catch(h){RM.warn(h),i.skipped.push(o)}let u=[],d=await Promise.all(c);for(let E=0,f=d.length;E<f;E++)d[E]===!0?i.deleted.push(l[E]):(i.skipped.push(l[E]),u.push(E));let _=0;for(let E=0;E<u.length;E++){let f=u[E];i.original_records.splice(f-_,1),_++}return i.txn_time=XA.getNextMonotonicTime(),i}catch(s){throw s}}a(e5,"deleteRecords");yM.exports={deleteRecords:e5}});var S_=N((cye,NM)=>{"use strict";var Vl=re(),t5=bM(),r5=ht(),{getSchemaPath:n5}=Tt(),s5=p_(),i5=j();NM.exports=o5;async function o5(e,t=!0){let n=global.hdb_schema[e.schema][e.table].hash_attribute;if(Vl.isEmpty(n))throw new Error(`could not retrieve hash attribute for schema:${e.schema} and table ${e.table}`);try{if(Vl.isEmptyOrZeroLength(e.hash_values)&&!Vl.isEmptyOrZeroLength(e.records)){e.hash_values=[];for(let c=0;c<e.records.length;c++){let l=e.records[c][n];Vl.isEmpty(l)||e.hash_values.push(l)}}if(Vl.isEmptyOrZeroLength(e.hash_values))return OM([],[]);if(!Array.isArray(e.hash_values))throw new Error("hash_values must be an array");if(Vl.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=n5(e.schema,e.table),i=await r5.openEnvironment(s,e.table),o=await t5.deleteRecords(i,n,e.hash_values,e.__origin?.timestamp);try{t===!0&&await s5(e,o)}catch(c){i5.error(`unable to write transaction due to ${c.message}`)}return OM(o.deleted,o.skipped,o.txn_time)}catch(s){throw s}}a(o5,"lmdbDeleteRecords");function OM(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(OM,"createDeleteResponse")});var tR=N((dye,IM)=>{"use strict";var a5=M(),uye=sn();function eR(e,t){let r=Object.create(null);if(t.length===1&&a5.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(eR,"parseRow");function c5(e,t,r,n){let s=eR(r,e);n.push(s)}a(c5,"searchAll");function l5(e,t,r,n){let s=eR(r,e);n[t]=s}a(l5,"searchAllToMap");function u5(e,t,r){r[e]===void 0&&(r[e]=[]),r[e].push(t)}a(u5,"iterateDBI");function _c(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(_c,"pushResults");function d5(e,t,r,n,s,i){t.toString().endsWith(e)&&_c(t,r,n,s,i)}a(d5,"endsWith");function _5(e,t,r,n,s,i){t.toString().includes(e)&&_c(t,r,n,s,i)}a(_5,"contains");function f5(e,t,r,n,s,i){t>e&&_c(t,r,n,s,i)}a(f5,"greaterThanCompare");function E5(e,t,r,n,s,i){t>=e&&_c(t,r,n,s,i)}a(E5,"greaterThanEqualCompare");function h5(e,t,r,n,s,i){t<e&&_c(t,r,n,s,i)}a(h5,"lessThanCompare");function p5(e,t,r,n,s,i){t<=e&&_c(t,r,n,s,i)}a(p5,"lessThanEqualCompare");IM.exports={parseRow:eR,searchAll:c5,searchAllToMap:l5,iterateDBI:u5,endsWith:d5,contains:_5,greaterThanCompare:f5,greaterThanEqualCompare:E5,lessThanCompare:h5,lessThanEqualCompare:p5,pushResults:_c}});var Kl=N((pye,UM)=>{"use strict";var Qo=ht(),fye=j(),Fn=sn(),zh=Ht(),zt=Pn().LMDB_ERRORS_ENUM,Eye=re(),m5=M(),Qh=tR(),{parseRow:S5}=Qh,hye=require("lmdb"),{OVERFLOW_MARKER:wM,MAX_SEARCH_KEY_LENGTH:T5}=zh;function CM(e,t,r,n=!1,s=void 0,i=void 0){return fc(e,t,r,(o,c)=>c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}))}a(CM,"iterateFullIndex");function T_(e,t,r,n,s,i=!1,o=void 0,c=void 0,l=!1,u=!1){return fc(e,t,r,(d,_,E,f)=>{let S={transaction:d,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 f===r?(S.values=!1,_.getRange(S).map(y=>({value:y}))):_.getRange(S)})}a(T_,"iterateRangeBetween");function fc(e,t,r,n){let s=e.database||e,i=Qo.openDBI(s,r);i[zh.DBI_DEFINITION_NAME].is_hash_attribute?t=r:t&&Qo.openDBI(s,t);let o;e.database?o=e:(o=e.useReadTransaction(),o.database=e);let c=n(o,i,s,t);return c.transaction=o,e.database||(c.onDone=()=>{o.done()}),c}a(fc,"setupTransaction");function PM(e,t,r,n){let s;return function(i,o){if(typeof i=="string"&&i.endsWith(wM)){if(!s)if(r)s=Qo.openDBI(e,r);else{let l=Qo.listDBIs(e);for(let u=0,d=l.length;u<d&&(s=Qo.openDBI(e,l[u]),!s[zh.DBI_DEFINITION_NAME].is_hash_attribute);u++);}i=s.get(o,{transaction:t,lazy:!0})[n]}return i}}a(PM,"getOverflowCheck");function g5(e,t,r,n=!1,s=void 0,i=void 0){if(Fn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);return fc(e,t,t,(o,c,l)=>(Jh(r),r=g_(l,r),c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}).map(u=>S5(u.value,r))))}a(g5,"searchAll");function A5(e,t,r,n=!1,s=void 0,i=void 0){if(Fn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);Jh(r),r=g_(e.database||e,r);let o=new Map;for(let{key:c,value:l}of CM(e,t,t,n,s,i))o.set(c,Qh.parseRow(l,r));return o}a(A5,"searchAllToMap");function R5(e,t,r=!1,n=void 0,s=void 0){if(Fn.validateEnv(e),t===void 0)throw new Error(zt.ATTRIBUTE_REQUIRED);let i=Object.create(null),o=CM(e,void 0,t,r,n,s),c=o.transaction,l=PM(c.database,c,void 0,t);for(let{key:u,value:d}of o){let _=l(u,d);i[_]===void 0&&(i[_]=[]),i[_].push(d)}return i}a(R5,"iterateDBI");function y5(e,t){if(Fn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);return Qo.statDBI(e,t).entryCount}a(y5,"countAll");function b5(e,t,r,n,s=!1,i=void 0,o=void 0){return Jo(e,r,n),fc(e,t,r,(c,l,u,d)=>(n=Fn.convertKeyValueToWrite(n),d===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(_=>({key:n,value:_}))))}a(b5,"equals");function O5(e,t,r){return Jo(e,t,r),Qo.openDBI(e,t).getValuesCount(r)}a(O5,"count");function N5(e,t,r,n,s=!1,i=void 0,o=void 0){return Jo(e,r,n),fc(e,null,r,(c,l)=>{n=Fn.convertKeyValueToWrite(n);let u=!0;typeof n=="number"&&(u=!1);let d;if(s===!0){let _;for(let E of l.getKeys({transaction:c,start:n}))if(!E.startsWith(n)){_=E;break}return _!==void 0&&(Number.isInteger(o)?o++:i++),d=l.getRange({transaction:c,start:_,end:void 0,reverse:s,limit:i,offset:o}).map(E=>{let{key:f}=E;if(f!==_){if(f.toString().startsWith(n))return E;if(u===!0)return d.DONE}}),d.filter(E=>E)}else return d=l.getRange({transaction:c,start:n,reverse:s,limit:i,offset:o}).map(_=>{if(_.key.toString().startsWith(n))return _;if(u===!0)return d.DONE}),u?d:d.filter(_=>_)})}a(N5,"startsWith");function I5(e,t,r,n,s=!1,i=void 0,o=void 0){return DM(e,t,r,n,s,i,o,!0)}a(I5,"endsWith");function DM(e,t,r,n,s=!1,i=void 0,o=void 0,c=!1){return Jo(e,r,n),fc(e,null,r,(l,u,d,_)=>{let E=PM(d,l,_,r);return o=Number.isInteger(o)?o:0,u.getKeys({transaction:l,end:s?!1:void 0,reverse:s}).flatMap(f=>{let h=f.toString();return h.endsWith(wM)?u.getValues(f,{transaction:l}).map(T=>{let m=E(f,T);if(c?m.endsWith(n):m.includes(n))return{key:m,value:T}}).filter(T=>T):(c?h.endsWith(n):h.includes(n))?u[zh.DBI_DEFINITION_NAME].is_hash_attribute?{key:f,value:f}:u.getValues(f,{transaction:l}).map(T=>({key:f,value:T})):[]}).slice(o,i===void 0?void 0:i+(o||0))})}a(DM,"contains");function w5(e,t,r,n,s=!1,i=void 0,o=void 0){Jo(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),T_(e,t,r,n,l,s,i,o,!0,!1)}a(w5,"greaterThan");function C5(e,t,r,n,s=!1,i=void 0,o=void 0){Jo(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),T_(e,t,r,n,l,s,i,o,!1,!1)}a(C5,"greaterThanEqual");function P5(e,t,r,n,s=!1,i=void 0,o=void 0){Jo(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),T_(e,t,r,l,n,s,i,o,!1,!0)}a(P5,"lessThan");function D5(e,t,r,n,s=!1,i=void 0,o=void 0){Jo(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),T_(e,t,r,l,n,s,i,o,!1,!1)}a(D5,"lessThanEqual");function L5(e,t,r,n,s,i=!1,o=void 0,c=void 0){if(Fn.validateEnv(e),r===void 0)throw new Error(zt.ATTRIBUTE_REQUIRED);if(n===void 0)throw new Error(zt.START_VALUE_REQUIRED);if(s===void 0)throw new Error(zt.END_VALUE_REQUIRED);if(n=Fn.convertKeyValueToWrite(n),s=Fn.convertKeyValueToWrite(s),n>s)throw new Error(zt.END_VALUE_MUST_BE_GREATER_THAN_START_VALUE);return T_(e,t,r,n,s,i,o,c)}a(L5,"between");function M5(e,t,r,n){Fn.validateEnv(e);let s=e.database||e,i=e.database?e:null;if(t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);if(Jh(r),r=g_(s,r),n===void 0)throw new Error(zt.ID_REQUIRED);let o=null,c=s.dbis[t].get(n,{transaction:i,lazy:r.length<3});return c&&(o=Qh.parseRow(c,r)),o}a(M5,"searchByHash");function U5(e,t,r){Fn.validateEnv(e);let n=e.database||e,s=e.database?e:null;if(t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(zt.ID_REQUIRED);let i=!0;return n.dbis[t].get(r,{transaction:s,lazy:!0})===void 0&&(i=!1),i}a(U5,"checkHashExists");function v5(e,t,r,n,s=[]){return MM(e,t,r,n,s),LM(e,t,r,n,s).map(i=>i[1])}a(v5,"batchSearchByHash");function B5(e,t,r,n,s=[]){MM(e,t,r,n,s);let i=new Map;for(let[o,c]of LM(e,t,r,n,s))i.set(o,c);return i}a(B5,"batchSearchByHashToMap");function LM(e,t,r,n,s=[]){return fc(e,t,t,(i,o,c)=>{r=g_(c,r);let l=r.length<3;return n.map(u=>{let d=c.dbis[t].get(u,{transaction:i,lazy:l});if(d)return[u,Qh.parseRow(d,r)];s.push(u)}).filter(u=>u)})}a(LM,"batchHashSearch");function MM(e,t,r,n,s){if(Fn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);if(Jh(r),n==null)throw new Error(zt.IDS_REQUIRED);if(!n[Symbol.iterator])throw new Error(zt.IDS_MUST_BE_ITERABLE)}a(MM,"initializeBatchSearchByHash");function Jh(e){if(!Array.isArray(e))throw e===void 0?new Error(zt.FETCH_ATTRIBUTES_REQUIRED):new Error(zt.FETCH_ATTRIBUTES_MUST_BE_ARRAY)}a(Jh,"validateFetchAttributes");function Jo(e,t,r){if(Fn.validateEnv(e),t===void 0)throw new Error(zt.ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(zt.SEARCH_VALUE_REQUIRED);if(r?.length>T5)throw new Error(zt.SEARCH_VALUE_TOO_LARGE)}a(Jo,"validateComparisonFunctions");function g_(e,t){return t.length===1&&m5.SEARCH_WILDCARDS.indexOf(t[0])>=0&&(t=Qo.listDBIs(e)),t}a(g_,"setGetWholeRowAttributes");UM.exports={searchAll:g5,searchAllToMap:A5,count:O5,countAll:y5,equals:b5,startsWith:N5,endsWith:I5,contains:DM,searchByHash:M5,setGetWholeRowAttributes:g_,batchSearchByHash:v5,batchSearchByHashToMap:B5,checkHashExists:U5,iterateDBI:R5,greaterThan:w5,greaterThanEqual:C5,lessThan:P5,lessThanEqual:D5,between:L5}});var Yl=N((Sye,kM)=>{var vM=require("lodash"),BM=gt(),xe=require("joi"),H5=re(),{hdb_schema_table:A_,checkValidTable:HM,hdb_table:xM,hdb_database:Xh}=Si(),{handleHDBError:x5,hdb_errors:k5}=_e(),{getDatabases:F5}=(Pe(),oe(lt)),{HTTP_STATUS_CODES:G5}=k5,q5=xe.object({database:Xh,schema:Xh,table:xM,search_attribute:A_,search_value:xe.any().required(),get_attributes:xe.array().min(1).items(xe.alternatives(A_,xe.object())).optional(),desc:xe.bool(),limit:xe.number().integer().min(1),offset:xe.number().integer().min(0)}),$5=xe.object({database:Xh,schema:Xh,table:xM,operator:xe.string().valid("and","or").default("and").lowercase(),offset:xe.number().integer().min(0),limit:xe.number().integer().min(1),get_attributes:xe.array().min(1).items(xe.alternatives(A_,xe.object())).optional(),sort:xe.object({attribute:xe.alternatives(A_,xe.array().min(1)),descending:xe.bool().optional()}).optional(),conditions:xe.array().min(1).items(xe.alternatives(xe.object({operator:xe.string().valid("and","or").default("and").lowercase(),conditions:xe.array()}),xe.object({search_attribute:xe.alternatives(A_,xe.array().min(1)),search_type:xe.string().valid("equals","contains","starts_with","ends_with","greater_than","greater_than_equal","less_than","less_than_equal","between","not_equal").optional(),search_value:xe.when("search_type",{switch:[{is:"equals",then:xe.any()},{is:"between",then:xe.array().items(xe.alternatives([xe.string(),xe.number()])).length(2)}],otherwise:xe.alternatives(xe.string(),xe.number())}).required()}))).required()});kM.exports=function(e,t){let r=null;switch(t){case"value":r=BM.validateBySchema(e,q5);break;case"hashes":let i=function(o){s?s+=". "+o:s=o};var n=i;a(i,"addError");let s;i(HM("database",e.schema)),i(HM("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=BM.validateBySchema(e,$5);break;default:throw new Error(`Error validating search, unknown type: ${t}`)}if(!r&&e.schema!=="system"){let s=H5.checkGlobalSchemaTable(e.schema,e.table);if(s)return x5(new Error,s,G5.NOT_FOUND);let o=F5()[e.schema][e.table].attributes,c=e.get_attributes?[...e.get_attributes]:[];t==="value"&&c.push(e.search_attribute);let l=a(d=>{for(let _=0,E=d.conditions.length;_<E;_++){let f=d.conditions[_];f.conditions?l(f):c.push(f.search_attribute)}},"addConditions");t==="conditions"&&l(e);let u=vM.filter(c,d=>d!=="*"&&!d.startsWith?.("$")&&d.attribute!=="*"&&!Array.isArray(d)&&!d.name&&!vM.some(o,_=>_===d||_.attribute===d||_.attribute===d.attribute));if(u&&u.length>0){let d=u.join(", ");return d=d.replace(/,([^,]*)$/," and$1"),new Error(`unknown attribute '${d}'`)}}return r}});var rR=N((gye,FM)=>{"use strict";var V5=ht(),K5=Yl(),{getSchemaPath:Y5}=Tt();FM.exports=W5;function W5(e){let t=K5(e,"hashes");if(t)throw t;let r=Y5(e.schema,e.table);return V5.openEnvironment(r,e.table)}a(W5,"initialize")});var nR=N((Rye,GM)=>{"use strict";var j5=Kl(),z5=rR();GM.exports=Q5;async function Q5(e){let t=await z5(e),r=t.useReadTransaction();r.database=t;let n=global.hdb_schema[e.schema][e.table];try{return j5.batchSearchByHashToMap(r,n.hash_attribute,e.get_attributes,e.hash_values)}finally{r.done()}}a(Q5,"lmdbGetDataByHash")});var Wl=N((bye,qM)=>{"use strict";var sR=class{static{a(this,"SearchByHashObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.hash_values=n,this.get_attributes=s}};qM.exports=sR});var VM=N((Iye,$M)=>{"use strict";var Nye=Wl(),J5=Kl(),X5=rR();$M.exports=Z5;async function Z5(e){let t=await X5(e),r=global.hdb_schema[e.schema][e.table];return J5.batchSearchByHash(t,r.hash_attribute,e.get_attributes,e.hash_values)}a(Z5,"lmdbSearchByHash")});var $s=N((Cye,KM)=>{"use strict";var iR=class{static{a(this,"SearchObject")}constructor(t,r,n,s,i,o,c,l=!1,u=void 0,d=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=d}};KM.exports=iR});var Zh=N((Dye,JM)=>{"use strict";var Wr=Kl(),e6=ht(),t6=re(),ke=Ht(),Ec=M(),r6=Qi(),YM=Pn().LMDB_ERRORS_ENUM,{getSchemaPath:n6}=Tt(),to=Ec.SEARCH_WILDCARDS;async function s6(e,t,r){let n;e.schema===Ec.SYSTEM_SCHEMA_NAME?n=r6[e.table]:n=global.hdb_schema[e.schema][e.table];let s=QM(e,n.hash_attribute,r,t);return jM(e,s,n.hash_attribute,r)}a(s6,"prepSearch");async function jM(e,t,r,n){let s=n6(e.schema,e.table),i=await e6.openEnvironment(s,e.table),o=zM(i,e,t,r),c=o.transaction||i;if([ke.SEARCH_TYPES.BATCH_SEARCH_BY_HASH,ke.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP,ke.SEARCH_TYPES.SEARCH_ALL,ke.SEARCH_TYPES.SEARCH_ALL_TO_MAP].indexOf(t)>=0)return o;if(i6(e,r)===!1){let d=e.search_attribute;if(d===r)return n?WM(o,()=>!0):o.map(E=>({[r]:E.key}));let _=a(E=>({[r]:E.value,[d]:E.key}),"toObject");return n?WM(o,_):o.map(_)}let u=e.search_attribute===r?o.map(d=>d.key):o.map(d=>d.value);return n===!0?Wr.batchSearchByHashToMap(c,r,e.get_attributes,u):Wr.batchSearchByHash(c,r,e.get_attributes,u)}a(jM,"executeSearch");function zM(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 ke.SEARCH_TYPES.EQUALS:s=Wr.equals(e,i,t.search_attribute,t.search_value,o,c,l);break;case ke.SEARCH_TYPES.CONTAINS:s=Wr.contains(e,i,t.search_attribute,t.search_value,o,c,l);break;case ke.SEARCH_TYPES.ENDS_WITH:case ke.SEARCH_TYPES._ENDS_WITH:s=Wr.endsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case ke.SEARCH_TYPES.STARTS_WITH:case ke.SEARCH_TYPES._STARTS_WITH:s=Wr.startsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case ke.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:return Wr.batchSearchByHash(e,t.search_attribute,t.get_attributes,[t.search_value]);case ke.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:return Wr.batchSearchByHashToMap(e,t.search_attribute,t.get_attributes,[t.search_value]);case ke.SEARCH_TYPES.SEARCH_ALL:return Wr.searchAll(e,n,t.get_attributes,o,c,l);case ke.SEARCH_TYPES.SEARCH_ALL_TO_MAP:return Wr.searchAllToMap(e,n,t.get_attributes,o,c,l);case ke.SEARCH_TYPES.BETWEEN:s=Wr.between(e,i,t.search_attribute,t.search_value,t.end_value,o,c,l);break;case ke.SEARCH_TYPES.GREATER_THAN:case ke.SEARCH_TYPES._GREATER_THAN:s=Wr.greaterThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case ke.SEARCH_TYPES.GREATER_THAN_EQUAL:case ke.SEARCH_TYPES._GREATER_THAN_EQUAL:s=Wr.greaterThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;case ke.SEARCH_TYPES.LESS_THAN:case ke.SEARCH_TYPES._LESS_THAN:s=Wr.lessThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case ke.SEARCH_TYPES.LESS_THAN_EQUAL:case ke.SEARCH_TYPES._LESS_THAN_EQUAL:s=Wr.lessThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;default:return Object.create(null)}return s}a(zM,"searchByType");function WM(e,t){let r=new Map;for(let n of e)r.set(n.value,t(n));return r}a(WM,"createMapFromIterable");function i6(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(i6,"checkToFetchMore");function QM(e,t,r,n){if(t6.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),to.indexOf(s)>-1)return r===!0?ke.SEARCH_TYPES.SEARCH_ALL_TO_MAP:ke.SEARCH_TYPES.SEARCH_ALL;if(s.indexOf(to[0])<0&&s.indexOf(to[1])<0)return c===!0?r===!0?ke.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:ke.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:ke.SEARCH_TYPES.EQUALS;if(to.indexOf(i)>=0&&to.indexOf(o)>=0)return e.search_value=e.search_value.slice(1,-1),ke.SEARCH_TYPES.CONTAINS;if(to.indexOf(i)>=0)return e.search_value=e.search_value.substr(1),ke.SEARCH_TYPES.ENDS_WITH;if(to.indexOf(o)>=0)return e.search_value=e.search_value.slice(0,-1),ke.SEARCH_TYPES.STARTS_WITH;if(s.includes(to[0])||s.includes(to[1]))return ke.SEARCH_TYPES.EQUALS;throw new Error(YM.UNKNOWN_SEARCH_TYPE)}else switch(n){case Ec.VALUE_SEARCH_COMPARATORS.BETWEEN:return ke.SEARCH_TYPES.BETWEEN;case Ec.VALUE_SEARCH_COMPARATORS.GREATER:return ke.SEARCH_TYPES.GREATER_THAN;case Ec.VALUE_SEARCH_COMPARATORS.GREATER_OR_EQ:return ke.SEARCH_TYPES.GREATER_THAN_EQUAL;case Ec.VALUE_SEARCH_COMPARATORS.LESS:return ke.SEARCH_TYPES.LESS_THAN;case Ec.VALUE_SEARCH_COMPARATORS.LESS_OR_EQ:return ke.SEARCH_TYPES.LESS_THAN_EQUAL;default:throw new Error(YM.UNKNOWN_SEARCH_TYPE)}}a(QM,"createSearchTypeFromSearchObject");JM.exports={executeSearch:jM,createSearchTypeFromSearchObject:QM,prepSearch:s6,searchByType:zM}});var ZM=N((Uye,XM)=>{"use strict";var Mye=$s(),o6=Yl(),a6=re(),c6=M(),l6=Zh();XM.exports=u6;function u6(e,t){if(!a6.isEmpty(t)&&c6.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=o6(e,"value");if(n)throw n;return l6.prepSearch(e,t,!0)}a(u6,"lmdbGetDataByValue")});var R_=N((Hye,eU)=>{"use strict";var Bye=$s(),d6=Yl(),_6=re(),f6=M(),E6=Zh();eU.exports=h6;async function h6(e,t){if(!_6.isEmpty(t)&&f6.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=d6(e,"value");if(n)throw n;return E6.prepSearch(e,t,!1)}a(h6,"lmdbSearchByValue")});var rU=N((Fye,tU)=>{"use strict";var kye=Ht(),oR=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}},aR=class{static{a(this,"SearchCondition")}constructor(t,r,n){this.search_attribute=t,this.search_type=r,this.search_value=n}},cR=class{static{a(this,"SortAttribute")}constructor(t,r){this.attribute=t,this.desc=r}};tU.exports={SearchByConditionsObject:oR,SearchCondition:aR,SortAttribute:cR}});var aU=N((Vye,oU)=>{"use strict";var qye=rU().SearchByConditionsObject,p6=$s(),m6=Yl(),lR=Kl(),ep=Ht(),{Resource:$ye}=(Vs(),oe(uR)),iU=Zh(),S6=tR(),T6=require("lodash"),{getSchemaPath:g6}=Tt(),nU=ht(),{handleHDBError:A6,hdb_errors:R6}=_e(),{HTTP_STATUS_CODES:y6}=R6,b6=1e8;oU.exports=O6;async function O6(e){let t=m6(e,"conditions");if(t)throw A6(t,t.message,y6.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=g6(e.schema,e.table),n=await nU.openEnvironment(r,e.table),s=global.hdb_schema[e.schema][e.table];for(let u of e.conditions)nU.openDBI(n,u.search_attribute);let i=T6.sortBy(e.conditions,u=>{if(u.estimated_count===void 0){let d=u.search_type;d===ep.SEARCH_TYPES.EQUALS?u.estimated_count=lR.count(n,u.search_attribute,u.search_value):d===ep.SEARCH_TYPES.CONTAINS||d===ep.SEARCH_TYPES.ENDS_WITH?u.estimated_count=1/0:u.estimated_count=b6}return u.estimated_count}),o=n.useReadTransaction();o.database=n;let c=await sU(o,e,i[0],s.hash_attribute),l;if(!e.operator||e.operator.toLowerCase()==="and"){let u=n.dbis[s.hash_attribute],d=i.slice(1).map(iU.filterByType),_=d.length,E=lR.setGetWholeRowAttributes(n,e.get_attributes);l=c.map(f=>u.get(f,{transaction:o,lazy:!0})),_>0&&(l=l.filter(f=>{for(let h=0;h<_;h++)if(!d[h](f))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(f=>S6.parseRow(f,E))}else{for(let _=1;_<i.length;_++){let E=i[_],f=await sU(o,e,E,s.hash_attribute);c=c.concat(f)}let u=new Set,d=e.offset||0;c=c.filter(_=>u.has(_)?!1:(u.add(_),!0)).slice(d,e.limit&&e.limit+d),l=lR.batchSearchByHash(o,s.hash_attribute,e.get_attributes,c)}return l.onDone=()=>{o.done()},l}a(O6,"lmdbSearchByConditions");async function sU(e,t,r,n){let s=new p6(t.schema,t.table,void 0,void 0,n,t.get_attributes),i=r.search_type;return s.search_attribute=r.search_attribute,i===ep.SEARCH_TYPES.BETWEEN?(s.search_value=r.search_value[0],s.end_value=r.search_value[1]):s.search_value=r.search_value,iU.searchByType(e,s,i,n).map(o=>o.value)}a(sU,"executeConditionSearch")});var y_=N((Yye,cU)=>{"use strict";var N6=M().OPERATIONS_ENUM,dR=class{static{a(this,"DeleteObject")}constructor(t,r,n,s=void 0){this.operation=N6.DELETE,this.schema=t,this.table=r,this.hash_values=n,this.__origin=s}};cU.exports=dR});var _R=N((jye,pU)=>{"use strict";var _U=$s(),fU=y_(),EU=R_(),hU=S_(),dn=M(),lU=re(),uU=ht(),{getTransactionAuditStorePath:I6,getSchemaPath:w6}=Tt(),dU=j();pU.exports=C6;async function C6(e){try{if(lU.isEmpty(global.hdb_schema[e.schema])||lU.isEmpty(global.hdb_schema[e.schema][e.table]))throw new Error(`unknown schema:${e.schema} and table ${e.table}`);await P6(e),await D6(e);let t=w6(e.schema,e.table);try{await uU.deleteEnvironment(t,e.table)}catch(r){if(r.message==="invalid environment")dU.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}try{let r=I6(e.schema,e.table);await uU.deleteEnvironment(r,e.table,!0)}catch(r){if(r.message==="invalid environment")dU.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}}catch(t){throw t}}a(C6,"lmdbDropTable");async function P6(e){let t=new _U(dn.SYSTEM_SCHEMA_NAME,dn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,dn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[dn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r=Array.from(await EU(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 fU(dn.SYSTEM_SCHEMA_NAME,dn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,n);await hU(s)}a(P6,"deleteAttributesFromSystem");async function D6(e){let t=new _U(dn.SYSTEM_SCHEMA_NAME,dn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,dn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,e.table,void 0,[dn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,dn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,dn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r,n;try{r=Array.from(await EU(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 fU(dn.SYSTEM_SCHEMA_NAME,dn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,[n.id]);try{await hU(s)}catch(i){throw i}}a(D6,"dropTableFromSystem")});var SU=N((Qye,mU)=>{"use strict";var L6=require("fs-extra"),M6=$s(),U6=Wl(),v6=y_(),B6=_R(),H6=S_(),x6=nR(),k6=R_(),ro=M(),{getSchemaPath:F6}=Tt(),{handleHDBError:G6,hdb_errors:q6}=_e(),{HDB_ERROR_MSGS:$6,HTTP_STATUS_CODES:V6}=q6;mU.exports=K6;async function K6(e){let t;try{t=await Y6(e.schema);let r=new M6(ro.SYSTEM_SCHEMA_NAME,ro.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,ro.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,t,void 0,[ro.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),n=Array.from(await k6(r));for(let o=0;o<n.length;o++){let c={schema:t,table:n[o].name};try{await B6(c)}catch(l){if(l.message!=="invalid environment")throw l}}let s=new v6(ro.SYSTEM_SCHEMA_NAME,ro.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[t]);await H6(s);let i=F6(t);await L6.remove(i)}catch(r){throw r}}a(K6,"lmdbDropSchema");async function Y6(e){let t=new U6(ro.SYSTEM_SCHEMA_NAME,ro.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[e],[ro.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),r,n;try{r=Array.from(await x6(t))}catch(s){throw s}for(let[,s]of r)s.name===e&&(n=e);if(!n)throw G6(new Error,$6.SCHEMA_NOT_FOUND(e),V6.NOT_FOUND,void 0,void 0,!0);return n}a(Y6,"validateDropSchema")});var b_=N((Xye,TU)=>{"use strict";var fR=class{static{a(this,"CreateTableObject")}constructor(t,r,n){this.schema=t,this.table=r,this.hash_attribute=n}};TU.exports=fR});var hR=N((tbe,gU)=>{"use strict";var W6=require("fs-extra"),tp=ht(),{getTransactionAuditStorePath:j6}=Tt(),ER=Ht(),ebe=b_();gU.exports=z6;async function z6(e){let t;try{let r=j6(e.schema,e.table);await W6.mkdirp(r),t=await tp.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{tp.createDBI(t,ER.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,!1,!0),tp.createDBI(t,ER.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,!0,!1),tp.createDBI(t,ER.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(z6,"createTransactionsAuditEnvironment")});var yU=N((sbe,RU)=>{"use strict";var pR=M(),AU=ht(),Q6=ec(),{getSystemSchemaPath:J6,getSchemaPath:X6}=Tt(),nbe=Qi(),Z6=Ih(),mR=Nh(),e8=j(),t8=hR();RU.exports=r8;async function r8(e,t){let r=X6(t.schema,t.table),n=new mR(t.schema,t.table,pR.TIME_STAMP_NAMES_ENUM.CREATED_TIME,void 0,!0),s=new mR(t.schema,t.table,pR.TIME_STAMP_NAMES_ENUM.UPDATED_TIME,void 0,!0),i=new mR(t.schema,t.table,t.hash_attribute,void 0,!1,!0);try{if(await AU.createEnvironment(r,t.table),e!==void 0){let o=await AU.openEnvironment(J6(),pR.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME);await Q6.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 SR(n),await SR(s),await SR(i)}await t8(t)}catch(o){throw o}}a(r8,"lmdbCreateTable");async function SR(e){try{await Z6(e)}catch(t){e8.warn(`failed to create attribute ${e.attribute} due to ${t.message}`)}}a(SR,"createAttribute")});var OU=N((obe,bU)=>{"use strict";var n8=c_(),s8=Yd(),i8=Wh(),O_=M(),o8=ec().updateRecords,a8=ht(),{getSchemaPath:c8}=Tt(),l8=p_(),u8=j();bU.exports=d8;async function d8(e){try{let{schema_table:t,attributes:r}=n8(e);s8(e,r,t.hash_attribute),e.schema!==O_.SYSTEM_SCHEMA_NAME&&(r.includes(O_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(O_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(O_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(O_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await i8(e.hdb_auth_header,t,r),s=c8(e.schema,e.table),i=await a8.openEnvironment(s,e.table),o=await o8(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await l8(e,o)}catch(c){u8.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(d8,"lmdbUpdateRecords")});var IU=N((cbe,NU)=>{"use strict";var _8=M().OPERATIONS_ENUM,TR=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=_8.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};NU.exports=TR});var CU=N((dbe,wU)=>{"use strict";var ube=IU(),f8=c_(),E8=Yd(),h8=Wh(),N_=M(),p8=ec().upsertRecords,m8=ht(),{getSchemaPath:S8}=Tt(),T8=p_(),g8=j(),{handleHDBError:A8,hdb_errors:R8}=_e();wU.exports=y8;async function y8(e){let t;try{t=f8(e)}catch(l){throw A8(l,l.message,R8.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}let{schema_table:r,attributes:n}=t;E8(e,n,r.hash_attribute),e.schema!==N_.SYSTEM_SCHEMA_NAME&&(n.includes(N_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||n.push(N_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),n.includes(N_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||n.push(N_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let s=await h8(e.hdb_auth_header,r,n),i=S8(e.schema,e.table),o=await m8.openEnvironment(i,e.table),c=await p8(o,r.hash_attribute,n,e.records,e.__origin?.timestamp);try{await T8(e,c)}catch(l){g8.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(y8,"lmdbUpsertRecords")});var DU=N((fbe,PU)=>{"use strict";var gR=class{static{a(this,"DeleteBeforeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.timestamp=n}};PU.exports=gR});var MU=N((hbe,LU)=>{"use strict";var AR=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}};LU.exports=AR});var BU=N((Sbe,vU)=>{"use strict";var RR=ht(),{getTransactionAuditStorePath:b8}=Tt(),mbe=DU(),I_=Ht(),O8=re(),UU=MU(),N8=require("util").promisify,I8=N8(setTimeout),w8=1e4,C8=100;vU.exports=P8;async function P8(e){let t=b8(e.schema,e.table),r=await RR.openEnvironment(t,e.table,!0),n=RR.listDBIs(r);RR.initializeDBIs(r,I_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s,i=new UU;do s=await D8(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 I8(C8);while(s.transactions_deleted>0);return i}a(P8,"deleteAuditLogsBefore");async function D8(e,t){let r=new UU;try{let n=e.dbis[I_.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[I_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME];O8.isEmpty(c)||(s=e.dbis[I_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].remove(c,i));for(let l=0;l<o.hash_values.length;l++)s=e.dbis[I_.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].remove(o.hash_values[l],i);if(r.transactions_deleted++,r.end_timestamp=i,r.transactions_deleted>w8)break}return await s,r}catch(n){throw n}}a(D8,"deleteTransactions")});var xU=N((gbe,HU)=>{"use strict";var yR=class{static{a(this,"DropAttributeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.attribute=n}};HU.exports=yR});var FU=N((ybe,kU)=>{"use strict";var L8=$s(),M8=y_(),Rbe=xU(),yi=M(),U8=re(),bR=ht(),v8=Qi(),B8=R_(),H8=S_(),{getSchemaPath:x8}=Tt();kU.exports=k8;async function k8(e,t=!0){let r;e.schema===yi.SYSTEM_SCHEMA_NAME?r=v8[e.table]:r=global.hdb_schema[e.schema][e.table];let n=await G8(e),s=x8(e.schema,e.table),i=await bR.openEnvironment(s,e.table);return t===!0&&await F8(e,i,r.hash_attribute),bR.dropDBI(i,e.attribute),n}a(k8,"lmdbDropAttribute");async function F8(e,t,r){let n=bR.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 d in c)d!==i&&(u[d]=c[d]);s=t.dbis[r].put(o,u,l)}await s}a(F8,"removeAttributeFromAllObjects");async function G8(e){let t=new L8(yi.SYSTEM_SCHEMA_NAME,yi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,yi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[yi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY,yi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]),n=Array.from(await B8(t)).filter(o=>o[yi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]===e.attribute);if(U8.isEmptyOrZeroLength(n))throw new Error(`Attribute '${e.attribute}' was not found in '${e.schema}.${e.table}'`);let s=n.map(o=>o[yi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),i=new M8(yi.SYSTEM_SCHEMA_NAME,yi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,s);return H8(i)}a(G8,"dropAttributeFromSystem")});var YU=N((Nbe,KU)=>{"use strict";var OR=ht(),jl=Ht(),Obe=sn(),NR=M(),GU=re(),{getTransactionAuditStorePath:q8}=Tt(),$8=Kl(),rp=ql(),V8=j();KU.exports=K8;async function K8(e){let t=q8(e.schema,e.table),r=await OR.openEnvironment(t,e.table,!0),n=OR.listDBIs(r);OR.initializeDBIs(r,jl.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s;switch(e.search_type){case NR.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.TIMESTAMP:return qU(r,e.search_values);case NR.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:return s=global.hdb_schema[e.schema][e.table].hash_attribute,W8(r,e.search_values,s);case NR.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME:return Y8(r,e.search_values);default:return qU(r)}}a(K8,"readAuditLog");function qU(e,t=[0,Date.now()]){GU.isEmpty(t[0])&&(t[0]=0),GU.isEmpty(t[1])&&(t[1]=Date.now());let r=e.dbis[jl.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 rp,s))}a(qU,"searchTransactionsByTimestamp");function Y8(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[jl.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].getValues(s))i.push(o);r.set(s,VU(e,i))}return Object.fromEntries(r)}a(Y8,"searchTransactionsByUsername");function W8(e,t,r){let n=new Map;for(let c=0,l=t.length;c<l;c++){let u=t[c],d=$8.equals(e,jl.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,jl.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,u);for(let{value:_}of d){let E=Number(_);n.has(E)?n.get(E).push(u.toString()):n.set(E,[u.toString()])}}let s=Array.from(n.keys()),i=VU(e,s),o=new Map;for(let c=0;c<i.length;c++){let l=i[c],u=l.timestamp,d=n.get(u);$U(l,"records",r,d,o),$U(l,"original_records",r,d,o)}return Object.fromEntries(o)}a(W8,"searchTransactionsByHashValues");function $U(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),d=u[u.length-1];if(d.timestamp===i)d[t]=[c];else{let _=new rp(e.operation,e.user_name,i,void 0);_[t]=[c],u.push(_)}}else{let u=new rp(e.operation,e.user_name,i,void 0);u[t]=[c],s.set(l,[u])}}}a($U,"loopRecords");function VU(e,t){let r=[];try{let n=e.dbis[jl.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 rp,i);r.push(o)}}catch(i){V8.warn(i)}return r}catch(n){throw n}}a(VU,"batchSearchTransactions")});var jU=N((Pbe,WU)=>{"use strict";var{getSchemaPath:wbe}=Tt(),Cbe=ht(),{database:j8}=(Pe(),oe(lt));WU.exports={writeTransaction:z8};async function z8(e,t,r){return j8({database:e,table:t}).transaction(r)}a(z8,"writeTransaction")});var XU=N((Lbe,JU)=>{"use strict";var{getSchemaPath:zU}=Tt(),QU=ht();JU.exports={flush:Q8,resetReadTxn:J8};async function Q8(e,t){return(await QU.openEnvironment(zU(e,t),t.toString())).flushed}a(Q8,"flush");async function J8(e,t){try{(await QU.openEnvironment(zU(e,t),t.toString())).resetReadTxn()}catch{}}a(J8,"resetReadTxn")});var rv=N((Ube,tv)=>{"use strict";var{Readable:X8}=require("stream"),{getDatabases:Z8}=(Pe(),oe(lt)),{readSync:e9,openSync:t9,createReadStream:ZU}=require("fs"),{open:r9}=require("lmdb"),ev=t_(),n9=r_(),{AUDIT_STORE_OPTIONS:s9}=(ji(),oe(nv)),{INTERNAL_DBIS_NAME:i9,AUDIT_STORE_NAME:o9}=Ht();tv.exports=c9;var IR=32768,a9=100;async function c9(e){let t=e.database||e.schema||"data",r=Z8()[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 d=u.dbisDB,_=r9({noSync:!0,maxDbs:n9.MAX_DBS}),E,f=_.openDB(i9,new ev(!1)),h=d.useReadTransaction(),T=0,m=a(async function(S,y){y.encoding="binary",y.encoder=void 0;let I=_.openDB(S,y),U=d.openDB(S,y);for(let{key:H,version:X,value:Y}of U.getRange({start:null,transaction:h,versions:U.useVersions}))E=I.put(H,Y,X),T++%a9===0&&(await new Promise(V=>setTimeout(V,20)),h.openTimer&&(h.openTimer=0))},"copyDatabase");for(let{key:S,value:y}of d.getRange({transaction:h,start:!1}))if(s.some(I=>S.startsWith?.(I+"/"))){f.put(S,y);let[,I]=S.split("/"),U=!I,H=new ev(!U,U);await m(S,H)}e.include_audit&&await m(o9,{...s9}),await E;let g=ZU(_.path);return g.headers=l(),g.on("close",()=>{h.done(),_.close()}),g}let o=r[Object.keys(r)[0]].primaryStore,c=t9(o.path);return o.transaction(()=>{let u=Buffer.alloc(IR);e9(c,u,0,IR),o.resetReadTxn();let d=o.useReadTransaction();d.renew();let _=ZU(null,{fd:c,start:IR}),E=new X8.from(async function*(){yield u;for await(let f of _)d.openTimer&&(d.openTimer=0),yield f;d.done()}());return E.headers=l(),E});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(c9,"getBackup")});var ov=N((Bbe,iv)=>{"use strict";var l9=j(),{handleHDBError:u9}=_e(),d9=yP(),_9=Ih(),f9=QA(),E9=SM(),h9=S_(),p9=nR(),m9=VM(),S9=ZM(),T9=R_(),g9=aU(),A9=SU(),R9=yU(),y9=OU(),b9=CU(),O9=BU(),N9=_R(),I9=FU(),w9=YU(),C9=jU(),sv=XU(),P9=rv(),wR=class extends d9{static{a(this,"LMDBBridge")}async searchByConditions(t){return g9(t)}async getDataByHash(t){return await p9(t)}async searchByHash(t){return await m9(t)}async getDataByValue(t,r){return await S9(t,r)}async searchByValue(t){return await T9(t)}async createSchema(t){return await E9(t)}async dropSchema(t){return await A9(t)}async createTable(t,r){return await R9(t,r)}async dropTable(t){return await N9(t)}async createAttribute(t){return await _9(t)}async createRecords(t){return await f9(t)}async updateRecords(t){return await y9(t)}async upsertRecords(t){try{return await b9(t)}catch(r){throw u9(r,null,null,l9.ERR,r)}}async deleteRecords(t){return await h9(t)}async dropAttribute(t){return await I9(t)}async deleteAuditLogsBefore(t){return await O9(t)}async readAuditLog(t){return await w9(t)}writeTransaction(t,r,n){return C9.writeTransaction(t,r,n)}flush(t,r){return sv.flush(t,r)}resetReadTxn(t,r){return sv.resetReadTxn(t,r)}getBackup(t){return P9(t)}};iv.exports=wR});function Ev(e){PR=e}function U9(){M9=setInterval(function(){for(let e of CR)if(e.stale){let t=e[Fe]?.url;uv.error(`Transaction was open too long and has been aborted, from table: ${e.lmdbDb?.name+(t?" path: "+t:"")}`),e.abort()}else e.stale=!0},L9).unref()}var DR,lv,uv,dv,_v,fv,av,CR,D9,w_,cv,PR,hc,np,L9,M9,sp=Ie(()=>{DR=L(sn()),lv=L(_e()),uv=L(j());Vs();dv=L(se()),_v=L(M()),fv=L(re()),av=100,CR=new Set,D9=(0,fv.convertToMS)(dv.get(_v.CONFIG_PARAMS.STORAGE_MAXTRANSACTIONQUEUETIME))||45e3;a(Ev,"replicationConfirmation");hc=class e{static{a(this,"DatabaseTransaction")}writes=[];lmdbDb;readTxn;readTxnRefCount;readTxnsUsed;validated=0;timestamp=0;overloadChecked;open=1;getReadTxn(){if(this.readTxnRefCount=(this.readTxnRefCount||0)+1,this.stale&&(this.stale=!1),this.readTxn)return this.readTxn.openTimer&&(this.readTxn.openTimer=0),this.readTxn;if(this.open===1)return this.readTxn=this.lmdbDb.useReadTransaction(),this.readTxnsUsed=1,this.readTxn.openTimer&&(this.readTxn.openTimer=0),CR.add(this),this.readTxn}useReadTxn(){return this.getReadTxn(),this.readTxn.use(),this.readTxnsUsed++,this.readTxn}doneReadTxn(){this.readTxn&&(this.readTxn.done(),--this.readTxnsUsed===0&&(CR.delete(this),this.readTxn=null))}disregardReadTxn(){--this.readTxnRefCount===0&&this.readTxnsUsed===1&&this.doneReadTxn()}checkOverloaded(){if(w_&&!this.overloadChecked&&performance.now()-cv>D9)throw new lv.ServerError("Outstanding write transactions have too long of queue, please try again later",503);this.overloadChecked=!0}addWrite(t){if(this.open===0)throw new Error("Can not use a transaction that is no longer open");if(this.open===2){let r=new e;return r.addWrite(t),r.commit({})}else this.writes.push(t)}removeWrite(t){let r=this.writes.indexOf(t);r>-1&&(this.writes[r]=null)}commit(t={}){let r=this.timestamp;r||(r=this.timestamp=t.timestamp||(0,DR.getNextMonotonicTime)()),t.timestamp||(t.timestamp=r);let n=t.retries||0;if(this.validated<this.writes.length)try{let _=this.validated;this.validated=this.writes.length;for(let f=_;f<this.validated;f++)this.writes[f]?.validate?.(this.timestamp);let E;for(let f=_;f<this.validated;f++){let h=this.writes[f];h&&(h.before||h.beforeIntermediate)&&(E=!0)}if(E)return(async()=>{try{for(let f=0;f<2;f++){let h;for(let T=_;T<this.validated;T++){let m=this.writes[T];if(!m)continue;let g=m[f===0?"before":"beforeIntermediate"];if(g){let S=g();h?h.push?h.push(S):h=[h,S]:h=S}}h&&await(h.push?Promise.all(h):h)}}catch(f){throw this.abort(),f}return this.commit(t)})()}catch(_){throw this.abort(),_}n||this.doneReadTxn(),this.open=t?.letItLinger?2:0;let s,i=[],o=0;this.writes=this.writes.filter(_=>_);let c=a(_=>{_.commit(r,_.entry,n)},"doWrite"),l=a(()=>{let _=this.writes[o++];if(_)if(_.key){n>0&&(_.entry=_.store.getEntry(_.key));let E=_.store.ifVersion(_.key,_.entry?.version??null,l);s=s||E}else l();else for(let E of this.writes)c(E)},"nextCondition"),u=this.lmdbDb;if(this.writes.length>0&&(u?.retryRisk&&(u.retryRisk*=.99),this.writes.length+(u?.retryRisk||0)<av>>n?l():s=this.writes[0].store.transaction(()=>{for(let _ of this.writes)_.entry=_.store.getEntry(_.key),c(_);return!0})),s)return w_||(w_=s,cv=performance.now(),w_.then(()=>{w_=null})),s.then(_=>{if(_){if(this.next&&i.push(this.next.commit(t)),t?.flush&&i.push(this.writes[0].store.flushed),this.replicatedConfirmation){let E=this.writes[0].store.rootStore.databaseName,f=this.writes[this.writes.length-1];PR&&f&&i.push(PR(E,f.store.getEntry(f.key).localTime,this.replicatedConfirmation))}return this.writes=[],this.next=null,Promise.all(i).then(()=>({txnTime:r}))}else return u&&(u.retryRisk=(u.retryRisk||0)+av/2),t?t.retries=n+1:t={retries:1},this.commit(t)});let d={txnTime:r};if(this.next){let _=this.next?.commit(t);if(_?.then)return _?.then(E=>({txnTime:r,next:E}));d.next=_}return d}abort(){for(;this.readTxnsUsed>0;)this.doneReadTxn();this.open=0,this.writes=[]}},np=class extends hc{static{a(this,"ImmediateTransaction")}_timestamp;addWrite(t){super.addWrite(t),this.commit()}get timestamp(){return this._timestamp||(this._timestamp=(0,DR.getNextMonotonicTime)())}getReadTxn(){}},L9=3e4;a(U9,"startMonitoringTxns");U9()});function Pt(e,t,r){if(!t)t=e,e={};else if(!e)e={};else if(e?.transaction?.open===1&&typeof t=="function")return t(e.transaction);if(typeof t!="function")throw new Error("Callback function must be provided to transaction");let n=e.transaction=new hc;e.timestamp&&(n.timestamp=e.timestamp),e.replicatedConfirmation&&(n.replicatedConfirmation=e.replicatedConfirmation),n[Fe]=e,e.resourceCache||(e.resourceCache=[]);let s;try{if(s=t(n),s?.then)return s.then(i,o)}catch(c){o(c)}return i(s);function i(c){let l=n.commit({letItLinger:r?.letItLinger});return l.then?l.then(()=>c):c}function o(c){throw n.abort({}),c}}var hv,pc=Ie(()=>{hv=L(fi());Vs();sp();a(Pt,"transaction");(0,hv._assignPackageExport)("transaction",Pt);Pt.commit=function(e){let t=(e[Fe]||e)?.transaction;if(!t)throw new Error("No active transaction is available to commit");return t.commit()};Pt.abort=function(e){let t=(e[Fe]||e)?.transaction;if(!t)throw new Error("No active transaction is available to abort");return t.abort()}});var yv={};je(yv,{ResourceBridge:()=>UR});function vR({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 mv(e,t){let r=bi(e),n=vR(e,r);if(!r)throw new Ks.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;Pt(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++],d;try{d=await r.get({id:u,lazy:s,select:n},i),d=d&&op(d)}catch(_){d={message:_.toString()}}return t?{value:{key:u,value:d}}:{value:d}}else return o(),{done:!0}},return(u){return o(),{value:u,done:!0}},throw(u){return o(),{done:!0}}}}}}function bi(e){let t=e.database||e.schema||B9,r=ut()[t];if(!r)throw(0,Ks.handleHDBError)(new Error,v9.SCHEMA_NOT_FOUND(t),404);return r[e.table]}function Sv(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*Tv(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:d}=o;if(s?.timestamp===u)s.hash_values.push(l),s.records.push(d);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:[d]}}}s&&(yield s)}var gv,ip,Ks,Av,Ys,LR,MR,Rv,v9,B9,H9,x9,pv,UR,bv=Ie(()=>{"use strict";gv=L(ov()),ip=L(Yl()),Ks=L(_e());Pe();Av=L(c_()),Ys=L(M()),LR=L(eo()),MR=L(qs()),Rv=L(re());pc();ap();({HDB_ERROR_MSGS:v9}=Ks.hdb_errors),B9="data",H9=1e4,x9=10,UR=class extends gv.default{static{a(this,"ResourceBridge")}constructor(t){super(t),pv=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,ip.default)(t,"conditions");if(r)throw(0,Ks.handleHDBError)(r,r.message,400,void 0,void 0,!0);let n=bi(t);if(!n)throw new Ks.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:vR(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 Ks.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}]}Et({database:r.database??r.schema,table:r.table,attributes:n,schemaDefined:s,expiration:r.expiration,audit:r.audit})}async createAttribute(t){return await bi(t).addAttributes([{name:t.attribute,indexed:t.indexed??!0}]),`attribute ${t.schema}.${t.table}.${t.attribute} successfully created.`}async dropAttribute(t){let r=bi(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:d,version:_}=r.primaryStore.getEntry(o);return i(o,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){bi(t).dropTable()}createSchema(t){return zl({database:t.schema,table:null}),LR.signalSchemaChange(new MR.SchemaEventMsg(process.pid,Ys.OPERATIONS_ENUM.CREATE_SCHEMA,t.schema))}async dropSchema(t){await BR(t.schema),LR.signalSchemaChange(new MR.SchemaEventMsg(process.pid,Ys.OPERATIONS_ENUM.DROP_SCHEMA,t.schema))}async updateRecords(t){return t.requires_existing=!0,this.upsertRecords(t)}async createRecords(t){return t.requires_no_existing=!0,pv.upsertRecords(t)}async upsertRecords(t){let{schema_table:r,attributes:n}=(0,Av.default)(t),s,i=ut()[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),Pt(o,async c=>{if(!i.schemaDefined){s=[];for(let d of n)i.attributes.find(E=>E.name==d)||s.push(d);s.length>0&&await i.addAttributes(s.map(d=>({name:d,indexed:!0})))}let l=[],u=[];for(let d of t.records){let _=d[i.primaryKey],E=_!=null&&await i.get(_,o);if(t.requires_existing&&!E||t.requires_no_existing&&E){u.push(d[i.primaryKey]);continue}E&&(E=op(E));for(let f in d)if(Object.prototype.hasOwnProperty.call(d,f)){let h=d[f];if(typeof h=="function")try{let T=h([[E]]);Array.isArray(T)&&(h=T[0].func_val,d[f]=h)}catch(T){throw T.message+="Trying to set key "+f+" on object"+JSON.stringify(d),T}}if(E)for(let f in E)Object.prototype.hasOwnProperty.call(d,f)||(d[f]=E[f]);await(_==null?i.create(d,o):i.put(d,o)),l.push(d[i.primaryKey])}return{txn_time:c.timestamp,written_hashes:l,new_attributes:s,skipped_hashes:u}})}async deleteRecords(t){let r=ut()[t.schema][t.table],n={user:t.hdb_user};return t.replicateTo&&(n.replicateTo=t.replicateTo),t.replicatedConfirmation&&(n.replicatedConfirmation=t.replicatedConfirmation),Pt(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 Sv(o,c,s.timestamp)})}async deleteRecordsBefore(t){let r=ut()[t.schema][t.table];if(!r.createdTimeProperty)throw new Ks.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:Ys.VALUE_SEARCH_COMPARATORS.LESS}]}),s=!1,i=[],o=[],c=0,l=[],u=a(async()=>{let d=await this.deleteRecords({schema:t.schema,table:t.table,hash_values:l});i.push(...d.deleted_hashes),o.push(...d.skipped_hashes),await(0,Rv.async_set_timeout)(x9),l=[],s=!0},"chunkDelete");for await(let d of n)l.push(d[r.primaryKey]),c++,c%H9===0&&await u();return l.length>0&&await u(),s?Sv(i,o,void 0):{message:"No records found to delete"}}searchByHash(t){t.select!==void 0&&(t.get_attributes=t.select);let r=(0,ip.default)(t,"hashes");if(r)throw r;return mv(t)}async getDataByHash(t){let r=new Map;t._returnKeyValue=!0;for await(let{key:n,value:s}of mv(t,!0))r.set(n,s);return r}searchByValue(t,r){if(r&&Ys.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[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,ip.default)(t,"value");if(n)throw n;let s=bi(t);if(!s)throw new Ks.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===Ys.VALUE_SEARCH_COMPARATORS.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:vR(t,s)},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async getDataByValue(t,r){let n=new Map,s=bi(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){bi({schema:t,table:r})?.primaryStore.resetReadTxn()}async deleteAuditLogsBefore(t){return bi(t).deleteHistory(t.timestamp,t.cleanup_deleted_records)}async readAuditLog(t){let r=bi(t),n={};switch(t.search_type){case Ys.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.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 Ys.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME:let s=t.search_values;for await(let i of Tv(r))s.includes(i.user_name)&&(n[i.user_name]||(n[i.user_name]=[])).push(i);return n;default:return Tv(r,t.search_values?.[0],t.search_values?.[1],t.limit)}}};a(vR,"getSelect");a(mv,"getRecords");a(bi,"getTable");a(Sv,"createDeleteResponse");a(Tv,"groupRecordsInHistory")});var Un=N((Jbe,Ov)=>{"use strict";var{ResourceBridge:k9}=(bv(),oe(yv)),F9=se();F9.initSync();var cp;function G9(){return cp||(cp=new k9,cp)}a(G9,"getBridge");Ov.exports=G9()});var Cv=N((Zbe,wv)=>{"use strict";var Nv=require("lodash"),C_=require("mathjs"),q9=require("jsonata"),Iv=re();wv.exports={distinct_array:a(e=>Array.isArray(e)&&e.length>1?Nv.uniqWith(e,Nv.isEqual):e,"distinct_array"),searchJSON:$9,mad:P_.bind(null,C_.mad),mean:P_.bind(null,C_.mean),mode:P_.bind(null,C_.mode),prod:P_.bind(null,C_.prod),median:P_.bind(null,C_.median)};function P_(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(P_,"aggregateFunction");function $9(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(Iv.isEmpty(this.__ala__.res)&&(this.__ala__.res={}),Iv.isEmpty(this.__ala__.res[r])){let n=q9(e);this.__ala__.res[r]=n}return this.__ala__.res[r].evaluate(t)}a($9,"searchJSON")});var Dv=N((tOe,Pv)=>{"use strict";var nr=require("moment"),HR="YYYY-MM-DDTHH:mm:ss.SSSZZ";nr.suppressDeprecationWarnings=!0;Pv.exports={current_date:a(()=>nr().utc().format("YYYY-MM-DD"),"current_date"),current_time:a(()=>nr().utc().format("HH:mm:ss.SSS"),"current_time"),extract:a((e,t)=>{switch(t.toLowerCase()){case"year":return nr(e).utc().format("YYYY");case"month":return nr(e).utc().format("MM");case"day":return nr(e).utc().format("DD");case"hour":return nr(e).utc().format("HH");case"minute":return nr(e).utc().format("mm");case"second":return nr(e).utc().format("ss");case"millisecond":return nr(e).utc().format("SSS");default:break}},"extract"),date:a(e=>nr(e).utc().format(HR),"date"),date_format:a((e,t)=>nr(e).utc().format(t),"date_format"),date_add:a((e,t,r)=>nr(e).utc().add(t,r).valueOf(),"date_add"),date_sub:a((e,t,r)=>nr(e).utc().subtract(t,r).valueOf(),"date_sub"),date_diff:a((e,t,r)=>{let n=nr(e).utc(),s=nr(t).utc();return r?n.diff(s,r,!0):n.diff(s)},"date_diff"),now:a(()=>nr().utc().valueOf(),"now"),get_server_time:a(()=>nr().format(HR),"get_server_time"),offset_utc:a((e,t)=>nr(e).utc().utcOffset(t).format(HR),"offset_utc")}});var vv=N((nOe,Uv)=>{"use strict";var V9=require("@turf/area"),K9=require("@turf/length"),Y9=require("@turf/circle"),W9=require("@turf/difference"),j9=require("@turf/distance"),z9=require("@turf/boolean-contains"),Q9=require("@turf/boolean-equal"),J9=require("@turf/boolean-disjoint"),X9=require("@turf/helpers"),Lv=M(),$e=re(),no=j();Uv.exports={geoArea:Z9,geoLength:e7,geoCircle:t7,geoDifference:r7,geoDistance:Mv,geoNear:n7,geoContains:s7,geoEqual:i7,geoCrosses:o7,geoConvert:a7};function Z9(e){if($e.isEmpty(e))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e));try{return V9.default(e)}catch(t){return no.trace(t,e),NaN}}a(Z9,"geoArea");function e7(e,t){if($e.isEmpty(e))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e));try{return K9.default(e,{units:t||"kilometers"})}catch(r){return no.trace(r,e),NaN}}a(e7,"geoLength");function t7(e,t,r){if($e.isEmpty(e))return NaN;if($e.isEmpty(t))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e));try{return Y9.default(e,t,{units:r||"kilometers"})}catch(n){return no.trace(n,e,t),NaN}}a(t7,"geoCircle");function r7(e,t){if($e.isEmpty(e))return NaN;if($e.isEmpty(t))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t));try{return W9(e,t)}catch(r){return no.trace(r,e,t),NaN}}a(r7,"geoDifference");function Mv(e,t,r){if($e.isEmpty(e))return NaN;if($e.isEmpty(t))return NaN;typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t));try{return j9.default(e,t,{units:r||"kilometers"})}catch(n){return no.trace(n,e,t),NaN}}a(Mv,"geoDistance");function n7(e,t,r,n){if($e.isEmpty(e)||$e.isEmpty(t))return!1;if($e.isEmpty(r))throw new Error("distance is required");if(typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t)),isNaN(r))throw new Error("distance must be a number");try{return Mv(e,t,n)<=r}catch(s){return no.trace(s,e,t),!1}}a(n7,"geoNear");function s7(e,t){if($e.isEmpty(e)||$e.isEmpty(t)||e.coordinates&&e.coordinates.includes?.(null)||t.coordinates&&t.coordinates.includes?.(null))return!1;typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t));try{return z9.default(e,t)}catch(r){return no.trace(r,e,t),!1}}a(s7,"geoContains");function i7(e,t){if($e.isEmpty(e)||$e.isEmpty(t)||e.coordinates&&e.coordinates.includes?.(null)||t.coordinates&&t.coordinates.includes?.(null))return!1;typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t));try{return Q9.default(e,t)}catch(r){return no.trace(r,e,t),!1}}a(i7,"geoEqual");function o7(e,t){if($e.isEmpty(e)||$e.isEmpty(t)||e.coordinates&&e.coordinates.includes?.(null)||t.coordinates&&t.coordinates.includes?.(null))return!1;typeof e=="string"&&(e=$e.autoCastJSON(e)),typeof t=="string"&&(t=$e.autoCastJSON(t));try{return!J9.default(e,t)}catch(r){return no.trace(r,e,t),!1}}a(o7,"geoCrosses");function a7(e,t,r){if($e.isEmptyOrZeroLength(e))throw new Error("coordinates is required");if($e.isEmpty(t))throw new Error("geo_type is required");if($e.isEmpty(Lv.GEO_CONVERSION_ENUM[t]))throw new Error(`geo_type of ${t} is invalid please use one of the following types: ${Object.keys(Lv.GEO_CONVERSION_ENUM).join(",")}`);return typeof e=="string"&&(e=$e.autoCastJSON(e)),X9[t](e,r)}a(a7,"geoConvert")});var lp=N((iOe,Bv)=>{var mc=Cv(),Gn=Dv(),Oi=vv();Bv.exports=e=>{e.aggr.mad=e.aggr.MAD=mc.mad,e.aggr.mean=e.aggr.MEAN=mc.mean,e.aggr.mode=e.aggr.MODE=mc.mode,e.aggr.prod=e.aggr.PROD=mc.prod,e.aggr.median=e.aggr.MEDIAN=mc.median,e.fn.distinct_array=e.fn.DISTINCT_ARRAY=mc.distinct_array,e.fn.search_json=e.fn.SEARCH_JSON=mc.searchJSON,e.fn.__ala__=e,e.fn.current_date=e.fn.CURRENT_DATE=Gn.current_date,e.fn.current_time=e.fn.CURRENT_TIME=Gn.current_time,e.fn.extract=e.fn.EXTRACT=Gn.extract,e.fn.date=e.fn.DATE=Gn.date,e.fn.date_format=e.fn.DATE_FORMAT=Gn.date_format,e.fn.date_add=e.fn.DATE_ADD=Gn.date_add,e.fn.date_sub=e.fn.DATE_SUB=Gn.date_sub,e.fn.date_diff=e.fn.DATE_DIFF=e.fn.datediff=e.fn.DATEDIFF=Gn.date_diff,e.fn.now=e.fn.NOW=Gn.now,e.fn.offset_utc=e.fn.OFFSET_UTC=Gn.offset_utc,e.fn.get_server_time=e.fn.GET_SERVER_TIME=Gn.get_server_time,e.fn.getdate=e.fn.GETDATE=Gn.now,e.fn.current_timestamp=e.fn.CURRENT_TIMESTAMP=Gn.now,e.fn.geoarea=e.fn.GEOAREA=e.fn.geoArea=Oi.geoArea,e.fn.geocircle=e.fn.GEOCIRCLE=e.fn.geoCircle=Oi.geoCircle,e.fn.geocontains=e.fn.GEOCONTAINS=e.fn.geoContains=Oi.geoContains,e.fn.geoconvert=e.fn.GEOCONVERT=e.fn.geoConvert=Oi.geoConvert,e.fn.geocrosses=e.fn.GEOCROSSES=e.fn.geoCrosses=Oi.geoCrosses,e.fn.geodifference=e.fn.GEODIFFERENCE=e.fn.geoDifference=Oi.geoDifference,e.fn.geodistance=e.fn.GEODISTANCE=e.fn.geoDistance=Oi.geoDistance,e.fn.geoequal=e.fn.GEOEQUAL=e.fn.geoEqual=Oi.geoEqual,e.fn.geolength=e.fn.GEOLENGTH=e.fn.geoLength=Oi.geoLength,e.fn.geonear=e.fn.GEONEAR=e.fn.geoNear=Oi.geoNear}});var Fv=N((oOe,kv)=>{"use strict";var D_=require("lodash"),_n=require("alasql");_n.options.cache=!1;var c7=lp(),Hv=require("clone"),up=require("recursive-iterator"),Ue=j(),et=re(),Ql=Un(),l7=M(),{hdb_errors:u7}=_e(),{getDatabases:xv}=(Pe(),oe(lt)),d7="IS NULL",Ws="There was a problem performing this search. Please check the logs and try again.";c7(_n);var xR=class{static{a(this,"SQLSearch")}constructor(t,r){if(et.isEmpty(t))throw Ue.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(),et.backtickASTSchemaItems(this.statement)}async search(){let t;try{let n=await this._checkEmptySQL();if(!et.isEmptyOrZeroLength(n))return Ue.trace("No results returned from checkEmptySQL SQLSearch method."),n}catch(n){throw Ue.error("Error thrown from checkEmptySQL in SQLSearch class method search."),Ue.error(n),new Error(Ws)}try{let n=await this._getFetchAttributeValues();if(n)return n}catch(n){throw Ue.error("Error thrown from getFetchAttributeValues in SQLSearch class method search."),Ue.error(n),new Error(Ws)}if(Object.keys(this.data).length===0)return Ue.trace('SQLSearch class field: "data" is empty.'),[];let r;try{r=await this._processJoins()}catch(n){throw Ue.error("Error thrown from processJoins in SQLSearch class method search."),Ue.error(n),new Error(Ws)}try{await this._getFinalAttributeData(r.existing_attributes,r.joined_length)}catch(n){throw Ue.error("Error thrown from getFinalAttributeData in SQLSearch class method search."),Ue.error(n),new Error(Ws)}try{return t=await this._finalSQL(),t}catch(n){throw Ue.error("Error thrown from finalSQL in SQLSearch class method search."),Ue.error(n),new Error(Ws)}}_getColumns(){let t=new up(this.statement);for(let{node:r,path:n}of t)r&&r.columnid&&(this.columns[n[0]]||(this.columns[n[0]]=[]),this.columns[n[0]].push(Hv(r)))}_getTables(){let t=[];this.all_table_attributes.forEach(r=>{t.push(r.table)}),this.tables=D_.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=xv()[r.databaseid][r.tableid].primaryKey,this.data[n].__merged_data={},this.data[n].__merged_attributes=[],this.data[n].__merged_attr_map={}})}_conditionsToFetchAttributeValues(){if(et.isEmpty(this.statement.where)){Ue.trace('AST "where" statement is empty.');return}let t=!1;for(let{node:r}of new up(this.statement.where))if(r&&r.op&&r.op==="OR"&&(t=!0),!et.isEmpty(r)&&r.right)if(et.isNotEmptyAndHasValue(r.right.value)){let n=et.autoCast(r.right.value);[!0,!1].indexOf(n)>=0&&(r.right=new _n.yy.LogicValue({value:n}))}else Array.isArray(r.right)&&r.right.forEach((n,s)=>{let i=et.autoCast(n.value);[!0,!1].indexOf(i)>=0?r.right[s]=new _n.yy.LogicValue({value:i}):n instanceof _n.yy.StringValue&&et.autoCasterIsNumberCheck(i.toString())&&(r.right[s]=new _n.yy.NumValue({value:i}))});if(t){Ue.trace('Where clause contains "OR", exact match search not performed on attributes.');return}for(let{node:r}of new up(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(!et.isEmpty(l7.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[r.op])){if(et.isEmpty(this.comparator_search_values[o])&&(this.comparator_search_values[o]={ignore:!1,comparators:[]}),!this.comparator_search_values[o].ignore){if(et.isEmptyOrZeroLength(r.left.columnid)||et.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(et.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"=":!et.isEmpty(r.right.value)||!et.isEmpty(r.left.value)?n.add(et.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(et.isEmptyOrZeroLength(this.all_table_attributes)&&et.isEmptyOrZeroLength(this.statement.from)&&et.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&&D_.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(et.isEmptyOrZeroLength(r)){let n=this.columns.columns.filter(s=>s.as?t.columnid===s.as:!1);et.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(et.isEmptyOrZeroLength(this.all_table_attributes)&&!et.isEmptyOrZeroLength(this.columns.columns))return t;if(et.isEmptyOrZeroLength(this.all_table_attributes)&&et.isEmptyOrZeroLength(this.statement.from))try{let r=this._buildSQL(!1);t=await _n.promise(r)}catch(r){throw Ue.error("Error thrown from AlaSQL in SQLSearch class method checkEmptySQL."),Ue.error(r),new Error("There was a problem with the SQL statement")}return t}_addFetchColumns(t){t&&t.length>0&&t.forEach(r=>{let n=this._findColumn(r);n&&this.fetch_attributes.push(Hv(n))})}_addColumnToMergedAttributes(t,r){this.data[t].__merged_attributes.push(r),this.data[t].__merged_attr_map[r]=this.data[t].__merged_attributes.length-1}_setMergedHashAttribute(t,r){this.data[t].__merged_data[r].splice(0,1,r)}_updateMergedAttribute(t,r,n,s){let i=this.data[t].__merged_attr_map[n];this.data[t].__merged_data[r].splice(i,1,s)}async _getFetchAttributeValues(){if(et.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(d7)>-1&&this.tables.forEach(s=>{let i={columnid:xv()[s.databaseid][s.tableid].primaryKey,tableid:s.tableid};this._addFetchColumns([i])}),this.statement.order&&(this._updateOrderByToAliases(),this._addNonAggregatorsToFetchColumns()),this.fetch_attributes=D_.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),!et.isEmpty(this.exact_search_values[u])&&!this.exact_search_values[u].ignore&&!et.isEmptyOrZeroLength(this.exact_search_values[u].values))if(l)try{c.hash_values=Array.from(this.exact_search_values[u].values);let d=await Ql.getDataByHash(c);for(let _ of c.hash_values)d.get(_)&&!this.data[i].__merged_data[_]&&(this.data[i].__merged_data[_]=[...n[i]],this._setMergedHashAttribute(i,_))}catch(d){throw Ue.error("Error thrown from getDataByHash function in SQLSearch class method getFetchAttributeValues exact match."),Ue.error(d),new Error(Ws)}else try{c.search_attribute=s.attribute,await Promise.all(Array.from(this.exact_search_values[u].values).map(async d=>{let _={...c};_.search_value=d;let E=await Ql.getDataByValue(_);for(let[f,h]of E)this.data[i].__merged_data[f]?this._updateMergedAttribute(i,f,s.attribute,h[s.attribute]):(this.data[i].__merged_data[f]=[...n[i]],this._updateMergedAttribute(i,f,s.attribute,h[s.attribute]),this._setMergedHashAttribute(i,f))}))}catch(d){throw Ue.error("Error thrown from getDataByValue function in SQLSearch class method getFetchAttributeValues exact match."),Ue.error(d),new Error(Ws)}else if(!et.isEmpty(this.comparator_search_values[u])&&!this.comparator_search_values[u].ignore&&!et.isEmptyOrZeroLength(this.comparator_search_values[u].comparators))try{let d=this.comparator_search_values[u].comparators;for(let _=0,E=d.length;_<E;_++){let f=d[_];c.search_attribute=f.attribute,c.search_value=f.search_value;let h=await Ql.getDataByValue(c,f.operation);if(l)for(let[T]of h)this.data[i].__merged_data[T]||(this.data[i].__merged_data[T]=[...n[i]],this._setMergedHashAttribute(i,T));else for(let[T,m]of h)this.data[i].__merged_data[T]?this._updateMergedAttribute(i,T,s.attribute,m[s.attribute]):(this.data[i].__merged_data[T]=[...n[i]],this._updateMergedAttribute(i,T,s.attribute,m[s.attribute]),this._setMergedHashAttribute(i,T))}}catch(d){throw Ue.error("Error thrown from getDataByValue function in SQLSearch class method getFetchAttributeValues comparator search values."),Ue.error(d),new Error(Ws)}else try{c.search_attribute=s.attribute,c.search_value="*";let d=await Ql.getDataByValue(c);if(l)for(let[_]of d)this.data[i].__merged_data[_]||(this.data[i].__merged_data[_]=[...n[i]],this._setMergedHashAttribute(i,_));else for(let[_,E]of d)this.data[i].__merged_data[_]?this._updateMergedAttribute(i,_,s.attribute,E[s.attribute]):(this.data[i].__merged_data[_]=[...n[i]],this._updateMergedAttribute(i,_,s.attribute,E[s.attribute]),this._setMergedHashAttribute(i,_))}catch(d){throw Ue.error("Error thrown from getDataByValue function in SQLSearch class method getFetchAttributeValues no comparator search values."),Ue.error(d),new Error(Ws)}}}_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 _n.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 _n.yy.Column;s.columnid=n.as,s.columnid_orig=n.as_orig,t.expression=s}else{t.initial_select_column=Object.assign(new _n.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 _n.yy.FuncValue:new _n.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(f=>{f.joinmode&&f.joinmode!=="INNER"&&(this.has_outer_join=!0),s.push(f.table);let h=f.joinmode+" JOIN ? AS "+(f.as?f.as:f.table.tableid);f.on&&(h+=" ON "+f.on.toString()),i.push(h),t.push(Object.values(this.data[`${f.table.databaseid_orig}_${f.table.as?f.table.as_orig:f.table.tableid_orig}`].__merged_data))});let o=[],c={};s.forEach(f=>{let h=this.data[`${f.databaseid_orig}_${f.as?f.as_orig:f.tableid_orig}`].__hash_name,T=f.as?f.as_orig:f.tableid_orig;o.push({key:`'${T}.${h}'`,schema:f.databaseid_orig,table:f.as?f.as_orig:f.tableid_orig,keys:new Set}),r.push(`${f.as?f.as:f.tableid}.\`${h}\` AS "${T}.${h}"`),c[f.as?f.as_orig:f.tableid_orig]=this.data[`${f.databaseid_orig}_${f.as?f.as_orig:f.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(f=>{f.is_func?r.push(f.initial_select_column.toString()):f.initial_select_column.tableid?r.push(`${f.initial_select_column.tableid}.${f.initial_select_column.columnid} AS ${f.expression.columnid}`):r.push(`${f.initial_select_column.columnid} AS ${f.expression.columnid}`)}));let d="",_="";!this.has_aggregator&&!this.statement.group&&!this.has_ordinal&&!this.statement.joins&&(d=this.statement.limit?"LIMIT "+this.statement.limit:"",_=this.statement.offset?"OFFSET "+this.statement.offset:"");let E=[];try{let f=`SELECT ${r.join(", ")} FROM ${i.join(" ")} ${l} ${u} ${d} ${_}`,h=this._convertColumnsToIndexes(f,s);E=await _n.promise(h,t),t=null}catch(f){throw Ue.error("Error thrown from AlaSQL in SQLSearch class method processJoins."),Ue.error(f),new Error("There was a problem processing the data.")}if(E&&E.length>0){for(let f=0,h=E.length;f<h;f++){let T=E[f];o.forEach(m=>{T[m.key]!==null&&T[m.key]!==void 0&&m.keys.add(T[m.key])})}o.forEach(f=>{let h=Object.keys(this.data[`${f.schema}_${f.table}`].__merged_data),T=D_.difference(h,[...f.keys].map(m=>m.toString()));for(let m=0,g=T.length;m<g;m++){let S=T[m];delete this.data[`${f.schema}_${f.table}`].__merged_data[S]}})}return{existing_attributes:c,joined_length:E?E.length:0}}async _getFinalAttributeData(t,r){if(r===0)return;let n=[],s=new up(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=D_.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 Ue.error("Error thrown from getData in SQLSearch class method getFinalAttributeData."),Ue.error(i),new Error(Ws)}}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 d in i)o.push(i[d][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 Ql.getDataByHash(c),u=s.columns.length;for(let d=0,_=o.length;d<_;d++){let E=o[d],f=l.get(E);for(let h=0;h<u;h++){let T=s.columns[h],m=f[T]===void 0?null:f[T];this.data[n].__merged_data[E].push(m)}}}}catch(r){throw Ue.error("Error thrown from getDataByHash function in SQLSearch class method getData."),Ue.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();Ue.trace(`Final SQL: ${s}`),n=await _n.promise(s,t),this.has_outer_join&&(n=this._translateUndefinedValues(n)),Ue.trace(`Final AlaSQL results data included ${n.length} rows`)}catch(s){throw Ue.error("Error thrown from AlaSQL in SQLSearch class method finalSQL."),Ue.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 Ue.error(u7.HDB_ERROR_MSGS.OUTER_JOIN_TRANSLATION_ERROR),Ue.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"),d=`${l}.[${c}]`;n=n.replace(u,d)});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 Ql.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 Ue.error("There was an error when processing this SQL operation. Check your logs"),Ue.error(o),new Error(Ws)}}return Object.values(Object.values(this.data)[0].__merged_data)}};kv.exports=xR});var $r=N((cOe,Gv)=>{"use strict";var _7=AP();Gv.exports={searchByConditions:E7,searchByHash:h7,searchByValue:p7,search:m7};var kR=Un(),{transformReq:FR}=re(),f7=Fv();async function E7(e){return FR(e),kR.searchByConditions(e)}a(E7,"searchByConditions");async function h7(e){FR(e),e.ids&&(e.hash_values=e.ids);let t=[];for await(let r of kR.searchByHash(e))r&&t.push(r);return t}a(h7,"searchByHash");async function p7(e){FR(e),e.hasOwnProperty("desc")===!0&&(e.reverse=e.desc);let t=[];for await(let r of kR.searchByValue(e))t.push(r);return t}a(p7,"searchByValue");function m7(e,t){try{let r=new _7(e);r.validate(),new f7(r.statement,r.attributes).search().then(s=>{t(null,s)}).catch(s=>{t(s,null)})}catch(r){return t(r)}}a(m7,"search")});var dp=N((uOe,qv)=>{"use strict";var S7=Un();qv.exports={writeTransaction:T7};function T7(e,t,r){return S7.writeTransaction(e,t,r)}a(T7,"writeTransaction")});var Yv=N((fOe,Kv)=>{"use strict";var g7=$r(),A7=Fs(),$v=j(),R7=cn(),_Oe=dp(),y7=require("clone"),qR=require("alasql"),b7=lp(),Vv=require("util"),O7=Vv.promisify(A7.getTableSchema),N7=Vv.promisify(g7.search),I7=M(),GR=re();b7(qR);Kv.exports={update:C7};var w7="There was a problem performing this update. Please check the logs and try again.";async function C7({statement:e,hdb_user:t}){let r=await O7(e.table.databaseid,e.table.tableid),n=P7(e.columns);GR.backtickASTSchemaItems(e);let{table:s,where:i}=e,o=y7(s),c=GR.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=qR.parse(l).statements[0],d=await N7(u),_=D7(n,d);return L7(o,_,t)}a(C7,"update");function P7(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=qR.compile(`SELECT ${r.expression.toString()} AS [${I7.FUNC_VAL}] FROM ?`)}),t}catch(t){throw $v.error(t),new Error(w7)}}a(P7,"createUpdateRecord");function D7(e,t){return GR.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}a(D7,"buildUpdateRecords");async function L7(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await R7.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){$v.error(`Error delete new_attributes from update response: ${i}`)}return s}a(L7,"updateRecords")});var jv=N((mOe,Wv)=>{var M7=require("alasql"),U7=$r(),v7=j(),B7=Un(),VR=require("util"),$R=re(),H7=M(),x7=Fs(),hOe=dp(),pOe=cn(),k7="record",F7="successfully deleted",G7=VR.callbackify(K7),q7=VR.promisify(U7.search),$7=VR.promisify(x7.getTableSchema);Wv.exports={convertDelete:G7};function V7(e){return`${e.deleted_hashes.length} ${k7}${e.deleted_hashes.length===1?"":"s"} ${F7}`}a(V7,"generateReturnMessage");async function K7({statement:e,hdb_user:t}){let r=await $7(e.table.databaseid,e.table.tableid);$R.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=$R.isEmpty(s)?"":` WHERE ${s.toString()}`,o=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=M7.parse(o).statements[0],l={operation:H7.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await q7(c);let u=await B7.deleteRecords(l);return $R.isEmptyOrZeroLength(u.message)&&(u.message=V7(u)),delete u.txn_time,u}catch(u){throw v7.error(u),u.hdb_code?u.message:u}}a(K7,"convertDelete")});var Zv=N((TOe,Xv)=>{"use strict";var Y7=Zi(),{hdb_errors:zv}=_e(),{getDatabases:Qv}=(Pe(),oe(lt));Xv.exports={checkSchemaExists:Jv,checkSchemaTableExists:W7,schema_describe:Y7};async function Jv(e){if(!Qv()[e])return zv.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(Jv,"checkSchemaExists");async function W7(e,t){let r=await Jv(e);if(r)return r;if(!Qv()[e][t])return zv.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(W7,"checkSchemaTableExists")});var Sc=N(fp=>{var _p=j();for(let e of["trace","debug","info","warn","error","fatal","notify"])_p.logsAtLevel(e)&&(fp[e]=_p[e]);fp.loggerWithTag=e=>_p.loggerWithTag(e,!0);fp.setLogLevel=_p.setLogLevel});function KR(e){let t=e.get(Ep),r=t?(0,Jl.unpack)(t):null;r||(r={remoteNameToId:{}});let n=ot(),s=!1;r.nodeName=ot();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:M_(e)??1,nodes:[]})})}i[n]=0,e.putSync(Ep,(0,Jl.pack)(r))}return r}function L_(e){return KR(e).remoteNameToId}function t0(e,t,r){let n=KR(r),s=n.remoteNameToId,i=new Map,o=!1;for(let c in t){let l=t[c],u=s[c];if(u==null){let d=0;for(let _ in s){let E=s[_];E>d&&(d=E)}u=d+1,s[c]=u,o=!0}i.set(l,u)}return o&&r.putSync(Ep,(0,Jl.pack)(n)),i}function hp(e,t){let r=KR(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(Ep,(0,Jl.pack)(r))}return e0.info?.("The remote node name map",e,n,s),s}var e0,Jl,Ep,YR=Ie(()=>{e0=L(Sc());us();Jl=require("msgpackr"),Ep=Symbol.for("remote-ids");a(KR,"getIdMappingRecord");a(L_,"exportIdMapping");a(t0,"remoteToLocalNodeId");a(hp,"getIdOfRemoteNode")});var Xo,WR=Ie(()=>{Xo=class{constructor(t){this.error=t}static{a(this,"ErrorResource")}isError=!0;allowRead(){throw this.error}allowUpdate(){throw this.error}allowCreate(){throw this.error}allowDelete(){throw this.error}getId(){throw this.error}getContext(){throw this.error}get(){throw this.error}post(){throw this.error}put(){throw this.error}delete(){throw this.error}connect(){throw this.error}getResource(){return this}publish(){throw this.error}subscribe(){throw this.error}}});var s0={};je(s0,{Resources:()=>pp,keyArrayToString:()=>Xl,resetResources:()=>j7,resources:()=>Ni});function j7(){return Ni=new pp}function Xl(e){return Array.isArray(e)?e[e.length-1]===null?e.slice(0,-1).join("/")+"/":e.join("/"):e}var r0,n0,pp,Ni,Zl=Ie(()=>{pc();WR();r0=L(j()),n0=L(_e()),pp=class extends Map{static{a(this,"Resources")}isWorker=!0;loginPath;set(t,r,n,s){if(!r)throw new Error("Must provide a resource");t.startsWith("/")&&(t=t.replace(/^\/+/,""));let i={Resource:r,path:t,exportTypes:n,hasSubPaths:!1,relativeURL:""},o=super.get(t);if(o&&(o.Resource.databaseName!==r.databaseName||o.Resource.tableName!==r.tableName)&&!s){let c=new n0.ServerError(`Conflicting paths for ${t}`);r0.default.error(c),i.Resource=new Xo(c)}super.set(t,i);for(let[c,l]of this){let u=2;for(;(u=c.indexOf("/",u))>-1;){let d=this.get(c.slice(0,u));d&&(d.hasSubPaths=!0),u+=2}}}getMatch(t,r){let n=2,s;for(;(n=t.indexOf("/",n))>-1;){let c=t.slice(0,n),l=this.get(c);if(!l&&c.indexOf(".")>-1){let u=c.split(".");l=this.get(u[0])}if(l&&(!r||l.exportTypes?.[r]!==!1)){if(l.relativeURL=t.slice(n),!l.hasSubPaths)return l;s=l}n+=2}if(s)return s;let i=t.indexOf("?"),o=i>-1?t.slice(0,i):t;return s=this.get(o),!s&&o.indexOf(".")>-1&&(s=this.get(o.split(".")[0])),s&&(!r||s.exportTypes?.[r]!==!1)?s.relativeURL=i>-1?t.slice(i):"":s||(s=this.get(""),s&&(!r||s.exportTypes?.[r]!==!1)&&(t[0]!=="/"&&(t="/"+t),s.relativeURL=t)),s}getResource(t,r){let n=this.getMatch(t);if(n)return t=n.relativeURL,n.Resource.getResource(this.pathToId(t,n.Resource),r)}call(t,r,n){return Pt(r,async()=>{let s=this.getMatch(t);if(s)return t=s.relativeURL,n(s.Resource,s.path,t)})}setRepresentation(t,r,n){}};a(j7,"resetResources");a(Xl,"keyArrayToString")});function QR(e,t,r,n,s){let i=e.primaryStore.env.path,o=e.primaryStore.tableId,c;s?.crossThreads===!1?(c=o0,z7(e.primaryStore,e.auditStore)):(c=i0,e.primaryStore.env.hasSubscriptionCommitListener||(e.primaryStore.env.hasSubscriptionCommitListener=!0,e.primaryStore.on("committed",()=>{a0(i0[i])})));let l=c[i]||(c[i]=[]);if(l.auditStore=e.auditStore,l.lastTxnTime==null&&(l.lastTxnTime=Date.now()),s?.scope==="full-database")return;let u=l[o];u||(u=l[o]=new Map,u.envs=l,u.tableId=o,u.store=e.primaryStore),t=Xl(t);let d=new zR(r);d.startTime=n;let _=u.get(t);return _?_.push(d):(u.set(t,_=[d]),_.tables=u,_.key=t),d.subscriptions=_,d}function a0(e){if(!e)return;let t=e.auditStore;t.resetReadTxn(),c0(e.auditStore);let r;for(let{key:n,value:s}of t.getRange({start:e.lastTxnTime,exclusiveStart:!0})){e.lastTxnTime=n;let i=xt(s),o=e[i.tableId];if(!o)continue;let c=i.recordId,l=Xl(c),u=0;do{let d=o.get(l);if(d){for(let E of d)if(!(u>0&&!(E.includeDescendants&&!(E.onlyChildren&&u>1)))){if(E.startTime>=n){(0,jR.info)("omitting",c,E.startTime,n);continue}try{let f;E.supportsTransactions&&E.txnInProgress!==i.version&&(f=!0,E.txnInProgress||(r?r.push(E):r=[E]),E.txnInProgress=i.version),E.listener(c,i,n,f)}catch(f){console.error(f),(0,jR.info)(f)}}}if(l==null)break;let _=l.lastIndexOf?.("/",l.length-2);_!==l.length-1&&u++,_>-1?l=l.slice(0,_+1):l=null}while(!0)}if(r)for(let n of r)n.txnInProgress=null,n.listener(null,{type:"end_txn"},e.lastTxnTime,!0)}function z7(e,t){let r=t||e,n=r.env;if(!n.hasAfterCommitListener){n.hasAfterCommitListener=!0;let s=n.path;r.on("aftercommit",({next:i,last:o,txnId:c})=>{let l=o0[s];if(!l)return;let u=a(()=>{r.threadLocalWrites||(r.threadLocalWrites=new Float64Array(r.getUserSharedBuffer("last-thread-local-write",new ArrayBuffer(8)))),l.txnTime=r.threadLocalWrites[0]||Date.now();try{a0(l)}finally{r.threadLocalWrites[0]=l.lastTxnTime,r.unlock("thread-local-writes")}},"acquiredLock");r.attemptLock("thread-local-writes",u)&&u()})}}function c0(e){e.nextTransaction?.resolve();let t;e.nextTransaction=new Promise(r=>{t=r}),e.nextTransaction.resolve=t}function l0(e){return e.nextTransaction||(QR({primaryStore:e,auditStore:e},null,null,0,{scope:"full-database"}),c0(e)),e.nextTransaction}var jR,i0,o0,zR,JR=Ie(()=>{jR=L(j());Cl();Zl();ji();i0=Object.create(null),o0=Object.create(null);a(QR,"addSubscription");zR=class extends Dn{static{a(this,"Subscription")}listener;subscriptions;startTime;constructor(t){super(),this.listener=t,this.on("close",()=>this.end())}end(){if(this.subscriptions){if(this.subscriptions.splice(this.subscriptions.indexOf(this),1),this.subscriptions.length===0){let t=this.subscriptions.tables;if(t){let r=this.subscriptions.key;if(t.delete(r),t.size===0){let n=t.envs,s=t.dbi;delete n[s]}}}this.subscriptions=null}}toJSON(){return{name:"subscription"}}};a(a0,"notifyFromTransactionData");a(z7,"listenToCommits");a(c0,"nextTransaction");a(l0,"whenNextTransaction")});var h0={};je(h0,{commits_awaiting_replication:()=>ru,getHDBNodeTable:()=>pr,iterateRoutes:()=>v_,shouldReplicateToNode:()=>U_,subscribeToNodeUpdates:()=>nu});function pr(){return u0||(u0=Et({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:"__createdtime__"},{attribute:"__updatedtime__"}]}))}function nu(e){pr().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;E0.debug?.("adding node",n,"on node",ot()," on process",process.pid),server.nodes=server.nodes.filter(s=>s.name!==n),r.type==="put"&&n!==ot()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r)),(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function U_(e,t){return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&pr().primaryStore.get(ot())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function Q7(){nu(e=>{Zo({},(t,r)=>{let n=e.name,s=d0.get(n);if(s||d0.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=new Float64Array(i.getUserSharedBuffer(["replicated",r,n],new ArrayBuffer(8),{callback:a(()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:d}of ru.get(r)||[])u>l&&u<=c&&d();o.lastTime=c},"callback")}));o.lastTime=0,s.set(r,o)}})})}function*v_(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=eu.default.get(tu.CONFIG_PARAMS.REPLICATION_SECUREPORT)??(!eu.default.get(tu.CONFIG_PARAMS.REPLICATION_PORT)&&eu.default.get(tu.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||eu.default.get(tu.CONFIG_PARAMS.REPLICATION_PORT)||eu.default.get(tu.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){_0.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}}}var _0,f0,eu,tu,E0,u0,d0,ru,su=Ie(()=>{Pe();us();sp();_0=require("worker_threads"),f0=L(_e()),eu=L(se()),tu=L(M()),E0=L(Sc());server.nodes=[];a(pr,"getHDBNodeTable");a(nu,"subscribeToNodeUpdates");a(U_,"shouldReplicateToNode");d0=new Map;Ev((e,t,r)=>{if(r>server.nodes.length)throw new f0.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);ru||(ru=new Map,Q7());let n=ru.get(e);return n||(n=[],ru.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(Q7,"startSubscriptionToReplications");a(v_,"iterateRoutes")});var g0={};je(g0,{connectedToNode:()=>Tc,disconnectedFromNode:()=>au,ensureNode:()=>io,requestClusterStatus:()=>T0,startOnMainThread:()=>ZR});async function ZR(e){let t=0,r=ut();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){mp.set(i,M_(l.auditStore));break}}}Ii.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes.search([]))i.push(o);for(let o of v_(e))try{let c=!o.subscriptions;if(c){let u=ot();pr().primaryStore.get(u)===void 0&&await io(u,{name:u,url:e.url??ea(),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)}nu(s)});let n;function s(i,o=i?.name){let c=ot()&&o===ot()||ea()&&i?.url===ea();if(c){let _=!!i?.replicates;if(n!==void 0&&n!==_)for(let E of pr().search([]))E.replicates&&E.name!==o&&s(E,E.name);n=_}if(_t.trace("Setting up node replication for",i),!i){for(let[_,E]of so){let f;for(let[h,{worker:T,nodes:m}]of E){let g=m[0];if(g&&g.name==o){f=!0;for(let[S,{worker:y}]of E)E.delete(S),_t.warn("Node was deleted, unsubscribing from node",o,S,_),y?.postMessage({type:"unsubscribe-from-node",node:o,database:S,url:_});break}}if(f){so.get(_).iterator.remove(),so.delete(_);return}}return}if(c)return;if(!i.url){_t.info(`Node ${i.name} is missing url`);return}let l=so.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(_t.info(`Added node ${i.name} at ${i.url} for process ${ot()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[_,E]of iu)if(i.url===E.url){iu.delete(_);break}iu.set(i.name,i)}let u=ut();if(l||(l=new Map,so.set(i.url,l)),l.iterator=Zo(e,(_,E,f)=>{f?d(E,!0):d(E,!1)}),i.subscriptions)for(let _ of i.subscriptions){let E=_.database||_.schema;u[E]||(_t.warn(`Database ${E} not found for node ${i.name}, making a subscription anyway`),d(E,!1))}function d(_,E){_t.trace("Setting up replication for database",_,"on node",i.name);let f=l.get(_),h,T=[{replicateByDefault:E,...i}];mp.has(_)&&(T.push({replicateByDefault:E,name:ot(),start_time:mp.get(_),end_time:Date.now(),replicates:!0}),mp.delete(_));let m=U_(i,_),g=Ii.workers.filter(S=>S.name==="http");if(f?(h=f.worker,f.nodes=T):m&&(t=t%g.length,h=g[t++],l.set(_,{worker:h,nodes:T,url:i.url}),h?.on("exit",()=>{l.get(_)?.worker===h&&(l.delete(_),d(_,E))})),m)setTimeout(()=>{let S={type:"subscribe-to-node",database:_,nodes:T};h?h.postMessage(S):ou(S)},J7);else{_t.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[_],pr().primaryStore.get(ot())?.replicates),pr().primaryStore.get(ot())?.replicates||(n=!1);let S={type:"unsubscribe-from-node",database:_,url:i.url,name:i.name};h?h.postMessage(S):Tp(S)}}a(d,"onDatabase")}a(s,"onNodeUpdate"),au=a(function(i){try{_t.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(iu.keys()),c=o.sort(),l=c.indexOf(i.name||js(i.url));if(l===-1){_t.warn("Disconnected node not found in node map",i.name,o);return}let u=so.get(i.url),d=u?.get(i.database);if(!d){_t.warn("Disconnected node not found in replication map",i.database,u);return}if(d.connected=!1,i.finished)return;let _=d.nodes[0];if(!(_.replicates===!0||_.replicates?.sends||_.subscriptions?.length))return;let E=(l+1)%c.length;for(;l!==E;){let f=c[E],h=iu.get(f);u=so.get(h.url);let T=u?.get(i.database);if(!T){E=(E+1)%c.length;continue}let{worker:m,nodes:g}=T,S=!1;for(let y of d.nodes){if(g.some(I=>I.name===y.name)){_t.info(`Disconnected node is already failing over to ${f} for ${i.database}`);continue}g.push(y),S=!0}if(!S){_t.info(`Disconnected node ${i.name} has no nodes to fail over to ${f}`);return}d.redirectingTo=T,_t.info(`Failing over ${i.database} from ${i.name} to ${f}`),m?m.postMessage({type:"subscribe-to-node",database:i.database,nodes:g}):ou({database:i.database,nodes:g});return}_t.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){_t.error("Error failing over node",o)}},"disconnectedFromNode"),Tc=a(function(i){let o=so.get(i.url),c=o?.get(i.database);if(!c){_t.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.catchingUpFrom=i.lastSendTime,c.redirectingTo){let{worker:l,nodes:u}=c.redirectingTo,d=u.find(_=>_.name===i.name);c.redirectingTo=null,d&&(u.splice(u.indexOf(d),1),l?l.postMessage({type:"subscribe-to-node",database:i.database,nodes:u}):ou({database:i.database,nodes:u}))}},"connectedToNode"),(0,Ii.onMessageByType)("disconnected-from-node",au),(0,Ii.onMessageByType)("connected-to-node",Tc),(0,Ii.onMessageByType)("request-cluster-status",T0)}function T0(e,t){let r=[];for(let[n,s]of iu)try{let i=so.get(s.url);_t.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let o=[];if(i){for(let[l,{worker:u,connected:d,nodes:_,latency:E,catchingUpFrom:f}]of i)o.push({database:l,connected:d,latency:E,catching_up_from:f?new Date(f).toISOString():"up-to-date",thread_id:u?.threadId,nodes:_.map(h=>h.name)});let c=(0,XR.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){_t.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function io(e,t){let r=pr();e=e??js(t.url),t.name=e;try{if(t.ca){let s=new S0.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){_t.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(_t.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.put(t);else{t.replicates&&!p0.default.get(m0.CONFIG_PARAMS.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,XR.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}_t.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var Ii,Sp,_t,XR,p0,m0,S0,J7,so,au,Tc,iu,mp,B_=Ie(()=>{Pe();Ii=L(dt());us();Sp=require("worker_threads");su();_t=L(j()),XR=require("lodash"),p0=L(se()),m0=L(M()),S0=require("crypto"),J7=200,so=new Map,iu=new Map,mp=new Map;a(ZR,"startOnMainThread");a(T0,"requestClusterStatus");Sp.parentPort&&(au=a(e=>{Sp.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Tc=a(e=>{Sp.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Ii.onMessageByType)("subscribe-to-node",e=>{ou(e)}),(0,Ii.onMessageByType)("unsubscribe-from-node",e=>{Tp(e)}));a(io,"ensureNode")});var gp=N((WOe,A0)=>{"use strict";var X7=M().OPERATIONS_ENUM,ey=class{static{a(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=X7.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};A0.exports=ey});var y0=N((zOe,R0)=>{"use strict";var Z7={OPERATION:"operation",REFRESH:"refresh"},ty=class{static{a(this,"JWTTokens")}constructor(t,r){this.operation_token=t,this.refresh_token=r}},ry=class{static{a(this,"JWTRSAKeys")}constructor(t,r,n){this.public_key=t,this.private_key=r,this.passphrase=n}};R0.exports={JWTTokens:ty,TOKEN_TYPE_ENUM:Z7,JWTRSAKeys:ry}});var cu=N((JOe,I0)=>{"use strict";var x_=require("jsonwebtoken"),ny=require("fs-extra"),sy=re(),ds=M(),{handleHDBError:fn,hdb_errors:eee}=_e(),{HTTP_STATUS_CODES:En,AUTHENTICATION_ERROR_MSGS:hn}=eee,H_=j(),b0=Bh(),ay=xn(),tee=cn().update,ree=gp(),nee=eo(),{UserEventMsg:see}=qs(),ta=se();ta.initSync();var iy=require("path"),{JWTTokens:iee,JWTRSAKeys:oee,TOKEN_TYPE_ENUM:Ap}=y0(),aee=ta.get(ds.HDB_SETTINGS_NAMES.OPERATION_TOKEN_TIMEOUT_KEY)?ta.get(ds.HDB_SETTINGS_NAMES.OPERATION_TOKEN_TIMEOUT_KEY):"1d",cee=ta.get(ds.HDB_SETTINGS_NAMES.REFRESH_TOKEN_TIMEOUT_KEY)?ta.get(ds.HDB_SETTINGS_NAMES.REFRESH_TOKEN_TIMEOUT_KEY):"30d",Rp="RS256",oy;I0.exports={createTokens:lee,validateOperationToken:dee,refreshOperationToken:uee,validateRefreshToken:N0,getJWTRSAKeys:k_};async function lee(e){if(sy.isEmpty(e)||typeof e!="object")throw fn(new Error,hn.INVALID_AUTH_OBJECT,En.BAD_REQUEST,void 0,void 0,!0);if(sy.isEmpty(e.username))throw fn(new Error,hn.USERNAME_REQUIRED,En.BAD_REQUEST,void 0,void 0,!0);if(sy.isEmpty(e.password))throw fn(new Error,hn.PASSWORD_REQUIRED,En.BAD_REQUEST,void 0,void 0,!0);let t;try{if(t=await ay.findAndValidateUser(e.username,e.password),!t)throw fn(new Error,hn.INVALID_CREDENTIALS,En.UNAUTHORIZED,void 0,void 0,!0)}catch(E){throw H_.error(E),fn(new Error,hn.INVALID_CREDENTIALS,En.UNAUTHORIZED,void 0,void 0,!0)}let r=await k_(),n=!1,s=!1;t.role&&t.role.permission&&(n=t.role.permission.super_user===!0,s=t.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s},o=await O0(i,r.private_key,r.passphrase),c=await x_.sign(i,{key:r.private_key,passphrase:r.passphrase},{expiresIn:cee,algorithm:Rp,subject:Ap.REFRESH}),l=b0.hash(c),u=new ree(ds.SYSTEM_SCHEMA_NAME,ds.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,[{username:e.username,refresh_token:l}]),d,_;try{d=await tee(u)}catch(E){H_.error(E),_=E}if(_!==void 0||d.skipped_hashes.length>0)throw fn(new Error,hn.REFRESH_TOKEN_SAVE_FAILED,En.INTERNAL_SERVER_ERROR);return nee.signalUserChange(new see(process.pid)),new iee(o,c)}a(lee,"createTokens");async function O0(e,t,r){return await x_.sign(e,{key:t,passphrase:r},{expiresIn:aee,algorithm:Rp,subject:Ap.OPERATION})}a(O0,"signOperationToken");async function k_(){if(oy===void 0)try{let e=iy.join(ta.getHdbBasePath(),ds.LICENSE_KEY_DIR_NAME,ds.JWT_ENUM.JWT_PASSPHRASE_NAME),t=iy.join(ta.getHdbBasePath(),ds.LICENSE_KEY_DIR_NAME,ds.JWT_ENUM.JWT_PRIVATE_KEY_NAME),r=iy.join(ta.getHdbBasePath(),ds.LICENSE_KEY_DIR_NAME,ds.JWT_ENUM.JWT_PUBLIC_KEY_NAME),n=(await ny.readFile(e)).toString(),s=(await ny.readFile(t)).toString(),i=(await ny.readFile(r)).toString();oy=new oee(i,s,n)}catch(e){throw H_.error(e),fn(new Error,hn.NO_ENCRYPTION_KEYS,En.INTERNAL_SERVER_ERROR)}return oy}a(k_,"getJWTRSAKeys");async function uee(e){if(!e)throw fn(new Error,hn.INVALID_BODY,En.BAD_REQUEST,void 0,void 0,!0);if(!e.refresh_token)throw fn(new Error,hn.REFRESH_TOKEN_REQUIRED,En.BAD_REQUEST,void 0,void 0,!0);await N0(e.refresh_token);let t=await k_(),r=await x_.decode(e.refresh_token);return{operation_token:await O0({username:r.username,super_user:r.super_user,cluster_user:r.cluster_user},t.private_key,t.passphrase)}}a(uee,"refreshOperationToken");async function dee(e){try{let t=await k_(),r=await x_.verify(e,t.public_key,{algorithms:Rp,subject:Ap.OPERATION});return await ay.findAndValidateUser(r.username,void 0,!1)}catch(t){throw H_.warn(t),t.name&&t.name==="TokenExpiredError"?fn(new Error,hn.TOKEN_EXPIRED,En.FORBIDDEN):fn(new Error,hn.INVALID_TOKEN,En.UNAUTHORIZED)}}a(dee,"validateOperationToken");async function N0(e){let t;try{let r=await k_(),n=await x_.verify(e,r.public_key,{algorithms:Rp,subject:Ap.REFRESH});t=await ay.findAndValidateUser(n.username,void 0,!1)}catch(r){throw H_.warn(r),r.name&&r.name==="TokenExpiredError"?fn(new Error,hn.TOKEN_EXPIRED,En.FORBIDDEN):fn(new Error,hn.INVALID_TOKEN,En.UNAUTHORIZED)}if(!b0.validate(t.refresh_token,e))throw fn(new Error,hn.INVALID_TOKEN,En.UNAUTHORIZED);return t}a(N0,"validateRefreshToken")});var Js=N(X0=>{"use strict";var sr=require("path"),{watch:_ee}=require("chokidar"),pn=require("fs-extra"),lu=require("node-forge"),U0=require("net"),{generateKeyPair:ly,X509Certificate:oo,createPrivateKey:v0}=require("crypto"),fee=require("util");ly=fee.promisify(ly);var yt=lu.pki,zs=require("joi"),{v4:B0}=require("uuid"),{validateBySchema:fy}=gt(),pt=j(),_s=se(),Es=M(),{CONFIG_PARAMS:uu}=Es,Qs=bA(),{ClientError:na}=_e(),Ac=require("node:tls"),{relative:H0,join:Eee}=require("node:path"),{CERT_PREFERENCE_APP:ZOe,CERTIFICATE_VALUES:w0}=Qs,hee=Wa(),uy=Ct(),C0=parseInt(process.version.slice(1))<20,{table:pee,getDatabases:mee,databases:cy}=(Pe(),oe(lt)),{getJWTRSAKeys:P0}=cu();Object.assign(X0,{generateKeys:py,updateConfigCert:K0,createCsr:bee,signCertificate:Oee,setCertTable:du,loadCertificates:q0,reviewSelfSignedCert:Sy,createTLSSelector:j0,listCertificates:Q0,addCertificate:Dee,removeCertificate:Mee,createNatsCerts:wee,generateCertsKeys:Iee,getReplicationCert:G_,getReplicationCertAuth:yee,renewSelfSigned:Cee,hostnamesFromCert:J0,getKey:Uee});var{urlToNodeName:x0,getThisNodeUrl:See,getThisNodeName:bp,clearThisNodeName:Tee}=(us(),oe(oa)),{readFileSync:gee,statSync:k0}=require("node:fs"),eNe=se(),{getTicketKeys:Aee,onMessageFromWorkers:Ree}=dt(),ra=j(),{isMainThread:F0}=require("worker_threads"),{TLSSocket:G0,createSecureContext:tNe}=require("node:tls"),Ey=3650,F_=["127.0.0.1","localhost","::1"],hy=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];Ree(async e=>{e.type===Es.ITC_EVENT_TYPES.RESTART&&(_s.initSync(!0),await Sy())});var Pr;function ia(){return Pr||(Pr=mee().system.hdb_certificate,Pr||(Pr=pee({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__"}]}))),Pr}a(ia,"getCertTable");async function G_(){let e=j0("operations-api"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(bp());if(!r)return;let n=new oo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(G_,"getReplicationCert");async function yee(){ia();let e=(await G_()).options.cert,r=new oo(e).issuer.match(/CN=(.*)/)?.[1];return Pr.get(r)}a(yee,"getReplicationCertAuth");var D0,sa=new Map;function q0(){if(D0)return;D0=!0;let e=[{configKey:uu.TLS},{configKey:uu.OPERATIONSAPI_TLS}];ia();let t=sr.dirname(uy.getConfigFilePath()),r;for(let{configKey:n}of e){let s=uy.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&H0(Eee(t,"keys"),o);c&&L0(o,l=>{sa.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&F0){let d;L0(u,_=>{if(w0.cert===_)return;let E=i.hostname??i.hostnames??i.host??i.hosts;E&&!Array.isArray(E)&&(E=[E]);let f=Y0(u),h=new oo(f),T;try{T=Ty(h)}catch(y){pt.error("error extracting common name from certificate",y);return}if(T==null){pt.error("error extracting common name from certificate");return}if(h.checkIssued(new oo(w0.cert)))return;let m=Pr.primaryStore.get(T),g=k0(u).mtimeMs,S=!m||m.is_self_signed?1:m.file_timestamp??m.__updatedtime__;if(m&&g<=S){g<S&&pt.info(`Certificate ${T} at ${u} is older (${new Date(g)}) than the certificate in the database (${S>1?new Date(S):"only self signed certificate available"})`);return}r=Pr.put({name:T,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:f,private_key_name:c,is_authority:l,hostnames:E,file_timestamp:g,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(q0,"loadCertificates");function L0(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&F0&&pt.warn(`Reloading ${r}:`,i),n=c,t(Y0(i)))}catch(c){pt.error(`Error loading ${r}:`,i,c)}},"loadFile");pn.existsSync(e)?s(e,k0(e)):pt.error(`${r} file not found:`,e),_ee(e,{persistent:!1}).on("change",s)}a(L0,"loadAndWatch");function dy(){let e=See();if(e==null){let t=F_[0];return pt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return x0(e)}a(dy,"getHost");function yp(){let e=bp();if(e==null){let t=F_[0];return pt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(yp,"getCommonName");async function bee(){let e=await G_(),t=yt.certificateFromPem(e.options.cert),r=yt.privateKeyFromPem(e.options.key);pt.info("Creating CSR with cert named:",e.name);let n=yt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:yp()},...hy];pt.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:$0()}];return pt.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),lu.pki.certificationRequestToPem(n)}a(bee,"createCsr");function $0(){let e=F_.includes(yp())?F_:[...F_,yp()];return e.includes(dy())||e.push(dy()),[{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=>U0.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a($0,"certExtensions");async function Oee(e){let t={},r=sr.join(_s.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;ia();for await(let d of Pr.search([]))if(d.is_authority&&!d.details.issuer.includes("HarperDB-Certificate-Authority")){if(sa.has(d.private_key_name)){n=sa.get(d.private_key_name),s=d;break}else if(d.private_key_name&&await pn.exists(sr.join(r,d.private_key_name))){n=pn.readFile(sr.join(r,d.private_key_name)),s=d;break}}if(!n){let d=await _y();s=d.ca,n=d.private_key}n=yt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=yt.certificateFromPem(s.certificate);pt.info("Signing CSR with cert named",s.name);let o=yt.certificationRequestFromPem(e.csr);try{o.verify()}catch(d){return pt.error(d),new Error("Error verifying CSR: "+d.message)}let c=lu.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()+Ey),pt.info("sign cert setting validity:",c.validity),pt.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),pt.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;pt.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,lu.md.sha256.create()),t.certificate=yt.certificateToPem(c)}else pt.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(Oee,"signCertificate");async function Nee(e,t){await du({name:bp(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await du({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(Nee,"createCertificateTable");async function du(e){let t=new oo(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},ia(),await Pr.patch(e)}a(du,"setCertTable");async function py(){let e=await ly("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(py,"generateKeys");async function my(e,t,r){let n=yt.createCertificate();if(!t){let o=await G_();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()+Ey);let i=[{name:"commonName",value:yp()},...hy];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions($0()),n.sign(e,lu.md.sha256.create()),yt.certificateToPem(n)}a(my,"generateCertificates");async function _y(){let e=await Q0(),t;for(let r of e){if(!r.is_authority)continue;let n=await z0(r.private_key_name);if(r.private_key_name&&n&&new oo(r.certificate).checkPrivateKey(v0(n))){pt.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;pt.trace("No CA found with matching private key")}a(_y,"getCertAuthority");async function V0(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()+Ey);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${_s.get(uu.REPLICATION_HOSTNAME)??x0(_s.get(uu.REPLICATION_URL))??B0().split("-")[0]}`},...hy];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,lu.md.sha256.create());let o=sr.join(_s.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=sr.join(o,Qs.PRIVATEKEY_PEM_NAME);return r&&await pn.writeFile(c,yt.privateKeyToPem(e)),n}a(V0,"generateCertAuthority");async function Iee(){let{private_key:e,public_key:t}=await py(),r=await V0(e,t),n=await my(e,t,r);await Nee(n,r),K0()}a(Iee,"generateCertsKeys");async function wee(){let e=await my(yt.privateKeyFromPem(Qs.CERTIFICATE_VALUES.key),void 0,yt.certificateFromPem(Qs.CERTIFICATE_VALUES.cert)),t=sr.join(_s.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=sr.join(t,Qs.NATS_CERTIFICATE_PEM_NAME);await pn.exists(r)||await pn.writeFile(r,e);let n=sr.join(t,Qs.NATS_CA_PEM_NAME);await pn.exists(n)||await pn.writeFile(n,Qs.CERTIFICATE_VALUES.cert)}a(wee,"createNatsCerts");async function Cee(){ia();for await(let e of Pr.search([{attribute:"is_self_signed",value:!0}]))await Pr.delete(e.name);await Sy()}a(Cee,"renewSelfSigned");async function Sy(){Tee(),await q0(),ia();let e=await _y();if(!e){pt.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=_s.get(uu.TLS_PRIVATEKEY),n=sr.join(_s.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),s,i=H0(n,r);try{s=yt.privateKeyFromPem(await pn.readFile(r))}catch(c){pt.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 py(),await pn.exists(sr.join(n,Qs.PRIVATEKEY_PEM_NAME))&&(i=`privateKey${B0().split("-")[0]}.pem`),await pn.writeFile(sr.join(n,i),yt.privateKeyToPem(s))}let o=await V0(s,yt.setRsaPublicKey(s.n,s.e),!1);await du({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 G_()){let r=bp();pt.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await _y();let n=yt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await my(yt.privateKeyFromPem(e.private_key),s,n);await du({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(Sy,"reviewSelfSignedCert");function K0(){let e=hee(Object.keys(Es.CONFIG_PARAM_MAP),!0),t=sr.join(_s.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=sr.join(t,Qs.PRIVATEKEY_PEM_NAME),n=sr.join(t,Qs.NATS_CERTIFICATE_PEM_NAME),s=sr.join(t,Qs.NATS_CA_PEM_NAME),i=Es.CONFIG_PARAMS,o={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(o[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(o[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,o[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,o[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),uy.updateConfigValue(void 0,void 0,o,!1,!0)}a(K0,"updateConfigCert");function Y0(e){return e.startsWith("-----BEGIN")?e:gee(e,"utf8")}a(Y0,"readPEM");var M0=Ac.createSecureContext;Ac.createSecureContext=function(e){if(!e.cert||!e.key)return M0(e);let t={...e};delete t.key,delete t.cert;let r=M0(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var W0=Ac.Server;Ac.Server=function(e,t){return e.ALPNCallback&&(e.ALPNProtocols=null),W0.call(this,e,t)};Ac.Server.prototype=W0.prototype;var Pee=G0.prototype._init;G0.prototype._init=function(e,t){Pee.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 gc=new Map;function j0(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(),gc.clear();let d=0;for await(let _ of cy.system.hdb_certificate.search([])){let E=_.certificate,f=new oo(E);_.is_authority&&(f.asString=E,gc.set(f.subject,E))}for await(let _ of cy.system.hdb_certificate.search([]))try{if(_.is_authority)continue;let E=e==="operations-api",f=_.is_self_signed?1:2;E&&_.uses?.includes?.("operations")&&(f+=1);let h=await z0(_.private_key_name),T=_.certificate,m=new oo(T);if(gc.has(m.issuer)&&(T+=`
|
|
12
12
|
`+gc.get(m.issuer)),!h||!T)throw new Error("Missing private key or certificate for secure server");let g={ciphers:_.ciphers,ticketKeys:Aee(),availableCAs:gc,ca:t&&Array.from(gc.values()),cert:T,key:h,key_file:_.private_key_name,is_self_signed:_.is_self_signed};o&&(g.sessionIdContext=o.sessionIdContext);let S=Ac.createSecureContext(g);S.name=_.name,S.options=g,S.quality=f,S.certificateAuthorities=Array.from(gc),S.certStart=T.toString().slice(0,100);let y=_.hostnames??J0(m);Array.isArray(y)||(y=[y]);let I;for(let U of y)if(U){U[0]==="*"&&(s=!0,U=U.slice(1)),U===dy()&&(f+=2),U0.isIP(U)&&(I=!0);let H=r.get(U)?.quality??0;f>H&&r.set(U,S)}else ra.error("No hostname found for certificate at",Ac.certificate);ra.trace("Adding TLS",S.name,"for",o.ports||"client","cert named",_.name,"hostnames",y,"quality",f,"best quality",d),f>d&&(i.defaultContext=n=S,d=f,o&&(o.defaultContext=S))}catch(E){ra.error("Error applying TLS for",_.name,E)}o?.secureContextsListeners.forEach(_=>_()),c(n)}catch(d){l(d)}}a(u,"updateTLS"),cy.system.hdb_certificate.subscribe({listener:a(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(o,c){ra.info("TLS requested for",o||"(no SNI)",this.isReplicationConnection);let l=o;for(;;){let d=r.get(l);if(d)return ra.debug("Found certificate for",o,d.certStart),d.replicationContext&&(this.isReplicationConnection||C0)&&(d=d.replicationContext),c(null,d);if(s&&l){let _=l.indexOf(".",1);_<0?l="":l=l.slice(_)}else break}o?ra.debug("No certificate found to match",o,"using the default certificate"):ra.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.replicationContext&&(this.isReplicationConnection||C0)&&(u=u.replicationContext):ra.info("No default certificate found"),c(null,u)}a(i,"SNICallback")}a(j0,"createTLSSelector");async function z0(e){let t=sa.get(e);return!t&&e?await pn.readFile(sr.join(_s.get(uu.ROOTPATH),Es.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(z0,"getPrivateKeyByName");async function Q0(){ia();let e=[];for await(let t of Pr.search([]))e.push(t);return e}a(Q0,"listCertificates");async function Dee(e){let t=fy(e,zs.object({name:zs.string().required(),certificate:zs.string().required(),is_authority:zs.boolean().required(),private_key:zs.string(),hosts:zs.array(),uses:zs.array()}));if(t)throw new na(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,o=new oo(n),c=!1,l=!1,u;for(let[f,h]of sa)!s&&!c&&o.checkPrivateKey(v0(h))&&(c=!0,u=f),s&&s===h&&(l=!0,u=f);if(!i&&!s&&!c)throw new na("A suitable private key was not found for this certificate");let d;if(!r){try{d=Ty(o)}catch(f){pt.error(f)}if(d==null)throw new na("Error extracting certificate common name, please provide a name parameter")}let _=Lee(r??d);s&&!c&&!l&&(await pn.writeFile(sr.join(_s.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME,_+".pem"),s),sa.set(_,s));let E={name:r??d,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(E.private_key_name=u??_+".pem"),await du(E),"Successfully added certificate: "+_}a(Dee,"addCertificate");function Lee(e){return e.replace(/[^a-z0-9\.]/gi,"-")}a(Lee,"sanitizeName");async function Mee(e){let t=fy(e,zs.object({name:zs.string().required()}));if(t)throw new na(t.message);let{name:r}=e;ia();let n=await Pr.get(r);if(!n)throw new na(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Pr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(pt.info("Removing private key named",s),await pn.remove(sr.join(_s.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME,s)))}return await Pr.delete(r),"Successfully removed "+r}a(Mee,"removeCertificate");function Ty(e){return e.subject.match(/CN=(.*)/)?.[1]}a(Ty,"extractCommonName");function J0(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):[Ty(e)]}a(J0,"hostnamesFromCert");async function Uee(e){if(e.bypass_auth!==!0)throw new na("Unauthorized","401");let t=fy(e,zs.object({name:zs.string().required()}));if(t)throw new na(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await P0()).private_key;if(r===".jwtPublic")return(await P0()).public_key;if(sa.get(r))return sa.get(e.name);throw new na("Key not found")}a(Uee,"getKey")});var Y_={};je(Y_,{addAnalyticsListener:()=>K_,recordAction:()=>mr,recordActionBinary:()=>qn,setAnalyticsEnabled:()=>vee});function vee(e){aB=e}function mr(e,t,r,n,s){if(!aB)return;let i=t+(r?"-"+r:"");n!==void 0&&(i+="-"+n),s!==void 0&&(i+="-"+s);let o=Ip.get(i);if(o)if(typeof e=="number"){let c=o.values,l=c.index++;if(l>=c.length){let u=c;o.values=c=new Float32Array(l*2),c.set(u),c.index=l+1}c[l]=e,o.total+=e}else if(typeof e=="boolean")e&&o.total++,o.count++;else if(typeof e=="function")o.count++;else throw new TypeError("Invalid metric value type "+typeof e);else{if(typeof e=="number")o={total:e,values:new Float32Array(4)},o.values.index=1,o.values[0]=e,o.total=e;else if(typeof e=="boolean")o={},o.total=e?1:0,o.count=1;else if(typeof e=="function")o={},o.count=1,o.callback=e;else throw new TypeError("Invalid metric value type "+typeof e);o.description={metric:t,path:r,method:n,type:s},Ip.set(i,o)}Op||Bee()}function qn(e,t,r,n,s){mr(!!e,t,r,n,s)}function K_(e){uB.push(e)}function Bee(){Op=performance.now(),setTimeout(async()=>{let e=performance.now()-Op;Op=0;let t=[],r={time:Date.now(),period:e,threadId:Rc.threadId,metrics:t};for(let[s,i]of Ip){if(i.values){let o=i.values.subarray(0,i.values.index);o.sort();let c=o.length,l=0,u=[],d;for(let _ of dB){let E=Math.floor(c*_),f=o[E-1];if(E>l){let h=E-l;if(f===d){let T=u[u.length-1];typeof T=="number"?u[u.length-1]={value:T,count:1+h}:T.count+=h}else u.push(h>1?{value:f,count:h}:f),d=f;l=E}}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 _B()}let n=process.memoryUsage();t.push({metric:"memory",threadId:Rc.threadId,byThread:!0,...n});for(let s of uB)s(t);Ip=new Map,Rc.parentPort?Rc.parentPort.postMessage({type:lB,report:r}):hB({report:r})},cB).unref()}async function Hee(e,t=6e4){let r=Ry(),n=fB(),s=new Promise(T=>{let m=performance.now();setImmediate(()=>{let g=performance.now();g-m>5e3&&(0,q_.warn)("Unusually high event queue latency on the main thread of "+Math.round(g-m)+"ms"),m=performance.now()}),n.primaryStore.prefetch([1],()=>{let g=performance.now();g-m>5e3&&(0,q_.warn)("Unusually high task queue latency on the main thread of "+Math.round(g-m)+"ms"),T(g-m)})}),i;for(let T of n.primaryStore.getRange({start:1/0,end:!1,reverse:!0}))if(T.value?.time){i=T.value.time;break}if(Date.now()-t<i)return;let o,c=new Map,l=new Map,u=[],d;for(let{key:T,value:m}of r.primaryStore.getRange({start:i||!1,exclusiveStart:!0,end:1/0})){if(!m)continue;if(o){if(T>o+t)break}else o=T;d=T;let{metrics:g,threadId:S}=m;for(let y of g||[]){let{path:I,method:U,type:H,metric:X,count:Y,total:V,distribution:ne,threads:Q,...de}=y;Y||(Y=1);let W=X+(I?"-"+I:"");U!==void 0&&(W+="-"+U),H!==void 0&&(W+="-"+H);let ae=c.get(W);if(ae){if(ae.threads){let Ne=ae.threads[S];if(Ne)ae=Ne;else{ae.threads[S]={...de};continue}}ae.count||(ae.count=1);let Oe=ae.count;for(let Ne in de){let Me=de[Ne];typeof Me=="number"&&(ae[Ne]=(ae[Ne]*Oe+Me*Y)/(Oe+Y))}ae.count+=Y,V>=0&&(ae.total+=V,ae.ratio=ae.total/ae.count)}else ae={period:t,...y},delete ae.distribution,c.set(W,ae),ae.byThread&&(ae.threads=[],ae.threads[S]={...de},u.push(ae));if(ne){ne=ne.map(Ne=>typeof Ne=="number"?{value:Ne,count:1}:Ne);let Oe=l.get(W);Oe?Oe.push(...ne):l.set(W,ne)}}await _B()}for(let T of u){let{path:m,method:g,type:S,metric:y,count:I,total:U,distribution:H,threads:X,...Y}=T;X=X.filter(V=>V);for(let V in Y){if(typeof T[V]!="number")continue;let ne=0;for(let Q of X){let de=Q[V];typeof de=="number"&&(ne+=de)}T[V]=ne}T.count=X.length,delete T.threads,delete T.byThread}for(let[T,m]of l){let g=c.get(T);m.sort((Ne,Me)=>Ne.value>Me.value?1:-1);let S=g.count-1,y=[],I=0,U=0,H;for(let Ne of dB){let Me=S*Ne;for(;I<Me;)H=m[U++],I+=H.count,U===1&&I--;let Gr=m[U>1?U-2:0];H||(H=m[0]),y.push(H.value-(H.value-Gr.value)*(I-Me)/H.count)}let[X,Y,V,ne,Q,de,W,ae,Oe]=y;Object.assign(g,{p1:X,p10:Y,p25:V,median:ne,p75:Q,p90:de,p95:W,p99:ae,p999:Oe})}let _;for(let[T,m]of c)m.id=(0,Np.getNextMonotonicTime)(),m.time=d,n.primaryStore.put(m.id,m,{append:!0}).then(g=>{g||n.primaryStore.put(m.id,m)}),_=!0;let E=Date.now(),{idle:f,active:h}=performance.eventLoopUtilization();if(_||h*10>f){let T=(0,Np.getNextMonotonicTime)(),m={id:T,metric:"main-thread-utilization",idle:f-Z0,active:h-eB,taskQueueLatency:await s,time:E,...process.memoryUsage()};n.primaryStore.put(T,m,{append:!0}).then(g=>{g||n.primaryStore.put(T,m)})}Z0=f,eB=h}async function tB(e,t){let r=Date.now()-t;for(let n of e.primaryStore.getKeys({start:!1,end:r}))e.primaryStore.remove(n)}function Ry(){return rB||(rB=Et({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function fB(){return nB||(nB=Et({table:"hdb_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]}))}function Fee(){EB=!0;let e=(0,V_.get)(Ay.CONFIG_PARAMS.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await Hee(cB,e),await tB(Ry(),xee),await tB(fB(),kee)},Math.min(e/2,2147483647)).unref()}function hB(e,t){let r=e.report;r.threadId=t?.threadId||Rc.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(sB+=n.mean*n.count);r.totalBytesProcessed=sB,t&&(r.metrics.push({metric:"utilization",...t.performance.eventLoopUtilization(iB.get(t))}),iB.set(t,t.performance.eventLoopUtilization())),r.id=(0,Np.getNextMonotonicTime)(),Ry().primaryStore.put(r.id,r),EB||Fee(),Gee&&(pB=$ee(r))}async function $ee(e){if(await pB,!aa){let r=(0,$_.dirname)((0,q_.getLogFilePath)());try{aa=await(0,gy.open)((0,$_.join)(r,"analytics.log"),"r+")}catch{aa=await(0,gy.open)((0,$_.join)(r,"analytics.log"),"w+")}}let t=(await aa.stat()).size;if(t>qee){let r=Buffer.alloc(t);await aa.read(r,{position:0}),r=r.subarray(r.indexOf(10,r.length/2)+1),await aa.write(r,{position:0}),await aa.truncate(r.length),t=r.length}await aa.write(JSON.stringify(e)+`
|
|
13
|
-
`,t)}var Rc,oB,q_,$_,gy,Np,V_,Ay,Ip,aB,Op,cB,lB,uB,dB,Z0,eB,_B,xee,kee,rB,nB,EB,sB,iB,Gee,pB,aa,qee,wi=Ie(()=>{Rc=require("worker_threads"),oB=L(dt());Pe();q_=L(j()),$_=require("path"),gy=require("fs/promises"),Np=L(sn()),V_=L(se()),Ay=L(M());qr();(0,V_.initSync)();Ip=new Map,aB=(0,V_.get)(Ay.CONFIG_PARAMS.ANALYTICS_AGGREGATEPERIOD)>-1;a(vee,"setAnalyticsEnabled");a(mr,"recordAction");it.recordAnalytics=mr;a(qn,"recordActionBinary");Op=0,cB=1e3,lB="analytics-report",uB=[];a(K_,"addAnalyticsListener");dB=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Bee,"sendAnalytics");a(Hee,"aggregation");Z0=0,eB=0,_B=a(()=>new Promise(setImmediate),"rest");a(tB,"cleanup");xee=36e5,kee=31536e6;a(Ry,"getRawAnalyticsTable");a(fB,"getAnalyticsTable");(0,oB.setChildListenerByType)(lB,hB);a(Fee,"startScheduledTasks");sB=0,iB=new Map,Gee=!1;a(hB,"recordAnalytics");qee=1e6;a($ee,"logAnalytics")});async function wy(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=ot(),i;if(e.includes("wss://")){if(!by){let l=(0,MB.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),by=u.secureContexts}if(i=by.get(s),i&&fe.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,vB.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,ALPNProtocols:["http/1.1","harperdb-replication"],rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(c.secureContext=UB.createSecureContext({...i.options,ca:Array.from(bc)})),new DB.WebSocket(e,"harperdb-replication-v1",c)}function Lp(e,t,r){let n=t.port||t.securePort,s=Iy.pid%1e3+"-"+LB.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,d=t.databaseSubscriptions||yc,_,E,f=!1,h=t.subscription;h?.then&&h.then(ie=>h=ie);let T=t.tables||u&&ut()[u];if(!r){fe.error?.("No authorization provided"),is(1008,"Unauthorized");return}let m=new Map,g=[],S=r.name;S&&t.connection&&(t.connection.nodeName=S);let y,I,U,H,X,Y,V=1e3,ne,Q=0,de=0,W=0,ae=0;if(t.url){let ie=a(()=>{X&&W===e._socket?.bytesRead&&ae===e._socket?.bytesWritten?e.terminate():(X=performance.now(),e.ping(),W=e._socket?.bytesRead,ae=e._socket?.bytesWritten)},"send_ping");U=setInterval(ie,IB).unref(),ie()}else Oe();function Oe(){clearTimeout(H),W=e._socket?.bytesRead,ae=e._socket?.bytesWritten,H=setTimeout(()=>{W===e._socket?.bytesRead&&ae===e._socket?.bytesWritten&&(fe.warn?.(`Timeout waiting for ping from ${S}, terminating connection and reconnecting`),e.terminate())},IB*2).unref()}a(Oe,"resetPingTimer"),u&&Va(u);let Ne,Me,Gr=[],Id=[],ka,wn=[],wd=[],Ol=[],Mw=150,KE=0,vt=0,Fa,Ga,Us,vs,YE;e.on("message",ie=>{Q=performance.now();try{let Se=ie.dataView=new Oc(ie.buffer,ie.byteOffset,ie.byteLength);if(ie[0]>127){let A=(0,ct.decode)(ie),[w,R,b]=A;switch(w){case SB:{if(R){if(S){if(S!==R){fe.error?.(s,`Node name mismatch, expecting to connect to ${S}, but peer reported name as ${R}, disconnecting`),e.send((0,ct.encode)([_u])),is(1008,"Node name mismatch");return}}else if(S=R,t.connection?.tentativeNode){let x=t.connection.tentativeNode;x.name=S,t.connection.tentativeNode=null,io(S,x)}if(t.connection&&(t.connection.nodeName=S),fe.debug?.(s,"received node name:",S,"db:",u),!u)try{Va(u=A[2]),u==="system"&&(Ne=Zo(t,(x,q)=>{$a(q)&&Ir(q)}),e.on("close",()=>{Ne?.remove()}))}catch(x){fe.warn?.(s,"Error setting database",x),e.send((0,ct.encode)([_u])),is(1008,x.message);return}qa()}break}case OB:{fe.debug?.(s,"Received table definitions for",R.map(x=>x.table));for(let x of R){let q=A[2];x.database=q;let ee;$a(q)&&(q==="system"?We[q]?.[x.table]||(ee=Oy(x,We[q]?.[x.table])):ee=Oy(x,We[q]?.[x.table]),_||(_=ee?.auditStore),T||(T=ut()?.[q]))}break}case _u:is();break;case RB:try{let x=r?.replicates||r?.subscribers||r?.name;server.operation(R,{user:r},!x).then(q=>{Array.isArray(q)&&(q={results:q}),q.requestId=R.requestId,e.send((0,ct.encode)([Cp,q]))},q=>{e.send((0,ct.encode)([Cp,{requestId:R.requestId,error:q instanceof Error?q.toString():q}]))})}catch(x){e.send((0,ct.encode)([Cp,{requestId:R.requestId,error:x instanceof Error?x.toString():x}]))}break;case Cp:let{resolve:P,reject:O}=m.get(R.requestId);R.error?O(new Error(R.error)):P(R),m.delete(R.requestId);break;case yy:let B=A[3];T||(u?fe.error?.(s,"No tables found for",u):fe.error?.(s,"Database name never received"));let k=T[B];k=Oy({table:B,database:u,attributes:R.attributes,schemaDefined:R.schemaDefined},k),Gr[b]={name:B,decoder:new ct.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:R.typedStructs,structures:R.structures}),getEntry(x){return k.primaryStore.getEntry(x)},rootStore:k.primaryStore.rootStore};break;case TB:YE=_?t0(S,R,_):new Map,ka=A[2],fe.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${ka}`);break;case gB:let C=b;Ol[C]=R;break;case bB:let F=["replicated",u,S];E||(E=new Float64Array(_.getUserSharedBuffer(F,new ArrayBuffer(8)))),E[0]=R,fe.trace?.(s,"received and broadcasting committed update",R),E.buffer.notify();break;case yB:y=R,h.send({type:"end_txn",localTime:y,remoteNodeIds:g});break;case AB:{let x=R,q;try{let ee=A[3],G=Id[b]||(Id[b]=T[A[4]]);if(!G)return fe.warn?.("Unknown table id trying to handle record request",b);let Re=G.primaryStore.getBinaryFast(Symbol.for("structures")),Ee=Re.length;if(Ee!==vt){vt=Ee;let te=(0,ct.decode)(Re);e.send((0,ct.encode)([yy,{typedStructs:te.typed,structures:te.named},b,G.tableName]))}let Ae=G.primaryStore.getBinaryFast(ee);if(Ae){let te=G.primaryStore.decoder.decode(Ae,{valueAsBuffer:!0});q=(0,ct.encode)([wp,x,{value:te.value,expiresAt:te.expiresAt,version:te.version,residencyId:te.residencyId,nodeId:te.nodeId,user:te.user}])}else q=(0,ct.encode)([wp,x])}catch(ee){q=(0,ct.encode)([wp,x,{error:ee.message}])}e.send(q);break}case wp:{let{resolve:x,reject:q,tableId:ee,key:G}=m.get(A[1]),Re=A[2];if(Re?.error)q(new Error(Re.error));else if(Re){let Ee=Gr[ee].decoder.decode(Re.value);Re.value=Ee,Re.key=G,x(Re)}else x();m.delete(A[1]);break}case mB:{vs=R;let x,q,ee=!1;if(h){if(u!==h.databaseName&&!h.then){fe.error?.("Subscription request for wrong database",u,h.databaseName);return}}else h=d.get(u);if(fe.debug?.(s,"received subscription request for",u,"at",vs),!h){let ce;h=new Promise(Ye=>{fe.debug?.("Waiting for subscription to database "+u),ce=Ye}),h.ready=ce,yc.set(u,h)}if(r.name)q=pr().subscribe(r.name),q.then(async ce=>{x=ce;for await(let Ye of x){let rt=Ye.value;if(!(rt?.replicates===!0||rt?.replicates?.receives||rt?.subscriptions?.some(Ze=>(Ze.database||Ze.schema)===u&&Ze.publish!==!1))){ee=!0,e.send((0,ct.encode)([_u])),is(1008,`Unauthorized database subscription to ${u}`);return}}},ce=>{fe.error?.(s,"Error subscribing to HDB nodes",ce)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,ct.encode)([_u])),is(1008,`Unauthorized database subscription to ${u}`);return}if(Us&&(fe.debug?.(s,"stopping previous subscription",u),Us.emit("close")),vs.length===0)return;let G=vs[0],Re=a(ce=>{if(ce&&(G.replicateByDefault?!G.tables.includes(ce.tableName):G.tables.includes(ce.tableName)))return{table:ce}},"tableToTableEntry"),Ee={txnTime:0},Ae,te,K=1/0,ge,Be=a((ce,Ye)=>{if(K=Ye,ce.type==="end_txn"){Ee.txnTime&&(o[i]!==66&&fe.error?.("Invalid encoding of message"),di(9),di(Dp),Ka(ge=Ye),we()),i=c,Ee.txnTime=0;return}let rt=ce.nodeId,Ze=ce.tableId,st=te[Ze];if(!st&&(st=te[Ze]=Re(h.tableById[Ze]),!st))return fe.debug?.("Not subscribed to table",Ze);let Bt=st.table,xo=Bt.primaryStore,Yt=xo.encoder;(ce.extendedType&ph||!Yt.typedStructs)&&(Yt._mergeStructures(Yt.getStructures()),Yt.typedStructs&&(Yt.lastTypedStructuresLength=Yt.typedStructs.length));let WE=Ae[rt];if(!(WE&&WE.startTime<Ye&&(!WE.endTime||WE.endTime>Ye)))return W_&&fe.trace?.(s,"skipping replication update",ce.recordId,"to:",S,"from:",rt,"subscribed:",Ae),Uw();W_&&fe.trace?.(s,"sending replication update",ce.recordId,"to:",S,"from:",rt,"subscribed:",Ae);let XT=ce.version;Ee.txnTime!==XT&&(Ee.txnTime&&(W_&&fe.trace?.(s,"new txn time, sending queued txn",Ee.txnTime),o[i]!==66&&fe.error?.("Invalid encoding of message"),we()),Ee.txnTime=XT,i=c,Ka(XT));let Ya=ce.residencyId,ZT=Yi(Ya,Bt),jE;if(ZT&&!ZT.includes(S)){let Il=Yi(ce.previousResidencyId,Bt);if(Il&&!Il.includes(S)&&(ce.type==="put"||ce.type==="patch")||Bt.getResidencyById)return Uw();let Ld=ce.recordId;fe.trace?.(s,"sending invalidation",Ld,S,"from",rt);let rg=0;Ya&&(rg|=Ja),ce.previousResidencyId&&(rg|=Xa);let ng,zE=null;for(let vw in Bt.indices){if(!zE){if(ng=ce.getValue(xo,!0),!ng)break;zE={}}zE[vw]=ng[vw]}jE=Dl(ce.version,Ze,Ld,null,rt,ce.user,ce.type==="put"||ce.type==="patch"?"invalidate":ce.type,Yt.encode(zE),rg,Ya,ce.previousResidencyId,ce.expiresAt)}function Uw(){fe.trace?.(s,"skipping audit record",ce.recordId),Y||(Y=setTimeout(()=>{Y=null,(ge||0)+NB/2<K&&(W_&&fe.trace?.(s,"sending skipped sequence update",K),e.send((0,ct.encode)([yB,K])))},NB).unref())}a(Uw,"skipAuditRecord");let eg=Yt.typedStructs,tg=Yt.structures;if((eg?.length!=st.typed_length||tg?.length!=st.structure_length)&&(st.typed_length=eg?.length,st.structure_length=tg.length,fe.debug?.(s,"send table struct",st.typed_length,st.structure_length),st.sentName||(st.sentName=!0),e.send((0,ct.encode)([yy,{typedStructs:eg,structures:tg,attributes:Bt.attributes,schemaDefined:Bt.schemaDefined},Ze,st.table.tableName]))),Ya&&!wd[Ya]&&(e.send((0,ct.encode)([gB,ZT,Ya])),wd[Ya]=!0),jE)di(jE.length),Dd(jE);else{let Il=ce.encoded,Ld=Il[0]===66?8:0;di(Il.length-Ld),Dd(Il,Ld)}},"sendAuditRecord"),we=a(()=>{c-i>8?(e.send(o.subarray(i,c)),fe.debug?.(s,"Sent message, size:",c-i)):fe.debug?.(s,"skipping empty transaction")},"sendQueuedData");Us=new Ny.EventEmitter,Us.once("close",()=>{ee=!0,x?.end()});for(let{startTime:ce}of vs)ce<K&&(K=ce);(q||Promise.resolve()).then(async()=>{h=await h,_=h.auditStore,te=h.tableById.map(Re),Ae=[];for(let{name:Ye,startTime:rt,endTime:Ze}of vs){let st=hp(Ye,_);fe.debug?.("subscription to",Ye,"using local id",st,"starting",rt),Ae[st]={startTime:rt,endTime:Ze}}Ir(u),Ne||(Ne=Nc(Ye=>{Ye.databaseName===u&&Ir(u)}),Me=j_(Ye=>{Ye===u&&(e.send((0,ct.encode)([_u])),is())}),e.on("close",()=>{Ne?.remove(),Me?.remove()})),e.send((0,ct.encode)([TB,L_(h.auditStore),vs.map(({name:Ye})=>Ye)]));let ce=!0;do{isFinite(K)||(fe.warn?.("Invalid sequence id "+K),is(1008,"Invalid sequence id"+K));let Ye;if(ce&&!ee&&(ce=!1,!(Cy(_)<=K)&&CB.default.get(PB.CONFIG_PARAMS.REPLICATION_COPYTABLESTOCATCHUP)!==!1&&server.nodes[0]?.name===S)){fe.info?.("Replicating all tables to",S);let Ze=K,st=Mp(_);for(let Bt in T){if(!Re(Bt))continue;let xo=T[Bt];for(let Yt of xo.primaryStore.getRange({snapshot:!1})){if(ee)return;Yt.localTime>=K&&(fe.trace?.(s,"Copying record from",u,Bt,Yt.key,Yt.localTime),Ze=Math.max(Yt.localTime,Ze),Ye=!0,Be({recordId:Yt.key,tableId:xo.tableId,type:"put",getValue(){return Yt.value},encoded:xo.primaryStore.getBinary(Yt.key),version:Yt.version,residencyId:Yt.residencyId,nodeId:st},Yt.localTime))}}K=Ze}for(let{key:rt,value:Ze}of _.getRange({start:K||1,exclusiveStart:!0,snapshot:!1})){if(ee)return;de=rt;let st=xt(Ze);Be(st,rt),e._socket.writableNeedDrain?await new Promise(Bt=>e._socket.once("drain",Bt)):await new Promise(setImmediate),Us.startTime=rt,Ye=!0}Ye&&Be({type:"end_txn"},K),de=0,await l0(_)}while(!ee)}).catch(ce=>{fe.error?.(s,"Error handling subscription to node",ce),is(1008,"Error handling subscription to node")});break}}return}Se.position=8;let tt=!0,v,p;do{let A=Se.readInt();if(A===9&&Se.getUint8(Se.position)==Dp){Se.position++,y=p=Se.readFloat64(),fe.trace?.("received remote sequence update",y,u);break}let w=Se.position,R=xt(ie,w,w+A),b=Gr[R.tableId];b||fe.error?.(`No table found with an id of ${R.tableId}`);let P;R.residencyId&&(P=Ol[R.residencyId],fe.trace?.(s,"received residency list",P,R.type,R.recordId));try{v={table:b.name,id:R.recordId,type:R.type,nodeId:YE.get(R.nodeId),residencyList:P,timestamp:R.version,value:R.getValue(b),user:R.user,beginTxn:tt,expiresAt:R.expiresAt}}catch(O){throw O.message+="typed structures for current decoder"+JSON.stringify(b.decoder.typedStructs),O}tt=!1,W_&&fe.trace?.(s,"received replication message",R.type,"id",v.id,"version",R.version,"nodeId",v.nodeId,"value",v.value),h.send(v),Se.position=w+A}while(Se.position<ie.byteLength);KE++,mr(ie.byteLength,"bytes-received",S+"."+u+"."+v.table,"replication","ingest"),KE>Mw&&!Fa&&(Fa=!0,e.pause()),h.send({type:"end_txn",localTime:y,remoteNodeIds:g,onCommit(){if(v){let A=Date.now()-v.timestamp;mr(A,"replication-latency",S+"."+u+"."+v.table,v.type,"ingest")}KE--,Fa&&(Fa=!1,e.resume()),!I&&p&&(fe.trace?.(s,"queuing confirmation of a commit at",p),setTimeout(()=>{e.send((0,ct.encode)([bB,I])),fe.trace?.(s,"sent confirmation of a commit at",I),I=null},Vee)),I=p}})}catch(Se){fe.error?.(s,"Error handling incoming replication message",Se)}}),e.on("ping",Oe),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-X,Tc({name:S,database:u,url:t.url,lastSendTime:de,latency:t.connection.latency})),X=null}),e.on("close",(ie,Se)=>{clearInterval(U),clearTimeout(H),Us&&Us.emit("close"),Ga&&Ga.end();for(let[tt,{reject:v}]of m)v(new Error(`Connection closed ${Se?.toString()} ${ie}`));fe.debug?.(s,"closed",ie,Se?.toString())});function Ve(){}a(Ve,"recordRemoteNodeSequence");function is(ie,Se){e.isFinished=!0,e.close(ie,Se)}a(is,"close");function qa(){if(f||(f=!0,t.connection?.on("subscriptions-updated",qa)),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let ie=new Map;try{for(let v of h?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let p of v.value.nodes||[])p.lastTxnTime>(ie.get(p.id)??0)&&ie.set(p.id,p.lastTxnTime)}catch(v){if(!v.message.includes("Can not re"))throw v}let Se=t.connection?.nodeSubscriptions?.[0];g=[];let tt=t.connection?.nodeSubscriptions.map((v,p)=>{let A=[],{replicateByDefault:w}=v;if(v.subscriptions){for(let O of v.subscriptions)if(O.subscribe&&(O.schema||O.database)===u){let B=O.table;T?.[B]?.replicate!==!1&&A.push(B)}w=!1}else for(let O in T)(w?T[O].replicate===!1:T[O].replicate)&&A.push(O);let R=_&&hp(v.name,_),b=h?.dbisDB?.get([Symbol.for("seq"),R])??1,P=Math.max(b?.seqId??1,(typeof v.start_time=="string"?new Date(v.start_time).getTime():v.start_time)??1);if(fe.debug?.("Starting time recorded in db",v.name,R,u,b?.seqId,"start time:",P),Se!==v){P>5e3&&(P-=5e3);let O=_&&hp(Se.name,_),B=h?.dbisDB?.get([Symbol.for("seq"),O])??1;for(let k of B?.nodes||[])k.name===v.name&&(P=k.seqId,fe.debug?.("Using sequence id from proxy node",Se.name,P))}return g.push(R),ie.get(R)>P&&(P=ie.get(R),fe.debug?.("Updating start time from more recent txn recorded",Se.name,P)),{name:v.name,replicateByDefault:w,tables:A,startTime:P,endTime:v.end_time}});if(tt)if(fe.debug?.(s,"sending subscription request",tt,h?.dbisDB?.path),clearTimeout(ne),tt.length>0)e.send((0,ct.encode)([mB,tt]));else{let v=a(()=>{let p=performance.now();ne=setTimeout(()=>{Q<=p?is(1008,"No nodes to subscribe to"):v()},V)},"schedule_close");v()}}a(qa,"sendSubscriptionRequestUpdate");function Yi(ie,Se){if(!ie)return;let tt=wn[ie];return tt||(tt=Se.getResidencyRecord(ie),wn[ie]=tt),tt}a(Yi,"getResidence");function $a(ie){return!(ca&&ca!="*"&&!ca[ie]&&!ca.includes?.(ie)&&!ca.some?.(Se=>Se.name===ie))}a($a,"checkDatabaseAccess");function Va(ie){if(h=h||d.get(ie),!$a(ie))throw new Error(`Access to database "${ie}" is not permitted`);h||fe.warn?.(`No database named "${ie}" was declared and registered`),_=h?.auditStore,T||(T=ut()?.[ie]);let Se=ot();if(Se===S)throw Se?new Error("Should not connect to self",Se):new Error("Node name not defined");return Cd(Se,ie),!0}a(Va,"setDatabase");function Cd(ie,Se){let tt=ut()?.[Se],v=[];for(let p in tt){let A=tt[p];v.push({table:p,schemaDefined:A.schemaDefined,attributes:A.attributes.map(w=>({name:w.name,type:w.type,isPrimaryKey:w.isPrimaryKey}))})}fe.trace?.("Sending database info for node",ie,"database name",Se),e.send((0,ct.encode)([SB,ie,Se,v]))}a(Cd,"sendNodeDBName");function Ir(ie){let Se=ut()?.[ie],tt=[];for(let v in Se){if(vs&&!vs.some(A=>A.replicateByDefault?!A.tables.includes(v):A.tables.includes(v)))continue;let p=Se[v];tt.push({table:v,schemaDefined:p.schemaDefined,attributes:p.attributes.map(A=>({name:A.name,type:A.type,isPrimaryKey:A.isPrimaryKey}))})}e.send((0,ct.encode)([OB,tt,ie]))}a(Ir,"sendDBSchema");let Nl=1,Pd=[];return{end(){Ga&&Ga.end(),Us&&Us.emit("close")},getRecord(ie){let Se=Nl++;return new Promise((tt,v)=>{let p=[AB,Se,ie.table.tableId,ie.id];Pd[ie.table.tableId]||(p.push(ie.table.tableName),Pd[ie.table.tableId]=!0),e.send((0,ct.encode)(p)),m.set(Se,{tableId:ie.table.tableId,key:ie.id,resolve(A){let{table:w,entry:R}=ie;tt(A),A&&w._recordRelocate(R,A)},reject:v})})},sendOperation(ie){let Se=Nl++;return ie.requestId=Se,e.send((0,ct.encode)([RB,ie])),new Promise((tt,v)=>{m.set(Se,{resolve:tt,reject:v})})}};function di(ie){Ho(5),ie<128?o[c++]=ie:ie<16384?(l.setUint16(c,ie|32768),c+=2):ie<1056964608?(l.setUint32(c,ie|3221225472),c+=4):(o[c]=255,l.setUint32(c+1,ie),c+=5)}function Dd(ie,Se=0,tt=ie.length){let v=tt-Se;Ho(v),ie.copy(o,c,Se,tt),c+=v}function Ka(ie){Ho(8),l.setFloat64(c,ie),c+=8}function Ho(ie){if(ie+16>o.length-c){let Se=Buffer.allocUnsafeSlow(c+ie-i+65536>>10<<11);o.copy(Se,0,i,c),c=c-i,i=0,o=Se,l=new DataView(o.buffer,0,o.length)}}}function Oy(e,t){let r=e.database??"data";if(r!=="data"&&!We[r]){fe.warn?.("Database not found",e.database);return}t||(t={});let n=!1,s=e.schemaDefined,i=t.attributes||[];for(let o=0;o<e.attributes?.length;o++){let c=e.attributes[o],l=i[o];(!l||l.name!==c.name||l.type!==c.type)&&(n=!0,s||(c.indexed=!0),i[o]=c)}return n?(fe.debug?.("(Re)creating",e),Et({table:e.table,database:e.database,schemaDefined:e.schemaDefined,attributes:i,...t})):t}var CB,PB,ct,DB,LB,fe,Ny,MB,UB,Iy,vB,mB,SB,TB,_u,gB,yy,AB,wp,RB,Cp,yB,bB,OB,BB,yc,W_,NB,Vee,IB,by,wB,Pp,HB=Ie(()=>{Pe();ji();YR();JR();us();CB=L(se()),PB=L(M());Ll();ct=require("msgpackr"),DB=require("ws"),LB=require("worker_threads"),fe=L(Sc());B_();Ny=require("events"),MB=L(Js()),UB=L(require("node:tls"));su();Iy=L(require("node:process")),vB=require("node:net");wi();mB=129,SB=140,TB=141,_u=142,gB=130,yy=132,AB=133,wp=134,RB=136,Cp=137,yB=143,bB=144,OB=145,BB=new Map,yc=new Map,W_=!0,NB=300,Vee=2,IB=3e4;a(wy,"createWebSocket");wB=1e3,Pp=class extends Ny.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??js(r)}static{a(this,"NodeReplicationConnection")}socket;startTime;retryTime=wB;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions=[];latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await wy(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;fe.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${Iy.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),fe.info?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=wB,Tc({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,n=Lp(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"?(fe.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"?fe.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`):fe.error?.(`Error in connection to ${this.url} due to ${s.message}`)),this.sessionReject(s)}),this.socket.on("close",(s,i)=>{if(this.isConnected&&(au({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();fe.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(Lp,"replicateOverWS");a(Oy,"ensureTableIfChanged")});var oa={};je(oa,{clearThisNodeName:()=>Xee,disableReplication:()=>jee,enabled_databases:()=>ca,forEachReplicatedDatabase:()=>Zo,getThisNodeId:()=>Mp,getThisNodeName:()=>ot,getThisNodeUrl:()=>ea,hostnameToUrl:()=>Hp,lastTimeInAuditStore:()=>M_,monitorNodeCAs:()=>KB,replicateOperation:()=>ete,replication_certificate_authorities:()=>bc,sendOperationToNode:()=>Q_,servers:()=>Yee,setReplicator:()=>WB,start:()=>Wee,startOnMainThread:()=>ZR,subscribeToNode:()=>ou,unsubscribeFromNode:()=>Tp,urlToNodeName:()=>js});function Wee(e){if(e.port||(e.port=hs.default.get(Ic.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=hs.default.get(Ic.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)),!ot())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let n of v_(e))t.set(js(n.url),n);zee(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=it.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(),Lp(n,e,s?.user),n.on("error",c=>{c.code!=="ECONNREFUSED"&&Sr.error("Error in connection to "+this.url,c.message)})},e);e.runFirst=!0,it.http((n,s)=>{if(n.isWebSocket&&n.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){!n.authorized&&n._nodeRequest.socket.authorizationError&&Sr.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=pr().primaryStore;if(n.authorized&&n.peerCertificate.subject){let o=n.peerCertificate.subject,c=o&&(i.get(o.CN)||t.get(o.CN));c?n.user=c:Sr.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:Sr.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(bc);o.options.availableCAs&&c.push(...o.options.availableCAs.values());let l={...o.options,ca:c};o.replicationContext=Bp.createSecureContext(l)}catch(c){Sr.error("Error creating replication TLS config",c)}},"updateContexts");n.secureContextsListeners.push(s),KB(s),hs.default.get(Ic.CONFIG_PARAMS.REPLICATION_ENABLEROOTCAS)!==!1&&s()}}function KB(e){let t=0;nu(r=>{r?.ca&&(bc.add(r.ca),bc.size!==t&&(t=bc.size,e?.()))})}function jee(e=!0){VB=e}function zee(e){VB||(ut(),ca=e.databases,Zo(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||yc;for(let[s,i]of z_){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];WB(r,s,e),BB.get(s)?.forEach(i=>i(s))}}))}function WB(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 YB extends Dr{static{a(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||yc,o=i.get(e),c=o?.tableById||[];c[t.tableId]=t;let l=o?.ready;if(Sr.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new Dn,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 d;for(let E of c){let f=Qee(E,YB.subscription,e);f?.isConnected&&!u.has(f)&&(!d||f.latency<d.latency)&&(d=f)}if(!d)throw l||new qB.ServerError("No connection to any other nodes are available",502);let _={requestId:Kee++,table:t,entry:i,id:i.key};u.add(d);try{return await d.getRecord(_)}catch(E){if(d.isConnected)throw E;Sr.warn("Error in load from node",vp,E),l||(l=E)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function jB(e,t,r,n,s){let i=z_.get(e);i||z_.set(e,i=new Map);let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new Pp(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function Qee(e,t,r){let n=xB.get(e)?.get(r);if(n)return n;let s=pr().primaryStore.get(e);return s?.url&&(n=jB(s.url,t,r,e,s.authorization),xB.set(e,z_.get(s.url))),n}async function Q_(e,t,r){r||(r={}),r.serverName=e.name;let n=await wy(e.url,r),s=Lp(n,{},{});return new Promise((i,o)=>{n.on("open",()=>{i(s.sendOperation(t))}),n.on("error",c=>{o(c)}),n.on("close",c=>{Sr.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function ou(e){try{$B.isMainThread&&Sr.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=yc.get(e.database);if(!t){let n;t=new Promise(s=>{Sr.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,yc.set(e.database,t)}let r=jB(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=>U_(n,e.database)),e.replicateByDefault)}catch(t){Sr.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function Tp({name:e,url:t,database:r}){Sr.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(pr().primaryStore.getRange({})));let n=z_.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Jee(){if(Py!==void 0)return Py;let e=hs.default.get(Ic.CONFIG_PARAMS.OPERATIONSAPI_TLS_CERTIFICATE)||hs.default.get(Ic.CONFIG_PARAMS.TLS_CERTIFICATE);if(e)return Py=new FB.X509Certificate((0,GB.readFileSync)(e)).subject.match(/CN=(.*)/)?.[1]??null}function ot(){return vp||(vp=hs.default.get("replication_hostname")??js(hs.default.get("replication_url"))??Jee()??kB("operationsapi_network_secureport")??kB("operationsapi_network_port")??"127.0.0.1")}function Xee(){vp=void 0}function kB(e){let t=hs.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function Up(e){let t=hs.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function Mp(e){return L_(e)?.[ot()]}function ea(){let e=hs.default.get("replication_url");return e||Hp(ot())}function Hp(e){let t=Up("replication_port");if(t)return`ws://${e}:${t}`;if(t=Up("replication_secureport"),t)return`wss://${e}:${t}`;if(t=Up("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=Up("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function js(e){if(e)return new URL(e).hostname}function Zo(e,t){for(let n of Object.getOwnPropertyNames(We))r(n);return j_(n=>{r(n)}),Nc((n,s)=>{r(n.databaseName)});function r(n){let s=We[n];Sr.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):Zee(n)&&t(s,n,!1)}a(r,"forDatabase")}function Zee(e){let t=We[e];for(let r in t)if(t[r].replicate)return!0}function M_(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function ete(e){let t={message:""};if(e.replicated){e.replicated=!1,Sr.trace?.("Replicating operation",e.operation,"to nodes",it.nodes.map(n=>n.name));let r=await Promise.allSettled(it.nodes.map(n=>Q_(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=it.nodes[s]?.name,i})}return t}var hs,Sr,FB,GB,Ic,Bp,qB,$B,VB,Kee,Yee,bc,ca,z_,xB,Py,vp,us=Ie(()=>{Pe();Vs();Cl();HB();qr();hs=L(se()),Sr=L(j()),FB=require("crypto"),GB=require("fs");B_();su();Ic=L(M());YR();Bp=L(require("node:tls")),qB=L(_e()),$B=require("worker_threads"),Kee=1,Yee=[],bc=hs.default.get(Ic.CONFIG_PARAMS.REPLICATION_ENABLEROOTCAS)!==!1?new Set(Bp.rootCertificates):new Set;a(Wee,"start");a(KB,"monitorNodeCAs");a(jee,"disableReplication");a(zee,"assignReplicationSource");a(WB,"setReplicator");z_=new Map;a(jB,"getConnection");xB=new Map;a(Qee,"getConnectionByName");a(Q_,"sendOperationToNode");a(ou,"subscribeToNode");a(Tp,"unsubscribeFromNode");a(Jee,"getCommonNameFromCert");a(ot,"getThisNodeName");a(Xee,"clearThisNodeName");Object.defineProperty(it,"hostname",{get(){return ot()}});a(kB,"getHostFromListeningPort");a(Up,"getPortFromListeningPort");a(Mp,"getThisNodeId");it.replication={getThisNodeId:Mp,exportIdMapping:L_};a(ea,"getThisNodeUrl");a(Hp,"hostnameToUrl");a(js,"urlToNodeName");a(Zo,"forEachReplicatedDatabase");a(Zee,"hasExplicitlyReplicatedTable");a(M_,"lastTimeInAuditStore");a(ete,"replicateOperation")});var Gp=N((kNe,ZB)=>{"use strict";var fu=Oh(),Eu=Zv(),tte=j(),rte=require("uuid").v4,xNe=require("clone"),kp=eo(),hu=M(),nte=require("util"),la=Un(),{handleHDBError:mn,hdb_errors:ste}=_e(),{HDB_ERROR_MSGS:xp,HTTP_STATUS_CODES:Sn}=ste,{SchemaEventMsg:Fp}=qs(),zB=Tr(),{getDatabases:ite}=(Pe(),oe(lt)),{transformReq:pu}=re(),{replicateOperation:QB}=(us(),oe(oa));ZB.exports={createSchema:ote,createSchemaStructure:JB,createTable:ate,createTableStructure:XB,createAttribute:_te,dropSchema:cte,dropTable:lte,dropAttribute:ute,getBackup:fte};async function ote(e){let t=await JB(e);return kp.signalSchemaChange(new Fp(process.pid,e.operation,e.schema)),t}a(ote,"createSchema");async function JB(e){let t=fu.schema_object(e);if(t)throw mn(t,t.message,Sn.BAD_REQUEST,void 0,void 0,!0);if(pu(e),!await Eu.checkSchemaExists(e.schema))throw mn(new Error,xp.SCHEMA_EXISTS_ERR(e.schema),Sn.BAD_REQUEST,hu.LOG_LEVELS.ERROR,xp.SCHEMA_EXISTS_ERR(e.schema),!0);return await la.createSchema(e),`database '${e.schema}' successfully created`}a(JB,"createSchemaStructure");async function ate(e){return pu(e),e.hash_attribute=e.primary_key??e.hash_attribute,await XB(e)}a(ate,"createTable");async function XB(e){let t=fu.create_table_object(e);if(t)throw mn(t,t.message,Sn.BAD_REQUEST,void 0,void 0,!0);if(fu.validateTableResidence(e.residence),!await Eu.checkSchemaTableExists(e.schema,e.table))throw mn(new Error,xp.TABLE_EXISTS_ERR(e.schema,e.table),Sn.BAD_REQUEST,hu.LOG_LEVELS.ERROR,xp.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:rte(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await la.createTable(n,e);else throw mn(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Sn.BAD_REQUEST);else await la.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}a(XB,"createTableStructure");async function cte(e){let t=!e.schema&&!e.database?new Error("database is required"):void 0,r=fu.schema_object(e),n=t??r;if(n)throw mn(n,n.message,Sn.BAD_REQUEST,void 0,void 0,!0);pu(e);let s=await Eu.checkSchemaExists(e.schema);if(s)throw mn(new Error,s,Sn.NOT_FOUND,hu.LOG_LEVELS.ERROR,s,!0);let i=await Eu.schema_describe.describeSchema({schema:e.schema}),o=Object.keys(global.hdb_schema[e.schema]);await la.dropSchema(e),kp.signalSchemaChange(new Fp(process.pid,e.operation,e.schema)),await zB.purgeSchemaTableStreams(e.schema,o);let c=await QB(e);return c.message=`successfully deleted '${e.schema}'`,c}a(cte,"dropSchema");async function lte(e){let t=fu.table_object(e);if(t)throw mn(t,t.message,Sn.BAD_REQUEST,void 0,void 0,!0);pu(e);let r=await Eu.checkSchemaTableExists(e.schema,e.table);if(r)throw mn(new Error,r,Sn.NOT_FOUND,hu.LOG_LEVELS.ERROR,r,!0);await la.dropTable(e),await zB.purgeTableStream(e.schema,e.table);let n=await QB(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(lte,"dropTable");async function ute(e){let t=fu.attribute_object(e);if(t)throw mn(t,t.message,Sn.BAD_REQUEST,void 0,void 0,!0);pu(e);let r=await Eu.checkSchemaTableExists(e.schema,e.table);if(r)throw mn(new Error,r,Sn.NOT_FOUND,hu.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw mn(new Error,"You cannot drop a hash attribute",Sn.BAD_REQUEST,void 0,void 0,!0);if(hu.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw mn(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Sn.BAD_REQUEST,void 0,void 0,!0);try{return await la.dropAttribute(e),dte(e),kp.signalSchemaChange(new Fp(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw tte.error(`Got an error deleting attribute ${nte.inspect(e)}.`),n}}a(ute,"dropAttribute");function dte(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(dte,"dropAttributeFromGlobal");async function _te(e){pu(e);let t=ite()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw mn(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Sn.BAD_REQUEST,void 0,void 0,!0);return await la.createAttribute(e),kp.signalSchemaChange(new Fp(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(_te,"createAttribute");function fte(e){return la.getBackup(e)}a(fte,"getBackup")});var tH=N((GNe,eH)=>{"use strict";var{OPERATIONS_ENUM:Ete}=M(),Dy=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Ete.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};eH.exports=Dy});var Ly=N((VNe,oH)=>{"use strict";var hte=Un(),$Ne=tH(),qp=re(),$p=M(),pte=se(),{handleHDBError:rH,hdb_errors:mte}=_e(),{HDB_ERROR_MSGS:nH,HTTP_STATUS_CODES:sH}=mte,Ste=Object.values($p.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),iH="To use this operation audit log must be enabled in harperdb-config.yaml";oH.exports=Tte;async function Tte(e){if(qp.isEmpty(e.schema))throw new Error(nH.SCHEMA_REQUIRED_ERR);if(qp.isEmpty(e.table))throw new Error(nH.TABLE_REQUIRED_ERR);if(!pte.get($p.CONFIG_PARAMS.LOGGING_AUDITLOG))throw rH(new Error,iH,sH.BAD_REQUEST,$p.LOG_LEVELS.ERROR,iH,!0);let t=qp.checkSchemaTableExist(e.schema,e.table);if(t)throw rH(new Error,t,sH.NOT_FOUND,$p.LOG_LEVELS.ERROR,t,!0);if(!qp.isEmpty(e.search_type)&&Ste.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await hte.readAuditLog(e)}a(Tte,"readAuditLog")});var cH=N((YNe,aH)=>{"use strict";var{OPERATIONS_ENUM:gte}=M(),My=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=gte.GET_BACKUP,this.schema=t,this.table=r}};aH.exports=My});var dH=N((QNe,uH)=>{"use strict";var Ate=Un(),jNe=cH(),Uy=re(),Rte=M(),zNe=se(),{handleHDBError:yte,hdb_errors:bte}=_e(),{HDB_ERROR_MSGS:lH,HTTP_STATUS_CODES:Ote}=bte;uH.exports=Nte;async function Nte(e){if(Uy.isEmpty(e.schema))throw new Error(lH.SCHEMA_REQUIRED_ERR);if(Uy.isEmpty(e.table))throw new Error(lH.TABLE_REQUIRED_ERR);let t=Uy.checkSchemaTableExist(e.schema,e.table);if(t)throw yte(new Error,t,Ote.NOT_FOUND,Rte.LOG_LEVELS.ERROR,t,!0);return await Ate.getBackup(read_audit_log_object)}a(Nte,"getBackup")});var mH=N((XNe,pH)=>{var mu=require("validate.js"),fH=gt(),Su=M(),{handleHDBError:Ite,hdb_errors:wte}=_e(),{HDB_ERROR_MSGS:Qt,HTTP_STATUS_CODES:Cte}=wte,vy=a(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Pte={STRUCTURE_USER:"structure_user"},_H=Object.values(Su.ROLE_TYPES_ENUM),Dte="attribute_permissions",Lte="attribute_name",{PERMS_CRUD_ENUM:Tu}=Su,Mte=[Dte,...Object.values(Tu)],EH=[Tu.READ,Tu.INSERT,Tu.UPDATE],Ute=[Lte,...EH];function vte(e){let t=vy();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,hH(e,t)}a(vte,"addRoleValidation");function Bte(e){let t=vy();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,hH(e,t)}a(Bte,"alterRoleValidation");function Hte(e){let t=vy();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,fH.validateObject(e,t)}a(Hte,"dropRoleValidation");var xte=["operation","role","id","permission","hdb_user","hdb_auth_header","access"];function hH(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let o=0,c=n.length;o<c;o++)xte.includes(n[o])||s.push(n[o]);s.length>0&&ir(Qt.INVALID_ROLE_JSON_KEYS(s),r);let i=fH.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{ir(o,r)}),e.permission){let o=kte(e);o&&ir(o,r),_H.forEach(c=>{e.permission[c]&&!mu.isBoolean(e.permission[c])&&ir(Qt.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let o in e.permission)if(_H.indexOf(o)<0){if(o===Pte.STRUCTURE_USER){let l=e.permission[o];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,d=l.length;u<d;u++){let _=l[u];global.hdb_schema[_]||ir(Qt.SCHEMA_NOT_FOUND(_),r)}continue}ir(Qt.STRUCTURE_USER_ROLE_TYPE_ERROR(o),r);continue}let c=e.permission[o];if(!o||!global.hdb_schema[o]){ir(Qt.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]){ir(Qt.TABLE_NOT_FOUND(o,l),r);continue}if(Object.keys(u).forEach(d=>{Mte.includes(d)||ir(Qt.INVALID_PERM_KEY(d),r,o,l)}),Object.values(Tu).forEach(d=>{mu.isDefined(u[d])?mu.isBoolean(u[d])||ir(Qt.TABLE_PERM_NOT_BOOLEAN(d),r,o,l):ir(Qt.TABLE_PERM_MISSING(d),r,o,l)}),u.attribute_permissions===void 0){ir(Qt.ATTR_PERMS_ARRAY_MISSING,r,o,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){ir(Qt.ATTR_PERMS_NOT_ARRAY,r,o,l);continue}if(u.attribute_permissions){let d=global.hdb_schema[o][l].attributes.map(({attribute:E})=>E),_={read:!1,insert:!1,update:!1};for(let E in u.attribute_permissions){let f=u.attribute_permissions[E];if(Object.keys(f).forEach(T=>{!Ute.includes(T)&&T!==Tu.DELETE&&ir(Qt.INVALID_ATTR_PERM_KEY(T),r,o,l)}),!mu.isDefined(f.attribute_name)){ir(Qt.ATTR_PERM_MISSING_NAME,r,o,l);continue}let h=f.attribute_name;if(!d.includes(h)){ir(Qt.INVALID_ATTRIBUTE_IN_PERMS(h),r,o,l);continue}EH.forEach(T=>{mu.isDefined(f[T])?mu.isBoolean(f[T])||ir(Qt.ATTR_PERM_NOT_BOOLEAN(T,h),r,o,l):ir(Qt.ATTR_PERM_MISSING(T,h),r,o,l)}),!_.read&&f.read===!0&&(_.read=!0),!_.insert&&f.insert===!0&&(_.insert=!0),!_.update&&f.update===!0&&(_.update=!0)}if(u.read===!1&&_.read===!0||u.insert===!1&&_.insert===!0||u.update===!1&&_.update===!0){let E=`${o}.${l}`;ir(Qt.MISMATCHED_TABLE_ATTR_PERMS(E),r,o,l)}}}}return Fte(r)}a(hH,"customValidate");pH.exports={addRoleValidation:vte,alterRoleValidation:Bte,dropRoleValidation:Hte};function kte(e){let{operation:t,permission:r}=e;if(t===Su.OPERATIONS_ENUM.ADD_ROLE||t===Su.OPERATIONS_ENUM.ALTER_ROLE){let n=r.super_user===!0,s=r.cluster_user===!0;if(Object.keys(r).length>1&&(n||s)){if(s&&n)return Qt.SU_CU_ROLE_COMBINED_ERROR;{let o=r.super_user?Su.ROLE_TYPES_ENUM.SUPER_USER:Su.ROLE_TYPES_ENUM.CLUSTER_USER;return Qt.SU_CU_ROLE_NO_PERMS_ALLOWED(o)}}}return null}a(kte,"validateNoSUPerms");function Fte(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:Qt.ROLE_PERMS_ERROR,...e};return Ite(new Error,n,Cte.BAD_REQUEST)}else return null}a(Fte,"generateRolePermResponse");function ir(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(ir,"addPermError")});var X_=N((tIe,AH)=>{"use strict";var SH=cn(),TH=$r(),Gte=oc(),Hy=mH(),xy=eo(),eIe=require("uuid").v4,qte=require("util"),Vp=M(),$te=re(),ky=TH.searchByValue,Vte=TH.searchByHash,Kte=qte.promisify(Gte.delete),Yte=$s(),Wte=Wl(),{hdb_errors:jte,handleHDBError:wc}=_e(),{HDB_ERROR_MSGS:gH,HTTP_STATUS_CODES:J_}=jte,{UserEventMsg:Fy}=qs();AH.exports={addRole:zte,alterRole:Qte,dropRole:Jte,listRoles:Xte};function By(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(By,"scrubRoleDetails");async function zte(e){let t=Hy.addRoleValidation(e);if(t)throw t;e=By(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 ky(r)||[])}catch(i){throw wc(i)}if(n&&n.length>0)throw wc(new Error,gH.ROLE_ALREADY_EXISTS(e.role),J_.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 SH.insert(s),xy.signalUserChange(new Fy(process.pid)),e=By(e),e}a(zte,"addRole");async function Qte(e){let t=Hy.alterRoleValidation(e);if(t)throw t;e=By(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await SH.update(r)}catch(s){throw wc(s)}if(n&&n?.message==="updated 0 of 1 records")throw wc(new Error,"Invalid role id",J_.BAD_REQUEST,void 0,void 0,!0);return await xy.signalUserChange(new Fy(process.pid)),e}a(Qte,"alterRole");async function Jte(e){let t=Hy.dropRoleValidation(e);if(t)throw wc(new Error,t,J_.BAD_REQUEST,void 0,void 0,!0);let r=new Wte(Vp.SYSTEM_SCHEMA_NAME,Vp.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Vte(r));if(n.length===0)throw wc(new Error,gH.ROLE_NOT_FOUND,J_.NOT_FOUND,void 0,void 0,!0);let s=new Yte(Vp.SYSTEM_SCHEMA_NAME,Vp.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await ky(s)),o=!1;if($te.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){o=!0;break}}if(o===!0)throw wc(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,J_.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Kte(c),xy.signalUserChange(new Fy(process.pid)),`${n[0].role} successfully deleted`}a(Jte,"dropRole");async function Xte(){return ky({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}a(Xte,"listRoles")});var OH=N((nIe,bH)=>{"use strict";var Zte=se(),ua=require("joi"),ere=gt(),RH=require("moment"),tre=require("fs-extra"),Gy=require("path"),rre=require("lodash"),Z_=M(),{LOG_LEVELS:Cc}=M(),nre="YYYY-MM-DD hh:mm:ss",sre=Gy.resolve(__dirname,"../logs");bH.exports=function(e){return ere.validateBySchema(e,ire)};var ire=ua.object({from:ua.custom(yH),until:ua.custom(yH),level:ua.valid(Cc.NOTIFY,Cc.FATAL,Cc.ERROR,Cc.WARN,Cc.INFO,Cc.DEBUG,Cc.TRACE),order:ua.valid("asc","desc"),limit:ua.number().min(1),start:ua.number().min(0),log_name:ua.custom(ore)});function yH(e,t){if(RH(e,RH.ISO_8601).format(nre)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(yH,"validateDatetime");function ore(e,t){if(rre.invert(Z_.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Zte.get(Z_.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?Z_.LOG_NAMES.HDB:e,i=s===Z_.LOG_NAMES.INSTALL?Gy.join(sre,Z_.LOG_NAMES.INSTALL):Gy.join(n,s);return tre.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(ore,"validateReadLogPath")});var $y=N((iIe,IH)=>{"use strict";var Kp=M(),are=j(),cre=se(),lre=OH(),qy=require("path"),NH=require("fs-extra"),{once:ure}=require("events"),{handleHDBError:dre,hdb_errors:_re}=_e(),{PACKAGE_ROOT:fre}=M(),Ere=qy.join(fre,"logs"),hre=1e3,pre=200;IH.exports=mre;async function mre(e){let t=lre(e);if(t)throw dre(t,t.message,_re.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=cre.get(Kp.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?Kp.LOG_NAMES.HDB:e.log_name,s=n===Kp.LOG_NAMES.INSTALL?qy.join(Ere,Kp.LOG_NAMES.INSTALL):qy.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,d=u?new Date(e.until):void 0,_=e.limit===void 0?hre:e.limit,E=e.order===void 0?void 0:e.order,f=e.start===void 0?0:e.start,h=f+_,T=0;E==="desc"&&!l&&!d&&(T=Math.max(NH.statSync(s).size-(h+5)*pre,0));let m=NH.createReadStream(s,{start:T});m.on("error",H=>{are.error(H)});let g=0,S=[],y="",I;m.on("data",H=>{let X=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;H=y+H;let Y=0,V;for(;(V=X.exec(H))&&!m.destroyed;){I&&(I.message=H.slice(Y,V.index),U(I));let[ne,Q,de]=V,W=de.split("] ["),ae=W[0],Oe=W[1];W.splice(0,2),I={timestamp:Q,thread:ae,level:Oe,tags:W,message:""},Y=V.index+ne.length}y=H.slice(Y)}),m.on("end",H=>{m.destroyed||I&&(I.message=y.trim(),U(I))}),m.resume();function U(H){let X,Y,V;switch(!0){case(i&&c&&u):X=new Date(H.timestamp),Y=new Date(l),V=new Date(d),H.level===o&&X>=Y&&X<=V&&g<f?g++:H.level===o&&X>=Y&&X<=V&&(da(H,E,S),g++,g===h&&m.destroy());break;case(i&&c):X=new Date(H.timestamp),Y=new Date(l),H.level===o&&X>=Y&&g<f?g++:H.level===o&&X>=Y&&(da(H,E,S),g++,g===h&&m.destroy());break;case(i&&u):X=new Date(H.timestamp),V=new Date(d),H.level===o&&X<=V&&g<f?g++:H.level===o&&X<=V&&(da(H,E,S),g++,g===h&&m.destroy());break;case(c&&u):X=new Date(H.timestamp),Y=new Date(l),V=new Date(d),X>=Y&&X<=V&&g<f?g++:X>=Y&&X<=V&&(da(H,E,S),g++,g===h&&m.destroy());break;case i:H.level===o&&g<f?g++:H.level===o&&(da(H,E,S),g++,g===h&&m.destroy());break;case c:X=new Date(H.timestamp),Y=new Date(l),X>=Y&&g<f?g++:X>=Y&&g>=f&&(da(H,E,S),g++,g===h&&m.destroy());break;case u:X=new Date(H.timestamp),V=new Date(d),X<=V&&g<f?g++:X<=V&&g>=f&&(da(H,E,S),g++,g===h&&m.destroy());break;default:g<f?g++:(da(H,E,S),g++,g===h&&m.destroy())}}return a(U,"onLogMessage"),await ure(m,"close"),S}a(mre,"readLog");function da(e,t,r){t==="desc"?Sre(e,r):t==="asc"?Tre(e,r):r.push(e)}a(da,"pushLineToResult");function Sre(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(Sre,"insertDescending");function Tre(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(Tre,"insertAscending")});var Yp=N((dIe,DH)=>{"use strict";var Vy=require("joi"),{string:gu,boolean:wH,date:gre}=Vy.types(),Are=gt(),{validateSchemaExists:aIe,validateTableExists:cIe,validateSchemaName:lIe}=Si(),Rre=M(),yre=It(),CH=se();CH.initSync();var uIe=gu.invalid(CH.get(Rre.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(yre.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),PH={operation:gu.valid("add_node","update_node","set_node_replication"),node_name:gu.optional(),subscriptions:Vy.array().items({table:gu.optional(),schema:gu.optional(),database:gu.optional(),subscribe:wH.required(),publish:wH.required().custom(Ore),start_time:gre.iso()})};function bre(e){return Are.validateBySchema(e,Vy.object(PH))}a(bre,"addUpdateNodeValidator");function Ore(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(Ore,"checkForFalsy");DH.exports={addUpdateNodeValidator:bre,validation_schema:PH}});var MH=N((fIe,LH)=>{var Nre=gt(),Ire={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};LH.exports=function(e){return Nre.validateObject(e,Ire)}});var Ky=N((hIe,BH)=>{"use strict";var wre=MH(),Au=require("passport"),Cre=require("passport-local").Strategy,Pre=require("passport-http").BasicStrategy,Dre=require("util"),Lre=xn(),vH=Dre.callbackify(Lre.findAndValidateUser),EIe=Pn(),Mre=M(),UH=cu();Au.use(new Cre(function(e,t,r){vH(e,t,r)}));Au.use(new Pre(function(e,t,r){vH(e,t,r)}));Au.serializeUser(function(e,t){t(null,e)});Au.deserializeUser(function(e,t){t(null,e)});function Ure(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":Au.authenticate("basic",{session:!1},(o,c)=>{i(o,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===Mre.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?UH.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):UH.validateOperationToken(s).then(o=>{r(null,o)}).catch(o=>{r(o)});break;default:Au.authenticate("local",{session:!1},function(o,c){i(o,c)})(e,t,r);break}}a(Ure,"authorize");function vre(e,t){let r=wre(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(vre,"checkPermissions");BH.exports={authorize:Ure,checkPermissions:vre}});var Ru=N((mIe,HH)=>{"use strict";var Yy=class{static{a(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},Wy=class{static{a(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};HH.exports={Node:Yy,NodeSubscription:Wy}});var kH=N((TIe,xH)=>{"use strict";var Bre=M().OPERATIONS_ENUM,jy=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Bre.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};xH.exports=jy});var ef=N((AIe,FH)=>{"use strict";var zy=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},Qy=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)}};FH.exports={RemotePayloadObject:zy,RemotePayloadSubscription:Qy}});var qH=N((yIe,GH)=>{"use strict";var Jy=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}};GH.exports=Jy});var VH=N((CIe,$H)=>{"use strict";var Hre=qH(),OIe=Ht(),NIe=ht(),xre=j(),{getSchemaPath:IIe,getTransactionAuditStorePath:wIe}=Tt(),{getDatabases:kre}=(Pe(),oe(lt));$H.exports=Fre;async function Fre(e){let t=new Hre;try{let r=kre()[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){xre.warn(`unable to stat table dbi due to ${r}`)}return t}a(Fre,"lmdbGetTableSize")});var YH=N((DIe,KH)=>{"use strict";var Xy=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}};KH.exports=Xy});var bu=N((HIe,QH)=>{"use strict";var Gre=require("fs-extra"),qre=require("path"),jr=require("systeminformation"),_a=j(),WH=Tr(),MIe=It(),yu=M(),$re=VH(),Vre=Zi(),{getThreadInfo:jH}=dt(),tf=se();tf.initSync();var Kre=YH(),{openEnvironment:UIe}=ht(),{getSchemaPath:vIe}=Tt(),{database:BIe,databases:Zy}=(Pe(),oe(lt)),Wp;QH.exports={getHDBProcessInfo:nb,getNetworkInfo:ib,getDiskInfo:sb,getMemoryInfo:rb,getCPUInfo:tb,getTimeInfo:eb,getSystemInformation:ob,systemInformation:Yre,getTableSize:ab,getMetrics:cb};function eb(){return jr.time()}a(eb,"getTimeInfo");async function tb(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:o,governor:c,socket:l,cache:u,...d}=await jr.cpu();d.cpu_speed=await jr.cpuCurrentSpeed();let{raw_currentload:_,raw_currentload_idle:E,raw_currentload_irq:f,raw_currentload_nice:h,raw_currentload_system:T,raw_currentload_user:m,cpus:g,...S}=await jr.currentLoad();return S.cpus=[],g.forEach(y=>{let{raw_load:I,raw_load_idle:U,raw_load_irq:H,raw_load_nice:X,raw_load_system:Y,raw_load_user:V,...ne}=y;S.cpus.push(ne)}),d.current_load=S,d}catch(e){return _a.error(`error in getCPUInfo: ${e}`),{}}}a(tb,"getCPUInfo");async function rb(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await jr.mem();return Object.assign(s,process.memoryUsage())}catch(e){return _a.error(`error in getMemoryInfo: ${e}`),{}}}a(rb,"getMemoryInfo");async function nb(){let e={core:[],clustering:[]};try{let t=await jr.processes(),r;try{r=Number.parseInt(await Gre.readFile(qre.join(tf.get(yu.CONFIG_PARAMS.ROOTPATH),yu.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===yu.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(nb,"getHDBProcessInfo");async function sb(){let e={};try{if(!tf.get(yu.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await jr.disksIO();e.io=i;let{rx_sec:o,tx_sec:c,wx_sec:l,...u}=await jr.fsStats();return e.read_write=u,e.size=await jr.fsSize(),e}catch(t){return _a.error(`error in getDiskInfo: ${t}`),e}}a(sb,"getDiskInfo");async function ib(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return tf.get(yu.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await jr.networkInterfaceDefault(),e.latency=await jr.inetChecksite("google.com"),(await jr.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:o,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrier_changes:_,...E}=n;e.interfaces.push(E)}),(await jr.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(ib,"getNetworkInfo");async function ob(){if(Wp!==void 0)return Wp;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:o,...c}=await jr.osInfo();e=c;let l=await jr.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,Wp=e,Wp}catch(t){return _a.error(`error in getSystemInformation: ${t}`),e}}a(ob,"getSystemInformation");async function ab(){let e=[],t=await Vre.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await $re(n));return e}a(ab,"getTableSize");async function cb(){let e={};for(let t in Zy){let r=e[t]={},n=r.tables={};for(let s in Zy[t])try{let i=Zy[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,d,_]=l.trim().split(" ");return{pid:u,thread:d,txnid:_}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:_,overflowPages:E}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:_,overflowPages:E}}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(cb,"getMetrics");async function zH(){if(tf.get(yu.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await WH.getNATSReferences(),t=await WH.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(zH,"getNatsStreamInfo");async function Yre(e){let t=new Kre;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await ob(),t.time=eb(),t.cpu=await tb(),t.memory=await rb(),t.disk=await sb(),t.network=await ib(),t.harperdb_processes=await nb(),t.table_size=await ab(),t.metrics=await cb(),t.threads=await jH(),t.replication=await zH(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await ob();break;case"time":t.time=eb();break;case"cpu":t.cpu=await tb();break;case"memory":t.memory=await rb();break;case"disk":t.disk=await sb();break;case"network":t.network=await ib();break;case"harperdb_processes":t.harperdb_processes=await nb();break;case"table_size":t.table_size=await ab();break;case"database_metrics":case"metrics":t.metrics=await cb();break;case"threads":t.threads=await jH();break;case"replication":t.replication=await zH();break;default:break}return t}a(Yre,"systemInformation")});var Ou=N((kIe,Wre)=>{Wre.exports={name:"harperdb",version:"4.4.26",description:"HarperDB is a distributed database, caching service, streaming broker, and application development platform focused on performance and ease of use.",keywords:["database","nosql","api","distributed","broker","mqtt","real-time","enterprise","Fastify","NATS","HarperDB","Harper","clustering","replication","REST","WebSockets","decentralized","server-sent events","document store"],main:"harperdb.js",bin:{harperdb:"./bin/harperdb.js"},engines:{"minimum-node":"16.0.0","go-lang":"1.21.7","nats-server":"2.10.11"},exports:{".":"./index.js"},homepage:"https://www.harperdb.io/",bugs:"support@harperdb.io",author:{name:"HarperDB",email:"support@harperdb.io"},license:"SEE LICENSE IN LICENSE",scripts:{submodules:"git submodule update --init --recursive","cover:test":"pm2 kill && rimraf ./.nyc_output/* && node utility/devops/register.js --reset_license && nyc --no-clean --reporter=lcovonly npm run test:replication && nyc --no-clean --reporter=lcovonly npm run test:apitests && nyc --no-clean --reporter=lcovonly npm run test:resources && nyc --no-clean --reporter=lcovonly npm run test:logging && nyc --no-clean --reporter=lcovonly npm run test:upgrade && nyc --no-clean --reporter=lcovonly npm run test:nats && nyc --no-clean --reporter=lcovonly npm run test:cfserver && nyc --no-clean --reporter=lcovonly npm run test:hdbserver && nyc --no-clean --reporter=lcovonly npm run test:bin && nyc --no-clean --reporter=lcovonly npm run test:main && nyc --no-clean --reporter=lcovonly npm run test:security && nyc merge .nyc_output coverage.json && node ./utility/devops/register.js --reset_license",test:"pm2 kill && rimraf ./.nyc_output/* && node utility/devops/register.js --reset_license && npm run test:replication && npm run test:apitests && npm run test:resources && npm run test:logging && npm run test:upgrade && npm run test:nats && npm run test:cfserver && npm run test:hdbserver && npm run test:bin && npm run test:main && npm run test:security && nyc merge .nyc_output coverage.json && node ./utility/devops/register.js --reset_license","test:resources":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/resources/**/*.js' --config '../unitTests/.mocharc.json'","test:bin":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/bin/**/*.js' --config '../unitTests/.mocharc.json'","test:main":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/**/*.js' --config '../unitTests/.mocharc-main.json'","test:lmdbbridge":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/dataLayer/harperBridge/lmdbBridge/**/*.js' --config '../unitTests/.mocharc.json'","test:lmdbutility":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/utility/lmdb/**/*.js' --config '../unitTests/.mocharc.json'","test:hdbserver":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/server/harperdb/hdbServer-test.js' --config '../unitTests/.mocharc.json'","test:cfserver":"npm run submodules && cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/server/fastifyRoutes/customFunctionsServer-test.js' --config '../unitTests/.mocharc.json'","test:nats":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/server/nats/**/*.js' --config '../unitTests/.mocharc.json'","test:upgrade":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/upgrade/**/*.js' --config '../unitTests/.mocharc.json'","test:apitests":"pm2 kill && cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/apiTests/**/*-test.mjs' --config '../unitTests/.mocharc.json'","test:logging":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/utility/logging/*.js' --config '../unitTests/.mocharc.json'","test:ci":" cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/**/*.js' --retries 3 --config '../unitTests/.mocharc-main.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/dataLayer/harperBridge/lmdbBridge/**/*.js' --parallel --retries 3 --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/utility/lmdb/**/*.js' --parallel --retries 3 --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/server/harperdb/hdbServer-test.js' --parallel --retries 3 --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/server/customFunctions/customFunctionsServer-test.js' --parallel --retries 3 --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/upgrade/**/*.js' --parallel --retries 3 --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/server/nats/**/*.js' --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter","test:security":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/security/**/*.js' --config '../unitTests/.mocharc.json'","test:replication":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/server/replication/**/*.js' --config '../unitTests/.mocharc.json'","hdb-check":"./utility/devops/hdb-check.sh","download-prebuilds":"node ./utility/devops/build/download-prebuilds.js",prebuild:"date",postinstall:"node ./launchServiceScripts/launchInstallNATSServer.js",build_nats_dependency:"node ./utility/devops/nats/builder.js",coverage:"nyc --reporter=lcov npm test",format:"prettier .","format:fix":"npm run format -- --write",lint:"eslint .","lint:fix":"npm run lint -- --fix"},dependencies:{"@aws-sdk/client-s3":"3.717.0","@aws-sdk/lib-storage":"3.717.0","@endo/static-module-record":"^1.0.4","@fastify/autoload":"5.10.0","@fastify/compress":"~6.5.0","@fastify/cors":"~9.0.1","@fastify/static":"~7.0.4","@turf/area":"6.5.0","@turf/boolean-contains":"6.5.0","@turf/boolean-disjoint":"6.5.0","@turf/boolean-equal":"6.5.0","@turf/circle":"6.5.0","@turf/difference":"6.5.0","@turf/distance":"6.5.0","@turf/helpers":"6.5.0","@turf/length":"6.5.0",alasql:"4.1.10","cbor-x":"1.6.0",chalk:"4.1.2",chokidar:"^4.0.3","cli-progress":"3.12.0",clone:"2.1.2","fast-glob":"3.3.2",fastify:"~4.29.0","fastify-plugin":"~4.5.1","fs-extra":"11.2.0",graphql:"^16.10.0","gunzip-maybe":"1.4.2","human-readable-ids":"1.0.4",inquirer:"8.2.6","is-number":"7.0.0",joi:"17.12.2","json-bigint-fixes":"1.1.0",json2csv:"5.0.7",jsonata:"1.8.7",jsonwebtoken:"9.0.2",lmdb:"3.2.6",lodash:"4.17.21",mathjs:"11.12.0",minimist:"1.2.8",moment:"2.30.1","mqtt-packet":"~9.0.0",msgpackr:"1.11.2",nats:"2.19.0",needle:"3.3.1","node-forge":"^1.3.1","node-stream-zip":"1.15.0","node-unix-socket":"0.2.5","normalize-path":"^3.0.0",ora:"5.4.1","ordered-binary":"1.5.3",papaparse:"5.4.1",passport:"0.6.0","passport-http":"0.3.0","passport-local":"1.0.0",pino:"8.16.0",pm2:"5.4.1",prompt:"1.3.0","properties-reader":"2.3.0","recursive-iterator":"3.3.0",semver:"7.5.4",send:"^1.1.0","serve-static":"2.1.0",ses:"1.1.0","stream-chain":"2.2.5","stream-json":"1.8.0",systeminformation:"5.24.5","tar-fs":"3.0.6",ulidx:"0.5.0",uuid:"10.0.0","validate.js":"0.13.1",ws:"8.18.0",yaml:"2.7.0"},devDependencies:{"@tsconfig/node16":"^1.0.3","@types/node":"20.14.8","@typescript-eslint/eslint-plugin":"^7.18.0","@typescript-eslint/parser":"^7.18.0",axios:"1.7.5",chai:"4.4.1","chai-integer":"0.1.0",esbuild:"^0.24.2",eslint:"^8.57.1","eslint-config-prettier":"^9.1.0","eslint-plugin-sonarjs":"^3.0.1",eventsource:"^2.0.2","graphql-http":"^1.22.3","hook-std":"3.0.0","intercept-stdout":"0.1.2",mkcert:"1.5.1",mocha:"^11.0.1","mocha-teamcity-reporter":"^4.2.0","mock-require":"3.0.3","mock-stdin":"1.0.0",mqtt:"~4.3.8",newman:"6.1.3","node-fetch":"2.6.7",nyc:"15.1.0",prettier:"3.3.3",rewire:"5.0.0",rimraf:"3.0.2",sinon:"10.0.0","sinon-chai":"3.7.0","source-map-support":"^0.5.21",typescript:"^5.7.2",undici:"^6.19.8","why-is-node-still-running":"^1.0.0"},overrides:{alasql:{xlsx:"0.18.5"}},optionalDependencies:{bufferutil:"^4.0.7","segfault-handler":"^1.3.0","utf-8-validate":"^5.0.10"}}});var Pc=N((FIe,JH)=>{"use strict";JH.exports={version:jre,printVersion:zre};var jp=Ou();function jre(){if(jp)return jp.version}a(jre,"version");function zre(){jp&&console.log(`HarperDB Version ${jp.version}`)}a(zre,"printVersion")});var ao=N((VIe,tx)=>{"use strict";var Qre=cn(),lb=re(),Jre=require("util"),Dc=M(),XH=se();XH.initSync();var Xre=Ky(),ZH=$r(),{Node:qIe,NodeSubscription:$Ie}=Ru(),Zre=Wl(),ene=kH(),{RemotePayloadObject:tne,RemotePayloadSubscription:rne}=ef(),{handleHDBError:nne,hdb_errors:sne}=_e(),{HTTP_STATUS_CODES:ine,HDB_ERROR_MSGS:one}=sne,ane=$s(),cne=bu(),lne=Pc(),{getDatabases:une}=(Pe(),oe(lt)),dne=Jre.promisify(Xre.authorize),_ne=ZH.searchByHash,fne=ZH.searchByValue;tx.exports={authHeaderToUser:Ene,isEmpty:hne,getNodeRecord:pne,upsertNodeRecord:mne,buildNodePayloads:Sne,checkClusteringEnabled:Tne,getAllNodeRecords:gne,getSystemInfo:Ane,reverseSubscription:ex};async function Ene(e){let t={headers:{authorization:e.hdb_auth_header}};return e.hdb_user=await dne(t,null),e}a(Ene,"authHeaderToUser");function hne(e){return e==null}a(hne,"isEmpty");async function pne(e){let t=new Zre(Dc.SYSTEM_SCHEMA_NAME,Dc.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return _ne(t)}a(pne,"getNodeRecord");async function mne(e){let t=new ene(Dc.SYSTEM_SCHEMA_NAME,Dc.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Qre.upsert(t)}a(mne,"upsertNodeRecord");function ex(e){if(lb.isEmpty(e.subscribe)||lb.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(ex,"reverseSubscription");function Sne(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,d=lb.getTableHashAttribute(l,u),{subscribe:_,publish:E}=ex(c),f=une()[l]?.[u],h=new rne(l,u,d,E,_,c.start_time,f.schemaDefined?f.attributes:void 0);s.push(h)}return new tne(r,t,s,n)}a(Sne,"buildNodePayloads");function Tne(){if(!XH.get(Dc.CONFIG_PARAMS.CLUSTERING_ENABLED))throw nne(new Error,one.CLUSTERING_NOT_ENABLED,ine.BAD_REQUEST,void 0,void 0,!0)}a(Tne,"checkClusteringEnabled");async function gne(){let e=new ane(Dc.SYSTEM_SCHEMA_NAME,Dc.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await fne(e))}a(gne,"getAllNodeRecords");async function Ane(){let e=await cne.getSystemInformation();return{hdb_version:lne.version(),node_version:e.node_version,platform:e.platform}}a(Ane,"getSystemInfo")});var ub=N((YIe,lx)=>{"use strict";var zp=Tr(),rx=re(),nx=It(),sx=M(),Qp=j(),ix=Gp(),Rne=b_(),{RemotePayloadObject:yne}=ef(),{handleHDBError:ox,hdb_errors:bne}=_e(),{HTTP_STATUS_CODES:ax}=bne,{NodeSubscription:cx}=Ru();lx.exports=One;async function One(e,t){let r;try{r=await zp.request(`${t}.${nx.REQUEST_SUFFIX}`,new yne(sx.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),Qp.trace("Response from remote describe all request:",r)}catch(o){Qp.error(`addNode received error from describe all request to remote node: ${o}`);let c=zp.requestErrorHandler(o,"add_node",t);throw ox(new Error,c,ax.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===nx.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw ox(new Error,o,ax.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===sx.SYSTEM_SCHEMA_NAME){await zp.createLocalTableStream(l,c);let h=new cx(l,c,o.publish,o.subscribe);h.start_time=o.start_time,i.push(h);continue}let u=rx.doesSchemaExist(l),d=n[l]!==void 0,_=c?rx.doesTableExist(l,c):!0,E=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!_&&!E){s.push(o);continue}if(!u&&d&&(Qp.trace(`addNode creating schema: ${l}`),await ix.createSchema({operation:"create_schema",schema:l})),!_&&E){Qp.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let h=new Rne(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(h.attributes=n[l][c].attributes),await ix.createTable(h)}await zp.createLocalTableStream(l,c);let f=new cx(l,c,o.publish,o.subscribe);f.start_time=o.start_time,i.push(f)}return{added:i,skipped:s}}a(One,"reviewSubscriptions")});var Lc={};je(Lc,{addNodeBack:()=>Pne,removeNodeBack:()=>Dne,setNode:()=>Cne});async function Cne(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=js(t)):t=Hp(r);let n=(0,dx.validateBySchema)(e,wne);if(n)throw(0,co.handleHDBError)(n,n.message,Ine.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new co.ClientError("url or hostname is required for remove_node operation");let f=r,h=pr(),T=await h.get(f);if(!T)throw new co.ClientError(f+" does not exist");try{await Q_({url:T.url},{operation:rf.OPERATIONS_ENUM.REMOVE_NODE_BACK,name:T?.subscriptions?.length>0?ot():f},void 0)}catch(m){$n.warn(`Error removing node from target node ${f}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,m)}return await h.delete(f),`Successfully removed '${f}' from cluster`}if(!t)throw new co.ClientError("url required for this operation");let s=ea();if(s==null)throw new co.ClientError("replication url is missing from harperdb-config.yaml");let i,o,c;if(t?.startsWith("wss:")){i=await(0,ps.getReplicationCert)();let f=await(0,ps.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,ps.createCsr)(),$n.info("Sending CSR to target node:",t)):f&&(c=f.certificate,$n.info("Sending CA named",f.name,"to target node",t))}let l={operation:rf.OPERATIONS_ENUM.ADD_NODE_BACK,hostname:(0,_x.get)(rf.CONFIG_PARAMS.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:o,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if(e.subscriptions?l.subscriptions=e.subscriptions.map(ux):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let f=ux(e);l.subscribe=f.subscribe,l.publish=f.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,d;try{u=await Q_({url:t},l,e)}catch(f){f.message=`Error returned from ${t}: `+f.message,$n.warn("Error adding node:",t,"to cluster:",f),d=f}if(o&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw d?(d.message+=" and connection was required to sign certificate",d):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);o&&($n.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,ps.setCertTable)({name:Nne.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,ps.setCertTable)({name:ot(),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 _={url:t,ca:u?.usingCA};if(e.hostname&&(_.name=e.hostname),e.subscriptions?_.subscriptions=e.subscriptions:_.replicates=!0,e.start_time&&(_.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(_.authorization=e.authorization),_.replicates){let f={url:s,ca:c,replicates:!0,subscriptions:null};e.retain_authorization&&(f.authorization=e.authorization),e.start_time&&(f.start_time=e.start_time),await io(ot(),f)}await io(u?u.nodeName:_.name??js(t),_);let E;return e.operation==="update_node"?E=`Successfully updated '${t}'`:E=`Successfully added '${t}' to cluster`,d&&(E+=" but there was an error updating target node: "+d.message),E}async function Pne(e){$n.trace("addNodeBack received request:",e);let t=await(0,ps.signCertificate)(e),r;e.csr?(r=t.signingCA,$n.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,$n.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);let s=await(0,ps.getReplicationCertAuth)();if(n.replicates){let i={url:ea(),ca:s?.certificate,replicates:!0,subscriptions:null};e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await io(ot(),i)}return await io(e.hostname,n),t.nodeName=ot(),t.usingCA=s?.certificate,$n.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function Dne(e){$n.trace("removeNodeBack received request:",e),await pr().delete(e.name)}function ux(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var ps,dx,Nu,_x,rf,$n,co,Nne,Ine,wne,Mc=Ie(()=>{ps=L(Js()),dx=L(gt()),Nu=L(require("joi")),_x=L(se()),rf=L(M());B_();su();us();$n=L(j()),co=L(_e()),{pki:Nne}=require("node-forge"),{HTTP_STATUS_CODES:Ine}=co.hdb_errors,wne=Nu.default.object({hostname:Nu.default.string(),verify_tls:Nu.default.boolean(),replicates:Nu.default.boolean(),subscriptions:Nu.default.array()});a(Cne,"setNode");a(Pne,"addNodeBack");a(Dne,"removeNodeBack");a(ux,"reverseSubscription")});var tm=N((ewe,Ex)=>{"use strict";var{handleHDBError:Jp,hdb_errors:Lne}=_e(),{HTTP_STATUS_CODES:Xp}=Lne,{addUpdateNodeValidator:Mne}=Yp(),Zp=j(),em=M(),fx=It(),Une=re(),nf=Tr(),sf=ao(),db=se(),vne=ub(),{Node:Bne,NodeSubscription:Hne}=Ru(),{broadcast:xne}=dt(),{setNode:kne}=(Mc(),oe(Lc)),XIe=se(),ZIe=M(),Fne="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Gne="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",qne=db.get(em.CONFIG_PARAMS.CLUSTERING_NODENAME);Ex.exports=$ne;async function $ne(e,t=!1){if(Zp.trace("addNode called with:",e),db.get(em.CONFIG_PARAMS.REPLICATION_URL)||db.get(em.CONFIG_PARAMS.REPLICATION_HOSTNAME))return kne(e);sf.checkClusteringEnabled();let r=Mne(e);if(r)throw Jp(r,r.message,Xp.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let _=await sf.getNodeRecord(n);if(!Une.isEmptyOrZeroLength(_))throw Jp(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,Xp.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await vne(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=Fne,o;let c=sf.buildNodePayloads(s,qne,em.OPERATIONS_ENUM.ADD_NODE,await sf.getSystemInfo()),l=[];for(let _=0,E=s.length;_<E;_++){let f=s[_];s[_].start_time===void 0&&delete s[_].start_time,l.push(new Hne(f.schema,f.table,f.publish,f.subscribe))}Zp.trace("addNode sending remote payload:",c);let u;try{u=await nf.request(`${n}.${fx.REQUEST_SUFFIX}`,c)}catch(_){Zp.error(`addNode received error from request: ${_}`);for(let f=0,h=s.length;f<h;f++){let T=s[f];T.publish=!1,T.subscribe=!1,await nf.updateRemoteConsumer(T,n)}let E=nf.requestErrorHandler(_,"add_node",n);throw Jp(new Error,E,Xp.INTERNAL_SERVER_ERROR,"error",E)}if(u.status===fx.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let _=`Error returned from remote node ${n}: ${u.message}`;throw Jp(new Error,_,Xp.INTERNAL_SERVER_ERROR,"error",_)}Zp.trace(u);for(let _=0,E=s.length;_<E;_++){let f=s[_];await nf.updateRemoteConsumer(f,n),f.subscribe===!0&&await nf.updateConsumerIterator(f.schema,f.table,n,"start")}let d=new Bne(n,l,u.system_info);return await sf.upsertNodeRecord(d),xne({type:"nats_update"}),i.length>0?o.message=Gne:o.message=`Successfully added '${n}' to manifest`,o}a($ne,"addNode")});var hb=N((nwe,px)=>{"use strict";var{handleHDBError:_b,hdb_errors:Vne}=_e(),{HTTP_STATUS_CODES:fb}=Vne,{addUpdateNodeValidator:Kne}=Yp(),of=j(),rm=M(),hx=It(),rwe=re(),af=Tr(),cf=ao(),Eb=se(),{cloneDeep:Yne}=require("lodash"),Wne=ub(),{Node:jne,NodeSubscription:zne}=Ru(),{broadcast:Qne}=dt(),{setNode:Jne}=(Mc(),oe(Lc)),Xne="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",Zne="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",ese=Eb.get(rm.CONFIG_PARAMS.CLUSTERING_NODENAME);px.exports=tse;async function tse(e){if(of.trace("updateNode called with:",e),Eb.get(rm.CONFIG_PARAMS.REPLICATION_URL)??Eb.get(rm.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Jne(e);cf.checkClusteringEnabled();let t=Kne(e);if(t)throw _b(t,t.message,fb.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await cf.getNodeRecord(r);s.length>0&&(n=Yne(s));let{added:i,skipped:o}=await Wne(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=Xne,c;let l=cf.buildNodePayloads(i,ese,rm.OPERATIONS_ENUM.UPDATE_NODE,await cf.getSystemInfo());for(let d=0,_=i.length;d<_;d++){let E=i[d];of.trace(`updateNode updating work stream for node: ${r} subscription:`,E),i[d].start_time===void 0&&delete i[d].start_time}of.trace("updateNode sending remote payload:",l);let u;try{u=await af.request(`${r}.${hx.REQUEST_SUFFIX}`,l)}catch(d){of.error(`updateNode received error from request: ${d}`);let _=af.requestErrorHandler(d,"update_node",r);throw _b(new Error,_,fb.INTERNAL_SERVER_ERROR,"error",_)}if(u.status===hx.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw _b(new Error,d,fb.INTERNAL_SERVER_ERROR,"error",d)}of.trace(u);for(let d=0,_=i.length;d<_;d++){let E=i[d];await af.updateRemoteConsumer(E,r),E.subscribe===!0?await af.updateConsumerIterator(E.schema,E.table,r,"start"):await af.updateConsumerIterator(E.schema,E.table,r,"stop")}return n||(n=[new jne(r,[],u.system_info)]),await rse(n[0],i,u.system_info),o.length>0?c.message=Zne:c.message=`Successfully updated '${r}'`,c}a(tse,"updateNode");async function rse(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 d=n.subscriptions[l];if(d.schema===o.schema&&d.table===o.table){d.publish=o.publish,d.subscribe=o.subscribe,c=!0;break}}c||n.subscriptions.push(new zne(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await cf.upsertNodeRecord(n),Qne({type:"nats_update"})}a(rse,"updateNodeTable")});var Ax=N((iwe,gx)=>{"use strict";var Tx=require("joi"),{string:mx}=Tx.types(),nse=gt(),Sx=M(),sse=se(),ise=It();gx.exports=ose;function ose(e){let t=mx.invalid(sse.get(Sx.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(ise.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=Tx.object({operation:mx.valid(Sx.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return nse.validateBySchema(e,r)}a(ose,"removeNodeValidator")});var nm=N((awe,Nx)=>{"use strict";var{handleHDBError:Rx,hdb_errors:ase}=_e(),{HTTP_STATUS_CODES:yx}=ase,cse=Ax(),lf=j(),bx=ao(),lse=re(),Iu=M(),Ox=It(),pb=Tr(),mb=se(),{RemotePayloadObject:use}=ef(),{NodeSubscription:dse}=Ru(),_se=y_(),fse=oc(),{broadcast:Ese}=dt(),{setNode:hse}=(Mc(),oe(Lc)),pse=mb.get(Iu.CONFIG_PARAMS.CLUSTERING_NODENAME);Nx.exports=mse;async function mse(e){if(lf.trace("removeNode called with:",e),mb.get(Iu.CONFIG_PARAMS.REPLICATION_URL)??mb.get(Iu.CONFIG_PARAMS.REPLICATION_HOSTNAME))return hse(e);bx.checkClusteringEnabled();let t=cse(e);if(t)throw Rx(t,t.message,yx.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await bx.getNodeRecord(r);if(lse.isEmptyOrZeroLength(n))throw Rx(new Error,`Node '${r}' was not found.`,yx.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new use(Iu.OPERATIONS_ENUM.REMOVE_NODE,pse,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await pb.updateConsumerIterator(d.schema,d.table,r,"stop");try{await pb.updateRemoteConsumer(new dse(d.schema,d.table,!1,!1),r)}catch(_){lf.error(_)}}try{i=await pb.request(`${r}.${Ox.REQUEST_SUFFIX}`,s),lf.trace("Remove node reply from remote node:",r,i)}catch(l){lf.error("removeNode received error from request:",l),o=!0}let c=new _se(Iu.SYSTEM_SCHEMA_NAME,Iu.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await fse.deleteRecord(c),Ese({type:"nats_update"}),i?.status===Ox.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(lf.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(mse,"removeNode")});var Cx=N((lwe,wx)=>{"use strict";var Ix=require("joi"),{string:Sse,array:Tse}=Ix.types(),gse=gt(),Ase=Yp();wx.exports=Rse;function Rse(e){let t=Ix.object({operation:Sse.valid("configure_cluster").required(),connections:Tse.items(Ase.validation_schema).required()});return gse.validateBySchema(e,t)}a(Rse,"configureClusterValidator")});var Sb=N((dwe,Ux)=>{"use strict";var Px=M(),sm=j(),yse=re(),bse=se(),Ose=nm(),Nse=tm(),Ise=ao(),wse=Cx(),{handleHDBError:Dx,hdb_errors:Cse}=_e(),{HTTP_STATUS_CODES:Lx}=Cse,Pse="Configure cluster complete.",Dse="Failed to configure the cluster. Check the logs for more details.",Lse="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";Ux.exports=Mse;async function Mse(e){sm.trace("configure cluster called with:",e);let t=wse(e);if(t)throw Dx(t,t.message,Lx.BAD_REQUEST,void 0,void 0,!0);let r=await Ise.getAllNodeRecords(),n=[];if(bse.get(Px.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,_=r.length;d<_;d++){let E=await Mx(Ose,{operation:Px.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(E)}sm.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let _=e.connections[d],E=await Mx(Nse,_,_.node_name);s.push(E)}sm.trace("All results from configure_cluster add node:",s);let o=[],c=[],l=!1,u=n.concat(s);for(let d=0,_=u.length;d<_;d++){let E=u[d];E.status==="rejected"&&(sm.error(E.node_name,E?.error?.message,E?.error?.stack),o.includes(E.node_name)||o.push(E.node_name)),(E?.result?.message?.includes?.("Successfully")||E?.result?.includes?.("Successfully"))&&(l=!0),!(typeof E.result=="string"&&E.result.includes("Successfully removed")||E.status==="rejected")&&c.push({node_name:E?.node_name,response:E?.result})}if(yse.isEmptyOrZeroLength(o))return{message:Pse,connections:c};if(l)return{message:Lse,failed_nodes:o,connections:c};throw Dx(new Error,Dse,Lx.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(Mse,"configureCluster");async function Mx(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(Mx,"functionWrapper")});var xx=N((fwe,Hx)=>{"use strict";var uf=require("joi"),Use=gt(),{validateSchemaExists:vx,validateTableExists:vse,validateSchemaName:Bx}=Si(),Bse=uf.object({operation:uf.string().valid("purge_stream"),schema:uf.string().custom(vx).custom(Bx).optional(),database:uf.string().custom(vx).custom(Bx).optional(),table:uf.string().custom(vse).required()});function Hse(e){return Use.validateBySchema(e,Bse)}a(Hse,"purgeStreamValidator");Hx.exports=Hse});var Tb=N((hwe,kx)=>{"use strict";var{handleHDBError:xse,hdb_errors:kse}=_e(),{HTTP_STATUS_CODES:Fse}=kse,Gse=xx(),qse=Tr(),$se=ao();kx.exports=Vse;async function Vse(e){e.schema=e.schema??e.database;let t=Gse(e);if(t)throw xse(t,t.message,Fse.BAD_REQUEST,void 0,void 0,!0);$se.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await qse.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(Vse,"purgeStream")});var Rb=N((mwe,Yx)=>{"use strict";var Ab=ao(),Kse=Tr(),im=se(),wu=M(),Uc=It(),Yse=re(),gb=j(),{RemotePayloadObject:Wse}=ef(),{ErrorCode:Fx}=require("nats"),{parentPort:Gx}=require("worker_threads"),{onMessageByType:jse}=dt(),{getThisNodeName:zse}=(us(),oe(oa)),{requestClusterStatus:Qse}=(B_(),oe(g0)),qx=im.get(wu.CONFIG_PARAMS.CLUSTERING_ENABLED),$x=im.get(wu.CONFIG_PARAMS.CLUSTERING_NODENAME);Yx.exports={clusterStatus:Jse,buildNodeStatus:Kx};var Vx;jse("cluster-status",async e=>{Vx(e)});async function Jse(){if(im.get(wu.CONFIG_PARAMS.REPLICATION_URL)||im.get(wu.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;return Gx?(Gx.postMessage({type:"request-cluster-status"}),n=await new Promise(s=>{Vx=s})):n=Qse(),n.node_name=zse(),n.is_enabled=!0,n}let e={node_name:$x,is_enabled:qx,connections:[]};if(!qx)return e;let t=await Ab.getAllNodeRecords();if(Yse.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(Kx(t[n],e.connections));return await Promise.allSettled(r),e}a(Jse,"clusterStatus");async function Kx(e,t){let r=e.name,n=new Wse(wu.OPERATIONS_ENUM.CLUSTER_STATUS,$x,void 0,await Ab.getSystemInfo()),s,i,o=Uc.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Kse.request(Uc.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Uc.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=Uc.CLUSTER_STATUS_STATUSES.CLOSED,gb.error(`Error getting node status from ${r} `,s))}catch(l){gb.warn(`Error getting node status from ${r}`,l),l.code===Fx.NoResponders?o=Uc.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===Fx.Timeout?o=Uc.CLUSTER_STATUS_STATUSES.TIMEOUT:o=Uc.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Xse(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!==wu.PRE_4_0_0_VERSION&&await Ab.upsertNodeRecord(l)}catch(l){gb.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(Kx,"buildNodeStatus");function Xse(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(Xse,"NodeStatusObject")});var bb=N((Twe,Wx)=>{"use strict";var{handleHDBError:Zse,hdb_errors:eie}=_e(),{HTTP_STATUS_CODES:tie}=eie,rie=Tr(),nie=ao(),yb=re(),om=require("joi"),sie=gt(),iie=2e3,oie=om.object({timeout:om.number().min(1),connected_nodes:om.boolean(),routes:om.boolean()});Wx.exports=aie;async function aie(e){nie.checkClusteringEnabled();let t=sie.validateBySchema(e,oie);if(t)throw Zse(t,t.message,tie.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||yb.autoCastBoolean(n),o=s===void 0||yb.autoCastBoolean(s),c={nodes:[]},l=await rie.getServerList(r??iie),u={};if(i)for(let d=0,_=l.length;d<_;d++){let E=l[d].statsz;E&&(u[l[d].server.name]=E.routes)}for(let d=0,_=l.length;d<_;d++){if(l[d].statsz)continue;let E=l[d].server,f=l[d].data;if(E.name.endsWith("-hub")){let h={name:E.name.slice(0,-4),response_time:l[d].response_time};i&&(h.connected_nodes=[],u[E.name]&&u[E.name].forEach(T=>{h.connected_nodes.includes(T.name.slice(0,-4))||h.connected_nodes.push(T.name.slice(0,-4))})),o&&(h.routes=f.cluster?.urls?f.cluster?.urls.map(T=>({host:T.split(":")[0],port:yb.autoCast(T.split(":")[1])})):[]),c.nodes.push(h)}}return c}a(aie,"clusterNetwork")});var Jx=N((Awe,Qx)=>{"use strict";var Ob=require("joi"),jx=gt(),{route_constraints:zx}=NA();Qx.exports={setRoutesValidator:cie,deleteRoutesValidator:lie};function cie(e){let t=Ob.object({server:Ob.valid("hub","leaf"),routes:zx.required()});return jx.validateBySchema(e,t)}a(cie,"setRoutesValidator");function lie(e){let t=Ob.object({routes:zx.required()});return jx.validateBySchema(e,t)}a(lie,"deleteRoutesValidator")});var am=N((ywe,sk)=>{"use strict";var lo=Ct(),Nb=re(),ms=M(),Cu=se(),Xx=Jx(),{handleHDBError:Zx,hdb_errors:uie}=_e(),{HTTP_STATUS_CODES:ek}=uie,tk="cluster routes successfully set",rk="cluster routes successfully deleted";sk.exports={setRoutes:_ie,getRoutes:fie,deleteRoutes:Eie};function die(e){let t=lo.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=Nb.autoCast(l.port);let u=r.some(_=>_.host===l.host&&_.port===l.port),d=n.some(_=>_.host===l.host&&_.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?lo.updateConfigValue(ms.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):lo.updateConfigValue(ms.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:tk,set:i,skipped:s}}a(die,"setRoutesNats");function _ie(e){let t=Xx.setRoutesValidator(e);if(t)throw Zx(t,t.message,ek.BAD_REQUEST,void 0,void 0,!0);if(Cu.get(ms.CONFIG_PARAMS.CLUSTERING_ENABLED))return die(e);let r=[],n=[],s=Cu.get(ms.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{nk(s,i)?n.push(i):(s.push(i),r.push(i))}),lo.updateConfigValue(ms.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:tk,set:r,skipped:n}}a(_ie,"setRoutes");function nk(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(nk,"existsInArray");function fie(){if(Cu.get(ms.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=lo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Cu.get(ms.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(fie,"getRoutes");function Eie(e){let t=Xx.deleteRoutesValidator(e);if(t)throw Zx(t,t.message,ek.BAD_REQUEST,void 0,void 0,!0);if(Cu.get(ms.CONFIG_PARAMS.CLUSTERING_ENABLED))return hie(e);let r=[],n=[],s=Cu.get(ms.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{nk(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),lo.updateConfigValue(ms.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:rk,deleted:r,skipped:n}}a(Eie,"deleteRoutes");function hie(e){let t=lo.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 d=e.routes[l],_=!1;for(let E=0,f=r.length;E<f;E++){let h=r[E];if(d.host===h.host&&d.port===h.port){r.splice(E,1),_=!0,o=!0,s.push(d);break}}if(!_){let E=!0;for(let f=0,h=n.length;f<h;f++){let T=n[f];if(d.host===T.host&&d.port===T.port){n.splice(f,1),c=!0,E=!1,s.push(d);break}}E&&i.push(d)}}return o&&(r=Nb.isEmptyOrZeroLength(r)?null:r,lo.updateConfigValue(ms.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=Nb.isEmptyOrZeroLength(n)?null:n,lo.updateConfigValue(ms.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:rk,deleted:s,skipped:i}}a(hie,"deleteRoutesNats")});var ok=N((Owe,ik)=>{"use strict";var df=require("alasql"),vc=require("recursive-iterator"),Xs=j(),pie=re(),_f=M(),Ib=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,Sie(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=>_f.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=>!_f.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][_f.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[o].attribute_permissions.length>0?c=mie(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=>!_f.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new df.yy.Column({columnid:u});s.tableid&&(d.tableid=s.tableid),this.ast.columns.push(d),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(o,l)}}),this.ast}};function mie(e){return e.filter(t=>t[_f.PERMS_CRUD_ENUM.READ])}a(mie,"filterReadRestrictedAttrs");function Sie(e,t,r,n,s){Tie(e,t,r,n,s)}a(Sie,"interpretAST");function ff(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(ff,"addSchemaTableToMap");function Tie(e,t,r,n,s){if(!e){Xs.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof df.yy.Insert?yie(e,t,r):e instanceof df.yy.Select?gie(e,t,r,n,s):e instanceof df.yy.Update?Aie(e,t,r):e instanceof df.yy.Delete?Rie(e,t,r):Xs.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(Tie,"getRecordAttributesAST");function gie(e,t,r,n,s){if(!e){Xs.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(pie.isEmptyOrZeroLength(i)){Xs.error("No schema specified");return}e.from.forEach(c=>{ff(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),ff(c.table,t,r,n,s)});let o=new vc(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{Xs.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 vc(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let d=u.tableid?u.tableid:l;if(!t.get(i).has(d))if(r.has(d))d=r.get(d);else{Xs.info(`table specified as ${d} not found.`);continue}t.get(i).get(d).indexOf(u.columnid)<0&&t.get(i).get(d).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new vc(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,_=s.get(d);if(!t.get(_).has(d))if(r.has(d))d=r.get(d);else{Xs.info(`table specified as ${d} not found.`);continue}t.get(_).get(d).indexOf(u.columnid)<0&&t.get(_).get(d).push(u.columnid)}}),e.order){let c=new vc(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,d=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(d).has(u))if(r.has(u))u=r.get(u);else{Xs.info(`table specified as ${u} not found.`);return}t.get(d).get(u).indexOf(l.columnid)<0&&t.get(d).get(u).push(l.columnid)}}}a(gie,"getSelectAttributes");function Aie(e,t,r){if(!e){Xs.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new vc(e.columns),s=e.table.databaseid;ff(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&wb(e.table.tableid,s,i.columnid,t,r)}a(Aie,"getUpdateAttributes");function Rie(e,t,r){if(!e){Xs.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new vc(e.where),s=e.table.databaseid;ff(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&wb(e.table.tableid,s,i.columnid,t,r)}a(Rie,"getDeleteAttributes");function yie(e,t,r){if(!e){Xs.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new vc(e.columns),s=e.into.databaseid;ff(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&wb(e.into.tableid,s,i.columnid,t,r)}a(yie,"getInsertAttributes");function wb(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(wb,"pushAttribute");ik.exports=Ib});var Db=N((Iwe,uk)=>{var cm=uc(),ak=require("chalk"),Vn=j(),ck=require("prompt"),{promisify:bie}=require("util"),Cb=M(),Oie=require("fs-extra"),Nie=require("path"),Iie=re(),wie=Pc(),lk=se();lk.initSync();var Cie=require("moment"),Pie=bie(ck.get),Die=Nie.join(lk.getHdbBasePath(),Cb.LICENSE_KEY_DIR_NAME,Cb.LICENSE_FILE_NAME,Cb.LICENSE_FILE_NAME);uk.exports={getFingerprint:Mie,setLicense:Lie,parseLicense:Pb,register:Uie,getRegistrationInfo:Bie};async function Lie(e){if(e&&e.key&&e.company){try{Vn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await Pb(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw Vn.error(r),Vn.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(Lie,"setLicense");async function Mie(){let e={};try{e=await cm.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw Vn.error(r),Vn.error(t),new Error(r)}return e}a(Mie,"getFingerprint");async function Pb(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");Vn.info("Validating license input...");let r=cm.validateLicense(e,t);if(Vn.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(Vn.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(Vn.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{Vn.info("writing license to disk"),await Oie.writeFile(Die,JSON.stringify({license_key:e,company:t}))}catch(n){throw Vn.error("Failed to write License"),n}return"Registration successful."}a(Pb,"parseLicense");async function Uie(){let e=await vie();return Pb(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Uie,"register");async function vie(){let e=await cm.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:ak.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:ak.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{ck.start()}catch(n){Vn.error(n)}let r;try{r=await Pie(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(vie,"promptForRegistration");async function Bie(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await cm.getLicense()}catch(r){throw Vn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(Iie.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=wie.version(),e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=Cie.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(Bie,"getRegistrationInfo")});var _k=N((Cwe,dk)=>{"use strict";var Hie=It(),Lb=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,d,_,E,f,h){this.port=t,o===null&&(o=void 0),this.server_name=r+Hie.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:d,port:_,routes:E,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l}},this.accounts={SYS:{users:f},HDB:{users:h}},this.system_account="SYS"}};dk.exports=Lb});var hk=N((Dwe,Ek)=>{"use strict";var fk=It(),Mb=class{static{a(this,"LeafConfigObject")}constructor(t,r,n,s,i,o,c,l,u,d,_){this.port=t,_===null&&(_=void 0),this.server_name=r+fk.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+fk.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:d,ca_file:_,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:_,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:_,insecure:!0},urls:o,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};Ek.exports=Mb});var mk=N((Mwe,pk)=>{"use strict";var Ub=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};pk.exports=Ub});var Tk=N((vwe,Sk)=>{"use strict";var xie=It(),vb=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+xie.SERVER_SUFFIX.ADMIN,this.password=r}};Sk.exports=vb});var _m=N((Hwe,Rk)=>{"use strict";var Bc=require("path"),Hc=require("fs-extra"),kie=_k(),Fie=hk(),Gie=mk(),qie=Tk(),Bb=xn(),Du=re(),Tn=Ct(),um=M(),Ef=It(),{CONFIG_PARAMS:Jt}=um,Lu=j(),hf=se(),gk=Xi(),Hb=Tr(),$ie=Js(),Pu="clustering",Vie=1e4,Ak=50;Rk.exports={generateNatsConfig:Yie,removeNatsConfig:Wie,getHubConfigPath:Kie};function Kie(){let e=hf.get(Jt.ROOTPATH);return Bc.join(e,Pu,Ef.NATS_CONFIG_FILES.HUB_SERVER)}a(Kie,"getHubConfigPath");async function Yie(e=!1,t=void 0){let r=hf.get(Jt.ROOTPATH);Hc.ensureDirSync(Bc.join(r,"clustering","leaf")),hf.initSync();let n=Tn.getConfigFromFile(Jt.CLUSTERING_TLS_CERT_AUTH),s=Tn.getConfigFromFile(Jt.CLUSTERING_TLS_PRIVATEKEY),i=Tn.getConfigFromFile(Jt.CLUSTERING_TLS_CERTIFICATE);!await Hc.exists(i)&&!await Hc.exists(!n)&&await $ie.createNatsCerts();let o=Bc.join(r,Pu,Ef.PID_FILES.HUB),c=Bc.join(r,Pu,Ef.PID_FILES.LEAF),l=Tn.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=Bc.join(r,Pu,Ef.NATS_CONFIG_FILES.HUB_SERVER),d=Bc.join(r,Pu,Ef.NATS_CONFIG_FILES.LEAF_SERVER),_=Tn.getConfigFromFile(Jt.CLUSTERING_TLS_INSECURE),E=Tn.getConfigFromFile(Jt.CLUSTERING_TLS_VERIFY),f=Tn.getConfigFromFile(Jt.CLUSTERING_NODENAME),h=Tn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await Hb.checkNATSServerInstalled()||dm("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let T=await Bb.listUsers(),m=Tn.getConfigFromFile(Jt.CLUSTERING_USER),g=await Bb.getClusterUser();(Du.isEmpty(g)||g.active!==!0)&&dm(`Invalid cluster user '${m}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await lm(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await lm(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await lm(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),await lm(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let S=[],y=[];for(let[ne,Q]of T.entries())Q.role?.role===um.ROLE_TYPES_ENUM.CLUSTER_USER&&Q.active&&(S.push(new qie(Q.username,gk.decrypt(Q.hash))),y.push(new Gie(Q.username,gk.decrypt(Q.hash))));let I=[],{hub_routes:U}=Tn.getClusteringRoutes();if(!Du.isEmptyOrZeroLength(U))for(let ne of U)I.push(`tls://${g.sys_name_encoded}:${g.uri_encoded_d_hash}@${ne.host}:${ne.port}`);let H=new kie(Tn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),f,o,i,s,n,_,E,h,Tn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NAME),Tn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),I,S,y);n==null&&(delete H.tls.ca_file,delete H.leafnodes.tls.ca_file),t=Du.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===um.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Hc.writeJson(u,H),Lu.trace(`Hub server config written to ${u}`));let X=`tls://${g.sys_name_encoded}:${g.uri_encoded_d_hash}@0.0.0.0:${h}`,Y=`tls://${g.uri_encoded_name}:${g.uri_encoded_d_hash}@0.0.0.0:${h}`,V=new Fie(Tn.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT),f,c,l,[X],[Y],S,y,i,s,n,_);n==null&&delete V.tls.ca_file,(t===void 0||t===um.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Hc.writeJson(d,V),Lu.trace(`Leaf server config written to ${d}`))}a(Yie,"generateNatsConfig");async function lm(e){let t=hf.get(e);return Du.isEmpty(t)&&dm(`port undefined for '${e}'`),await Du.isPortTaken(t)&&dm(`'${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(lm,"isPortAvailable");function dm(e){let t=`Error generating clustering config: ${e}`;Lu.error(t),console.error(t),process.exit(1)}a(dm,"generateNatsConfigError");async function Wie(e){let{port:t,config_file:r}=Hb.getServerConfig(e),{username:n,decrypt_hash:s}=await Bb.getClusterUser(),i=0,o=2e3;for(;i<Ak;){try{let d=await Hb.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){Lu.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=Ak)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&&Lu.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await Du.async_set_timeout(u)}let c="0".repeat(Vie),l=Bc.join(hf.get(Jt.ROOTPATH),Pu,r);await Hc.writeFile(l,c),await Hc.remove(l),Lu.notify(e,"started.")}a(Wie,"removeNatsConfig")});var wk=N((kwe,Ik)=>{"use strict";var Kn=se(),jie=uc(),Ge=M(),pf=It(),uo=require("path"),{PACKAGE_ROOT:Em}=M(),yk=se(),fm=re(),Mu="/dev/null",zie=uo.join(Em,"launchServiceScripts"),bk=uo.join(Em,"utility/scripts"),Qie=uo.join(bk,Ge.HDB_RESTART_SCRIPT),Ok=uo.resolve(Em,"dependencies",`${process.platform}-${process.arch}`,pf.NATS_BINARY_NAME);function Nk(){let t=jie.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 fm.noBootFile()&&(n[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=fm.getEnvCliRootPath()),{name:Ge.PROCESS_DESCRIPTORS.HDB,script:Ge.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:Em}}a(Nk,"generateMainServerConfig");var Jie=9930;function Xie(){Kn.initSync(!0);let e=Kn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=uo.join(e,"clustering",pf.NATS_CONFIG_FILES.HUB_SERVER),r=uo.join(Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=yk.get(Ge.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=pf.LOG_LEVEL_FLAGS[Kn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Jie?"-"+n:""),script:Ok,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 Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Mu,i.error_file=Mu),i}a(Xie,"generateNatsHubServerConfig");var Zie=9940;function eoe(){Kn.initSync(!0);let e=Kn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=uo.join(e,"clustering",pf.NATS_CONFIG_FILES.LEAF_SERVER),r=uo.join(Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=yk.get(Ge.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=pf.LOG_LEVEL_FLAGS[Kn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Zie?"-"+n:""),script:Ok,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 Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Mu,i.error_file=Mu),i}a(eoe,"generateNatsLeafServerConfig");function toe(){Kn.initSync();let e=uo.join(Kn.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:zie,autorestart:!1};return Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=Mu,t.error_file=Mu),t}a(toe,"generateClusteringUpgradeV4ServiceConfig");function roe(){let e={[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.RESTART_HDB};return fm.noBootFile()&&(e[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=fm.getEnvCliRootPath()),{...{name:Ge.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:bk},script:Qie}}a(roe,"generateRestart");function noe(){return{apps:[Nk()]}}a(noe,"generateAllServiceConfigs");Ik.exports={generateAllServiceConfigs:noe,generateMainServerConfig:Nk,generateRestart:roe,generateNatsHubServerConfig:Xie,generateNatsLeafServerConfig:eoe,generateClusteringUpgradeV4ServiceConfig:toe}});var Sf=N((qwe,qk)=>{"use strict";var at=M(),soe=re(),fo=_m(),hm=Tr(),_o=It(),fa=wk(),pm=se(),xc=j(),ioe=ao(),{startWorker:Ck,onMessageFromWorkers:ooe}=dt(),aoe=bu(),Gwe=require("util"),coe=require("child_process"),loe=require("fs"),{execFile:uoe}=coe,Qe;qk.exports={enterPM2Mode:doe,start:Ea,stop:xb,reload:Dk,restart:Lk,list:kb,describe:vk,connect:Eo,kill:poe,startAllServices:moe,startService:Fb,getUniqueServicesList:Bk,restartAllServices:Soe,isServiceRegistered:Hk,reloadStopStart:xk,restartHdb:Uk,deleteProcess:Eoe,startClusteringProcesses:Fk,startClusteringThreads:Gk,isHdbRestartRunning:hoe,isClusteringRunning:goe,stopClustering:Toe,reloadClustering:Aoe,expectedRestartOfChildren:Mk};var mf=!1;ooe(e=>{e.type==="restart"&&pm.initSync(!0)});function doe(){mf=!0}a(doe,"enterPM2Mode");function Eo(){return Qe||(Qe=require("pm2")),new Promise((e,t)=>{Qe.connect((r,n)=>{r&&t(r),e(n)})})}a(Eo,"connect");var zr,_oe=10,Pk;function Ea(e,t=!1){if(mf)return foe(e);let r=uoe(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=zr.indexOf(r);o>-1&&zr.splice(o,1),!Pk&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<_oe&&(loe.existsSync(fo.getHubConfigPath())?Ea(e):(await fo.generateNatsConfig(!0),Ea(e),await new Promise(c=>setTimeout(c,3e3)),await fo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await fo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=pm.get(at.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,d;for(;l=c.exec(i);){if(l.index&&_o.LOG_LEVEL_HIERARCHY[o]>=_o.LOG_LEVEL_HIERARCHY[d||"info"]){let f=d===_o.LOG_LEVELS.ERR||d===_o.LOG_LEVELS.WRN?xc.OUTPUTS.STDERR:xc.OUTPUTS.STDOUT;xc.logCustomLevel(d||"info",f,n,i.slice(u,l.index).trim())}let[_,E]=l;u=l.index+_.length,d=_o.LOG_LEVELS[E]}if(_o.LOG_LEVEL_HIERARCHY[o]>=_o.LOG_LEVEL_HIERARCHY[d||"info"]){let _=d===_o.LOG_LEVELS.ERR||d===_o.LOG_LEVELS.WRN?xc.OUTPUTS.STDERR:xc.OUTPUTS.STDOUT;xc.logCustomLevel(d||"info",_,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!zr&&(zr=[],!t)){let i=a(()=>{Pk=!0,zr&&(zr.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)}zr.push(r)}a(Ea,"start");function foe(e){return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.start(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(foe,"startWithPM2");function xb(e){if(!mf){for(let t of zr||[])t.name===e&&(zr.splice(zr.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.stop(e,async(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.delete(e,(i,o)=>{i&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(o)})})})}a(xb,"stop");function Dk(e){return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.reload(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Dk,"reload");function Lk(e){if(!mf){Mk();for(let t of zr||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.restart(e,(n,s)=>{Qe.disconnect(),t(s)})})}a(Lk,"restart");function Mk(){for(let e of zr||[])e.config&&(e.config.restarts=0)}a(Mk,"expectedRestartOfChildren");function Eoe(e){return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.delete(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Eoe,"deleteProcess");async function Uk(){await Ea(fa.generateRestart())}a(Uk,"restartHdb");async function hoe(){let e=await kb();for(let t in e)if(e[t].name===at.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(hoe,"isHdbRestartRunning");function kb(){return new Promise(async(e,t)=>{try{await Eo()}catch(r){t(r)}Qe.list((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}a(kb,"list");function vk(e){return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.describe(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(vk,"describe");function poe(){if(!mf){for(let e of zr||[])e.kill();zr=[];return}return new Promise(async(e,t)=>{try{await Eo()}catch(r){t(r)}Qe.killDaemon((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}a(poe,"kill");async function moe(){try{await Fk(),await Gk(),await Ea(fa.generateAllServiceConfigs())}catch(e){throw Qe?.disconnect(),e}}a(moe,"startAllServices");async function Fb(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case at.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=fa.generateMainServerConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=fa.generateNatsIngestServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=fa.generateNatsReplyServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=fa.generateNatsHubServerConfig(),await Ea(r,t),await fo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=fa.generateNatsLeafServerConfig(),await Ea(r,t),await fo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=fa.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await Ea(r)}catch(r){throw Qe?.disconnect(),r}}a(Fb,"startService");async function Bk(){try{let e=await kb(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw Qe?.disconnect(),e}}a(Bk,"getUniqueServicesList");async function Soe(e=[]){try{let t=!1,r=await Bk();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===at.PROCESS_DESCRIPTORS.HDB?t=!0:await Lk(o))}t&&await xk(at.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Qe?.disconnect(),t}}a(Soe,"restartAllServices");async function Hk(e){if(zr?.find(r=>r.name===e))return!0;let t=await aoe.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(Hk,"isServiceRegistered");async function xk(e){let t=pm.get(at.CONFIG_PARAMS.THREADS_COUNT)??pm.get(at.CONFIG_PARAMS.THREADS),r=await vk(e),n=soe.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await xb(e),await Fb(e)):e===at.PROCESS_DESCRIPTORS.HDB?await Uk():await Dk(e)}a(xk,"reloadStopStart");var kk;async function Fk(e=!1){for(let t in at.CLUSTERING_PROCESSES){let r=at.CLUSTERING_PROCESSES[t];await Fb(r,e)}}a(Fk,"startClusteringProcesses");async function Gk(){kk=Ck(at.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await hm.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await hm.updateLocalStreams();let e=await ioe.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===at.PRE_4_0_0_VERSION){xc.info("Starting clustering upgrade 4.0.0 process"),Ck(at.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(Gk,"startClusteringThreads");async function Toe(){for(let e in at.CLUSTERING_PROCESSES)if(e!==at.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===at.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await kk.terminate();else{let t=at.CLUSTERING_PROCESSES[e];await xb(t)}}a(Toe,"stopClustering");async function goe(){for(let e in at.CLUSTERING_PROCESSES){let t=at.CLUSTERING_PROCESSES[e];if(await Hk(t)===!1)return!1}return!0}a(goe,"isClusteringRunning");async function Aoe(){await fo.generateNatsConfig(!0),await hm.reloadNATSHub(),await hm.reloadNATSLeaf(),await fo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await fo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(Aoe,"reloadClustering")});var $b={};je($b,{compactOnStart:()=>Roe,copyDb:()=>jk});async function Roe(){ha.notify("Running compact on start"),console.log("Running compact on start");let e=(0,Gb.get)(pa.CONFIG_PARAMS.ROOTPATH),t=new Map,r=ut();(0,qb.updateConfigValue)(pa.CONFIG_PARAMS.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,mm.join)(e,"backup",n+".mdb"),o=(0,mm.join)(e,pa.DATABASES_DIR_NAME,n+"-copy.mdb"),c=0;try{c=await $k(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){ha.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 jk(n,o),console.log("Backing up",n,"to",i),await(0,kc.move)(s,i,{overwrite:!0})}try{Uu()}catch(n){ha.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,kc.move)(i,s,{overwrite:!0}),await(0,kc.remove)((0,mm.join)(e,pa.DATABASES_DIR_NAME,`${n}-copy.mdb-lock`));try{Uu()}catch(n){ha.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){ha.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,qb.updateConfigValue)(pa.CONFIG_PARAMS.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,kc.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw Uu(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await $k(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}.
|
|
13
|
+
`,t)}var Rc,oB,q_,$_,gy,Np,V_,Ay,Ip,aB,Op,cB,lB,uB,dB,Z0,eB,_B,xee,kee,rB,nB,EB,sB,iB,Gee,pB,aa,qee,wi=Ie(()=>{Rc=require("worker_threads"),oB=L(dt());Pe();q_=L(j()),$_=require("path"),gy=require("fs/promises"),Np=L(sn()),V_=L(se()),Ay=L(M());qr();(0,V_.initSync)();Ip=new Map,aB=(0,V_.get)(Ay.CONFIG_PARAMS.ANALYTICS_AGGREGATEPERIOD)>-1;a(vee,"setAnalyticsEnabled");a(mr,"recordAction");it.recordAnalytics=mr;a(qn,"recordActionBinary");Op=0,cB=1e3,lB="analytics-report",uB=[];a(K_,"addAnalyticsListener");dB=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Bee,"sendAnalytics");a(Hee,"aggregation");Z0=0,eB=0,_B=a(()=>new Promise(setImmediate),"rest");a(tB,"cleanup");xee=36e5,kee=31536e6;a(Ry,"getRawAnalyticsTable");a(fB,"getAnalyticsTable");(0,oB.setChildListenerByType)(lB,hB);a(Fee,"startScheduledTasks");sB=0,iB=new Map,Gee=!1;a(hB,"recordAnalytics");qee=1e6;a($ee,"logAnalytics")});async function wy(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=ot(),i;if(e.includes("wss://")){if(!by){let l=(0,MB.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),by=u.secureContexts}if(i=by.get(s),i&&fe.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,vB.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,ALPNProtocols:["http/1.1","harperdb-replication"],rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(c.secureContext=UB.createSecureContext({...i.options,ca:Array.from(bc)})),new DB.WebSocket(e,"harperdb-replication-v1",c)}function Lp(e,t,r){let n=t.port||t.securePort,s=Iy.pid%1e3+"-"+LB.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,d=t.databaseSubscriptions||yc,_,E,f=!1,h=t.subscription;h?.then&&h.then(ie=>h=ie);let T=t.tables||u&&ut()[u];if(!r){fe.error?.("No authorization provided"),is(1008,"Unauthorized");return}let m=new Map,g=[],S=r.name;S&&t.connection&&(t.connection.nodeName=S);let y,I,U,H,X,Y,V=1e3,ne,Q=0,de=0,W=0,ae=0;if(t.url){let ie=a(()=>{X&&W===e._socket?.bytesRead&&ae===e._socket?.bytesWritten?e.terminate():(X=performance.now(),e.ping(),W=e._socket?.bytesRead,ae=e._socket?.bytesWritten)},"send_ping");U=setInterval(ie,IB).unref(),ie()}else Oe();function Oe(){clearTimeout(H),W=e._socket?.bytesRead,ae=e._socket?.bytesWritten,H=setTimeout(()=>{W===e._socket?.bytesRead&&ae===e._socket?.bytesWritten&&(fe.warn?.(`Timeout waiting for ping from ${S}, terminating connection and reconnecting`),e.terminate())},IB*2).unref()}a(Oe,"resetPingTimer"),u&&Va(u);let Ne,Me,Gr=[],Id=[],ka,wn=[],wd=[],Ol=[],Mw=150,KE=0,vt=0,Fa,Ga,Us,vs,YE;e.on("message",ie=>{Q=performance.now();try{let Se=ie.dataView=new Oc(ie.buffer,ie.byteOffset,ie.byteLength);if(ie[0]>127){let A=(0,ct.decode)(ie),[w,R,b]=A;switch(w){case SB:{if(R){if(S){if(S!==R){fe.error?.(s,`Node name mismatch, expecting to connect to ${S}, but peer reported name as ${R}, disconnecting`),e.send((0,ct.encode)([_u])),is(1008,"Node name mismatch");return}}else if(S=R,t.connection?.tentativeNode){let x=t.connection.tentativeNode;x.name=S,t.connection.tentativeNode=null,io(S,x)}if(t.connection&&(t.connection.nodeName=S),fe.debug?.(s,"received node name:",S,"db:",u),!u)try{Va(u=A[2]),u==="system"&&(Ne=Zo(t,(x,q)=>{$a(q)&&Ir(q)}),e.on("close",()=>{Ne?.remove()}))}catch(x){fe.warn?.(s,"Error setting database",x),e.send((0,ct.encode)([_u])),is(1008,x.message);return}qa()}break}case OB:{fe.debug?.(s,"Received table definitions for",R.map(x=>x.table));for(let x of R){let q=A[2];x.database=q;let ee;$a(q)&&(q==="system"?We[q]?.[x.table]||(ee=Oy(x,We[q]?.[x.table])):ee=Oy(x,We[q]?.[x.table]),_||(_=ee?.auditStore),T||(T=ut()?.[q]))}break}case _u:is();break;case RB:try{let x=r?.replicates||r?.subscribers||r?.name;server.operation(R,{user:r},!x).then(q=>{Array.isArray(q)&&(q={results:q}),q.requestId=R.requestId,e.send((0,ct.encode)([Cp,q]))},q=>{e.send((0,ct.encode)([Cp,{requestId:R.requestId,error:q instanceof Error?q.toString():q}]))})}catch(x){e.send((0,ct.encode)([Cp,{requestId:R.requestId,error:x instanceof Error?x.toString():x}]))}break;case Cp:let{resolve:P,reject:O}=m.get(R.requestId);R.error?O(new Error(R.error)):P(R),m.delete(R.requestId);break;case yy:let B=A[3];T||(u?fe.error?.(s,"No tables found for",u):fe.error?.(s,"Database name never received"));let k=T[B];k=Oy({table:B,database:u,attributes:R.attributes,schemaDefined:R.schemaDefined},k),Gr[b]={name:B,decoder:new ct.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:R.typedStructs,structures:R.structures}),getEntry(x){return k.primaryStore.getEntry(x)},rootStore:k.primaryStore.rootStore};break;case TB:YE=_?t0(S,R,_):new Map,ka=A[2],fe.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${ka}`);break;case gB:let C=b;Ol[C]=R;break;case bB:let F=["replicated",u,S];E||(E=new Float64Array(_.getUserSharedBuffer(F,new ArrayBuffer(8)))),E[0]=R,fe.trace?.(s,"received and broadcasting committed update",R),E.buffer.notify();break;case yB:y=R,h.send({type:"end_txn",localTime:y,remoteNodeIds:g});break;case AB:{let x=R,q;try{let ee=A[3],G=Id[b]||(Id[b]=T[A[4]]);if(!G)return fe.warn?.("Unknown table id trying to handle record request",b);let Re=G.primaryStore.getBinaryFast(Symbol.for("structures")),Ee=Re.length;if(Ee!==vt){vt=Ee;let te=(0,ct.decode)(Re);e.send((0,ct.encode)([yy,{typedStructs:te.typed,structures:te.named},b,G.tableName]))}let Ae=G.primaryStore.getBinaryFast(ee);if(Ae){let te=G.primaryStore.decoder.decode(Ae,{valueAsBuffer:!0});q=(0,ct.encode)([wp,x,{value:te.value,expiresAt:te.expiresAt,version:te.version,residencyId:te.residencyId,nodeId:te.nodeId,user:te.user}])}else q=(0,ct.encode)([wp,x])}catch(ee){q=(0,ct.encode)([wp,x,{error:ee.message}])}e.send(q);break}case wp:{let{resolve:x,reject:q,tableId:ee,key:G}=m.get(A[1]),Re=A[2];if(Re?.error)q(new Error(Re.error));else if(Re){let Ee=Gr[ee].decoder.decode(Re.value);Re.value=Ee,Re.key=G,x(Re)}else x();m.delete(A[1]);break}case mB:{vs=R;let x,q,ee=!1;if(h){if(u!==h.databaseName&&!h.then){fe.error?.("Subscription request for wrong database",u,h.databaseName);return}}else h=d.get(u);if(fe.debug?.(s,"received subscription request for",u,"at",vs),!h){let ce;h=new Promise(Ye=>{fe.debug?.("Waiting for subscription to database "+u),ce=Ye}),h.ready=ce,yc.set(u,h)}if(r.name)q=pr().subscribe(r.name),q.then(async ce=>{x=ce;for await(let Ye of x){let rt=Ye.value;if(!(rt?.replicates===!0||rt?.replicates?.receives||rt?.subscriptions?.some(Ze=>(Ze.database||Ze.schema)===u&&Ze.publish!==!1))){ee=!0,e.send((0,ct.encode)([_u])),is(1008,`Unauthorized database subscription to ${u}`);return}}},ce=>{fe.error?.(s,"Error subscribing to HDB nodes",ce)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,ct.encode)([_u])),is(1008,`Unauthorized database subscription to ${u}`);return}if(Us&&(fe.debug?.(s,"stopping previous subscription",u),Us.emit("close")),vs.length===0)return;let G=vs[0],Re=a(ce=>{if(ce&&(G.replicateByDefault?!G.tables.includes(ce.tableName):G.tables.includes(ce.tableName)))return{table:ce}},"tableToTableEntry"),Ee={txnTime:0},Ae,te,K=1/0,ge,Be=a((ce,Ye)=>{if(K=Ye,ce.type==="end_txn"){Ee.txnTime&&(o[i]!==66&&fe.error?.("Invalid encoding of message"),di(9),di(Dp),Ka(ge=Ye),we()),i=c,Ee.txnTime=0;return}let rt=ce.nodeId,Ze=ce.tableId,st=te[Ze];if(!st&&(st=te[Ze]=Re(h.tableById[Ze]),!st))return fe.debug?.("Not subscribed to table",Ze);let Bt=st.table,xo=Bt.primaryStore,Yt=xo.encoder;(ce.extendedType&ph||!Yt.typedStructs)&&(Yt._mergeStructures(Yt.getStructures()),Yt.typedStructs&&(Yt.lastTypedStructuresLength=Yt.typedStructs.length));let WE=Ae[rt];if(!(WE&&WE.startTime<Ye&&(!WE.endTime||WE.endTime>Ye)))return W_&&fe.trace?.(s,"skipping replication update",ce.recordId,"to:",S,"from:",rt,"subscribed:",Ae),Uw();W_&&fe.trace?.(s,"sending replication update",ce.recordId,"to:",S,"from:",rt,"subscribed:",Ae);let XT=ce.version;Ee.txnTime!==XT&&(Ee.txnTime&&(W_&&fe.trace?.(s,"new txn time, sending queued txn",Ee.txnTime),o[i]!==66&&fe.error?.("Invalid encoding of message"),we()),Ee.txnTime=XT,i=c,Ka(XT));let Ya=ce.residencyId,ZT=Yi(Ya,Bt),jE;if(ZT&&!ZT.includes(S)){let Il=Yi(ce.previousResidencyId,Bt);if(Il&&!Il.includes(S)&&(ce.type==="put"||ce.type==="patch")||Bt.getResidencyById)return Uw();let Ld=ce.recordId;fe.trace?.(s,"sending invalidation",Ld,S,"from",rt);let rg=0;Ya&&(rg|=Ja),ce.previousResidencyId&&(rg|=Xa);let ng,zE=null;for(let vw in Bt.indices){if(!zE){if(ng=ce.getValue(xo,!0),!ng)break;zE={}}zE[vw]=ng[vw]}jE=Dl(ce.version,Ze,Ld,null,rt,ce.user,ce.type==="put"||ce.type==="patch"?"invalidate":ce.type,Yt.encode(zE),rg,Ya,ce.previousResidencyId,ce.expiresAt)}function Uw(){fe.trace?.(s,"skipping audit record",ce.recordId),Y||(Y=setTimeout(()=>{Y=null,(ge||0)+NB/2<K&&(W_&&fe.trace?.(s,"sending skipped sequence update",K),e.send((0,ct.encode)([yB,K])))},NB).unref())}a(Uw,"skipAuditRecord");let eg=Yt.typedStructs,tg=Yt.structures;if((eg?.length!=st.typed_length||tg?.length!=st.structure_length)&&(st.typed_length=eg?.length,st.structure_length=tg.length,fe.debug?.(s,"send table struct",st.typed_length,st.structure_length),st.sentName||(st.sentName=!0),e.send((0,ct.encode)([yy,{typedStructs:eg,structures:tg,attributes:Bt.attributes,schemaDefined:Bt.schemaDefined},Ze,st.table.tableName]))),Ya&&!wd[Ya]&&(e.send((0,ct.encode)([gB,ZT,Ya])),wd[Ya]=!0),jE)di(jE.length),Dd(jE);else{let Il=ce.encoded,Ld=Il[0]===66?8:0;di(Il.length-Ld),Dd(Il,Ld)}},"sendAuditRecord"),we=a(()=>{c-i>8?(e.send(o.subarray(i,c)),fe.debug?.(s,"Sent message, size:",c-i)):fe.debug?.(s,"skipping empty transaction")},"sendQueuedData");Us=new Ny.EventEmitter,Us.once("close",()=>{ee=!0,x?.end()});for(let{startTime:ce}of vs)ce<K&&(K=ce);(q||Promise.resolve()).then(async()=>{h=await h,_=h.auditStore,te=h.tableById.map(Re),Ae=[];for(let{name:Ye,startTime:rt,endTime:Ze}of vs){let st=hp(Ye,_);fe.debug?.("subscription to",Ye,"using local id",st,"starting",rt),Ae[st]={startTime:rt,endTime:Ze}}Ir(u),Ne||(Ne=Nc(Ye=>{Ye.databaseName===u&&Ir(u)}),Me=j_(Ye=>{Ye===u&&(e.send((0,ct.encode)([_u])),is())}),e.on("close",()=>{Ne?.remove(),Me?.remove()})),e.send((0,ct.encode)([TB,L_(h.auditStore),vs.map(({name:Ye})=>Ye)]));let ce=!0;do{isFinite(K)||(fe.warn?.("Invalid sequence id "+K),is(1008,"Invalid sequence id"+K));let Ye;if(ce&&!ee&&(ce=!1,!(Cy(_)<=K)&&CB.default.get(PB.CONFIG_PARAMS.REPLICATION_COPYTABLESTOCATCHUP)!==!1&&server.nodes[0]?.name===S)){fe.info?.("Replicating all tables to",S);let Ze=K,st=Mp(_);for(let Bt in T){if(!Re(Bt))continue;let xo=T[Bt];for(let Yt of xo.primaryStore.getRange({snapshot:!1})){if(ee)return;Yt.localTime>=K&&(fe.trace?.(s,"Copying record from",u,Bt,Yt.key,Yt.localTime),Ze=Math.max(Yt.localTime,Ze),Ye=!0,Be({recordId:Yt.key,tableId:xo.tableId,type:"put",getValue(){return Yt.value},encoded:xo.primaryStore.getBinary(Yt.key),version:Yt.version,residencyId:Yt.residencyId,nodeId:st},Yt.localTime))}}K=Ze}for(let{key:rt,value:Ze}of _.getRange({start:K||1,exclusiveStart:!0,snapshot:!1})){if(ee)return;de=rt;let st=xt(Ze);Be(st,rt),e._socket.writableNeedDrain?await new Promise(Bt=>e._socket.once("drain",Bt)):await new Promise(setImmediate),Us.startTime=rt,Ye=!0}Ye&&Be({type:"end_txn"},K),de=0,await l0(_)}while(!ee)}).catch(ce=>{fe.error?.(s,"Error handling subscription to node",ce),is(1008,"Error handling subscription to node")});break}}return}Se.position=8;let tt=!0,v,p;do{let A=Se.readInt();if(A===9&&Se.getUint8(Se.position)==Dp){Se.position++,y=p=Se.readFloat64(),fe.trace?.("received remote sequence update",y,u);break}let w=Se.position,R=xt(ie,w,w+A),b=Gr[R.tableId];b||fe.error?.(`No table found with an id of ${R.tableId}`);let P;R.residencyId&&(P=Ol[R.residencyId],fe.trace?.(s,"received residency list",P,R.type,R.recordId));try{v={table:b.name,id:R.recordId,type:R.type,nodeId:YE.get(R.nodeId),residencyList:P,timestamp:R.version,value:R.getValue(b),user:R.user,beginTxn:tt,expiresAt:R.expiresAt}}catch(O){throw O.message+="typed structures for current decoder"+JSON.stringify(b.decoder.typedStructs),O}tt=!1,W_&&fe.trace?.(s,"received replication message",R.type,"id",v.id,"version",R.version,"nodeId",v.nodeId,"value",v.value),h.send(v),Se.position=w+A}while(Se.position<ie.byteLength);KE++,mr(ie.byteLength,"bytes-received",S+"."+u+"."+v.table,"replication","ingest"),KE>Mw&&!Fa&&(Fa=!0,e.pause()),h.send({type:"end_txn",localTime:y,remoteNodeIds:g,onCommit(){if(v){let A=Date.now()-v.timestamp;mr(A,"replication-latency",S+"."+u+"."+v.table,v.type,"ingest")}KE--,Fa&&(Fa=!1,e.resume()),!I&&p&&(fe.trace?.(s,"queuing confirmation of a commit at",p),setTimeout(()=>{e.send((0,ct.encode)([bB,I])),fe.trace?.(s,"sent confirmation of a commit at",I),I=null},Vee)),I=p}})}catch(Se){fe.error?.(s,"Error handling incoming replication message",Se)}}),e.on("ping",Oe),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-X,Tc({name:S,database:u,url:t.url,lastSendTime:de,latency:t.connection.latency})),X=null}),e.on("close",(ie,Se)=>{clearInterval(U),clearTimeout(H),Us&&Us.emit("close"),Ga&&Ga.end();for(let[tt,{reject:v}]of m)v(new Error(`Connection closed ${Se?.toString()} ${ie}`));fe.debug?.(s,"closed",ie,Se?.toString())});function Ve(){}a(Ve,"recordRemoteNodeSequence");function is(ie,Se){e.isFinished=!0,e.close(ie,Se)}a(is,"close");function qa(){if(f||(f=!0,t.connection?.on("subscriptions-updated",qa)),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let ie=new Map;try{for(let v of h?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let p of v.value.nodes||[])p.lastTxnTime>(ie.get(p.id)??0)&&ie.set(p.id,p.lastTxnTime)}catch(v){if(!v.message.includes("Can not re"))throw v}let Se=t.connection?.nodeSubscriptions?.[0];g=[];let tt=t.connection?.nodeSubscriptions.map((v,p)=>{let A=[],{replicateByDefault:w}=v;if(v.subscriptions){for(let O of v.subscriptions)if(O.subscribe&&(O.schema||O.database)===u){let B=O.table;T?.[B]?.replicate!==!1&&A.push(B)}w=!1}else for(let O in T)(w?T[O].replicate===!1:T[O].replicate)&&A.push(O);let R=_&&hp(v.name,_),b=h?.dbisDB?.get([Symbol.for("seq"),R])??1,P=Math.max(b?.seqId??1,(typeof v.start_time=="string"?new Date(v.start_time).getTime():v.start_time)??1);if(fe.debug?.("Starting time recorded in db",v.name,R,u,b?.seqId,"start time:",P),Se!==v){P>5e3&&(P-=5e3);let O=_&&hp(Se.name,_),B=h?.dbisDB?.get([Symbol.for("seq"),O])??1;for(let k of B?.nodes||[])k.name===v.name&&(P=k.seqId,fe.debug?.("Using sequence id from proxy node",Se.name,P))}return g.push(R),ie.get(R)>P&&(P=ie.get(R),fe.debug?.("Updating start time from more recent txn recorded",Se.name,P)),{name:v.name,replicateByDefault:w,tables:A,startTime:P,endTime:v.end_time}});if(tt)if(fe.debug?.(s,"sending subscription request",tt,h?.dbisDB?.path),clearTimeout(ne),tt.length>0)e.send((0,ct.encode)([mB,tt]));else{let v=a(()=>{let p=performance.now();ne=setTimeout(()=>{Q<=p?is(1008,"No nodes to subscribe to"):v()},V)},"schedule_close");v()}}a(qa,"sendSubscriptionRequestUpdate");function Yi(ie,Se){if(!ie)return;let tt=wn[ie];return tt||(tt=Se.getResidencyRecord(ie),wn[ie]=tt),tt}a(Yi,"getResidence");function $a(ie){return!(ca&&ca!="*"&&!ca[ie]&&!ca.includes?.(ie)&&!ca.some?.(Se=>Se.name===ie))}a($a,"checkDatabaseAccess");function Va(ie){if(h=h||d.get(ie),!$a(ie))throw new Error(`Access to database "${ie}" is not permitted`);h||fe.warn?.(`No database named "${ie}" was declared and registered`),_=h?.auditStore,T||(T=ut()?.[ie]);let Se=ot();if(Se===S)throw Se?new Error("Should not connect to self",Se):new Error("Node name not defined");return Cd(Se,ie),!0}a(Va,"setDatabase");function Cd(ie,Se){let tt=ut()?.[Se],v=[];for(let p in tt){let A=tt[p];v.push({table:p,schemaDefined:A.schemaDefined,attributes:A.attributes.map(w=>({name:w.name,type:w.type,isPrimaryKey:w.isPrimaryKey}))})}fe.trace?.("Sending database info for node",ie,"database name",Se),e.send((0,ct.encode)([SB,ie,Se,v]))}a(Cd,"sendNodeDBName");function Ir(ie){let Se=ut()?.[ie],tt=[];for(let v in Se){if(vs&&!vs.some(A=>A.replicateByDefault?!A.tables.includes(v):A.tables.includes(v)))continue;let p=Se[v];tt.push({table:v,schemaDefined:p.schemaDefined,attributes:p.attributes.map(A=>({name:A.name,type:A.type,isPrimaryKey:A.isPrimaryKey}))})}e.send((0,ct.encode)([OB,tt,ie]))}a(Ir,"sendDBSchema");let Nl=1,Pd=[];return{end(){Ga&&Ga.end(),Us&&Us.emit("close")},getRecord(ie){let Se=Nl++;return new Promise((tt,v)=>{let p=[AB,Se,ie.table.tableId,ie.id];Pd[ie.table.tableId]||(p.push(ie.table.tableName),Pd[ie.table.tableId]=!0),e.send((0,ct.encode)(p)),m.set(Se,{tableId:ie.table.tableId,key:ie.id,resolve(A){let{table:w,entry:R}=ie;tt(A),A&&w._recordRelocate(R,A)},reject:v})})},sendOperation(ie){let Se=Nl++;return ie.requestId=Se,e.send((0,ct.encode)([RB,ie])),new Promise((tt,v)=>{m.set(Se,{resolve:tt,reject:v})})}};function di(ie){Ho(5),ie<128?o[c++]=ie:ie<16384?(l.setUint16(c,ie|32768),c+=2):ie<1056964608?(l.setUint32(c,ie|3221225472),c+=4):(o[c]=255,l.setUint32(c+1,ie),c+=5)}function Dd(ie,Se=0,tt=ie.length){let v=tt-Se;Ho(v),ie.copy(o,c,Se,tt),c+=v}function Ka(ie){Ho(8),l.setFloat64(c,ie),c+=8}function Ho(ie){if(ie+16>o.length-c){let Se=Buffer.allocUnsafeSlow(c+ie-i+65536>>10<<11);o.copy(Se,0,i,c),c=c-i,i=0,o=Se,l=new DataView(o.buffer,0,o.length)}}}function Oy(e,t){let r=e.database??"data";if(r!=="data"&&!We[r]){fe.warn?.("Database not found",e.database);return}t||(t={});let n=!1,s=e.schemaDefined,i=t.attributes||[];for(let o=0;o<e.attributes?.length;o++){let c=e.attributes[o],l=i[o];(!l||l.name!==c.name||l.type!==c.type)&&(n=!0,s||(c.indexed=!0),i[o]=c)}return n?(fe.debug?.("(Re)creating",e),Et({table:e.table,database:e.database,schemaDefined:e.schemaDefined,attributes:i,...t})):t}var CB,PB,ct,DB,LB,fe,Ny,MB,UB,Iy,vB,mB,SB,TB,_u,gB,yy,AB,wp,RB,Cp,yB,bB,OB,BB,yc,W_,NB,Vee,IB,by,wB,Pp,HB=Ie(()=>{Pe();ji();YR();JR();us();CB=L(se()),PB=L(M());Ll();ct=require("msgpackr"),DB=require("ws"),LB=require("worker_threads"),fe=L(Sc());B_();Ny=require("events"),MB=L(Js()),UB=L(require("node:tls"));su();Iy=L(require("node:process")),vB=require("node:net");wi();mB=129,SB=140,TB=141,_u=142,gB=130,yy=132,AB=133,wp=134,RB=136,Cp=137,yB=143,bB=144,OB=145,BB=new Map,yc=new Map,W_=!0,NB=300,Vee=2,IB=3e4;a(wy,"createWebSocket");wB=1e3,Pp=class extends Ny.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??js(r)}static{a(this,"NodeReplicationConnection")}socket;startTime;retryTime=wB;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions=[];latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await wy(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;fe.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${Iy.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),fe.info?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=wB,Tc({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,n=Lp(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"?(fe.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"?fe.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`):fe.error?.(`Error in connection to ${this.url} due to ${s.message}`)),this.sessionReject(s)}),this.socket.on("close",(s,i)=>{if(this.isConnected&&(au({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();fe.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(Lp,"replicateOverWS");a(Oy,"ensureTableIfChanged")});var oa={};je(oa,{clearThisNodeName:()=>Xee,disableReplication:()=>jee,enabled_databases:()=>ca,forEachReplicatedDatabase:()=>Zo,getThisNodeId:()=>Mp,getThisNodeName:()=>ot,getThisNodeUrl:()=>ea,hostnameToUrl:()=>Hp,lastTimeInAuditStore:()=>M_,monitorNodeCAs:()=>KB,replicateOperation:()=>ete,replication_certificate_authorities:()=>bc,sendOperationToNode:()=>Q_,servers:()=>Yee,setReplicator:()=>WB,start:()=>Wee,startOnMainThread:()=>ZR,subscribeToNode:()=>ou,unsubscribeFromNode:()=>Tp,urlToNodeName:()=>js});function Wee(e){if(e.port||(e.port=hs.default.get(Ic.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=hs.default.get(Ic.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)),!ot())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let n of v_(e))t.set(js(n.url),n);zee(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=it.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(),Lp(n,e,s?.user),n.on("error",c=>{c.code!=="ECONNREFUSED"&&Sr.error("Error in connection to "+this.url,c.message)})},e);e.runFirst=!0,it.http((n,s)=>{if(n.isWebSocket&&n.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){!n.authorized&&n._nodeRequest.socket.authorizationError&&Sr.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=pr().primaryStore;if(n.authorized&&n.peerCertificate.subject){let o=n.peerCertificate.subject,c=o&&(i.get(o.CN)||t.get(o.CN));c?n.user=c:Sr.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:Sr.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(bc);o.options.availableCAs&&c.push(...o.options.availableCAs.values());let l={...o.options,ca:c};o.replicationContext=Bp.createSecureContext(l)}catch(c){Sr.error("Error creating replication TLS config",c)}},"updateContexts");n.secureContextsListeners.push(s),KB(s),hs.default.get(Ic.CONFIG_PARAMS.REPLICATION_ENABLEROOTCAS)!==!1&&s()}}function KB(e){let t=0;nu(r=>{r?.ca&&(bc.add(r.ca),bc.size!==t&&(t=bc.size,e?.()))})}function jee(e=!0){VB=e}function zee(e){VB||(ut(),ca=e.databases,Zo(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||yc;for(let[s,i]of z_){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];WB(r,s,e),BB.get(s)?.forEach(i=>i(s))}}))}function WB(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 YB extends Dr{static{a(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||yc,o=i.get(e),c=o?.tableById||[];c[t.tableId]=t;let l=o?.ready;if(Sr.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new Dn,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 d;for(let E of c){let f=Qee(E,YB.subscription,e);f?.isConnected&&!u.has(f)&&(!d||f.latency<d.latency)&&(d=f)}if(!d)throw l||new qB.ServerError("No connection to any other nodes are available",502);let _={requestId:Kee++,table:t,entry:i,id:i.key};u.add(d);try{return await d.getRecord(_)}catch(E){if(d.isConnected)throw E;Sr.warn("Error in load from node",vp,E),l||(l=E)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function jB(e,t,r,n,s){let i=z_.get(e);i||z_.set(e,i=new Map);let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new Pp(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function Qee(e,t,r){let n=xB.get(e)?.get(r);if(n)return n;let s=pr().primaryStore.get(e);return s?.url&&(n=jB(s.url,t,r,e,s.authorization),xB.set(e,z_.get(s.url))),n}async function Q_(e,t,r){r||(r={}),r.serverName=e.name;let n=await wy(e.url,r),s=Lp(n,{},{});return new Promise((i,o)=>{n.on("open",()=>{i(s.sendOperation(t))}),n.on("error",c=>{o(c)}),n.on("close",c=>{Sr.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function ou(e){try{$B.isMainThread&&Sr.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=yc.get(e.database);if(!t){let n;t=new Promise(s=>{Sr.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,yc.set(e.database,t)}let r=jB(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=>U_(n,e.database)),e.replicateByDefault)}catch(t){Sr.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function Tp({name:e,url:t,database:r}){Sr.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(pr().primaryStore.getRange({})));let n=z_.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Jee(){if(Py!==void 0)return Py;let e=hs.default.get(Ic.CONFIG_PARAMS.OPERATIONSAPI_TLS_CERTIFICATE)||hs.default.get(Ic.CONFIG_PARAMS.TLS_CERTIFICATE);if(e)return Py=new FB.X509Certificate((0,GB.readFileSync)(e)).subject.match(/CN=(.*)/)?.[1]??null}function ot(){return vp||(vp=hs.default.get("replication_hostname")??js(hs.default.get("replication_url"))??Jee()??kB("operationsapi_network_secureport")??kB("operationsapi_network_port")??"127.0.0.1")}function Xee(){vp=void 0}function kB(e){let t=hs.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function Up(e){let t=hs.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function Mp(e){return L_(e)?.[ot()]}function ea(){let e=hs.default.get("replication_url");return e||Hp(ot())}function Hp(e){let t=Up("replication_port");if(t)return`ws://${e}:${t}`;if(t=Up("replication_secureport"),t)return`wss://${e}:${t}`;if(t=Up("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=Up("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function js(e){if(e)return new URL(e).hostname}function Zo(e,t){for(let n of Object.getOwnPropertyNames(We))r(n);return j_(n=>{r(n)}),Nc((n,s)=>{r(n.databaseName)});function r(n){let s=We[n];Sr.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):Zee(n)&&t(s,n,!1)}a(r,"forDatabase")}function Zee(e){let t=We[e];for(let r in t)if(t[r].replicate)return!0}function M_(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function ete(e){let t={message:""};if(e.replicated){e.replicated=!1,Sr.trace?.("Replicating operation",e.operation,"to nodes",it.nodes.map(n=>n.name));let r=await Promise.allSettled(it.nodes.map(n=>Q_(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=it.nodes[s]?.name,i})}return t}var hs,Sr,FB,GB,Ic,Bp,qB,$B,VB,Kee,Yee,bc,ca,z_,xB,Py,vp,us=Ie(()=>{Pe();Vs();Cl();HB();qr();hs=L(se()),Sr=L(j()),FB=require("crypto"),GB=require("fs");B_();su();Ic=L(M());YR();Bp=L(require("node:tls")),qB=L(_e()),$B=require("worker_threads"),Kee=1,Yee=[],bc=hs.default.get(Ic.CONFIG_PARAMS.REPLICATION_ENABLEROOTCAS)!==!1?new Set(Bp.rootCertificates):new Set;a(Wee,"start");a(KB,"monitorNodeCAs");a(jee,"disableReplication");a(zee,"assignReplicationSource");a(WB,"setReplicator");z_=new Map;a(jB,"getConnection");xB=new Map;a(Qee,"getConnectionByName");a(Q_,"sendOperationToNode");a(ou,"subscribeToNode");a(Tp,"unsubscribeFromNode");a(Jee,"getCommonNameFromCert");a(ot,"getThisNodeName");a(Xee,"clearThisNodeName");Object.defineProperty(it,"hostname",{get(){return ot()}});a(kB,"getHostFromListeningPort");a(Up,"getPortFromListeningPort");a(Mp,"getThisNodeId");it.replication={getThisNodeId:Mp,exportIdMapping:L_};a(ea,"getThisNodeUrl");a(Hp,"hostnameToUrl");a(js,"urlToNodeName");a(Zo,"forEachReplicatedDatabase");a(Zee,"hasExplicitlyReplicatedTable");a(M_,"lastTimeInAuditStore");a(ete,"replicateOperation")});var Gp=N((kNe,ZB)=>{"use strict";var fu=Oh(),Eu=Zv(),tte=j(),rte=require("uuid").v4,xNe=require("clone"),kp=eo(),hu=M(),nte=require("util"),la=Un(),{handleHDBError:mn,hdb_errors:ste}=_e(),{HDB_ERROR_MSGS:xp,HTTP_STATUS_CODES:Sn}=ste,{SchemaEventMsg:Fp}=qs(),zB=Tr(),{getDatabases:ite}=(Pe(),oe(lt)),{transformReq:pu}=re(),{replicateOperation:QB}=(us(),oe(oa));ZB.exports={createSchema:ote,createSchemaStructure:JB,createTable:ate,createTableStructure:XB,createAttribute:_te,dropSchema:cte,dropTable:lte,dropAttribute:ute,getBackup:fte};async function ote(e){let t=await JB(e);return kp.signalSchemaChange(new Fp(process.pid,e.operation,e.schema)),t}a(ote,"createSchema");async function JB(e){let t=fu.schema_object(e);if(t)throw mn(t,t.message,Sn.BAD_REQUEST,void 0,void 0,!0);if(pu(e),!await Eu.checkSchemaExists(e.schema))throw mn(new Error,xp.SCHEMA_EXISTS_ERR(e.schema),Sn.BAD_REQUEST,hu.LOG_LEVELS.ERROR,xp.SCHEMA_EXISTS_ERR(e.schema),!0);return await la.createSchema(e),`database '${e.schema}' successfully created`}a(JB,"createSchemaStructure");async function ate(e){return pu(e),e.hash_attribute=e.primary_key??e.hash_attribute,await XB(e)}a(ate,"createTable");async function XB(e){let t=fu.create_table_object(e);if(t)throw mn(t,t.message,Sn.BAD_REQUEST,void 0,void 0,!0);if(fu.validateTableResidence(e.residence),!await Eu.checkSchemaTableExists(e.schema,e.table))throw mn(new Error,xp.TABLE_EXISTS_ERR(e.schema,e.table),Sn.BAD_REQUEST,hu.LOG_LEVELS.ERROR,xp.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:rte(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await la.createTable(n,e);else throw mn(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Sn.BAD_REQUEST);else await la.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}a(XB,"createTableStructure");async function cte(e){let t=!e.schema&&!e.database?new Error("database is required"):void 0,r=fu.schema_object(e),n=t??r;if(n)throw mn(n,n.message,Sn.BAD_REQUEST,void 0,void 0,!0);pu(e);let s=await Eu.checkSchemaExists(e.schema);if(s)throw mn(new Error,s,Sn.NOT_FOUND,hu.LOG_LEVELS.ERROR,s,!0);let i=await Eu.schema_describe.describeSchema({schema:e.schema}),o=Object.keys(global.hdb_schema[e.schema]);await la.dropSchema(e),kp.signalSchemaChange(new Fp(process.pid,e.operation,e.schema)),await zB.purgeSchemaTableStreams(e.schema,o);let c=await QB(e);return c.message=`successfully deleted '${e.schema}'`,c}a(cte,"dropSchema");async function lte(e){let t=fu.table_object(e);if(t)throw mn(t,t.message,Sn.BAD_REQUEST,void 0,void 0,!0);pu(e);let r=await Eu.checkSchemaTableExists(e.schema,e.table);if(r)throw mn(new Error,r,Sn.NOT_FOUND,hu.LOG_LEVELS.ERROR,r,!0);await la.dropTable(e),await zB.purgeTableStream(e.schema,e.table);let n=await QB(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(lte,"dropTable");async function ute(e){let t=fu.attribute_object(e);if(t)throw mn(t,t.message,Sn.BAD_REQUEST,void 0,void 0,!0);pu(e);let r=await Eu.checkSchemaTableExists(e.schema,e.table);if(r)throw mn(new Error,r,Sn.NOT_FOUND,hu.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw mn(new Error,"You cannot drop a hash attribute",Sn.BAD_REQUEST,void 0,void 0,!0);if(hu.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw mn(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Sn.BAD_REQUEST,void 0,void 0,!0);try{return await la.dropAttribute(e),dte(e),kp.signalSchemaChange(new Fp(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw tte.error(`Got an error deleting attribute ${nte.inspect(e)}.`),n}}a(ute,"dropAttribute");function dte(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(dte,"dropAttributeFromGlobal");async function _te(e){pu(e);let t=ite()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw mn(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Sn.BAD_REQUEST,void 0,void 0,!0);return await la.createAttribute(e),kp.signalSchemaChange(new Fp(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(_te,"createAttribute");function fte(e){return la.getBackup(e)}a(fte,"getBackup")});var tH=N((GNe,eH)=>{"use strict";var{OPERATIONS_ENUM:Ete}=M(),Dy=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Ete.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};eH.exports=Dy});var Ly=N((VNe,oH)=>{"use strict";var hte=Un(),$Ne=tH(),qp=re(),$p=M(),pte=se(),{handleHDBError:rH,hdb_errors:mte}=_e(),{HDB_ERROR_MSGS:nH,HTTP_STATUS_CODES:sH}=mte,Ste=Object.values($p.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),iH="To use this operation audit log must be enabled in harperdb-config.yaml";oH.exports=Tte;async function Tte(e){if(qp.isEmpty(e.schema))throw new Error(nH.SCHEMA_REQUIRED_ERR);if(qp.isEmpty(e.table))throw new Error(nH.TABLE_REQUIRED_ERR);if(!pte.get($p.CONFIG_PARAMS.LOGGING_AUDITLOG))throw rH(new Error,iH,sH.BAD_REQUEST,$p.LOG_LEVELS.ERROR,iH,!0);let t=qp.checkSchemaTableExist(e.schema,e.table);if(t)throw rH(new Error,t,sH.NOT_FOUND,$p.LOG_LEVELS.ERROR,t,!0);if(!qp.isEmpty(e.search_type)&&Ste.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await hte.readAuditLog(e)}a(Tte,"readAuditLog")});var cH=N((YNe,aH)=>{"use strict";var{OPERATIONS_ENUM:gte}=M(),My=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=gte.GET_BACKUP,this.schema=t,this.table=r}};aH.exports=My});var dH=N((QNe,uH)=>{"use strict";var Ate=Un(),jNe=cH(),Uy=re(),Rte=M(),zNe=se(),{handleHDBError:yte,hdb_errors:bte}=_e(),{HDB_ERROR_MSGS:lH,HTTP_STATUS_CODES:Ote}=bte;uH.exports=Nte;async function Nte(e){if(Uy.isEmpty(e.schema))throw new Error(lH.SCHEMA_REQUIRED_ERR);if(Uy.isEmpty(e.table))throw new Error(lH.TABLE_REQUIRED_ERR);let t=Uy.checkSchemaTableExist(e.schema,e.table);if(t)throw yte(new Error,t,Ote.NOT_FOUND,Rte.LOG_LEVELS.ERROR,t,!0);return await Ate.getBackup(read_audit_log_object)}a(Nte,"getBackup")});var mH=N((XNe,pH)=>{var mu=require("validate.js"),fH=gt(),Su=M(),{handleHDBError:Ite,hdb_errors:wte}=_e(),{HDB_ERROR_MSGS:Qt,HTTP_STATUS_CODES:Cte}=wte,vy=a(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Pte={STRUCTURE_USER:"structure_user"},_H=Object.values(Su.ROLE_TYPES_ENUM),Dte="attribute_permissions",Lte="attribute_name",{PERMS_CRUD_ENUM:Tu}=Su,Mte=[Dte,...Object.values(Tu)],EH=[Tu.READ,Tu.INSERT,Tu.UPDATE],Ute=[Lte,...EH];function vte(e){let t=vy();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,hH(e,t)}a(vte,"addRoleValidation");function Bte(e){let t=vy();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,hH(e,t)}a(Bte,"alterRoleValidation");function Hte(e){let t=vy();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,fH.validateObject(e,t)}a(Hte,"dropRoleValidation");var xte=["operation","role","id","permission","hdb_user","hdb_auth_header","access"];function hH(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let o=0,c=n.length;o<c;o++)xte.includes(n[o])||s.push(n[o]);s.length>0&&ir(Qt.INVALID_ROLE_JSON_KEYS(s),r);let i=fH.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{ir(o,r)}),e.permission){let o=kte(e);o&&ir(o,r),_H.forEach(c=>{e.permission[c]&&!mu.isBoolean(e.permission[c])&&ir(Qt.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let o in e.permission)if(_H.indexOf(o)<0){if(o===Pte.STRUCTURE_USER){let l=e.permission[o];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,d=l.length;u<d;u++){let _=l[u];global.hdb_schema[_]||ir(Qt.SCHEMA_NOT_FOUND(_),r)}continue}ir(Qt.STRUCTURE_USER_ROLE_TYPE_ERROR(o),r);continue}let c=e.permission[o];if(!o||!global.hdb_schema[o]){ir(Qt.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]){ir(Qt.TABLE_NOT_FOUND(o,l),r);continue}if(Object.keys(u).forEach(d=>{Mte.includes(d)||ir(Qt.INVALID_PERM_KEY(d),r,o,l)}),Object.values(Tu).forEach(d=>{mu.isDefined(u[d])?mu.isBoolean(u[d])||ir(Qt.TABLE_PERM_NOT_BOOLEAN(d),r,o,l):ir(Qt.TABLE_PERM_MISSING(d),r,o,l)}),u.attribute_permissions===void 0){ir(Qt.ATTR_PERMS_ARRAY_MISSING,r,o,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){ir(Qt.ATTR_PERMS_NOT_ARRAY,r,o,l);continue}if(u.attribute_permissions){let d=global.hdb_schema[o][l].attributes.map(({attribute:E})=>E),_={read:!1,insert:!1,update:!1};for(let E in u.attribute_permissions){let f=u.attribute_permissions[E];if(Object.keys(f).forEach(T=>{!Ute.includes(T)&&T!==Tu.DELETE&&ir(Qt.INVALID_ATTR_PERM_KEY(T),r,o,l)}),!mu.isDefined(f.attribute_name)){ir(Qt.ATTR_PERM_MISSING_NAME,r,o,l);continue}let h=f.attribute_name;if(!d.includes(h)){ir(Qt.INVALID_ATTRIBUTE_IN_PERMS(h),r,o,l);continue}EH.forEach(T=>{mu.isDefined(f[T])?mu.isBoolean(f[T])||ir(Qt.ATTR_PERM_NOT_BOOLEAN(T,h),r,o,l):ir(Qt.ATTR_PERM_MISSING(T,h),r,o,l)}),!_.read&&f.read===!0&&(_.read=!0),!_.insert&&f.insert===!0&&(_.insert=!0),!_.update&&f.update===!0&&(_.update=!0)}if(u.read===!1&&_.read===!0||u.insert===!1&&_.insert===!0||u.update===!1&&_.update===!0){let E=`${o}.${l}`;ir(Qt.MISMATCHED_TABLE_ATTR_PERMS(E),r,o,l)}}}}return Fte(r)}a(hH,"customValidate");pH.exports={addRoleValidation:vte,alterRoleValidation:Bte,dropRoleValidation:Hte};function kte(e){let{operation:t,permission:r}=e;if(t===Su.OPERATIONS_ENUM.ADD_ROLE||t===Su.OPERATIONS_ENUM.ALTER_ROLE){let n=r.super_user===!0,s=r.cluster_user===!0;if(Object.keys(r).length>1&&(n||s)){if(s&&n)return Qt.SU_CU_ROLE_COMBINED_ERROR;{let o=r.super_user?Su.ROLE_TYPES_ENUM.SUPER_USER:Su.ROLE_TYPES_ENUM.CLUSTER_USER;return Qt.SU_CU_ROLE_NO_PERMS_ALLOWED(o)}}}return null}a(kte,"validateNoSUPerms");function Fte(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:Qt.ROLE_PERMS_ERROR,...e};return Ite(new Error,n,Cte.BAD_REQUEST)}else return null}a(Fte,"generateRolePermResponse");function ir(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(ir,"addPermError")});var X_=N((tIe,AH)=>{"use strict";var SH=cn(),TH=$r(),Gte=oc(),Hy=mH(),xy=eo(),eIe=require("uuid").v4,qte=require("util"),Vp=M(),$te=re(),ky=TH.searchByValue,Vte=TH.searchByHash,Kte=qte.promisify(Gte.delete),Yte=$s(),Wte=Wl(),{hdb_errors:jte,handleHDBError:wc}=_e(),{HDB_ERROR_MSGS:gH,HTTP_STATUS_CODES:J_}=jte,{UserEventMsg:Fy}=qs();AH.exports={addRole:zte,alterRole:Qte,dropRole:Jte,listRoles:Xte};function By(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(By,"scrubRoleDetails");async function zte(e){let t=Hy.addRoleValidation(e);if(t)throw t;e=By(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 ky(r)||[])}catch(i){throw wc(i)}if(n&&n.length>0)throw wc(new Error,gH.ROLE_ALREADY_EXISTS(e.role),J_.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 SH.insert(s),xy.signalUserChange(new Fy(process.pid)),e=By(e),e}a(zte,"addRole");async function Qte(e){let t=Hy.alterRoleValidation(e);if(t)throw t;e=By(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await SH.update(r)}catch(s){throw wc(s)}if(n&&n?.message==="updated 0 of 1 records")throw wc(new Error,"Invalid role id",J_.BAD_REQUEST,void 0,void 0,!0);return await xy.signalUserChange(new Fy(process.pid)),e}a(Qte,"alterRole");async function Jte(e){let t=Hy.dropRoleValidation(e);if(t)throw wc(new Error,t,J_.BAD_REQUEST,void 0,void 0,!0);let r=new Wte(Vp.SYSTEM_SCHEMA_NAME,Vp.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Vte(r));if(n.length===0)throw wc(new Error,gH.ROLE_NOT_FOUND,J_.NOT_FOUND,void 0,void 0,!0);let s=new Yte(Vp.SYSTEM_SCHEMA_NAME,Vp.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await ky(s)),o=!1;if($te.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){o=!0;break}}if(o===!0)throw wc(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,J_.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Kte(c),xy.signalUserChange(new Fy(process.pid)),`${n[0].role} successfully deleted`}a(Jte,"dropRole");async function Xte(){return ky({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}a(Xte,"listRoles")});var OH=N((nIe,bH)=>{"use strict";var Zte=se(),ua=require("joi"),ere=gt(),RH=require("moment"),tre=require("fs-extra"),Gy=require("path"),rre=require("lodash"),Z_=M(),{LOG_LEVELS:Cc}=M(),nre="YYYY-MM-DD hh:mm:ss",sre=Gy.resolve(__dirname,"../logs");bH.exports=function(e){return ere.validateBySchema(e,ire)};var ire=ua.object({from:ua.custom(yH),until:ua.custom(yH),level:ua.valid(Cc.NOTIFY,Cc.FATAL,Cc.ERROR,Cc.WARN,Cc.INFO,Cc.DEBUG,Cc.TRACE),order:ua.valid("asc","desc"),limit:ua.number().min(1),start:ua.number().min(0),log_name:ua.custom(ore)});function yH(e,t){if(RH(e,RH.ISO_8601).format(nre)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(yH,"validateDatetime");function ore(e,t){if(rre.invert(Z_.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Zte.get(Z_.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?Z_.LOG_NAMES.HDB:e,i=s===Z_.LOG_NAMES.INSTALL?Gy.join(sre,Z_.LOG_NAMES.INSTALL):Gy.join(n,s);return tre.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(ore,"validateReadLogPath")});var $y=N((iIe,IH)=>{"use strict";var Kp=M(),are=j(),cre=se(),lre=OH(),qy=require("path"),NH=require("fs-extra"),{once:ure}=require("events"),{handleHDBError:dre,hdb_errors:_re}=_e(),{PACKAGE_ROOT:fre}=M(),Ere=qy.join(fre,"logs"),hre=1e3,pre=200;IH.exports=mre;async function mre(e){let t=lre(e);if(t)throw dre(t,t.message,_re.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=cre.get(Kp.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?Kp.LOG_NAMES.HDB:e.log_name,s=n===Kp.LOG_NAMES.INSTALL?qy.join(Ere,Kp.LOG_NAMES.INSTALL):qy.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,d=u?new Date(e.until):void 0,_=e.limit===void 0?hre:e.limit,E=e.order===void 0?void 0:e.order,f=e.start===void 0?0:e.start,h=f+_,T=0;E==="desc"&&!l&&!d&&(T=Math.max(NH.statSync(s).size-(h+5)*pre,0));let m=NH.createReadStream(s,{start:T});m.on("error",H=>{are.error(H)});let g=0,S=[],y="",I;m.on("data",H=>{let X=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;H=y+H;let Y=0,V;for(;(V=X.exec(H))&&!m.destroyed;){I&&(I.message=H.slice(Y,V.index),U(I));let[ne,Q,de]=V,W=de.split("] ["),ae=W[0],Oe=W[1];W.splice(0,2),I={timestamp:Q,thread:ae,level:Oe,tags:W,message:""},Y=V.index+ne.length}y=H.slice(Y)}),m.on("end",H=>{m.destroyed||I&&(I.message=y.trim(),U(I))}),m.resume();function U(H){let X,Y,V;switch(!0){case(i&&c&&u):X=new Date(H.timestamp),Y=new Date(l),V=new Date(d),H.level===o&&X>=Y&&X<=V&&g<f?g++:H.level===o&&X>=Y&&X<=V&&(da(H,E,S),g++,g===h&&m.destroy());break;case(i&&c):X=new Date(H.timestamp),Y=new Date(l),H.level===o&&X>=Y&&g<f?g++:H.level===o&&X>=Y&&(da(H,E,S),g++,g===h&&m.destroy());break;case(i&&u):X=new Date(H.timestamp),V=new Date(d),H.level===o&&X<=V&&g<f?g++:H.level===o&&X<=V&&(da(H,E,S),g++,g===h&&m.destroy());break;case(c&&u):X=new Date(H.timestamp),Y=new Date(l),V=new Date(d),X>=Y&&X<=V&&g<f?g++:X>=Y&&X<=V&&(da(H,E,S),g++,g===h&&m.destroy());break;case i:H.level===o&&g<f?g++:H.level===o&&(da(H,E,S),g++,g===h&&m.destroy());break;case c:X=new Date(H.timestamp),Y=new Date(l),X>=Y&&g<f?g++:X>=Y&&g>=f&&(da(H,E,S),g++,g===h&&m.destroy());break;case u:X=new Date(H.timestamp),V=new Date(d),X<=V&&g<f?g++:X<=V&&g>=f&&(da(H,E,S),g++,g===h&&m.destroy());break;default:g<f?g++:(da(H,E,S),g++,g===h&&m.destroy())}}return a(U,"onLogMessage"),await ure(m,"close"),S}a(mre,"readLog");function da(e,t,r){t==="desc"?Sre(e,r):t==="asc"?Tre(e,r):r.push(e)}a(da,"pushLineToResult");function Sre(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(Sre,"insertDescending");function Tre(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(Tre,"insertAscending")});var Yp=N((dIe,DH)=>{"use strict";var Vy=require("joi"),{string:gu,boolean:wH,date:gre}=Vy.types(),Are=gt(),{validateSchemaExists:aIe,validateTableExists:cIe,validateSchemaName:lIe}=Si(),Rre=M(),yre=It(),CH=se();CH.initSync();var uIe=gu.invalid(CH.get(Rre.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(yre.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),PH={operation:gu.valid("add_node","update_node","set_node_replication"),node_name:gu.optional(),subscriptions:Vy.array().items({table:gu.optional(),schema:gu.optional(),database:gu.optional(),subscribe:wH.required(),publish:wH.required().custom(Ore),start_time:gre.iso()})};function bre(e){return Are.validateBySchema(e,Vy.object(PH))}a(bre,"addUpdateNodeValidator");function Ore(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(Ore,"checkForFalsy");DH.exports={addUpdateNodeValidator:bre,validation_schema:PH}});var MH=N((fIe,LH)=>{var Nre=gt(),Ire={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};LH.exports=function(e){return Nre.validateObject(e,Ire)}});var Ky=N((hIe,BH)=>{"use strict";var wre=MH(),Au=require("passport"),Cre=require("passport-local").Strategy,Pre=require("passport-http").BasicStrategy,Dre=require("util"),Lre=xn(),vH=Dre.callbackify(Lre.findAndValidateUser),EIe=Pn(),Mre=M(),UH=cu();Au.use(new Cre(function(e,t,r){vH(e,t,r)}));Au.use(new Pre(function(e,t,r){vH(e,t,r)}));Au.serializeUser(function(e,t){t(null,e)});Au.deserializeUser(function(e,t){t(null,e)});function Ure(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":Au.authenticate("basic",{session:!1},(o,c)=>{i(o,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===Mre.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?UH.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):UH.validateOperationToken(s).then(o=>{r(null,o)}).catch(o=>{r(o)});break;default:Au.authenticate("local",{session:!1},function(o,c){i(o,c)})(e,t,r);break}}a(Ure,"authorize");function vre(e,t){let r=wre(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(vre,"checkPermissions");BH.exports={authorize:Ure,checkPermissions:vre}});var Ru=N((mIe,HH)=>{"use strict";var Yy=class{static{a(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},Wy=class{static{a(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};HH.exports={Node:Yy,NodeSubscription:Wy}});var kH=N((TIe,xH)=>{"use strict";var Bre=M().OPERATIONS_ENUM,jy=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Bre.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};xH.exports=jy});var ef=N((AIe,FH)=>{"use strict";var zy=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},Qy=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)}};FH.exports={RemotePayloadObject:zy,RemotePayloadSubscription:Qy}});var qH=N((yIe,GH)=>{"use strict";var Jy=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}};GH.exports=Jy});var VH=N((CIe,$H)=>{"use strict";var Hre=qH(),OIe=Ht(),NIe=ht(),xre=j(),{getSchemaPath:IIe,getTransactionAuditStorePath:wIe}=Tt(),{getDatabases:kre}=(Pe(),oe(lt));$H.exports=Fre;async function Fre(e){let t=new Hre;try{let r=kre()[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){xre.warn(`unable to stat table dbi due to ${r}`)}return t}a(Fre,"lmdbGetTableSize")});var YH=N((DIe,KH)=>{"use strict";var Xy=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}};KH.exports=Xy});var bu=N((HIe,QH)=>{"use strict";var Gre=require("fs-extra"),qre=require("path"),jr=require("systeminformation"),_a=j(),WH=Tr(),MIe=It(),yu=M(),$re=VH(),Vre=Zi(),{getThreadInfo:jH}=dt(),tf=se();tf.initSync();var Kre=YH(),{openEnvironment:UIe}=ht(),{getSchemaPath:vIe}=Tt(),{database:BIe,databases:Zy}=(Pe(),oe(lt)),Wp;QH.exports={getHDBProcessInfo:nb,getNetworkInfo:ib,getDiskInfo:sb,getMemoryInfo:rb,getCPUInfo:tb,getTimeInfo:eb,getSystemInformation:ob,systemInformation:Yre,getTableSize:ab,getMetrics:cb};function eb(){return jr.time()}a(eb,"getTimeInfo");async function tb(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:o,governor:c,socket:l,cache:u,...d}=await jr.cpu();d.cpu_speed=await jr.cpuCurrentSpeed();let{raw_currentload:_,raw_currentload_idle:E,raw_currentload_irq:f,raw_currentload_nice:h,raw_currentload_system:T,raw_currentload_user:m,cpus:g,...S}=await jr.currentLoad();return S.cpus=[],g.forEach(y=>{let{raw_load:I,raw_load_idle:U,raw_load_irq:H,raw_load_nice:X,raw_load_system:Y,raw_load_user:V,...ne}=y;S.cpus.push(ne)}),d.current_load=S,d}catch(e){return _a.error(`error in getCPUInfo: ${e}`),{}}}a(tb,"getCPUInfo");async function rb(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await jr.mem();return Object.assign(s,process.memoryUsage())}catch(e){return _a.error(`error in getMemoryInfo: ${e}`),{}}}a(rb,"getMemoryInfo");async function nb(){let e={core:[],clustering:[]};try{let t=await jr.processes(),r;try{r=Number.parseInt(await Gre.readFile(qre.join(tf.get(yu.CONFIG_PARAMS.ROOTPATH),yu.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===yu.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(nb,"getHDBProcessInfo");async function sb(){let e={};try{if(!tf.get(yu.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await jr.disksIO();e.io=i;let{rx_sec:o,tx_sec:c,wx_sec:l,...u}=await jr.fsStats();return e.read_write=u,e.size=await jr.fsSize(),e}catch(t){return _a.error(`error in getDiskInfo: ${t}`),e}}a(sb,"getDiskInfo");async function ib(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return tf.get(yu.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await jr.networkInterfaceDefault(),e.latency=await jr.inetChecksite("google.com"),(await jr.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:o,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrier_changes:_,...E}=n;e.interfaces.push(E)}),(await jr.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(ib,"getNetworkInfo");async function ob(){if(Wp!==void 0)return Wp;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:o,...c}=await jr.osInfo();e=c;let l=await jr.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,Wp=e,Wp}catch(t){return _a.error(`error in getSystemInformation: ${t}`),e}}a(ob,"getSystemInformation");async function ab(){let e=[],t=await Vre.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await $re(n));return e}a(ab,"getTableSize");async function cb(){let e={};for(let t in Zy){let r=e[t]={},n=r.tables={};for(let s in Zy[t])try{let i=Zy[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,d,_]=l.trim().split(" ");return{pid:u,thread:d,txnid:_}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:_,overflowPages:E}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:_,overflowPages:E}}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(cb,"getMetrics");async function zH(){if(tf.get(yu.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await WH.getNATSReferences(),t=await WH.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(zH,"getNatsStreamInfo");async function Yre(e){let t=new Kre;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await ob(),t.time=eb(),t.cpu=await tb(),t.memory=await rb(),t.disk=await sb(),t.network=await ib(),t.harperdb_processes=await nb(),t.table_size=await ab(),t.metrics=await cb(),t.threads=await jH(),t.replication=await zH(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await ob();break;case"time":t.time=eb();break;case"cpu":t.cpu=await tb();break;case"memory":t.memory=await rb();break;case"disk":t.disk=await sb();break;case"network":t.network=await ib();break;case"harperdb_processes":t.harperdb_processes=await nb();break;case"table_size":t.table_size=await ab();break;case"database_metrics":case"metrics":t.metrics=await cb();break;case"threads":t.threads=await jH();break;case"replication":t.replication=await zH();break;default:break}return t}a(Yre,"systemInformation")});var Ou=N((kIe,Wre)=>{Wre.exports={name:"harperdb",version:"4.4.27",description:"HarperDB is a distributed database, caching service, streaming broker, and application development platform focused on performance and ease of use.",keywords:["database","nosql","api","distributed","broker","mqtt","real-time","enterprise","Fastify","NATS","HarperDB","Harper","clustering","replication","REST","WebSockets","decentralized","server-sent events","document store"],main:"harperdb.js",bin:{harperdb:"./bin/harperdb.js"},engines:{"minimum-node":"16.0.0","go-lang":"1.21.7","nats-server":"2.10.11"},exports:{".":"./index.js"},homepage:"https://www.harperdb.io/",bugs:"support@harperdb.io",author:{name:"HarperDB",email:"support@harperdb.io"},license:"SEE LICENSE IN LICENSE",scripts:{submodules:"git submodule update --init --recursive","cover:test":"pm2 kill && rimraf ./.nyc_output/* && node utility/devops/register.js --reset_license && nyc --no-clean --reporter=lcovonly npm run test:replication && nyc --no-clean --reporter=lcovonly npm run test:apitests && nyc --no-clean --reporter=lcovonly npm run test:resources && nyc --no-clean --reporter=lcovonly npm run test:logging && nyc --no-clean --reporter=lcovonly npm run test:upgrade && nyc --no-clean --reporter=lcovonly npm run test:nats && nyc --no-clean --reporter=lcovonly npm run test:cfserver && nyc --no-clean --reporter=lcovonly npm run test:hdbserver && nyc --no-clean --reporter=lcovonly npm run test:bin && nyc --no-clean --reporter=lcovonly npm run test:main && nyc --no-clean --reporter=lcovonly npm run test:security && nyc merge .nyc_output coverage.json && node ./utility/devops/register.js --reset_license",test:"pm2 kill && rimraf ./.nyc_output/* && node utility/devops/register.js --reset_license && npm run test:replication && npm run test:apitests && npm run test:resources && npm run test:logging && npm run test:upgrade && npm run test:nats && npm run test:cfserver && npm run test:hdbserver && npm run test:bin && npm run test:main && npm run test:security && nyc merge .nyc_output coverage.json && node ./utility/devops/register.js --reset_license","test:resources":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/resources/**/*.js' --config '../unitTests/.mocharc.json'","test:bin":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/bin/**/*.js' --config '../unitTests/.mocharc.json'","test:main":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/**/*.js' --config '../unitTests/.mocharc-main.json'","test:lmdbbridge":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/dataLayer/harperBridge/lmdbBridge/**/*.js' --config '../unitTests/.mocharc.json'","test:lmdbutility":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/utility/lmdb/**/*.js' --config '../unitTests/.mocharc.json'","test:hdbserver":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/server/harperdb/hdbServer-test.js' --config '../unitTests/.mocharc.json'","test:cfserver":"npm run submodules && cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/server/fastifyRoutes/customFunctionsServer-test.js' --config '../unitTests/.mocharc.json'","test:nats":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/server/nats/**/*.js' --config '../unitTests/.mocharc.json'","test:upgrade":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/upgrade/**/*.js' --config '../unitTests/.mocharc.json'","test:apitests":"pm2 kill && cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/apiTests/**/*-test.mjs' --config '../unitTests/.mocharc.json'","test:logging":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/utility/logging/*.js' --config '../unitTests/.mocharc.json'","test:ci":" cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/**/*.js' --retries 3 --config '../unitTests/.mocharc-main.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/dataLayer/harperBridge/lmdbBridge/**/*.js' --parallel --retries 3 --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/utility/lmdb/**/*.js' --parallel --retries 3 --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/server/harperdb/hdbServer-test.js' --parallel --retries 3 --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/server/customFunctions/customFunctionsServer-test.js' --parallel --retries 3 --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/upgrade/**/*.js' --parallel --retries 3 --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter && ../node_modules/mocha/bin/_mocha '../unitTests/server/nats/**/*.js' --config '../unitTests/.mocharc.json' --reporter mocha-teamcity-reporter","test:security":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/security/**/*.js' --config '../unitTests/.mocharc.json'","test:replication":"cd bin/ && ../node_modules/mocha/bin/_mocha '../unitTests/server/replication/**/*.js' --config '../unitTests/.mocharc.json'","hdb-check":"./utility/devops/hdb-check.sh","download-prebuilds":"node ./utility/devops/build/download-prebuilds.js",prebuild:"date",postinstall:"node ./launchServiceScripts/launchInstallNATSServer.js",build_nats_dependency:"node ./utility/devops/nats/builder.js",coverage:"nyc --reporter=lcov npm test",format:"prettier .","format:fix":"npm run format -- --write",lint:"eslint .","lint:fix":"npm run lint -- --fix"},dependencies:{"@aws-sdk/client-s3":"3.717.0","@aws-sdk/lib-storage":"3.717.0","@endo/static-module-record":"^1.0.4","@fastify/autoload":"5.10.0","@fastify/compress":"~6.5.0","@fastify/cors":"~9.0.1","@fastify/static":"~7.0.4","@turf/area":"6.5.0","@turf/boolean-contains":"6.5.0","@turf/boolean-disjoint":"6.5.0","@turf/boolean-equal":"6.5.0","@turf/circle":"6.5.0","@turf/difference":"6.5.0","@turf/distance":"6.5.0","@turf/helpers":"6.5.0","@turf/length":"6.5.0",alasql:"4.1.10","cbor-x":"1.6.0",chalk:"4.1.2",chokidar:"^4.0.3","cli-progress":"3.12.0",clone:"2.1.2","fast-glob":"3.3.2",fastify:"~4.29.0","fastify-plugin":"~4.5.1","fs-extra":"11.2.0",graphql:"^16.10.0","gunzip-maybe":"1.4.2","human-readable-ids":"1.0.4",inquirer:"8.2.6","is-number":"7.0.0",joi:"17.12.2","json-bigint-fixes":"1.1.0",json2csv:"5.0.7",jsonata:"1.8.7",jsonwebtoken:"9.0.2",lmdb:"3.2.6",lodash:"4.17.21",mathjs:"11.12.0",minimist:"1.2.8",moment:"2.30.1","mqtt-packet":"~9.0.0",msgpackr:"1.11.2",nats:"2.19.0",needle:"3.3.1","node-forge":"^1.3.1","node-stream-zip":"1.15.0","node-unix-socket":"0.2.5","normalize-path":"^3.0.0",ora:"5.4.1","ordered-binary":"1.5.3",papaparse:"5.4.1",passport:"0.6.0","passport-http":"0.3.0","passport-local":"1.0.0",pino:"8.16.0",pm2:"5.4.1",prompt:"1.3.0","properties-reader":"2.3.0","recursive-iterator":"3.3.0",semver:"7.5.4",send:"^1.1.0","serve-static":"2.1.0",ses:"1.1.0","stream-chain":"2.2.5","stream-json":"1.8.0",systeminformation:"5.24.5","tar-fs":"3.0.6",ulidx:"0.5.0",uuid:"10.0.0","validate.js":"0.13.1",ws:"8.18.0",yaml:"2.7.0"},devDependencies:{"@tsconfig/node16":"^1.0.3","@types/node":"20.14.8","@typescript-eslint/eslint-plugin":"^7.18.0","@typescript-eslint/parser":"^7.18.0",axios:"1.7.5",chai:"4.4.1","chai-integer":"0.1.0",esbuild:"^0.24.2",eslint:"^8.57.1","eslint-config-prettier":"^9.1.0","eslint-plugin-sonarjs":"^3.0.1",eventsource:"^2.0.2","graphql-http":"^1.22.3","hook-std":"3.0.0","intercept-stdout":"0.1.2",mkcert:"1.5.1",mocha:"^11.0.1","mocha-teamcity-reporter":"^4.2.0","mock-require":"3.0.3","mock-stdin":"1.0.0",mqtt:"~4.3.8",newman:"6.1.3","node-fetch":"2.6.7",nyc:"15.1.0",prettier:"3.3.3",rewire:"5.0.0",rimraf:"3.0.2",sinon:"10.0.0","sinon-chai":"3.7.0","source-map-support":"^0.5.21",typescript:"^5.7.2",undici:"^6.19.8","why-is-node-still-running":"^1.0.0"},overrides:{alasql:{xlsx:"0.18.5"}},optionalDependencies:{bufferutil:"^4.0.7","segfault-handler":"^1.3.0","utf-8-validate":"^5.0.10"}}});var Pc=N((FIe,JH)=>{"use strict";JH.exports={version:jre,printVersion:zre};var jp=Ou();function jre(){if(jp)return jp.version}a(jre,"version");function zre(){jp&&console.log(`HarperDB Version ${jp.version}`)}a(zre,"printVersion")});var ao=N((VIe,tx)=>{"use strict";var Qre=cn(),lb=re(),Jre=require("util"),Dc=M(),XH=se();XH.initSync();var Xre=Ky(),ZH=$r(),{Node:qIe,NodeSubscription:$Ie}=Ru(),Zre=Wl(),ene=kH(),{RemotePayloadObject:tne,RemotePayloadSubscription:rne}=ef(),{handleHDBError:nne,hdb_errors:sne}=_e(),{HTTP_STATUS_CODES:ine,HDB_ERROR_MSGS:one}=sne,ane=$s(),cne=bu(),lne=Pc(),{getDatabases:une}=(Pe(),oe(lt)),dne=Jre.promisify(Xre.authorize),_ne=ZH.searchByHash,fne=ZH.searchByValue;tx.exports={authHeaderToUser:Ene,isEmpty:hne,getNodeRecord:pne,upsertNodeRecord:mne,buildNodePayloads:Sne,checkClusteringEnabled:Tne,getAllNodeRecords:gne,getSystemInfo:Ane,reverseSubscription:ex};async function Ene(e){let t={headers:{authorization:e.hdb_auth_header}};return e.hdb_user=await dne(t,null),e}a(Ene,"authHeaderToUser");function hne(e){return e==null}a(hne,"isEmpty");async function pne(e){let t=new Zre(Dc.SYSTEM_SCHEMA_NAME,Dc.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return _ne(t)}a(pne,"getNodeRecord");async function mne(e){let t=new ene(Dc.SYSTEM_SCHEMA_NAME,Dc.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Qre.upsert(t)}a(mne,"upsertNodeRecord");function ex(e){if(lb.isEmpty(e.subscribe)||lb.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(ex,"reverseSubscription");function Sne(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,d=lb.getTableHashAttribute(l,u),{subscribe:_,publish:E}=ex(c),f=une()[l]?.[u],h=new rne(l,u,d,E,_,c.start_time,f.schemaDefined?f.attributes:void 0);s.push(h)}return new tne(r,t,s,n)}a(Sne,"buildNodePayloads");function Tne(){if(!XH.get(Dc.CONFIG_PARAMS.CLUSTERING_ENABLED))throw nne(new Error,one.CLUSTERING_NOT_ENABLED,ine.BAD_REQUEST,void 0,void 0,!0)}a(Tne,"checkClusteringEnabled");async function gne(){let e=new ane(Dc.SYSTEM_SCHEMA_NAME,Dc.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await fne(e))}a(gne,"getAllNodeRecords");async function Ane(){let e=await cne.getSystemInformation();return{hdb_version:lne.version(),node_version:e.node_version,platform:e.platform}}a(Ane,"getSystemInfo")});var ub=N((YIe,lx)=>{"use strict";var zp=Tr(),rx=re(),nx=It(),sx=M(),Qp=j(),ix=Gp(),Rne=b_(),{RemotePayloadObject:yne}=ef(),{handleHDBError:ox,hdb_errors:bne}=_e(),{HTTP_STATUS_CODES:ax}=bne,{NodeSubscription:cx}=Ru();lx.exports=One;async function One(e,t){let r;try{r=await zp.request(`${t}.${nx.REQUEST_SUFFIX}`,new yne(sx.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),Qp.trace("Response from remote describe all request:",r)}catch(o){Qp.error(`addNode received error from describe all request to remote node: ${o}`);let c=zp.requestErrorHandler(o,"add_node",t);throw ox(new Error,c,ax.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===nx.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw ox(new Error,o,ax.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===sx.SYSTEM_SCHEMA_NAME){await zp.createLocalTableStream(l,c);let h=new cx(l,c,o.publish,o.subscribe);h.start_time=o.start_time,i.push(h);continue}let u=rx.doesSchemaExist(l),d=n[l]!==void 0,_=c?rx.doesTableExist(l,c):!0,E=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!_&&!E){s.push(o);continue}if(!u&&d&&(Qp.trace(`addNode creating schema: ${l}`),await ix.createSchema({operation:"create_schema",schema:l})),!_&&E){Qp.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let h=new Rne(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(h.attributes=n[l][c].attributes),await ix.createTable(h)}await zp.createLocalTableStream(l,c);let f=new cx(l,c,o.publish,o.subscribe);f.start_time=o.start_time,i.push(f)}return{added:i,skipped:s}}a(One,"reviewSubscriptions")});var Lc={};je(Lc,{addNodeBack:()=>Pne,removeNodeBack:()=>Dne,setNode:()=>Cne});async function Cne(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=js(t)):t=Hp(r);let n=(0,dx.validateBySchema)(e,wne);if(n)throw(0,co.handleHDBError)(n,n.message,Ine.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new co.ClientError("url or hostname is required for remove_node operation");let f=r,h=pr(),T=await h.get(f);if(!T)throw new co.ClientError(f+" does not exist");try{await Q_({url:T.url},{operation:rf.OPERATIONS_ENUM.REMOVE_NODE_BACK,name:T?.subscriptions?.length>0?ot():f},void 0)}catch(m){$n.warn(`Error removing node from target node ${f}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,m)}return await h.delete(f),`Successfully removed '${f}' from cluster`}if(!t)throw new co.ClientError("url required for this operation");let s=ea();if(s==null)throw new co.ClientError("replication url is missing from harperdb-config.yaml");let i,o,c;if(t?.startsWith("wss:")){i=await(0,ps.getReplicationCert)();let f=await(0,ps.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,ps.createCsr)(),$n.info("Sending CSR to target node:",t)):f&&(c=f.certificate,$n.info("Sending CA named",f.name,"to target node",t))}let l={operation:rf.OPERATIONS_ENUM.ADD_NODE_BACK,hostname:(0,_x.get)(rf.CONFIG_PARAMS.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:o,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if(e.subscriptions?l.subscriptions=e.subscriptions.map(ux):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let f=ux(e);l.subscribe=f.subscribe,l.publish=f.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,d;try{u=await Q_({url:t},l,e)}catch(f){f.message=`Error returned from ${t}: `+f.message,$n.warn("Error adding node:",t,"to cluster:",f),d=f}if(o&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw d?(d.message+=" and connection was required to sign certificate",d):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);o&&($n.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,ps.setCertTable)({name:Nne.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,ps.setCertTable)({name:ot(),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 _={url:t,ca:u?.usingCA};if(e.hostname&&(_.name=e.hostname),e.subscriptions?_.subscriptions=e.subscriptions:_.replicates=!0,e.start_time&&(_.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(_.authorization=e.authorization),_.replicates){let f={url:s,ca:c,replicates:!0,subscriptions:null};e.retain_authorization&&(f.authorization=e.authorization),e.start_time&&(f.start_time=e.start_time),await io(ot(),f)}await io(u?u.nodeName:_.name??js(t),_);let E;return e.operation==="update_node"?E=`Successfully updated '${t}'`:E=`Successfully added '${t}' to cluster`,d&&(E+=" but there was an error updating target node: "+d.message),E}async function Pne(e){$n.trace("addNodeBack received request:",e);let t=await(0,ps.signCertificate)(e),r;e.csr?(r=t.signingCA,$n.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,$n.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);let s=await(0,ps.getReplicationCertAuth)();if(n.replicates){let i={url:ea(),ca:s?.certificate,replicates:!0,subscriptions:null};e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await io(ot(),i)}return await io(e.hostname,n),t.nodeName=ot(),t.usingCA=s?.certificate,$n.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function Dne(e){$n.trace("removeNodeBack received request:",e),await pr().delete(e.name)}function ux(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var ps,dx,Nu,_x,rf,$n,co,Nne,Ine,wne,Mc=Ie(()=>{ps=L(Js()),dx=L(gt()),Nu=L(require("joi")),_x=L(se()),rf=L(M());B_();su();us();$n=L(j()),co=L(_e()),{pki:Nne}=require("node-forge"),{HTTP_STATUS_CODES:Ine}=co.hdb_errors,wne=Nu.default.object({hostname:Nu.default.string(),verify_tls:Nu.default.boolean(),replicates:Nu.default.boolean(),subscriptions:Nu.default.array()});a(Cne,"setNode");a(Pne,"addNodeBack");a(Dne,"removeNodeBack");a(ux,"reverseSubscription")});var tm=N((ewe,Ex)=>{"use strict";var{handleHDBError:Jp,hdb_errors:Lne}=_e(),{HTTP_STATUS_CODES:Xp}=Lne,{addUpdateNodeValidator:Mne}=Yp(),Zp=j(),em=M(),fx=It(),Une=re(),nf=Tr(),sf=ao(),db=se(),vne=ub(),{Node:Bne,NodeSubscription:Hne}=Ru(),{broadcast:xne}=dt(),{setNode:kne}=(Mc(),oe(Lc)),XIe=se(),ZIe=M(),Fne="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Gne="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",qne=db.get(em.CONFIG_PARAMS.CLUSTERING_NODENAME);Ex.exports=$ne;async function $ne(e,t=!1){if(Zp.trace("addNode called with:",e),db.get(em.CONFIG_PARAMS.REPLICATION_URL)||db.get(em.CONFIG_PARAMS.REPLICATION_HOSTNAME))return kne(e);sf.checkClusteringEnabled();let r=Mne(e);if(r)throw Jp(r,r.message,Xp.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let _=await sf.getNodeRecord(n);if(!Une.isEmptyOrZeroLength(_))throw Jp(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,Xp.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await vne(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=Fne,o;let c=sf.buildNodePayloads(s,qne,em.OPERATIONS_ENUM.ADD_NODE,await sf.getSystemInfo()),l=[];for(let _=0,E=s.length;_<E;_++){let f=s[_];s[_].start_time===void 0&&delete s[_].start_time,l.push(new Hne(f.schema,f.table,f.publish,f.subscribe))}Zp.trace("addNode sending remote payload:",c);let u;try{u=await nf.request(`${n}.${fx.REQUEST_SUFFIX}`,c)}catch(_){Zp.error(`addNode received error from request: ${_}`);for(let f=0,h=s.length;f<h;f++){let T=s[f];T.publish=!1,T.subscribe=!1,await nf.updateRemoteConsumer(T,n)}let E=nf.requestErrorHandler(_,"add_node",n);throw Jp(new Error,E,Xp.INTERNAL_SERVER_ERROR,"error",E)}if(u.status===fx.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let _=`Error returned from remote node ${n}: ${u.message}`;throw Jp(new Error,_,Xp.INTERNAL_SERVER_ERROR,"error",_)}Zp.trace(u);for(let _=0,E=s.length;_<E;_++){let f=s[_];await nf.updateRemoteConsumer(f,n),f.subscribe===!0&&await nf.updateConsumerIterator(f.schema,f.table,n,"start")}let d=new Bne(n,l,u.system_info);return await sf.upsertNodeRecord(d),xne({type:"nats_update"}),i.length>0?o.message=Gne:o.message=`Successfully added '${n}' to manifest`,o}a($ne,"addNode")});var hb=N((nwe,px)=>{"use strict";var{handleHDBError:_b,hdb_errors:Vne}=_e(),{HTTP_STATUS_CODES:fb}=Vne,{addUpdateNodeValidator:Kne}=Yp(),of=j(),rm=M(),hx=It(),rwe=re(),af=Tr(),cf=ao(),Eb=se(),{cloneDeep:Yne}=require("lodash"),Wne=ub(),{Node:jne,NodeSubscription:zne}=Ru(),{broadcast:Qne}=dt(),{setNode:Jne}=(Mc(),oe(Lc)),Xne="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",Zne="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",ese=Eb.get(rm.CONFIG_PARAMS.CLUSTERING_NODENAME);px.exports=tse;async function tse(e){if(of.trace("updateNode called with:",e),Eb.get(rm.CONFIG_PARAMS.REPLICATION_URL)??Eb.get(rm.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Jne(e);cf.checkClusteringEnabled();let t=Kne(e);if(t)throw _b(t,t.message,fb.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await cf.getNodeRecord(r);s.length>0&&(n=Yne(s));let{added:i,skipped:o}=await Wne(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=Xne,c;let l=cf.buildNodePayloads(i,ese,rm.OPERATIONS_ENUM.UPDATE_NODE,await cf.getSystemInfo());for(let d=0,_=i.length;d<_;d++){let E=i[d];of.trace(`updateNode updating work stream for node: ${r} subscription:`,E),i[d].start_time===void 0&&delete i[d].start_time}of.trace("updateNode sending remote payload:",l);let u;try{u=await af.request(`${r}.${hx.REQUEST_SUFFIX}`,l)}catch(d){of.error(`updateNode received error from request: ${d}`);let _=af.requestErrorHandler(d,"update_node",r);throw _b(new Error,_,fb.INTERNAL_SERVER_ERROR,"error",_)}if(u.status===hx.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw _b(new Error,d,fb.INTERNAL_SERVER_ERROR,"error",d)}of.trace(u);for(let d=0,_=i.length;d<_;d++){let E=i[d];await af.updateRemoteConsumer(E,r),E.subscribe===!0?await af.updateConsumerIterator(E.schema,E.table,r,"start"):await af.updateConsumerIterator(E.schema,E.table,r,"stop")}return n||(n=[new jne(r,[],u.system_info)]),await rse(n[0],i,u.system_info),o.length>0?c.message=Zne:c.message=`Successfully updated '${r}'`,c}a(tse,"updateNode");async function rse(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 d=n.subscriptions[l];if(d.schema===o.schema&&d.table===o.table){d.publish=o.publish,d.subscribe=o.subscribe,c=!0;break}}c||n.subscriptions.push(new zne(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await cf.upsertNodeRecord(n),Qne({type:"nats_update"})}a(rse,"updateNodeTable")});var Ax=N((iwe,gx)=>{"use strict";var Tx=require("joi"),{string:mx}=Tx.types(),nse=gt(),Sx=M(),sse=se(),ise=It();gx.exports=ose;function ose(e){let t=mx.invalid(sse.get(Sx.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(ise.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=Tx.object({operation:mx.valid(Sx.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return nse.validateBySchema(e,r)}a(ose,"removeNodeValidator")});var nm=N((awe,Nx)=>{"use strict";var{handleHDBError:Rx,hdb_errors:ase}=_e(),{HTTP_STATUS_CODES:yx}=ase,cse=Ax(),lf=j(),bx=ao(),lse=re(),Iu=M(),Ox=It(),pb=Tr(),mb=se(),{RemotePayloadObject:use}=ef(),{NodeSubscription:dse}=Ru(),_se=y_(),fse=oc(),{broadcast:Ese}=dt(),{setNode:hse}=(Mc(),oe(Lc)),pse=mb.get(Iu.CONFIG_PARAMS.CLUSTERING_NODENAME);Nx.exports=mse;async function mse(e){if(lf.trace("removeNode called with:",e),mb.get(Iu.CONFIG_PARAMS.REPLICATION_URL)??mb.get(Iu.CONFIG_PARAMS.REPLICATION_HOSTNAME))return hse(e);bx.checkClusteringEnabled();let t=cse(e);if(t)throw Rx(t,t.message,yx.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await bx.getNodeRecord(r);if(lse.isEmptyOrZeroLength(n))throw Rx(new Error,`Node '${r}' was not found.`,yx.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new use(Iu.OPERATIONS_ENUM.REMOVE_NODE,pse,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await pb.updateConsumerIterator(d.schema,d.table,r,"stop");try{await pb.updateRemoteConsumer(new dse(d.schema,d.table,!1,!1),r)}catch(_){lf.error(_)}}try{i=await pb.request(`${r}.${Ox.REQUEST_SUFFIX}`,s),lf.trace("Remove node reply from remote node:",r,i)}catch(l){lf.error("removeNode received error from request:",l),o=!0}let c=new _se(Iu.SYSTEM_SCHEMA_NAME,Iu.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await fse.deleteRecord(c),Ese({type:"nats_update"}),i?.status===Ox.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(lf.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(mse,"removeNode")});var Cx=N((lwe,wx)=>{"use strict";var Ix=require("joi"),{string:Sse,array:Tse}=Ix.types(),gse=gt(),Ase=Yp();wx.exports=Rse;function Rse(e){let t=Ix.object({operation:Sse.valid("configure_cluster").required(),connections:Tse.items(Ase.validation_schema).required()});return gse.validateBySchema(e,t)}a(Rse,"configureClusterValidator")});var Sb=N((dwe,Ux)=>{"use strict";var Px=M(),sm=j(),yse=re(),bse=se(),Ose=nm(),Nse=tm(),Ise=ao(),wse=Cx(),{handleHDBError:Dx,hdb_errors:Cse}=_e(),{HTTP_STATUS_CODES:Lx}=Cse,Pse="Configure cluster complete.",Dse="Failed to configure the cluster. Check the logs for more details.",Lse="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";Ux.exports=Mse;async function Mse(e){sm.trace("configure cluster called with:",e);let t=wse(e);if(t)throw Dx(t,t.message,Lx.BAD_REQUEST,void 0,void 0,!0);let r=await Ise.getAllNodeRecords(),n=[];if(bse.get(Px.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,_=r.length;d<_;d++){let E=await Mx(Ose,{operation:Px.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(E)}sm.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let _=e.connections[d],E=await Mx(Nse,_,_.node_name);s.push(E)}sm.trace("All results from configure_cluster add node:",s);let o=[],c=[],l=!1,u=n.concat(s);for(let d=0,_=u.length;d<_;d++){let E=u[d];E.status==="rejected"&&(sm.error(E.node_name,E?.error?.message,E?.error?.stack),o.includes(E.node_name)||o.push(E.node_name)),(E?.result?.message?.includes?.("Successfully")||E?.result?.includes?.("Successfully"))&&(l=!0),!(typeof E.result=="string"&&E.result.includes("Successfully removed")||E.status==="rejected")&&c.push({node_name:E?.node_name,response:E?.result})}if(yse.isEmptyOrZeroLength(o))return{message:Pse,connections:c};if(l)return{message:Lse,failed_nodes:o,connections:c};throw Dx(new Error,Dse,Lx.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(Mse,"configureCluster");async function Mx(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(Mx,"functionWrapper")});var xx=N((fwe,Hx)=>{"use strict";var uf=require("joi"),Use=gt(),{validateSchemaExists:vx,validateTableExists:vse,validateSchemaName:Bx}=Si(),Bse=uf.object({operation:uf.string().valid("purge_stream"),schema:uf.string().custom(vx).custom(Bx).optional(),database:uf.string().custom(vx).custom(Bx).optional(),table:uf.string().custom(vse).required()});function Hse(e){return Use.validateBySchema(e,Bse)}a(Hse,"purgeStreamValidator");Hx.exports=Hse});var Tb=N((hwe,kx)=>{"use strict";var{handleHDBError:xse,hdb_errors:kse}=_e(),{HTTP_STATUS_CODES:Fse}=kse,Gse=xx(),qse=Tr(),$se=ao();kx.exports=Vse;async function Vse(e){e.schema=e.schema??e.database;let t=Gse(e);if(t)throw xse(t,t.message,Fse.BAD_REQUEST,void 0,void 0,!0);$se.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await qse.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(Vse,"purgeStream")});var Rb=N((mwe,Yx)=>{"use strict";var Ab=ao(),Kse=Tr(),im=se(),wu=M(),Uc=It(),Yse=re(),gb=j(),{RemotePayloadObject:Wse}=ef(),{ErrorCode:Fx}=require("nats"),{parentPort:Gx}=require("worker_threads"),{onMessageByType:jse}=dt(),{getThisNodeName:zse}=(us(),oe(oa)),{requestClusterStatus:Qse}=(B_(),oe(g0)),qx=im.get(wu.CONFIG_PARAMS.CLUSTERING_ENABLED),$x=im.get(wu.CONFIG_PARAMS.CLUSTERING_NODENAME);Yx.exports={clusterStatus:Jse,buildNodeStatus:Kx};var Vx;jse("cluster-status",async e=>{Vx(e)});async function Jse(){if(im.get(wu.CONFIG_PARAMS.REPLICATION_URL)||im.get(wu.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;return Gx?(Gx.postMessage({type:"request-cluster-status"}),n=await new Promise(s=>{Vx=s})):n=Qse(),n.node_name=zse(),n.is_enabled=!0,n}let e={node_name:$x,is_enabled:qx,connections:[]};if(!qx)return e;let t=await Ab.getAllNodeRecords();if(Yse.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(Kx(t[n],e.connections));return await Promise.allSettled(r),e}a(Jse,"clusterStatus");async function Kx(e,t){let r=e.name,n=new Wse(wu.OPERATIONS_ENUM.CLUSTER_STATUS,$x,void 0,await Ab.getSystemInfo()),s,i,o=Uc.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Kse.request(Uc.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Uc.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=Uc.CLUSTER_STATUS_STATUSES.CLOSED,gb.error(`Error getting node status from ${r} `,s))}catch(l){gb.warn(`Error getting node status from ${r}`,l),l.code===Fx.NoResponders?o=Uc.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===Fx.Timeout?o=Uc.CLUSTER_STATUS_STATUSES.TIMEOUT:o=Uc.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Xse(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!==wu.PRE_4_0_0_VERSION&&await Ab.upsertNodeRecord(l)}catch(l){gb.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(Kx,"buildNodeStatus");function Xse(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(Xse,"NodeStatusObject")});var bb=N((Twe,Wx)=>{"use strict";var{handleHDBError:Zse,hdb_errors:eie}=_e(),{HTTP_STATUS_CODES:tie}=eie,rie=Tr(),nie=ao(),yb=re(),om=require("joi"),sie=gt(),iie=2e3,oie=om.object({timeout:om.number().min(1),connected_nodes:om.boolean(),routes:om.boolean()});Wx.exports=aie;async function aie(e){nie.checkClusteringEnabled();let t=sie.validateBySchema(e,oie);if(t)throw Zse(t,t.message,tie.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||yb.autoCastBoolean(n),o=s===void 0||yb.autoCastBoolean(s),c={nodes:[]},l=await rie.getServerList(r??iie),u={};if(i)for(let d=0,_=l.length;d<_;d++){let E=l[d].statsz;E&&(u[l[d].server.name]=E.routes)}for(let d=0,_=l.length;d<_;d++){if(l[d].statsz)continue;let E=l[d].server,f=l[d].data;if(E.name.endsWith("-hub")){let h={name:E.name.slice(0,-4),response_time:l[d].response_time};i&&(h.connected_nodes=[],u[E.name]&&u[E.name].forEach(T=>{h.connected_nodes.includes(T.name.slice(0,-4))||h.connected_nodes.push(T.name.slice(0,-4))})),o&&(h.routes=f.cluster?.urls?f.cluster?.urls.map(T=>({host:T.split(":")[0],port:yb.autoCast(T.split(":")[1])})):[]),c.nodes.push(h)}}return c}a(aie,"clusterNetwork")});var Jx=N((Awe,Qx)=>{"use strict";var Ob=require("joi"),jx=gt(),{route_constraints:zx}=NA();Qx.exports={setRoutesValidator:cie,deleteRoutesValidator:lie};function cie(e){let t=Ob.object({server:Ob.valid("hub","leaf"),routes:zx.required()});return jx.validateBySchema(e,t)}a(cie,"setRoutesValidator");function lie(e){let t=Ob.object({routes:zx.required()});return jx.validateBySchema(e,t)}a(lie,"deleteRoutesValidator")});var am=N((ywe,sk)=>{"use strict";var lo=Ct(),Nb=re(),ms=M(),Cu=se(),Xx=Jx(),{handleHDBError:Zx,hdb_errors:uie}=_e(),{HTTP_STATUS_CODES:ek}=uie,tk="cluster routes successfully set",rk="cluster routes successfully deleted";sk.exports={setRoutes:_ie,getRoutes:fie,deleteRoutes:Eie};function die(e){let t=lo.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=Nb.autoCast(l.port);let u=r.some(_=>_.host===l.host&&_.port===l.port),d=n.some(_=>_.host===l.host&&_.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?lo.updateConfigValue(ms.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):lo.updateConfigValue(ms.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:tk,set:i,skipped:s}}a(die,"setRoutesNats");function _ie(e){let t=Xx.setRoutesValidator(e);if(t)throw Zx(t,t.message,ek.BAD_REQUEST,void 0,void 0,!0);if(Cu.get(ms.CONFIG_PARAMS.CLUSTERING_ENABLED))return die(e);let r=[],n=[],s=Cu.get(ms.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{nk(s,i)?n.push(i):(s.push(i),r.push(i))}),lo.updateConfigValue(ms.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:tk,set:r,skipped:n}}a(_ie,"setRoutes");function nk(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(nk,"existsInArray");function fie(){if(Cu.get(ms.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=lo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Cu.get(ms.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(fie,"getRoutes");function Eie(e){let t=Xx.deleteRoutesValidator(e);if(t)throw Zx(t,t.message,ek.BAD_REQUEST,void 0,void 0,!0);if(Cu.get(ms.CONFIG_PARAMS.CLUSTERING_ENABLED))return hie(e);let r=[],n=[],s=Cu.get(ms.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{nk(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),lo.updateConfigValue(ms.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:rk,deleted:r,skipped:n}}a(Eie,"deleteRoutes");function hie(e){let t=lo.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 d=e.routes[l],_=!1;for(let E=0,f=r.length;E<f;E++){let h=r[E];if(d.host===h.host&&d.port===h.port){r.splice(E,1),_=!0,o=!0,s.push(d);break}}if(!_){let E=!0;for(let f=0,h=n.length;f<h;f++){let T=n[f];if(d.host===T.host&&d.port===T.port){n.splice(f,1),c=!0,E=!1,s.push(d);break}}E&&i.push(d)}}return o&&(r=Nb.isEmptyOrZeroLength(r)?null:r,lo.updateConfigValue(ms.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=Nb.isEmptyOrZeroLength(n)?null:n,lo.updateConfigValue(ms.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:rk,deleted:s,skipped:i}}a(hie,"deleteRoutesNats")});var ok=N((Owe,ik)=>{"use strict";var df=require("alasql"),vc=require("recursive-iterator"),Xs=j(),pie=re(),_f=M(),Ib=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,Sie(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=>_f.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=>!_f.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][_f.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[o].attribute_permissions.length>0?c=mie(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=>!_f.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new df.yy.Column({columnid:u});s.tableid&&(d.tableid=s.tableid),this.ast.columns.push(d),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(o,l)}}),this.ast}};function mie(e){return e.filter(t=>t[_f.PERMS_CRUD_ENUM.READ])}a(mie,"filterReadRestrictedAttrs");function Sie(e,t,r,n,s){Tie(e,t,r,n,s)}a(Sie,"interpretAST");function ff(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(ff,"addSchemaTableToMap");function Tie(e,t,r,n,s){if(!e){Xs.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof df.yy.Insert?yie(e,t,r):e instanceof df.yy.Select?gie(e,t,r,n,s):e instanceof df.yy.Update?Aie(e,t,r):e instanceof df.yy.Delete?Rie(e,t,r):Xs.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(Tie,"getRecordAttributesAST");function gie(e,t,r,n,s){if(!e){Xs.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(pie.isEmptyOrZeroLength(i)){Xs.error("No schema specified");return}e.from.forEach(c=>{ff(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),ff(c.table,t,r,n,s)});let o=new vc(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{Xs.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 vc(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let d=u.tableid?u.tableid:l;if(!t.get(i).has(d))if(r.has(d))d=r.get(d);else{Xs.info(`table specified as ${d} not found.`);continue}t.get(i).get(d).indexOf(u.columnid)<0&&t.get(i).get(d).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new vc(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,_=s.get(d);if(!t.get(_).has(d))if(r.has(d))d=r.get(d);else{Xs.info(`table specified as ${d} not found.`);continue}t.get(_).get(d).indexOf(u.columnid)<0&&t.get(_).get(d).push(u.columnid)}}),e.order){let c=new vc(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,d=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(d).has(u))if(r.has(u))u=r.get(u);else{Xs.info(`table specified as ${u} not found.`);return}t.get(d).get(u).indexOf(l.columnid)<0&&t.get(d).get(u).push(l.columnid)}}}a(gie,"getSelectAttributes");function Aie(e,t,r){if(!e){Xs.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new vc(e.columns),s=e.table.databaseid;ff(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&wb(e.table.tableid,s,i.columnid,t,r)}a(Aie,"getUpdateAttributes");function Rie(e,t,r){if(!e){Xs.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new vc(e.where),s=e.table.databaseid;ff(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&wb(e.table.tableid,s,i.columnid,t,r)}a(Rie,"getDeleteAttributes");function yie(e,t,r){if(!e){Xs.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new vc(e.columns),s=e.into.databaseid;ff(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&wb(e.into.tableid,s,i.columnid,t,r)}a(yie,"getInsertAttributes");function wb(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(wb,"pushAttribute");ik.exports=Ib});var Db=N((Iwe,uk)=>{var cm=uc(),ak=require("chalk"),Vn=j(),ck=require("prompt"),{promisify:bie}=require("util"),Cb=M(),Oie=require("fs-extra"),Nie=require("path"),Iie=re(),wie=Pc(),lk=se();lk.initSync();var Cie=require("moment"),Pie=bie(ck.get),Die=Nie.join(lk.getHdbBasePath(),Cb.LICENSE_KEY_DIR_NAME,Cb.LICENSE_FILE_NAME,Cb.LICENSE_FILE_NAME);uk.exports={getFingerprint:Mie,setLicense:Lie,parseLicense:Pb,register:Uie,getRegistrationInfo:Bie};async function Lie(e){if(e&&e.key&&e.company){try{Vn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await Pb(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw Vn.error(r),Vn.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(Lie,"setLicense");async function Mie(){let e={};try{e=await cm.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw Vn.error(r),Vn.error(t),new Error(r)}return e}a(Mie,"getFingerprint");async function Pb(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");Vn.info("Validating license input...");let r=cm.validateLicense(e,t);if(Vn.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(Vn.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(Vn.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{Vn.info("writing license to disk"),await Oie.writeFile(Die,JSON.stringify({license_key:e,company:t}))}catch(n){throw Vn.error("Failed to write License"),n}return"Registration successful."}a(Pb,"parseLicense");async function Uie(){let e=await vie();return Pb(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Uie,"register");async function vie(){let e=await cm.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:ak.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:ak.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{ck.start()}catch(n){Vn.error(n)}let r;try{r=await Pie(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(vie,"promptForRegistration");async function Bie(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await cm.getLicense()}catch(r){throw Vn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(Iie.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=wie.version(),e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=Cie.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(Bie,"getRegistrationInfo")});var _k=N((Cwe,dk)=>{"use strict";var Hie=It(),Lb=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,d,_,E,f,h){this.port=t,o===null&&(o=void 0),this.server_name=r+Hie.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:d,port:_,routes:E,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l}},this.accounts={SYS:{users:f},HDB:{users:h}},this.system_account="SYS"}};dk.exports=Lb});var hk=N((Dwe,Ek)=>{"use strict";var fk=It(),Mb=class{static{a(this,"LeafConfigObject")}constructor(t,r,n,s,i,o,c,l,u,d,_){this.port=t,_===null&&(_=void 0),this.server_name=r+fk.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+fk.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:d,ca_file:_,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:_,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:_,insecure:!0},urls:o,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};Ek.exports=Mb});var mk=N((Mwe,pk)=>{"use strict";var Ub=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};pk.exports=Ub});var Tk=N((vwe,Sk)=>{"use strict";var xie=It(),vb=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+xie.SERVER_SUFFIX.ADMIN,this.password=r}};Sk.exports=vb});var _m=N((Hwe,Rk)=>{"use strict";var Bc=require("path"),Hc=require("fs-extra"),kie=_k(),Fie=hk(),Gie=mk(),qie=Tk(),Bb=xn(),Du=re(),Tn=Ct(),um=M(),Ef=It(),{CONFIG_PARAMS:Jt}=um,Lu=j(),hf=se(),gk=Xi(),Hb=Tr(),$ie=Js(),Pu="clustering",Vie=1e4,Ak=50;Rk.exports={generateNatsConfig:Yie,removeNatsConfig:Wie,getHubConfigPath:Kie};function Kie(){let e=hf.get(Jt.ROOTPATH);return Bc.join(e,Pu,Ef.NATS_CONFIG_FILES.HUB_SERVER)}a(Kie,"getHubConfigPath");async function Yie(e=!1,t=void 0){let r=hf.get(Jt.ROOTPATH);Hc.ensureDirSync(Bc.join(r,"clustering","leaf")),hf.initSync();let n=Tn.getConfigFromFile(Jt.CLUSTERING_TLS_CERT_AUTH),s=Tn.getConfigFromFile(Jt.CLUSTERING_TLS_PRIVATEKEY),i=Tn.getConfigFromFile(Jt.CLUSTERING_TLS_CERTIFICATE);!await Hc.exists(i)&&!await Hc.exists(!n)&&await $ie.createNatsCerts();let o=Bc.join(r,Pu,Ef.PID_FILES.HUB),c=Bc.join(r,Pu,Ef.PID_FILES.LEAF),l=Tn.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=Bc.join(r,Pu,Ef.NATS_CONFIG_FILES.HUB_SERVER),d=Bc.join(r,Pu,Ef.NATS_CONFIG_FILES.LEAF_SERVER),_=Tn.getConfigFromFile(Jt.CLUSTERING_TLS_INSECURE),E=Tn.getConfigFromFile(Jt.CLUSTERING_TLS_VERIFY),f=Tn.getConfigFromFile(Jt.CLUSTERING_NODENAME),h=Tn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await Hb.checkNATSServerInstalled()||dm("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let T=await Bb.listUsers(),m=Tn.getConfigFromFile(Jt.CLUSTERING_USER),g=await Bb.getClusterUser();(Du.isEmpty(g)||g.active!==!0)&&dm(`Invalid cluster user '${m}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await lm(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await lm(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await lm(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),await lm(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let S=[],y=[];for(let[ne,Q]of T.entries())Q.role?.role===um.ROLE_TYPES_ENUM.CLUSTER_USER&&Q.active&&(S.push(new qie(Q.username,gk.decrypt(Q.hash))),y.push(new Gie(Q.username,gk.decrypt(Q.hash))));let I=[],{hub_routes:U}=Tn.getClusteringRoutes();if(!Du.isEmptyOrZeroLength(U))for(let ne of U)I.push(`tls://${g.sys_name_encoded}:${g.uri_encoded_d_hash}@${ne.host}:${ne.port}`);let H=new kie(Tn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),f,o,i,s,n,_,E,h,Tn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NAME),Tn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),I,S,y);n==null&&(delete H.tls.ca_file,delete H.leafnodes.tls.ca_file),t=Du.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===um.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Hc.writeJson(u,H),Lu.trace(`Hub server config written to ${u}`));let X=`tls://${g.sys_name_encoded}:${g.uri_encoded_d_hash}@0.0.0.0:${h}`,Y=`tls://${g.uri_encoded_name}:${g.uri_encoded_d_hash}@0.0.0.0:${h}`,V=new Fie(Tn.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT),f,c,l,[X],[Y],S,y,i,s,n,_);n==null&&delete V.tls.ca_file,(t===void 0||t===um.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Hc.writeJson(d,V),Lu.trace(`Leaf server config written to ${d}`))}a(Yie,"generateNatsConfig");async function lm(e){let t=hf.get(e);return Du.isEmpty(t)&&dm(`port undefined for '${e}'`),await Du.isPortTaken(t)&&dm(`'${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(lm,"isPortAvailable");function dm(e){let t=`Error generating clustering config: ${e}`;Lu.error(t),console.error(t),process.exit(1)}a(dm,"generateNatsConfigError");async function Wie(e){let{port:t,config_file:r}=Hb.getServerConfig(e),{username:n,decrypt_hash:s}=await Bb.getClusterUser(),i=0,o=2e3;for(;i<Ak;){try{let d=await Hb.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){Lu.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=Ak)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&&Lu.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await Du.async_set_timeout(u)}let c="0".repeat(Vie),l=Bc.join(hf.get(Jt.ROOTPATH),Pu,r);await Hc.writeFile(l,c),await Hc.remove(l),Lu.notify(e,"started.")}a(Wie,"removeNatsConfig")});var wk=N((kwe,Ik)=>{"use strict";var Kn=se(),jie=uc(),Ge=M(),pf=It(),uo=require("path"),{PACKAGE_ROOT:Em}=M(),yk=se(),fm=re(),Mu="/dev/null",zie=uo.join(Em,"launchServiceScripts"),bk=uo.join(Em,"utility/scripts"),Qie=uo.join(bk,Ge.HDB_RESTART_SCRIPT),Ok=uo.resolve(Em,"dependencies",`${process.platform}-${process.arch}`,pf.NATS_BINARY_NAME);function Nk(){let t=jie.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 fm.noBootFile()&&(n[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=fm.getEnvCliRootPath()),{name:Ge.PROCESS_DESCRIPTORS.HDB,script:Ge.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:Em}}a(Nk,"generateMainServerConfig");var Jie=9930;function Xie(){Kn.initSync(!0);let e=Kn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=uo.join(e,"clustering",pf.NATS_CONFIG_FILES.HUB_SERVER),r=uo.join(Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=yk.get(Ge.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=pf.LOG_LEVEL_FLAGS[Kn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Jie?"-"+n:""),script:Ok,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 Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Mu,i.error_file=Mu),i}a(Xie,"generateNatsHubServerConfig");var Zie=9940;function eoe(){Kn.initSync(!0);let e=Kn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=uo.join(e,"clustering",pf.NATS_CONFIG_FILES.LEAF_SERVER),r=uo.join(Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=yk.get(Ge.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=pf.LOG_LEVEL_FLAGS[Kn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Zie?"-"+n:""),script:Ok,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 Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Mu,i.error_file=Mu),i}a(eoe,"generateNatsLeafServerConfig");function toe(){Kn.initSync();let e=uo.join(Kn.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:zie,autorestart:!1};return Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=Mu,t.error_file=Mu),t}a(toe,"generateClusteringUpgradeV4ServiceConfig");function roe(){let e={[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.RESTART_HDB};return fm.noBootFile()&&(e[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=fm.getEnvCliRootPath()),{...{name:Ge.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:bk},script:Qie}}a(roe,"generateRestart");function noe(){return{apps:[Nk()]}}a(noe,"generateAllServiceConfigs");Ik.exports={generateAllServiceConfigs:noe,generateMainServerConfig:Nk,generateRestart:roe,generateNatsHubServerConfig:Xie,generateNatsLeafServerConfig:eoe,generateClusteringUpgradeV4ServiceConfig:toe}});var Sf=N((qwe,qk)=>{"use strict";var at=M(),soe=re(),fo=_m(),hm=Tr(),_o=It(),fa=wk(),pm=se(),xc=j(),ioe=ao(),{startWorker:Ck,onMessageFromWorkers:ooe}=dt(),aoe=bu(),Gwe=require("util"),coe=require("child_process"),loe=require("fs"),{execFile:uoe}=coe,Qe;qk.exports={enterPM2Mode:doe,start:Ea,stop:xb,reload:Dk,restart:Lk,list:kb,describe:vk,connect:Eo,kill:poe,startAllServices:moe,startService:Fb,getUniqueServicesList:Bk,restartAllServices:Soe,isServiceRegistered:Hk,reloadStopStart:xk,restartHdb:Uk,deleteProcess:Eoe,startClusteringProcesses:Fk,startClusteringThreads:Gk,isHdbRestartRunning:hoe,isClusteringRunning:goe,stopClustering:Toe,reloadClustering:Aoe,expectedRestartOfChildren:Mk};var mf=!1;ooe(e=>{e.type==="restart"&&pm.initSync(!0)});function doe(){mf=!0}a(doe,"enterPM2Mode");function Eo(){return Qe||(Qe=require("pm2")),new Promise((e,t)=>{Qe.connect((r,n)=>{r&&t(r),e(n)})})}a(Eo,"connect");var zr,_oe=10,Pk;function Ea(e,t=!1){if(mf)return foe(e);let r=uoe(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=zr.indexOf(r);o>-1&&zr.splice(o,1),!Pk&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<_oe&&(loe.existsSync(fo.getHubConfigPath())?Ea(e):(await fo.generateNatsConfig(!0),Ea(e),await new Promise(c=>setTimeout(c,3e3)),await fo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await fo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=pm.get(at.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,d;for(;l=c.exec(i);){if(l.index&&_o.LOG_LEVEL_HIERARCHY[o]>=_o.LOG_LEVEL_HIERARCHY[d||"info"]){let f=d===_o.LOG_LEVELS.ERR||d===_o.LOG_LEVELS.WRN?xc.OUTPUTS.STDERR:xc.OUTPUTS.STDOUT;xc.logCustomLevel(d||"info",f,n,i.slice(u,l.index).trim())}let[_,E]=l;u=l.index+_.length,d=_o.LOG_LEVELS[E]}if(_o.LOG_LEVEL_HIERARCHY[o]>=_o.LOG_LEVEL_HIERARCHY[d||"info"]){let _=d===_o.LOG_LEVELS.ERR||d===_o.LOG_LEVELS.WRN?xc.OUTPUTS.STDERR:xc.OUTPUTS.STDOUT;xc.logCustomLevel(d||"info",_,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!zr&&(zr=[],!t)){let i=a(()=>{Pk=!0,zr&&(zr.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)}zr.push(r)}a(Ea,"start");function foe(e){return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.start(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(foe,"startWithPM2");function xb(e){if(!mf){for(let t of zr||[])t.name===e&&(zr.splice(zr.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.stop(e,async(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.delete(e,(i,o)=>{i&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(o)})})})}a(xb,"stop");function Dk(e){return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.reload(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Dk,"reload");function Lk(e){if(!mf){Mk();for(let t of zr||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.restart(e,(n,s)=>{Qe.disconnect(),t(s)})})}a(Lk,"restart");function Mk(){for(let e of zr||[])e.config&&(e.config.restarts=0)}a(Mk,"expectedRestartOfChildren");function Eoe(e){return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.delete(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(Eoe,"deleteProcess");async function Uk(){await Ea(fa.generateRestart())}a(Uk,"restartHdb");async function hoe(){let e=await kb();for(let t in e)if(e[t].name===at.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(hoe,"isHdbRestartRunning");function kb(){return new Promise(async(e,t)=>{try{await Eo()}catch(r){t(r)}Qe.list((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}a(kb,"list");function vk(e){return new Promise(async(t,r)=>{try{await Eo()}catch(n){r(n)}Qe.describe(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}a(vk,"describe");function poe(){if(!mf){for(let e of zr||[])e.kill();zr=[];return}return new Promise(async(e,t)=>{try{await Eo()}catch(r){t(r)}Qe.killDaemon((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}a(poe,"kill");async function moe(){try{await Fk(),await Gk(),await Ea(fa.generateAllServiceConfigs())}catch(e){throw Qe?.disconnect(),e}}a(moe,"startAllServices");async function Fb(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case at.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=fa.generateMainServerConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=fa.generateNatsIngestServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=fa.generateNatsReplyServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=fa.generateNatsHubServerConfig(),await Ea(r,t),await fo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=fa.generateNatsLeafServerConfig(),await Ea(r,t),await fo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=fa.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await Ea(r)}catch(r){throw Qe?.disconnect(),r}}a(Fb,"startService");async function Bk(){try{let e=await kb(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw Qe?.disconnect(),e}}a(Bk,"getUniqueServicesList");async function Soe(e=[]){try{let t=!1,r=await Bk();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===at.PROCESS_DESCRIPTORS.HDB?t=!0:await Lk(o))}t&&await xk(at.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Qe?.disconnect(),t}}a(Soe,"restartAllServices");async function Hk(e){if(zr?.find(r=>r.name===e))return!0;let t=await aoe.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(Hk,"isServiceRegistered");async function xk(e){let t=pm.get(at.CONFIG_PARAMS.THREADS_COUNT)??pm.get(at.CONFIG_PARAMS.THREADS),r=await vk(e),n=soe.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await xb(e),await Fb(e)):e===at.PROCESS_DESCRIPTORS.HDB?await Uk():await Dk(e)}a(xk,"reloadStopStart");var kk;async function Fk(e=!1){for(let t in at.CLUSTERING_PROCESSES){let r=at.CLUSTERING_PROCESSES[t];await Fb(r,e)}}a(Fk,"startClusteringProcesses");async function Gk(){kk=Ck(at.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await hm.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await hm.updateLocalStreams();let e=await ioe.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===at.PRE_4_0_0_VERSION){xc.info("Starting clustering upgrade 4.0.0 process"),Ck(at.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(Gk,"startClusteringThreads");async function Toe(){for(let e in at.CLUSTERING_PROCESSES)if(e!==at.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===at.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await kk.terminate();else{let t=at.CLUSTERING_PROCESSES[e];await xb(t)}}a(Toe,"stopClustering");async function goe(){for(let e in at.CLUSTERING_PROCESSES){let t=at.CLUSTERING_PROCESSES[e];if(await Hk(t)===!1)return!1}return!0}a(goe,"isClusteringRunning");async function Aoe(){await fo.generateNatsConfig(!0),await hm.reloadNATSHub(),await hm.reloadNATSLeaf(),await fo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await fo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(Aoe,"reloadClustering")});var $b={};je($b,{compactOnStart:()=>Roe,copyDb:()=>jk});async function Roe(){ha.notify("Running compact on start"),console.log("Running compact on start");let e=(0,Gb.get)(pa.CONFIG_PARAMS.ROOTPATH),t=new Map,r=ut();(0,qb.updateConfigValue)(pa.CONFIG_PARAMS.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,mm.join)(e,"backup",n+".mdb"),o=(0,mm.join)(e,pa.DATABASES_DIR_NAME,n+"-copy.mdb"),c=0;try{c=await $k(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){ha.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 jk(n,o),console.log("Backing up",n,"to",i),await(0,kc.move)(s,i,{overwrite:!0})}try{Uu()}catch(n){ha.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,kc.move)(i,s,{overwrite:!0}),await(0,kc.remove)((0,mm.join)(e,pa.DATABASES_DIR_NAME,`${n}-copy.mdb-lock`));try{Uu()}catch(n){ha.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){ha.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,qb.updateConfigValue)(pa.CONFIG_PARAMS.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,kc.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw Uu(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await $k(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}.
|
|
14
14
|
Total record count before compaction: ${i}, total after: ${c}.
|
|
15
15
|
Database backup has not been removed and can be found here: ${s}`;ha.error(l),console.error(l)}(0,Gb.get)(pa.CONFIG_PARAMS.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||o===!1||(console.log("Removing backup",s),await(0,kc.remove)(s))}}async function $k(e){let t=await(0,Wk.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}async function jk(e,t){console.log("copyDb start");let r=ut()[e],n;for(let _ in r){n=r[_].primaryStore.rootStore;break}let s=n.dbisDb,i=n.auditStore,o=(0,Vk.open)(new Kk.default(t)),c=o.openDB(Sm.INTERNAL_DBIS_NAME),l,u=0,d=s.useReadTransaction();try{for(let{key:E,value:f}of s.getRange({transaction:d})){let h=f.is_hash_attribute||f.isPrimaryKey,T,m;if(h&&(T=f.compression,m=Tm(),m?f.compression=m:delete f.compression,T?.dictionary?.toString()===m?.dictionary?.toString()&&(T=null,m=null)),c.put(E,f),!(h||f.indexed))continue;let g=new Yk.default(!h,h);g.encoding="binary",g.compression=T;let S=n.openDB(E,g);S.decoder=null,S.decoderCopies=!1,S.encoding="binary",g.compression=m;let y=o.openDB(E,g);y.encoder=null,console.log("copying",E,"from",e,"to",t),await _(S,y,h,d)}if(i){let E=n.openDB(Sm.AUDIT_STORE_NAME,Tf);console.log("copying audit log for",e,"to",t),_(i,E,!1,d)}async function _(E,f,h,T){let m=0,g=0,S=1e7,y=null;for(;S-- >0;)try{for(let I of E.getKeys({start:y,transaction:T}))try{y=I;let{value:U,version:H}=E.getEntry(I,{transaction:T});l=f.put(I,U,h?H:void 0),m++,T.openTimer&&(T.openTimer=0),g+=(I?.length||10)+U.length,u++>5e3&&(await l,console.log("copied",m,"entries",g,"bytes"),u=0)}catch(U){console.error("Error copying record",typeof I=="symbol"?"symbol":I,"from",e,"to",t,U)}console.log("finish copying, copied",m,"entries",g,"bytes");return}catch{if(typeof y=="string"){if(y==="z")return console.error("Reached end of dbi",y,"for",e,"to",t);y=y.slice(0,-2)+"z"}else if(typeof y=="number")y++;else return console.error("Unknown key type",y,"for",e,"to",t)}}a(_,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{d.done(),o.close()}}var Vk,mm,kc,Gb,Kk,Yk,Sm,pa,Wk,qb,ha,Vb=Ie(()=>{Pe();Vk=require("lmdb"),mm=require("path"),kc=require("fs-extra"),Gb=L(se()),Kk=L(r_()),Yk=L(t_()),Sm=L(Ht()),pa=L(M());ji();Wk=L(Zi()),qb=L(Ct()),ha=L(j());a(Roe,"compactOnStart");a($k,"getTotalDBRecordCount");a(jk,"copyDb")});var Hu=N((Qwe,tF)=>{"use strict";var yoe=require("minimist"),{isMainThread:Yb,parentPort:Af,threadId:Wwe}=require("worker_threads"),Dt=M(),{PROCESS_DESCRIPTORS_VALIDATE:vu}=Dt,Ci=j(),Wb=re(),Am=_m(),gm=Tr(),jwe=It(),Xk=Ct(),Zs=Sf(),zk=bu(),{compactOnStart:boe}=(Vb(),oe($b)),Ooe=Wa(),{restartWorkers:Rm,onMessageByType:Noe}=dt(),{handleHDBError:Ioe,hdb_errors:woe}=_e(),{HTTP_STATUS_CODES:Coe}=woe,Rf=se(),{sendOperationToNode:Qk,getThisNodeName:Poe,monitorNodeCAs:Doe}=(us(),oe(oa)),{getHDBNodeTable:zwe}=(su(),oe(h0));Rf.initSync();var gf=`Restarting HarperDB. This may take up to ${Dt.RESTART_TIMEOUT_MS/1e3} seconds.`,Loe="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",Jk="Clustering is not enabled so cannot be restarted",Moe="Invalid service",Bu,Ss;tF.exports={restart:Zk,restartService:jb};Yb&&Noe(Dt.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await jb({service:e.workerType}):Zk({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function Zk(e){Ss=Object.keys(e).length===0,Bu=await Zs.isServiceRegistered(Dt.HDB_PROC_DESCRIPTOR);let t=yoe(process.argv);if(t.service){await jb(t);return}if(Ss&&!Bu){console.error(Loe);return}if(Ss&&console.log(gf),Bu){Zs.enterPM2Mode(),Ci.notify(gf);let r=Ooe(Object.keys(Dt.CONFIG_PARAM_MAP),!0);return Wb.isEmptyOrZeroLength(Object.keys(r))||Xk.updateConfigValue(void 0,void 0,r,!0,!0),Uoe(),gf}return Yb?(Ci.notify(gf),Rf.get(Dt.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await boe(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{Rm()},50)):Af.postMessage({type:Dt.ITC_EVENT_TYPES.RESTART}),gf}a(Zk,"restart");async function jb(e){let{service:t}=e;if(Dt.PROCESS_DESCRIPTORS_VALIDATE[t]===void 0)throw Ioe(new Error,Moe,Coe.BAD_REQUEST,void 0,void 0,!0);if(Zs.expectedRestartOfChildren(),Bu=await Zs.isServiceRegistered(Dt.HDB_PROC_DESCRIPTOR),!Yb){e.replicated&&Doe(),Af.postMessage({type:Dt.ITC_EVENT_TYPES.RESTART,workerType:t}),Af.ref(),await new Promise(s=>{Af.on("message",i=>{i.type==="restart-complete"&&(s(),Af.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===Poe())continue;let{job_id:i}=await Qk(s,e);n.push(await new Promise((o,c)=>{let u=2400,d=setInterval(async()=>{if(u--<=0){clearInterval(d);let f=new Error("Timed out waiting for restart job to complete");f.replicated=n,c(f)}let E=(await Qk(s,{operation:"get_job",id:i})).results[0];if(E.status==="COMPLETE"&&(clearInterval(d),o({node:s.name,message:E.message})),E.status==="ERROR"){clearInterval(d);let f=new Error(E.message);f.replicated=n,c(f)}},250)}))}return{replicated:n}}return}let r;switch(t){case vu.clustering:if(!Rf.get(Dt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Jk;break}Ss&&console.log("Restarting clustering"),Ci.notify("Restarting clustering"),await eF();break;case vu.clustering_config:case vu["clustering config"]:if(!Rf.get(Dt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Jk;break}Ss&&console.log("Restarting clustering_config"),Ci.notify("Restarting clustering_config"),await Zs.reloadClustering();break;case"custom_functions":case"custom functions":case vu.harperdb:case vu.http_workers:case vu.http:if(Ss&&!Bu){r=`Restart ${t} is not available from the CLI when running in non-pm2 mode. Either call restart ${t} from the API or stop and start HarperDB.`;break}Ss&&console.log("Restarting http_workers"),Ci.notify("Restarting http_workers"),Ss?await Zs.restart(Dt.HDB_PROC_DESCRIPTOR):await Rm("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Ci.error(r),Ss&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(jb,"restartService");async function Uoe(){await eF(),await Zs.restart(Dt.HDB_PROC_DESCRIPTOR),await Wb.async_set_timeout(2e3),Rf.get(Dt.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await Kb(),Ss&&(await gm.closeConnection(),process.exit(0))}a(Uoe,"restartPM2Mode");async function eF(){if(!Xk.getConfigFromFile(Dt.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await zk.getHDBProcessInfo()).clustering.length===0)Ci.trace("Clustering not running, restart will start clustering services"),await Am.generateNatsConfig(!0),await Zs.startClusteringProcesses(),await Zs.startClusteringThreads(),await Kb(),Ss&&await gm.closeConnection();else{await Am.generateNatsConfig(!0),Bu?(Ci.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await Zs.restart(Dt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Zs.restart(Dt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await zk.getHDBProcessInfo()).clustering.forEach(s=>{Ci.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await Wb.async_set_timeout(3e3),await Kb(),await gm.updateLocalStreams(),Ss&&await gm.closeConnection(),Ci.trace("Restart clustering restarting ingest and reply service threads");let t=Rm(Dt.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=Rm(Dt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(eF,"restartClustering");async function Kb(){await Am.removeNatsConfig(Dt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Am.removeNatsConfig(Dt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(Kb,"removeNatsConfig")});var _F=N((Zwe,dF)=>{"use strict";var Xwe=require("lodash"),gn=M(),{handleHDBError:rF,hdb_errors:voe}=_e(),{HDB_ERROR_MSGS:Boe,HTTP_STATUS_CODES:Hoe}=voe,zb=j();dF.exports={getRolePermissions:koe};var Fc=Object.create(null),xoe=a(e=>({key:e,perms:{}}),"perms_template_obj"),oF=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),aF=a((e=!1,t=!1,r=!1,n=!1)=>({[gn.PERMS_CRUD_ENUM.READ]:e,[gn.PERMS_CRUD_ENUM.INSERT]:t,[gn.PERMS_CRUD_ENUM.UPDATE]:r,[gn.PERMS_CRUD_ENUM.DELETE]:n}),"permissions_template"),Qb=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...aF(t,r,n,s)}),"table_perms_template"),nF=a((e,t=aF())=>({attribute_name:e,describe:uF(t),[yf]:t[yf],[Jb]:t[Jb],[Xb]:t[Xb]}),"attr_perms_template"),sF=a((e,t=!1)=>({attribute_name:e,describe:t,[yf]:t}),"timestamp_attr_perms_template"),{READ:yf,INSERT:Jb,UPDATE:Xb}=gn.PERMS_CRUD_ENUM,cF=Object.values(gn.PERMS_CRUD_ENUM),lF=[yf,Jb,Xb];function koe(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[gn.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(Fc[t]&&Fc[t].key===n)return Fc[t].perms;let s=Foe(e,r);return Fc[t]?Fc[t].key=n:Fc[t]=xoe(n),Fc[t].perms=s,s}catch(r){if(!e[gn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[gn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<gn.PERMS_UPDATE_RELEASE_TIMESTAMP){let n=`Role permissions for role '${t}' must be updated to align with new structure from the 2.2.0 release.`;throw zb.error(n),zb.debug(r),rF(new Error,Boe.OUTDATED_PERMS_TRANSLATION_ERROR,Hoe.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
|
|
16
16
|
${r.stack}`;throw zb.error(n),rF(new Error)}}}a(koe,"getRolePermissions");function Foe(e,t){let r=Object.create(null);r.super_user=!1;let n=e.permission;r[gn.SYSTEM_SCHEMA_NAME]=n[gn.SYSTEM_SCHEMA_NAME],r.structure_user=n.structure_user;let s=Array.isArray(e.permission.structure_user)||e.permission.structure_user===!0?e.permission.structure_user:[];return Object.keys(t).forEach(i=>{if(s===!0||s.indexOf(i)>-1){r[i]=Goe(t[i]);return}r[i]=oF(),n[i]?(n[i].describe&&(r[i].describe=!0),Object.keys(t[i]).forEach(o=>{if(n[i].tables[o]){let c=n[i].tables[o],l=t[i][o],u=qoe(c,l);r[i].describe||cF.forEach(d=>{u[d]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=Qb()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=Qb()})}),r}a(Foe,"translateRolePermissions");function Goe(e){let t=oF(!0);return Object.keys(e).forEach(r=>{t.tables[r]=Qb(!0,!0,!0,!0,!0)}),t}a(Goe,"createStructureUserPermissions");function qoe(e,t){let{attribute_permissions:r}=e;if(r?.length>0){let s={...e};s.attribute_permissions=[];let i=r.reduce((u,d)=>{let{attribute_name:_}=d,E=d;return gn.TIME_STAMP_NAMES.includes(_)&&(E=sF(_,d[yf])),u[_]=E,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=nF(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let d=i[u];d.describe=uF(d),s.attribute_permissions.push(d),c||$oe(d,l)}else if(u!==o){let d;gn.TIME_STAMP_NAMES.includes(u)?d=sF(u):d=nF(u),s.attribute_permissions.push(d)}}),c||s.attribute_permissions.push(l),s.describe=iF(s),s}else return e.describe=iF(e),e}a(qoe,"getTableAttrPerms");function iF(e){return cF.filter(t=>e[t]).length>0}a(iF,"getSchemaTableDescribePerm");function uF(e){return lF.filter(t=>e[t]).length>0}a(uF,"getAttributeDescribePerm");function $oe(e,t){lF.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a($oe,"checkForHashPerms")});var fF={};je(fF,{Headers:()=>ho,appendHeader:()=>ym,mergeHeaders:()=>Zb});function ym(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 Zb(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new ho(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 ho,bf=Ie(()=>{ho=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(ym,"appendHeader");a(Zb,"mergeHeaders")});var Of={};je(Of,{authentication:()=>gF,bypassAuth:()=>Qoe,login:()=>Xoe,logout:()=>Zoe,start:()=>Joe});function Qoe(){TF=!0}async function gF(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let f=e.isOperationsServer?Woe?Yoe:[]:Koe?Voe:[];if(f.includes(i)||f.includes("*")){if(e.method==="OPTIONS"){let h=Yn.get(gr.CONFIG_PARAMS.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",T=new ho([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",h],["Access-Control-Allow-Origin",i]]);return bm&&T.set("Access-Control-Allow-Credentials","true"),{status:200,headers:T}}o.push("Access-Control-Allow-Origin",i),bm&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(bm){i||(i=r.host);let f=(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session=",h=s?.split(/;\s+/)||[];for(let T of h)if(T.startsWith(f)){let m=T.indexOf(";");l=T.slice(f.length,m===-1?T.length:m),u=await EF.get(l);break}e.session=u||(u={})}let d=a((f,h,T)=>{let m=new xu.AuthAuditLog(f,h,gr.AUTH_AUDIT_TYPES.AUTHENTICATION,r["x-forwarded-for"]??e.ip,e.method,e.pathname);m.auth_strategy=T,l&&(m.session_id=l),r.referer&&(m.referer=r.referer),r.origin&&(m.origin=r.origin),h===gr.AUTH_AUDIT_STATUS.SUCCESS?eO.notify(m):eO.error(m)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&eO.error("Authorization error:",e._nodeRequest.socket.authorizationError),e.mtlsConfig&&e.authorized&&e.peerCertificate.subject){let f=e.mtlsConfig.user;f!==null?((f===void 0||f==="Common Name"||f==="CN")&&(f=e.peerCertificate.subject.CN),e.user=await it.getUser(f,null,e),d(f,gr.AUTH_AUDIT_STATUS.SUCCESS,"mTLS")):(0,xu.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let _;if(!e.user)if(n){if(_=Gc.get(n),!_){let f=n.indexOf(" "),h=n.slice(0,f),T=n.slice(f+1),m,g;try{switch(h){case"Basic":let S=atob(T),y=S.indexOf(":");m=S.slice(0,y),g=S.slice(y+1),_=m||g?await it.getUser(m,g,e):null;break;case"Bearer":try{_=await(0,Om.validateOperationToken)(T)}catch(I){if(I.message==="invalid token")try{return await(0,Om.validateRefreshToken)(T),c({status:-1})}catch{throw I}}break}}catch(S){return zoe&&(Gc.get(T)||(Gc.set(T,T),d(m,gr.AUTH_AUDIT_STATUS.FAILURE,h))),c({status:401,body:qc({error:S.message},e)})}Gc.set(n,_),joe&&d(_.username,gr.AUTH_AUDIT_STATUS.SUCCESS,h)}e.user=_}else u?.user?e.user=await it.getUser(u.user,null,e):(TF&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,pF.getSuperUser)());bm&&(e.session.update=function(f){if(!l){l=(0,mF.v4)();let T=`${(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session="}${l}; Path=/; Expires=Tue, 01 Oct 8307 19:33:20 GMT; HttpOnly${e.protocol==="https"?"; SameSite=None; Secure":""}`;o?o.push("Set-Cookie",T):E?.headers?.set&&E.headers.set("Set-Cookie",T)}return e.protocol==="https"&&(o?(i&&o.push("Access-Control-Expose-Headers","X-Hdb-Session"),o.push("X-Hdb-Session","Secure")):E?.headers?.set&&(i&&E.headers.set("Access-Control-Expose-Headers","X-Hdb-Session"),E.headers.set("X-Hdb-Session","Secure"))),f.id=l,EF.put(f)},e.login=async function(f,h){e.user=await it.getUser(f,h,e),e.session.update({user:e.user&&(e.user.getId?.()??e.user.username)})});let E=await t(e);return E&&(E.status===401&&(r["user-agent"]?.startsWith("Mozilla")&&r.accept?.startsWith("text/html")&&Ni.loginPath?(E.status=302,E.headers.set("Location",Ni.loginPath(e))):E.headers.set("WWW-Authenticate","Basic")),c(E))}catch(l){throw c(l)}function c(l){let u=o.length;if(u>0){let d=l.headers;d||(l.headers=d=new ho);for(let _=0;_<u;){let E=o[_++];d.set(E,o[_++])}}return o=null,l}a(c,"applyResponseHeaders")}function Joe({server:e,port:t,securePort:r}){e.http(gF,t||r?{port:t,securePort:r}:{port:"all"}),hF||(hF=!0,setInterval(()=>{Gc=new Map},Yn.get(gr.CONFIG_PARAMS.AUTHENTICATION_CACHETTL)).unref(),SF.user.addListener(()=>{Gc=new Map}))}async function Xoe(e){if(!e.baseRequest?.login)throw new Error("No session for login");return e.baseResponse.headers.set=(t,r)=>{e.fastifyResponse.header(t,r)},await e.baseRequest.login(e.username,e.password??""),"Login successful"}async function Zoe(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var pF,Om,mF,Yn,gr,xu,SF,eO,Voe,Koe,Yoe,Woe,EF,bm,TF,joe,zoe,Gc,hF,Nm=Ie(()=>{pF=L(xn());qr();Zl();Om=L(cu());Pe();mF=require("uuid"),Yn=L(se()),gr=L(M()),xu=L(j()),SF=L(E_());bf();$c();eO=(0,xu.loggerWithTag)("auth-event");Yn.initSync();Voe=Yn.get(gr.CONFIG_PARAMS.HTTP_CORSACCESSLIST),Koe=Yn.get(gr.CONFIG_PARAMS.HTTP_CORS),Yoe=Yn.get(gr.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_CORSACCESSLIST),Woe=Yn.get(gr.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_CORS),EF=Et({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),bm=Yn.get(gr.CONFIG_PARAMS.AUTHENTICATION_ENABLESESSIONS)??!0,TF=process.env.AUTHENTICATION_AUTHORIZELOCAL??Yn.get(gr.CONFIG_PARAMS.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,joe=Yn.get(gr.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,zoe=Yn.get(gr.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,Gc=new Map;it.onInvalidatedUser(()=>{Gc=new Map});a(Qoe,"bypassAuth");a(gF,"authentication");a(Joe,"start");a(Xoe,"login");a(Zoe,"logout")});var IF=N((cCe,NF)=>{"use strict";var ye=require("joi"),AF=require("fs-extra"),RF=require("path"),Wn=gt(),yF=se(),bF=M(),OF=j(),{hdb_errors:eae}=_e(),{HDB_ERROR_MSGS:Qr}=eae,po=/^[a-zA-Z0-9-_]+$/,tae=/^[a-zA-Z0-9-_]+$/;NF.exports={getDropCustomFunctionValidator:nae,setCustomFunctionValidator:sae,addComponentValidator:cae,dropCustomFunctionProjectValidator:lae,packageComponentValidator:uae,deployComponentValidator:dae,setComponentFileValidator:iae,getComponentFileValidator:aae,dropComponentFileValidator:oae,addSSHKeyValidator:_ae,updateSSHKeyValidator:fae,deleteSSHKeyValidator:Eae,setSSHKnownHostsValidator:hae};function Im(e,t,r){try{let n=yF.get(bF.CONFIG_PARAMS.COMPONENTSROOT),s=RF.join(n,t);return AF.existsSync(s)?e?t:r.message(Qr.PROJECT_EXISTS):e?r.message(Qr.NO_PROJECT):t}catch(n){return OF.error(n),r.message(Qr.VALIDATION_ERR)}}a(Im,"checkProjectExists");function Nf(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(Nf,"checkFilePath");function rae(e,t,r,n){try{let s=yF.get(bF.CONFIG_PARAMS.COMPONENTSROOT),i=RF.join(s,e,t,r+".js");return AF.existsSync(i)?r:n.message(Qr.NO_FILE)}catch(s){return OF.error(s),n.message(Qr.VALIDATION_ERR)}}a(rae,"checkFileExists");function nae(e){let t=ye.object({project:ye.string().pattern(po).custom(Im.bind(null,!0)).required().messages({"string.pattern.base":Qr.BAD_PROJECT_NAME}),type:ye.string().valid("helpers","routes").required(),file:ye.string().pattern(po).custom(rae.bind(null,e.project,e.type)).custom(Nf).required().messages({"string.pattern.base":Qr.BAD_FILE_NAME})});return Wn.validateBySchema(e,t)}a(nae,"getDropCustomFunctionValidator");function sae(e){let t=ye.object({project:ye.string().pattern(po).custom(Im.bind(null,!0)).required().messages({"string.pattern.base":Qr.BAD_PROJECT_NAME}),type:ye.string().valid("helpers","routes").required(),file:ye.string().custom(Nf).required(),function_content:ye.string().required()});return Wn.validateBySchema(e,t)}a(sae,"setCustomFunctionValidator");function iae(e){let t=ye.object({project:ye.string().pattern(po).required().messages({"string.pattern.base":Qr.BAD_PROJECT_NAME}),file:ye.string().custom(Nf).required(),payload:ye.string().allow("").optional(),encoding:ye.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return Wn.validateBySchema(e,t)}a(iae,"setComponentFileValidator");function oae(e){let t=ye.object({project:ye.string().pattern(po).required().messages({"string.pattern.base":Qr.BAD_PROJECT_NAME}),file:ye.string().custom(Nf).optional()});return Wn.validateBySchema(e,t)}a(oae,"dropComponentFileValidator");function aae(e){let t=ye.object({project:ye.string().required(),file:ye.string().custom(Nf).required(),encoding:ye.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return Wn.validateBySchema(e,t)}a(aae,"getComponentFileValidator");function cae(e){let t=ye.object({project:ye.string().pattern(po).custom(Im.bind(null,!1)).required().messages({"string.pattern.base":Qr.BAD_PROJECT_NAME})});return Wn.validateBySchema(e,t)}a(cae,"addComponentValidator");function lae(e){let t=ye.object({project:ye.string().pattern(po).custom(Im.bind(null,!0)).required().messages({"string.pattern.base":Qr.BAD_PROJECT_NAME})});return Wn.validateBySchema(e,t)}a(lae,"dropCustomFunctionProjectValidator");function uae(e){let t=ye.object({project:ye.string().pattern(po).required().messages({"string.pattern.base":Qr.BAD_PROJECT_NAME}),skip_node_modules:ye.boolean(),skip_symlinks:ye.boolean()});return Wn.validateBySchema(e,t)}a(uae,"packageComponentValidator");function dae(e){let t=ye.object({project:ye.string().pattern(po).required().messages({"string.pattern.base":Qr.BAD_PROJECT_NAME}),package:ye.string().optional(),restart:ye.alternatives().try(ye.boolean(),ye.string().valid("rolling")).optional()});return Wn.validateBySchema(e,t)}a(dae,"deployComponentValidator");function _ae(e){let t=ye.object({name:ye.string().pattern(tae).required().messages({"string.pattern.base":Qr.BAD_SSH_KEY_NAME}),key:ye.string().required(),host:ye.string().required(),hostname:ye.string().required(),known_hosts:ye.string().optional()});return Wn.validateBySchema(e,t)}a(_ae,"addSSHKeyValidator");function fae(e){let t=ye.object({name:ye.string().required(),key:ye.string().required()});return Wn.validateBySchema(e,t)}a(fae,"updateSSHKeyValidator");function Eae(e){let t=ye.object({name:ye.string().required()});return Wn.validateBySchema(e,t)}a(Eae,"deleteSSHKeyValidator");function hae(e){let t=ye.object({known_hosts:ye.string().required()});return Wn.validateBySchema(e,t)}a(hae,"setSSHKnownHostsValidator")});var Cf=N((uCe,MF)=>{"use strict";var wm=require("joi"),ma=require("path"),ku=require("fs-extra"),{exec:pae}=require("child_process"),mae=require("util"),wF=mae.promisify(pae),Vc=M(),{handleHDBError:If,hdb_errors:Sae}=_e(),{HTTP_STATUS_CODES:wf}=Sae,Kc=se(),Tae=gt(),Yc=j();Kc.initSync();var tO=Kc.get(Vc.CONFIG_PARAMS.COMPONENTSROOT),CF="npm install --force --omit=dev --json",gae=`${CF} --dry-run`,Aae=Kc.get(Vc.CONFIG_PARAMS.ROOTPATH),Cm=ma.join(Aae,"ssh");MF.exports={installModules:Oae,auditModules:Nae,installAllRootModules:Rae,uninstallRootModule:yae,linkHarperdb:bae,runCommand:Fu};async function Rae(e=!1,t=Kc.get(Vc.CONFIG_PARAMS.ROOTPATH)){await Pm();let r=!1,n=process.env;ku.pathExistsSync(Cm)&&ku.readdirSync(Cm).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+ma.join(Cm,"config")+" -o UserKnownHostsFile="+ma.join(Cm,"known_hosts"),...process.env},r=!0)});try{let s=Kc.get(Vc.CONFIG_PARAMS.ROOTPATH),i=ma.join(s,"node_modules","harperdb");ku.lstatSync(i).isSymbolicLink()&&ku.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&Yc.error("Error removing symlink:",s)}await Fu(e?"npm install --force --ignore-scripts --no-bin-links":"npm install --force --no-bin-links",t,n)}a(Rae,"installAllRootModules");async function yae(e){await Fu(`npm uninstall ${e}`,Kc.get(Vc.CONFIG_PARAMS.ROOTPATH))}a(yae,"uninstallRootModule");async function bae(){await Pm(),await Fu(`npm link ${Vc.PACKAGE_ROOT}`,Kc.get(Vc.CONFIG_PARAMS.ROOTPATH))}a(bae,"linkHarperdb");async function Fu(e,t=void 0,r=process.env){let n,s;try{({stdout:n,stderr:s}=await wF(e,{cwd:t,env:r}))}catch(i){throw new Error(i.stderr.replace(`
|