harperdb 4.4.20 → 4.4.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/harperdb.js +3 -3
- package/bin/lite.js +3 -3
- package/launchServiceScripts/launchInstallNATSServer.js +1 -1
- package/launchServiceScripts/launchNatsIngestService.js +3 -3
- package/launchServiceScripts/launchNatsReplyService.js +3 -3
- package/launchServiceScripts/launchUpdateNodes4-0-0.js +3 -3
- package/npm-shrinkwrap.json +63 -57
- package/package.json +1 -1
- package/server/jobs/jobProcess.js +3 -3
- package/server/threads/threadServer.js +3 -3
- package/studio/build-local/asset-manifest.json +2 -2
- package/studio/build-local/index.html +1 -1
- package/studio/build-local/static/js/{main.12321ebb.js → main.68d1da05.js} +2 -2
- package/utility/scripts/restartHdb.js +3 -3
- /package/studio/build-local/static/js/{main.12321ebb.js.LICENSE.txt → main.68d1da05.js.LICENSE.txt} +0 -0
|
@@ -10,10 +10,10 @@ 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(tL,{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,aL)=>{"use strict";var iL=require("fs-extra"),me=require("joi"),N3=require("os"),{boolean:He,string:wt,number:rr,array:cc}=me.types(),{totalmem:rL}=require("os"),ac=require("path"),I3=j(),OA=re(),cRe=bA(),nL=M(),w3=gt(),sL="log",C3="components",D3="Invalid logging.rotation.maxSize unit. Available units are G, M or K",P3="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)]),Ti,oL=!1;aL.exports={configValidator:v3,routesValidator:G3,route_constraints:Hh};function v3(e,t=!1){if(oL=t,Ti=e.rootPath,OA.isEmpty(Ti))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(__),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(__),l=me.custom(H3).empty(null).default(__),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(__)}).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(__),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 oL||iL.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(D3);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(P3);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?.()||rL();return i=Math.round(Math.min(i,rL())/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 __(e,t){let r=t.state.path.join(".");if(!OA.isEmpty(t.original)&&r!=="operationsApi.network.domainSocket")return t.original;if(OA.isEmpty(Ti))throw new Error(`Error setting default root for: ${r}. HDB root is not defined`);switch(r){case"componentsRoot":return ac.join(Ti,C3);case"logging.root":return ac.join(Ti,sL);case"clustering.leafServer.streams.path":return ac.join(Ti,"clustering","leaf");case"storage.path":let n=ac.join(Ti,nL.LEGACY_DATABASES_DIR_NAME);return iL.existsSync(n)?n:ac.join(Ti,nL.DATABASES_DIR_NAME);case"logging.rotation.path":return ac.join(Ti,sL);case"operationsApi.network.domainSocket":return r==null?null:ac.join(Ti,"operations-server");default:throw new Error(`Error setting default root for config parameter: ${r}. Unrecognized config parameter`)}}a(__,"setDefaultRoot");function G3(e){let t=me.object({routes:Hh});return w3.validateBySchema({routes:e},t)}a(G3,"routesValidator")});var Ct=N(mL=>{"use strict";var un=M(),Er=re(),hr=j(),{configValidator:q3,routesValidator:cL}=NA(),Kr=require("fs-extra"),uL=require("yaml"),Bn=require("path"),$3=require("is-number"),dL=require("properties-reader"),V3=require("lodash"),{handleHDBError:K3}=_e(),{HTTP_STATUS_CODES:Y3,HDB_ERROR_MSGS:vl}=Dn(),{server:W3}=(qr(),oe(ja)),{DATABASES_PARAM_CONFIG:f_,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",_L=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.",lL={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(mL,{createConfigFile:eX,getDefaultConfig:tX,getConfigValue:EL,initConfig:Fh,flattenConfig:Bl,updateConfigValue:hL,updateConfigObject:nX,getConfiguration:oX,setConfiguration:aX,readConfigFile:DA,getClusteringRoutes:cX,initOldConfig:pL,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(_L);if(e.clustering_enabled||e.CLUSTERING_ENABLED||e.clustering){let c=uL.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&&fL(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 fL(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(f_.TABLES))for(let i in n[s][f_.TABLES])for(let o in n[s][f_.TABLES][i]){let c=n[s][f_.TABLES][i][o],l=[vn.DATABASES,s,f_.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(fL,"setSchemasConfig");function tX(e){if(xh===void 0){let r=jo(_L);xh=Bl(r.toJSON())}let t=Gs[e.toLowerCase()];if(t!==void 0)return xh[t.toLowerCase()]}a(tX,"getDefaultConfig");function EL(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(EL,"getConfigValue");function lc(e=Er.getPropsFilePath()){let t=Er.getEnvCliRootPath();if(t)return IA(Bn.join(t,un.HDB_CONFIG_FILE));let r=dL(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{pL(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 lL)jt[i]&&hr.error(`Config ${lL[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 hL(e,t,r=void 0,n=!1,s=!1,i=!1){jt===void 0&&Fh();let o=EL(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&&fL(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(hL,"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 hL(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 DA(){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(DA,"readConfigFile");function jo(e){return uL.parseDocument(Kr.readFileSync(e,"utf8"),{simpleKeys:!0})}a(jo,"parseYamlDoc");function cX(){let e=DA(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=Er.isEmptyOrZeroLength(t)?[]:t;let r=cL(t);if(r)throw vl.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=Er.isEmptyOrZeroLength(n)?[]:n;let s=cL(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 pL(e){let t=dL(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(pL,"initOldConfig");function lX(e){let t=DA();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 TL=N((fRe,SL)=>{"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}},PA=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}};SL.exports={BaseLicense:qh,ExtendedLicense:PA}});var uc=N((hRe,NL)=>{"use strict";var xl=require("fs-extra"),AL=Bh(),RL=require("crypto"),EX=require("moment"),hX=require("uuid").v4,Yr=j(),MA=require("path"),pX=re(),zo=M(),{totalmem:gL}=require("os"),mX=TL().ExtendedLicense,Hl="invalid license key format",SX="061183",TX="mofi25",gX="aes-256-cbc",AX=16,RX=32,yL=se(),{resolvePath:bL}=Ct();yL.initSync();var LA;NL.exports={validateLicense:OL,generateFingerPrint:bX,licenseSearch:BA,getLicense:IX,checkMemoryLimit:wX};function UA(){return MA.join(yL.getHdbBasePath(),zo.LICENSE_KEY_DIR_NAME,zo.LICENSE_FILE_NAME)}a(UA,"getLicenseDirPath");function yX(){let e=UA();return bL(MA.join(e,zo.LICENSE_FILE_NAME))}a(yX,"getLicenseFilePath");function vA(){let e=UA();return bL(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=AL.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 OL(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=RL.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),AL.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(OL,"validateLicense");function NX(e,t){try{let r=RL.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=OL(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?.()||gL();if(t=Math.round(Math.min(t,gL())/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,qL)=>{"use strict";var DL="username is required",PL="nothing to update, must supply active, role or password to update",LL="password cannot be an empty string",ML="If role is specified, it cannot be empty.",UL="active must be true or false";qL.exports={addUser:HX,alterUser:xX,dropUser:FX,getSuperUser:VX,userInfo:GX,listUsers:Vh,listUsersExternal:qX,setUsersToGlobal:Fl,findAndValidateUser:FL,getClusterUser:KX,USERNAME_REQUIRED:DL,ALTERUSER_NOTHING_TO_UPDATE:PL,EMPTY_PASSWORD:LL,EMPTY_ROLE:ML,ACTIVE_BOOLEAN:UL};var vL=cn(),CX=oc(),kA=Bh(),BL=XP(),HL=$r(),FA=eo(),Hn=re(),xL=require("validate.js"),Ke=j(),{promisify:DX}=require("util"),GA=Xi(),IL=M(),wL=It(),PX=Ct(),mRe=se(),SRe=uc(),LX=Qi(),{table:TRe}=(De(),oe(lt)),{handleHDBError:gi,hdb_errors:MX}=_e(),{HTTP_STATUS_CODES:Ai,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)=>FL(e,t,t!=null);var kL={username:!0,active:!0,role:!0,password:!0},CL=new Map,$h=HL.searchByValue,vX=HL.searchByHash,BX=DX(CX.delete);async function HX(e){let t=xL.cleanAttributes(e,kL),r=BL.addUserValidation(t);if(r)throw gi(new Error,r.message,Ai.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 gi(new Error,kl.ROLE_NAME_NOT_FOUND(t.role),Ai.NOT_FOUND,void 0,void 0,!0);if(s.length>1)throw gi(new Error,kl.DUP_ROLES_FOUND(t.role),Ai.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 vL.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 gi(new Error,kl.USER_ALREADY_EXISTS(t.username),Ai.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=xL.cleanAttributes(e,kL);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(PL);if(!Hn.isEmpty(t.password)&&Hn.isEmptyOrZeroLength(t.password.trim()))throw new Error(LL);if(!Hn.isEmpty(t.active)&&!Hn.isBoolean(t.active))throw new Error(UL);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(ML);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),gi(new Error,c,Ai.NOT_FOUND,void 0,void 0,!0)}if(o.length>1){let c=kl.ALTER_USER_DUP_ROLES(t.role);throw Ke.error(c),gi(new Error,c,Ai.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 vL.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=BL.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 gi(new Error,kl.USER_NOT_EXIST(e.username),Ai.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 FL(e,t,r=!0){global.hdb_users||await Fl();let n=global.hdb_users.get(e);if(!n){if(!r)return{username:e};throw gi(new Error,HA.GENERIC_AUTH_FAIL,Ai.UNAUTHORIZED,void 0,void 0,!0)}if(n&&!n.active)throw gi(new Error,HA.USER_INACTIVE,Ai.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(CL.get(t)===n.password)return s;if(kA.validate(n.password,t))CL.set(t,n.password);else throw gi(new Error,HA.GENERIC_AUTH_FAIL,Ai.UNAUTHORIZED,void 0,void 0,!0)}return s}a(FL,"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=PX.getConfigFromFile(IL.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!Hn.isEmpty(r)&&r?.role?.role===IL.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+wL.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+wL.SERVER_SUFFIX.ADMIN,r}a(KX,"getClusterUser");var GL=[];$A.invalidateUser=function(e){for(let t of GL)try{t(e)}catch(r){UX.error("Error invalidating user",r)}};$A.onInvalidatedUser=function(e){GL.push(e)}});var h_=N((bRe,YL)=>{"use strict";var dc=j(),kn=M(),YX=TP(),RRe=Fs(),yRe=Zi(),WX=xn(),{validateEvent:$L}=qs(),E_=Un(),jX=require("process"),{resetDatabases:zX}=(De(),oe(lt)),QX={[kn.ITC_EVENT_TYPES.SCHEMA]:JX,[kn.ITC_EVENT_TYPES.USER]:KL};async function JX(e){let t=$L(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{E_.resetReadTxn(kn.SYSTEM_SCHEMA_NAME,kn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),E_.resetReadTxn(kn.SYSTEM_SCHEMA_NAME,kn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),E_.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 VL=[];async function KL(e){try{try{E_.resetReadTxn(kn.SYSTEM_SCHEMA_NAME,kn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),E_.resetReadTxn(kn.SYSTEM_SCHEMA_NAME,kn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){dc.warn(r)}let t=$L(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 VL)r()}catch(t){dc.error(t)}}a(KL,"userHandler");KL.addListener=function(e){VL.push(e)};YL.exports=QX});var qs=N((DRe,jL)=>{"use strict";var NRe=j(),VA=re(),ZX=M(),{ITC_ERRORS:p_}=Dn(),{parentPort:IRe,threadId:eZ,isMainThread:tZ,workerData:wRe}=require("worker_threads"),{onMessageFromWorkers:rZ,broadcast:CRe,broadcastWithAcknowledgement:nZ}=dt();jL.exports={sendItcEvent:sZ,validateEvent:WL,SchemaEventMsg:iZ,UserEventMsg:oZ};var Kh;rZ(async(e,t)=>{Kh=Kh||h_(),WL(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 WL(e){if(typeof e!="object")return p_.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||VA.isEmpty(e.type))return p_.MISSING_TYPE;if(!e.hasOwnProperty("message")||VA.isEmpty(e.message))return p_.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||VA.isEmpty(e.message.originator))return p_.MISSING_ORIGIN;if(ZX.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return p_.INVALID_EVENT(e.type)}a(WL,"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,XL)=>{"use strict";var zL=M(),LRe=re(),Yh=j(),QL=pP(),Gl,{sendItcEvent:JL}=qs();function aZ(e){try{Yh.info("signalSchemaChange called with message:",e),Gl=Gl||h_();let t=new QL(zL.ITC_EVENT_TYPES.SCHEMA,e);return Gl.schema(t),JL(t)}catch(t){Yh.error(t)}}a(aZ,"signalSchemaChange");function cZ(e){try{Yh.trace("signalUserChange called with message:",e),Gl=Gl||h_();let t=new QL(zL.ITC_EVENT_TYPES.USER,e);return Gl.user(t),JL(t)}catch(t){Yh.error(t)}}a(cZ,"signalUserChange");XL.exports={signalSchemaChange:aZ,signalUserChange:cZ}});var Wh=N((vRe,eM)=>{"use strict";var ZL=re(),lZ=M(),uZ=j(),dZ=Ih(),_Z=Nh(),fZ=eo(),{SchemaEventMsg:EZ}=qs(),hZ="already exists in";eM.exports=pZ;async function pZ(e,t,r){if(ZL.isEmptyOrZeroLength(r))return r;let n=[];ZL.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,tM)=>{"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}};tM.exports=KA});var nM=N((kRe,rM)=>{"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}};rM.exports=YA});var iM=N((GRe,sM)=>{"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}};sM.exports=WA});var aM=N(($Re,oM)=>{"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}};oM.exports=jA});var lM=N((KRe,cM)=>{"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}};cM.exports=zA});var m_=N((jRe,fM)=>{"use strict";var WRe=require("path"),uM=ht(),IZ=nM(),wZ=iM(),CZ=aM(),DZ=lM(),$l=Ht(),dM=re(),{CONFIG_PARAMS:PZ}=M(),_M=se();_M.initSync();var jh=M().OPERATIONS_ENUM,{getTransactionAuditStorePath:LZ}=Tt();fM.exports=MZ;async function MZ(e,t){if(_M.get(PZ.LOGGING_AUDITLOG)===!1)return;let r=LZ(e.schema,e.table),n=await uM.openEnvironment(r,e.table,!0),s=UZ(e,t);if(!(s===void 0||s.hash_values.length===0)&&n!==void 0){uM.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),dM.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=dM.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 DZ(t.deleted,t.original_records,r,t.txn_time,e.__origin)}a(UZ,"createTransactionObject")});var QA=N((JRe,EM)=>{"use strict";var vZ=l_(),QRe=Yd(),S_=M(),BZ=Wd(),HZ=ec().insertRecords,xZ=ht(),kZ=j(),FZ=Wh(),{getSchemaPath:GZ}=Tt(),qZ=m_();EM.exports=$Z;async function $Z(e){try{let{schema_table:t,attributes:r}=vZ(e);BZ(e,r,t.hash_attribute),e.schema!==S_.SYSTEM_SCHEMA_NAME&&(r.includes(S_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(S_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(S_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(S_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await 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 mM=N((ZRe,pM)=>{"use strict";var hM=M(),VZ=QA(),KZ=Yd(),YZ=require("fs-extra"),{getSchemaPath:WZ}=Tt();pM.exports=jZ;async function jZ(e){let t=[{name:e.schema,createddate:Date.now()}],r=new KZ(hM.SYSTEM_SCHEMA_NAME,hM.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,void 0,t);await VZ(r),await YZ.mkdirp(WZ(e.schema))}a(jZ,"lmdbCreateSchema")});var TM=N((tye,SM)=>{"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}};SM.exports=JA});var yM=N((oye,RM)=>{"use strict";var gM=ht(),XA=sn(),ZA=Dn().LMDB_ERRORS_ENUM,zZ=Ht(),AM=j(),nye=re(),QZ=require("lmdb"),JZ=TM(),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=gM.listDBIs(e);gM.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{AM.warn(`cannot delete from attribute: ${g}, ${y}:${o}`)}}});c.push(T),l.push(o),i.original_records.push(h)}catch(h){AM.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");RM.exports={deleteRecords:e5}});var T_=N((cye,OM)=>{"use strict";var Vl=re(),t5=yM(),r5=ht(),{getSchemaPath:n5}=Tt(),s5=m_(),i5=j();OM.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 bM([],[]);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 bM(o.deleted,o.skipped,o.txn_time)}catch(s){throw s}}a(o5,"lmdbDeleteRecords");function bM(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(bM,"createDeleteResponse")});var tR=N((dye,NM)=>{"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");NM.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,MM)=>{"use strict";var Qo=ht(),fye=j(),Fn=sn(),zh=Ht(),zt=Dn().LMDB_ERRORS_ENUM,Eye=re(),m5=M(),Qh=tR(),{parseRow:S5}=Qh,hye=require("lmdb"),{OVERFLOW_MARKER:IM,MAX_SEARCH_KEY_LENGTH:T5}=zh;function wM(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(wM,"iterateFullIndex");function g_(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(g_,"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 CM(e,t,r,n){let s;return function(i,o){if(typeof i=="string"&&i.endsWith(IM)){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(CM,"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=A_(l,r),c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}).map(u=>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=A_(e.database||e,r);let o=new Map;for(let{key:c,value:l}of wM(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=wM(e,void 0,t,r,n,s),c=o.transaction,l=CM(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=CM(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(IM)?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),g_(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),g_(e,t,r,n,l,s,i,o,!1,!1)}a(C5,"greaterThanEqual");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),g_(e,t,r,l,n,s,i,o,!1,!0)}a(D5,"lessThan");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),g_(e,t,r,l,n,s,i,o,!1,!1)}a(P5,"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 g_(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=A_(s,r),n===void 0)throw new Error(zt.ID_REQUIRED);let o=null,c=s.dbis[t].get(n,{transaction:i,lazy:r.length<3});return c&&(o=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 LM(e,t,r,n,s),PM(e,t,r,n,s).map(i=>i[1])}a(v5,"batchSearchByHash");function B5(e,t,r,n,s=[]){LM(e,t,r,n,s);let i=new Map;for(let[o,c]of PM(e,t,r,n,s))i.set(o,c);return i}a(B5,"batchSearchByHashToMap");function PM(e,t,r,n,s=[]){return fc(e,t,t,(i,o,c)=>{r=A_(c,r);let l=r.length<3;return n.map(u=>{let 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(PM,"batchHashSearch");function LM(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(LM,"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 A_(e,t){return t.length===1&&m5.SEARCH_WILDCARDS.indexOf(t[0])>=0&&(t=Qo.listDBIs(e)),t}a(A_,"setGetWholeRowAttributes");MM.exports={searchAll:g5,searchAllToMap:A5,count:O5,countAll:y5,equals:b5,startsWith:N5,endsWith:I5,contains:DM,searchByHash:M5,setGetWholeRowAttributes:A_,batchSearchByHash:v5,batchSearchByHashToMap:B5,checkHashExists:U5,iterateDBI:R5,greaterThan:w5,greaterThanEqual:C5,lessThan:D5,lessThanEqual:P5,between:L5}});var Yl=N((Sye,xM)=>{var UM=require("lodash"),vM=gt(),xe=require("joi"),H5=re(),{hdb_schema_table:R_,checkValidTable:BM,hdb_table:HM,hdb_database:Xh}=mi(),{handleHDBError:x5,hdb_errors:k5}=_e(),{getDatabases:F5}=(De(),oe(lt)),{HTTP_STATUS_CODES:G5}=k5,q5=xe.object({database:Xh,schema:Xh,table:HM,search_attribute:R_,search_value:xe.any().required(),get_attributes:xe.array().min(1).items(xe.alternatives(R_,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:HM,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(R_,xe.object())).optional(),sort:xe.object({attribute:xe.alternatives(R_,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(R_,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()});xM.exports=function(e,t){let r=null;switch(t){case"value":r=vM.validateBySchema(e,q5);break;case"hashes":let i=function(o){s?s+=". "+o:s=o};var n=i;a(i,"addError");let s;i(BM("database",e.schema)),i(BM("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=vM.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=UM.filter(c,d=>d!=="*"&&!d.startsWith?.("$")&&d.attribute!=="*"&&!Array.isArray(d)&&!d.name&&!UM.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,kM)=>{"use strict";var V5=ht(),K5=Yl(),{getSchemaPath:Y5}=Tt();kM.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,FM)=>{"use strict";var j5=Kl(),z5=rR();FM.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,GM)=>{"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}};GM.exports=sR});var $M=N((Iye,qM)=>{"use strict";var Nye=Wl(),J5=Kl(),X5=rR();qM.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,VM)=>{"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}};VM.exports=iR});var Zh=N((Pye,QM)=>{"use strict";var Wr=Kl(),e6=ht(),t6=re(),ke=Ht(),Ec=M(),r6=Qi(),KM=Dn().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=zM(e,n.hash_attribute,r,t);return WM(e,s,n.hash_attribute,r)}a(s6,"prepSearch");async function WM(e,t,r,n){let s=n6(e.schema,e.table),i=await e6.openEnvironment(s,e.table),o=jM(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?YM(o,()=>!0):o.map(E=>({[r]:E.key}));let _=a(E=>({[r]:E.value,[d]:E.key}),"toObject");return n?YM(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(WM,"executeSearch");function jM(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(jM,"searchByType");function YM(e,t){let r=new Map;for(let n of e)r.set(n.value,t(n));return r}a(YM,"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 zM(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(KM.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(KM.UNKNOWN_SEARCH_TYPE)}}a(zM,"createSearchTypeFromSearchObject");QM.exports={executeSearch:WM,createSearchTypeFromSearchObject:zM,prepSearch:s6,searchByType:jM}});var XM=N((Uye,JM)=>{"use strict";var Mye=$s(),o6=Yl(),a6=re(),c6=M(),l6=Zh();JM.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 y_=N((Hye,ZM)=>{"use strict";var Bye=$s(),d6=Yl(),_6=re(),f6=M(),E6=Zh();ZM.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 tU=N((Fye,eU)=>{"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}};eU.exports={SearchByConditionsObject:oR,SearchCondition:aR,SortAttribute:cR}});var oU=N((Vye,iU)=>{"use strict";var qye=tU().SearchByConditionsObject,p6=$s(),m6=Yl(),lR=Kl(),ep=Ht(),{Resource:$ye}=(Vs(),oe(uR)),sU=Zh(),S6=tR(),T6=require("lodash"),{getSchemaPath:g6}=Tt(),rU=ht(),{handleHDBError:A6,hdb_errors:R6}=_e(),{HTTP_STATUS_CODES:y6}=R6,b6=1e8;iU.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 rU.openEnvironment(r,e.table),s=global.hdb_schema[e.schema][e.table];for(let u of e.conditions)rU.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 nU(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(sU.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 nU(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 nU(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,sU.searchByType(e,s,i,n).map(o=>o.value)}a(nU,"executeConditionSearch")});var b_=N((Yye,aU)=>{"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}};aU.exports=dR});var _R=N((jye,hU)=>{"use strict";var dU=$s(),_U=b_(),fU=y_(),EU=T_(),dn=M(),cU=re(),lU=ht(),{getTransactionAuditStorePath:I6,getSchemaPath:w6}=Tt(),uU=j();hU.exports=C6;async function C6(e){try{if(cU.isEmpty(global.hdb_schema[e.schema])||cU.isEmpty(global.hdb_schema[e.schema][e.table]))throw new Error(`unknown schema:${e.schema} and table ${e.table}`);await D6(e),await P6(e);let t=w6(e.schema,e.table);try{await lU.deleteEnvironment(t,e.table)}catch(r){if(r.message==="invalid environment")uU.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}try{let r=I6(e.schema,e.table);await lU.deleteEnvironment(r,e.table,!0)}catch(r){if(r.message==="invalid environment")uU.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}}catch(t){throw t}}a(C6,"lmdbDropTable");async function D6(e){let t=new dU(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 fU(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 _U(dn.SYSTEM_SCHEMA_NAME,dn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,n);await EU(s)}a(D6,"deleteAttributesFromSystem");async function P6(e){let t=new dU(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 fU(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 _U(dn.SYSTEM_SCHEMA_NAME,dn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,[n.id]);try{await EU(s)}catch(i){throw i}}a(P6,"dropTableFromSystem")});var mU=N((Qye,pU)=>{"use strict";var L6=require("fs-extra"),M6=$s(),U6=Wl(),v6=b_(),B6=_R(),H6=T_(),x6=nR(),k6=y_(),ro=M(),{getSchemaPath:F6}=Tt(),{handleHDBError:G6,hdb_errors:q6}=_e(),{HDB_ERROR_MSGS:$6,HTTP_STATUS_CODES:V6}=q6;pU.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 O_=N((Xye,SU)=>{"use strict";var fR=class{static{a(this,"CreateTableObject")}constructor(t,r,n){this.schema=t,this.table=r,this.hash_attribute=n}};SU.exports=fR});var hR=N((tbe,TU)=>{"use strict";var W6=require("fs-extra"),tp=ht(),{getTransactionAuditStorePath:j6}=Tt(),ER=Ht(),ebe=O_();TU.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 RU=N((sbe,AU)=>{"use strict";var pR=M(),gU=ht(),Q6=ec(),{getSystemSchemaPath:J6,getSchemaPath:X6}=Tt(),nbe=Qi(),Z6=Ih(),mR=Nh(),e8=j(),t8=hR();AU.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 gU.createEnvironment(r,t.table),e!==void 0){let o=await gU.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 bU=N((obe,yU)=>{"use strict";var n8=l_(),s8=Wd(),i8=Wh(),N_=M(),o8=ec().updateRecords,a8=ht(),{getSchemaPath:c8}=Tt(),l8=m_(),u8=j();yU.exports=d8;async function d8(e){try{let{schema_table:t,attributes:r}=n8(e);s8(e,r,t.hash_attribute),e.schema!==N_.SYSTEM_SCHEMA_NAME&&(r.includes(N_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(N_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(N_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(N_.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 NU=N((cbe,OU)=>{"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}};OU.exports=TR});var wU=N((dbe,IU)=>{"use strict";var ube=NU(),f8=l_(),E8=Wd(),h8=Wh(),I_=M(),p8=ec().upsertRecords,m8=ht(),{getSchemaPath:S8}=Tt(),T8=m_(),g8=j(),{handleHDBError:A8,hdb_errors:R8}=_e();IU.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!==I_.SYSTEM_SCHEMA_NAME&&(n.includes(I_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||n.push(I_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),n.includes(I_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||n.push(I_.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,CU)=>{"use strict";var gR=class{static{a(this,"DeleteBeforeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.timestamp=n}};CU.exports=gR});var LU=N((hbe,PU)=>{"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}};PU.exports=AR});var vU=N((Sbe,UU)=>{"use strict";var RR=ht(),{getTransactionAuditStorePath:b8}=Tt(),mbe=DU(),w_=Ht(),O8=re(),MU=LU(),N8=require("util").promisify,I8=N8(setTimeout),w8=1e4,C8=100;UU.exports=D8;async function D8(e){let t=b8(e.schema,e.table),r=await RR.openEnvironment(t,e.table,!0),n=RR.listDBIs(r);RR.initializeDBIs(r,w_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s,i=new MU;do s=await P8(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(D8,"deleteAuditLogsBefore");async function P8(e,t){let r=new MU;try{let n=e.dbis[w_.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[w_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME];O8.isEmpty(c)||(s=e.dbis[w_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].remove(c,i));for(let l=0;l<o.hash_values.length;l++)s=e.dbis[w_.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(P8,"deleteTransactions")});var HU=N((gbe,BU)=>{"use strict";var yR=class{static{a(this,"DropAttributeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.attribute=n}};BU.exports=yR});var kU=N((ybe,xU)=>{"use strict";var L8=$s(),M8=b_(),Rbe=HU(),Ri=M(),U8=re(),bR=ht(),v8=Qi(),B8=y_(),H8=T_(),{getSchemaPath:x8}=Tt();xU.exports=k8;async function k8(e,t=!0){let r;e.schema===Ri.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(Ri.SYSTEM_SCHEMA_NAME,Ri.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,Ri.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[Ri.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY,Ri.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]),n=Array.from(await B8(t)).filter(o=>o[Ri.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[Ri.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),i=new M8(Ri.SYSTEM_SCHEMA_NAME,Ri.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,s);return H8(i)}a(G8,"dropAttributeFromSystem")});var KU=N((Nbe,VU)=>{"use strict";var OR=ht(),jl=Ht(),Obe=sn(),NR=M(),FU=re(),{getTransactionAuditStorePath:q8}=Tt(),$8=Kl(),rp=ql(),V8=j();VU.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 GU(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 GU(r)}}a(K8,"readAuditLog");function GU(e,t=[0,Date.now()]){FU.isEmpty(t[0])&&(t[0]=0),FU.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(GU,"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,$U(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=$U(e,s),o=new Map;for(let c=0;c<i.length;c++){let l=i[c],u=l.timestamp,d=n.get(u);qU(l,"records",r,d,o),qU(l,"original_records",r,d,o)}return Object.fromEntries(o)}a(W8,"searchTransactionsByHashValues");function qU(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(qU,"loopRecords");function $U(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($U,"batchSearchTransactions")});var WU=N((Dbe,YU)=>{"use strict";var{getSchemaPath:wbe}=Tt(),Cbe=ht(),{database:j8}=(De(),oe(lt));YU.exports={writeTransaction:z8};async function z8(e,t,r){return j8({database:e,table:t}).transaction(r)}a(z8,"writeTransaction")});var JU=N((Lbe,QU)=>{"use strict";var{getSchemaPath:jU}=Tt(),zU=ht();QU.exports={flush:Q8,resetReadTxn:J8};async function Q8(e,t){return(await zU.openEnvironment(jU(e,t),t.toString())).flushed}a(Q8,"flush");async function J8(e,t){try{(await zU.openEnvironment(jU(e,t),t.toString())).resetReadTxn()}catch{}}a(J8,"resetReadTxn")});var tv=N((Ube,ev)=>{"use strict";var{Readable:X8}=require("stream"),{getDatabases:Z8}=(De(),oe(lt)),{readSync:e9,openSync:t9,createReadStream:XU}=require("fs"),{open:r9}=require("lmdb"),ZU=r_(),n9=n_(),{AUDIT_STORE_OPTIONS:s9}=(ji(),oe(rv)),{INTERNAL_DBIS_NAME:i9,AUDIT_STORE_NAME:o9}=Ht();ev.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 ZU(!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 ZU(!U,U);await m(S,H)}e.include_audit&&await m(o9,{...s9}),await E;let g=XU(_.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 _=XU(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 iv=N((Bbe,sv)=>{"use strict";var l9=j(),{handleHDBError:u9}=_e(),d9=RD(),_9=Ih(),f9=QA(),E9=mM(),h9=T_(),p9=nR(),m9=$M(),S9=XM(),T9=y_(),g9=oU(),A9=mU(),R9=RU(),y9=bU(),b9=wU(),O9=vU(),N9=_R(),I9=kU(),w9=KU(),C9=WU(),nv=JU(),D9=tv(),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 nv.flush(t,r)}resetReadTxn(t,r){return nv.resetReadTxn(t,r)}getBackup(t){return D9(t)}};sv.exports=wR});function fv(e){DR=e}function U9(){M9=setInterval(function(){for(let e of CR)if(e.stale){let t=e[Fe]?.url;lv.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 PR,cv,lv,uv,dv,_v,ov,CR,P9,C_,av,DR,hc,np,L9,M9,sp=Ie(()=>{PR=L(sn()),cv=L(_e()),lv=L(j());Vs();uv=L(se()),dv=L(M()),_v=L(re()),ov=100,CR=new Set,P9=(0,_v.convertToMS)(uv.get(dv.CONFIG_PARAMS.STORAGE_MAXTRANSACTIONQUEUETIME))||45e3;a(fv,"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(C_&&!this.overloadChecked&&performance.now()-av>P9)throw new cv.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,PR.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)<ov>>n?l():s=this.writes[0].store.transaction(()=>{for(let _ of this.writes)_.entry=_.store.getEntry(_.key),c(_);return!0})),s)return C_||(C_=s,av=performance.now(),C_.then(()=>{C_=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];DR&&f&&i.push(DR(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)+ov/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,PR.getNextMonotonicTime)())}getReadTxn(){}},L9=3e4;a(U9,"startMonitoringTxns");U9()});function Dt(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 Ev,pc=Ie(()=>{Ev=L(_i());Vs();sp();a(Dt,"transaction");(0,Ev._assignPackageExport)("transaction",Dt);Dt.commit=function(e){let t=(e[Fe]||e)?.transaction;if(!t)throw new Error("No active transaction is available to commit");return t.commit()};Dt.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 Rv={};je(Rv,{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 pv(e,t){let r=yi(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;Dt(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 yi(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 mv(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*Sv(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 Tv,ip,Ks,gv,Ys,LR,MR,Av,v9,B9,H9,x9,hv,UR,yv=Ie(()=>{"use strict";Tv=L(iv()),ip=L(Yl()),Ks=L(_e());De();gv=L(l_()),Ys=L(M()),LR=L(eo()),MR=L(qs()),Av=L(re());pc();ap();({HDB_ERROR_MSGS:v9}=Ks.hdb_errors),B9="data",H9=1e4,x9=10,UR=class extends Tv.default{static{a(this,"ResourceBridge")}constructor(t){super(t),hv=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=yi(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 yi(t).addAttributes([{name:t.attribute,indexed:t.indexed??!0}]),`attribute ${t.schema}.${t.table}.${t.attribute} successfully created.`}async dropAttribute(t){let r=yi(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){yi(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,hv.upsertRecords(t)}async upsertRecords(t){let{schema_table:r,attributes:n}=(0,gv.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),Dt(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),Dt(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 mv(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,Av.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?mv(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 pv(t)}async getDataByHash(t){let r=new Map;t._returnKeyValue=!0;for await(let{key:n,value:s}of pv(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=yi(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=yi(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){yi({schema:t,table:r})?.primaryStore.resetReadTxn()}async deleteAuditLogsBefore(t){return yi(t).deleteHistory(t.timestamp,t.cleanup_deleted_records)}async readAuditLog(t){let r=yi(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 Sv(r))s.includes(i.user_name)&&(n[i.user_name]||(n[i.user_name]=[])).push(i);return n;default:return Sv(r,t.search_values?.[0],t.search_values?.[1],t.limit)}}};a(vR,"getSelect");a(pv,"getRecords");a(yi,"getTable");a(mv,"createDeleteResponse");a(Sv,"groupRecordsInHistory")});var Un=N((Jbe,bv)=>{"use strict";var{ResourceBridge:k9}=(yv(),oe(Rv)),F9=se();F9.initSync();var cp;function G9(){return cp||(cp=new k9,cp)}a(G9,"getBridge");bv.exports=G9()});var wv=N((Zbe,Iv)=>{"use strict";var Ov=require("lodash"),D_=require("mathjs"),q9=require("jsonata"),Nv=re();Iv.exports={distinct_array:a(e=>Array.isArray(e)&&e.length>1?Ov.uniqWith(e,Ov.isEqual):e,"distinct_array"),searchJSON:$9,mad:P_.bind(null,D_.mad),mean:P_.bind(null,D_.mean),mode:P_.bind(null,D_.mode),prod:P_.bind(null,D_.prod),median:P_.bind(null,D_.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(Nv.isEmpty(this.__ala__.res)&&(this.__ala__.res={}),Nv.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,Cv)=>{"use strict";var nr=require("moment"),HR="YYYY-MM-DDTHH:mm:ss.SSSZZ";nr.suppressDeprecationWarnings=!0;Cv.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 Uv=N((nOe,Mv)=>{"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"),Pv=M(),$e=re(),no=j();Mv.exports={geoArea:Z9,geoLength:e7,geoCircle:t7,geoDifference:r7,geoDistance:Lv,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 Lv(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(Lv,"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 Lv(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(Pv.GEO_CONVERSION_ENUM[t]))throw new Error(`geo_type of ${t} is invalid please use one of the following types: ${Object.keys(Pv.GEO_CONVERSION_ENUM).join(",")}`);return typeof e=="string"&&(e=$e.autoCastJSON(e)),X9[t](e,r)}a(a7,"geoConvert")});var lp=N((iOe,vv)=>{var mc=wv(),Gn=Dv(),bi=Uv();vv.exports=e=>{e.aggr.mad=e.aggr.MAD=mc.mad,e.aggr.mean=e.aggr.MEAN=mc.mean,e.aggr.mode=e.aggr.MODE=mc.mode,e.aggr.prod=e.aggr.PROD=mc.prod,e.aggr.median=e.aggr.MEDIAN=mc.median,e.fn.distinct_array=e.fn.DISTINCT_ARRAY=mc.distinct_array,e.fn.search_json=e.fn.SEARCH_JSON=mc.searchJSON,e.fn.__ala__=e,e.fn.current_date=e.fn.CURRENT_DATE=Gn.current_date,e.fn.current_time=e.fn.CURRENT_TIME=Gn.current_time,e.fn.extract=e.fn.EXTRACT=Gn.extract,e.fn.date=e.fn.DATE=Gn.date,e.fn.date_format=e.fn.DATE_FORMAT=Gn.date_format,e.fn.date_add=e.fn.DATE_ADD=Gn.date_add,e.fn.date_sub=e.fn.DATE_SUB=Gn.date_sub,e.fn.date_diff=e.fn.DATE_DIFF=e.fn.datediff=e.fn.DATEDIFF=Gn.date_diff,e.fn.now=e.fn.NOW=Gn.now,e.fn.offset_utc=e.fn.OFFSET_UTC=Gn.offset_utc,e.fn.get_server_time=e.fn.GET_SERVER_TIME=Gn.get_server_time,e.fn.getdate=e.fn.GETDATE=Gn.now,e.fn.current_timestamp=e.fn.CURRENT_TIMESTAMP=Gn.now,e.fn.geoarea=e.fn.GEOAREA=e.fn.geoArea=bi.geoArea,e.fn.geocircle=e.fn.GEOCIRCLE=e.fn.geoCircle=bi.geoCircle,e.fn.geocontains=e.fn.GEOCONTAINS=e.fn.geoContains=bi.geoContains,e.fn.geoconvert=e.fn.GEOCONVERT=e.fn.geoConvert=bi.geoConvert,e.fn.geocrosses=e.fn.GEOCROSSES=e.fn.geoCrosses=bi.geoCrosses,e.fn.geodifference=e.fn.GEODIFFERENCE=e.fn.geoDifference=bi.geoDifference,e.fn.geodistance=e.fn.GEODISTANCE=e.fn.geoDistance=bi.geoDistance,e.fn.geoequal=e.fn.GEOEQUAL=e.fn.geoEqual=bi.geoEqual,e.fn.geolength=e.fn.GEOLENGTH=e.fn.geoLength=bi.geoLength,e.fn.geonear=e.fn.GEONEAR=e.fn.geoNear=bi.geoNear}});var kv=N((oOe,xv)=>{"use strict";var L_=require("lodash"),_n=require("alasql");_n.options.cache=!1;var c7=lp(),Bv=require("clone"),up=require("recursive-iterator"),Ue=j(),et=re(),Ql=Un(),l7=M(),{hdb_errors:u7}=_e(),{getDatabases:Hv}=(De(),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(Bv(r)))}_getTables(){let t=[];this.all_table_attributes.forEach(r=>{t.push(r.table)}),this.tables=L_.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=Hv()[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&&L_.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(Bv(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:Hv()[s.databaseid][s.tableid].primaryKey,tableid:s.tableid};this._addFetchColumns([i])}),this.statement.order&&(this._updateOrderByToAliases(),this._addNonAggregatorsToFetchColumns()),this.fetch_attributes=L_.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=L_.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=L_.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)}};xv.exports=xR});var $r=N((cOe,Fv)=>{"use strict";var _7=gD();Fv.exports={searchByConditions:E7,searchByHash:h7,searchByValue:p7,search:m7};var kR=Un(),{transformReq:FR}=re(),f7=kv();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,Gv)=>{"use strict";var S7=Un();Gv.exports={writeTransaction:T7};function T7(e,t,r){return S7.writeTransaction(e,t,r)}a(T7,"writeTransaction")});var Kv=N((fOe,Vv)=>{"use strict";var g7=$r(),A7=Fs(),qv=j(),R7=cn(),_Oe=dp(),y7=require("clone"),qR=require("alasql"),b7=lp(),$v=require("util"),O7=$v.promisify(A7.getTableSchema),N7=$v.promisify(g7.search),I7=M(),GR=re();b7(qR);Vv.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=D7(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),_=P7(n,d);return L7(o,_,t)}a(C7,"update");function D7(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 qv.error(t),new Error(w7)}}a(D7,"createUpdateRecord");function P7(e,t){return GR.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}a(P7,"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){qv.error(`Error delete new_attributes from update response: ${i}`)}return s}a(L7,"updateRecords")});var Wv=N((mOe,Yv)=>{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);Yv.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 Xv=N((TOe,Jv)=>{"use strict";var Y7=Zi(),{hdb_errors:jv}=_e(),{getDatabases:zv}=(De(),oe(lt));Jv.exports={checkSchemaExists:Qv,checkSchemaTableExists:W7,schema_describe:Y7};async function Qv(e){if(!zv()[e])return jv.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(Qv,"checkSchemaExists");async function W7(e,t){let r=await Qv(e);if(r)return r;if(!zv()[e][t])return jv.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:U_(e)??1,nodes:[]})})}i[n]=0,e.putSync(Ep,(0,Jl.pack)(r))}return r}function M_(e){return KR(e).remoteNameToId}function e0(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 Zv.info?.("The remote node name map",e,n,s),s}var Zv,Jl,Ep,YR=Ie(()=>{Zv=L(Sc());ls();Jl=require("msgpackr"),Ep=Symbol.for("remote-ids");a(KR,"getIdMappingRecord");a(M_,"exportIdMapping");a(e0,"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 n0={};je(n0,{Resources:()=>pp,keyArrayToString:()=>Xl,resetResources:()=>j7,resources:()=>Oi});function j7(){return Oi=new pp}function Xl(e){return Array.isArray(e)?e[e.length-1]===null?e.slice(0,-1).join("/")+"/":e.join("/"):e}var t0,r0,pp,Oi,Zl=Ie(()=>{pc();WR();t0=L(j()),r0=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 r0.ServerError(`Conflicting paths for ${t}`);t0.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 Dt(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=i0,z7(e.primaryStore,e.auditStore)):(c=s0,e.primaryStore.env.hasSubscriptionCommitListener||(e.primaryStore.env.hasSubscriptionCommitListener=!0,e.primaryStore.on("committed",()=>{o0(s0[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 o0(e){if(!e)return;let t=e.auditStore;t.resetReadTxn(),a0(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);_>-1?l=l.slice(0,_):l=null,u++}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=i0[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{o0(l)}finally{r.threadLocalWrites[0]=l.lastTxnTime,r.unlock("thread-local-writes")}},"acquiredLock");r.attemptLock("thread-local-writes",u)&&u()})}}function a0(e){e.nextTransaction?.resolve();let t;e.nextTransaction=new Promise(r=>{t=r}),e.nextTransaction.resolve=t}function c0(e){return e.nextTransaction||(QR({primaryStore:e,auditStore:e},null,null,0,{scope:"full-database"}),a0(e)),e.nextTransaction}var jR,s0,i0,zR,JR=Ie(()=>{jR=L(j());Cl();Zl();ji();s0=Object.create(null),i0=Object.create(null);a(QR,"addSubscription");zR=class extends Pn{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(o0,"notifyFromTransactionData");a(z7,"listenToCommits");a(a0,"nextTransaction");a(c0,"whenNextTransaction")});var E0={};je(E0,{commits_awaiting_replication:()=>ru,getHDBNodeTable:()=>pr,iterateRoutes:()=>B_,shouldReplicateToNode:()=>v_,subscribeToNodeUpdates:()=>nu});function pr(){return l0||(l0=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;f0.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 v_(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=u0.get(n);if(s||u0.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*B_(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){d0.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 d0,_0,eu,tu,f0,l0,u0,ru,su=Ie(()=>{De();ls();sp();d0=require("worker_threads"),_0=L(_e()),eu=L(se()),tu=L(M()),f0=L(Sc());server.nodes=[];a(pr,"getHDBNodeTable");a(nu,"subscribeToNodeUpdates");a(v_,"shouldReplicateToNode");u0=new Map;fv((e,t,r)=>{if(r>server.nodes.length)throw new _0.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(B_,"iterateRoutes")});var T0={};je(T0,{connectedToNode:()=>Tc,disconnectedFromNode:()=>au,ensureNode:()=>io,requestClusterStatus:()=>S0,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,U_(l.auditStore));break}}}Ni.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes.search([]))i.push(o);for(let o of B_(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=v_(i,_),g=Ni.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,Ni.onMessageByType)("disconnected-from-node",au),(0,Ni.onMessageByType)("connected-to-node",Tc),(0,Ni.onMessageByType)("request-cluster-status",S0)}function S0(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 m0.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&&!h0.default.get(p0.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 Ni,Sp,_t,XR,h0,p0,m0,J7,so,au,Tc,iu,mp,H_=Ie(()=>{De();Ni=L(dt());ls();Sp=require("worker_threads");su();_t=L(j()),XR=require("lodash"),h0=L(se()),p0=L(M()),m0=require("crypto"),J7=200,so=new Map,iu=new Map,mp=new Map;a(ZR,"startOnMainThread");a(S0,"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,Ni.onMessageByType)("subscribe-to-node",e=>{ou(e)}),(0,Ni.onMessageByType)("unsubscribe-from-node",e=>{Tp(e)}));a(io,"ensureNode")});var gp=N((WOe,g0)=>{"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}};g0.exports=ey});var R0=N((zOe,A0)=>{"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}};A0.exports={JWTTokens:ty,TOKEN_TYPE_ENUM:Z7,JWTRSAKeys:ry}});var cu=N((JOe,N0)=>{"use strict";var k_=require("jsonwebtoken"),ny=require("fs-extra"),sy=re(),us=M(),{handleHDBError:fn,hdb_errors:eee}=_e(),{HTTP_STATUS_CODES:En,AUTHENTICATION_ERROR_MSGS:hn}=eee,x_=j(),y0=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}=R0(),aee=ta.get(us.HDB_SETTINGS_NAMES.OPERATION_TOKEN_TIMEOUT_KEY)?ta.get(us.HDB_SETTINGS_NAMES.OPERATION_TOKEN_TIMEOUT_KEY):"1d",cee=ta.get(us.HDB_SETTINGS_NAMES.REFRESH_TOKEN_TIMEOUT_KEY)?ta.get(us.HDB_SETTINGS_NAMES.REFRESH_TOKEN_TIMEOUT_KEY):"30d",Rp="RS256",oy;N0.exports={createTokens:lee,validateOperationToken:dee,refreshOperationToken:uee,validateRefreshToken:O0,getJWTRSAKeys:F_};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 x_.error(E),fn(new Error,hn.INVALID_CREDENTIALS,En.UNAUTHORIZED,void 0,void 0,!0)}let r=await F_(),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 b0(i,r.private_key,r.passphrase),c=await k_.sign(i,{key:r.private_key,passphrase:r.passphrase},{expiresIn:cee,algorithm:Rp,subject:Ap.REFRESH}),l=y0.hash(c),u=new ree(us.SYSTEM_SCHEMA_NAME,us.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,[{username:e.username,refresh_token:l}]),d,_;try{d=await tee(u)}catch(E){x_.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 b0(e,t,r){return await k_.sign(e,{key:t,passphrase:r},{expiresIn:aee,algorithm:Rp,subject:Ap.OPERATION})}a(b0,"signOperationToken");async function F_(){if(oy===void 0)try{let e=iy.join(ta.getHdbBasePath(),us.LICENSE_KEY_DIR_NAME,us.JWT_ENUM.JWT_PASSPHRASE_NAME),t=iy.join(ta.getHdbBasePath(),us.LICENSE_KEY_DIR_NAME,us.JWT_ENUM.JWT_PRIVATE_KEY_NAME),r=iy.join(ta.getHdbBasePath(),us.LICENSE_KEY_DIR_NAME,us.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 x_.error(e),fn(new Error,hn.NO_ENCRYPTION_KEYS,En.INTERNAL_SERVER_ERROR)}return oy}a(F_,"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 O0(e.refresh_token);let t=await F_(),r=await k_.decode(e.refresh_token);return{operation_token:await b0({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 F_(),r=await k_.verify(e,t.public_key,{algorithms:Rp,subject:Ap.OPERATION});return await ay.findAndValidateUser(r.username,void 0,!1)}catch(t){throw x_.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 O0(e){let t;try{let r=await F_(),n=await k_.verify(e,r.public_key,{algorithms:Rp,subject:Ap.REFRESH});t=await ay.findAndValidateUser(n.username,void 0,!1)}catch(r){throw x_.warn(r),r.name&&r.name==="TokenExpiredError"?fn(new Error,hn.TOKEN_EXPIRED,En.FORBIDDEN):fn(new Error,hn.INVALID_TOKEN,En.UNAUTHORIZED)}if(!y0.validate(t.refresh_token,e))throw fn(new Error,hn.INVALID_TOKEN,En.UNAUTHORIZED);return t}a(O0,"validateRefreshToken")});var Js=N(J0=>{"use strict";var sr=require("path"),pn=require("fs-extra"),lu=require("node-forge"),M0=require("net"),{generateKeyPair:ly,X509Certificate:oo,createPrivateKey:U0}=require("crypto"),_ee=require("util");ly=_ee.promisify(ly);var yt=lu.pki,zs=require("joi"),{v4:v0}=require("uuid"),{validateBySchema:fy}=gt(),pt=j(),ds=se(),_s=M(),{CONFIG_PARAMS:uu}=_s,Qs=bA(),{ClientError:na}=_e(),Ac=require("node:tls"),{relative:B0,join:fee}=require("node:path"),{CERT_PREFERENCE_APP:ZOe,CERTIFICATE_VALUES:I0}=Qs,Eee=Wa(),uy=Ct(),w0=parseInt(process.version.slice(1))<20,{table:hee,getDatabases:pee,databases:cy}=(De(),oe(lt)),{getJWTRSAKeys:C0}=cu();Object.assign(J0,{generateKeys:py,updateConfigCert:V0,createCsr:bee,signCertificate:Oee,setCertTable:du,loadCertificates:G0,reviewSelfSignedCert:Sy,createTLSSelector:W0,listCertificates:z0,addCertificate:Pee,removeCertificate:Mee,createNatsCerts:wee,generateCertsKeys:Iee,getReplicationCert:q_,getReplicationCertAuth:yee,renewSelfSigned:Cee,hostnamesFromCert:Q0,getKey:Uee});var{urlToNodeName:H0,getThisNodeUrl:mee,getThisNodeName:bp,clearThisNodeName:See}=(ls(),oe(oa)),{readFileSync:Tee,watchFile:gee,statSync:x0}=require("node:fs"),eNe=se(),{getTicketKeys:Aee,onMessageFromWorkers:Ree}=dt(),ra=j(),{isMainThread:k0}=require("worker_threads"),{TLSSocket:F0,createSecureContext:tNe}=require("node:tls"),Ey=3650,G_=["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===_s.ITC_EVENT_TYPES.RESTART&&(ds.initSync(!0),await Sy())});var Dr;function ia(){return Dr||(Dr=pee().system.hdb_certificate,Dr||(Dr=hee({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__"}]}))),Dr}a(ia,"getCertTable");async function q_(){let e=W0("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(q_,"getReplicationCert");async function yee(){ia();let e=(await q_()).options.cert,r=new oo(e).issuer.match(/CN=(.*)/)?.[1];return Dr.get(r)}a(yee,"getReplicationCertAuth");var D0,sa=new Map;function G0(){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&&B0(fee(t,"keys"),o);c&&P0(o,l=>{sa.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&k0){let d;P0(u,_=>{if(I0.cert===_)return;let E=i.hostname??i.hostnames??i.host??i.hosts;E&&!Array.isArray(E)&&(E=[E]);let f=K0(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(I0.cert)))return;let m=Dr.primaryStore.get(T),g=x0(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=Dr.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(G0,"loadCertificates");function P0(e,t,r){let n,s=a((i,o)=>{try{let c=i.mtimeMs;c&&c!==n&&(o&&k0&&pt.warn(`Reloading ${r}:`,e),n=c,t(K0(e)))}catch(c){pt.error(`Error loading ${r}:`,e,c)}},"loadFile");pn.existsSync(e)?s(x0(e)):pt.error(`${r} file not found:`,e),gee(e,{persistent:!1},s)}a(P0,"loadAndWatch");function dy(){let e=mee();if(e==null){let t=G_[0];return pt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return H0(e)}a(dy,"getHost");function yp(){let e=bp();if(e==null){let t=G_[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 q_(),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:q0()}];return pt.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),lu.pki.certificationRequestToPem(n)}a(bee,"createCsr");function q0(){let e=G_.includes(yp())?G_:[...G_,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=>M0.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(q0,"certExtensions");async function Oee(e){let t={},r=sr.join(ds.getHdbBasePath(),_s.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;ia();for await(let d of Dr.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 Dr.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 q_();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(q0()),n.sign(e,lu.md.sha256.create()),yt.certificateToPem(n)}a(my,"generateCertificates");async function _y(){let e=await z0(),t;for(let r of e){if(!r.is_authority)continue;let n=await j0(r.private_key_name);if(r.private_key_name&&n&&new oo(r.certificate).checkPrivateKey(U0(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 $0(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-${ds.get(uu.REPLICATION_HOSTNAME)??H0(ds.get(uu.REPLICATION_URL))??v0().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(ds.getHdbBasePath(),_s.LICENSE_KEY_DIR_NAME),c=sr.join(o,Qs.PRIVATEKEY_PEM_NAME);return r&&await pn.writeFile(c,yt.privateKeyToPem(e)),n}a($0,"generateCertAuthority");async function Iee(){let{private_key:e,public_key:t}=await py(),r=await $0(e,t),n=await my(e,t,r);await Nee(n,r),V0()}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(ds.getHdbBasePath(),_s.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 Dr.search([{attribute:"is_self_signed",value:!0}]))await Dr.delete(e.name);await Sy()}a(Cee,"renewSelfSigned");async function Sy(){See(),await G0(),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=ds.get(uu.TLS_PRIVATEKEY),n=sr.join(ds.getHdbBasePath(),_s.LICENSE_KEY_DIR_NAME),s,i=B0(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${v0().split("-")[0]}.pem`),await pn.writeFile(sr.join(n,i),yt.privateKeyToPem(s))}let o=await $0(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 q_()){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 V0(){let e=Eee(Object.keys(_s.CONFIG_PARAM_MAP),!0),t=sr.join(ds.getHdbBasePath(),_s.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=_s.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(V0,"updateConfigCert");function K0(e){return e.startsWith("-----BEGIN")?e:Tee(e,"utf8")}a(K0,"readPEM");var L0=Ac.createSecureContext;Ac.createSecureContext=function(e){if(!e.cert||!e.key)return L0(e);let t={...e};delete t.key,delete t.cert;let r=L0(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var Y0=Ac.Server;Ac.Server=function(e,t){return e.ALPNCallback&&(e.ALPNProtocols=null),Y0.call(this,e,t)};Ac.Server.prototype=Y0.prototype;var Dee=F0.prototype._init;F0.prototype._init=function(e,t){Dee.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 W0(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 j0(_.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??Q0(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),M0.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||w0)&&(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||w0)&&(u=u.replicationContext):ra.info("No default certificate found"),c(null,u)}a(i,"SNICallback")}a(W0,"createTLSSelector");async function j0(e){let t=sa.get(e);return!t&&e?await pn.readFile(sr.join(ds.get(uu.ROOTPATH),_s.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(j0,"getPrivateKeyByName");async function z0(){ia();let e=[];for await(let t of Dr.search([]))e.push(t);return e}a(z0,"listCertificates");async function Pee(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(U0(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(ds.getHdbBasePath(),_s.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(Pee,"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 Dr.get(r);if(!n)throw new na(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Dr.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(ds.getHdbBasePath(),_s.LICENSE_KEY_DIR_NAME,s)))}return await Dr.delete(r),"Successfully removed "+r}a(Mee,"removeCertificate");function Ty(e){return e.subject.match(/CN=(.*)/)?.[1]}a(Ty,"extractCommonName");function Q0(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(Q0,"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 C0()).private_key;if(r===".jwtPublic")return(await C0()).public_key;if(sa.get(r))return sa.get(e.name);throw new na("Key not found")}a(Uee,"getKey")});var W_={};je(W_,{addAnalyticsListener:()=>Y_,recordAction:()=>mr,recordActionBinary:()=>qn,setAnalyticsEnabled:()=>vee});function vee(e){oB=e}function mr(e,t,r,n,s){if(!oB)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 Y_(e){lB.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 uB){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 dB()}let n=process.memoryUsage();t.push({metric:"memory",threadId:Rc.threadId,byThread:!0,...n});for(let s of lB)s(t);Ip=new Map,Rc.parentPort?Rc.parentPort.postMessage({type:cB,report:r}):EB({report:r})},aB).unref()}async function Hee(e,t=6e4){let r=Ry(),n=_B(),s=new Promise(T=>{let m=performance.now();setImmediate(()=>{let g=performance.now();g-m>5e3&&(0,$_.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,$_.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 dB()}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 uB){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-X0,active:h-Z0,taskQueueLatency:await s,time:E,...process.memoryUsage()};n.primaryStore.put(T,m,{append:!0}).then(g=>{g||n.primaryStore.put(T,m)})}X0=f,Z0=h}async function eB(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 tB||(tB=Et({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function _B(){return rB||(rB=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(){fB=!0;let e=(0,K_.get)(Ay.CONFIG_PARAMS.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await Hee(aB,e),await eB(Ry(),xee),await eB(_B(),kee)},Math.min(e/2,2147483647)).unref()}function EB(e,t){let r=e.report;r.threadId=t?.threadId||Rc.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(nB+=n.mean*n.count);r.totalBytesProcessed=nB,t&&(r.metrics.push({metric:"utilization",...t.performance.eventLoopUtilization(sB.get(t))}),sB.set(t,t.performance.eventLoopUtilization())),r.id=(0,Np.getNextMonotonicTime)(),Ry().primaryStore.put(r.id,r),fB||Fee(),Gee&&(hB=$ee(r))}async function $ee(e){if(await hB,!aa){let r=(0,V_.dirname)((0,$_.getLogFilePath)());try{aa=await(0,gy.open)((0,V_.join)(r,"analytics.log"),"r+")}catch{aa=await(0,gy.open)((0,V_.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,iB,$_,V_,gy,Np,K_,Ay,Ip,oB,Op,aB,cB,lB,uB,X0,Z0,dB,xee,kee,tB,rB,fB,nB,sB,Gee,hB,aa,qee,Ii=Ie(()=>{Rc=require("worker_threads"),iB=L(dt());De();$_=L(j()),V_=require("path"),gy=require("fs/promises"),Np=L(sn()),K_=L(se()),Ay=L(M());qr();(0,K_.initSync)();Ip=new Map,oB=(0,K_.get)(Ay.CONFIG_PARAMS.ANALYTICS_AGGREGATEPERIOD)>-1;a(vee,"setAnalyticsEnabled");a(mr,"recordAction");it.recordAnalytics=mr;a(qn,"recordActionBinary");Op=0,aB=1e3,cB="analytics-report",lB=[];a(Y_,"addAnalyticsListener");uB=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Bee,"sendAnalytics");a(Hee,"aggregation");X0=0,Z0=0,dB=a(()=>new Promise(setImmediate),"rest");a(eB,"cleanup");xee=36e5,kee=31536e6;a(Ry,"getRawAnalyticsTable");a(_B,"getAnalyticsTable");(0,iB.setChildListenerByType)(cB,EB);a(Fee,"startScheduledTasks");nB=0,sB=new Map,Gee=!1;a(EB,"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,LB.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,UB.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=MB.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+"-"+PB.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"),ss(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,NB).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())},NB*2).unref()}a(Oe,"resetPingTimer"),u&&Va(u);let Ne,Me,Gr=[],wd=[],ka,wn=[],Cd=[],Ol=[],Lw=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 mB:{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])),ss(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])),ss(1008,x.message);return}qa()}break}case bB:{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:ss();break;case AB: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:D,reject:O}=m.get(R.requestId);R.error?O(new Error(R.error)):D(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 SB:YE=_?e0(S,R,_):new Map,ka=A[2],fe.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${ka}`);break;case TB:let C=b;Ol[C]=R;break;case yB: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 RB:y=R,h.send({type:"end_txn",localTime:y,remoteNodeIds:g});break;case gB:{let x=R,q;try{let ee=A[3],G=wd[b]||(wd[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 pB:{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])),ss(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])),ss(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"),ui(9),ui(Pp),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 j_&&fe.trace?.(s,"skipping replication update",ce.recordId,"to:",S,"from:",rt,"subscribed:",Ae),Mw();j_&&fe.trace?.(s,"sending replication update",ce.recordId,"to:",S,"from:",rt,"subscribed:",Ae);let XT=ce.version;Ee.txnTime!==XT&&(Ee.txnTime&&(j_&&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 Mw();let Md=ce.recordId;fe.trace?.(s,"sending invalidation",Md,S,"from",rt);let rg=0;Ya&&(rg|=Ja),ce.previousResidencyId&&(rg|=Xa);let ng,zE=null;for(let Uw in Bt.indices){if(!zE){if(ng=ce.getValue(xo,!0),!ng)break;zE={}}zE[Uw]=ng[Uw]}jE=Pl(ce.version,Ze,Md,null,rt,ce.user,ce.type==="put"||ce.type==="patch"?"invalidate":ce.type,Yt.encode(zE),rg,Ya,ce.previousResidencyId,ce.expiresAt)}function Mw(){fe.trace?.(s,"skipping audit record",ce.recordId),Y||(Y=setTimeout(()=>{Y=null,(ge||0)+OB/2<K&&(j_&&fe.trace?.(s,"sending skipped sequence update",K),e.send((0,ct.encode)([RB,K])))},OB).unref())}a(Mw,"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&&!Cd[Ya]&&(e.send((0,ct.encode)([TB,ZT,Ya])),Cd[Ya]=!0),jE)ui(jE.length),Ld(jE);else{let Il=ce.encoded,Md=Il[0]===66?8:0;ui(Il.length-Md),Ld(Il,Md)}},"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=z_(Ye=>{Ye===u&&(e.send((0,ct.encode)([_u])),ss())}),e.on("close",()=>{Ne?.remove(),Me?.remove()})),e.send((0,ct.encode)([SB,M_(h.auditStore),vs.map(({name:Ye})=>Ye)]));let ce=!0;do{isFinite(K)||(fe.warn?.("Invalid sequence id "+K),ss(1008,"Invalid sequence id"+K));let Ye;if(ce&&!ee&&(ce=!1,!(Cy(_)<=K)&&wB.default.get(CB.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 c0(_)}while(!ee)}).catch(ce=>{fe.error?.(s,"Error handling subscription to node",ce),ss(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)==Pp){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 D;R.residencyId&&(D=Ol[R.residencyId],fe.trace?.(s,"received residency list",D,R.type,R.recordId));try{v={table:b.name,id:R.recordId,type:R.type,nodeId:YE.get(R.nodeId),residencyList:D,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,j_&&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>Lw&&!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)([yB,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 ss(ie,Se){e.isFinished=!0,e.close(ie,Se)}a(ss,"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,D=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:",D),Se!==v){D>5e3&&(D-=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&&(D=k.seqId,fe.debug?.("Using sequence id from proxy node",Se.name,D))}return g.push(R),ie.get(R)>D&&(D=ie.get(R),fe.debug?.("Updating start time from more recent txn recorded",Se.name,D)),{name:v.name,replicateByDefault:w,tables:A,startTime:D,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)([pB,tt]));else{let v=a(()=>{let p=performance.now();ne=setTimeout(()=>{Q<=p?ss(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 Dd(Se,ie),!0}a(Va,"setDatabase");function Dd(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)([mB,ie,Se,v]))}a(Dd,"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)([bB,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=[gB,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)([AB,ie])),new Promise((tt,v)=>{m.set(Se,{resolve:tt,reject:v})})}};function ui(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 Ld(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 wB,CB,ct,DB,PB,fe,Ny,LB,MB,Iy,UB,pB,mB,SB,_u,TB,yy,gB,wp,AB,Cp,RB,yB,bB,vB,yc,j_,OB,Vee,NB,by,IB,Dp,BB=Ie(()=>{De();ji();YR();JR();ls();wB=L(se()),CB=L(M());Ll();ct=require("msgpackr"),DB=require("ws"),PB=require("worker_threads"),fe=L(Sc());H_();Ny=require("events"),LB=L(Js()),MB=L(require("node:tls"));su();Iy=L(require("node:process")),UB=require("node:net");Ii();pB=129,mB=140,SB=141,_u=142,TB=130,yy=132,gB=133,wp=134,AB=136,Cp=137,RB=143,yB=144,bB=145,vB=new Map,yc=new Map,j_=!0,OB=300,Vee=2,NB=3e4;a(wy,"createWebSocket");IB=1e3,Dp=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=IB;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=IB,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:()=>U_,monitorNodeCAs:()=>VB,replicateOperation:()=>ete,replication_certificate_authorities:()=>bc,sendOperationToNode:()=>J_,servers:()=>Yee,setReplicator:()=>YB,start:()=>Wee,startOnMainThread:()=>ZR,subscribeToNode:()=>ou,unsubscribeFromNode:()=>Tp,urlToNodeName:()=>js});function Wee(e){if(e.port||(e.port=Es.default.get(Ic.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=Es.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 B_(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),VB(s),Es.default.get(Ic.CONFIG_PARAMS.REPLICATION_ENABLEROOTCAS)!==!1&&s()}}function VB(e){let t=0;nu(r=>{r?.ca&&(bc.add(r.ca),bc.size!==t&&(t=bc.size,e?.()))})}function jee(e=!0){$B=e}function zee(e){$B||(ut(),ca=e.databases,Zo(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||yc;for(let[s,i]of Q_){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];YB(r,s,e),vB.get(s)?.forEach(i=>i(s))}}))}function YB(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 KB extends Pr{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 Pn,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,KB.subscription,e);f?.isConnected&&!u.has(f)&&(!d||f.latency<d.latency)&&(d=f)}if(!d)throw l||new GB.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 WB(e,t,r,n,s){let i=Q_.get(e);i||Q_.set(e,i=new Map);let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new Dp(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function Qee(e,t,r){let n=HB.get(e)?.get(r);if(n)return n;let s=pr().primaryStore.get(e);return s?.url&&(n=WB(s.url,t,r,e,s.authorization),HB.set(e,Q_.get(s.url))),n}async function J_(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{qB.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=WB(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=>v_(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=Q_.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Jee(){if(Dy!==void 0)return Dy;let e=Es.default.get(Ic.CONFIG_PARAMS.OPERATIONSAPI_TLS_CERTIFICATE)||Es.default.get(Ic.CONFIG_PARAMS.TLS_CERTIFICATE);if(e)return Dy=new kB.X509Certificate((0,FB.readFileSync)(e)).subject.match(/CN=(.*)/)?.[1]??null}function ot(){return vp||(vp=Es.default.get("replication_hostname")??js(Es.default.get("replication_url"))??Jee()??xB("operationsapi_network_secureport")??xB("operationsapi_network_port")??"127.0.0.1")}function Xee(){vp=void 0}function xB(e){let t=Es.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function Up(e){let t=Es.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function Mp(e){return M_(e)?.[ot()]}function ea(){let e=Es.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 z_(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 U_(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=>J_(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 Es,Sr,kB,FB,Ic,Bp,GB,qB,$B,Kee,Yee,bc,ca,Q_,HB,Dy,vp,ls=Ie(()=>{De();Vs();Cl();BB();qr();Es=L(se()),Sr=L(j()),kB=require("crypto"),FB=require("fs");H_();su();Ic=L(M());YR();Bp=L(require("node:tls")),GB=L(_e()),qB=require("worker_threads"),Kee=1,Yee=[],bc=Es.default.get(Ic.CONFIG_PARAMS.REPLICATION_ENABLEROOTCAS)!==!1?new Set(Bp.rootCertificates):new Set;a(Wee,"start");a(VB,"monitorNodeCAs");a(jee,"disableReplication");a(zee,"assignReplicationSource");a(YB,"setReplicator");Q_=new Map;a(WB,"getConnection");HB=new Map;a(Qee,"getConnectionByName");a(J_,"sendOperationToNode");a(ou,"subscribeToNode");a(Tp,"unsubscribeFromNode");a(Jee,"getCommonNameFromCert");a(ot,"getThisNodeName");a(Xee,"clearThisNodeName");Object.defineProperty(it,"hostname",{get(){return ot()}});a(xB,"getHostFromListeningPort");a(Up,"getPortFromListeningPort");a(Mp,"getThisNodeId");it.replication={getThisNodeId:Mp,exportIdMapping:M_};a(ea,"getThisNodeUrl");a(Hp,"hostnameToUrl");a(js,"urlToNodeName");a(Zo,"forEachReplicatedDatabase");a(Zee,"hasExplicitlyReplicatedTable");a(U_,"lastTimeInAuditStore");a(ete,"replicateOperation")});var Gp=N((kNe,XB)=>{"use strict";var fu=Oh(),Eu=Xv(),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(),jB=Tr(),{getDatabases:ite}=(De(),oe(lt)),{transformReq:pu}=re(),{replicateOperation:zB}=(ls(),oe(oa));XB.exports={createSchema:ote,createSchemaStructure:QB,createTable:ate,createTableStructure:JB,createAttribute:_te,dropSchema:cte,dropTable:lte,dropAttribute:ute,getBackup:fte};async function ote(e){let t=await QB(e);return kp.signalSchemaChange(new Fp(process.pid,e.operation,e.schema)),t}a(ote,"createSchema");async function QB(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(QB,"createSchemaStructure");async function ate(e){return pu(e),e.hash_attribute=e.primary_key??e.hash_attribute,await JB(e)}a(ate,"createTable");async function JB(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(JB,"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 jB.purgeSchemaTableStreams(e.schema,o);let c=await zB(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 jB.purgeTableStream(e.schema,e.table);let n=await zB(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 eH=N((GNe,ZB)=>{"use strict";var{OPERATIONS_ENUM:Ete}=M(),Py=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}};ZB.exports=Py});var Ly=N((VNe,iH)=>{"use strict";var hte=Un(),$Ne=eH(),qp=re(),$p=M(),pte=se(),{handleHDBError:tH,hdb_errors:mte}=_e(),{HDB_ERROR_MSGS:rH,HTTP_STATUS_CODES:nH}=mte,Ste=Object.values($p.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),sH="To use this operation audit log must be enabled in harperdb-config.yaml";iH.exports=Tte;async function Tte(e){if(qp.isEmpty(e.schema))throw new Error(rH.SCHEMA_REQUIRED_ERR);if(qp.isEmpty(e.table))throw new Error(rH.TABLE_REQUIRED_ERR);if(!pte.get($p.CONFIG_PARAMS.LOGGING_AUDITLOG))throw tH(new Error,sH,nH.BAD_REQUEST,$p.LOG_LEVELS.ERROR,sH,!0);let t=qp.checkSchemaTableExist(e.schema,e.table);if(t)throw tH(new Error,t,nH.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 aH=N((YNe,oH)=>{"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}};oH.exports=My});var uH=N((QNe,lH)=>{"use strict";var Ate=Un(),jNe=aH(),Uy=re(),Rte=M(),zNe=se(),{handleHDBError:yte,hdb_errors:bte}=_e(),{HDB_ERROR_MSGS:cH,HTTP_STATUS_CODES:Ote}=bte;lH.exports=Nte;async function Nte(e){if(Uy.isEmpty(e.schema))throw new Error(cH.SCHEMA_REQUIRED_ERR);if(Uy.isEmpty(e.table))throw new Error(cH.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 pH=N((XNe,hH)=>{var mu=require("validate.js"),_H=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"),Dte={STRUCTURE_USER:"structure_user"},dH=Object.values(Su.ROLE_TYPES_ENUM),Pte="attribute_permissions",Lte="attribute_name",{PERMS_CRUD_ENUM:Tu}=Su,Mte=[Pte,...Object.values(Tu)],fH=[Tu.READ,Tu.INSERT,Tu.UPDATE],Ute=[Lte,...fH];function vte(e){let t=vy();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,EH(e,t)}a(vte,"addRoleValidation");function Bte(e){let t=vy();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,EH(e,t)}a(Bte,"alterRoleValidation");function Hte(e){let t=vy();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,_H.validateObject(e,t)}a(Hte,"dropRoleValidation");var xte=["operation","role","id","permission","hdb_user","hdb_auth_header","access"];function EH(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=_H.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{ir(o,r)}),e.permission){let o=kte(e);o&&ir(o,r),dH.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(dH.indexOf(o)<0){if(o===Dte.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}fH.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(EH,"customValidate");hH.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 Z_=N((tIe,gH)=>{"use strict";var mH=cn(),SH=$r(),Gte=oc(),Hy=pH(),xy=eo(),eIe=require("uuid").v4,qte=require("util"),Vp=M(),$te=re(),ky=SH.searchByValue,Vte=SH.searchByHash,Kte=qte.promisify(Gte.delete),Yte=$s(),Wte=Wl(),{hdb_errors:jte,handleHDBError:wc}=_e(),{HDB_ERROR_MSGS:TH,HTTP_STATUS_CODES:X_}=jte,{UserEventMsg:Fy}=qs();gH.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,TH.ROLE_ALREADY_EXISTS(e.role),X_.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 mH.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 mH.update(r)}catch(s){throw wc(s)}if(n&&n?.message==="updated 0 of 1 records")throw wc(new Error,"Invalid role id",X_.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,X_.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,TH.ROLE_NOT_FOUND,X_.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`,X_.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 bH=N((nIe,yH)=>{"use strict";var Zte=se(),ua=require("joi"),ere=gt(),AH=require("moment"),tre=require("fs-extra"),Gy=require("path"),rre=require("lodash"),ef=M(),{LOG_LEVELS:Cc}=M(),nre="YYYY-MM-DD hh:mm:ss",sre=Gy.resolve(__dirname,"../logs");yH.exports=function(e){return ere.validateBySchema(e,ire)};var ire=ua.object({from:ua.custom(RH),until:ua.custom(RH),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 RH(e,t){if(AH(e,AH.ISO_8601).format(nre)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(RH,"validateDatetime");function ore(e,t){if(rre.invert(ef.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Zte.get(ef.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?ef.LOG_NAMES.HDB:e,i=s===ef.LOG_NAMES.INSTALL?Gy.join(sre,ef.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,NH)=>{"use strict";var Kp=M(),are=j(),cre=se(),lre=bH(),qy=require("path"),OH=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;NH.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(OH.statSync(s).size-(h+5)*pre,0));let m=OH.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:IH,date:gre}=Vy.types(),Are=gt(),{validateSchemaExists:aIe,validateTableExists:cIe,validateSchemaName:lIe}=mi(),Rre=M(),yre=It(),wH=se();wH.initSync();var uIe=gu.invalid(wH.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),CH={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:IH.required(),publish:IH.required().custom(Ore),start_time:gre.iso()})};function bre(e){return Are.validateBySchema(e,Vy.object(CH))}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:CH}});var LH=N((fIe,PH)=>{var Nre=gt(),Ire={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};PH.exports=function(e){return Nre.validateObject(e,Ire)}});var Ky=N((hIe,vH)=>{"use strict";var wre=LH(),Au=require("passport"),Cre=require("passport-local").Strategy,Dre=require("passport-http").BasicStrategy,Pre=require("util"),Lre=xn(),UH=Pre.callbackify(Lre.findAndValidateUser),EIe=Dn(),Mre=M(),MH=cu();Au.use(new Cre(function(e,t,r){UH(e,t,r)}));Au.use(new Dre(function(e,t,r){UH(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?MH.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):MH.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");vH.exports={authorize:Ure,checkPermissions:vre}});var Ru=N((mIe,BH)=>{"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}};BH.exports={Node:Yy,NodeSubscription:Wy}});var xH=N((TIe,HH)=>{"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}};HH.exports=jy});var tf=N((AIe,kH)=>{"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)}};kH.exports={RemotePayloadObject:zy,RemotePayloadSubscription:Qy}});var GH=N((yIe,FH)=>{"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}};FH.exports=Jy});var $H=N((CIe,qH)=>{"use strict";var Hre=GH(),OIe=Ht(),NIe=ht(),xre=j(),{getSchemaPath:IIe,getTransactionAuditStorePath:wIe}=Tt(),{getDatabases:kre}=(De(),oe(lt));qH.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 KH=N((PIe,VH)=>{"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}};VH.exports=Xy});var bu=N((HIe,zH)=>{"use strict";var Gre=require("fs-extra"),qre=require("path"),jr=require("systeminformation"),_a=j(),YH=Tr(),MIe=It(),yu=M(),$re=$H(),Vre=Zi(),{getThreadInfo:WH}=dt(),rf=se();rf.initSync();var Kre=KH(),{openEnvironment:UIe}=ht(),{getSchemaPath:vIe}=Tt(),{database:BIe,databases:Zy}=(De(),oe(lt)),Wp;zH.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(rf.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(!rf.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 rf.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 jH(){if(rf.get(yu.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await YH.getNATSReferences(),t=await YH.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(jH,"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 WH(),t.replication=await jH(),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 WH();break;case"replication":t.replication=await jH();break;default:break}return t}a(Yre,"systemInformation")});var Ou=N((kIe,Wre)=>{Wre.exports={name:"harperdb",version:"4.4.20",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","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 Dc=N((FIe,QH)=>{"use strict";QH.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,ex)=>{"use strict";var Qre=cn(),lb=re(),Jre=require("util"),Pc=M(),JH=se();JH.initSync();var Xre=Ky(),XH=$r(),{Node:qIe,NodeSubscription:$Ie}=Ru(),Zre=Wl(),ene=xH(),{RemotePayloadObject:tne,RemotePayloadSubscription:rne}=tf(),{handleHDBError:nne,hdb_errors:sne}=_e(),{HTTP_STATUS_CODES:ine,HDB_ERROR_MSGS:one}=sne,ane=$s(),cne=bu(),lne=Dc(),{getDatabases:une}=(De(),oe(lt)),dne=Jre.promisify(Xre.authorize),_ne=XH.searchByHash,fne=XH.searchByValue;ex.exports={authHeaderToUser:Ene,isEmpty:hne,getNodeRecord:pne,upsertNodeRecord:mne,buildNodePayloads:Sne,checkClusteringEnabled:Tne,getAllNodeRecords:gne,getSystemInfo:Ane,reverseSubscription:ZH};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(Pc.SYSTEM_SCHEMA_NAME,Pc.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return _ne(t)}a(pne,"getNodeRecord");async function mne(e){let t=new ene(Pc.SYSTEM_SCHEMA_NAME,Pc.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Qre.upsert(t)}a(mne,"upsertNodeRecord");function ZH(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(ZH,"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}=ZH(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(!JH.get(Pc.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(Pc.SYSTEM_SCHEMA_NAME,Pc.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,cx)=>{"use strict";var zp=Tr(),tx=re(),rx=It(),nx=M(),Qp=j(),sx=Gp(),Rne=O_(),{RemotePayloadObject:yne}=tf(),{handleHDBError:ix,hdb_errors:bne}=_e(),{HTTP_STATUS_CODES:ox}=bne,{NodeSubscription:ax}=Ru();cx.exports=One;async function One(e,t){let r;try{r=await zp.request(`${t}.${rx.REQUEST_SUFFIX}`,new yne(nx.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 ix(new Error,c,ox.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===rx.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw ix(new Error,o,ox.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===nx.SYSTEM_SCHEMA_NAME){await zp.createLocalTableStream(l,c);let h=new ax(l,c,o.publish,o.subscribe);h.start_time=o.start_time,i.push(h);continue}let u=tx.doesSchemaExist(l),d=n[l]!==void 0,_=c?tx.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 sx.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 sx.createTable(h)}await zp.createLocalTableStream(l,c);let f=new ax(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:()=>Dne,removeNodeBack:()=>Pne,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,ux.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 J_({url:T.url},{operation:nf.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,hs.getReplicationCert)();let f=await(0,hs.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,hs.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:nf.OPERATIONS_ENUM.ADD_NODE_BACK,hostname:(0,dx.get)(nf.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(lx):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let f=lx(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 J_({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,hs.setCertTable)({name:Nne.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,hs.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 Dne(e){$n.trace("addNodeBack received request:",e);let t=await(0,hs.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,hs.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 Pne(e){$n.trace("removeNodeBack received request:",e),await pr().delete(e.name)}function lx(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var hs,ux,Nu,dx,nf,$n,co,Nne,Ine,wne,Mc=Ie(()=>{hs=L(Js()),ux=L(gt()),Nu=L(require("joi")),dx=L(se()),nf=L(M());H_();su();ls();$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(Dne,"addNodeBack");a(Pne,"removeNodeBack");a(lx,"reverseSubscription")});var tm=N((ewe,fx)=>{"use strict";var{handleHDBError:Jp,hdb_errors:Lne}=_e(),{HTTP_STATUS_CODES:Xp}=Lne,{addUpdateNodeValidator:Mne}=Yp(),Zp=j(),em=M(),_x=It(),Une=re(),sf=Tr(),of=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);fx.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);of.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 of.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=of.buildNodePayloads(s,qne,em.OPERATIONS_ENUM.ADD_NODE,await of.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 sf.request(`${n}.${_x.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 sf.updateRemoteConsumer(T,n)}let E=sf.requestErrorHandler(_,"add_node",n);throw Jp(new Error,E,Xp.INTERNAL_SERVER_ERROR,"error",E)}if(u.status===_x.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 sf.updateRemoteConsumer(f,n),f.subscribe===!0&&await sf.updateConsumerIterator(f.schema,f.table,n,"start")}let d=new Bne(n,l,u.system_info);return await of.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,hx)=>{"use strict";var{handleHDBError:_b,hdb_errors:Vne}=_e(),{HTTP_STATUS_CODES:fb}=Vne,{addUpdateNodeValidator:Kne}=Yp(),af=j(),rm=M(),Ex=It(),rwe=re(),cf=Tr(),lf=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);hx.exports=tse;async function tse(e){if(af.trace("updateNode called with:",e),Eb.get(rm.CONFIG_PARAMS.REPLICATION_URL)??Eb.get(rm.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Jne(e);lf.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 lf.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=lf.buildNodePayloads(i,ese,rm.OPERATIONS_ENUM.UPDATE_NODE,await lf.getSystemInfo());for(let d=0,_=i.length;d<_;d++){let E=i[d];af.trace(`updateNode updating work stream for node: ${r} subscription:`,E),i[d].start_time===void 0&&delete i[d].start_time}af.trace("updateNode sending remote payload:",l);let u;try{u=await cf.request(`${r}.${Ex.REQUEST_SUFFIX}`,l)}catch(d){af.error(`updateNode received error from request: ${d}`);let _=cf.requestErrorHandler(d,"update_node",r);throw _b(new Error,_,fb.INTERNAL_SERVER_ERROR,"error",_)}if(u.status===Ex.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)}af.trace(u);for(let d=0,_=i.length;d<_;d++){let E=i[d];await cf.updateRemoteConsumer(E,r),E.subscribe===!0?await cf.updateConsumerIterator(E.schema,E.table,r,"start"):await cf.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 lf.upsertNodeRecord(n),Qne({type:"nats_update"})}a(rse,"updateNodeTable")});var gx=N((iwe,Tx)=>{"use strict";var Sx=require("joi"),{string:px}=Sx.types(),nse=gt(),mx=M(),sse=se(),ise=It();Tx.exports=ose;function ose(e){let t=px.invalid(sse.get(mx.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=Sx.object({operation:px.valid(mx.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return nse.validateBySchema(e,r)}a(ose,"removeNodeValidator")});var nm=N((awe,Ox)=>{"use strict";var{handleHDBError:Ax,hdb_errors:ase}=_e(),{HTTP_STATUS_CODES:Rx}=ase,cse=gx(),uf=j(),yx=ao(),lse=re(),Iu=M(),bx=It(),pb=Tr(),mb=se(),{RemotePayloadObject:use}=tf(),{NodeSubscription:dse}=Ru(),_se=b_(),fse=oc(),{broadcast:Ese}=dt(),{setNode:hse}=(Mc(),oe(Lc)),pse=mb.get(Iu.CONFIG_PARAMS.CLUSTERING_NODENAME);Ox.exports=mse;async function mse(e){if(uf.trace("removeNode called with:",e),mb.get(Iu.CONFIG_PARAMS.REPLICATION_URL)??mb.get(Iu.CONFIG_PARAMS.REPLICATION_HOSTNAME))return hse(e);yx.checkClusteringEnabled();let t=cse(e);if(t)throw Ax(t,t.message,Rx.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await yx.getNodeRecord(r);if(lse.isEmptyOrZeroLength(n))throw Ax(new Error,`Node '${r}' was not found.`,Rx.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(_){uf.error(_)}}try{i=await pb.request(`${r}.${bx.REQUEST_SUFFIX}`,s),uf.trace("Remove node reply from remote node:",r,i)}catch(l){uf.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===bx.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(uf.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 wx=N((lwe,Ix)=>{"use strict";var Nx=require("joi"),{string:Sse,array:Tse}=Nx.types(),gse=gt(),Ase=Yp();Ix.exports=Rse;function Rse(e){let t=Nx.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,Mx)=>{"use strict";var Cx=M(),sm=j(),yse=re(),bse=se(),Ose=nm(),Nse=tm(),Ise=ao(),wse=wx(),{handleHDBError:Dx,hdb_errors:Cse}=_e(),{HTTP_STATUS_CODES:Px}=Cse,Dse="Configure cluster complete.",Pse="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.";Mx.exports=Mse;async function Mse(e){sm.trace("configure cluster called with:",e);let t=wse(e);if(t)throw Dx(t,t.message,Px.BAD_REQUEST,void 0,void 0,!0);let r=await Ise.getAllNodeRecords(),n=[];if(bse.get(Cx.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,_=r.length;d<_;d++){let E=await Lx(Ose,{operation:Cx.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 Lx(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:Dse,connections:c};if(l)return{message:Lse,failed_nodes:o,connections:c};throw Dx(new Error,Pse,Px.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(Mse,"configureCluster");async function Lx(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(Lx,"functionWrapper")});var Hx=N((fwe,Bx)=>{"use strict";var df=require("joi"),Use=gt(),{validateSchemaExists:Ux,validateTableExists:vse,validateSchemaName:vx}=mi(),Bse=df.object({operation:df.string().valid("purge_stream"),schema:df.string().custom(Ux).custom(vx).optional(),database:df.string().custom(Ux).custom(vx).optional(),table:df.string().custom(vse).required()});function Hse(e){return Use.validateBySchema(e,Bse)}a(Hse,"purgeStreamValidator");Bx.exports=Hse});var Tb=N((hwe,xx)=>{"use strict";var{handleHDBError:xse,hdb_errors:kse}=_e(),{HTTP_STATUS_CODES:Fse}=kse,Gse=Hx(),qse=Tr(),$se=ao();xx.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,Kx)=>{"use strict";var Ab=ao(),Kse=Tr(),im=se(),wu=M(),Uc=It(),Yse=re(),gb=j(),{RemotePayloadObject:Wse}=tf(),{ErrorCode:kx}=require("nats"),{parentPort:Fx}=require("worker_threads"),{onMessageByType:jse}=dt(),{getThisNodeName:zse}=(ls(),oe(oa)),{requestClusterStatus:Qse}=(H_(),oe(T0)),Gx=im.get(wu.CONFIG_PARAMS.CLUSTERING_ENABLED),qx=im.get(wu.CONFIG_PARAMS.CLUSTERING_NODENAME);Kx.exports={clusterStatus:Jse,buildNodeStatus:Vx};var $x;jse("cluster-status",async e=>{$x(e)});async function Jse(){if(im.get(wu.CONFIG_PARAMS.REPLICATION_URL)||im.get(wu.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;return Fx?(Fx.postMessage({type:"request-cluster-status"}),n=await new Promise(s=>{$x=s})):n=Qse(),n.node_name=zse(),n.is_enabled=!0,n}let e={node_name:qx,is_enabled:Gx,connections:[]};if(!Gx)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(Vx(t[n],e.connections));return await Promise.allSettled(r),e}a(Jse,"clusterStatus");async function Vx(e,t){let r=e.name,n=new Wse(wu.OPERATIONS_ENUM.CLUSTER_STATUS,qx,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===kx.NoResponders?o=Uc.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===kx.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(Vx,"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,Yx)=>{"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()});Yx.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 Qx=N((Awe,zx)=>{"use strict";var Ob=require("joi"),Wx=gt(),{route_constraints:jx}=NA();zx.exports={setRoutesValidator:cie,deleteRoutesValidator:lie};function cie(e){let t=Ob.object({server:Ob.valid("hub","leaf"),routes:jx.required()});return Wx.validateBySchema(e,t)}a(cie,"setRoutesValidator");function lie(e){let t=Ob.object({routes:jx.required()});return Wx.validateBySchema(e,t)}a(lie,"deleteRoutesValidator")});var am=N((ywe,nk)=>{"use strict";var lo=Ct(),Nb=re(),ps=M(),Cu=se(),Jx=Qx(),{handleHDBError:Xx,hdb_errors:uie}=_e(),{HTTP_STATUS_CODES:Zx}=uie,ek="cluster routes successfully set",tk="cluster routes successfully deleted";nk.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(ps.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):lo.updateConfigValue(ps.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:ek,set:i,skipped:s}}a(die,"setRoutesNats");function _ie(e){let t=Jx.setRoutesValidator(e);if(t)throw Xx(t,t.message,Zx.BAD_REQUEST,void 0,void 0,!0);if(Cu.get(ps.CONFIG_PARAMS.CLUSTERING_ENABLED))return die(e);let r=[],n=[],s=Cu.get(ps.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{rk(s,i)?n.push(i):(s.push(i),r.push(i))}),lo.updateConfigValue(ps.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:ek,set:r,skipped:n}}a(_ie,"setRoutes");function rk(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(rk,"existsInArray");function fie(){if(Cu.get(ps.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=lo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Cu.get(ps.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(fie,"getRoutes");function Eie(e){let t=Jx.deleteRoutesValidator(e);if(t)throw Xx(t,t.message,Zx.BAD_REQUEST,void 0,void 0,!0);if(Cu.get(ps.CONFIG_PARAMS.CLUSTERING_ENABLED))return hie(e);let r=[],n=[],s=Cu.get(ps.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{rk(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),lo.updateConfigValue(ps.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:tk,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(ps.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=Nb.isEmptyOrZeroLength(n)?null:n,lo.updateConfigValue(ps.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:tk,deleted:s,skipped:i}}a(hie,"deleteRoutesNats")});var ik=N((Owe,sk)=>{"use strict";var _f=require("alasql"),vc=require("recursive-iterator"),Xs=j(),pie=re(),ff=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=>ff.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=>!ff.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][ff.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=>!ff.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new _f.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[ff.PERMS_CRUD_ENUM.READ])}a(mie,"filterReadRestrictedAttrs");function Sie(e,t,r,n,s){Tie(e,t,r,n,s)}a(Sie,"interpretAST");function Ef(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(Ef,"addSchemaTableToMap");function Tie(e,t,r,n,s){if(!e){Xs.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof _f.yy.Insert?yie(e,t,r):e instanceof _f.yy.Select?gie(e,t,r,n,s):e instanceof _f.yy.Update?Aie(e,t,r):e instanceof _f.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=>{Ef(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),Ef(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;Ef(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;Ef(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;Ef(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");sk.exports=Ib});var Pb=N((Iwe,lk)=>{var cm=uc(),ok=require("chalk"),Vn=j(),ak=require("prompt"),{promisify:bie}=require("util"),Cb=M(),Oie=require("fs-extra"),Nie=require("path"),Iie=re(),wie=Dc(),ck=se();ck.initSync();var Cie=require("moment"),Die=bie(ak.get),Pie=Nie.join(ck.getHdbBasePath(),Cb.LICENSE_KEY_DIR_NAME,Cb.LICENSE_FILE_NAME,Cb.LICENSE_FILE_NAME);lk.exports={getFingerprint:Mie,setLicense:Lie,parseLicense:Db,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 Db(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 Db(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(Pie,JSON.stringify({license_key:e,company:t}))}catch(n){throw Vn.error("Failed to write License"),n}return"Registration successful."}a(Db,"parseLicense");async function Uie(){let e=await vie();return Db(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Uie,"register");async function vie(){let e=await cm.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:ok.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:ok.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{ak.start()}catch(n){Vn.error(n)}let r;try{r=await Die(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 dk=N((Cwe,uk)=>{"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"}};uk.exports=Lb});var Ek=N((Pwe,fk)=>{"use strict";var _k=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+_k.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+_k.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"}};fk.exports=Mb});var pk=N((Mwe,hk)=>{"use strict";var Ub=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};hk.exports=Ub});var Sk=N((vwe,mk)=>{"use strict";var xie=It(),vb=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+xie.SERVER_SUFFIX.ADMIN,this.password=r}};mk.exports=vb});var _m=N((Hwe,Ak)=>{"use strict";var Bc=require("path"),Hc=require("fs-extra"),kie=dk(),Fie=Ek(),Gie=pk(),qie=Sk(),Bb=xn(),Pu=re(),Tn=Ct(),um=M(),hf=It(),{CONFIG_PARAMS:Jt}=um,Lu=j(),pf=se(),Tk=Xi(),Hb=Tr(),$ie=Js(),Du="clustering",Vie=1e4,gk=50;Ak.exports={generateNatsConfig:Yie,removeNatsConfig:Wie,getHubConfigPath:Kie};function Kie(){let e=pf.get(Jt.ROOTPATH);return Bc.join(e,Du,hf.NATS_CONFIG_FILES.HUB_SERVER)}a(Kie,"getHubConfigPath");async function Yie(e=!1,t=void 0){let r=pf.get(Jt.ROOTPATH);Hc.ensureDirSync(Bc.join(r,"clustering","leaf")),pf.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,Du,hf.PID_FILES.HUB),c=Bc.join(r,Du,hf.PID_FILES.LEAF),l=Tn.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=Bc.join(r,Du,hf.NATS_CONFIG_FILES.HUB_SERVER),d=Bc.join(r,Du,hf.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();(Pu.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,Tk.decrypt(Q.hash))),y.push(new Gie(Q.username,Tk.decrypt(Q.hash))));let I=[],{hub_routes:U}=Tn.getClusteringRoutes();if(!Pu.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=Pu.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=pf.get(e);return Pu.isEmpty(t)&&dm(`port undefined for '${e}'`),await Pu.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<gk;){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>=gk)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 Pu.async_set_timeout(u)}let c="0".repeat(Vie),l=Bc.join(pf.get(Jt.ROOTPATH),Du,r);await Hc.writeFile(l,c),await Hc.remove(l),Lu.notify(e,"started.")}a(Wie,"removeNatsConfig")});var Ik=N((kwe,Nk)=>{"use strict";var Kn=se(),jie=uc(),Ge=M(),mf=It(),uo=require("path"),{PACKAGE_ROOT:Em}=M(),Rk=se(),fm=re(),Mu="/dev/null",zie=uo.join(Em,"launchServiceScripts"),yk=uo.join(Em,"utility/scripts"),Qie=uo.join(yk,Ge.HDB_RESTART_SCRIPT),bk=uo.resolve(Em,"dependencies",`${process.platform}-${process.arch}`,mf.NATS_BINARY_NAME);function Ok(){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(Ok,"generateMainServerConfig");var Jie=9930;function Xie(){Kn.initSync(!0);let e=Kn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=uo.join(e,"clustering",mf.NATS_CONFIG_FILES.HUB_SERVER),r=uo.join(Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=Rk.get(Ge.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=mf.LOG_LEVEL_FLAGS[Kn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Jie?"-"+n:""),script:bk,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",mf.NATS_CONFIG_FILES.LEAF_SERVER),r=uo.join(Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=Rk.get(Ge.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=mf.LOG_LEVEL_FLAGS[Kn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Zie?"-"+n:""),script:bk,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:yk},script:Qie}}a(roe,"generateRestart");function noe(){return{apps:[Ok()]}}a(noe,"generateAllServiceConfigs");Nk.exports={generateAllServiceConfigs:noe,generateMainServerConfig:Ok,generateRestart:roe,generateNatsHubServerConfig:Xie,generateNatsLeafServerConfig:eoe,generateClusteringUpgradeV4ServiceConfig:toe}});var Tf=N((qwe,Gk)=>{"use strict";var at=M(),soe=re(),fo=_m(),hm=Tr(),_o=It(),fa=Ik(),pm=se(),xc=j(),ioe=ao(),{startWorker:wk,onMessageFromWorkers:ooe}=dt(),aoe=bu(),Gwe=require("util"),coe=require("child_process"),loe=require("fs"),{execFile:uoe}=coe,Qe;Gk.exports={enterPM2Mode:doe,start:Ea,stop:xb,reload:Dk,restart:Pk,list:kb,describe:Uk,connect:Eo,kill:poe,startAllServices:moe,startService:Fb,getUniqueServicesList:vk,restartAllServices:Soe,isServiceRegistered:Bk,reloadStopStart:Hk,restartHdb:Mk,deleteProcess:Eoe,startClusteringProcesses:kk,startClusteringThreads:Fk,isHdbRestartRunning:hoe,isClusteringRunning:goe,stopClustering:Toe,reloadClustering:Aoe,expectedRestartOfChildren:Lk};var Sf=!1;ooe(e=>{e.type==="restart"&&pm.initSync(!0)});function doe(){Sf=!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,Ck;function Ea(e,t=!1){if(Sf)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),!Ck&&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(()=>{Ck=!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(!Sf){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 Pk(e){if(!Sf){Lk();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(Pk,"restart");function Lk(){for(let e of zr||[])e.config&&(e.config.restarts=0)}a(Lk,"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 Mk(){await Ea(fa.generateRestart())}a(Mk,"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 Uk(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(Uk,"describe");function poe(){if(!Sf){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 kk(),await Fk(),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 vk(){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(vk,"getUniqueServicesList");async function Soe(e=[]){try{let t=!1,r=await vk();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 Pk(o))}t&&await Hk(at.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Qe?.disconnect(),t}}a(Soe,"restartAllServices");async function Bk(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(Bk,"isServiceRegistered");async function Hk(e){let t=pm.get(at.CONFIG_PARAMS.THREADS_COUNT)??pm.get(at.CONFIG_PARAMS.THREADS),r=await Uk(e),n=soe.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await xb(e),await Fb(e)):e===at.PROCESS_DESCRIPTORS.HDB?await Mk():await Dk(e)}a(Hk,"reloadStopStart");var xk;async function kk(e=!1){for(let t in at.CLUSTERING_PROCESSES){let r=at.CLUSTERING_PROCESSES[t];await Fb(r,e)}}a(kk,"startClusteringProcesses");async function Fk(){xk=wk(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"),wk(at.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(Fk,"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 xk.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 Bk(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:()=>Wk});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 qk(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 Wk(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 qk(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,iB,$_,V_,gy,Np,K_,Ay,Ip,oB,Op,aB,cB,lB,uB,X0,Z0,dB,xee,kee,tB,rB,fB,nB,sB,Gee,hB,aa,qee,Ii=Ie(()=>{Rc=require("worker_threads"),iB=L(dt());De();$_=L(j()),V_=require("path"),gy=require("fs/promises"),Np=L(sn()),K_=L(se()),Ay=L(M());qr();(0,K_.initSync)();Ip=new Map,oB=(0,K_.get)(Ay.CONFIG_PARAMS.ANALYTICS_AGGREGATEPERIOD)>-1;a(vee,"setAnalyticsEnabled");a(mr,"recordAction");it.recordAnalytics=mr;a(qn,"recordActionBinary");Op=0,aB=1e3,cB="analytics-report",lB=[];a(Y_,"addAnalyticsListener");uB=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Bee,"sendAnalytics");a(Hee,"aggregation");X0=0,Z0=0,dB=a(()=>new Promise(setImmediate),"rest");a(eB,"cleanup");xee=36e5,kee=31536e6;a(Ry,"getRawAnalyticsTable");a(_B,"getAnalyticsTable");(0,iB.setChildListenerByType)(cB,EB);a(Fee,"startScheduledTasks");nB=0,sB=new Map,Gee=!1;a(EB,"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,LB.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,UB.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=MB.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+"-"+PB.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"),ss(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,NB).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())},NB*2).unref()}a(Oe,"resetPingTimer"),u&&Va(u);let Ne,Me,Gr=[],wd=[],ka,wn=[],Cd=[],Ol=[],Lw=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 mB:{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])),ss(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])),ss(1008,x.message);return}qa()}break}case bB:{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:ss();break;case AB: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:D,reject:O}=m.get(R.requestId);R.error?O(new Error(R.error)):D(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 SB:YE=_?e0(S,R,_):new Map,ka=A[2],fe.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${ka}`);break;case TB:let C=b;Ol[C]=R;break;case yB: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 RB:y=R,h.send({type:"end_txn",localTime:y,remoteNodeIds:g});break;case gB:{let x=R,q;try{let ee=A[3],G=wd[b]||(wd[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 pB:{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])),ss(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])),ss(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"),ui(9),ui(Pp),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 j_&&fe.trace?.(s,"skipping replication update",ce.recordId,"to:",S,"from:",rt,"subscribed:",Ae),Mw();j_&&fe.trace?.(s,"sending replication update",ce.recordId,"to:",S,"from:",rt,"subscribed:",Ae);let XT=ce.version;Ee.txnTime!==XT&&(Ee.txnTime&&(j_&&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 Mw();let Md=ce.recordId;fe.trace?.(s,"sending invalidation",Md,S,"from",rt);let rg=0;Ya&&(rg|=Ja),ce.previousResidencyId&&(rg|=Xa);let ng,zE=null;for(let Uw in Bt.indices){if(!zE){if(ng=ce.getValue(xo,!0),!ng)break;zE={}}zE[Uw]=ng[Uw]}jE=Pl(ce.version,Ze,Md,null,rt,ce.user,ce.type==="put"||ce.type==="patch"?"invalidate":ce.type,Yt.encode(zE),rg,Ya,ce.previousResidencyId,ce.expiresAt)}function Mw(){fe.trace?.(s,"skipping audit record",ce.recordId),Y||(Y=setTimeout(()=>{Y=null,(ge||0)+OB/2<K&&(j_&&fe.trace?.(s,"sending skipped sequence update",K),e.send((0,ct.encode)([RB,K])))},OB).unref())}a(Mw,"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&&!Cd[Ya]&&(e.send((0,ct.encode)([TB,ZT,Ya])),Cd[Ya]=!0),jE)ui(jE.length),Ld(jE);else{let Il=ce.encoded,Md=Il[0]===66?8:0;ui(Il.length-Md),Ld(Il,Md)}},"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=z_(Ye=>{Ye===u&&(e.send((0,ct.encode)([_u])),ss())}),e.on("close",()=>{Ne?.remove(),Me?.remove()})),e.send((0,ct.encode)([SB,M_(h.auditStore),vs.map(({name:Ye})=>Ye)]));let ce=!0;do{isFinite(K)||(fe.warn?.("Invalid sequence id "+K),ss(1008,"Invalid sequence id"+K));let Ye;if(ce&&!ee&&(ce=!1,!(Cy(_)<=K)&&wB.default.get(CB.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 c0(_)}while(!ee)}).catch(ce=>{fe.error?.(s,"Error handling subscription to node",ce),ss(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)==Pp){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 D;R.residencyId&&(D=Ol[R.residencyId],fe.trace?.(s,"received residency list",D,R.type,R.recordId));try{v={table:b.name,id:R.recordId,type:R.type,nodeId:YE.get(R.nodeId),residencyList:D,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,j_&&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>Lw&&!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)([yB,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 ss(ie,Se){e.isFinished=!0,e.close(ie,Se)}a(ss,"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,D=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:",D),Se!==v){D>5e3&&(D-=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&&(D=k.seqId,fe.debug?.("Using sequence id from proxy node",Se.name,D))}return g.push(R),ie.get(R)>D&&(D=ie.get(R),fe.debug?.("Updating start time from more recent txn recorded",Se.name,D)),{name:v.name,replicateByDefault:w,tables:A,startTime:D,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)([pB,tt]));else{let v=a(()=>{let p=performance.now();ne=setTimeout(()=>{Q<=p?ss(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 Dd(Se,ie),!0}a(Va,"setDatabase");function Dd(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)([mB,ie,Se,v]))}a(Dd,"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)([bB,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=[gB,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)([AB,ie])),new Promise((tt,v)=>{m.set(Se,{resolve:tt,reject:v})})}};function ui(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 Ld(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 wB,CB,ct,DB,PB,fe,Ny,LB,MB,Iy,UB,pB,mB,SB,_u,TB,yy,gB,wp,AB,Cp,RB,yB,bB,vB,yc,j_,OB,Vee,NB,by,IB,Dp,BB=Ie(()=>{De();ji();YR();JR();ls();wB=L(se()),CB=L(M());Ll();ct=require("msgpackr"),DB=require("ws"),PB=require("worker_threads"),fe=L(Sc());H_();Ny=require("events"),LB=L(Js()),MB=L(require("node:tls"));su();Iy=L(require("node:process")),UB=require("node:net");Ii();pB=129,mB=140,SB=141,_u=142,TB=130,yy=132,gB=133,wp=134,AB=136,Cp=137,RB=143,yB=144,bB=145,vB=new Map,yc=new Map,j_=!0,OB=300,Vee=2,NB=3e4;a(wy,"createWebSocket");IB=1e3,Dp=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=IB;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=IB,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:()=>U_,monitorNodeCAs:()=>VB,replicateOperation:()=>ete,replication_certificate_authorities:()=>bc,sendOperationToNode:()=>J_,servers:()=>Yee,setReplicator:()=>YB,start:()=>Wee,startOnMainThread:()=>ZR,subscribeToNode:()=>ou,unsubscribeFromNode:()=>Tp,urlToNodeName:()=>js});function Wee(e){if(e.port||(e.port=Es.default.get(Ic.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=Es.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 B_(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),VB(s),Es.default.get(Ic.CONFIG_PARAMS.REPLICATION_ENABLEROOTCAS)!==!1&&s()}}function VB(e){let t=0;nu(r=>{r?.ca&&(bc.add(r.ca),bc.size!==t&&(t=bc.size,e?.()))})}function jee(e=!0){$B=e}function zee(e){$B||(ut(),ca=e.databases,Zo(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||yc;for(let[s,i]of Q_){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];YB(r,s,e),vB.get(s)?.forEach(i=>i(s))}}))}function YB(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 KB extends Pr{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 Pn,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,KB.subscription,e);f?.isConnected&&!u.has(f)&&(!d||f.latency<d.latency)&&(d=f)}if(!d)throw l||new GB.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 WB(e,t,r,n,s){let i=Q_.get(e);i||Q_.set(e,i=new Map);let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new Dp(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function Qee(e,t,r){let n=HB.get(e)?.get(r);if(n)return n;let s=pr().primaryStore.get(e);return s?.url&&(n=WB(s.url,t,r,e,s.authorization),HB.set(e,Q_.get(s.url))),n}async function J_(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{qB.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=WB(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=>v_(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=Q_.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Jee(){if(Dy!==void 0)return Dy;let e=Es.default.get(Ic.CONFIG_PARAMS.OPERATIONSAPI_TLS_CERTIFICATE)||Es.default.get(Ic.CONFIG_PARAMS.TLS_CERTIFICATE);if(e)return Dy=new kB.X509Certificate((0,FB.readFileSync)(e)).subject.match(/CN=(.*)/)?.[1]??null}function ot(){return vp||(vp=Es.default.get("replication_hostname")??js(Es.default.get("replication_url"))??Jee()??xB("operationsapi_network_secureport")??xB("operationsapi_network_port")??"127.0.0.1")}function Xee(){vp=void 0}function xB(e){let t=Es.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function Up(e){let t=Es.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function Mp(e){return M_(e)?.[ot()]}function ea(){let e=Es.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 z_(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 U_(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=>J_(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 Es,Sr,kB,FB,Ic,Bp,GB,qB,$B,Kee,Yee,bc,ca,Q_,HB,Dy,vp,ls=Ie(()=>{De();Vs();Cl();BB();qr();Es=L(se()),Sr=L(j()),kB=require("crypto"),FB=require("fs");H_();su();Ic=L(M());YR();Bp=L(require("node:tls")),GB=L(_e()),qB=require("worker_threads"),Kee=1,Yee=[],bc=Es.default.get(Ic.CONFIG_PARAMS.REPLICATION_ENABLEROOTCAS)!==!1?new Set(Bp.rootCertificates):new Set;a(Wee,"start");a(VB,"monitorNodeCAs");a(jee,"disableReplication");a(zee,"assignReplicationSource");a(YB,"setReplicator");Q_=new Map;a(WB,"getConnection");HB=new Map;a(Qee,"getConnectionByName");a(J_,"sendOperationToNode");a(ou,"subscribeToNode");a(Tp,"unsubscribeFromNode");a(Jee,"getCommonNameFromCert");a(ot,"getThisNodeName");a(Xee,"clearThisNodeName");Object.defineProperty(it,"hostname",{get(){return ot()}});a(xB,"getHostFromListeningPort");a(Up,"getPortFromListeningPort");a(Mp,"getThisNodeId");it.replication={getThisNodeId:Mp,exportIdMapping:M_};a(ea,"getThisNodeUrl");a(Hp,"hostnameToUrl");a(js,"urlToNodeName");a(Zo,"forEachReplicatedDatabase");a(Zee,"hasExplicitlyReplicatedTable");a(U_,"lastTimeInAuditStore");a(ete,"replicateOperation")});var Gp=N((kNe,XB)=>{"use strict";var fu=Oh(),Eu=Xv(),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(),jB=Tr(),{getDatabases:ite}=(De(),oe(lt)),{transformReq:pu}=re(),{replicateOperation:zB}=(ls(),oe(oa));XB.exports={createSchema:ote,createSchemaStructure:QB,createTable:ate,createTableStructure:JB,createAttribute:_te,dropSchema:cte,dropTable:lte,dropAttribute:ute,getBackup:fte};async function ote(e){let t=await QB(e);return kp.signalSchemaChange(new Fp(process.pid,e.operation,e.schema)),t}a(ote,"createSchema");async function QB(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(QB,"createSchemaStructure");async function ate(e){return pu(e),e.hash_attribute=e.primary_key??e.hash_attribute,await JB(e)}a(ate,"createTable");async function JB(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(JB,"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 jB.purgeSchemaTableStreams(e.schema,o);let c=await zB(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 jB.purgeTableStream(e.schema,e.table);let n=await zB(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 eH=N((GNe,ZB)=>{"use strict";var{OPERATIONS_ENUM:Ete}=M(),Py=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}};ZB.exports=Py});var Ly=N((VNe,iH)=>{"use strict";var hte=Un(),$Ne=eH(),qp=re(),$p=M(),pte=se(),{handleHDBError:tH,hdb_errors:mte}=_e(),{HDB_ERROR_MSGS:rH,HTTP_STATUS_CODES:nH}=mte,Ste=Object.values($p.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),sH="To use this operation audit log must be enabled in harperdb-config.yaml";iH.exports=Tte;async function Tte(e){if(qp.isEmpty(e.schema))throw new Error(rH.SCHEMA_REQUIRED_ERR);if(qp.isEmpty(e.table))throw new Error(rH.TABLE_REQUIRED_ERR);if(!pte.get($p.CONFIG_PARAMS.LOGGING_AUDITLOG))throw tH(new Error,sH,nH.BAD_REQUEST,$p.LOG_LEVELS.ERROR,sH,!0);let t=qp.checkSchemaTableExist(e.schema,e.table);if(t)throw tH(new Error,t,nH.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 aH=N((YNe,oH)=>{"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}};oH.exports=My});var uH=N((QNe,lH)=>{"use strict";var Ate=Un(),jNe=aH(),Uy=re(),Rte=M(),zNe=se(),{handleHDBError:yte,hdb_errors:bte}=_e(),{HDB_ERROR_MSGS:cH,HTTP_STATUS_CODES:Ote}=bte;lH.exports=Nte;async function Nte(e){if(Uy.isEmpty(e.schema))throw new Error(cH.SCHEMA_REQUIRED_ERR);if(Uy.isEmpty(e.table))throw new Error(cH.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 pH=N((XNe,hH)=>{var mu=require("validate.js"),_H=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"),Dte={STRUCTURE_USER:"structure_user"},dH=Object.values(Su.ROLE_TYPES_ENUM),Pte="attribute_permissions",Lte="attribute_name",{PERMS_CRUD_ENUM:Tu}=Su,Mte=[Pte,...Object.values(Tu)],fH=[Tu.READ,Tu.INSERT,Tu.UPDATE],Ute=[Lte,...fH];function vte(e){let t=vy();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,EH(e,t)}a(vte,"addRoleValidation");function Bte(e){let t=vy();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,EH(e,t)}a(Bte,"alterRoleValidation");function Hte(e){let t=vy();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,_H.validateObject(e,t)}a(Hte,"dropRoleValidation");var xte=["operation","role","id","permission","hdb_user","hdb_auth_header","access"];function EH(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=_H.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{ir(o,r)}),e.permission){let o=kte(e);o&&ir(o,r),dH.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(dH.indexOf(o)<0){if(o===Dte.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}fH.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(EH,"customValidate");hH.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 Z_=N((tIe,gH)=>{"use strict";var mH=cn(),SH=$r(),Gte=oc(),Hy=pH(),xy=eo(),eIe=require("uuid").v4,qte=require("util"),Vp=M(),$te=re(),ky=SH.searchByValue,Vte=SH.searchByHash,Kte=qte.promisify(Gte.delete),Yte=$s(),Wte=Wl(),{hdb_errors:jte,handleHDBError:wc}=_e(),{HDB_ERROR_MSGS:TH,HTTP_STATUS_CODES:X_}=jte,{UserEventMsg:Fy}=qs();gH.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,TH.ROLE_ALREADY_EXISTS(e.role),X_.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 mH.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 mH.update(r)}catch(s){throw wc(s)}if(n&&n?.message==="updated 0 of 1 records")throw wc(new Error,"Invalid role id",X_.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,X_.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,TH.ROLE_NOT_FOUND,X_.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`,X_.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 bH=N((nIe,yH)=>{"use strict";var Zte=se(),ua=require("joi"),ere=gt(),AH=require("moment"),tre=require("fs-extra"),Gy=require("path"),rre=require("lodash"),ef=M(),{LOG_LEVELS:Cc}=M(),nre="YYYY-MM-DD hh:mm:ss",sre=Gy.resolve(__dirname,"../logs");yH.exports=function(e){return ere.validateBySchema(e,ire)};var ire=ua.object({from:ua.custom(RH),until:ua.custom(RH),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 RH(e,t){if(AH(e,AH.ISO_8601).format(nre)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(RH,"validateDatetime");function ore(e,t){if(rre.invert(ef.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Zte.get(ef.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?ef.LOG_NAMES.HDB:e,i=s===ef.LOG_NAMES.INSTALL?Gy.join(sre,ef.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,NH)=>{"use strict";var Kp=M(),are=j(),cre=se(),lre=bH(),qy=require("path"),OH=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;NH.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(OH.statSync(s).size-(h+5)*pre,0));let m=OH.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:IH,date:gre}=Vy.types(),Are=gt(),{validateSchemaExists:aIe,validateTableExists:cIe,validateSchemaName:lIe}=mi(),Rre=M(),yre=It(),wH=se();wH.initSync();var uIe=gu.invalid(wH.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),CH={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:IH.required(),publish:IH.required().custom(Ore),start_time:gre.iso()})};function bre(e){return Are.validateBySchema(e,Vy.object(CH))}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:CH}});var LH=N((fIe,PH)=>{var Nre=gt(),Ire={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};PH.exports=function(e){return Nre.validateObject(e,Ire)}});var Ky=N((hIe,vH)=>{"use strict";var wre=LH(),Au=require("passport"),Cre=require("passport-local").Strategy,Dre=require("passport-http").BasicStrategy,Pre=require("util"),Lre=xn(),UH=Pre.callbackify(Lre.findAndValidateUser),EIe=Dn(),Mre=M(),MH=cu();Au.use(new Cre(function(e,t,r){UH(e,t,r)}));Au.use(new Dre(function(e,t,r){UH(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?MH.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):MH.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");vH.exports={authorize:Ure,checkPermissions:vre}});var Ru=N((mIe,BH)=>{"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}};BH.exports={Node:Yy,NodeSubscription:Wy}});var xH=N((TIe,HH)=>{"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}};HH.exports=jy});var tf=N((AIe,kH)=>{"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)}};kH.exports={RemotePayloadObject:zy,RemotePayloadSubscription:Qy}});var GH=N((yIe,FH)=>{"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}};FH.exports=Jy});var $H=N((CIe,qH)=>{"use strict";var Hre=GH(),OIe=Ht(),NIe=ht(),xre=j(),{getSchemaPath:IIe,getTransactionAuditStorePath:wIe}=Tt(),{getDatabases:kre}=(De(),oe(lt));qH.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 KH=N((PIe,VH)=>{"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}};VH.exports=Xy});var bu=N((HIe,zH)=>{"use strict";var Gre=require("fs-extra"),qre=require("path"),jr=require("systeminformation"),_a=j(),YH=Tr(),MIe=It(),yu=M(),$re=$H(),Vre=Zi(),{getThreadInfo:WH}=dt(),rf=se();rf.initSync();var Kre=KH(),{openEnvironment:UIe}=ht(),{getSchemaPath:vIe}=Tt(),{database:BIe,databases:Zy}=(De(),oe(lt)),Wp;zH.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(rf.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(!rf.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 rf.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 jH(){if(rf.get(yu.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await YH.getNATSReferences(),t=await YH.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(jH,"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 WH(),t.replication=await jH(),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 WH();break;case"replication":t.replication=await jH();break;default:break}return t}a(Yre,"systemInformation")});var Ou=N((kIe,Wre)=>{Wre.exports={name:"harperdb",version:"4.4.21",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","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 Dc=N((FIe,QH)=>{"use strict";QH.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,ex)=>{"use strict";var Qre=cn(),lb=re(),Jre=require("util"),Pc=M(),JH=se();JH.initSync();var Xre=Ky(),XH=$r(),{Node:qIe,NodeSubscription:$Ie}=Ru(),Zre=Wl(),ene=xH(),{RemotePayloadObject:tne,RemotePayloadSubscription:rne}=tf(),{handleHDBError:nne,hdb_errors:sne}=_e(),{HTTP_STATUS_CODES:ine,HDB_ERROR_MSGS:one}=sne,ane=$s(),cne=bu(),lne=Dc(),{getDatabases:une}=(De(),oe(lt)),dne=Jre.promisify(Xre.authorize),_ne=XH.searchByHash,fne=XH.searchByValue;ex.exports={authHeaderToUser:Ene,isEmpty:hne,getNodeRecord:pne,upsertNodeRecord:mne,buildNodePayloads:Sne,checkClusteringEnabled:Tne,getAllNodeRecords:gne,getSystemInfo:Ane,reverseSubscription:ZH};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(Pc.SYSTEM_SCHEMA_NAME,Pc.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return _ne(t)}a(pne,"getNodeRecord");async function mne(e){let t=new ene(Pc.SYSTEM_SCHEMA_NAME,Pc.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Qre.upsert(t)}a(mne,"upsertNodeRecord");function ZH(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(ZH,"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}=ZH(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(!JH.get(Pc.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(Pc.SYSTEM_SCHEMA_NAME,Pc.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,cx)=>{"use strict";var zp=Tr(),tx=re(),rx=It(),nx=M(),Qp=j(),sx=Gp(),Rne=O_(),{RemotePayloadObject:yne}=tf(),{handleHDBError:ix,hdb_errors:bne}=_e(),{HTTP_STATUS_CODES:ox}=bne,{NodeSubscription:ax}=Ru();cx.exports=One;async function One(e,t){let r;try{r=await zp.request(`${t}.${rx.REQUEST_SUFFIX}`,new yne(nx.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 ix(new Error,c,ox.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===rx.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw ix(new Error,o,ox.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===nx.SYSTEM_SCHEMA_NAME){await zp.createLocalTableStream(l,c);let h=new ax(l,c,o.publish,o.subscribe);h.start_time=o.start_time,i.push(h);continue}let u=tx.doesSchemaExist(l),d=n[l]!==void 0,_=c?tx.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 sx.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 sx.createTable(h)}await zp.createLocalTableStream(l,c);let f=new ax(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:()=>Dne,removeNodeBack:()=>Pne,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,ux.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 J_({url:T.url},{operation:nf.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,hs.getReplicationCert)();let f=await(0,hs.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,hs.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:nf.OPERATIONS_ENUM.ADD_NODE_BACK,hostname:(0,dx.get)(nf.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(lx):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let f=lx(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 J_({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,hs.setCertTable)({name:Nne.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,hs.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 Dne(e){$n.trace("addNodeBack received request:",e);let t=await(0,hs.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,hs.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 Pne(e){$n.trace("removeNodeBack received request:",e),await pr().delete(e.name)}function lx(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var hs,ux,Nu,dx,nf,$n,co,Nne,Ine,wne,Mc=Ie(()=>{hs=L(Js()),ux=L(gt()),Nu=L(require("joi")),dx=L(se()),nf=L(M());H_();su();ls();$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(Dne,"addNodeBack");a(Pne,"removeNodeBack");a(lx,"reverseSubscription")});var tm=N((ewe,fx)=>{"use strict";var{handleHDBError:Jp,hdb_errors:Lne}=_e(),{HTTP_STATUS_CODES:Xp}=Lne,{addUpdateNodeValidator:Mne}=Yp(),Zp=j(),em=M(),_x=It(),Une=re(),sf=Tr(),of=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);fx.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);of.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 of.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=of.buildNodePayloads(s,qne,em.OPERATIONS_ENUM.ADD_NODE,await of.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 sf.request(`${n}.${_x.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 sf.updateRemoteConsumer(T,n)}let E=sf.requestErrorHandler(_,"add_node",n);throw Jp(new Error,E,Xp.INTERNAL_SERVER_ERROR,"error",E)}if(u.status===_x.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 sf.updateRemoteConsumer(f,n),f.subscribe===!0&&await sf.updateConsumerIterator(f.schema,f.table,n,"start")}let d=new Bne(n,l,u.system_info);return await of.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,hx)=>{"use strict";var{handleHDBError:_b,hdb_errors:Vne}=_e(),{HTTP_STATUS_CODES:fb}=Vne,{addUpdateNodeValidator:Kne}=Yp(),af=j(),rm=M(),Ex=It(),rwe=re(),cf=Tr(),lf=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);hx.exports=tse;async function tse(e){if(af.trace("updateNode called with:",e),Eb.get(rm.CONFIG_PARAMS.REPLICATION_URL)??Eb.get(rm.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Jne(e);lf.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 lf.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=lf.buildNodePayloads(i,ese,rm.OPERATIONS_ENUM.UPDATE_NODE,await lf.getSystemInfo());for(let d=0,_=i.length;d<_;d++){let E=i[d];af.trace(`updateNode updating work stream for node: ${r} subscription:`,E),i[d].start_time===void 0&&delete i[d].start_time}af.trace("updateNode sending remote payload:",l);let u;try{u=await cf.request(`${r}.${Ex.REQUEST_SUFFIX}`,l)}catch(d){af.error(`updateNode received error from request: ${d}`);let _=cf.requestErrorHandler(d,"update_node",r);throw _b(new Error,_,fb.INTERNAL_SERVER_ERROR,"error",_)}if(u.status===Ex.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)}af.trace(u);for(let d=0,_=i.length;d<_;d++){let E=i[d];await cf.updateRemoteConsumer(E,r),E.subscribe===!0?await cf.updateConsumerIterator(E.schema,E.table,r,"start"):await cf.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 lf.upsertNodeRecord(n),Qne({type:"nats_update"})}a(rse,"updateNodeTable")});var gx=N((iwe,Tx)=>{"use strict";var Sx=require("joi"),{string:px}=Sx.types(),nse=gt(),mx=M(),sse=se(),ise=It();Tx.exports=ose;function ose(e){let t=px.invalid(sse.get(mx.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=Sx.object({operation:px.valid(mx.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return nse.validateBySchema(e,r)}a(ose,"removeNodeValidator")});var nm=N((awe,Ox)=>{"use strict";var{handleHDBError:Ax,hdb_errors:ase}=_e(),{HTTP_STATUS_CODES:Rx}=ase,cse=gx(),uf=j(),yx=ao(),lse=re(),Iu=M(),bx=It(),pb=Tr(),mb=se(),{RemotePayloadObject:use}=tf(),{NodeSubscription:dse}=Ru(),_se=b_(),fse=oc(),{broadcast:Ese}=dt(),{setNode:hse}=(Mc(),oe(Lc)),pse=mb.get(Iu.CONFIG_PARAMS.CLUSTERING_NODENAME);Ox.exports=mse;async function mse(e){if(uf.trace("removeNode called with:",e),mb.get(Iu.CONFIG_PARAMS.REPLICATION_URL)??mb.get(Iu.CONFIG_PARAMS.REPLICATION_HOSTNAME))return hse(e);yx.checkClusteringEnabled();let t=cse(e);if(t)throw Ax(t,t.message,Rx.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await yx.getNodeRecord(r);if(lse.isEmptyOrZeroLength(n))throw Ax(new Error,`Node '${r}' was not found.`,Rx.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(_){uf.error(_)}}try{i=await pb.request(`${r}.${bx.REQUEST_SUFFIX}`,s),uf.trace("Remove node reply from remote node:",r,i)}catch(l){uf.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===bx.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(uf.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 wx=N((lwe,Ix)=>{"use strict";var Nx=require("joi"),{string:Sse,array:Tse}=Nx.types(),gse=gt(),Ase=Yp();Ix.exports=Rse;function Rse(e){let t=Nx.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,Mx)=>{"use strict";var Cx=M(),sm=j(),yse=re(),bse=se(),Ose=nm(),Nse=tm(),Ise=ao(),wse=wx(),{handleHDBError:Dx,hdb_errors:Cse}=_e(),{HTTP_STATUS_CODES:Px}=Cse,Dse="Configure cluster complete.",Pse="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.";Mx.exports=Mse;async function Mse(e){sm.trace("configure cluster called with:",e);let t=wse(e);if(t)throw Dx(t,t.message,Px.BAD_REQUEST,void 0,void 0,!0);let r=await Ise.getAllNodeRecords(),n=[];if(bse.get(Cx.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,_=r.length;d<_;d++){let E=await Lx(Ose,{operation:Cx.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 Lx(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:Dse,connections:c};if(l)return{message:Lse,failed_nodes:o,connections:c};throw Dx(new Error,Pse,Px.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(Mse,"configureCluster");async function Lx(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(Lx,"functionWrapper")});var Hx=N((fwe,Bx)=>{"use strict";var df=require("joi"),Use=gt(),{validateSchemaExists:Ux,validateTableExists:vse,validateSchemaName:vx}=mi(),Bse=df.object({operation:df.string().valid("purge_stream"),schema:df.string().custom(Ux).custom(vx).optional(),database:df.string().custom(Ux).custom(vx).optional(),table:df.string().custom(vse).required()});function Hse(e){return Use.validateBySchema(e,Bse)}a(Hse,"purgeStreamValidator");Bx.exports=Hse});var Tb=N((hwe,xx)=>{"use strict";var{handleHDBError:xse,hdb_errors:kse}=_e(),{HTTP_STATUS_CODES:Fse}=kse,Gse=Hx(),qse=Tr(),$se=ao();xx.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,Kx)=>{"use strict";var Ab=ao(),Kse=Tr(),im=se(),wu=M(),Uc=It(),Yse=re(),gb=j(),{RemotePayloadObject:Wse}=tf(),{ErrorCode:kx}=require("nats"),{parentPort:Fx}=require("worker_threads"),{onMessageByType:jse}=dt(),{getThisNodeName:zse}=(ls(),oe(oa)),{requestClusterStatus:Qse}=(H_(),oe(T0)),Gx=im.get(wu.CONFIG_PARAMS.CLUSTERING_ENABLED),qx=im.get(wu.CONFIG_PARAMS.CLUSTERING_NODENAME);Kx.exports={clusterStatus:Jse,buildNodeStatus:Vx};var $x;jse("cluster-status",async e=>{$x(e)});async function Jse(){if(im.get(wu.CONFIG_PARAMS.REPLICATION_URL)||im.get(wu.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;return Fx?(Fx.postMessage({type:"request-cluster-status"}),n=await new Promise(s=>{$x=s})):n=Qse(),n.node_name=zse(),n.is_enabled=!0,n}let e={node_name:qx,is_enabled:Gx,connections:[]};if(!Gx)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(Vx(t[n],e.connections));return await Promise.allSettled(r),e}a(Jse,"clusterStatus");async function Vx(e,t){let r=e.name,n=new Wse(wu.OPERATIONS_ENUM.CLUSTER_STATUS,qx,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===kx.NoResponders?o=Uc.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===kx.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(Vx,"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,Yx)=>{"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()});Yx.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 Qx=N((Awe,zx)=>{"use strict";var Ob=require("joi"),Wx=gt(),{route_constraints:jx}=NA();zx.exports={setRoutesValidator:cie,deleteRoutesValidator:lie};function cie(e){let t=Ob.object({server:Ob.valid("hub","leaf"),routes:jx.required()});return Wx.validateBySchema(e,t)}a(cie,"setRoutesValidator");function lie(e){let t=Ob.object({routes:jx.required()});return Wx.validateBySchema(e,t)}a(lie,"deleteRoutesValidator")});var am=N((ywe,nk)=>{"use strict";var lo=Ct(),Nb=re(),ps=M(),Cu=se(),Jx=Qx(),{handleHDBError:Xx,hdb_errors:uie}=_e(),{HTTP_STATUS_CODES:Zx}=uie,ek="cluster routes successfully set",tk="cluster routes successfully deleted";nk.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(ps.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):lo.updateConfigValue(ps.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:ek,set:i,skipped:s}}a(die,"setRoutesNats");function _ie(e){let t=Jx.setRoutesValidator(e);if(t)throw Xx(t,t.message,Zx.BAD_REQUEST,void 0,void 0,!0);if(Cu.get(ps.CONFIG_PARAMS.CLUSTERING_ENABLED))return die(e);let r=[],n=[],s=Cu.get(ps.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{rk(s,i)?n.push(i):(s.push(i),r.push(i))}),lo.updateConfigValue(ps.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:ek,set:r,skipped:n}}a(_ie,"setRoutes");function rk(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(rk,"existsInArray");function fie(){if(Cu.get(ps.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=lo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Cu.get(ps.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(fie,"getRoutes");function Eie(e){let t=Jx.deleteRoutesValidator(e);if(t)throw Xx(t,t.message,Zx.BAD_REQUEST,void 0,void 0,!0);if(Cu.get(ps.CONFIG_PARAMS.CLUSTERING_ENABLED))return hie(e);let r=[],n=[],s=Cu.get(ps.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{rk(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),lo.updateConfigValue(ps.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:tk,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(ps.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=Nb.isEmptyOrZeroLength(n)?null:n,lo.updateConfigValue(ps.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:tk,deleted:s,skipped:i}}a(hie,"deleteRoutesNats")});var ik=N((Owe,sk)=>{"use strict";var _f=require("alasql"),vc=require("recursive-iterator"),Xs=j(),pie=re(),ff=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=>ff.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=>!ff.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][ff.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=>!ff.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new _f.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[ff.PERMS_CRUD_ENUM.READ])}a(mie,"filterReadRestrictedAttrs");function Sie(e,t,r,n,s){Tie(e,t,r,n,s)}a(Sie,"interpretAST");function Ef(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(Ef,"addSchemaTableToMap");function Tie(e,t,r,n,s){if(!e){Xs.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof _f.yy.Insert?yie(e,t,r):e instanceof _f.yy.Select?gie(e,t,r,n,s):e instanceof _f.yy.Update?Aie(e,t,r):e instanceof _f.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=>{Ef(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),Ef(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;Ef(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;Ef(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;Ef(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");sk.exports=Ib});var Pb=N((Iwe,lk)=>{var cm=uc(),ok=require("chalk"),Vn=j(),ak=require("prompt"),{promisify:bie}=require("util"),Cb=M(),Oie=require("fs-extra"),Nie=require("path"),Iie=re(),wie=Dc(),ck=se();ck.initSync();var Cie=require("moment"),Die=bie(ak.get),Pie=Nie.join(ck.getHdbBasePath(),Cb.LICENSE_KEY_DIR_NAME,Cb.LICENSE_FILE_NAME,Cb.LICENSE_FILE_NAME);lk.exports={getFingerprint:Mie,setLicense:Lie,parseLicense:Db,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 Db(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 Db(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(Pie,JSON.stringify({license_key:e,company:t}))}catch(n){throw Vn.error("Failed to write License"),n}return"Registration successful."}a(Db,"parseLicense");async function Uie(){let e=await vie();return Db(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Uie,"register");async function vie(){let e=await cm.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:ok.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:ok.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{ak.start()}catch(n){Vn.error(n)}let r;try{r=await Die(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 dk=N((Cwe,uk)=>{"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"}};uk.exports=Lb});var Ek=N((Pwe,fk)=>{"use strict";var _k=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+_k.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+_k.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"}};fk.exports=Mb});var pk=N((Mwe,hk)=>{"use strict";var Ub=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};hk.exports=Ub});var Sk=N((vwe,mk)=>{"use strict";var xie=It(),vb=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+xie.SERVER_SUFFIX.ADMIN,this.password=r}};mk.exports=vb});var _m=N((Hwe,Ak)=>{"use strict";var Bc=require("path"),Hc=require("fs-extra"),kie=dk(),Fie=Ek(),Gie=pk(),qie=Sk(),Bb=xn(),Pu=re(),Tn=Ct(),um=M(),hf=It(),{CONFIG_PARAMS:Jt}=um,Lu=j(),pf=se(),Tk=Xi(),Hb=Tr(),$ie=Js(),Du="clustering",Vie=1e4,gk=50;Ak.exports={generateNatsConfig:Yie,removeNatsConfig:Wie,getHubConfigPath:Kie};function Kie(){let e=pf.get(Jt.ROOTPATH);return Bc.join(e,Du,hf.NATS_CONFIG_FILES.HUB_SERVER)}a(Kie,"getHubConfigPath");async function Yie(e=!1,t=void 0){let r=pf.get(Jt.ROOTPATH);Hc.ensureDirSync(Bc.join(r,"clustering","leaf")),pf.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,Du,hf.PID_FILES.HUB),c=Bc.join(r,Du,hf.PID_FILES.LEAF),l=Tn.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=Bc.join(r,Du,hf.NATS_CONFIG_FILES.HUB_SERVER),d=Bc.join(r,Du,hf.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();(Pu.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,Tk.decrypt(Q.hash))),y.push(new Gie(Q.username,Tk.decrypt(Q.hash))));let I=[],{hub_routes:U}=Tn.getClusteringRoutes();if(!Pu.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=Pu.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=pf.get(e);return Pu.isEmpty(t)&&dm(`port undefined for '${e}'`),await Pu.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<gk;){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>=gk)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 Pu.async_set_timeout(u)}let c="0".repeat(Vie),l=Bc.join(pf.get(Jt.ROOTPATH),Du,r);await Hc.writeFile(l,c),await Hc.remove(l),Lu.notify(e,"started.")}a(Wie,"removeNatsConfig")});var Ik=N((kwe,Nk)=>{"use strict";var Kn=se(),jie=uc(),Ge=M(),mf=It(),uo=require("path"),{PACKAGE_ROOT:Em}=M(),Rk=se(),fm=re(),Mu="/dev/null",zie=uo.join(Em,"launchServiceScripts"),yk=uo.join(Em,"utility/scripts"),Qie=uo.join(yk,Ge.HDB_RESTART_SCRIPT),bk=uo.resolve(Em,"dependencies",`${process.platform}-${process.arch}`,mf.NATS_BINARY_NAME);function Ok(){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(Ok,"generateMainServerConfig");var Jie=9930;function Xie(){Kn.initSync(!0);let e=Kn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=uo.join(e,"clustering",mf.NATS_CONFIG_FILES.HUB_SERVER),r=uo.join(Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=Rk.get(Ge.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=mf.LOG_LEVEL_FLAGS[Kn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Jie?"-"+n:""),script:bk,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",mf.NATS_CONFIG_FILES.LEAF_SERVER),r=uo.join(Kn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=Rk.get(Ge.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=mf.LOG_LEVEL_FLAGS[Kn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Zie?"-"+n:""),script:bk,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:yk},script:Qie}}a(roe,"generateRestart");function noe(){return{apps:[Ok()]}}a(noe,"generateAllServiceConfigs");Nk.exports={generateAllServiceConfigs:noe,generateMainServerConfig:Ok,generateRestart:roe,generateNatsHubServerConfig:Xie,generateNatsLeafServerConfig:eoe,generateClusteringUpgradeV4ServiceConfig:toe}});var Tf=N((qwe,Gk)=>{"use strict";var at=M(),soe=re(),fo=_m(),hm=Tr(),_o=It(),fa=Ik(),pm=se(),xc=j(),ioe=ao(),{startWorker:wk,onMessageFromWorkers:ooe}=dt(),aoe=bu(),Gwe=require("util"),coe=require("child_process"),loe=require("fs"),{execFile:uoe}=coe,Qe;Gk.exports={enterPM2Mode:doe,start:Ea,stop:xb,reload:Dk,restart:Pk,list:kb,describe:Uk,connect:Eo,kill:poe,startAllServices:moe,startService:Fb,getUniqueServicesList:vk,restartAllServices:Soe,isServiceRegistered:Bk,reloadStopStart:Hk,restartHdb:Mk,deleteProcess:Eoe,startClusteringProcesses:kk,startClusteringThreads:Fk,isHdbRestartRunning:hoe,isClusteringRunning:goe,stopClustering:Toe,reloadClustering:Aoe,expectedRestartOfChildren:Lk};var Sf=!1;ooe(e=>{e.type==="restart"&&pm.initSync(!0)});function doe(){Sf=!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,Ck;function Ea(e,t=!1){if(Sf)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),!Ck&&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(()=>{Ck=!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(!Sf){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 Pk(e){if(!Sf){Lk();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(Pk,"restart");function Lk(){for(let e of zr||[])e.config&&(e.config.restarts=0)}a(Lk,"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 Mk(){await Ea(fa.generateRestart())}a(Mk,"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 Uk(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(Uk,"describe");function poe(){if(!Sf){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 kk(),await Fk(),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 vk(){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(vk,"getUniqueServicesList");async function Soe(e=[]){try{let t=!1,r=await vk();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 Pk(o))}t&&await Hk(at.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Qe?.disconnect(),t}}a(Soe,"restartAllServices");async function Bk(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(Bk,"isServiceRegistered");async function Hk(e){let t=pm.get(at.CONFIG_PARAMS.THREADS_COUNT)??pm.get(at.CONFIG_PARAMS.THREADS),r=await Uk(e),n=soe.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await xb(e),await Fb(e)):e===at.PROCESS_DESCRIPTORS.HDB?await Mk():await Dk(e)}a(Hk,"reloadStopStart");var xk;async function kk(e=!1){for(let t in at.CLUSTERING_PROCESSES){let r=at.CLUSTERING_PROCESSES[t];await Fb(r,e)}}a(kk,"startClusteringProcesses");async function Fk(){xk=wk(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"),wk(at.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(Fk,"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 xk.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 Bk(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:()=>Wk});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 qk(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 Wk(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 qk(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 qk(e){let t=await(0,Yk.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}async function Wk(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,$k.open)(new Vk.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 Kk.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,gf);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 $k,mm,kc,Gb,Vk,Kk,Sm,pa,Yk,qb,ha,Vb=Ie(()=>{De();$k=require("lmdb"),mm=require("path"),kc=require("fs-extra"),Gb=L(se()),Vk=L(n_()),Kk=L(r_()),Sm=L(Ht()),pa=L(M());ji();Yk=L(Zi()),qb=L(Ct()),ha=L(j());a(Roe,"compactOnStart");a(qk,"getTotalDBRecordCount");a(Wk,"copyDb")});var Hu=N((Qwe,eF)=>{"use strict";var yoe=require("minimist"),{isMainThread:Yb,parentPort:Rf,threadId:Wwe}=require("worker_threads"),Pt=M(),{PROCESS_DESCRIPTORS_VALIDATE:vu}=Pt,wi=j(),Wb=re(),Am=_m(),gm=Tr(),jwe=It(),Jk=Ct(),Zs=Tf(),jk=bu(),{compactOnStart:boe}=(Vb(),oe($b)),Ooe=Wa(),{restartWorkers:Rm,onMessageByType:Noe}=dt(),{handleHDBError:Ioe,hdb_errors:woe}=_e(),{HTTP_STATUS_CODES:Coe}=woe,yf=se(),{sendOperationToNode:zk,getThisNodeName:Doe,monitorNodeCAs:Poe}=(ls(),oe(oa)),{getHDBNodeTable:zwe}=(su(),oe(E0));yf.initSync();var Af=`Restarting HarperDB. This may take up to ${Pt.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.",Qk="Clustering is not enabled so cannot be restarted",Moe="Invalid service",Bu,ms;eF.exports={restart:Xk,restartService:jb};Yb&&Noe(Pt.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await jb({service:e.workerType}):Xk({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function Xk(e){ms=Object.keys(e).length===0,Bu=await Zs.isServiceRegistered(Pt.HDB_PROC_DESCRIPTOR);let t=yoe(process.argv);if(t.service){await jb(t);return}if(ms&&!Bu){console.error(Loe);return}if(ms&&console.log(Af),Bu){Zs.enterPM2Mode(),wi.notify(Af);let r=Ooe(Object.keys(Pt.CONFIG_PARAM_MAP),!0);return Wb.isEmptyOrZeroLength(Object.keys(r))||Jk.updateConfigValue(void 0,void 0,r,!0,!0),Uoe(),Af}return Yb?(wi.notify(Af),yf.get(Pt.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await boe(),setTimeout(()=>{Rm()},50)):Rf.postMessage({type:Pt.ITC_EVENT_TYPES.RESTART}),Af}a(Xk,"restart");async function jb(e){let{service:t}=e;if(Pt.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(Pt.HDB_PROC_DESCRIPTOR),!Yb){e.replicated&&Poe(),Rf.postMessage({type:Pt.ITC_EVENT_TYPES.RESTART,workerType:t}),Rf.ref(),await new Promise(s=>{Rf.on("message",i=>{i.type==="restart-complete"&&(s(),Rf.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===Doe())continue;let{job_id:i}=await zk(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 zk(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(!yf.get(Pt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Qk;break}ms&&console.log("Restarting clustering"),wi.notify("Restarting clustering"),await Zk();break;case vu.clustering_config:case vu["clustering config"]:if(!yf.get(Pt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Qk;break}ms&&console.log("Restarting clustering_config"),wi.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(ms&&!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}ms&&console.log("Restarting http_workers"),wi.notify("Restarting http_workers"),ms?await Zs.restart(Pt.HDB_PROC_DESCRIPTOR):await Rm("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(wi.error(r),ms&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(jb,"restartService");async function Uoe(){await Zk(),await Zs.restart(Pt.HDB_PROC_DESCRIPTOR),await Wb.async_set_timeout(2e3),yf.get(Pt.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await Kb(),ms&&(await gm.closeConnection(),process.exit(0))}a(Uoe,"restartPM2Mode");async function Zk(){if(!Jk.getConfigFromFile(Pt.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await jk.getHDBProcessInfo()).clustering.length===0)wi.trace("Clustering not running, restart will start clustering services"),await Am.generateNatsConfig(!0),await Zs.startClusteringProcesses(),await Zs.startClusteringThreads(),await Kb(),ms&&await gm.closeConnection();else{await Am.generateNatsConfig(!0),Bu?(wi.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await Zs.restart(Pt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Zs.restart(Pt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await jk.getHDBProcessInfo()).clustering.forEach(s=>{wi.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await Wb.async_set_timeout(3e3),await Kb(),await gm.updateLocalStreams(),ms&&await gm.closeConnection(),wi.trace("Restart clustering restarting ingest and reply service threads");let t=Rm(Pt.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=Rm(Pt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(Zk,"restartClustering");async function Kb(){await Am.removeNatsConfig(Pt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Am.removeNatsConfig(Pt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(Kb,"removeNatsConfig")});var dF=N((Zwe,uF)=>{"use strict";var Xwe=require("lodash"),gn=M(),{handleHDBError:tF,hdb_errors:voe}=_e(),{HDB_ERROR_MSGS:Boe,HTTP_STATUS_CODES:Hoe}=voe,zb=j();uF.exports={getRolePermissions:koe};var Fc=Object.create(null),xoe=a(e=>({key:e,perms:{}}),"perms_template_obj"),iF=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),oF=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,...oF(t,r,n,s)}),"table_perms_template"),rF=a((e,t=oF())=>({attribute_name:e,describe:lF(t),[bf]:t[bf],[Jb]:t[Jb],[Xb]:t[Xb]}),"attr_perms_template"),nF=a((e,t=!1)=>({attribute_name:e,describe:t,[bf]:t}),"timestamp_attr_perms_template"),{READ:bf,INSERT:Jb,UPDATE:Xb}=gn.PERMS_CRUD_ENUM,aF=Object.values(gn.PERMS_CRUD_ENUM),cF=[bf,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),tF(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
|
-
${r.stack}`;throw zb.error(n),tF(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]=iF(),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||aF.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=iF(!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=nF(_,d[bf])),u[_]=E,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=rF(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let d=i[u];d.describe=lF(d),s.attribute_permissions.push(d),c||$oe(d,l)}else if(u!==o){let d;gn.TIME_STAMP_NAMES.includes(u)?d=nF(u):d=rF(u),s.attribute_permissions.push(d)}}),c||s.attribute_permissions.push(l),s.describe=sF(s),s}else return e.describe=sF(e),e}a(qoe,"getTableAttrPerms");function sF(e){return aF.filter(t=>e[t]).length>0}a(sF,"getSchemaTableDescribePerm");function lF(e){return cF.filter(t=>e[t]).length>0}a(lF,"getAttributeDescribePerm");function $oe(e,t){cF.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a($oe,"checkForHashPerms")});var _F={};je(_F,{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,Of=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 Nf={};je(Nf,{authentication:()=>TF,bypassAuth:()=>Qoe,login:()=>Xoe,logout:()=>Zoe,start:()=>Joe});function Qoe(){SF=!0}async function TF(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=new ho([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers","Accept, Content-Type, Authorization"],["Access-Control-Allow-Origin",i]]);return bm&&h.set("Access-Control-Allow-Credentials","true"),{status:200,headers:h}}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 fF.get(l);break}e.session=u||(u={})}let d=a((f,h,T)=>{let m=new xu.AuthAuditLog(f,h,br.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===br.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,br.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,br.AUTH_AUDIT_STATUS.FAILURE,h))),c({status:401,body:qc({error:S.message},e)})}Gc.set(n,_),joe&&d(_.username,br.AUTH_AUDIT_STATUS.SUCCESS,h)}e.user=_}else u?.user?e.user=await it.getUser(u.user,null,e):(SF&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,hF.getSuperUser)());bm&&(e.session.update=function(f){if(!l){l=(0,pF.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,fF.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")&&Oi.loginPath?(E.status=302,E.headers.set("Location",Oi.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(TF,t||r?{port:t,securePort:r}:{port:"all"}),EF||(EF=!0,setInterval(()=>{Gc=new Map},Ss.get(br.CONFIG_PARAMS.AUTHENTICATION_CACHETTL)).unref(),mF.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 hF,Om,pF,Ss,br,xu,mF,eO,Voe,Koe,Yoe,Woe,fF,bm,SF,joe,zoe,Gc,EF,Nm=Ie(()=>{hF=L(xn());qr();Zl();Om=L(cu());De();pF=require("uuid"),Ss=L(se()),br=L(M()),xu=L(j()),mF=L(h_());Of();$c();eO=(0,xu.loggerWithTag)("auth-event");Ss.initSync();Voe=Ss.get(br.CONFIG_PARAMS.HTTP_CORSACCESSLIST),Koe=Ss.get(br.CONFIG_PARAMS.HTTP_CORS),Yoe=Ss.get(br.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_CORSACCESSLIST),Woe=Ss.get(br.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_CORS),fF=Et({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),bm=Ss.get(br.CONFIG_PARAMS.AUTHENTICATION_ENABLESESSIONS)??!0,SF=process.env.AUTHENTICATION_AUTHORIZELOCAL??Ss.get(br.CONFIG_PARAMS.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,joe=Ss.get(br.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,zoe=Ss.get(br.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,Gc=new Map;it.onInvalidatedUser(()=>{Gc=new Map});a(Qoe,"bypassAuth");a(TF,"authentication");a(Joe,"start");a(Xoe,"login");a(Zoe,"logout")});var NF=N((cCe,OF)=>{"use strict";var ye=require("joi"),gF=require("fs-extra"),AF=require("path"),Yn=gt(),RF=se(),yF=M(),bF=j(),{hdb_errors:eae}=_e(),{HDB_ERROR_MSGS:Qr}=eae,po=/^[a-zA-Z0-9-_]+$/,tae=/^[a-zA-Z0-9-_]+$/;OF.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=RF.get(yF.CONFIG_PARAMS.COMPONENTSROOT),s=AF.join(n,t);return gF.existsSync(s)?e?t:r.message(Qr.PROJECT_EXISTS):e?r.message(Qr.NO_PROJECT):t}catch(n){return bF.error(n),r.message(Qr.VALIDATION_ERR)}}a(Im,"checkProjectExists");function If(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(If,"checkFilePath");function rae(e,t,r,n){try{let s=RF.get(yF.CONFIG_PARAMS.COMPONENTSROOT),i=AF.join(s,e,t,r+".js");return gF.existsSync(i)?r:n.message(Qr.NO_FILE)}catch(s){return bF.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(If).required().messages({"string.pattern.base":Qr.BAD_FILE_NAME})});return Yn.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(If).required(),function_content:ye.string().required()});return Yn.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(If).required(),payload:ye.string().allow("").optional(),encoding:ye.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return Yn.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(If).optional()});return Yn.validateBySchema(e,t)}a(oae,"dropComponentFileValidator");function aae(e){let t=ye.object({project:ye.string().required(),file:ye.string().custom(If).required(),encoding:ye.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return Yn.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 Yn.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 Yn.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 Yn.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 Yn.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 Yn.validateBySchema(e,t)}a(_ae,"addSSHKeyValidator");function fae(e){let t=ye.object({name:ye.string().required(),key:ye.string().required()});return Yn.validateBySchema(e,t)}a(fae,"updateSSHKeyValidator");function Eae(e){let t=ye.object({name:ye.string().required()});return Yn.validateBySchema(e,t)}a(Eae,"deleteSSHKeyValidator");function hae(e){let t=ye.object({known_hosts:ye.string().required()});return Yn.validateBySchema(e,t)}a(hae,"setSSHKnownHostsValidator")});var wf=N((uCe,LF)=>{"use strict";var wm=require("joi"),ma=require("path"),ku=require("fs-extra"),{exec:pae}=require("child_process"),mae=require("util"),IF=mae.promisify(pae),Vc=M(),{handleHDBError:Fu,hdb_errors:Sae}=_e(),{HTTP_STATUS_CODES:Gu}=Sae,Kc=se(),Tae=gt(),Yc=j();Kc.initSync();var tO=Kc.get(Vc.CONFIG_PARAMS.COMPONENTSROOT),wF="npm install --force --omit=dev --json",gae=`${wF} --dry-run`,Aae=Kc.get(Vc.CONFIG_PARAMS.ROOTPATH),Cm=ma.join(Aae,"ssh");LF.exports={installModules:Oae,auditModules:Nae,installAllRootModules:Rae,uninstallRootModule:yae,linkHarperdb:bae,runCommand:qu};async function Rae(e=!1,t=Kc.get(Vc.CONFIG_PARAMS.ROOTPATH)){await Dm();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 qu(e?"npm install --force --ignore-scripts":"npm install --force",t,n)}a(Rae,"installAllRootModules");async function yae(e){await qu(`npm uninstall ${e}`,Kc.get(Vc.CONFIG_PARAMS.ROOTPATH))}a(yae,"uninstallRootModule");async function bae(){await Dm(),await qu(`npm link ${Vc.PACKAGE_ROOT}`,Kc.get(Vc.CONFIG_PARAMS.ROOTPATH))}a(bae,"linkHarperdb");async function qu(e,t=void 0,r=process.env){let n,s;try{({stdout:n,stderr:s}=await IF(e,{cwd:t,env:r}))}catch(i){throw new Error(i.stderr.replace(`
|
|
16
|
+
${r.stack}`;throw zb.error(n),tF(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]=iF(),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||aF.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=iF(!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=nF(_,d[bf])),u[_]=E,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=rF(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let d=i[u];d.describe=lF(d),s.attribute_permissions.push(d),c||$oe(d,l)}else if(u!==o){let d;gn.TIME_STAMP_NAMES.includes(u)?d=nF(u):d=rF(u),s.attribute_permissions.push(d)}}),c||s.attribute_permissions.push(l),s.describe=sF(s),s}else return e.describe=sF(e),e}a(qoe,"getTableAttrPerms");function sF(e){return aF.filter(t=>e[t]).length>0}a(sF,"getSchemaTableDescribePerm");function lF(e){return cF.filter(t=>e[t]).length>0}a(lF,"getAttributeDescribePerm");function $oe(e,t){cF.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a($oe,"checkForHashPerms")});var _F={};je(_F,{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,Of=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 Nf={};je(Nf,{authentication:()=>TF,bypassAuth:()=>Qoe,login:()=>Xoe,logout:()=>Zoe,start:()=>Joe});function Qoe(){SF=!0}async function TF(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=new ho([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers","Accept, Content-Type, Authorization"],["Access-Control-Allow-Origin",i]]);return bm&&h.set("Access-Control-Allow-Credentials","true"),{status:200,headers:h}}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 fF.get(l);break}e.session=u||(u={})}let d=a((f,h,T)=>{let m=new xu.AuthAuditLog(f,h,br.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===br.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,br.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,br.AUTH_AUDIT_STATUS.FAILURE,h))),c({status:401,body:qc({error:S.message},e)})}Gc.set(n,_),joe&&d(_.username,br.AUTH_AUDIT_STATUS.SUCCESS,h)}e.user=_}else u?.user?e.user=await it.getUser(u.user,null,e):(SF&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,hF.getSuperUser)());bm&&(e.session.update=function(f){if(!l){l=(0,pF.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,fF.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")&&Oi.loginPath?(E.status=302,E.headers.set("Location",Oi.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(TF,t||r?{port:t,securePort:r}:{port:"all"}),EF||(EF=!0,setInterval(()=>{Gc=new Map},Ss.get(br.CONFIG_PARAMS.AUTHENTICATION_CACHETTL)).unref(),mF.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 hF,Om,pF,Ss,br,xu,mF,eO,Voe,Koe,Yoe,Woe,fF,bm,SF,joe,zoe,Gc,EF,Nm=Ie(()=>{hF=L(xn());qr();Zl();Om=L(cu());De();pF=require("uuid"),Ss=L(se()),br=L(M()),xu=L(j()),mF=L(h_());Of();$c();eO=(0,xu.loggerWithTag)("auth-event");Ss.initSync();Voe=Ss.get(br.CONFIG_PARAMS.HTTP_CORSACCESSLIST),Koe=Ss.get(br.CONFIG_PARAMS.HTTP_CORS),Yoe=Ss.get(br.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_CORSACCESSLIST),Woe=Ss.get(br.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_CORS),fF=Et({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),bm=Ss.get(br.CONFIG_PARAMS.AUTHENTICATION_ENABLESESSIONS)??!0,SF=process.env.AUTHENTICATION_AUTHORIZELOCAL??Ss.get(br.CONFIG_PARAMS.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,joe=Ss.get(br.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,zoe=Ss.get(br.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,Gc=new Map;it.onInvalidatedUser(()=>{Gc=new Map});a(Qoe,"bypassAuth");a(TF,"authentication");a(Joe,"start");a(Xoe,"login");a(Zoe,"logout")});var NF=N((cCe,OF)=>{"use strict";var ye=require("joi"),gF=require("fs-extra"),AF=require("path"),Yn=gt(),RF=se(),yF=M(),bF=j(),{hdb_errors:eae}=_e(),{HDB_ERROR_MSGS:Qr}=eae,po=/^[a-zA-Z0-9-_]+$/,tae=/^[a-zA-Z0-9-_]+$/;OF.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=RF.get(yF.CONFIG_PARAMS.COMPONENTSROOT),s=AF.join(n,t);return gF.existsSync(s)?e?t:r.message(Qr.PROJECT_EXISTS):e?r.message(Qr.NO_PROJECT):t}catch(n){return bF.error(n),r.message(Qr.VALIDATION_ERR)}}a(Im,"checkProjectExists");function If(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(If,"checkFilePath");function rae(e,t,r,n){try{let s=RF.get(yF.CONFIG_PARAMS.COMPONENTSROOT),i=AF.join(s,e,t,r+".js");return gF.existsSync(i)?r:n.message(Qr.NO_FILE)}catch(s){return bF.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(If).required().messages({"string.pattern.base":Qr.BAD_FILE_NAME})});return Yn.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(If).required(),function_content:ye.string().required()});return Yn.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(If).required(),payload:ye.string().allow("").optional(),encoding:ye.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return Yn.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(If).optional()});return Yn.validateBySchema(e,t)}a(oae,"dropComponentFileValidator");function aae(e){let t=ye.object({project:ye.string().required(),file:ye.string().custom(If).required(),encoding:ye.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return Yn.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 Yn.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 Yn.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 Yn.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 Yn.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 Yn.validateBySchema(e,t)}a(_ae,"addSSHKeyValidator");function fae(e){let t=ye.object({name:ye.string().required(),key:ye.string().required()});return Yn.validateBySchema(e,t)}a(fae,"updateSSHKeyValidator");function Eae(e){let t=ye.object({name:ye.string().required()});return Yn.validateBySchema(e,t)}a(Eae,"deleteSSHKeyValidator");function hae(e){let t=ye.object({known_hosts:ye.string().required()});return Yn.validateBySchema(e,t)}a(hae,"setSSHKnownHostsValidator")});var wf=N((uCe,LF)=>{"use strict";var wm=require("joi"),ma=require("path"),ku=require("fs-extra"),{exec:pae}=require("child_process"),mae=require("util"),IF=mae.promisify(pae),Vc=M(),{handleHDBError:Fu,hdb_errors:Sae}=_e(),{HTTP_STATUS_CODES:Gu}=Sae,Kc=se(),Tae=gt(),Yc=j();Kc.initSync();var tO=Kc.get(Vc.CONFIG_PARAMS.COMPONENTSROOT),wF="npm install --force --omit=dev --json",gae=`${wF} --dry-run`,Aae=Kc.get(Vc.CONFIG_PARAMS.ROOTPATH),Cm=ma.join(Aae,"ssh");LF.exports={installModules:Oae,auditModules:Nae,installAllRootModules:Rae,uninstallRootModule:yae,linkHarperdb:bae,runCommand:qu};async function Rae(e=!1,t=Kc.get(Vc.CONFIG_PARAMS.ROOTPATH)){await Dm();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 qu(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 qu(`npm uninstall ${e}`,Kc.get(Vc.CONFIG_PARAMS.ROOTPATH))}a(yae,"uninstallRootModule");async function bae(){await Dm(),await qu(`npm link ${Vc.PACKAGE_ROOT}`,Kc.get(Vc.CONFIG_PARAMS.ROOTPATH))}a(bae,"linkHarperdb");async function qu(e,t=void 0,r=process.env){let n,s;try{({stdout:n,stderr:s}=await IF(e,{cwd:t,env:r}))}catch(i){throw new Error(i.stderr.replace(`
|
|
17
17
|
`,""))}return s&&!s.includes("Debugger listening")&&!s.includes("warn using --force")&&Yc.error("Error running NPM command:",e,s),Yc.trace(n,s),n?.replace(`
|
|
18
18
|
`,"")}a(qu,"runCommand");async function Oae(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";Yc.warn(t,e);let r=PF(e);if(r)throw Fu(r,r.message,Gu.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?gae:wF;await Dm(),await DF(n);let o={};for(let c=0,l=n.length;c<l;c++){let u=n[c];o[u]={npm_output:null,npm_error:null};let d=ma.join(tO,u),_,E=null;try{let{stdout:f,stderr:h}=await IF(i,{cwd:d});_=f?f.replace(`
|
|
19
19
|
`,""):null,E=h?h.replace(`
|
|
@@ -128,6 +128,6 @@ Reindexing upgrade started for transaction logs`),Oo.notify("Reindexing upgrade
|
|
|
128
128
|
Connection: close\r
|
|
129
129
|
\r
|
|
130
130
|
`))}},25).unref()}o.close?.(()=>{if(At.get(Zt.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&ad()==0)try{nK(oK(At.get(Zt.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)))}catch{}clearInterval(c),setTimeout(()=>{console.log("forced close server",i,kS),o.cantCleanupProperly||Nn.warn("Had to forcefully exit the thread",kS),process.exit(0)},5e3).unref()})}if(aK||process.env.DEV_MODE)try{require("inspector").close()}catch(i){Nn.info("Could not close debugger",i)}}}).ref();let e;pE&&!xhe&&(e=lK()),Promise.resolve(e).then(()=>{if(ad()===0)try{vhe(hI)}catch(t){console.error("Error displaying start-up log",t)}mE?.postMessage({type:Zt.ITC_EVENT_TYPES.CHILD_STARTED})})})}a(cK,"startServers");function lK(){let e=[];for(let t in Fi){let r=Fi[t];if(t.includes?.("/")&&ad()==0){whe(t)&&nK(t),e.push(new Promise((o,c)=>{r.listen({path:t},()=>{o({port:t,name:r.name,protocol_name:r.protocol_name}),Nn.info("Domain socket listening on "+t)}).on("error",c)}));continue}let n,s=At.get(Zt.CONFIG_PARAMS.HTTP_THREADRANGE);if(s){let o=typeof s=="string"?s.split("-"):s,c=ad();if(c<o[0]||c>o[1])continue}let i;try{let o=t.lastIndexOf(":");o>0?pE?n={fd:pE(+t.slice(o+1).replace(/[\[\]]/g,""),t.slice(0,o))}:n={host:+t.slice(o+1).replace(/[\[\]]/g,""),port:t.slice(0,o)}:pE?n={fd:pE(+t,"::")}:n={port:t}}catch(o){console.error(`Unable to bind to port ${t}`,o);continue}e.push(new Promise((o,c)=>{r.listen(n,()=>{o({port:t,name:r.name,protocol_name:r.protocol_name}),Nn.trace("Listening on port "+t,kS)}).on("error",c)}))}return Promise.all(e)}a(lK,"listenOnPorts");!fI&&!Rhe?.noServerStart&&cK();function SI(e,t,r){let n=e?.read?e:new yhe({fd:e,readable:!0,writable:!0,allowHalfOpen:!0}),s=Fi[t];if(s.isSecure&&(n.startTime=performance.now()),s)typeof s=="function"?s(n):s.emit("connection",n),r&&n.emit("data",r);else{let i=a(o=>{setTimeout(()=>{let c=Fi[t];c?(typeof c=="function"?c(n):c.emit("connection",n),r&&n.emit("data",r)):o<5?i(o+1):(Nn.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}a(SI,"deliverSocket");var X1=new Map;function khe(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=X1.get(s),r){case"connection":i=SI(void 0,t),X1.set(s,i),i.write=(c,l,u)=>(mE.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(mE.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let o=i.destroy;i.destroy=()=>{o.call(i),mE.postMessage({requestId:s,event:"destroy"})};break;case"data":i._readableState.destroyed||i.emit("data",Buffer.from(n,"latin1"));break;case"drain":i._readableState.destroyed||i.emit("drain",{});break;case"end":i._readableState.destroyed||i.emit("end",{});break;case"error":i._readableState.destroyed||i.emit("error",{});break}}a(khe,"proxyRequest");var{getComponentName:GS}=(Ff(),oe(kf));function TI(e,t,r=!0){t||(t=At.get(Zt.CONFIG_PARAMS.HTTP_PORT));let n=Fi[t];if(n){let s=n.lastServer||n;if(s===e)throw new Error(`Can not register the same server twice for the same port ${t}`);if(r&&!!s.sessionIdContext!=!!e.sessionIdContext&&+t)throw new Error(`Can not mix secure HTTPS and insecure HTTP on the same port ${t}`);s.off("unhandled",rK),s.on("unhandled",(i,o)=>{e.cantCleanupProperly&&(n.cantCleanupProperly=!0),e.emit("request",i,o)}),n.lastServer=e}else Fi[t]=e;e.on("unhandled",rK)}a(TI,"registerServer");function gI(e){let t=[],r=e?.securePort;return r&&t.push({port:r,secure:!0}),r=e?.port,r&&t.push({port:r,secure:!1}),t.length===0&&(t=[],At.get(Zt.CONFIG_PARAMS.HTTP_PORT)!=null&&t.push({port:At.get(Zt.CONFIG_PARAMS.HTTP_PORT),secure:At.get(Zt.CONFIG_PARAMS.CUSTOMFUNCTIONS_NETWORK_HTTPS)}),At.get(Zt.CONFIG_PARAMS.HTTP_SECUREPORT)!=null&&t.push({port:At.get(Zt.CONFIG_PARAMS.HTTP_SECUREPORT),secure:!0})),e?.isOperationsServer&&At.get(Zt.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&t.push({port:oK(At.get(Zt.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}a(gI,"getPorts");function AI(e,t){let r=[];for(let{port:n,secure:s}of gI(t))r.push(uK(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?pI[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,TI(e,n,!1)),FS[n]=$S(pI,n);return r}a(AI,"httpServer");function qS(e,t){let r=hI.get(e)??[];hI.set(e,[...r,t])}a(qS,"setPortServerMap");function uK(e,t,r,n){if(qS(e,{protocol_name:t?"HTTPS":"HTTP",name:GS()}),!xS[e]){let s=r?"operationsApi_network":"http",i=At.get(s+"_keepAliveTimeout"),o=At.get(s+"_timeout"),c=At.get(s+"_headersTimeout"),l={noDelay:!0,keepAliveTimeout:i,headersTimeout:c,requestTimeout:o,highWaterMark:128*1024,noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600,maxHeaderSize:At.get(Zt.CONFIG_PARAMS.HTTP_MAXHEADERSIZE)},u=At.get(s+"_mtls"),d=At.get(s+"_mtls_required");t&&Object.assign(l,{allowHTTP1:!0,rejectUnauthorized:!!d,requestCert:!!(u||n),ticketKeys:Phe(),SNICallback:iK(r?"operations-api":"server",u),ALPNCallback:a(function(f){return f.protocols.includes("harperdb-replication")&&(this.isReplicationConnection=!0),"http/1.1"},"ALPNCallback"),ALPNProtocols:null});let _=Uhe(),E=xS[e]=(t?Ihe:Ohe)(l,async(f,h)=>{try{let m=performance.now(),g=new sK(f,h);r&&(g.isOperationsServer=!0);let S=await FS[e](g);if(!S){if(g._nodeResponse.statusCode)return;S=dK(g)}if(S.headers?.set||(S.headers=new EI(S.headers)),_?S.headers?.set?.("Server","Unlicensed HarperDB, this should only be used for educational and development purposes"):S.headers?.set?.("Server","HarperDB"),S.status===-1){for(let ne of S.headers||[])h.setHeader(ne[0],ne[1]);return f.baseRequest=g,h.baseResponse=S,xS[e].emit("unhandled",f,h)}let y=S.status||200,I=performance.now(),U=I-m,H=S.body,X;if(!S.handlesHeaders){let ne=S.headers||new EI;H?H.length>=0&&(typeof H=="string"?ne.set("Content-Length",Buffer.byteLength(H)):ne.set("Content-Length",H.length),X=!0):(ne.set("Content-Length","0"),X=!0);let Q=`hdb;dur=${U.toFixed(2)}`;S.wasCacheMiss&&(Q+=", miss"),Mhe(ne,"Server-Timing",Q,!0),h.headersSent||h.writeHead(y,ne&&(ne[Symbol.iterator]?Array.from(ne):ne)),X&&h.end(H)}let Y=g.handlerPath,V=g.method;if(EE(U,"duration",Y,V,S.wasCacheMiss==null?void 0:S.wasCacheMiss?"cache-miss":"cache-hit"),Q1(y<400,"success",Y,V),Q1(1,"response_"+y,Y,V),!X)if(H instanceof ReadableStream&&(H=J1.fromWeb(H)),(H[Symbol.iterator]||H[Symbol.asyncIterator])&&(H=J1.from(H)),H?.pipe){H.pipe(h),H.destroy&&h.on("close",()=>{H.destroy()});let ne=0;H.on("data",Q=>{ne+=Q.length}),H.on("end",()=>{EE(performance.now()-I,"transfer",Y,V),EE(ne,"bytes-sent",Y,V)})}else H?.then?H.then(ne=>{h.end(ne)},T):h.end(H)}catch(m){T(m)}function T(m){let g=m.headers;h.writeHead(m.statusCode||500,g&&(g[Symbol.iterator]?Array.from(g):g)),h.end(m.toString()),m.statusCode?m.statusCode===500?Nn.warn(m):Nn.info(m):Nn.error(m)}a(T,"onError")});i>=0&&(E.keepAliveTimeout=i),c>=0&&(E.headersTimeout=c),t&&(E.ports||(E.ports=[]),E.ports.push(e),l.SNICallback.initialize(E),u&&(E.mtlsConfig=u),E.on("secureConnection",f=>{f._parent.startTime&&EE(performance.now()-f._parent.startTime,"tls-handshake",e),EE(f.isSessionReused(),"tls-reused",e)}),E.isSecure=!0),TI(E,e)}return xS[e]}a(uK,"getHTTPServer");function $S(e,t){let r=dK;for(let n=e.length;n>0;){let{listener:s,port:i}=e[--n];if(i===t||i==="all"){let o=r;r=a((...c)=>s(...c,o),"next_callback")}}return r}a($S,"makeCallbackChain");function dK(e){return e.user&&(e._nodeRequest.user=e.user),{status:-1,body:"Not found",headers:new EI}}a(dK,"unhandled");function Fhe(e,t){AI(e,{requestOnly:!0,...t})}a(Fhe,"onRequest");function Ghe(e,t){let r;if(t.securePort){qS(t.securePort,{protocol_name:"TLS",name:GS()});let n=iK("server",t.mtls);r=Dhe({rejectUnauthorized:!!t.mtls?.required,requestCert:!!t.mtls,noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600,SNICallback:n},e),n.initialize(r),Fi[t.securePort]=r}return t.port&&(qS(t.port,{protocol_name:"TCP",name:GS()}),r=bhe(e,{noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600}),Fi[t.port]=r),r}a(Ghe,"onSocket");Object.defineProperty(Nhe.prototype,"upgrade",{get(){return"connection"in this.headers&&"upgrade"in this.headers&&this.headers.connection.includes("Upgrade")&&this.headers.upgrade.toLowerCase()=="websocket"},set(e){}});var Z1=[],mI={};function _K(e,t){for(let{port:r}of gI(t))Z1[t?.runFirst?"unshift":"push"]({listener:e,port:r}),mI[r]=$S(Z1,r)}a(_K,"onUpgrade");var eK=[],tK={};function qhe(e,t){let r=[];for(let{port:n,secure:s}of gI(t)){qS(n,{protocol_name:s?"WSS":"WS",name:GS()});let i=uK(n,s,t?.isOperationsServer,t?.mtls);hE[n]||(hE[n]=new Che({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),hE[n].on("connection",(o,c)=>{let l=new sK(c);l.isWebSocket=!0;let u=FS[n](l);tK[n](o,l,u)}),_K((o,c,l,u)=>o.__harperdb_request_upgraded?u(o,c,l):hE[n].handleUpgrade(o,c,l,d=>{o.__harperdb_request_upgraded=!0,u(o,c,l),hE[n].emit("connection",d,o)}),{port:n}),i.on("upgrade",(o,c,l)=>{mI[n]&&mI[n](o,c,l)})),r.push(i),eK[t?.runFirst?"unshift":"push"]({listener:e,port:n}),tK[n]=$S(eK,n),FS[n]=$S(pI,n)}return r}a(qhe,"onWebSocket");function rK(e,t){t.writeHead(404),t.end(`Not found
|
|
131
|
-
`)}a(rK,"defaultNotFound")});var z1={};je(z1,{startHTTPThreads:()=>Vhe,startSocketServer:()=>II,updateWorkerIdleness:()=>gK});async function Vhe(e=2,t){try{if(t)OI(0,1,!0);else{let{loadRootComponents:r}=VS();if(e===0)return(0,Cs.setMainIsWorker)(!0),await RI().startServers(),Promise.resolve([]);await r()}TK();for(let r=0;r<e;r++)OI(r,e);return Promise.all(SK)}finally{(0,Cs.threadsHaveStarted)()}}function TK(){let e=(0,pK.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),bI=setInterval(()=>{WS.notify(e)},$he).unref())}function OI(e,t=1,r){if(yI++,(0,Cs.startWorker)("server/threads/threadServer.js",{name:_d.THREAD_TYPES.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((o,c)=>{function l(u){u.type===_d.CLUSTER_MESSAGE_TYPE_ENUM.CHILD_STARTED&&(n.removeListener("message",l),o(n))}a(l,"onMessage"),n.on("message",l),n.on("error",c)});SK.push(s),await s,cd.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",o=>{if(o.requestId){let c=YS.get(o.requestId);c&&c(o)}}),n.on("exit",i),n.on("shutdown",i);function i(){let o=cd.indexOf(n);o>-1&&cd.splice(o,1)}if(a(i,"removeWorker"),ld){let o=ld;ld=[];for(let c of o)mK[c.localPort](null,c)}}}),r){let n=setInterval(()=>{NI?NI=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,Cs.shutdownWorkers)(),yI=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function II(e=0,t){if(typeof e=="string")try{(0,jS.existsSync)(e)&&(0,jS.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=Khe:r=Yhe(t):r=wI;let n=(0,ud.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);if(n._handle){n._handle.onconnection=mK[e]=function(i,o){r.readsData||(o.reading=!1,o.readStop()),NI=!0,r(o,(c,l)=>{if(!c){if(fK){let d=o._socket||new ud.Socket({handle:o,writable:!0,readable:!0});fK.deliverSocket(d,e,l),d.resume()}else yI>0?(ld.length===0&&setTimeout(()=>{ld.length>0&&console.warn("Incoming sockets/requests have been queued for workers to start, and no workers have handled them. Check to make sure an error is not preventing workers from starting")},1e4).unref(),o.localPort=e,ld.push(o)):(console.log("start up a dynamic thread to handle request"),OI(0));mr(!1,"socket-routed");return}c.requests++;let u=o.fd;if(u>=0)c.postMessage({port:e,fd:u,data:l});else{let d=o._socket||new ud.Socket({handle:o,writable:!0,readable:!0});zhe(d,c,e)}mr(!0,"socket-routed")})};let s=Ou();WS.info(`HarperDB ${s.version} Server running on port ${e}`)}return n.on("error",s=>{console.error("Error in socket server",s)}),process.env._UNREF_SERVER&&n.unref(),n}function wI(e,t){let r,n=0;for(let s of cd){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=KS)return KS=i,t(r);n=i}KS=0,t(r)}function Khe(e,t){let r={};e.getpeername(r);let n=r.address,s=dd.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);wI(e,o=>{dd.set(n,{worker:o,lastUsed:i}),t(o)})}function Yhe(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new ud.Socket({handle:n,readable:!0,writable:!0});n._socket=i,i.on("data",o=>{n.readStop();let l=o.toString("latin1").match(t)?.[1],u=dd.get(l),d=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=d,s(u.worker);wI(n,_=>{dd.set(l,{worker:_,lastUsed:d}),s(_,o)})})}a(r,"findByHeaderAffinity")}function gK(){KS=0;for(let e of cd)e.expectedIdle=e.recentELU.idle+Whe,e.requests=1;cd.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function zhe(e,t,r){let n=jhe++;t.postMessage({port:r,requestId:n,event:"connection"}),e.on("data",s=>{let i=s.toString("latin1");t.postMessage({port:r,requestId:n,data:i,event:"data"})}).on("close",s=>{t.postMessage({port:r,requestId:n,event:"close",hadError:s})}).on("error",s=>{t.postMessage({port:r,requestId:n,event:"error",error:s})}).on("drain",s=>{t.postMessage({port:r,requestId:n,event:"drain",error:s})}).on("end",()=>{t.postMessage({port:r,requestId:n,event:"end"})}).resume(),YS.set(n,s=>{s.event=="data"&&e.write(Buffer.from(s.data,"latin1")),s.event=="end"&&(e.end(s.data&&Buffer.from(s.data,"latin1")),YS.delete(n)),s.event=="destroy"&&(e.destroy(),YS.delete(n))})}var Cs,ud,_d,WS,jS,hK,pK,cd,ld,mK,fK,yI,SK,bI,$he,NI,KS,EK,dd,Whe,YS,jhe,_I=Ie(()=>{Cs=L(dt()),ud=require("net"),_d=L(M()),WS=L(j()),jS=require("fs");Ii();hK=require("worker_threads"),pK=L(uc()),cd=[],ld=[],mK=[],yI=0,SK=[];hK.isMainThread&&(process.on("uncaughtException",e=>{e.code!=="ECONNRESET"&&e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,Cs.onMessageFromWorkers)(e=>{e.type===_d.ITC_EVENT_TYPES.RESTART&&bI&&(clearInterval(bI),TK())}));$he=6e5;a(Vhe,"startHTTPThreads");a(TK,"licenseWarning");a(OI,"startHTTPWorker");a(II,"startSocketServer");KS=0;a(wI,"findMostIdleWorker");EK=36e5,dd=new Map;a(Khe,"findByRemoteAddressAffinity");a(Yhe,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of dd)r.lastUsed+EK<e&&dd.delete(t)},EK).unref();Whe=1e3;a(gK,"updateWorkerIdleness");(0,Cs.setMonitorListener)(gK);YS=new Map,jhe=1;a(zhe,"proxySocket")});var bK=N((hLe,yK)=>{"use strict";var Qhe=require("cluster"),dl=se();dl.initSync();var RK=M(),uLe=require("util"),vo=j(),dLe=require("fs"),Jhe=require("fastify"),_Le=Ou(),Xhe=require("@fastify/cors"),Zhe=require("@fastify/compress"),epe=require("@fastify/static"),tpe=bN(),rpe=require("path"),{PACKAGE_ROOT:npe}=M(),spe=Fs(),ipe=re(),ope=xn(),ape=uc(),{server:cpe}=(qr(),oe(ja)),{node_request_key:fLe}=(RS(),oe(vN)),{authHandler:lpe,handlePostRequest:upe,serverErrorHandler:dpe,reqBodyValidationHandler:_pe}=TS(),ELe=require("net"),{registerContentHandlers:fpe}=($c(),oe(o$)),Epe=6e4,hpe=1024*1024*1024,ppe="TRUE",{CONFIG_PARAMS:TE}=RK,fd;yK.exports={hdbServer:AK,start:AK};async function AK(e){try{vo.debug("In Fastify server"+process.cwd()),vo.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),vo.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=Qhe.isMaster,await mpe();let t=e.securePort>0;fd=Spe(t),await fd.ready(),e||(e={}),e.isOperationsServer=!0;try{cpe.http(fd.server,e),fd.server.closeIdleConnections||await fd.listen({port:0,host:"::"})}catch(r){throw fd.close(),vo.error(r),vo.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),vo.fatal(t),process.exit(1)}}a(AK,"operationsServer");async function mpe(){vo.trace("Configuring HarperDB process."),spe.setSchemaDataToGlobal(),await ope.setUsersToGlobal(),await ape.getLicense()}a(mpe,"setUp");function Spe(e){vo.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=Tpe(e),r=Jhe(t);r.server.headersTimeout=Ape(),r.setErrorHandler(dpe);let n=gpe();n&&r.register(Xhe,n),r.register(function(i,o,c){i.setNotFoundHandler(function(l,u){r.server.emit("unhandled",l.raw,u.raw)}),c()}),r.register(tpe),r.register(Zhe),r.register(epe,{root:rpe.join(npe,"studio/build-local")}),fpe(r);let s=dl.get(RK.HDB_SETTINGS_NAMES.LOCAL_STUDIO_ON);return r.get("/",function(i,o){return!ipe.isEmpty(s)&&s.toString().toLowerCase()==="true"?o.sendFile("index.html"):o.sendFile("running.html")}),r.post("/",{preValidation:[_pe,lpe],config:{isOperation:!0}},async function(i,o){return i.body?.operation?.startsWith("restart")&&o.header("Connection","close"),upe(i,o)}),r.get("/health",()=>"HarperDB is running."),vo.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}a(Spe,"buildServer");function Tpe(e){let t=dl.get(TE.OPERATIONSAPI_NETWORK_TIMEOUT),r=dl.get(TE.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:hpe,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}a(Tpe,"getServerOptions");function gpe(){let e=dl.get(TE.OPERATIONSAPI_NETWORK_CORS),t=dl.get(TE.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===ppe)&&(r={origin:!0,allowedHeaders:["Content-Type","Authorization","Accept"],credentials:!1},t&&t.length>0&&t[0]!==null&&t[0]!=="*"&&(r.origin=(n,s)=>s(null,t.indexOf(n)!==-1))),r}a(gpe,"getCORSOpts");function Ape(){return dl.get(TE.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??Epe}a(Ape,"getHeaderTimeoutConfig")});var UI={};je(UI,{disableNATS:()=>ype,publishToStream:()=>JS,setNATSReplicator:()=>CI,setPublishToStream:()=>bpe,setSubscription:()=>MI,start:()=>Rpe});function Rpe(){gE.default.get(AE.default.CONFIG_PARAMS.CLUSTERING_ENABLED)&&Npe()}function ype(e=!0){CK=e}function bpe(e,t){JS=e,MI=t}function Npe(){if(CK||process.env._DISABLE_NATS)return;let e=ut(),t=Object.keys(e);t.push("system");for(let r of t){let n=e[r];for(let s in n){let i=n[s];CI(s,r,i)}}Nc((r,n)=>{CI(r.tableName,r.databaseName,r),n&&PK(r)}),!OK&&(OK=!0)}function CI(e,t,r){if(t==="system"&&Ipe.includes(e))return;if(!r)return console.error(`Attempt to replicate non-existent table ${e} from database ${t}`);if(r.sources.some(s=>s?.isNATSReplicator))return;r.sourcedFrom(class extends Pr{static{a(this,"NATSReplicator")}put(i){return n(this.getContext()).addWrite(t,{operation:"put",table:e,id:this[ze],record:i})}delete(){return n(this.getContext()).addWrite(t,{operation:"delete",table:e,id:this[ze]})}publish(i){return n(this.getContext()).addWrite(t,{operation:"publish",table:e,id:this[ze],record:i})}patch(i){return n(this.getContext()).addWrite(t,{operation:"patch",table:e,id:this[ze],record:i})}invalidate(){n(this.getContext()).addWrite(t,{operation:"invalidate",table:e,id:this[ze]})}static defineSchema(i){PK(i)}static subscribe(){let i=new Pn;return MI(t,e,i),i}static subscribeOnThisThread(i){return i<(gE.default.get(AE.default.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??Ope)}static isEqual(i){return i.isNATSReplicator}static isNATSReplicator=!0;static shouldReceiveInvalidations=!0},{intermediateSource:!0});function n(s){let i=s?.transaction?.nats;if(!i)if(s?.transaction){s.transaction.nats=i=new zS(s.transaction,s);let o=s.transaction;for(;o.next;)o=o.next;o.next=s.transaction.nats,i.user=s.user,i.context=s}else i=DK;return i}a(n,"getNATSTransaction")}function PK(e){let t=gE.default.get(AE.default.CONFIG_PARAMS.CLUSTERING_NODENAME);JS(`${PI.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,LI.createNatsTableStreamName)(e.databaseName,e.tableName),void 0,{operation:"define_schema",schema:e.databaseName,table:e.tableName,attributes:e.attributes,__origin:{timestamp:Date.now(),node_name:t}})}var NK,PI,LI,IK,wK,gE,AE,QS,CK,JS,MI,Ope,DK,OK,Ipe,zS,DI,LK=Ie(()=>{De();Vs();NK=L(Tr()),PI=L(It()),LI=L(Xi());Cl();IK=L(XS()),wK=L(sn()),gE=L(se()),AE=L(M()),QS=L(j());a(Rpe,"start");a(ype,"disableNATS");JS=NK.publishToStream,MI=IK.setSubscription;a(bpe,"setPublishToStream");Ope=2;a(Npe,"assignReplicationSource");Ipe=["hdb_job","hdb_analytics","hdb_raw_analytics","hdb_info","hdb_license"];a(CI,"setNATSReplicator");a(PK,"publishSchema");zS=class{constructor(t,r){this.transaction=t;this.options=r}static{a(this,"NATSTransaction")}user;writes_by_db=new Map;addWrite(t,r){r.expiresAt=this.context?.expiresAt;let n=this.writes_by_db.get(t);n||this.writes_by_db.set(t,n=[]),n.push(r)}commit({timestamp:t}){let r=gE.default.get(AE.default.CONFIG_PARAMS.CLUSTERING_NODENAME),n=[];for(let[s,i]of this.writes_by_db){let o=[],c=[],l,u;for(let d of i){let _=d.table,E=d.operation=="put"?"upsert":d.operation;l||(QS.trace(`Sending transaction event ${E}`),u=l={operation:E,schema:s,table:_,__origin:{user:this.user?.username,timestamp:t,node_name:r}},l.hash_values=c,E!=="delete"&&E!=="invalidate"&&(l.records=o)),l.table===_&&l.operation===E?(o.push(d.record),c.push(d.id)):u=u.next={operation:E,table:_,id:d.id,record:d.record},d.expiresAt&&(u.expiresAt=d.expiresAt)}l&&n.push(JS(`${PI.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,LI.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw QS.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},DI=class extends zS{static{a(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,wK.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};DK=new DI});async function HK({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let o=await vI.get(e,{returnNonexistent:!0});i=new xI(e,t,o),o&&(i.sessionWasPresent=!0)}else{if(e){let o=await vI.get(e);o&&o.delete()}i=new eT(e,t)}return n&&(n.id=e,n.user={username:t?.username},RE.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function BI(){return ZS++,ZS>65500&&(ZS=1),ZS}function HI(e,t,r){let{topic:n,retain:s}=e;e.data=t,e.async=!0,r.authorize=!0;let i=Oi.getMatch(n,"mqtt");if(!i)throw new Error(`Can not publish to topic ${n} as it does not exist, no resource has been defined to handle this topic`);e.url=i.relativeURL;let o=i.Resource;return Dt(r,()=>s?t===void 0?o.delete(e,r):o.put(e,e.data,r):o.publish(e,e.data,r))}var UK,Ma,vK,BK,MK,vI,RE,ZS,eT,xI,xK=Ie(()=>{De();Zl();UK=L(sn()),Ma=L(j());pc();vK=L(dt()),BK=L(RI());qr();MK=100,vI=Et({database:"system",table:"hdb_durable_session",attributes:[{name:"id",isPrimaryKey:!0},{name:"subscriptions",type:"array",elements:{attributes:[{name:"topic"},{name:"qos"},{name:"startTime"},{name:"acks"}]}}]}),RE=Et({database:"system",table:"hdb_session_will",attributes:[{name:"id",isPrimaryKey:!0},{name:"topic",type:"string"},{name:"data"},{name:"qos",type:"number"},{name:"retain",type:"boolean"},{name:"user",type:"any"}]});(0,vK.getWorkerIndex)()===0&&(async()=>{await BK.when_components_loaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of RE.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await it.getUser(r.user.username));try{await HI(r,t,r)}catch{(0,Ma.warn)("Failed to publish will",t)}RE.delete(e.id)}})();a(HK,"getSession");ZS=1;a(BI,"getNextMessageId");eT=class{static{a(this,"SubscriptionsSession")}listener;sessionId;user;request;socket;subscriptions=[];awaitingAcks;sessionWasPresent;keepalive;keepaliveTimer;constructor(t,r){this.sessionId=t,this.user=r}async addSubscription(t,r,n){let{topic:s,rh:i,startTime:o}=t,c=s.indexOf("?"),l,u;if(c>-1?(l=s.slice(c),u=s.slice(0,c)):u=s,!u)throw new Error("No topic provided");if(u.indexOf(".")>-1)throw new Error("Dots are not allowed in topic names");let d=this.subscriptions.find(g=>g.topic===s),_;d?(_=i>0,d.end(),this.subscriptions.splice(this.subscriptions.indexOf(d),1)):_=i===2;let E={search:l,async:!0,user:this.user,startTime:o,omitCurrent:_,url:""};o&&(0,Ma.trace)("Resuming subscription from",s,"from",o);let f=Oi.getMatch(u,"mqtt");if(!f){let g=new Error(`The topic ${s} does not exist, no resource has been defined to handle this topic`);throw g.statusCode=404,g}if(E.url=f.relativeURL,E.url.indexOf("+")>-1||E.url.indexOf("#")>-1){let g=E.url.slice(1);if(g.indexOf("#")>-1&&g.indexOf("#")!==g.length-1)throw new Error("Multi-level wildcards can only be used at the end of a topic");if(E.isCollection=!0,g.indexOf("+")===g.length-1)E.onlyChildren=!0,E.url="/"+g.slice(0,g.length-1);else{let S=g.split("/"),y;for(let H=0;H<S.length;H++)if(S[H].indexOf("+")>-1)if(S[H]==="+")y=!0;else throw new Error("Single-level wildcards can only be used as a topic level (between or after slashes)");if(n&&y)throw new Error("Filters can not be combined");let I=!0;S[S.length-1]==="#"&&(S.length--,I=!1),y&&(n=a(H=>{let X=H.id;if(!Array.isArray(X)||I&&X.length!==S.length)return!1;for(let Y=0;Y<S.length;Y++)if(S[Y]!=="+"&&S[Y]!==X[Y])return!1;return!0},"filter"));let U=S.indexOf("+");E.url="/"+(U>-1?S.slice(0,U):S).concat("").join("/")}}let h=f.path,T=f.Resource,m=await Dt(E,async()=>{let g=this.createContext();g.topic=s,g.retainHandling=i;let S=await T.subscribe(E,g);if(!S)return;if(!S[Symbol.asyncIterator])throw new Error(`Subscription is not (async) iterable for topic ${s}`);let y=(async()=>{for await(let I of S)try{let U;if(I.type&&I.type!=="put"&&I.type!=="delete"&&I.type!=="message"&&I.type!=="patch"||n&&!n(I))continue;r?(I.topic=s,U=this.needsAcknowledge(I)):(I.acknowledge?.(),U=BI());let H=I.id;if(Array.isArray(H)&&(H=Xl(H)),H==null&&(H=""),await this.listener(h+"/"+H,I.value,U,t)===!1)break;this.awaitingAcks?.size>MK?await new Promise(Y=>setTimeout(Y,this.awaitingAcks.size-MK)):await new Promise(setImmediate)}catch(U){(0,Ma.warn)(U)}})();return S});if(m)return m.topic=s,m.qos=t.qos,this.subscriptions.push(m),m}resume(){}needsAcknowledge(t){let r=BI();return t.acknowledge&&(this.awaitingAcks||(this.awaitingAcks=new Map),this.awaitingAcks.set(r,{acknowledge:t.acknowledge})),r}acknowledge(t){let r=this.awaitingAcks?.get(t);r&&(this.awaitingAcks.delete(t),r.acknowledge())}async removeSubscription(t){let r=this.subscriptions.find(n=>n.topic===t);if(r)return r.end(),this.subscriptions.splice(this.subscriptions.indexOf(r),1),!0}async publish(t,r){return HI(t,r,this.createContext())}createContext(){let t={session:this,socket:this.socket,user:this.user,authorize:!0};return this.request&&(t.request=this.request,t.url=this.request.url,t.headers=this.request.headers),t}setListener(t){this.listener=t}disconnect(t){this.keepaliveTimer&&clearTimeout(this.keepaliveTimer);let r=this.createContext();Dt(r,async()=>{try{if(!t){let n=await RE.get(this.sessionId);n?.doesExist()&&await HI(n,n.data,r)}}finally{await RE.delete(this.sessionId)}}).catch(n=>{(0,Ma.warn)(`Error publishing MQTT will for ${this.sessionId}`,n)});for(let n of this.subscriptions)n.end();this.subscriptions=[]}receivedPacket(){this.keepalive&&(clearTimeout(this.keepaliveTimer),this.keepaliveTimer=setTimeout(()=>{this.socket?.destroy?this.socket.destroy(new Error("Keepalive timeout")):this.socket?.terminate()},this.keepalive*1500))}};a(HI,"publish");xI=class extends eT{static{a(this,"DurableSubscriptionsSession")}sessionRecord;constructor(t,r,n){super(t,r),this.sessionRecord=n||{id:t,subscriptions:[]}}async resume(){for(let t of this.sessionRecord.subscriptions||[])await this.resumeSubscription({omitCurrent:!0,topic:t.topic,qos:t.qos,startTime:t.startTime},!0,t.acks?r=>!t.acks.includes(r.localTime):null)}resumeSubscription(t,r,n){return super.addSubscription(t,r,n)}needsAcknowledge(t){this.awaitingAcks||(this.awaitingAcks=new Map);let r=BI(),n={topic:t.topic,timestamp:t.localTime};return t.acknowledge&&(n.acknowledge=t.acknowledge),this.awaitingAcks.set(r,n),r}acknowledge(t){let r=this.awaitingAcks?.get(t);if(!r)return;this.awaitingAcks?.delete(t),r.acknowledge?.();let n=r.topic;for(let[,s]of this.awaitingAcks)if(s.topic===n&&s.timestamp<r.timestamp){for(let i of this.sessionRecord.subscriptions)if(i.topic===n){i.acks||(i.acks=[]),i.acks.push(r.timestamp),(0,Ma.trace)("Received ack",n,r.timestamp),this.sessionRecord.update();return}}for(let s of this.sessionRecord.subscriptions)s.topic===n&&(s.startTime=r.timestamp);this.sessionRecord.update()}async addSubscription(t,r){await this.resumeSubscription(t,r);let{qos:n,startTime:s}=t;return n>0&&!s&&this.saveSubscriptions(),t.qos}removeSubscription(t){let r=this.subscriptions.find(s=>s.topic===t),n=super.removeSubscription(t);return r.qos>0&&this.saveSubscriptions(),n}saveSubscriptions(){this.sessionRecord.subscriptions=this.subscriptions.map(t=>{let r=t.startTime;return r||(r=t.startTime=(0,UK.getNextMonotonicTime)()),(0,Ma.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),vI.put(this.sessionRecord)}}});var FI={};je(FI,{bypassAuth:()=>wpe,start:()=>Cpe});function wpe(){$K=!0}function Cpe({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new qK.EventEmitter},e.mqtt.events.on("error",()=>{}));let o=e.mqtt,c=[],l=r?.mtls;return n&&(c=e.ws((u,d,_,E)=>{if(d.headers.get("sec-websocket-protocol")!=="mqtt")return E(u,d,_);o.events.emit("connection",u),dr.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:f,onClose:h}=FK(u,T=>{u.send(T)},d,Promise.resolve(_).then(()=>d?.user),o);u.on("message",f),u.on("close",h),u.on("error",T=>{dr.info?.("WebSocket error",T)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(o.events.emit("connection",u),dr.debug?.(`Received ${u.getCertificate?"SSL":"TCP"} connection for MQTT from ${u.remoteAddress}`),l){if(u.authorized)try{let f=l.user;if(f!==null){(f===void 0||f==="Common Name"||f==="CN")&&(f=u.getPeerCertificate().subject.CN);try{d=await e.getUser(f,null,null),(0,Ed.get)(xr.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&rT.notify?.({username:d?.username,status:xr.AUTH_AUDIT_STATUS.SUCCESS,type:xr.AUTH_AUDIT_TYPES.AUTHENTICATION,auth_strategy:"MQTT mTLS",remote_address:u.remoteAddress})}catch(h){throw(0,Ed.get)(xr.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&rT.error?.({username:f,status:xr.AUTH_AUDIT_STATUS.FAILURE,type:xr.AUTH_AUDIT_TYPES.AUTHENTICATION,auth_strategy:"mqtt",remote_address:u.remoteAddress}),h}}else dr.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(f){o.events.emit("error",f,u),dr.error?.(f)}else if(l.required)return dr.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&$K&&u.remoteAddress.includes("127.0.0.1")&&(d=await(0,GK.getSuperUser)(),dr.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:_,onClose:E}=FK(u,f=>u.write(f),null,d,o);u.on("data",_),u.on("close",E),u.on("error",f=>{dr.info?.("Socket error",f)})},{port:t,securePort:s,mtls:l})),c}function FK(e,t,r,n,s){kK||(kK=!0,Y_(_=>{tT>0&&_.push({metric:"mqtt-connections",connections:tT,byThread:!0})}));let i;tT++;let o,c={protocolVersion:4},l=(0,nT.parser)({protocolVersion:5});function u(_){l.parse(_)}a(u,"onMessage");function d(){tT--,i||(i=!0,o?.disconnect?.(),s.events.emit("disconnected",o,e),s.sessions.delete(o),qn(!1,"connection","mqtt","disconnect"),dr.debug?.("MQTT connection was closed",e.remoteAddress))}return a(d,"onClose"),l.on("packet",async _=>{n?.then&&(n=await n);let E=_.cmd;if(o)o.then&&await o;else if(E!=="connect"){dr.info?.("Received packet before connection was established, closing connection"),e?.destroy?e.destroy():e?.terminate();return}let f=_.topic,h=f?.indexOf("/",1),T=h>0?f.slice(0,h):f;mr(_.length,"bytes-received",T,g(_),"mqtt");try{switch(o?.receivedPacket?.(),E){case"connect":if(c.protocolVersion=_.protocolVersion,_.username)try{n=await it.getUser(_.username,_.password.toString(),r),(0,Ed.get)(xr.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&rT.notify?.({username:n?.username,status:xr.AUTH_AUDIT_STATUS.SUCCESS,type:xr.AUTH_AUDIT_TYPES.AUTHENTICATION,auth_strategy:"MQTT",remote_address:e.remoteAddress})}catch(V){return(0,Ed.get)(xr.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&rT.error?.({username:_.username,status:xr.AUTH_AUDIT_STATUS.FAILURE,type:xr.AUTH_AUDIT_TYPES.AUTHENTICATION,auth_strategy:"mqtt",remote_address:e.remoteAddress}),s.events.emit("auth-failed",_,e,V),qn(!1,"connection","mqtt","connect"),m({cmd:"connack",reasonCode:4,returnCode:134})}if(!n&&s.requireAuthentication)return s.events.emit("auth-failed",_,e),qn(!1,"connection","mqtt","connect"),m({cmd:"connack",reasonCode:4,returnCode:134});try{if(s.authorizeClient?.(_,n),_.will){let V=e.deserialize||(e.deserialize=Ro(r?.headers.get?.("content-type")));_.will.data=_.will.payload?.length>0?V(_.will.payload):void 0,delete _.will.payload}o=HK({user:n,..._}),o=await o,o.socket=e,r&&(o.request=r),s.sessions.add(o)}catch(V){return dr.error?.(V),s.events.emit("auth-failed",_,e,V),qn(!1,"connection","mqtt","connect"),m({cmd:"connack",reasonCode:V.code||5,returnCode:V.code||128})}s.events.emit("connected",o,e),qn(!0,"connection","mqtt","connect"),m({cmd:"connack",sessionPresent:o.sessionWasPresent,reasonCode:0,returnCode:0}),o.setListener((V,ne,Q,de)=>{try{if(i)throw new Error("Session disconnected while trying to send message to",V);let W=V.indexOf("/",1),ae=W>0?V.slice(0,W):V;m({cmd:"publish",topic:V,payload:S(ne),messageId:Q||Math.floor(Math.random()*1e8),qos:de.qos},ae);let Oe=e._socket??e;return Oe.writableNeedDrain?new Promise(Ne=>Oe.once("drain",Ne)):!Oe.closed}catch(W){return dr.error?.(W),o?.disconnect(),s.sessions.delete(o),!1}}),o.sessionWasPresent&&await o.resume();break;case"subscribe":let y=[];for(let V of _.subscriptions){let ne;try{let Q=await o.addSubscription(V,V.qos>=1);ne=Q?Q.qos||0:c.protocolVersion<5?128:143}catch(Q){s.events.emit("error",Q,e,V,o),Q.statusCode?Q.statusCode===500?dr.warn?.(Q):dr.info?.(Q):dr.error?.(Q),ne=c.protocolVersion<5?128:Q.statusCode===403?135:Q.statusCode===404?143:128}y.push(ne)}await o.committed,m({cmd:"suback",granted:y,messageId:_.messageId});break;case"unsubscribe":{let V=[];for(let ne of _.unsubscriptions)V.push(o.removeSubscription(ne)?0:17);m({cmd:"unsuback",granted:V,messageId:_.messageId});break}case"pubrel":m({cmd:"pubcomp",messageId:_.messageId,reasonCode:0});return;case"publish":let I=_.qos===2?"pubrec":"puback",U=e.deserialize||(e.deserialize=Ro(r?.headers.get?.("content-type"))),X=(_.payload?.length||0)>0?U(_.payload):void 0,Y;try{Y=await o.publish(_,X)}catch(V){s.events.emit("error",V,e,_,o),dr.warn?.(V),_.qos>0&&m({cmd:I,messageId:_.messageId,reasonCode:128},_.topic);break}_.qos>0&&m({cmd:I,messageId:_.messageId,reasonCode:Y===!1?144:0},_.topic);break;case"pubrec":m({cmd:"pubrel",messageId:_.messageId,reasonCode:0});break;case"pubcomp":case"puback":o.acknowledge(_.messageId);break;case"pingreq":m({cmd:"pingresp"});break;case"disconnect":i=!0,o?.disconnect(!0),s.events.emit("disconnected",o,e),s.sessions.delete(o),qn(!0,"connection","mqtt","disconnect"),dr.debug?.("Received disconnect command, closing MQTT session",e.remoteAddress),e.close?e.close():e.end();break}}catch(y){s.events.emit("error",y,e,_,o),dr.error?.(y),m({cmd:"disconnect"})}function m(y,I){let U=(0,nT.generate)(y,c);t(U),mr(U.length,"bytes-sent",I,g(y),"mqtt")}a(m,"sendPacket");function g(y){return y.qos>0?y.cmd+",qos="+y.qos:y.cmd}a(g,"packetMethodName");function S(y){return qc(y,r)}a(S,"serialize")}),l.on("error",_=>{dr.warn("MQTT parsing error, closing connection:",_.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var nT,GK,Ed,xr,kI,qK,rT,dr,$K,kK,tT,VK=Ie(()=>{nT=require("mqtt-packet");xK();GK=L(xn());$c();Ii();qr();Ed=L(se()),xr=L(M()),kI=L(Sc()),qK=require("events"),rT=(0,kI.loggerWithTag)("auth-event"),dr=(0,kI.loggerWithTag)("mqtt"),$K=(0,Ed.get)(xr.CONFIG_PARAMS.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;a(wpe,"bypassAuth");a(Cpe,"start");tT=0;a(FK,"onSocket")});var kf={};je(kf,{component_errors:()=>pd,getComponentName:()=>Upe,loadComponent:()=>oT,loadComponentDirectories:()=>JK,setErrorReporter:()=>Mpe});function JK(e,t){t&&(qI=t),e&&($I=e);let r=[];if((0,Nt.existsSync)(GI)){let s=(0,Nt.readdirSync)(GI,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let o=i.name,c=(0,Ot.join)(GI,o);r.push(oT(c,qI,"hdb",!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(oT(n,qI,n,!1,null,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{QK=!0})}function Mpe(e){yE=e}async function oT(e,t,r,n,s,i){let o=(0,Nt.realpathSync)(e);if(sT.has(o))return sT.get(o);sT.set(o,!0),s&&($I=s);try{let c;n&&(pd=new Map);let l=(0,Ot.join)(e,n?"harperdb-config.yaml":"config.yaml");(0,Nt.existsSync)(l)?c=n?(0,aT.getConfigObj)():(0,YK.parseDocument)((0,Nt.readFileSync)(l,"utf8")).toJSON():c=VI;let u=(0,Ot.join)(e,"node_modules","harperdb");try{_l.isMainThread&&(n||(0,Nt.existsSync)(u)&&(0,Nt.realpathSync)(Sd.PACKAGE_ROOT)!==(0,Nt.realpathSync)(u))&&((0,Nt.rmSync)(u,{recursive:!0,force:!0}),(0,Nt.existsSync)((0,Ot.join)(e,"node_modules"))||(0,Nt.mkdirSync)((0,Ot.join)(e,"node_modules")),(0,Nt.symlinkSync)(Sd.PACKAGE_ROOT,u,"dir"))}catch(E){hd.default.error("Error symlinking harperdb module",E)}let d=iT,_=n;for(let E in c){iT=E;let f=c[E];if(pd.set(n?E:(0,Ot.basename)(e),!1),!f)continue;let h,T=f.package;try{if(T){let I=e,U;for(;!(0,Nt.existsSync)(U=(0,Ot.join)(I,"node_modules",E));)if(I=(0,Ot.dirname)(I),I.length<(0,zK.getHdbBasePath)().length){U=null;break}if(U)h=await oT(U,t,r,!1),_=!0;else throw new Error(`Unable to find package ${E}:${T}`)}else h=Lpe[E];if(!h)continue;let m=a(I=>(I.origin=r,Et(I)),"ensureTable"),g=f.network||(f.port||f.securePort)&&f,S=g?.securePort||g?.https&&g.port,y=!g?.https&&g?.port;if(_l.isMainThread&&(h=await h.startOnMainThread?.({server:it,ensureTable:m,port:y,securePort:S,resources:t,...f})||h,n&&g))for(let I of[y,S])try{if(+I&&!KK.includes(I)){let U=KI.get(Sd.CONFIG_PARAMS.HTTP_SESSIONAFFINITY);U&&hd.default.warn("Session affinity is not recommended and may cause memory leaks"),(U||!AS)&&(KK.push(I),II(I,U))}}catch(U){console.error("Error listening on socket",I,U,E)}if(t.isWorker&&(h=await h.start?.({server:it,ensureTable:m,port:y,securePort:S,resources:t,...f})||h),$I.set(h,!0),(h.handleFile||h.handleDirectory||h.setupFile||h.setupDirectory)&&f.files!=null){if(f.files.includes(".."))throw(0,jK.handleHDBError)("Can not reference parent directories");let I=(0,Ot.join)(e,f.files).replace(/\\/g,"/"),U=I.indexOf("/*");if(U>-1&&f.files!==VI[E]?.files&&!(0,Nt.existsSync)(I.slice(0,U)))throw new Error(`The path '${I.slice(0,U)}' does not exist and cannot be used as the base of the resolved 'files' path value '${f.files}'`);let H=(0,Ot.basename)(e),X=f.path||"/";X=X.startsWith("/")?X:X.startsWith("./")?"/"+H+X.slice(2):X==="."?"/"+H:"/"+H+"/"+X;let Y,V,ne;if(f.root){let de=f.root;de.startsWith("/")&&(de=de.slice(1)),de.endsWith("/")&&(de=de.slice(0,-1)),de+="/",V=(0,Ot.join)(e,de)}else(ne=I.indexOf("/*"))>-1?(V=I.slice(0,ne+1),Y=(0,Ot.relative)(e,V)):f.files.indexOf("/")>-1&&(V=I.slice(0,I.lastIndexOf("/")+1),Y=(0,Ot.relative)(e,V));let Q=!1;if(_l.isMainThread&&h.setupDirectory&&(Q=await h.setupDirectory?.(X,V,t)),t.isWorker&&h.handleDirectory&&(Q=await h.handleDirectory?.(X,V,t)),Q){_=!0;continue}for(let de of await(0,WK.default)(I,{onlyFiles:!1,objectMode:!0})){let{path:W,dirent:ae}=de;_=!0;let Oe=(0,Ot.relative)(e,W).replace(/\\/g,"/");if(Y)if(Oe.startsWith(Y))Oe=Oe.slice(Y.length+1);else throw new Error(`The root path '${f.root}' does not reference a valid part of the file path '${Oe}'.The root path should be used to indicate the relative path/part of the file path for determining the exported web path.`);let Ne=X+(X.endsWith("/")?"":"/")+Oe;try{if(ae.isFile()){let Me=await Ppe(W);_l.isMainThread&&await h.setupFile?.(Me,Ne,W,t),t.isWorker&&await h.handleFile?.(Me,Ne,W,t)}else _l.isMainThread&&await h.setupDirectory?.(Ne,W,t),t.isWorker&&await h.handleDirectory?.(Ne,W,t)}catch(Me){Me.message=`Could not load ${ae.isFile()?"file":"directory"} '${W}'${f.module?" using '"+f.module+"'":""} for application '${e}' due to: ${Me.message}`,yE?.(Me),((0,md.getWorkerIndex)()===0?console:hd.default).error(Me),t.set(f.path||"/",new Xo(Me)),pd.set(n?E:(0,Ot.basename)(e),Me.message)}}}}catch(m){m.message=`Could not load component '${E}' for application '${(0,Ot.basename)(e)}' due to: ${m.message}`,yE?.(m),((0,md.getWorkerIndex)()===0?console:hd.default).error(m),t.set(f.path||"/",new Xo(m),null,!0),pd.set(n?E:(0,Ot.basename)(e),m.message)}}if(iT=d,_l.isMainThread&&!QK&&i&&(0,md.watchDir)(e,async()=>JK()),c.extensionModule){let E=await dS((0,Ot.join)(e,c.extensionModule));return sT.set(o,E),E}if(!_&&t.isWorker){let E=`${e} did not load any modules, resources, or files, is this a valid component?`;yE?.(new Error(E)),((0,md.getWorkerIndex)()===0?console:hd.default).error(E),pd.set((0,Ot.basename)(e),E)}}catch(c){console.error(`Could not load application directory ${e}`,c),c.message=`Could not load application due to ${c.message}`,yE?.(c),t.set("",new Xo(c))}}var Nt,Ot,_l,YK,KI,Sd,WK,md,hd,jK,zK,Dpe,aT,Ppe,GI,$I,QK,qI,pd,Lpe,VI,KK,sT,yE,iT,Upe,Ff=Ie(()=>{Nt=require("fs"),Ot=require("path"),_l=require("worker_threads"),YK=require("yaml"),KI=L(se()),Sd=L(M());eD();p$();g$();b$();O$();k$();SV();bV();WK=L(require("fast-glob")),md=L(dt()),hd=L(j());cN();qr();jK=L(_e());De();_I();zK=L(se()),Dpe=L(bK());Nm();LK();ls();VK();aT=L(Ct());RS();WR();({readFile:Ppe}=Nt.promises),GI=(0,aT.resolvePath)(KI.get(Sd.CONFIG_PARAMS.COMPONENTSROOT)),$I=new Map,pd=new Map;a(JK,"loadComponentDirectories");Lpe={REST:pS,rest:pS,graphql:oN,graphqlSchema:Rg,roles:aN,jsResource:uN,fastifyRoutes:DN,login:_N,static:PN,operationsApi:Dpe,customFunctions:{},http:{},clustering:UI,replication:oa,authentication:Nf,mqtt:FI},VI={rest:!0,graphql:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js",path:"."}};Object.defineProperty(VI,"static",{value:{files:"web/**"}});KK=[],sT=new Map;a(Mpe,"setErrorReporter");Upe=a(()=>iT,"getComponentName");a(oT,"loadComponent")});var VS=N(($Le,ZK)=>{var{isMainThread:XK}=require("worker_threads"),{getTables:vpe,getDatabases:GLe,table:qLe}=(De(),oe(lt)),{loadComponentDirectories:Bpe,loadComponent:Hpe}=(Ff(),oe(kf)),{resetResources:xpe}=(Zl(),oe(n0)),kpe=rO(),Fpe=Ct(),{dirname:Gpe}=require("path"),{getConnection:qpe}=Tr(),$pe=se(),{CONFIG_PARAMS:Vpe}=M(),{loadCertificates:Kpe}=Js(),YI=new Map;async function Ype(e=!1){!XK&&$pe.get(Vpe.CLUSTERING_ENABLED)&&qpe();try{XK&&await kpe()}catch(n){console.error(n)}let t=xpe();vpe(),t.isWorker=e,await Kpe(),await Hpe(Gpe(Fpe.getConfigFilePath()),t,"hdb",!0,YI),await Bpe(YI,t);let r=[];for(let[n]of YI)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}a(Ype,"loadRootComponents");ZK.exports.loadRootComponents=Ype});var dt=N((KLe,oi)=>{"use strict";var{Worker:Wpe,MessageChannel:jpe,parentPort:Gi,isMainThread:JI,threadId:zpe,workerData:qi}=require("worker_threads"),{PACKAGE_ROOT:Qpe}=M(),{join:nY,isAbsolute:Jpe,extname:Xpe}=require("path"),{server:sY}=(qr(),oe(ja)),{watch:Zpe,readdir:eme}=require("fs/promises"),{totalmem:eY}=require("os"),bE=M(),iY=se(),$i=j(),{randomBytes:tme}=require("crypto"),{_assignPackageExport:rme}=_i(),nme=M(),tY=1024*1024,Ua=[],Ds=[],sme=50,XI=1e4,ime="restart",oY="request_thread_info",aY="resource_report",cY="thread_info",lY="added-port",ome="ack",WI;rme("threads",Ds);oi.exports={startWorker:jI,restartWorkers:ew,shutdownWorkers:dme,workers:Ua,setMonitorListener:Tme,onMessageFromWorkers:_me,onMessageByType:pY,broadcast:Eme,broadcastWithAcknowledgement:pme,setChildListenerByType:ume,getWorkerIndex:uY,getWorkerCount:dY,getTicketKeys:fY,setMainIsWorker:cme,setTerminateTimeout:ame,restartNumber:qi?.restartNumber||1};Ds.onMessageByType=pY;Ds.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=Ds.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};oi.exports.whenThreadsStarted=new Promise(e=>{oi.exports.threadsHaveStarted=e});var ZI;function ame(e){XI=e}a(ame,"setTerminateTimeout");function uY(){return qi?qi.workerIndex:ZI?0:void 0}a(uY,"getWorkerIndex");function dY(){return qi?qi.workerCount:ZI?1:void 0}a(dY,"getWorkerCount");function cme(e){ZI=e,oi.exports.threadsHaveStarted()}a(cme,"setMainIsWorker");var _Y=1,cT;function fY(){return cT||(cT=JI?tme(48):qi.ticketKeys,cT)}a(fY,"getTicketKeys");Object.defineProperty(sY,"workerIndex",{get(){return uY()}});Object.defineProperty(sY,"workerCount",{get(){return dY()}});var EY={[oY](e,t){mme(t)},[aY](e,t){Sme(t,e)}};function jI(e,t={}){let r=process.constrainedMemory?.()||eY();r=Math.min(r,eY(),2e4*tY);let n=iY.get(bE.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/tY/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],o=[];for(let l of Ds){let u=new jpe;u.existingPort=l,i.push(u),o.push(u.port2)}Xpe(e)||(e+=".js");let c=new Wpe(Jpe(e)?e:nY(Qpe,e),{resourceLimits:{maxOldGenerationSizeMb:n,maxYoungGenerationSizeMb:s},execArgv:["--enable-source-maps"],argv:process.argv.slice(2),workerData:{addPorts:o,addThreadIds:i.map(l=>l.existingPort.threadId),workerIndex:t.workerIndex,workerCount:_Y=t.threadCount,name:t.name,restartNumber:oi.exports.restartNumber,ticketKeys:fY()},transferList:o,...t});for(let{port1:l,existingPort:u}of i)u.postMessage({type:lY,port:l,threadId:c.threadId},[l]);return uT(c,!0),c.unexpectedRestarts=t.unexpectedRestarts||0,c.startCopy=()=>jI(e,t),c.on("error",l=>{$i.error(`Worker index ${t.workerIndex} error:`,l)}),c.on("exit",l=>{Ua.splice(Ua.indexOf(c),1),!c.wasShutdown&&t.autoRestart!==!1&&(c.unexpectedRestarts<sme?(t.unexpectedRestarts=c.unexpectedRestarts+1,jI(e,t)):$i.error(`Thread has been restarted ${c.restarts} times and will not be restarted`))}),c.on("message",l=>{EY[l.type]?.(l,c)}),Ua.push(c),Ame(),t.onStarted&&t.onStarted(c),c.name=t.name,c}a(jI,"startWorker");var lme=[bE.THREAD_TYPES.HTTP];async function ew(e=null,t=Math.max(_Y>3,1),r=!0){if(JI){if(r){let{loadRootComponents:o}=VS();await o()}oi.exports.restartNumber++,t<1&&(t=t*Ua.length);let n=[],s=[];for(let o of Ua.slice(0)){if(e&&o.name!==e||o.wasShutdown)continue;$i.trace("sending shutdown request to ",o.threadId),o.postMessage({restartNumber:oi.exports.restartNumber,type:bE.ITC_EVENT_TYPES.SHUTDOWN}),o.wasShutdown=!0,o.emit("shutdown",{});let c=lme.indexOf(o.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{$i.warn("Thread did not voluntarily terminate, terminating from the outside",o.threadId),o.terminate()},XI*2).unref();o.on("exit",()=>{clearTimeout(d),n.splice(n.indexOf(l)),!c&&r&&o.startCopy(),u()})});if(n.push(l),c&&r){let u=o.startCopy(),d=new Promise(_=>{let E=a(f=>{f.type===nme.ITC_EVENT_TYPES.CHILD_STARTED&&($i.trace("Worker has started",u.threadId),_(),s.splice(s.indexOf(d)),u.off("message",E))},"startListener");$i.trace("Waiting for worker to start",u.threadId),u.on("message",E)});s.push(d),n.length>=t&&await Promise.race(n),s.length>=t&&await Promise.race(s)}}await Promise.all(n),await Promise.all(s);let{restartService:i}=Hu();r&&(e==="http"||!e)&&iY.get(bE.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else Gi.postMessage({type:ime,workerType:e})}a(ew,"restartWorkers");function ume(e,t){EY[e]=t}a(ume,"setChildListenerByType");function dme(e){return ew(e,1/0,!1)}a(dme,"shutdownWorkers");var hY=[];function _me(e){hY.push(e)}a(_me,"onMessageFromWorkers");var zI=new Map;function pY(e,t){let r=zI.get(e);r||zI.set(e,r=[]),r.push(t)}a(pY,"onMessageByType");var fme=10;async function Eme(e,t){let r=0;for(let n of Ds)try{n.postMessage(e),r++>fme&&(r=0,await new Promise(setImmediate))}catch(s){$i.error("Unable to send message to worker",s)}t&&SY(e,null)}a(Eme,"broadcast");var lT=new Map,hme=1;function pme(e){return new Promise(t=>{let r=0;for(let n of Ds)try{let s=hme++,i=a(()=>{lT.delete(s),--r===0&&t(),n!==Gi&&--n.refCount===0&&n.unref()},"ack_handler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,lT.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,o]of lT)o.port===n&&o()})),n.postMessage(e),r++}catch(s){$i.error("Unable to send message to worker",s)}r===0&&t()})}a(pme,"broadcastWithAcknowledgement");function mme(e){e.postMessage({type:cY,workers:mY()})}a(mme,"sendThreadInfo");function mY(){let e=Date.now();return Ua.map(t=>({threadId:t.threadId,name:t.name,heapTotal:t.resources?.heapTotal,heapUsed:t.resources?.heapUsed,externalMemory:t.resources?.external,arrayBuffers:t.resources?.arrayBuffers,sinceLastUpdate:e-t.resources?.updated,...t.recentELU}))}a(mY,"getChildWorkerInfo");function Sme(e,t){e.resources=t,e.resources.updated=Date.now()}a(Sme,"recordResourceReport");var QI;function Tme(e){QI=e}a(Tme,"setMonitorListener");var gme=1e3,rY=!1;function Ame(){rY||(rY=!0,setInterval(()=>{for(let e of Ua){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}QI&&QI()},gme).unref())}a(Ame,"startMonitoring");var Rme=1e3;if(Gi&&qi?.addPorts){uT(Gi);for(let e=0,t=qi.addPorts.length;e<t;e++){let r=qi.addPorts[e];r.threadId=qi.addThreadIds[e],uT(r)}setInterval(()=>{let e=process.memoryUsage();Gi.postMessage({type:aY,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},Rme).unref(),WI=a(()=>new Promise((e,t)=>{Gi.on("message",r),Gi.postMessage({type:oY});function r(n){n.type===cY&&(Gi.off("message",r),e(n.workers))}a(r,"receiveThreadInfo")}),"getThreadInfo")}else WI=mY;oi.exports.getThreadInfo=WI;function uT(e,t){Ds.push(e),e.on("message",r=>{if(r.type===lY)r.port.threadId=r.threadId,uT(r.port);else if(r.type===ome){let n=lT.get(r.id);n&&n()}else SY(r,e)}).on("close",()=>{Ds.splice(Ds.indexOf(e),1)}).on("exit",()=>{Ds.splice(Ds.indexOf(e),1)}),t?e.refCount=100:e.unref()}a(uT,"addPort");function SY(e,t){for(let n of hY)n(e,t);let r=zI.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){$i.error(s)}}a(SY,"notifyMessageListeners");if(JI){let e,t,r=new Set,n=a(async(s,i)=>{i&&(e=i);for(let o of await eme(s,{withFileTypes:!0}))o.isDirectory()&&o.name!=="node_modules"&&n(nY(s,o.name));try{for await(let{filename:o}of Zpe(s,{persistent:!1}))r.add(o),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await ew(),console.log("Reloaded HarperDB components, changed files:",Array.from(r)),r.clear()},100)}catch(o){console.warn("Error trying to watch component directory",s,o)}},"watch_dir");oi.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else Gi.on("message",async e=>{let{type:t}=e;t===bE.ITC_EVENT_TYPES.SHUTDOWN&&(oi.exports.restartNumber=e.restartNumber,Gi.unref(),setTimeout(()=>{$i.warn("Thread did not voluntarily terminate",zpe),process.exit(0)},XI).unref())})});var rv={};je(rv,{AUDIT_STORE_OPTIONS:()=>gf,Decoder:()=>Oc,HAS_CURRENT_RESIDENCY_ID:()=>Ja,HAS_EXPIRATION_EXTENDED_TYPE:()=>t_,HAS_ORIGINATING_OPERATION:()=>e_,HAS_PREVIOUS_RESIDENCY_ID:()=>Xa,REMOTE_SEQUENCE_UPDATE:()=>Pp,createAuditEntry:()=>Pl,getLastRemoved:()=>Cy,openAuditStore:()=>hT,readAuditEntry:()=>xt,removeAuditEntry:()=>pT,setAuditRetention:()=>bme,transactionKeyEncoder:()=>wY});function hT(e){let t=e.auditStore=e.openDB(tw.AUDIT_STORE_NAME,{create:!1,...gf});t||(t=e.auditStore=e.openDB(tw.AUDIT_STORE_NAME,gf),gY(t,1)),t.rootStore=e;let r=[];t.addDeleteRemovalCallback=function(i,o){return r[i]=o,t.deleteCallbacks=r,{remove(){delete r[i]}}};let n=null;function s(i=dT){clearTimeout(n),n=setTimeout(async()=>{if(t.rootStore.status==="closed"||t.rootStore.status==="closing")return;let o=0,c,l;try{for(let{key:u,value:d}of t.getRange({start:1,snapshot:!1,end:Date.now()-rw}))if(c=pT(t,u,d),l=u,await new Promise(setImmediate),++o>=yme){i=10;break}await c}finally{o===0?i=Math.min(i<<1,rw/10):gY(t,l),s(i)}},i).unref()}if(a(s,"scheduleAuditCleanup"),t.scheduleAuditCleanup=s,(0,NE.getWorkerIndex)()===(0,NE.getWorkerCount)()-1&&s(dT),(0,NE.getWorkerIndex)()===0&&!TY)for(let i of t.getKeys({reverse:!0,limit:1}))i>Date.now()&&(TY=!0,ET.error("The current time is before the last recorded entry in the audit log. Time reversal can undermine the integrity of data tracking and certificate validation and the time must be corrected."));return t}function pT(e,t,r){if((Ome(r)&15)===nw){let n=xt(r),s=n.tableId;e.deleteCallbacks?.[s]?.(n.recordId)}return e.remove(t)}function gY(e,t){sw[0]=t,e.put(Symbol.for("last-removed"),CY)}function Cy(e){let t=e.get(Symbol.for("last-removed"));if(t)return CY.set(t),sw[0]}function bme(e,t=dT){rw=e,dT=t}function Pl(e,t,r,n,s,i,o,c,l,u,d,_,E){let f=DY[o];if(!f)throw new Error(`Invalid audit entry type ${o}`);let h=1;if(n&&(n>1?va.setFloat64(0,n):Ps.set(kg),h=9),l){if(l&16761087)throw new Error("Illegal extended type");h++}g(s),g(t),m(r),va.setFloat64(h,e),h+=8,l&Ja&&g(u),l&Xa&&g(d),l&t_&&(va.setFloat64(h,_),h+=8),l&e_&&g(PY[E]),i?m(i):Ps[h++]=0,l?va.setUint16(n?8:0,f|l|32768):Ps[n?8:0]=f;let T=Ps.subarray(0,h);if(c)return Buffer.concat([T,c]);return T;function m(S){let y=h;h+=1,h=(0,fl.writeKey)(S,Ps,h);let I=h-y-1;I>127?I>16383?(ET.error("Key or username was too large for audit entry",S),h=y+1,Ps[y]=0):(Ps.copyWithin(y+2,y+1,h),va.setUint16(y,I|32768),h++):Ps[y]=I}function g(S){S<128?Ps[h++]=S:S<16384?(va.setUint16(h,S|32768),h+=2):S<1056964608?(va.setUint32(h,S|3221225472),h+=4):(Ps[h]=255,va.setUint32(h+1,S),h+=5)}}function Ome(e){let t=0;e[0]==66&&(t=8);let r=e[t];if(r<128)return r;let n=e.dataView||(e.dataView=new Oc(e.buffer,e.byteOffset,e.byteLength));return n.position=t,n.readInt()}function xt(e,t=0,r=void 0){try{let n=e.dataView||(e.dataView=new Oc(e.buffer,e.byteOffset,e.byteLength));n.position=t;let s;e[n.position]==66&&(s=n.readFloat64());let i=n.readInt(),o=n.readInt(),c=n.readInt(),l=n.readInt(),u=n.position,d=n.position+=l,_=n.readFloat64(),E,f,h,T;if(i&Ja&&(E=n.readInt()),i&Xa&&(f=n.readInt()),i&t_&&(h=n.readFloat64()),i&e_){let S=n.readInt();T=PY[S]}l=n.readInt();let m=n.position,g=n.position+=l;return{type:DY[i&7],tableId:c,nodeId:o,get recordId(){return(0,fl.readKey)(e,u,d)},getBinaryRecordId(){return e.subarray(u,d)},version:_,previousLocalTime:s,get user(){return g>m?(0,fl.readKey)(e,m,g):void 0},get encoded(){return t?e.subarray(t,r):e},getValue(S,y,I){if(i&_T||i&OE&&!y)return S.decoder.decode(e.subarray(n.position,r));if(i&OE&&I)return iw(S.getEntry(this.recordId),I,S)},getBinaryValue(){return i&(_T|OE)?e.subarray(n.position,r):void 0},extendedType:i,residencyId:E,previousResidencyId:f,expiresAt:h,originatingOperation:T}}catch(n){return ET.error("Reading audit entry error",n,e),{}}}var fl,fT,tw,NY,NE,IY,ET,Ps,va,wY,gf,rw,yme,sw,CY,dT,TY,_T,OE,AY,nw,RY,yY,bY,OY,Pp,Ja,Xa,e_,t_,DY,PY,Oc,ji=Ie(()=>{fl=require("ordered-binary"),fT=L(se()),tw=L(Ht()),NY=L(M()),NE=L(dt()),IY=L(re());Ll();ET=L(j());mT();(0,fT.initSync)();Ps=Buffer.alloc(1024),va=new DataView(Ps.buffer,Ps.byteOffset,1024),wY={writeKey(e,t,r){return e===Zd?(t.set(Zd,r),r+8):typeof e=="number"?((t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).setFloat64(r,e),r+8):(0,fl.writeKey)(e,t,r)},readKey(e,t,r){return e[t]===66?(e.dataView||(e.dataView=new DataView(e.buffer,e.byteOffset,e.byteLength))).getFloat64(t):(0,fl.readKey)(e,t,r)}},gf={encoding:"binary",keyEncoder:wY},rw=(0,IY.convertToMS)((0,fT.get)(NY.CONFIG_PARAMS.LOGGING_AUDITRETENTION))||86400*3,yme=1e3,sw=new Float64Array(1),CY=new Uint8Array(sw.buffer),dT=1e4,TY=!1;a(hT,"openAuditStore");a(pT,"removeAuditEntry");a(gY,"updateLastRemoved");a(Cy,"getLastRemoved");a(bme,"setAuditRetention");_T=16,OE=32,AY=1,nw=2,RY=3,yY=4,bY=5,OY=6,Pp=11,Ja=512,Xa=1024,e_=2048,t_=4096,DY={put:AY|_T,[AY]:"put",delete:nw,[nw]:"delete",message:RY|_T,[RY]:"message",invalidate:yY|OE,[yY]:"invalidate",patch:bY|OE,[bY]:"patch",relocate:OY,[OY]:"relocate"},PY={insert:1,update:2,upsert:3,1:"insert",2:"update",3:"upsert"};a(Pl,"createAuditEntry");a(Ome,"readAction");a(xt,"readAuditEntry");Oc=class extends DataView{static{a(this,"Decoder")}position=0;readInt(){let t;return t=this.getUint8(this.position++),t>=128?t>=192?t===255?(t=this.getUint32(this.position),this.position+=4,t):(t=this.getUint32(this.position-1)&1073741823,this.position+=3,t):(t=this.getUint16(this.position-1)&32767,this.position++,t):t}readFloat64(){try{let t=this.getFloat64(this.position);return this.position+=8,t}catch(t){throw t.message=`Error reading float64: ${t.message} at position ${this.position}`,t}}}});var ow={};je(ow,{add:()=>ST,applyReverse:()=>LY,getRecordAtTime:()=>iw,rebuildUpdateBefore:()=>TT});function ST(e,t,r){let n=e[t];typeof n=="bigint"?e[t]=n+BigInt(r.value):isNaN(e[t])?e[t]=r.value:e[t]=n+r.value}function TT(e,t,r){let n=null;for(let s in e)if(s in t){let i=t[s];if(i?.__op__){let o=e[s];if(o?.__op__)if(o.__op__===i.__op__)n||(n={}),n[s]=o;else throw new Error("Can not merge updates with different operations");else n||(n={}),n[s]=o,ST(n,s,i)}else r&&(n||(n={}),n[s]=i)}else n||(n={}),n[s]=e[s];return n}function LY(e,t){for(let r in t){let n=t[r];if(n?.__op__){let s=Nme[n.__op__]?.reverse;if(s)s(e,r,{value:n.value});else throw new Error(`Unsupported operation ${n.__op__}`)}else e[r]=MY}}function iw(e,t,r){let n=r.rootStore.auditStore,s={...e.value},i=e.localTime;for(;i>t;){let l=n.get(i),u=xt(l);switch(u.type){case"put":s=u.getValue(r);break;case"patch":LY(s,u.getValue(r));break;case"delete":s=null}i=u.previousLocalTime}let o={},c=0;for(let l in s)s[l]===MY&&(o[l]=!0,c++);for(;c>0&&i>0;){let l=n.get(i),u=xt(l),d;switch(u.type){case"put":d=u.getValue(r);break;case"patch":d=u.getValue(r);break}for(let _ in d)o[_]&&(s[_]=d[_],o[_]=!1,c--);i=u.previousLocalTime}if(c>0)for(let l in o)s[l]=null;return s}var Nme,MY,mT=Ie(()=>{ji();a(ST,"add");ST.reverse=function(e,t,r){let n=e[t];typeof n=="bigint"?e[t]=n-BigInt(r.value):isNaN(e[t])||(e[t]=n-r.value)};Nme={add:ST};a(TT,"rebuildUpdateBefore");a(LY,"applyReverse");MY={};a(iw,"getRecordAtTime")});function Zn(e){return e[_r]||(e[_r]=Object.create(null))}function bT(e,t){let r=e.prototype,n={},s=t.attributes||t.properties||[];for(let o of s){let c=o.name,l,u;if(o.resolve)u={get(){return o.resolve(this,this[Fe])},set(d){return o.set(this,d)},configurable:!0};else{switch(o.type){case"String":l=a(function(d){if(!(typeof d=="string"||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be a string, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"ID":l=a(function(d){if(!(typeof d=="string"||d?.length>0&&d.every?.(_=>typeof _=="string")||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be a string, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Float":case"Number":l=a(function(d){let _=d?.__op__?d.value:d;if(!(typeof _=="number"||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be a number, attempt to assign ${_}`);Zn(this)[c]=d},"set");break;case"Int":l=a(function(d){let _=d?.__op__?d.value:d;if(!(_>>0===_||d==null&&o.nullable!==!1))if(typeof _=="number"&&Math.abs((_>>0)-_)<=1)_=Math.round(_),d?.__op__?d.value=_:d=_;else throw new Ls.ClientError(`${c} must be an integer between -2147483648 and 2147483647, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Long":l=a(function(d){let _=d?.__op__?d.value:d;if(!(Math.round(_)===d&&Math.abs(_)<=9007199254740992||d==null&&o.nullable!==!1))if(typeof _=="number"&&Math.abs(_)<=9007199254740992)_=Math.round(_),d?.__op__?d.value=_:d=_;else throw new Ls.ClientError(`${c} must be an integer between -9007199254740992 and 9007199254740992, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"BigInt":l=a(function(d){let _=d?.__op__?d.value:d;if(!(typeof _=="bigint"||d==null&&o.nullable!==!1))if(typeof _=="string"||typeof _=="number")_=BigInt(_),d?.__op__?d.value=_:d=_;else throw new Ls.ClientError(`${c} must be a number, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Boolean":l=a(function(d){if(!(typeof d=="boolean"||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be a boolean, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Date":l=a(function(d){if(!(d instanceof Date||d==null&&o.nullable!==!1))if(typeof d=="string"||typeof d=="number")d=new Date(d);else throw new Ls.ClientError(`${c} must be a Date, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Bytes":l=a(function(d){if(!(d instanceof Uint8Array||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be a Buffer or Uint8Array, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Any":case void 0:l=a(function(d){Zn(this)[c]=d},"set");break;default:l=a(function(d){if(!(typeof d=="object"||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be an object, attempt to assign ${d}`);Zn(this)[c]=d},"set")}u={get(){let d=this[_r];if(d&&c in d){let E=d[c];if(E?.__op__){let f=this[ve]?.[c];return E.update(f)}return E}let _=this[ve]?.[c];if(_&&typeof _=="object"){let E=vY(_,o);if(E)return d||(d=this[_r]=Object.create(null)),d[c]=E}return _},set:l,enumerable:!0,configurable:!0}}u.get.isAttribute=!0,n[c]=u,(!(c in r)||Object.getOwnPropertyDescriptor(r,c)?.get?.isAttribute)&&Object.defineProperty(r,c,u)}i("getProperty",function(o){let c=n[o];if(c)return c.get.call(this);let l=this[_r];return l?.[o]!==void 0?l[o]:this[ve]?.[o]}),i("set",function(o,c){let l=n[o];if(l)return l.set.call(this,c);if(t.sealed)throw new Ls.ClientError("Can not add a property to a sealed table schema");Zn(this)[o]=c}),i("deleteProperty",function(o){Zn(this)[o]=void 0}),i("toJSON",function(){let o=this[_r],c;for(let u in o){c||(c={...this[ve]});let d=o[u];if(d?.__op__){let _=c[u];d=d.update(_)}c[u]=d}return Object.keys(this).length>0&&(c||(c={...this[ve]}),Object.assign(c,this)),c||this[ve]}),r.get||i("get",r.getProperty),r.delete||i("delete",r.deleteProperty);function i(o,c){Object.defineProperty(r,o,{value:c,configurable:!0})}a(i,"setMethod")}function vY(e,t){let r;switch(e.constructor){case Object:return t?((r=t.TrackedObject)||(t.TrackedObject=r=class{static{a(this,"TrackedObject")}constructor(s){if(s?.[ve])throw new Error("Can not track an already tracked object, check for circular references");this[ve]=s}},bT(r,t)),new r(e)):new gT(e);case Array:let n=new RT(e.length);n[ve]=e;for(let s=0,i=e.length;s<i;s++){let o=e[s];o&&typeof o=="object"&&(o=vY(o,t?.elements)),n[s]=o}return n;default:return e}}function op(e){let t=e[_r],r;for(let s in t){r||(r={...e[ve]});let i=t[s];if(i&&typeof i=="object")if(i.__op__){let o=r[s];i=i.update(o)}else i=op(i);r[s]=i}return Object.keys(e).length>0&&(r||(r={...e[ve]}),Object.assign(r,e)),r||e[ve]}function hl(e,t=e[_r]){let r;if(UY.call(e,ve)&&e.constructor===Array&&!Object.isFrozen(e)){r=e;for(let n=0,s=e.length;n<s;n++){let i=e[n];if(i&&typeof i=="object"){let o=hl(i);o!==i&&r===e&&(r=e.slice(0)),i=o}r[n]=i}return Object.freeze(r)}for(let n in t){r||(r={...e[ve]});let s=t[n];if(s&&typeof s=="object")if(s.__op__){let i=ow[s?.__op__];if(i)i(r,n,s);else throw new Error("Invalid CRDT operation "+s.__op__);continue}else s=hl(s);r[n]=s}return r?Object.freeze(r):UY.call(e,ve)?e[ve]:e}function AT(e){let t=e[ve];if(t===void 0)return!0;if(e.constructor===Array){if(!t||e[El]||e.length!==t.length)return!0;for(let r=0,n=e.length;r<n;r++){let s=t[r],i=e[r];if(s&&i?.[ve]===s){if(AT(i))return!0}else return!0}}else{let r=e[_r];if(r&&!t)return!0;for(let n in r){let s=r[n];if(s&&typeof s=="object"){let i=t[n];if(i&&s[ve]===i){if(AT(s))return!0}else return!0}else return!0}}return!1}var Ls,_r,gT,UY,El,RT,yT,ap=Ie(()=>{Vs();Ls=L(_e());mT();_r=Symbol("own-data");a(Zn,"getChanges");a(bT,"assignTrackedAccessors");a(vY,"trackObject");gT=class{static{a(this,"GenericTrackedObject")}constructor(t){if(t?.[ve])throw new Error("Can not track an already tracked object, check for circular references");this[ve]=t}};bT(gT,{});a(op,"collapseData");UY=Object.prototype.hasOwnProperty;a(hl,"updateAndFreeze");a(AT,"hasChanges");El=Symbol.for("has-array-changes"),RT=class extends Array{static{a(this,"TrackedArray")}[El];constructor(t){super(t)}splice(...t){return this[El]=!0,super.splice(...t)}push(...t){return this[El]=!0,super.push(...t)}pop(){return this[El]=!0,super.pop()}unshift(...t){return this[El]=!0,super.unshift(...t)}shift(){return this[El]=!0,super.shift()}};RT.prototype.constructor=Array;yT=class{constructor(t){this.value=t}static{a(this,"Addition")}__op__="add";update(t){return(+t||0)+this.value}}});var uR={};je(uR,{CONTEXT:()=>Fe,ID_PROPERTY:()=>ze,IS_COLLECTION:()=>ai,MultiPartId:()=>NT,RECORD_PROPERTY:()=>ve,Resource:()=>Pr,snake_case:()=>wme,transformForSelect:()=>IT});function wme(e){return e[0].toLowerCase()+e.slice(1).replace(/[a-z][A-Z][a-z]/g,t=>t[0]+"_"+t.slice(1))}function BY(e,t){if(pl=!1,e==="")return null;if(e=e.slice(1),t.splitSegments){if(e.indexOf("/")===-1)return e===""?(pl=!0,null):t.coerceId(decodeURIComponent(e));let r=e.split("/"),n=new NT;for(let s=0;s<r.length;s++){let i=r[s];if(!i&&s===r.length-1){pl=!0;break}n[s]=t.coerceId(decodeURIComponent(i))}return n}else{if(e==="")return pl=!0,null;e[e.length-1]==="/"&&(pl=!0)}return t.coerceId(decodeURIComponent(e))}function es(e,t){n.reliesOnPrototype=!0;let r=t.hasContent;return n;function n(s,i,o){let c,l,u,d;if(r?(o?(d=i,o=o[Fe]||o):i?typeof s=="object"&&s&&(!Array.isArray(s)||typeof s[0]=="object")?(d=s,c=d[this.primaryKey]??null,o=i[Fe]||i):d=i:(d=s,s=void 0,c=d[ze]??d[this.primaryKey]),c===null&&(u=!0)):i?o=i[Fe]||i:s&&typeof s=="object"&&!Array.isArray(s)&&(o=s),c===void 0)if(typeof s=="object"&&s){if(l=s,typeof(c=s.url)=="string"){let f=c.indexOf("?");if(f>-1){let T=this.parseQuery(c.slice(f+1));l?T&&(l=Object.assign(T,l)):l=T,c=c.slice(0,f)}let h=this.parsePath(c,o,l);h?.id!==void 0?(h.query&&(l?l=Object.assign(h.query,l):l=h.query),u=h.isCollection,c=h.id):c=h}else if(s[Symbol.iterator]){c=[],u=!0;for(let f of s){if(typeof f=="object"&&f)break;c.push(f)}c.length===0?c=null:(c.length===1&&(c=c[0]),l.slice&&(l=l.slice(c.length,l.length),l.length===0&&(l=null,u=!1)))}c===void 0&&(c=s.id??null,c==null&&(u=!0))}else c=s,l=new el(c),c==null&&(u=!0);o||(o={});let _;if(l?.ensureLoaded!=null||l?.async||u?(_={...t},l?.ensureLoaded!=null&&(_.ensureLoaded=l.ensureLoaded),l?.async&&(_.async=l.async),u&&(_.isCollection=!0)):_=t,o.transaction){let f=this.getResource(c,o,_);return f.then?f.then(E):E(f)}else return Dt(o,()=>{let f=this.getResource(c,o,_);return f.then?f.then(E):E(f)},_);function E(f){if(o.authorize){o.authorize=!1;let h=t.type==="read"?f.allowRead(o.user,l,o):t.type==="update"?f.doesExist?.()===!1?f.allowCreate(o.user,d,o):f.allowUpdate(o.user,d,o):t.type==="create"?f.allowCreate(o.user,d,o):f.allowDelete(o.user,l,o);if(h?.then)return h.then(T=>{if(!T)throw new OT(o.user);return typeof d?.then=="function"?d.then(m=>e(f,l,o,m)):e(f,l,o,d)});if(!h)throw new OT(o.user)}return typeof d?.then=="function"?d.then(h=>e(f,l,o,h)):e(f,l,o,d)}a(E,"authorizeActionOnResource")}}function ts(e,t){let r=new kY.ClientError(`The ${e.constructor.name} does not have a ${t} method implemented`,405);r.allow=[],r.method=t;for(let n of["get","put","post","delete","query","move","copy"])typeof e[n]=="function"&&r.allow.push(n);throw r}function aw(e,t,r){let n=e[ve];if(n){let s=e[_r];return i=>{let o,c;return e.hasOwnProperty(i)&&typeof(o=e[i])!="function"?o:s&&i in s?s[i]:(c=t?.[i])?c(e,r):n[i]}}else return t?s=>{let i=t[s];return i?i(e,r):e[s]}:s=>e[s]}function IT(e,t){let r=t?.propertyResolvers,n=t[Fe],s;if(typeof e=="string")return a(function o(c){return c.then?c.then(o):Array.isArray(c)?c.map(o):aw(c,r,n)(e)},"transform");if(typeof e=="object"){if(e.asArray)return a(function c(l){if(l.then)return l.then(c);if(Array.isArray(l))return l.map(c);let u=[],d=i(aw(l,r,n));for(let _ of e)u.push(d(_));return u},"transform");let o=e.forceNulls;return a(function c(l){if(l.then)return l.then(c);if(Array.isArray(l))return l.map(E=>E&&typeof E=="object"?c(E):E);let u={},d=i(aw(l,r,n)),_;for(let E of e){let f=d(E);f===void 0&&o&&(f=null),f?.then?(_||(_=[]),_.push(f.then(h=>u[E.name||E]=h))):u[E.name||E]=f}return _?Promise.all(_).then(()=>u):u},"transform")}else throw new Error("Invalid select argument type "+typeof e);function i(o){return c=>{if(typeof c=="string")return o(c);if(typeof c=="object")if(c.name){s||(s={});let l=s[c.name];if(!l){let d=r[c.name]?.definition?.tableClass;l=s[c.name]=IT(c.select||c,d)}let u=o(c.name);return l(u)}else return o(c);else return c}}a(i,"handleProperty")}var HY,xY,kY,Fe,ze,ai,ve,Ime,Pr,OT,pl,NT,Vs=Ie(()=>{HY=require("crypto");Cl();xY=L(_i()),kY=L(_e());ap();pc();tE();Fe=Symbol.for("context"),ze=Symbol.for("primary-key"),ai=Symbol("is-collection"),ve=Symbol("stored-record"),Ime={json:"application/json",cbor:"application/cbor",msgpack:"application/x-msgpack",csv:"text/csv"},Pr=class{static{a(this,"Resource")}static transactions;constructor(t,r){this[ze]=t;let n=r?.[Fe];this[Fe]=n!==void 0?n:r||null}static get=es(function(t,r,n,s){let i=t.get?.(r);if(i?.then)return i.then(o);return o(i);function o(c){let l;if((l=r?.select)&&c!=null&&!c.selectApplied){let u=IT(l,t.constructor);return typeof c?.map=="function"?c.map(u):u(c)}return c}},{type:"read",letItLinger:!0,ensureLoaded:!0,async:!0});static put=es(function(t,r,n,s){if(Array.isArray(s)&&t[ai]){let i=[],o=n.authorize;for(let c of s){let l=t.constructor,u=l.getResource(c[l.primaryKey],n,{async:!0});u.then?i.push(u.then(d=>d.put(c,n))):i.push(u.put(c,n))}return Promise.all(i)}return t.put?t.put(s,r):ts(t,"put")},{hasContent:!0,type:"update"});static patch=es(function(t,r,n,s){return t.patch?t.patch(s,r):ts(t,"patch")},{hasContent:!0,type:"update"});static delete=es(function(t,r,n,s){return t.delete?t.delete(r):ts(t,"delete")},{hasContent:!1,type:"delete"});static getNewId(){return(0,HY.randomUUID)()}static create(t,r,n){let s;return t==null?s=r?.[this.primaryKey]??this.getNewId():Array.isArray(t)&&typeof t[0]!="object"?s=r?.[this.primaryKey]??[...t,this.getNewId()]:typeof t!="object"?s=r?.[this.primaryKey]??[t,this.getNewId()]:(s=t?.[this.primaryKey]??this.getNewId(),n=r||{},r=t),n||(n={}),Dt(n,()=>{let i=new this(s,n),o=i.update?i.update(r,!0):ts(i,"update");return n.newLocation=s,n.createdResource=!0,o?.then?o.then(()=>i):i})}static invalidate=es(function(t,r,n,s){return t.invalidate?t.invalidate(r):ts(t,"delete")},{hasContent:!1,type:"update"});static post=es(function(t,r,n,s){return t[ze]!=null&&t.update?.(),t.post(s,r)},{hasContent:!0,type:"create"});static connect=es(function(t,r,n,s){return t.connect?t.connect(s,r):ts(t,"connect")},{hasContent:!0,type:"read"});static subscribe=es(function(t,r,n,s){return t.subscribe?t.subscribe(r):ts(t,"subscribe")},{type:"read"});static publish=es(function(t,r,n,s){return t[ze]!=null&&t.update?.(),t.publish?t.publish(s,r):ts(t,"publish")},{hasContent:!0,type:"create"});static search=es(function(t,r,n,s){let i=t.search?t.search(r):ts(t,"search"),o=n.select;if(o&&n.hasOwnProperty("select")&&i!=null&&!i.selectApplied){let c=IT(o,t.constructor);return i.map(c)}return i},{type:"read"});static query=es(function(t,r,n,s){return t.search?t.search(s,r):ts(t,"search")},{hasContent:!0,type:"read"});static copy=es(function(t,r,n,s){return t.copy?t.copy(s,r):ts(t,"copy")},{hasContent:!0,type:"create"});static move=es(function(t,r,n,s){return t.move?t.move(s,r):ts(t,"move")},{hasContent:!0,type:"delete"});async post(t){if(this[ai])return(await this.constructor.create(this[ze],t,this[Fe]))[ze];ts(this,"post")}static isCollection(t){return t?.[ai]}static coerceId(t){return t}static parseQuery(t){return ES(t)}static parsePath(t,r,n){let s=t.indexOf(".");if(s>-1){let o=t.slice(s+1);t=t.slice(0,s);let c=r?.headers&&Ime[o];if(c)r.requestedContentType=c;else if(n)n.property=o;else return{query:{property:o},id:BY(t,this),isCollection:pl}}let i=BY(t,this);return pl?{id:i,isCollection:!0}:i}static getResource(t,r,n){let s,i=r[Fe],o;typeof r.isCollection=="boolean"&&r.hasOwnProperty("isCollection")?o=r.isCollection:o=n?.isCollection;let c=o&&this.Collection||this;if(i||(i=i===void 0?r:{}),i.transaction){let l;if(i.resourceCache?l=i.resourceCache:l=i.resourceCache=[],l.asMap){let u=l.asMap.get(t);if(s=u?.find(d=>d.constructor===c),s)return s;u||l.asMap.set(t,u=[]),u.push(s=new c(t,i))}else{if(s=l.find(u=>u[ze]===t&&u.constructor===c),s)return s;if(l.push(s=new c(t,i)),l.length>10){let u=new Map;for(let d of l){let _=d[ze],E=u.get(_);E?E.push(d):u.set(_,[d])}i.resourceCache.length=0,i.resourceCache.asMap=u}}}else s=new c(t,i);return o&&(s[ai]=!0),s}subscribe(t){return new Pn}connect(t){return t?.subscribe!==!1?this.subscribe?.(t):new Pn}allowRead(t){return t?.role.permission.super_user}allowUpdate(t){return t?.role.permission.super_user}allowCreate(t){return t?.role.permission.super_user}allowDelete(t){return t?.role.permission.super_user}getId(){return this[ze]}getContext(){return this[Fe]}};Pr.prototype[Fe]=null;(0,xY._assignPackageExport)("Resource",Pr);a(wme,"snake_case");OT=class extends Error{static{a(this,"AccessError")}constructor(t){t?(super("Unauthorized access to resource"),this.statusCode=403):(super("Must login"),this.statusCode=401)}};a(BY,"pathToId");NT=class extends Array{static{a(this,"MultiPartId")}toString(){return this.join("/")}};a(es,"transactional");a(ts,"missingMethod");a(aw,"selectFromObject");a(IT,"transformForSelect")});var bO={};je(bO,{EVICTED:()=>ya,INVALIDATED:()=>Os,coerceType:()=>CT,makeTable:()=>LT,setServerUtilities:()=>Hme,updateResource:()=>DT});function LT(e){let{primaryKey:t,indices:r,tableId:n,tableName:s,primaryStore:i,databasePath:o,databaseName:c,auditStore:l,schemaDefined:u,dbisDB:d,sealed:_,splitSegments:E,replicate:f}=e,{expirationMS:h,evictionMS:T,audit:m,trackDeletes:g}=e,{attributes:S}=e;S||(S=[]);let y=qg(i,n,l),I,U,H={},X=Promise.resolve(),Y,V,ne;for(let v of S)(v.assignCreatedTime||v.name==="__createdtime__")&&(Y=v),(v.assignUpdatedTime||v.name==="__updatedtime__")&&(V=v),v.expiresAt&&(ne=v),v.isPrimaryKey&&(H=v);let Q,de=[],W=[],ae=1,Oe=2,Ne={},Me={},Gr=864e5,wd,ka,wn,Cd=!1,Ol,Lw=new Map,KE=new Map,vt,Fa,Ga=gd.get(Ms.CONFIG_PARAMS.REPLICATION_DATABASES);if(Array.isArray(Ga)){for(let v of Ga)if(v.name===c&&v.replicateTo>=0){Fa=v.replicateTo;break}}let Us=i.getRange({start:!1,end:!1}).constructor,vs=10,YE=6;m&&ie();class Ve extends Pr{static name=s;static primaryStore=i;static auditStore=l;static primaryKey=t;static tableName=s;static tableId=n;static indices=r;static audit=m;static databasePath=o;static databaseName=c;static attributes=S;static replicate=f;static sealed=_;static splitSegments=E??!0;static createdTimeProperty=Y;static updatedTimeProperty=V;static propertyResolvers;static userResolvers={};static sources=[];static get expirationMS(){return h}static dbisDB=d;static schemaDefined=u;static sourcedFrom(p,A){if(A&&(this.sourceOptions=A,(A.expiration||A.eviction||A.scanInterval)&&this.setTTLExpiration(A)),A?.intermediateSource)p.intermediateSource=!0,this.sources.unshift(p);else{if(this.sources.some(O=>!O.intermediateSource)){if(this.sources.some(O=>O.name===p.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(p)}U=U||p.get&&(!p.get.reliesOnPrototype||p.prototype.get),I=I||p.load;let w=a(O=>{let B=this.sources;if(B=B.filter(k=>k.intermediateSource&&k[O]&&(!k[O].reliesOnPrototype||k.prototype[O])),B.length>0)if(B.length===1){let k=B[0];return(C,F,x)=>{if(C?.source!==k)return k[O](F,x,C)}}else return(k,C,F)=>{let x=[];for(let q of B){if(k?.source===q)break;x.push(q[O](C,F,k))}return Promise.all(x)}},"getApplyToIntermediateSource"),R=this.sources[this.sources.length-1];R.intermediateSource&&(R={});let b=a(O=>{if(R[O]&&(!R[O].reliesOnPrototype||R.prototype[O]))return(B,k,C)=>{if(!B?.source)return R[O](k,C,B)}},"getApplyToCanonicalSource");Ne={put:b("put"),patch:b("patch"),delete:b("delete"),publish:b("publish")},Me={put:w("put"),patch:w("patch"),delete:w("delete"),publish:w("publish"),invalidate:w("invalidate")};let D=R.shouldRevalidateEvents;return(async()=>{let O=!1,B,k=a(async(C,F)=>{let x=C.value,q=C.table?We[c][C.table]:Ve;if(c===Ms.SYSTEM_SCHEMA_NAME&&(C.table===Ms.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||C.table===Ms.SYSTEM_TABLE_NAMES.USER_TABLE_NAME)&&(O=!0),C.id===void 0&&(C.id=x[q.primaryKey],C.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(C));C.source=p;let ee={residencyId:tt(C.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:C.nodeId},G=await q.getResource(C.id,F,ee);switch(C.type){case"put":return D?G._writeInvalidate(ee):G._writeUpdate(x,!0,ee);case"patch":return D?G._writeInvalidate(ee):G._writeUpdate(x,!1,ee);case"delete":return G._writeDelete(ee);case"publish":return G._writePublish(x,ee);case"invalidate":return G._writeInvalidate(ee);case"relocate":return G._writeRelocate(ee);default:qe.default.error?.("Unknown operation",C.type,C.id)}},"writeUpdate");try{let C=p.subscribe;C&&g==null&&(g=!0);let F={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},x=p.subscribeOnThisThread?p.subscribeOnThisThread((0,ml.getWorkerIndex)(),F):(0,ml.getWorkerIndex)()===0,q=C&&x&&await p.subscribe?.(F);if(q){let ee;for await(let G of q)try{if(!(G.type==="transaction"?G.writes[0]:G)){qe.default.error?.("Bad subscription event",G);continue}if(G.source=p,G.type==="end_txn"){if(ee?.resolve(),G.localTime&&B!==G.localTime){if(G.remoteNodeIds?.length>0){let Ae=[Symbol.for("seq"),G.remoteNodeIds[0]],te=d.get(Ae),K=te?.nodes;K||(K=[]);for(let Be of G.remoteNodeIds.slice(1)){let we=K.find(ce=>ce.id===Be);K=K.filter(ce=>ce.id!==Be||ce===we),we||(we={id:Be,seqId:0},K.push(we)),we.seqId=Math.max(te?.seqId??1,G.localTime),Be===ee?.nodeId&&(we.lastTxnTime=G.timestamp)}let ge=Math.max(te?.seqId??1,G.localTime);qe.default.trace?.("Received txn",c,ge,G.localTime,G.remoteNodeIds),d.put(Ae,{seqId:ge,nodes:K})}B=G.localTime}G.onCommit&&ee?.committed.then(G.onCommit);continue}if(ee)if(G.beginTxn)ee.resolve();else{ee.write_promises.push(k(G,ee));continue}!G.timestamp&&G.version&&(G.timestamp=G.version);let Ee=Dt(G,()=>{if(G.type==="transaction"){let Ae=[];for(let te of G.writes)try{Ae.push(k(te,G))}catch(K){throw K.message+=" writing "+JSON.stringify(te)+" of event "+JSON.stringify(G),K}return Promise.all(Ae)}else if(G.type==="define_schema"){let Ae=this.attributes.slice(0),te;for(let K of G.attributes)Ae.find(ge=>ge.name===K.name)||(Ae.push(K),te=!0);te&&(Et({table:s,database:c,attributes:Ae,origin:"cluster"}),DE.signalSchemaChange(new PE.SchemaEventMsg(process.pid,Ms.OPERATIONS_ENUM.CREATE_TABLE,c,s)))}else return G.beginTxn?(ee=G,ee.write_promises=[k(G,G)],new Promise(Ae=>{ee.resolve=()=>Ae(Promise.all(ee.write_promises))})):k(G,G)});ee&&(ee.committed=Ee),O&&Ee&&!Ee?.waitingForUserChange&&(Ee.then(()=>DE.signalUserChange(new PE.UserEventMsg(process.pid))),Ee.waitingForUserChange=!0),G.onCommit&&(Ee?Ee.then(G.onCommit):G.onCommit())}catch(Re){qe.default.error?.("error in subscription handler",Re)}}}catch(C){qe.default.error?.(C)}})(),this}static get isCaching(){return U}static get shouldRevalidateEvents(){return this.prototype.get!==Ve.prototype.get}static getResource(p,A,w){let R=super.getResource(p,A,w);if(p!=null){Yi(p);try{if(R.hasOwnProperty(ve))return R;if(typeof p=="object"&&p&&!Array.isArray(p))throw new Error(`Invalid id ${JSON.stringify(p)}`);let b=!w?.async||i.cache?.get?.(p),D=Ir(A),O=D.getReadTxn();if(O?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return $a(p,A,{transaction:O,ensureLoaded:w?.ensureLoaded},b,B=>{if(B?DT(R,B):R[ve]=null,A.onlyIfCached&&A.noCacheStore){if(!R.doesExist())throw new Or.ServerError("Entry is not cached",504)}else if(w?.ensureLoaded){let k=Dd(p,B,A,R);if(k)return D?.disregardReadTxn(),R[cw]=!0,uw(k,C=>(DT(R,C),R))}return R})}catch(b){throw b.message.includes("Unable to serialize object")&&(b.message+=": "+JSON.stringify(p)),b}}return R}ensureLoaded(){let p=Dd(this[ze],this[kr],this[Fe]);if(p)return this[cw]=!0,uw(p,A=>{this[kr]=A,this[ve]=A.value,this[wE]=A.version})}static getNewId(){let p=H?.type;if(p==="String"||p==="ID")return super.getNewId();if(!vt){let b=i.getEntry(Symbol.for("id_allocation")),D=b?.value,O;if(D&&D.nodeName===server.hostname&&(!kme(i)||D.pid===process.pid)){let B=D.start,k=D.end;O=B;for(let C of i.getKeys({start:k,end:B,limit:1,reverse:!0}))O=C}else D=R(b?.version??null),O=D.start;vt=new BigInt64Array([BigInt(O)+1n]),vt=new BigInt64Array(i.getUserSharedBuffer("id",vt.buffer)),vt.maxSafeId=D.end}let A=Number(Atomics.add(vt,0,1n)),w=p==="Int"?512:1048576;if(A+w>=vt.maxSafeId){let b=a(D=>{vt.maxSafeId=A+(p==="Int"?1023:4194303);let O=(p==="Int"?Math.pow(2,31):Math.pow(2,49))-1,B=D?void 0:i.useReadTransaction(),k=Number(vt[0]);for(let x of i.getKeys({start:k+1,end:O,limit:1,transaction:B}))O=x;B?.done();let{value:C,version:F}=i.getEntry(Symbol.for("id_allocation"));if(vt.maxSafeId<O){if(C.end>vt.maxSafeId-100)return;qe.default.info?.("New id allocation",A,vt.maxSafeId,F),i.put(Symbol.for("id_allocation"),{start:C.start,end:vt.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),F)}else{qe.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${vt.maxSafeId}, but id of ${O} detected`);let x=R(F);x.alreadyUpdated||Atomics.store(vt,0,BigInt(x.start+1)),vt.maxSafeId=x.end}},"updateEnd");A+w===vt.maxSafeId?setImmediate(b):A+100>=vt.maxSafeId&&(qe.default.warn?.(`Synchronous id allocation required on table ${s}${p=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>b(!0)))}return A;function R(b){let D=(p==="Int"?Math.pow(2,31):Math.pow(2,49))-1,O=D/4,B,k,C=!1,F,x;do{F=Math.floor(Math.random()*D),x={start:F,end:F+(p==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},B=0;for(let q of i.getKeys({start:F,limit:1,reverse:!0}))B=q;k=D;for(let q of i.getKeys({start:F+1,end:D,limit:1}))k=q;O*=.875,O<1e3&&!C&&(C=!0,qe.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${p==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,F,B,k,O))}while(!(O<k-F&&(O<F-B||B===0)));return i.transactionSync(()=>{let q=i.getEntry(Symbol.for("id_allocation"));return(q?.version??null)==b?(qe.default.info?.("Allocated new id range",x),i.put(Symbol.for("id_allocation"),x,Date.now()),x):(qe.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...q.value})})}}static setTTLExpiration(p){if(typeof p=="number")h=p*1e3,T||(T=0);else if(p&&typeof p=="object")h=p.expiration*1e3,T=(p.eviction||0)*1e3,Gr=p.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(h<0)throw new Error("Expiration can not be negative");Gr=Gr||(h+T)/4,Ho()}static getResidencyRecord(p){return d.get([Symbol.for("residency_by_id"),p])}static setResidency(p){Ve.getResidency=p}static setResidencyById(p){Ve.getResidencyById=p}static getResidency(p,A,w){if(Ve.getResidencyById)return Ve.getResidencyById(p[t]);let R=Fa;if(A.replicateTo!=null){if(Array.isArray(A.replicateTo))return A.replicateTo.includes(server.hostname)?A.replicateTo:[server.hostname,...A.replicateTo];A.replicateTo>=0&&(R=A.replicateTo)}if(R>=0&&server.nodes){let b=[server.hostname];if(w)b.push(...w.slice(0,R));else{let D=server.nodes.map(k=>k.name),O=Math.floor(D.length*Math.random());b.push(...D.slice(O,O+R));let B=O+R-D.length;B>0&&b.push(...D.slice(0,B))}return b}}static enableAuditing(p=!0){m=p,p&&ie(),Ve.audit=p}static coerceId(p){return p===""?null:CT(p,H)}static async dropTable(){if(delete We[c][s],c===o){for(let p of S)d.remove(Ve.tableName+"/"+p.name),r[p.name]?.drop();d.remove(Ve.tableName+"/"),i.drop(),await d.committed}else console.log("legacy dropTable"),await i.close(),await fs.remove(data_path),await fs.remove(data_path===standard_path?data_path+MDB_LOCK_FILE_SUFFIX:path.join(path.dirname(data_path),MDB_LEGACY_LOCK_FILE_NAME));DE.signalSchemaChange(new PE.SchemaEventMsg(process.pid,Ms.OPERATIONS_ENUM.DROP_TABLE,c,s))}get(p){if(typeof p=="string")return this.getProperty(p);if(this[ai])return this.search(p);if(this[ze]===null){if(p?.conditions)return this.search(p);let A=Ve.getRecordCount();return{recordCount:A.recordCount,estimatedRecordRange:A.estimatedRange,records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:S}}if(p?.property)return this.getProperty(p.property);if(this.doesExist()||p?.ensureLoaded===!1||this[Fe]?.returnNonexistent)return this}allowRead(p,A){let w=Va(p);if(w?.read){if(w.isSuperUser)return!0;let R=w.attribute_permissions,b=A?.select;if(R?.length>0||Cd&&b){if(A||(A={}),b){let D=R?.length>0&&lw(R,"read");A.select=b.map(O=>{let B=O.name||O;if(!D||D[B]){let k=wn[B]?.definition?.tableClass;if(k){if(O.name||(O={name:O}),!k.prototype.allowRead.call(null,p,O))return!1;if(!O.select)return O.name}return O}}).filter(Boolean)}else A.select=R.filter(D=>D.read&&!wn[D.attribute_name]).map(D=>D.attribute_name);return A}else return!0}}allowUpdate(p,A){let w=Va(p);if(w?.update){let R=w.attribute_permissions;if(R?.length>0){let b=lw(R,"update");for(let D in A)if(!b[D])return!1;for(let D of R){let O=D.attribute_name;!D.update&&!(O in A)&&(A[O]=this.getProperty(O))}}return Ka(this[Fe])}}allowCreate(p,A){if(this[ai]){let w=Va(p);if(w?.insert){let R=w.attribute_permissions;if(R?.length>0){let b=lw(R,"insert");for(let D in A)if(!b[D])return!1;return Ka(this[Fe])}else return Ka(this[Fe])}}else return this.allowUpdate(p,{})}allowDelete(p){return Va(p)?.delete&&Ka(this[Fe])}update(p,A){if(!Ir(this[Fe]))throw new Error("Can not update a table resource outside of a transaction");if(p===!1)return this;let R;return typeof p=="object"&&p&&(A?(Object.isFrozen(p)&&(p={...p}),this[ve]={},this[_r]=p):(R=this[_r],R&&(p=Object.assign(R,p)),this[_r]=R=p)),this._writeUpdate(this[_r],A),this}addTo(p,A){if(typeof A=="number"||typeof A=="bigint")this[IE]===GY?this.set(p,(+this.getProperty(p)||0)+A):(this[IE]||this.update(),this.set(p,new yT(A)));else throw new Error("Can not add a non-numeric value")}subtractFrom(p,A){if(typeof A=="number")return this.addTo(p,-A);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this[kr]}invalidate(){this._writeInvalidate()}_writeInvalidate(p){let A=this[Fe],w=this[ze];Yi(w),Ir(this[Fe]).addWrite({key:w,store:i,invalidated:!0,entry:this[kr],before:Ne.invalidate?.bind(this,A,w),beforeIntermediate:Me.invalidate?.bind(this,A,w),commit:a((b,D)=>{if(ui(b,D,p?.nodeId)<=0)return;let O=null;for(let B in r)O||(O={}),O[B]=this.getProperty(B);qe.default.trace?.(`Invalidating entry id: ${w}, timestamp: ${new Date(b).toISOString()}`),y(w,O,this[kr],b,Os,m,{user:A?.user,residencyId:p?.residencyId,nodeId:p?.nodeId},"invalidate")},"commit")})}_writeRelocate(p){let A=this[Fe],w=this[ze];Yi(w),Ir(this[Fe]).addWrite({key:w,store:i,invalidated:!0,entry:this[kr],before:Ne.relocate?.bind(this,A,w),beforeIntermediate:Me.relocate?.bind(this,A,w),commit:a((b,D)=>{if(ui(b,D,p?.nodeId)<=0)return;let O=Ve.getResidencyRecord(p.residencyId),B=0,k=null,C=D?.value;if(O&&!O.includes(server.hostname)){for(let F in r)k||(k={}),k[F]=C(F);B=Os}else k=C;qe.default.trace?.(`Relocating entry id: ${w}, timestamp: ${new Date(b).toISOString()}`),y(w,k,this[kr],b,B,m,{user:A.user,residencyId:p.residencyId,nodeId:p.nodeId,expiresAt:p.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(p,A){let w={previousResidency:this.getResidencyRecord(p.residencyId),isRelocation:!0},R=this.getResidency(A.value,w),b;if(R){if(!Array.isArray(R))throw new Error("Residency must be an array, but was: "+R);if(!R.includes(server.hostname))return;b=tt(R)}let O=y(p.key,A.value,p,p.version,0,!0,{residencyId:b,expiresAt:A.expiresAt},"relocate",!1,null)}static evict(p,A,w){let R=this.Source,b;if(!((U||m)&&(!A||(b=i.getEntry(p),!b||!A)||b.version!==w))){if(U){if(i.hasLock(p,b.version))return;let D;for(let O in r)D||(D={}),D[O]=A[O];if(D)return y(p,D,b,w,ya,null,null,null,!0)}return i.ifVersion(p,w,()=>{qa(p,A,null)}),m?y(p,null,b,w,ya,null,null,null,!0):i.remove(p,w)}}lock(){throw new Error("Not yet implemented")}static operation(p,A){return p.table||=s,p.schema||=c,zY.operation(p,A)}put(p){this.update(p,!0)}patch(p){this.update(p,!1)}_writeUpdate(p,A,w){let R=this[Fe],b=Ir(R),D=this[ze];Yi(D);let O=this[kr];this[IE]=A?GY:Ume;let B={key:D,store:i,entry:O,nodeName:R?.nodeName,validate:a(k=>{p||(p=this[_r]),A||p&&AT(this[_r]===p?this:p)?R?.source||(b.checkOverloaded(),this.validate(p,!A),V&&(p[V.name]=V.type==="Date"?new Date(k):V.type==="String"?new Date(k).toISOString():k),A&&(t&&p[t]!==D&&(p[t]=D),Y&&(O?.value?p[Y.name]=O?.value[Y.name]:p[Y.name]=Y.type==="Date"?new Date(k):Y.type==="String"?new Date(k).toISOString():k),p=hl(p))):b.removeWrite(B)},"validate"),before:A?Ne.put?()=>Ne.put(R,D,p):null:Ne.patch?()=>Ne.patch(R,D,p):Ne.put?()=>Ne.put(R,D,hl(this)):null,beforeIntermediate:A?Me.put?()=>Me.put(R,D,p):null:Me.patch?()=>Me.patch(R,D,p):Me.put?()=>Me.put(R,D,hl(this)):null,commit:a((k,C,F)=>{if(F){if(R&&C?.version>(R.lastModified||0)&&(R.lastModified=C.version),this[kr]=C,C?.value?.[ve])throw new Error("Can not assign a record to a record, check for circular references");A||(this[ve]=C?.value??null)}this[_r]=void 0,this[wE]=k;let x=C?.value,q=p;this[IE]=0;let ee=ui(k,C,w?.nodeId),G;if(ee<=0)if(m){let K=C.localTime,ge=C.version;qe.default.trace?.("Applying CRDT update to record with id: ",D,"applying later update:",ge);let Be=[];for(;K>k||ge>=k&&K>0;){let we=l.get(K);if(!we)break;let ce=xt(we);if(ge=ce.version,ge>=k){if(ge===k){if(ee=ui(k,{version:ge,localTime:K},w?.nodeId),ee===0)return;if(ee>0)continue}if(ce.type==="patch")Be.push(ce),G=p;else if(ce.type==="put"||ce.type==="delete")return}K=ce.previousLocalTime}Be.sort((we,ce)=>we.version-ce.version);for(let we of Be){let ce=we.getValue(i);if(q=TT(q,ce,A),qe.default.debug?.("Rebuilding update with future patch:",q),!q)return}}else{if(A)return;q=TT(q,x,A),qe.default.debug?.("Rebuilding update without audit:",q)}let Re;if(A?Re=q:(this[ve]=x,Re=hl(this,q)),this[ve]=Re,Re?.[ve])throw new Error("Can not assign a record to a record, check for circular references");let Ee;if(w?.residencyId!=null)Ee=w.residencyId;else{O?.residencyId&&(R.previousResidency=Ve.getResidencyRecord(O.residencyId));let K=Ve.getResidency(Re,R);if(K){if(!Array.isArray(K))throw new Error("Residency must be an array, got: "+K);K.includes(server.hostname)||K.push(server.hostname)}Ee=tt(K)}A||(G=p);let Ae=R?.expiresAt??(h?h+Date.now():-1);qe.default.trace?.(`Saving record with id: ${D}, timestamp: ${new Date(k).toISOString()}${Ae?", expires at: "+new Date(Ae).toISOString():""}${C?", replaces entry from: "+new Date(C.version).toISOString():", new entry"}`,Re),qa(D,x,Re);let te=A?"put":"patch";y(D,Re,C,k,0,m,{user:R?.user,residencyId:Ee,expiresAt:Ae,nodeId:w?.nodeId,originatingOperation:R?.originatingOperation},te,!1,G),R.expiresAt&&Ho()},"commit")};b.addWrite(B)}async delete(p){if(typeof p=="string")return this.deleteProperty(p);if(this[ai]){for await(let A of this.search(p))(await Ve.getResource(A[t],this.getContext(),{ensureLoaded:!1}))._writeDelete(p);return}return this[ve]?this._writeDelete(p):!1}_writeDelete(p){let A=Ir(this[Fe]),w=this[ze];Yi(w);let R=this[Fe];return A.addWrite({key:w,store:i,resource:this,nodeName:R?.nodeName,before:Ne.delete?.bind(this,R,w),beforeIntermediate:Me.delete?.bind(this,R,w),commit:a((b,D,O)=>{let B=D?.value;O&&(R&&D?.version>(R.lastModified||0)&&(R.lastModified=D.version),DT(this,D)),!(ui(b,D,p?.nodeId)<=0)&&(qa(this[ze],B),qe.default.trace?.(`Deleting record with id: ${w}, txn timestamp: ${new Date(b).toISOString()}`),m||g?(y(w,null,this[kr],b,0,m,{user:R?.user,nodeId:p?.nodeId},"delete"),m||Ho()):i.remove(this[ze]))},"commit")}),!0}search(p){let A=this[Fe],w=Ir(A);if(!p)throw new Error("No query provided");let R=p.conditions;R?R.length===void 0&&(R=R[Symbol.iterator]?Array.from(R):[R]):R=Array.isArray(p)?p:p[Symbol.iterator]?Array.from(p):[],this[ze]&&(R=[{attribute:null,comparator:Array.isArray(this[ze])?"prefix":"starts_with",value:this[ze]}].concat(R));let b,D={};function O(K,ge){let Be;switch(ge){case"and":case void 0:if(K.length<1)throw new Error('An "and" operator requires at least one condition');Be=!0;break;case"or":if(K.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+ge)}for(let we of K){if(we.conditions){we.conditions=O(we.conditions,we.operator);continue}let ce=we[0]??we.attribute,Ye=ce==null?H:Mi(S,ce);if(Ye)(Ye.type||fN[we.comparator])&&(we[1]===void 0?we.value=k(we.value,Ye):we[1]=k(we[1],Ye));else if(ce!=null)throw(0,Or.handleHDBError)(new Error,`${ce} is not a defined attribute`,404);if(we.chainedConditions)if(we.chainedConditions.length===1&&(!we.operator||we.operator=="and")){let rt=we.chainedConditions[0],Ze,st;if(rt.comparator==="gt"||rt.comparator==="greater_than"||rt.comparator==="ge"||rt.comparator==="greater_than_equal"?(Ze=we,st=rt):(Ze=rt,st=we),Ze.comparator!=="lt"&&Ze.comparator!=="less_than"&&Ze.comparator!=="le"&&Ze.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let Bt=st.comparator==="ge"||st.comparator==="greater_than_equal",xo=Ze.comparator==="le"||Ze.comparator==="less_than_equal";we.comparator=(Bt?"ge":"gt")+(xo?"le":"lt"),we.value=[st.value,Ze.value]}else throw new Error("Multiple chained conditions are not currently supported")}return K}a(O,"prepareConditions");function B(K,ge){if(p.enforceExecutionOrder)return K;for(let Be of K)Be.conditions&&(Be.conditions=B(Be.conditions,Be.operator));return K.length>1&&ge!=="or"?(0,WY.sortBy)(K,fS(Ve)):K}a(B,"orderConditions");function k(K,ge){return Array.isArray(K)?K.map(Be=>CT(Be,ge)):CT(K,ge)}a(k,"coerceTypedValues");let C=p.operator;(R.length>0||C)&&(R=O(R,C));let F=typeof p.sort=="object"&&p.sort,x;if(F&&C!=="or"){let K=F.attribute;if(K==null)throw new Or.ClientError("Sort requires an attribute");if(b=R.find(ge=>Zu(ge.attribute)===Zu(K)),!b){let ge=Mi(S,K);if(!ge)throw(0,Or.handleHDBError)(new Error,`${Array.isArray(K)?K.join("."):K} is not a defined attribute`,404);if(ge.indexed)b={attribute:K,comparator:"sort"},R.push(b);else if(R.length===0&&!p.allowFullScan)throw(0,Or.handleHDBError)(new Error,`${Array.isArray(K)?K.join("."):K} is not indexed and not combined with any other conditions`,404)}b&&(b.descending=!!F.descending)}R=B(R,C),F&&(b&&R[0]===b?F.next&&(x={dbOrderedAttribute:F.attribute,attribute:F.next.attribute,descending:F.next.descending,next:F.next.next}):(b&&R.splice(R.indexOf(b),1),x=F));let q=p.select;if(R.length===0&&(R=[{attribute:t,comparator:"greater_than",value:!0}]),p.explain)return{conditions:R,operator:C,postOrdering:x,selectApplied:!!q};let ee=w.useReadTxn(),G=EN(R,C,Ve,ee,p,A,(K,ge)=>Pd(K,q,A,ee,ge),D),Re=p.ensureLoaded!==!1;x||(G=te(G));let Ee=Ve.transformEntryForSelect(q,A,ee,D,Re,!0),Ae=Ve.transformToOrderedSelect(G,q,x,ee,A,Ee);function te(K){return p.offset||p.limit!==void 0?K.slice(p.offset,p.limit!==void 0?(p.offset||0)+p.limit:void 0):K}return a(te,"applyOffset"),x&&(Ae=te(Ae)),Ae.onDone=()=>{Ae.onDone=null,w.doneReadTxn()},Ae.selectApplied=!0,Ae.getColumns=()=>{if(q){let K=[];for(let ge of q)ge==="*"?K.push(...S.map(Be=>Be.name)):K.push(ge.name||ge);return K}return S.filter(K=>!K.computed&&!K.relationship).map(K=>K.name)},Ae}static transformToOrderedSelect(p,A,w,R,b,D){let O=new Us;if(w){p=Pd(p,A,R,b,null);let B;O.iterate=function(){let C,F=p[Symbol.asyncIterator]?p[Symbol.asyncIterator]():p[Symbol.iterator](),x,q=w.dbOrderedAttribute,ee,G,Re=!0;function Ee(te){let K=te.next&&Ee(te.next),ge=te.descending;return(Be,we)=>{let ce=Nl(Be,te.attribute,R),Ye=Nl(we,te.attribute,R),rt=ge?(0,Sl.compareKeys)(Ye,ce):(0,Sl.compareKeys)(ce,Ye);return rt===0?K?.(Be,we)||0:rt}}a(Ee,"createComparator");let Ae=Ee(w);return{async next(){let te;if(C)if(te=C.next(),te.done){if(x)return O.onDone&&O.onDone(),te}else return{value:await D.call(this,te.value)};B=[],ee&&B.push(ee);do if(te=await F.next(),te.done){if(x=!0,B.length)break;return O.onDone&&O.onDone(),te}else{let K=te.value;if(K?.then&&(K=await K),q){let ge=Nl(K,q,R);if(Re)Re=!1,G=ge;else if(ge!==G){G=ge,ee=K;break}}B.push(K)}while(!0);return w.isGrouped,B.sort(Ae),C=B[Symbol.iterator](),te=C.next(),te.done?(O.onDone&&O.onDone(),te):{value:await D.call(this,te.value)}},return(){O.onDone&&O.onDone(),F.return()},throw(){O.onDone&&O.onDone(),F.throw()}}};let k=a(C=>{if(typeof A=="object"&&Array.isArray(C.attribute))for(let F=0;F<A.length;F++){let x=A[F],q;if(x.name===C.attribute[0]){for(q=x.sort||(x.sort={});q.next;)q=q.next;q.attribute=C.attribute.slice(1),q.descending=C.descending}else x===C.attribute[0]&&(A[F]=q={name:x,sort:{attribute:C.attribute.slice(1),descending:C.descending}})}C.next&&k(C.next)},"applySortingOnSelect");k(w)}else O.iterate=(p[Symbol.asyncIterator]||p[Symbol.iterator]).bind(p),O=O.map(function(B){try{let k=D.call(this,B);return typeof k?.catch=="function"?k.catch(C=>{throw C.partialObject={[t]:B.key},C}):k}catch(k){throw k.partialObject={[t]:B.key},k}});return O}static transformEntryForSelect(p,A,w,R,b,D){if(p&&(p===t||p?.length===1&&p[0]===t&&Array.isArray(p))){let C=a(F=>(A?.transaction?.stale&&(A.transaction.stale=!1),F?.key??F),"transform");return p===t?C:p.asArray?F=>[C(F)]:F=>({[t]:C(F)})}let O;b&&U&&!(typeof p=="string"?[p]:p)?.every(C=>{let F;return typeof C=="object"?F=C.name:F=C,r[F]||F===t})&&(O=!0);let B,k=a(function(C){let F;if(A?.transaction?.stale&&(A.transaction.stale=!1),C!=null){if(F=C.value||C.deref?.()?.value,!F&&(C.key===void 0||C.deref)||C.metadataFlags&Os){if(C.metadataFlags&Os&&A.replicateFrom===!1&&D&&C.residencyId)return Ba.SKIP;if(C=$a(C.key??C,A,{transaction:w,lazy:p?.length<4,ensureLoaded:b},this?.isSync,x=>x),C?.then)return C.then(k.bind(this));F=C?.value}if(O&&C?.metadataFlags&(Os|ya)||C?.expiresAt!=null&&C?.expiresAt<Date.now()){if(A.onlyIfCached&&A.noCacheStore)return{[t]:C.key,message:"This entry has expired"};let x=Dd(C.key??C,C,A);if(x?.then)return x.then(k)}}if(F==null)return D?Ba.SKIP:F;if(p&&!(p[0]==="*"&&p.length===1)){let x,q=a((G,Re)=>{let Ee;typeof G=="object"?Ee=G.name:Ee=G;let Ae=wn?.[Ee],te;if(Ae){let K=R?.[Ee];if(K)if(K.hasMappings){let Be=Ae.from?F[Ae.from]:Zu(C.key);te=K.get(Be),te||(te=[])}else te=K.fromRecord?.(F);else te=Ae(F,A,C);let ge=a(Be=>{if(Be&&typeof Be=="object"){let we=Ae.definition?.tableClass||Ve;B||(B={});let ce=B[Ee]||(B[Ee]=we.transformEntryForSelect(Ee===G?null:G.select||(Array.isArray(G)?G:null),A,w,K,b));if(Array.isArray(Be)){let Ye=[],rt=we.transformToOrderedSelect(Be,G.select,typeof G.sort=="object"&&G.sort,A,w,ce)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),Ze=a(Bt=>{for(;!Bt.done;){if(Bt?.then)return Bt.then(Ze);Ye.push(Bt.value),Bt=rt.next()}Re(Ye,Ee)},"nextValue"),st=Ze(rt.next());st&&(x||(x=[]),x.push(st));return}else if(Be=ce.call(this,Be),Be?.then){x||(x=[]),x.push(Be.then(Ye=>Re(Ye,Ee)));return}}Re(Be,Ee)},"handleResolvedValue");te?.then?(x||(x=[]),x.push(te.then(ge))):ge(te);return}else te=F[Ee],te&&typeof te=="object"&&Ee!==G&&(te=Ve.transformEntryForSelect(G.select||G,A,w,null)({value:te}));Re(te,Ee)},"selectAttribute"),ee;if(typeof p=="string")q(p,G=>{ee=G});else if(Array.isArray(p))if(p.asArray)ee=[],p.forEach((G,Re)=>{G==="*"?p[Re]=F:q(G,Ee=>ee[Re]=Ee)});else{ee={};let G=p.forceNulls;for(let Re of p)if(Re==="*")for(let Ee in F)ee[Ee]=F[Ee];else q(Re,(Ee,Ae)=>{Ee===void 0&&G&&(Ee=null),ee[Ae]=Ee})}else throw new Or.ClientError("Invalid select"+p);return x?Promise.all(x).then(()=>ee):ee}return F},"transform");return k}async subscribe(p){if(!l)throw new Error("Can not subscribe to a table without an audit log");m||Et({table:s,database:c,schemaDefined:u,attributes:S,audit:!0}),p||(p={});let A=!p.rawEvents,w=[],R=this,b=QR(Ve,this[ze]??null,function(O,B,k,C){try{let F=B.getValue?.(i,A),x=B.type;if(!F&&x==="patch"&&A){let ee=i.getEntry(O);ee?.version===B.version?F=ee.value:F=B.getValue?.(i,!0,k),x="put"}let q={id:O,localTime:k,value:F,version:B.version,type:x,beginTxn:C};w?w.push(q):this.send(q)}catch(F){qe.default.error?.(F)}},p.startTime||0,p),D=(async()=>{this[ai]&&(b.includeDescendants=!0,p.onlyChildren&&(b.onlyChildren=!0)),p.supportsTransactions&&(b.supportsTransactions=!0);let O=this[ze],B=p.previousCount;B>1e3&&(B=1e3);let k=p.startTime;if(this[ai]){if(k){if(B)throw new Or.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:C,value:F}of l.getRange({start:k,exclusiveStart:!0,snapshot:!1})){let x=xt(F);if(x.tableId!==n)continue;let q=x.recordId;if(O==null||KY(O,q)){let ee=x.getValue(i,A,C);if(b.send({id:q,localTime:C,value:ee,version:x.version,type:x.type}),b.queue?.length>$Y&&await b.waitForDrain()===!1)return}b.startTime=C}}else if(B){let C=[];for(let{key:F,value:x}of l.getRange({start:"z",end:!1,reverse:!0}))try{let q=xt(x);if(q.tableId!==n)continue;let ee=q.recordId;if(O==null||KY(O,ee)){let G=q.getValue(i,A,F);if(C.push({id:ee,localTime:F,value:G,version:q.version,type:q.type}),--B<=0)break}}catch(q){qe.default.error("Error getting history entry",F,q)}for(let F=C.length;F>0;)b.send(C[--F]);C[0]&&(b.startTime=C[0].localTime)}else if(!p.omitCurrent){for(let{key:C,value:F,version:x,localTime:q}of i.getRange({start:O??!1,end:O==null?void 0:[O,Sl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(F&&(b.send({id:C,localTime:q,value:F,version:x,type:"put"}),b.queue?.length>$Y&&await b.waitForDrain()===!1))return}}else{B&&!k&&(k=0);let C=this[kr]?.localTime;if(C===Gg&&(i.cache?.delete(O),this[kr]=i.getEntry(O),qe.default.trace?.("re-retrieved record",C,this[kr]?.localTime),C=this[kr]?.localTime),qe.default.trace?.("Subscription from",k,"from",O,C),k<C){let F=[],x=C;do{let q=l.get(x);if(q){p.omitCurrent=!0;let ee=xt(q),G=ee.getValue(i,A,x);A&&(ee.type="put"),F.push({id:O,value:G,localTime:x,...ee}),x=ee.previousLocalTime}else break;B&&B--}while(x>k&&B!==0);for(let q=F.length;q>0;)b.send(F[--q]);b.startTime=C}!p.omitCurrent&&this.doesExist()&&b.send({id:O,localTime:C,value:this[ve],version:this[wE],type:"put"})}for(let C of w)b.send(C);w=null})();return p.listener&&b.on("data",p.listener),b}static subscribeOnThisThread(p,A){return p===0||A?.crossThreads===!1}doesExist(){return!!(this[ve]||this[IE])}publish(p,A){this._writePublish(p,A)}_writePublish(p,A){let w=Ir(this[Fe]),R=this[ze]||null;R!=null&&Yi(R);let b=this[Fe];w.addWrite({key:R,store:i,entry:this[kr],nodeName:b?.nodeName,validate:a(()=>{b?.source||(w.checkOverloaded(),this.validate(p))},"validate"),before:Ne.publish?.bind(this,b,R,p),beforeIntermediate:Me.publish?.bind(this,b,R,p),commit:a((D,O,B)=>{O===void 0&&g&&!m&&Ho(),qe.default.trace?.(`Publishing message to id: ${R}, timestamp: ${new Date(D).toISOString()}`),y(R,O?.value??null,O,O?.version||D,0,!0,{user:b?.user,residencyId:A?.residencyId,expiresAt:b?.expiresAt,nodeId:A?.nodeId},"message",!1,p)},"commit")})}validate(p,A){let w,R=a((b,D,O)=>{if(D.type&&b!=null)if(A&&b.__op__&&(b=b.value),D.properties){typeof b!="object"&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be an object${D.type?" ("+D.type+")":""}`);let B=D.properties;for(let k=0,C=B.length;k<C;k++){let F=B[k],x=R(b[F.name],F,O+"."+F.name);x&&(b[F.name]=x)}if(D.sealed&&b!=null&&typeof b=="object")for(let k in b)B.find(C=>C.name===k)||(w||(w=[])).push(`Property ${k} is not allowed within object in property ${O}`)}else switch(D.type){case"Int":(typeof b!="number"||b>>0!==b)&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof b!="number"||!(Math.floor(b)===b&&Math.abs(b)<=9007199254740992))&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof b!="number"&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a number`);break;case"ID":typeof b=="string"||b?.length>0&&b.every?.(B=>typeof B=="string")||(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a string, or an array of strings`);break;case"String":typeof b!="string"&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a string`);break;case"Boolean":typeof b!="boolean"&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a boolean`);break;case"Date":if(!(b instanceof Date)){if(typeof b=="string"||typeof b=="number")return new Date(b);(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a Date`)}break;case"BigInt":if(typeof b!="bigint"){if(typeof b=="string"||typeof b=="number")return BigInt(b);(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a bigint`)}break;case"Bytes":b instanceof Uint8Array||(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a Buffer or Uint8Array`);break;case"array":if(Array.isArray(b)){if(D.elements)for(let B=0,k=b.length;B<k;B++){let C=b[B],F=R(C,D.elements,O+"[*]");F&&(b[B]=F)}}else(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a Buffer or Uint8Array`);break}D.nullable===!1&&b==null&&(w||(w=[])).push(`Property ${O} is required (and not does not allow null values)`)},"validateValue");for(let b=0,D=S.length;b<D;b++){let O=S[b];if(!(O.relationship||O.computed)&&(!A||O.name in p)){let B=R(p[O.name],O,O.name);B&&(p[O.name]=B)}}if(_)for(let b in p)S.find(D=>D.name===b)||(w||(w=[])).push(`Property ${b} is not allowed`);if(w)throw new Or.ClientError(w.join(". "))}getUpdatedTime(){return this[wE]}wasLoadedFromSource(){return U?!!this[cw]:void 0}static async addAttributes(p){let A=S.slice(0);for(let w of p){if(!w.name)throw new Or.ClientError("Attribute name is required");if(w.name.match(/[`/]/))throw new Or.ClientError("Attribute names cannot include backticks or forward slashes");(0,jY.validateAttribute)(w.name),A.push(w)}return Et({table:s,database:c,schemaDefined:u,attributes:A}),Ve.indexingOperation}static async removeAttributes(p){let A=S.filter(w=>!p.includes(w.name));return Et({table:s,database:c,schemaDefined:u,attributes:A}),Ve.indexingOperation}static getSize(){let p=i.getStats();return(p.treeBranchPageCount+p.treeLeafPageCount+p.overflowPages)*p.pageSize}static getAuditSize(){let p=l?.getStats();return p&&(p.treeBranchPageCount+p.treeLeafPageCount+p.overflowPages)*p.pageSize}static getRecordCount(p){let A=i.getStats().entryCount,w=1e3/2,R=performance.now(),b=Math.floor(A/2),D=p?.exactCount,O=0,B=0,k;for(let{value:C}of i.getRange({start:!0,lazy:!0}))if(C!=null&&O++,B++,!D&&B<b&&performance.now()-R>w){k=B;break}if(k){let C=O;O=0;for(let{value:te}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:k}))te!=null&&O++;let F=k*2,x=(O+C)/F,q=Math.pow((O-C+1)/k/2,2)+x*(1-x)/F,ee=Math.max(Math.sqrt(q)*A,1),G=Math.round(x*A),Re=Math.max(G-1.96*ee,O+C),Ee=Math.min(G+1.96*ee,A),Ae=Math.pow(10,Math.round(Math.log10(ee)));return Ae>G&&(Ae=Ae/10),O=Math.round(G/Ae)*Ae,{recordCount:O,estimatedRange:[Math.round(Re),Math.round(Ee)]}}return{recordCount:O}}static updatedAttributes(){wn=this.propertyResolvers={$id:a((p,A,w)=>({value:w.key}),"$id"),$updatedtime:a((p,A,w)=>w.version,"$updatedtime"),$record:a((p,A,w)=>w?{value:p}:p,"$record")};for(let p of this.attributes){p.resolve=null;let A=p.relationship,w=p.computed;if(A)if(p.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),w&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),Cd=!0,A.to)p.elements?.definition?(wn[p.name]=p.resolve=(R,b,D)=>{let O=R[A.from?A.from:t],B=p.elements.definition.tableClass;return D?Xu({attribute:A.to,value:O},Ir(b).getReadTxn(),!1,B,!1).asArray:B.search([{attribute:A.to,value:O}],b).asArray},p.set=()=>{throw new Error("Setting a one-to-many relationship property is not supported")},p.resolve.definition=p.elements.definition,A.from&&(p.resolve.from=A.from)):console.error(`The one-to-many/many-to-many relationship property "${p.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(A.from){let R=p.definition||p.elements?.definition;R?(wn[p.name]=p.resolve=(b,D,O)=>{let B=b[A.from];if(B!==void 0){if(p.elements){let k,C=B?.map(F=>{let x=O?R.tableClass.primaryStore.getEntry(F,{transaction:Ir(D).getReadTxn()}):R.tableClass.get(F,D);return x?.then&&(k=!0),x});return A.filterMissing?k?Promise.all(C).then(F=>F.filter(YY)):C.filter(YY):k?Promise.all(C):C}return O?R.tableClass.primaryStore.getEntry(B,{transaction:Ir(D).getReadTxn()}):R.tableClass.get(B,D)}},p.set=(b,D)=>{if(Array.isArray(D)){let O=D.map(B=>B[ze]||B[R.tableClass.primaryKey]);b[A.from]=O}else{let O=D[ze]||D[R.tableClass.primaryKey];b[A.from]=O}},p.resolve.definition=p.definition||p.elements?.definition,p.resolve.from=A.from):console.error(`The relationship property "${p.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${p.name}" in table "${s}" must use either "from" or "to" arguments`);else w&&(typeof w.from=="function"&&this.setComputedAttribute(p.name,w.from),wn[p.name]=p.resolve=(R,b,D)=>{let O=typeof w.from=="string"?R[w.from]:R,B=this.userResolvers[p.name];if(B)return B(O,b,D);qe.default.warn(`Computed attribute "${p.name}" does not have a function assigned to it. Please use setComputedAttribute('${p.name}', resolver) to assign a resolver function.`),this.userResolvers[p.name]=()=>{}})}bT(this,this)}static setComputedAttribute(p,A){let w=Mi(S,p);if(!w){console.error(`The attribute "${p}" does not exist in the table "${s}"`);return}if(!w.computed){console.error(`The attribute "${p}" is not defined as computed in the table "${s}"`);return}this.userResolvers[p]=A}static async deleteHistory(p=0,A=!1){let w;for(let{key:R,value:b}of l.getRange({start:0,end:p}))await Td(),xt(b).tableId===n&&(w=pT(l,R,b));if(A)for(let{key:R,value:b,localTime:D}of i.getRange({start:0,versions:!0}))await Td(),b===null&&D<p&&(w=i.remove(R));await w}static async*getHistory(p=0,A=1/0){for(let{key:w,value:R}of l.getRange({start:p||1,end:A})){await Td();let b=xt(R);b.tableId===n&&(yield{id:b.recordId,localTime:w,version:b.version,type:b.type,value:b.getValue(i,!0,w),user:b.user,operation:b.originatingOperation})}}static async getHistoryOfRecord(p){let A=[];if(p==null)throw new Error("An id is required");let w=i.getEntry(p);if(!w)return A;let R=w.localTime;if(!R)throw new Error("The entry does not have a local audit time");let b=0;do{await Td();let D=l.get(R);if(D){let O=xt(D);A.push({id:O.recordId,localTime:R,version:O.version,type:O.type,value:O.getValue(i,!0,R),user:O.user}),R=O.previousLocalTime}else break}while(b<1e3&&R);return A.reverse()}static cleanup(){Q?.remove()}}Ve.updatedAttributes();let ss=Ve.prototype;return ss[Mme]=!0,h&&Ve.setTTLExpiration(h/1e3),ne&&Se(),Ve;function qa(v,p,A){let w;for(let R in r){let b=r[R],D=b.isIndexing,O=wn[R],B=A&&(O?O(A):A[R]),k=p&&(O?O(p):p[R]);if(B===k&&!D)continue;w=!0;let C=b.indexNulls,F=(0,CE.getIndexedValues)(B,C),x=(0,CE.getIndexedValues)(k,C);if(x?.length>0){let q=new Set(x);if(F=F?F.filter(ee=>{if(q.has(ee))q.delete(ee);else return!0}):[],x=Array.from(q),(x.length>0||F.length>0)&&FY){let ee=x.concat(F).map(G=>({key:G,value:v}));b.prefetch(ee,VY)}for(let ee=0,G=x.length;ee<G;ee++)b.remove(x[ee],v)}else F?.length>0&&FY&&b.prefetch(F.map(q=>({key:q,value:v})),VY);if(F)for(let q=0,ee=F.length;q<ee;q++)b.put(F[q],v)}return w}a(qa,"updateIndices");function Yi(v){switch(typeof v){case"number":return!0;case"string":if(v.length<659)return!0;if(v.length>qY)throw new Error("Primary key size is too large: "+v.length);break;case"object":if(v===null)throw new Error("Invalid primary key of null");break;case"bigint":if(v<2n**64n&&v>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof v)}if((0,Sl.writeKey)(v,vme,0)>qY)throw new Error("Primary key size is too large: "+v.length);return!0}a(Yi,"checkValidId");function $a(v,p,A,w,R){if(Ve.getResidencyById&&A.ensureLoaded&&p?.replicateFrom!==!1){let D=Ve.getResidencyById(v);if(D&&!D.includes(server.hostname)&&I)return I({key:v,residency:D}).then(R)}let b=a(()=>{if(p?.transaction?.stale&&(p.transaction.stale=!1),A.transaction?.isDone)return R(null,v);let D=i.getEntry(v,A);return D?.residencyId&&D.metadataFlags&Os&&I&&A.ensureLoaded&&p?.replicateFrom!==!1?I(D).then(O=>R(O,v)):(D&&p&&(D?.version>(p.lastModified||0)&&(p.lastModified=D.version),D?.localTime&&!p.lastRefreshed&&(p.lastRefreshed=D.localTime)),R(D,v))},"whenPrefetched");return w?b():ae>0?(ae--,b()):new Promise((D,O)=>{ae===0?(ae--,i.prefetch([v],()=>{B(),k()})):(de.push(v),W.push(k),de.length>YE&&(ae--,B()));function B(){if(de.length>0){let C=W;i.prefetch(de,()=>{ae===-1?B():ae++;for(let F of C)F()}),de=[],W=[],Oe>2&&Oe--}else ae=Oe,Oe<vs&&Oe++}a(B,"prefetch");function k(){try{D(b())}catch(C){O(C)}}a(k,"load")})}a($a,"loadLocalRecord");function Va(v){if(!v?.role)return;let p=v.role.permission;if(p.super_user)return Bme;let A=p[c],w,R=A?.tables;if(R)return R[s];if(c==="data"&&(w=p[s])&&!w.tables)return w}a(Va,"getTablePermissions");function Dd(v,p,A,w){if(U){let R=!1;if(A.noCache?R=!0:(p?(!p.value||p.metadataFlags&(Os|ya)||p.expiresAt!=null&&p.expiresAt<Date.now())&&(R=!0):R=!0,qn(!R,"cache-hit",s)),R){let b=Ld(v,p,A).then(D=>(D?.value?.[ve]&&qe.default.error?.("Can not assign a record with a record property"),A&&(D?.version>(A.lastModified||0)&&(A.lastModified=D.version),A.lastRefreshed=Date.now()),D));if(A?.onlyIfCached||p?.value&&w?.allowStaleWhileRevalidate?.(p,v)){if(b.catch(D=>qe.default.warn?.(D)),A?.onlyIfCached&&!w.doesExist())throw new Or.ServerError("Entry is not cached",504);return}else return b}}else if(p?.value&&p.expiresAt!=null&&p.expiresAt<Date.now())return Ve.evict(p.key,p.value,p.version),p.value=null,{then(R){return R(p)}}}a(Dd,"ensureLoadedFromSource");function Ir(v){let p=v?.transaction;if(p){if(!p.lmdbDb)return p.lmdbDb=i,p;do{if(p.lmdbDb?.path===i.path)return p;let A=p.next;if(!A)return p=p.next=new hc,p.lmdbDb=i,p;p=A}while(!0)}else return new np}a(Ir,"txnForContext");function Nl(v,p,A){if(!v)return;let w=v.value||i.getEntry(v.key)?.value;if(typeof p=="object"){let b=wn,D=w;for(let O=0,B=p.length;O<B;O++){let k=p[O],C=b?.[k];D=C&&D?C(D,A,!0)?.value:D?.[k],b=C?.definition?.tableClass?.propertyResolvers}return D}let R=wn[p];return R?R(w,A):w[p]}a(Nl,"getAttributeValue");function Pd(v,p,A,w,R){let b=R?.length,D={transaction:w,lazy:b>0||typeof p=="string"||p?.length<4,alwaysPrefetch:!0},O;function B(k,C){let F=k?.value;if(!F)return Ba.SKIP;for(let x=0;x<b;x++)if(!O?.includes(x)&&!R[x](F,k))return Ba.SKIP;return C!==void 0&&(k.key=C),k}if(a(B,"processEntry"),b>0||!v.hasEntries){let k=v.map(C=>{if(O=null,typeof C=="object"&&C?.key!==void 0)return b>0?B(C):C;if(C==null)return Ba.SKIP;for(let F=0;F<b;F++){let q=R[F].idFilter;if(q){if(!q(C))return Ba.SKIP;O||(O=[]),O.push(F)}}return $a(C,A,D,!1,B)});return Array.isArray(v)&&(k=k.filter(C=>C!==Ba.SKIP)),k.hasEntries=!0,k}return v}a(Pd,"transformToEntries");function ui(v,p,A=server.replication?.getThisNodeId(l)){if(v<=p?.version){if(p?.version===v&&A!==void 0){let w=server.replication?.exportIdMapping(l),R=p.localTime,b=R&&l.get(R);if(b){let D,O,B=xt(b);for(let k in w)w[k]===A&&(D=k),w[k]===B.nodeId&&(O=k);if(D>O)return 1;if(D===O)return 0}}return-1}return 1}a(ui,"precedesExistingVersion");async function Ld(v,p,A){let w=p?.metadataFlags,R=p?.version,b,D;if(!i.attemptLock(v,R,()=>{clearTimeout(D);let C=i.getEntry(v);!C||!C.value||C.metadataFlags&(Os|ya)?b(Ld(v,i.getEntry(v),A)):b(C)}))return new Promise(C=>{b=C,D=setTimeout(()=>{i.unlock(v,R)},Lme)});let O=p?.value,B={requestContext:A,replacingRecord:O,replacingEntry:p,replacingVersion:R,noCacheStore:!1,source:null,resourceCache:A?.resourceCache},k=A?.responseHeaders;return new Promise((C,F)=>{let x;uw(Dt(B,async q=>{let ee=performance.now(),G,Re,Ee;try{for(let ge of Ve.sources)if(ge.get&&(!ge.get.reliesOnPrototype||ge.prototype.get)){if(ge.available?.(p)===!1)continue;if(B.source=ge,G=await ge.get(v,B),G)break}Ee=w&Os;let te=B.lastModified||Ee&&R;Re=Ee||te>R||!O,te||(te=(0,CE.getNextMonotonicTime)());let K=performance.now()-ee;if(mr(K,"cache-resolution",s,null,"success"),k&&ym(k,"Server-Timing",`cache-resolve;dur=${K.toFixed(2)}`,!0),q.timestamp=te,h&&B.expiresAt==null&&(B.expiresAt=Date.now()+h),G){if(typeof G!="object")throw new Error("Only objects can be cached and stored in tables");if(G.status>0&&G.headers)if(G.status>=300)if(G.status===304)G=O,te=R;else throw new Or.ServerError(G.body||"Error from source",G.status);else G=G.body;typeof G.toJSON=="function"&&(G=G.toJSON()),t&&G[t]!==v&&(G[t]=v)}x=!0,C({key:v,version:te,value:G})}catch(te){te.message+=` while resolving record ${v} for ${s}`,O&&((te.code==="ECONNRESET"||te.code==="ECONNREFUSED"||te.code==="EAI_AGAIN")&&!A?.mustRevalidate||A?.staleIfError&&(te.statusCode===500||te.statusCode===502||te.statusCode===503||te.statusCode===504))?(C({key:v,version:R,value:O}),qe.default.trace?.(te.message,"(returned stale record)")):F(te);let K=performance.now()-ee;mr(K,"cache-resolution",s,null,"fail"),k&&ym(k,"Server-Timing",`cache-resolve;dur=${K.toFixed(2)}`,!0),B.transaction.abort();return}if(A?.noCacheStore||B.noCacheStore){B.transaction.abort();return}Ir(B).addWrite({key:v,store:i,entry:p,nodeName:"source",commit:a((te,K)=>{if(K?.version!==R)return;let ge=qa(v,O,G);G?(Me.put?.(B,v,G),qe.default.trace?.(`Writing resolved record from source with id: ${v}, timestamp: ${new Date(te).toISOString()}`),y(v,G,K,te,0,m&&Re||null,{user:B?.user,expiresAt:B.expiresAt},"put",!!Ee)):K&&(Me.delete?.(B,v),qe.default.trace?.(`Deleting resolved record from source with id: ${v}, timestamp: ${new Date(te).toISOString()}`),m||g?y(v,null,K,te,0,m&&Re||null,{user:B?.user},"delete",!!Ee):i.remove(v,R))},"commit")})}),()=>{i.unlock(v,R)},q=>{i.unlock(v,R),x&&qe.default.error?.("Error committing cache update",q)})})}a(Ld,"getFromSource");function Ka(v){if(!v||v.user?.role?.permission?.super_user)return!0;if(v.replicateTo)throw new Or.ClientError("Can not specify replication parameters without super user permissions",403);if(v.replicatedConfirmation)throw new Or.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}a(Ka,"checkContextPermissions");function Ho(){if(Gr!==wd&&(wd=Gr,(0,ml.getWorkerIndex)()===(0,ml.getWorkerCount)()-1)){if(ka&&clearTimeout(ka),!Gr)return;let v=new Date;v.setMonth(0),v.setDate(1),v.setHours(0),v.setMinutes(0),v.setSeconds(0);let p=Math.ceil((Date.now()-v.getTime())/Gr)*Gr+v.getTime(),A=a(w=>{qe.default.trace?.(`Scheduled next cleanup scan at ${new Date(w)}ms`),ka=setTimeout(()=>X=X.then(async()=>{if(A(Math.max(w+Gr,Date.now())),i.rootStore.status!=="open"){clearTimeout(ka);return}let R=50,b=new Array(R),D=0;qe.default.info?.(`Starting cleanup scan for ${s}`);try{let O=0;for(let{key:B,value:k,version:C,expiresAt:F}of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let x;k===null&&!m&&C+Pme<Date.now()?x=i.remove(B,C):F!=null&&F+T<Date.now()&&(x=Ve.evict(B,k,C),O++),x&&(await b[D],b[D]=x.catch(q=>{qe.default.error?.("Cleanup error",q)}),++D>=R&&(D=0)),await Td()}qe.default.info?.(`Finished cleanup scan for ${s}, evicted ${O} entries`)}catch(O){qe.default.warn?.(`Error in cleanup scan for ${s}:`,O)}}),Math.min(w-Date.now(),2147483647)).unref()},"startNextTimer");A(p)}}a(Ho,"scheduleCleanup");function ie(){Q=l?.addDeleteRemovalCallback(n,v=>{let p=i.getEntry(v);p?.value===null&&i.remove(v,p.version)})}a(ie,"addDeleteRemoval");function Se(){(0,ml.getWorkerIndex)()===0&&setInterval(async()=>{if(!Ol){Ol=!0;try{let v=ne.name,p=r[v];if(!p)throw new Error(`expiresAt attribute ${ne} must be indexed`);for(let A of p.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let w of p.getValues(A)){let R=i.getEntry(w);R?.value?R.value[v]<Date.now()&&Ve.evict(w,R.value,R.version):i.ifVersion(w,R?.version,()=>p.remove(A,w))}await Td()}}catch(v){qe.default.error?.("Error in evicting old records",v)}finally{Ol=!1}}},Dme).unref()}a(Se,"runRecordExpirationEviction");function tt(v){if(v){let p=v.join(","),A=d.get([Symbol.for("residency_by_set"),p]);return A||(d.put([Symbol.for("residency_by_set"),p],A=Math.floor(Math.random()*2147483647)),d.put([Symbol.for("residency_by_id"),A],v),A)}}a(tt,"getResidencyId")}function lw(e,t){let r=e.attr_object||(e.attr_object={}),n=r[t];if(n)return n;n=r[t]=Object.create(null);for(let s of e)n[s.attribute_name]=s[t];return n}function VY(){}function Hme(e){zY=e}function CT(e,t){let r=t?.type;if(e===null)return e;if(e===""&&r&&r!=="String"&&r!=="Any")return null;try{switch(r){case"Int":case"Long":if(e[0]==="$")return wT(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return wT(+e);case"Float":return e==="null"?null:wT(+e);case"BigInt":return e==="null"?null:BigInt(e);case"Boolean":return e==="true"?!0:e==="false"?!1:e;case"Date":if(isNaN(e)){if(e==="null")return null;xme.test(e)||(e+="Z");let n=new Date(e);return wT(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,PT.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function wT(e){if(isNaN(e))throw new SyntaxError;return e}function KY(e,t){if(e==null)return!0;if(!Array.isArray(t))return e===t||t.startsWith?.(e);if(Array.isArray(e)){let r=e.length;if(e[r-1]===null&&r--,t.length>=r){for(let n=0;n<r;n++)if(t[n]!==e[n])return!1;return!0}return!1}else if(t[0]===e)return!0}function uw(e,t,r){return e?.then?e.then(t,r):t(e)}function DT(e,t){e[kr]=t,e[ve]=t?.value??null,e[wE]=t?.version}function YY(e){return e!=null}function ci(e){try{return JSON.stringify(e)}catch{return e}}function kme(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var Ms,Ba,CE,WY,jY,gd,Or,DE,PE,qe,Sl,ml,PT,Cme,zY,Dme,Pme,FY,Lme,wE,Mme,kr,IE,GY,Ume,cw,Os,ya,vme,qY,$Y,Bme,AMe,xme,Td,Lf=Ie(()=>{Ms=L(M()),Ba=require("lmdb"),CE=L(sn()),WY=require("lodash"),jY=L(Wd());Vs();sp();gd=L(se());JR();Or=L(_e()),DE=L(eo()),PE=L(qs());De();tE();qe=L(Sc());ap();pc();Sl=require("ordered-binary"),ml=L(dt());ji();PT=L(re());Ll();Ii();mT();Of();Cme=new Uint8Array(9);Cme[8]=192;Dme=6e4,Pme=864e5;gd.initSync();FY=gd.get(Ms.CONFIG_PARAMS.STORAGE_PREFETCHWRITES),Lme=1e4,wE=Symbol.for("version"),Mme=Symbol.for("incremental-update"),kr=Symbol("entry"),IE=Symbol("is-saving"),GY=1,Ume=2,cw=Symbol("loaded-from-source"),Os=1,ya=8,vme=Buffer.allocUnsafeSlow(8192),qY=1978,$Y=100,Bme={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},AMe=(0,PT.convertToMS)(gd.get(Ms.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;a(LT,"makeTable");a(lw,"attributesAsObject");a(VY,"noop");a(Hme,"setServerUtilities");xme=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;a(CT,"coerceType");a(wT,"rejectNaN");a(KY,"isDescendantId");Td=a(()=>new Promise(setImmediate),"rest");a(uw,"when");a(DT,"updateResource");a(YY,"exists");a(ci,"stringify");a(kme,"hasOtherProcesses")});var lt={};je(lt,{database:()=>zl,databases:()=>We,dropDatabase:()=>BR,dropTableMeta:()=>Vme,getDatabases:()=>ut,getDefaultCompression:()=>Tm,getTables:()=>Fme,onRemovedDB:()=>z_,onUpdatedTable:()=>Nc,readMetaDb:()=>LE,resetDatabases:()=>Uu,table:()=>Et,tables:()=>jn});function Fme(){return BT||ut(),jn||{}}function ut(){if(BT)return We;BT=!0,yd=new Map;let e=(0,er.getHdbBasePath)()&&(0,Ut.join)((0,er.getHdbBasePath)(),yr.DATABASES_DIR_NAME),t=(0,er.get)(yr.CONFIG_PARAMS.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,er.get)(yr.CONFIG_PARAMS.STORAGE_PATH)||e&&((0,rs.existsSync)(e)?e:(0,Ut.join)((0,er.getHdbBasePath)(),yr.LEGACY_DATABASES_DIR_NAME)),!e)return;if((0,rs.existsSync)(e))for(let n of(0,rs.readdirSync)(e,{withFileTypes:!0})){let s=(0,Ut.basename)(n.name,".mdb");n.isFile()&&(0,Ut.extname)(n.name).toLowerCase()===".mdb"&&!t[s]?.path&&LE((0,Ut.join)(e,n.name),null,s)}if((0,rs.existsSync)((0,Rd.getBaseSchemaPath)())){for(let n of(0,rs.readdirSync)((0,Rd.getBaseSchemaPath)(),{withFileTypes:!0}))if(!n.isFile()){let s=(0,Ut.join)((0,Rd.getBaseSchemaPath)(),n.name),i=(0,Ut.join)((0,Rd.getTransactionAuditStoreBasePath)(),n.name);for(let o of(0,rs.readdirSync)(s,{withFileTypes:!0}))if(o.isFile()&&(0,Ut.extname)(o.name).toLowerCase()===".mdb"){let c=(0,Ut.join)(i,o.name);LE((0,Ut.join)(s,o.name),(0,Ut.basename)(o.name,".mdb"),n.name,c,!0)}}}if(t)for(let n in t){let s=t[n],i=s.path;if((0,rs.existsSync)(i))for(let c of(0,rs.readdirSync)(i,{withFileTypes:!0}))c.isFile()&&(0,Ut.extname)(c.name).toLowerCase()===".mdb"&&LE((0,Ut.join)(i,c.name),(0,Ut.basename)(c.name,".mdb"),n);let o=s.tables;if(o)for(let c in o){let l=o[c],u=(0,Ut.join)(l.path,(0,Ut.basename)(c+".mdb"));(0,rs.existsSync)(u)&&LE(u,c,n,null,!0)}}for(let n in We){let s=yd.get(n);if(s){let i=We[n];n.includes("delete")&&Vt.trace(`defined tables ${Array.from(s.keys())}`);for(let o in i)s.has(o)||(Vt.trace(`delete table class ${o}`),delete i[o])}else if(delete We[n],n==="data"){for(let i in jn)delete jn[i];delete jn[HT]}}let r=["hdb_temp","hdb_certificate","hdb_analytics","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_license","hdb_info"];if(We.system)for(let n of r)We.system[n]&&(We.system[n].replicate=!1);return yd=null,We}function Uu(){BT=!1;for(let[,e]of Ha)e.needsDeletion=!0;ut();for(let[e,t]of Ha)t.needsDeletion&&!e.endsWith("system.mdb")&&(t.close(),Ha.delete(e),delete We[t.databaseName],UE.forEach(r=>r(t.databaseName)));return We}function LE(e,t,r=fw,n,s){let i=new dw.default(e,!1);try{let o=Ha.get(e);o?o.needsDeletion=!1:(o=(0,bd.open)(i),Ha.set(e,o));let c=new Tl.default(!1),l=o.dbisDb||(o.dbisDb=o.openDB(MT.INTERNAL_DBIS_NAME,c)),u=o.auditStore;u||(n?(0,rs.existsSync)(n)&&(i.path=n,u=(0,bd.open)(i),u.isLegacy=!0):u=hT(o));let d=ZY(r),_=d[HT],E=new Map;for(let{key:f,value:h}of l.getRange({start:!1})){let[T,m]=f.toString().split("/");m===""?m=h.name:m||(m=T,T=t,h.name||(h.name=m,h.indexed=!h.is_hash_attribute)),_?.add(T);let g=E.get(T);g||E.set(T,g={attributes:[]}),(m==null||h.is_hash_attribute)&&(g.primary=h),m!=null&&g.attributes.push(h),Object.defineProperty(h,"key",{value:f,configurable:!0})}for(let[f,h]of E){let{attributes:T,primary:m}=h;if(!m){for(let W of T)if(W.is_hash_attribute||W.isPrimaryKey){m=W;break}if(!m){Vt.warn(`Unable to find a primary key attribute on table ${f}, with attributes: ${JSON.stringify(T)}`);continue}}let g=d[f],S={},y=[],I,U,H=typeof m.audit=="boolean"?m.audit:(0,er.get)(yr.CONFIG_PARAMS.LOGGING_AUDITLOG),X=m.trackDeletes,Y=m.expiration,V=m.eviction,ne=m.sealed,Q=m.splitSegments,de=m.replicate;if(g)S=g.indices,y=g.attributes,g.schemaVersion++;else{I=m.tableId,I?I>=(l.get(Ad)||0)&&(l.putSync(Ad,I+1),Vt.info(`Updating next table id (it was out of sync) to ${I+1} for ${f}`)):(m.tableId=I=l.get(Ad),I||(I=1),Vt.debug("Table {table_name} missing an id, assigning {table_id}"),l.putSync(Ad,I+1),l.putSync(m.key,m));let W=new Tl.default(!m.is_hash_attribute,m.is_hash_attribute);if(W.compression=m.compression,W.compression){let ae=(0,er.get)(yr.CONFIG_PARAMS.STORAGE_COMPRESSION_THRESHOLD)||XY;W.compression.threshold=ae}U=mh(o.openDB(m.key,W)),o.databaseName=r,U.rootStore=o,U.tableId=I}for(let W of T){W.attribute=W.name;try{if(!W.is_hash_attribute&&(W.indexed||W.attribute&&!W.name)){if(!S[W.name]){let Oe=new Tl.default(!W.is_hash_attribute,W.is_hash_attribute);S[W.name]=o.openDB(W.key,Oe),S[W.name].indexNulls=W.indexNulls}let ae=y.find(Oe=>Oe.name===W.name);ae?y.splice(y.indexOf(ae),1,W):y.push(W)}}catch(ae){Vt.error("Error trying to update attribute",W,y,S,ae)}}if(!g){g=eW(d,f,LT({primaryStore:U,auditStore:u,audit:H,sealed:ne,splitSegments:Q,replicate:de,expirationMS:Y&&Y*1e3,evictionMS:V&&V*1e3,trackDeletes:X,tableName:f,tableId:I,primaryKey:m.name,databasePath:s?r+"/"+f:r,databaseName:r,indices:S,attributes:T,schemaDefined:m.schemaDefined,dbisDB:l})),g.schemaVersion=1;for(let W of ME)W(g)}}return o}catch(o){throw o.message+=` opening database ${e}`,o}}function ZY(e){let t=We[e];if(t||(e==="data"?t=We[e]=jn:e==="system"?Object.defineProperty(We,"system",{value:t=Object.create(null),configurable:!0}):t=We[e]=Object.create(null)),yd&&!yd.has(e)){let r=new Set;t[HT]=r,yd.set(e,r)}return t}function eW(e,t,r){return e[t]=r,r}function zl({database:e,table:t}){e||(e=fw),ut();let r=ZY(e),n=(0,Ut.join)((0,er.getHdbBasePath)(),yr.DATABASES_DIR_NAME),s=(0,er.get)(yr.CONFIG_PARAMS.DATABASES)||{};process.env.SCHEMAS_DATA_PATH&&(s.data={path:process.env.SCHEMAS_DATA_PATH});let i=t&&s[e]?.tables?.[t]?.path;n=i||s[e]?.path||process.env.STORAGE_PATH||(0,er.get)(yr.CONFIG_PARAMS.STORAGE_PATH)||((0,rs.existsSync)(n)?n:(0,Ut.join)((0,er.getHdbBasePath)(),yr.LEGACY_DATABASES_DIR_NAME));let o=(0,Ut.join)(n,(i?t:e)+".mdb"),c=Ha.get(o);if(!c||c.status==="closed"){let l=new dw.default(o,!1);c=(0,bd.open)(l),Ha.set(o,c)}return c.auditStore||(c.auditStore=hT(c)),c}async function BR(e){if(!We[e])throw new Error("Schema does not exist");let t=We[e],r;for(let n in t)r=t[n].primaryStore.rootStore,Ha.delete(r.path),r.status==="open"&&(await r.close(),await vE.remove(r.path));if(r||(r=zl({database:e,table:null}),r.status==="open"&&(await r.close(),await vE.remove(r.path))),e==="data"){for(let n in jn)delete jn[n];delete jn[HT]}delete We[e],UE.forEach(n=>n(e))}function Et(e){let{table:t,database:r,expiration:n,eviction:s,scanInterval:i,attributes:o,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:_,schemaDefined:E,origin:f}=e;r||(r=fw);let h=zl({database:r,table:t}),T=We[r];Vt.trace(`Defining ${t} in ${r}`);let m=T?.[t];if(h.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let g,S,y;E==null&&(E=!0);let I=new Tl.default(!1);for(let Q of o)Q.attribute&&!Q.name?(Q.name=Q.attribute,Q.indexed=!0):Q.attribute=Q.name,Q.expiresAt&&(Q.indexed=!0);let U,H;if(m){if(g=m.primaryKey,m.primaryStore.rootStore.status==="closed")throw new Error(`Can not use a closed data store from ${t} class`);u==null&&(u=m.splitSegments),m.attributes.splice(0,m.attributes.length,...o)}else{let Q=h.auditStore;S=o.find(Oe=>Oe.isPrimaryKey)||{},g=S.name,S.is_hash_attribute=S.isPrimaryKey=!0,S.schemaDefined=E,S.compression=Tm(),_&&(S.trackDeletes=!0),c=S.audit=typeof c=="boolean"?c:(0,er.get)(yr.CONFIG_PARAMS.LOGGING_AUDITLOG),n&&(S.expiration=n),s&&(S.eviction=s),S.splitSegments=!1,typeof l=="boolean"&&(S.sealed=l),typeof d=="boolean"&&(S.replicate=d),f&&(S.origins?S.origins.includes(f)||S.origins.push(f):S.origins=[f]),Vt.trace(`${t} table loading, opening primary store`);let de=new Tl.default(!1,!0);de.compression=S.compression;let W=t+"/";if(y=h.dbisDb=h.openDB(MT.INTERNAL_DBIS_NAME,I),ne(),y.get(W))return H&&H(),Uu(),Et(e);let ae=mh(h.openDB(W,de));h.databaseName=r,ae.rootStore=h,ae.tableId=y.get(Ad),Vt.trace(`Assigning new table id ${ae.tableId} for ${t}`),ae.tableId||(ae.tableId=1),y.put(Ad,ae.tableId+1),S.tableId=ae.tableId,m=eW(T,t,LT({primaryStore:ae,auditStore:Q,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:_,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:g,tableName:t,tableId:ae.tableId,databasePath:r,databaseName:r,indices:{},attributes:o,schemaDefined:E,dbisDB:y})),m.schemaVersion=1,U=!0,y.put(W,S)}let X=m.indices;y=y||(h.dbisDb=h.openDB(MT.INTERNAL_DBIS_NAME,I)),m.dbisDB=y;let Y=[];for(let{key:Q,value:de}of y.getRange({start:!0})){let[W,ae]=Q.toString().split("/");if(ae===""&&(ae=de.name),ae){if(W!==t)continue}else continue;let Oe=o.find(Me=>Me.name===ae),Ne=!Oe?.indexed&&de.indexed&&!de.isPrimaryKey;if((!Oe||Ne)&&(ne(),U=!0,Oe||y.remove(Q),Ne)){let Me=m.indices[W];Me&&Y.push(Me)}}let V=[];try{for(let Q of o||[]){if((Q.relationship||Q.computed)&&(U=!0,Q.relationship))continue;let de=t+"/"+(Q.name||"");Object.defineProperty(Q,"key",{value:de,configurable:!0});let W=y.get(de);if(Q.isPrimaryKey){if(W=W||y.get(de=t+"/")||{},c!==void 0&&c!==m.audit||l!==void 0&&l!==m.sealed||d!==void 0&&d!==m.replicate||(+n||void 0)!==(+W.expiration||void 0)||(+s||void 0)!==(+W.eviction||void 0)){let Oe={...W};typeof c=="boolean"&&(c&&m.enableAuditing(c),Oe.audit=c),n&&(Oe.expiration=+n),s&&(Oe.eviction=+s),l!==void 0&&(Oe.sealed=l),d!==void 0&&(Oe.replicate=d),U=!0,ne(),y.put(de,Oe)}continue}W?.attribute&&!W.name&&(W.indexed=!0);let ae=!W||W.type!==Q.type||W.indexed!==Q.indexed||W.nullable!==Q.nullable||W.version!==Q.version||JSON.stringify(W.properties)!==JSON.stringify(Q.properties)||JSON.stringify(W.elements)!==JSON.stringify(Q.elements);if(Q.indexed){let Oe=new Tl.default(!0,!1),Ne=h.openDB(de,Oe);(ae||W.indexingPID&&W.indexingPID!==process.pid||W.restartNumber<BE.workerData?.restartNumber)&&(U=!0,ne(),W=y.get(de),(ae||W.indexingPID&&W.indexingPID!==process.pid||W.restartNumber<BE.workerData?.restartNumber)&&(U=!0,Q.indexNulls===void 0&&(Q.indexNulls=!0),m.primaryStore.getStats().entryCount>0&&(Q.lastIndexedKey=W?.lastIndexedKey??void 0,Q.indexingPID=process.pid,Ne.isIndexing=!0,Object.defineProperty(Q,"dbi",{value:Ne}),V.push(Q))),y.put(de,Q)),W?.indexNulls&&Q.indexNulls===void 0&&(Q.indexNulls=!0),Ne.indexNulls=Q.indexNulls,X[Q.name]=Ne}else ae&&(U=!0,ne(),y.put(de,Q))}}finally{H&&H()}if(U&&(m.schemaVersion++,m.updatedAttributes()),Vt.trace(`${t} table loading, running index`),V.length>0||Y.length>0?m.indexingOperation=$me(m,V,Y):U&&UT.signalSchemaChange(new vT.SchemaEventMsg(process.pid,"schema-change",m.databaseName,m.tableName)),m.origin=f,U)for(let Q of ME)Q(m,f!=="cluster");return(n||s||i)&&m.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),Vt.trace(`${t} table loaded`),m;function ne(){H||h.transactionSync(()=>({then(Q){H=Q}}))}a(ne,"startTxn")}async function $me(e,t,r){try{Vt.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await UT.signalSchemaChange(new vT.SchemaEventMsg(process.pid,"schema-change",e.databaseName,e.tableName));let s;for(let u of r)s=u.drop();let i,o={},c=0,l=t.length;if(await new Promise(u=>setImmediate(u)),l>0){let u;for(let _ of t)(0,bd.compareKeys)(_.lastIndexedKey,u)<0&&(u=_.lastIndexedKey),_.lastIndexedKey==null&&_.dbi.clearAsync();let d=0;for(let{key:_,value:E,version:f}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(E){if(d++,s=e.primaryStore.ifVersion(_,f,()=>{for(let h=0;h<l;h++){let T=t[h],m=T.name;try{let g=T.resolve,S=E&&(g?g(E):E[m]),y=(0,QY.getIndexedValues)(S);if(y)for(let I=0,U=y.length;I<U;I++)T.dbi.put(y[I],_)}catch(g){o[m]||(o[m]=!0,Vt.error(`Error indexing attribute ${m}`,g))}}}),s.then(()=>d--,h=>{d--,Vt.error(h)}),BE.workerData&&BE.workerData.restartNumber!==JY.restartNumber&&(i=!0),++c%100===0||i){for(let h of t)h.lastIndexedKey=_,e.dbisDB.put(h.key,h);if(i)return}d>Gme?await s:d>qme&&await new Promise(h=>setImmediate(h))}for(let _ of t)delete _.lastIndexedKey,delete _.indexingPID,_.dbi.isIndexing=!1,s=e.dbisDB.put(_.key,_)}await s,await UT.signalSchemaChange(new vT.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),Vt.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){Vt.error("Error in indexing",n)}}function Vme({table:e,database:t}){let r=zl({database:t,table:e}),n=[],s=r.dbisDb;for(let i of s.getKeys({start:e+"/",end:e+"0"}))n.push(s.remove(i));return Promise.all(n)}function Nc(e){return ME.push(e),{remove(){let t=ME.indexOf(e);t>-1&&ME.splice(t,1)}}}function z_(e){return UE.push(e),{remove(){let t=UE.indexOf(e);t>-1&&UE.splice(t,1)}}}function Tm(){let e=(0,er.get)(yr.CONFIG_PARAMS.STORAGE_COMPRESSION),t=(0,er.get)(yr.CONFIG_PARAMS.STORAGE_COMPRESSION_DICTIONARY),r=(0,er.get)(yr.CONFIG_PARAMS.STORAGE_COMPRESSION_THRESHOLD)||XY,n={startingOffset:32};return t&&(n.dictionary=vE.readFileSync(t)),r&&(n.threshold=r),e&&n}var er,MT,bd,Ut,rs,Rd,Tl,dw,yr,vE,_w,QY,UT,vT,BE,Vt,JY,fw,HT,XY,jn,We,Ad,ME,UE,BT,Ha,yd,Gme,qme,De=Ie(()=>{er=L(se()),MT=L(Ht()),bd=require("lmdb"),Ut=require("path"),rs=require("fs"),Rd=L(Tt());Lf();Tl=L(r_()),dw=L(n_()),yr=L(M()),vE=L(require("fs-extra")),_w=L(_i()),QY=L(sn()),UT=L(eo()),vT=L(qs()),BE=require("worker_threads"),Vt=L(j()),JY=L(dt());ji();Ll();fw="data",HT=Symbol("defined-tables"),XY=((0,er.get)(yr.CONFIG_PARAMS.STORAGE_PAGESIZE)||4096)-60;(0,er.initSync)();jn=Object.create(null),We=Object.create(null);(0,_w._assignPackageExport)("databases",We);(0,_w._assignPackageExport)("tables",jn);Ad=Symbol.for("next-table-id"),ME=[],UE=[],Ha=new Map;a(Fme,"getTables");a(ut,"getDatabases");a(Uu,"resetDatabases");a(LE,"readMetaDb");a(ZY,"ensureDB");a(eW,"setTable");a(zl,"database");a(BR,"dropDatabase");a(Et,"table");Gme=1e3,qme=10;a($me,"runIndexing");a(Vme,"dropTableMeta");a(Nc,"onUpdatedTable");a(z_,"onRemovedDB");a(Tm,"getDefaultCompression")});var re=N((DMe,EW)=>{"use strict";var xa=require("path"),iW=require("fs-extra"),In=j(),tW=require("fs-extra"),xT=require("os"),Kme=require("net"),Yme=require("recursive-iterator"),Kt=M(),Wme=Eg(),rW=require("papaparse"),kT=require("moment"),{inspect:jme}=require("util"),nW=require("is-number"),CMe=require("lodash"),zme=require("minimist"),Qme=require("https"),Jme=require("http"),{hdb_errors:FT}=_e(),Xme=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,oW=require("util").promisify(setTimeout),Zme=100,eSe=5,tSe="",rSe=4,sW={true:!0,TRUE:!0,FALSE:!1,false:!1,undefined:null,null:null,NULL:null,NaN:NaN};EW.exports={isEmpty:ns,isEmptyOrZeroLength:Vi,arrayHasEmptyValues:iSe,arrayHasEmptyOrZeroLengthValues:oSe,buildFolderPath:aSe,isBoolean:aW,errorizeMessage:nSe,stripFileExtension:lSe,autoCast:uSe,autoCastJSON:cW,autoCastJSONDeep:hw,removeDir:dSe,compareVersions:_Se,isCompatibleDataVersion:fSe,escapeRawValue:ESe,unescapeValue:hSe,stringifyProps:pSe,timeoutPromise:SSe,isClusterOperation:gSe,getClusterUser:RSe,checkGlobalSchemaTable:ASe,getHomeDir:uW,getPropsFilePath:mSe,promisifyPapaParse:ySe,removeBOM:dW,createEventPromise:bSe,checkProcessRunning:OSe,checkSchemaTableExist:NSe,checkSchemaExists:_W,checkTableExists:fW,getStartOfTomorrowInSeconds:ISe,getLimitKey:wSe,isObject:cSe,isNotEmptyAndHasValue:sSe,autoCasterIsNumberCheck:lW,backtickASTSchemaItems:CSe,isPortTaken:TSe,createForkArgs:DSe,autoCastBoolean:PSe,async_set_timeout:oW,getTableHashAttribute:LSe,doesSchemaExist:MSe,doesTableExist:USe,stringifyObj:vSe,ms_to_time:BSe,changeExtension:HSe,getEnvCliRootPath:pw,noBootFile:xSe,httpRequest:kSe,transformReq:FSe,convertToMS:GSe,PACKAGE_ROOT:Kt.PACKAGE_ROOT};function nSe(e){return e instanceof Error?e:new Error(e)}a(nSe,"errorizeMessage");function ns(e){return e==null}a(ns,"isEmpty");function sSe(e){return!ns(e)&&(e||e===0||e===""||aW(e))}a(sSe,"isNotEmptyAndHasValue");function Vi(e){return ns(e)||e.length===0||e.size===0}a(Vi,"isEmptyOrZeroLength");function iSe(e){if(ns(e))return!0;for(let t=0;t<e.length;t++)if(ns(e[t]))return!0;return!1}a(iSe,"arrayHasEmptyValues");function oSe(e){if(Vi(e))return!0;for(let t=0;t<e.length;t++)if(Vi(e[t]))return!0;return!1}a(oSe,"arrayHasEmptyOrZeroLengthValues");function aSe(...e){try{return e.join(xa.sep)}catch{console.error(e)}}a(aSe,"buildFolderPath");function aW(e){return ns(e)?!1:e===!0||e===!1}a(aW,"isBoolean");function cSe(e){return ns(e)?!1:typeof e=="object"}a(cSe,"isObject");function lSe(e){return Vi(e)?tSe:e.slice(0,-rSe)}a(lSe,"stripFileExtension");function uSe(e){return ns(e)||e===""||typeof e!="string"?e:sW[e]!==void 0?sW[e]:lW(e)===!0?Number(e):Xme.test(e)?new Date(e):e}a(uSe,"autoCast");function cW(e){if(typeof e=="string"&&(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]")))try{return JSON.parse(e)}catch{}return e}a(cW,"autoCastJSON");function hw(e){if(e&&typeof e=="object"){if(Array.isArray(e))for(let t=0,r=e.length;t<r;t++){let n=e[t],s=hw(n);s!==n&&(e[t]=s)}else for(let t in e){let r=e[t],n=hw(r);n!==r&&(e[t]=n)}return e}else return cW(e)}a(hw,"autoCastJSONDeep");function lW(e){if(e.startsWith("0.")&&nW(e))return!0;let t=e.toUpperCase().includes("E");return!!((e!=="0"&&e.startsWith("0"))===!1&&t===!1&&nW(e))}a(lW,"autoCasterIsNumberCheck");async function dSe(e){if(Vi(e))throw new Error(`Directory path: ${e} does not exist`);try{await tW.emptyDir(e),await tW.remove(e)}catch(t){throw In.error(`Error removing files in ${e} -- ${t}`),t}}a(dSe,"removeDir");function _Se(e,t){if(Vi(e)){In.info("Invalid current version sent as parameter.");return}if(Vi(t)){In.info("Invalid upgrade version sent as parameter.");return}let r,n=/(\.0+)+$/,s=e.version?e.version:e,i=t.version?t.version:t,o=s.replace(n,"").split("."),c=i.replace(n,"").split("."),l=Math.min(o.length,c.length);for(let u=0;u<l;u++)if(r=parseInt(o[u],10)-parseInt(c[u],10),r)return r;return o.length-c.length}a(_Se,"compareVersions");function fSe(e,t,r=!1){let n=e.toString().split("."),s=t.toString().split(".");return n[0]===s[0]&&(!r||n[1]===s[1])}a(fSe,"isCompatibleDataVersion");function ESe(e){if(ns(e))return e;let t=String(e);return t==="."?Kt.UNICODE_PERIOD:t===".."?Kt.UNICODE_PERIOD+Kt.UNICODE_PERIOD:t.replace(Kt.FORWARD_SLASH_REGEX,Kt.UNICODE_FORWARD_SLASH)}a(ESe,"escapeRawValue");function hSe(e){if(ns(e))return e;let t=String(e);return t===Kt.UNICODE_PERIOD?".":t===Kt.UNICODE_PERIOD+Kt.UNICODE_PERIOD?"..":String(e).replace(Kt.ESCAPED_FORWARD_SLASH_REGEX,"/")}a(hSe,"unescapeValue");function pSe(e,t){if(ns(e))return In.info("Properties object is null"),"";let r="";return e.each(function(n,s){try{if(t&&t[n]){let i=t[n];for(let o of i)r+=";"+o+xT.EOL}!Vi(n)&&n[0]===";"?r+=" "+n+s+xT.EOL:Vi(n)||(r+=n+"="+s+xT.EOL)}catch{In.error(`Found bad property during upgrade with key ${n} and value: ${s}`)}}),r}a(pSe,"stringifyProps");function uW(){let e;try{e=xT.homedir()}catch{e=process.env.HOME}return e}a(uW,"getHomeDir");function mSe(){let e=xa.join(uW(),Kt.HDB_HOME_DIR_NAME,Kt.BOOT_PROPS_FILE_NAME);return iW.existsSync(e)||(e=xa.join(__dirname,"../","hdb_boot_properties.file")),e}a(mSe,"getPropsFilePath");function SSe(e,t){let r,n;return n=new Promise(function(s){r=setTimeout(function(){s(t)},e)}),{promise:n,cancel:a(function(){clearTimeout(r)},"cancel")}}a(SSe,"timeoutPromise");async function TSe(e){if(!e)throw new Error("Invalid port passed as parameter");return new Promise((t,r)=>{let n=Kme.createServer().once("error",s=>{s.code==="EADDRINUSE"?t(!0):r(s)}).once("listening",()=>n.once("close",()=>t(!1)).close()).listen(e)})}a(TSe,"isPortTaken");function gSe(e){try{return Kt.CLUSTER_OPERATIONS[e.toLowerCase()]!==void 0}catch(t){In.error(`Error checking operation against cluster ops ${t}`)}return!1}a(gSe,"isClusterOperation");function ASe(e,t){let r=(De(),oe(lt)).getDatabases();if(!r[e])return FT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e);if(!r[e][t])return FT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(ASe,"checkGlobalSchemaTable");function RSe(e,t){if(ns(t)){In.warn("No CLUSTERING_USER defined, clustering disabled");return}if(ns(e)||Vi(e)){In.warn("No users to search.");return}let r;try{let n=e.get(t);n&&n.role.permission.cluster_user===!0&&n.active===!0&&(r=n)}catch(n){In.error(`unable to find cluster_user due to: ${n.message}`);return}if(r===void 0){In.warn(`CLUSTERING_USER: ${t} not found or is not active.`);return}return r}a(RSe,"getClusterUser");function ySe(){rW.parsePromise=function(e,t,r){return new Promise(function(n,s){rW.parse(e,{header:!0,transformHeader:dW,chunk:t.bind(null,s),skipEmptyLines:!0,transform:r,dynamicTyping:!1,error:s,complete:n})})}}a(ySe,"promisifyPapaParse");function dW(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return e.charCodeAt(0)===65279?e.slice(1):e}a(dW,"removeBOM");function bSe(e,t,r){return new Promise(n=>{t.once(e,s=>{let i=r;In.info(`Got cluster status event response: ${jme(s)}`);try{i.cancel()}catch{In.error("Error trying to cancel timeout.")}n(s)})})}a(bSe,"createEventPromise");async function OSe(e){let t=!0,r=0;do await oW(Zme*r++),(await Wme.findPs(e)).length>0&&(t=!1);while(t&&r<eSe);if(t)throw new Error(`process ${e} was not started`)}a(OSe,"checkProcessRunning");function NSe(e,t){let r=_W(e);if(r)return r;let n=fW(e,t);if(n)return n}a(NSe,"checkSchemaTableExist");function _W(e){let{getDatabases:t}=(De(),oe(lt));if(!t()[e])return FT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(_W,"checkSchemaExists");function fW(e,t){let{getDatabases:r}=(De(),oe(lt));if(!r()[e][t])return FT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(fW,"checkTableExists");function ISe(){let e=kT().utc().add(1,Kt.MOMENT_DAYS_TAG).startOf(Kt.MOMENT_DAYS_TAG).unix(),t=kT().utc().unix();return e-t}a(ISe,"getStartOfTomorrowInSeconds");function wSe(){return kT().utc().format("DD-MM-YYYY")}a(wSe,"getLimitKey");function CSe(e){try{let t=new Yme(e);for(let{node:r}of t)r&&(r.columnid&&typeof r.columnid!="string"&&(r.columnid=r.columnid.toString()),r.columnid&&!r.columnid.startsWith("`")&&(r.columnid_orig=r.columnid,r.columnid=`\`${r.columnid}\``),r.tableid&&!r.tableid.startsWith("`")&&(r.tableid_orig=r.tableid,r.tableid=`\`${r.tableid}\``),r.databaseid&&!r.databaseid.startsWith("`")&&(r.databaseid_orig=r.databaseid,r.databaseid=`\`${r.databaseid}\``),r.as&&typeof r.as=="string"&&!r.as.startsWith("[")&&(r.as_orig=r.as,r.as=`\`${r.as}\``))}catch(t){In.error("Got an error back ticking items."),In.error(t)}}a(CSe,"backtickASTSchemaItems");function DSe(e){return[e]}a(DSe,"createForkArgs");function PSe(e){return e===!0||typeof e=="string"&&e.toLowerCase()==="true"}a(PSe,"autoCastBoolean");function LSe(e,t){let{getDatabases:r}=(De(),oe(lt)),n=r()[e]?.[t];return n?.primaryKey||n?.hash_attribute}a(LSe,"getTableHashAttribute");function MSe(e){let{getDatabases:t}=(De(),oe(lt));return t()[e]!==void 0}a(MSe,"doesSchemaExist");function USe(e,t){let{getDatabases:r}=(De(),oe(lt));return r()[e]?.[t]!==void 0}a(USe,"doesTableExist");function vSe(e){try{return JSON.stringify(e)}catch{return e}}a(vSe,"stringifyObj");function BSe(e){let t=kT.duration(e),r=t.seconds()>0?t.seconds()+"s":"",n=t.minutes()>0?t.minutes()+"m ":"",s=t.hours()>0?t.hours()+"h ":"",i=t.days()>0?t.days()+"d ":"";return(t.years()>0?t.years()+"y ":"")+i+s+n+r}a(BSe,"ms_to_time");function HSe(e,t){let r=xa.basename(e,xa.extname(e));return xa.join(xa.dirname(e),r+t)}a(HSe,"changeExtension");function pw(){if(process.env[Kt.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return process.env[Kt.CONFIG_PARAMS.ROOTPATH.toUpperCase()];let e=zme(process.argv);if(e[Kt.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return e[Kt.CONFIG_PARAMS.ROOTPATH.toUpperCase()]}a(pw,"getEnvCliRootPath");var Ew;function xSe(){if(Ew)return Ew;let e=pw();if(pw()&&iW.pathExistsSync(xa.join(e,Kt.HDB_CONFIG_FILE)))return Ew=!0,!0}a(xSe,"noBootFile");function kSe(e,t){let r;return e.protocol==="http:"?r=Jme:r=Qme,new Promise((n,s)=>{let i=r.request(e,o=>{o.setEncoding("utf8"),o.body="",o.on("data",c=>{o.body+=c}),o.on("end",()=>{n(o)})});i.on("error",o=>{s(o)}),i.write(t instanceof Buffer?t:JSON.stringify(t)),i.end()})}a(kSe,"httpRequest");function FSe(e){if(!e.schema&&!e.database){e.schema=Kt.DEFAULT_DATABASE_NAME;return}e.database&&(e.schema=e.database)}a(FSe,"transformReq");function GSe(e){let t=0;if(typeof e=="number"&&(t=e),typeof e=="string")switch(t=parseFloat(e),e.slice(-1)){case"M":t*=86400*30;break;case"D":case"d":t*=86400;break;case"H":case"h":t*=3600;break;case"m":t*=60;break}return t*1e3}a(GSe,"convertToMS")});var se=N((TW,gW)=>{"use strict";var mw=require("fs-extra"),gl=require("path"),hW=require("os"),qSe=require("properties-reader"),xE=j(),HE=re(),Le=M(),GT=Ct(),$Se="Error initializing environment manager",qT="BOOT_PROPS_FILE_PATH",pW=!1,VSe={[Le.HDB_SETTINGS_NAMES.INSTALL_USER]:!0,[Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY]:!0,[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]:!0,BOOT_PROPS_FILE_PATH:!0},Bo={};Object.assign(TW,gW.exports={BOOT_PROPS_FILE_PATH:qT,getHdbBasePath:KSe,setHdbBasePath:YSe,get:mW,initSync:jSe,setProperty:Je,initTestEnvironment:QSe,setCloneVar:zSe});function KSe(){return Bo[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]}a(KSe,"getHdbBasePath");function YSe(e){Bo[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]=e}a(YSe,"setHdbBasePath");function mW(e){let t=GT.getConfigValue(e);return t===void 0?Bo[e]:t}a(mW,"get");function Je(e,t){VSe[e]&&(Bo[e]=t),GT.updateConfigObject(e,t)}a(Je,"setProperty");function WSe(){let e;try{e=HE.getPropsFilePath(),mw.accessSync(e,mw.constants.F_OK|mw.constants.R_OK),pW=!0;let t=qSe(e);return Bo[Le.HDB_SETTINGS_NAMES.INSTALL_USER]=t.get(Le.HDB_SETTINGS_NAMES.INSTALL_USER),Bo[Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY]=t.get(Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY),Bo[qT]=e,!0}catch{return xE.trace(`Environment manager found no properties file at ${e}`),!1}}a(WSe,"doesPropFileExist");function jSe(e=!1){try{((pW||WSe()||HE.noBootFile())&&!SW||e)&&(GT.initConfig(e),Bo[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]=GT.getConfigValue(Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY))}catch(t){xE.error($Se),xE.error(t),console.error(t),process.exit(1)}}a(jSe,"initSync");var SW=!1;function zSe(e){SW=e}a(zSe,"setCloneVar");function QSe(e={}){try{let{keep_alive_timeout:t,headers_timeout:r,server_timeout:n,https_enabled:s,cors_enabled:i,cors_accesslist:o,local_studio_on:c}=e,l=gl.join(__dirname,"../../","unitTests");Bo[qT]=gl.join(l,"hdb_boot_properties.file"),Je(Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY,gl.join(l,"settings.test")),Je(Le.HDB_SETTINGS_NAMES.INSTALL_USER,hW.userInfo()?hW.userInfo().username:void 0),Je(Le.HDB_SETTINGS_NAMES.LOG_LEVEL_KEY,"debug"),Je(Le.HDB_SETTINGS_NAMES.LOG_PATH_KEY,gl.join(l,"envDir","log")),Je(Le.HDB_SETTINGS_NAMES.LOG_DAILY_ROTATE_KEY,!1),Je(Le.HDB_SETTINGS_NAMES.CLUSTERING_ENABLED_KEY,!0),Je(Le.HDB_SETTINGS_NAMES.CLUSTERING_NODE_NAME_KEY,"1231412de213"),Je(Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY,gl.join(l,"envDir")),Je(Le.CONFIG_PARAMS.STORAGE_PATH,gl.join(l,"envDir")),s&&(Je(Le.CONFIG_PARAMS.HTTP_SECUREPORT,mW(Le.CONFIG_PARAMS.HTTP_PORT)),Je(Le.CONFIG_PARAMS.HTTP_PORT,null)),Je(Le.CONFIG_PARAMS.CUSTOMFUNCTIONS_NETWORK_HTTPS,!!s),Je(Le.CONFIG_PARAMS.HTTP_PORT,9926),Je(Le.HDB_SETTINGS_NAMES.SERVER_PORT_KEY,9925),Je(Le.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT,9925),Je(Le.HDB_SETTINGS_NAMES.CORS_ENABLED_KEY,HE.isEmpty(i)?!1:i),Je(Le.CONFIG_PARAMS.HTTP_CORS,HE.isEmpty(i)?!1:i),Je(Le.HDB_SETTINGS_NAMES.MAX_CUSTOM_FUNCTION_PROCESSES,2),Je(Le.HDB_SETTINGS_NAMES.MAX_HDB_PROCESSES,4),Je(Le.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_PORT_KEY,9926),Je(Le.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_ENABLED_KEY,!0),Je(Le.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_DIRECTORY_KEY,gl.resolve(__dirname,"../../unitTests/server/fastifyRoutes/custom_functions")),Je(Le.HDB_SETTINGS_NAMES.LOCAL_STUDIO_ON,HE.isEmpty(c)?!1:c),o&&(Je("CORS_ACCESSLIST",o),Je(Le.CONFIG_PARAMS.HTTP_CORSACCESSLIST,o)),n&&(Je(Le.HDB_SETTINGS_NAMES.SERVER_TIMEOUT_KEY,n),Je(Le.CONFIG_PARAMS.HTTP_TIMEOUT,n)),t&&(Je(Le.HDB_SETTINGS_NAMES.SERVER_KEEP_ALIVE_TIMEOUT_KEY,t),Je(Le.CONFIG_PARAMS.HTTP_KEEPALIVETIMEOUT,t)),r&&(Je(Le.HDB_SETTINGS_NAMES.SERVER_HEADERS_TIMEOUT_KEY,r),Je(Le.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT,r))}catch(t){let r=`Error reading in HDB environment variables from path ${qT}. Please check your boot props and settings files`;xE.fatal(r),xE.error(t)}}a(QSe,"initTestEnvironment")});var Tr=N((xMe,HW)=>{"use strict";var Nr=se();Nr.initSync();var JSe=require("fs-extra"),XSe=require("semver"),GE=require("path"),{monotonicFactory:ZSe}=require("ulidx"),RW=ZSe(),eTe=require("util"),yW=require("child_process"),tTe=eTe.promisify(yW.exec),rTe=yW.spawn,Fr=It(),Xe=M(),$T=re(),li=j(),VT=Xi(),nTe=dp(),kE=Ct(),{broadcast:sTe,onMessageByType:iTe,getWorkerIndex:oTe}=dt(),{isMainThread:bW}=require("worker_threads"),{Encoder:aTe,decode:Aw}=require("msgpackr"),OW=new aTe,{isEmpty:bl}=$T,NW=xn(),MMe=48*36e11;bW&&iTe(Xe.ITC_EVENT_TYPES.RESTART,()=>{tn=void 0,yl=void 0});var{connect:cTe,StorageType:lTe,RetentionPolicy:uTe,AckPolicy:Rw,DeliverPolicy:yw,DiscardPolicy:dTe,NatsConnection:UMe,JetStreamManager:vMe,JetStreamClient:BMe,StringCodec:HMe,JSONCodec:_Te,createInbox:bw,headers:fTe,ErrorCode:AW}=require("nats"),{PACKAGE_ROOT:ETe}=M(),hTe=Ou(),{recordAction:pTe}=(Ii(),oe(W_)),IW=_Te(),mTe="clustering",STe=hTe.engines[Fr.NATS_SERVER_NAME],TTe=GE.join(ETe,"dependencies"),gw=GE.join(TTe,`${process.platform}-${process.arch}`,Fr.NATS_BINARY_NAME),Sw,Tw,FE,Al,Rl;HW.exports={runCommand:wW,checkNATSServerInstalled:gTe,createConnection:Ow,getConnection:qE,getJetStreamManager:$E,getJetStream:DW,getNATSReferences:Ki,getServerList:RTe,createLocalStream:Nw,listStreams:PW,deleteLocalStream:yTe,getServerConfig:Od,listRemoteStreams:bTe,viewStream:OTe,viewStreamIterator:NTe,publishToStream:ITe,request:DTe,reloadNATS:Iw,reloadNATSHub:PTe,reloadNATSLeaf:LTe,extractServerName:CTe,requestErrorHandler:MTe,createLocalTableStream:vW,createTableStreams:BTe,purgeTableStream:BW,purgeSchemaTableStreams:HTe,getStreamInfo:xTe,updateLocalStreams:FTe,closeConnection:ATe,getJsmServerName:KT,addNatsMsgHeader:LW,clearClientCache:CW,updateRemoteConsumer:UTe,createConsumer:MW,updateConsumerIterator:vTe};async function wW(e,t=void 0){let{stdout:r,stderr:n}=await tTe(e,{cwd:t});if(n)throw new Error(n.replace(`
|
|
131
|
+
`)}a(rK,"defaultNotFound")});var z1={};je(z1,{startHTTPThreads:()=>Vhe,startSocketServer:()=>II,updateWorkerIdleness:()=>gK});async function Vhe(e=2,t){try{if(t)OI(0,1,!0);else{let{loadRootComponents:r}=VS();if(e===0)return(0,Cs.setMainIsWorker)(!0),await RI().startServers(),Promise.resolve([]);await r()}TK();for(let r=0;r<e;r++)OI(r,e);return Promise.all(SK)}finally{(0,Cs.threadsHaveStarted)()}}function TK(){let e=(0,pK.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),bI=setInterval(()=>{WS.notify(e)},$he).unref())}function OI(e,t=1,r){if(yI++,(0,Cs.startWorker)("server/threads/threadServer.js",{name:_d.THREAD_TYPES.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((o,c)=>{function l(u){u.type===_d.CLUSTER_MESSAGE_TYPE_ENUM.CHILD_STARTED&&(n.removeListener("message",l),o(n))}a(l,"onMessage"),n.on("message",l),n.on("error",c)});SK.push(s),await s,cd.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",o=>{if(o.requestId){let c=YS.get(o.requestId);c&&c(o)}}),n.on("exit",i),n.on("shutdown",i);function i(){let o=cd.indexOf(n);o>-1&&cd.splice(o,1)}if(a(i,"removeWorker"),ld){let o=ld;ld=[];for(let c of o)mK[c.localPort](null,c)}}}),r){let n=setInterval(()=>{NI?NI=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,Cs.shutdownWorkers)(),yI=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function II(e=0,t){if(typeof e=="string")try{(0,jS.existsSync)(e)&&(0,jS.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=Khe:r=Yhe(t):r=wI;let n=(0,ud.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);if(n._handle){n._handle.onconnection=mK[e]=function(i,o){r.readsData||(o.reading=!1,o.readStop()),NI=!0,r(o,(c,l)=>{if(!c){if(fK){let d=o._socket||new ud.Socket({handle:o,writable:!0,readable:!0});fK.deliverSocket(d,e,l),d.resume()}else yI>0?(ld.length===0&&setTimeout(()=>{ld.length>0&&console.warn("Incoming sockets/requests have been queued for workers to start, and no workers have handled them. Check to make sure an error is not preventing workers from starting")},1e4).unref(),o.localPort=e,ld.push(o)):(console.log("start up a dynamic thread to handle request"),OI(0));mr(!1,"socket-routed");return}c.requests++;let u=o.fd;if(u>=0)c.postMessage({port:e,fd:u,data:l});else{let d=o._socket||new ud.Socket({handle:o,writable:!0,readable:!0});zhe(d,c,e)}mr(!0,"socket-routed")})};let s=Ou();WS.info(`HarperDB ${s.version} Server running on port ${e}`)}return n.on("error",s=>{console.error("Error in socket server",s)}),process.env._UNREF_SERVER&&n.unref(),n}function wI(e,t){let r,n=0;for(let s of cd){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=KS)return KS=i,t(r);n=i}KS=0,t(r)}function Khe(e,t){let r={};e.getpeername(r);let n=r.address,s=dd.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);wI(e,o=>{dd.set(n,{worker:o,lastUsed:i}),t(o)})}function Yhe(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new ud.Socket({handle:n,readable:!0,writable:!0});n._socket=i,i.on("data",o=>{n.readStop();let l=o.toString("latin1").match(t)?.[1],u=dd.get(l),d=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=d,s(u.worker);wI(n,_=>{dd.set(l,{worker:_,lastUsed:d}),s(_,o)})})}a(r,"findByHeaderAffinity")}function gK(){KS=0;for(let e of cd)e.expectedIdle=e.recentELU.idle+Whe,e.requests=1;cd.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function zhe(e,t,r){let n=jhe++;t.postMessage({port:r,requestId:n,event:"connection"}),e.on("data",s=>{let i=s.toString("latin1");t.postMessage({port:r,requestId:n,data:i,event:"data"})}).on("close",s=>{t.postMessage({port:r,requestId:n,event:"close",hadError:s})}).on("error",s=>{t.postMessage({port:r,requestId:n,event:"error",error:s})}).on("drain",s=>{t.postMessage({port:r,requestId:n,event:"drain",error:s})}).on("end",()=>{t.postMessage({port:r,requestId:n,event:"end"})}).resume(),YS.set(n,s=>{s.event=="data"&&e.write(Buffer.from(s.data,"latin1")),s.event=="end"&&(e.end(s.data&&Buffer.from(s.data,"latin1")),YS.delete(n)),s.event=="destroy"&&(e.destroy(),YS.delete(n))})}var Cs,ud,_d,WS,jS,hK,pK,cd,ld,mK,fK,yI,SK,bI,$he,NI,KS,EK,dd,Whe,YS,jhe,_I=Ie(()=>{Cs=L(dt()),ud=require("net"),_d=L(M()),WS=L(j()),jS=require("fs");Ii();hK=require("worker_threads"),pK=L(uc()),cd=[],ld=[],mK=[],yI=0,SK=[];hK.isMainThread&&(process.on("uncaughtException",e=>{e.code!=="ECONNRESET"&&e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,Cs.onMessageFromWorkers)(e=>{e.type===_d.ITC_EVENT_TYPES.RESTART&&bI&&(clearInterval(bI),TK())}));$he=6e5;a(Vhe,"startHTTPThreads");a(TK,"licenseWarning");a(OI,"startHTTPWorker");a(II,"startSocketServer");KS=0;a(wI,"findMostIdleWorker");EK=36e5,dd=new Map;a(Khe,"findByRemoteAddressAffinity");a(Yhe,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of dd)r.lastUsed+EK<e&&dd.delete(t)},EK).unref();Whe=1e3;a(gK,"updateWorkerIdleness");(0,Cs.setMonitorListener)(gK);YS=new Map,jhe=1;a(zhe,"proxySocket")});var bK=N((hLe,yK)=>{"use strict";var Qhe=require("cluster"),dl=se();dl.initSync();var RK=M(),uLe=require("util"),vo=j(),dLe=require("fs"),Jhe=require("fastify"),_Le=Ou(),Xhe=require("@fastify/cors"),Zhe=require("@fastify/compress"),epe=require("@fastify/static"),tpe=bN(),rpe=require("path"),{PACKAGE_ROOT:npe}=M(),spe=Fs(),ipe=re(),ope=xn(),ape=uc(),{server:cpe}=(qr(),oe(ja)),{node_request_key:fLe}=(RS(),oe(vN)),{authHandler:lpe,handlePostRequest:upe,serverErrorHandler:dpe,reqBodyValidationHandler:_pe}=TS(),ELe=require("net"),{registerContentHandlers:fpe}=($c(),oe(o$)),Epe=6e4,hpe=1024*1024*1024,ppe="TRUE",{CONFIG_PARAMS:TE}=RK,fd;yK.exports={hdbServer:AK,start:AK};async function AK(e){try{vo.debug("In Fastify server"+process.cwd()),vo.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),vo.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=Qhe.isMaster,await mpe();let t=e.securePort>0;fd=Spe(t),await fd.ready(),e||(e={}),e.isOperationsServer=!0;try{cpe.http(fd.server,e),fd.server.closeIdleConnections||await fd.listen({port:0,host:"::"})}catch(r){throw fd.close(),vo.error(r),vo.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),vo.fatal(t),process.exit(1)}}a(AK,"operationsServer");async function mpe(){vo.trace("Configuring HarperDB process."),spe.setSchemaDataToGlobal(),await ope.setUsersToGlobal(),await ape.getLicense()}a(mpe,"setUp");function Spe(e){vo.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=Tpe(e),r=Jhe(t);r.server.headersTimeout=Ape(),r.setErrorHandler(dpe);let n=gpe();n&&r.register(Xhe,n),r.register(function(i,o,c){i.setNotFoundHandler(function(l,u){r.server.emit("unhandled",l.raw,u.raw)}),c()}),r.register(tpe),r.register(Zhe),r.register(epe,{root:rpe.join(npe,"studio/build-local")}),fpe(r);let s=dl.get(RK.HDB_SETTINGS_NAMES.LOCAL_STUDIO_ON);return r.get("/",function(i,o){return!ipe.isEmpty(s)&&s.toString().toLowerCase()==="true"?o.sendFile("index.html"):o.sendFile("running.html")}),r.post("/",{preValidation:[_pe,lpe],config:{isOperation:!0}},async function(i,o){return i.body?.operation?.startsWith("restart")&&o.header("Connection","close"),upe(i,o)}),r.get("/health",()=>"HarperDB is running."),vo.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}a(Spe,"buildServer");function Tpe(e){let t=dl.get(TE.OPERATIONSAPI_NETWORK_TIMEOUT),r=dl.get(TE.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:hpe,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}a(Tpe,"getServerOptions");function gpe(){let e=dl.get(TE.OPERATIONSAPI_NETWORK_CORS),t=dl.get(TE.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===ppe)&&(r={origin:!0,allowedHeaders:["Content-Type","Authorization","Accept"],credentials:!1},t&&t.length>0&&t[0]!==null&&t[0]!=="*"&&(r.origin=(n,s)=>s(null,t.indexOf(n)!==-1))),r}a(gpe,"getCORSOpts");function Ape(){return dl.get(TE.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??Epe}a(Ape,"getHeaderTimeoutConfig")});var UI={};je(UI,{disableNATS:()=>ype,publishToStream:()=>JS,setNATSReplicator:()=>CI,setPublishToStream:()=>bpe,setSubscription:()=>MI,start:()=>Rpe});function Rpe(){gE.default.get(AE.default.CONFIG_PARAMS.CLUSTERING_ENABLED)&&Npe()}function ype(e=!0){CK=e}function bpe(e,t){JS=e,MI=t}function Npe(){if(CK||process.env._DISABLE_NATS)return;let e=ut(),t=Object.keys(e);t.push("system");for(let r of t){let n=e[r];for(let s in n){let i=n[s];CI(s,r,i)}}Nc((r,n)=>{CI(r.tableName,r.databaseName,r),n&&PK(r)}),!OK&&(OK=!0)}function CI(e,t,r){if(t==="system"&&Ipe.includes(e))return;if(!r)return console.error(`Attempt to replicate non-existent table ${e} from database ${t}`);if(r.sources.some(s=>s?.isNATSReplicator))return;r.sourcedFrom(class extends Pr{static{a(this,"NATSReplicator")}put(i){return n(this.getContext()).addWrite(t,{operation:"put",table:e,id:this[ze],record:i})}delete(){return n(this.getContext()).addWrite(t,{operation:"delete",table:e,id:this[ze]})}publish(i){return n(this.getContext()).addWrite(t,{operation:"publish",table:e,id:this[ze],record:i})}patch(i){return n(this.getContext()).addWrite(t,{operation:"patch",table:e,id:this[ze],record:i})}invalidate(){n(this.getContext()).addWrite(t,{operation:"invalidate",table:e,id:this[ze]})}static defineSchema(i){PK(i)}static subscribe(){let i=new Pn;return MI(t,e,i),i}static subscribeOnThisThread(i){return i<(gE.default.get(AE.default.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??Ope)}static isEqual(i){return i.isNATSReplicator}static isNATSReplicator=!0;static shouldReceiveInvalidations=!0},{intermediateSource:!0});function n(s){let i=s?.transaction?.nats;if(!i)if(s?.transaction){s.transaction.nats=i=new zS(s.transaction,s);let o=s.transaction;for(;o.next;)o=o.next;o.next=s.transaction.nats,i.user=s.user,i.context=s}else i=DK;return i}a(n,"getNATSTransaction")}function PK(e){let t=gE.default.get(AE.default.CONFIG_PARAMS.CLUSTERING_NODENAME);JS(`${PI.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,LI.createNatsTableStreamName)(e.databaseName,e.tableName),void 0,{operation:"define_schema",schema:e.databaseName,table:e.tableName,attributes:e.attributes,__origin:{timestamp:Date.now(),node_name:t}})}var NK,PI,LI,IK,wK,gE,AE,QS,CK,JS,MI,Ope,DK,OK,Ipe,zS,DI,LK=Ie(()=>{De();Vs();NK=L(Tr()),PI=L(It()),LI=L(Xi());Cl();IK=L(XS()),wK=L(sn()),gE=L(se()),AE=L(M()),QS=L(j());a(Rpe,"start");a(ype,"disableNATS");JS=NK.publishToStream,MI=IK.setSubscription;a(bpe,"setPublishToStream");Ope=2;a(Npe,"assignReplicationSource");Ipe=["hdb_job","hdb_analytics","hdb_raw_analytics","hdb_info","hdb_license"];a(CI,"setNATSReplicator");a(PK,"publishSchema");zS=class{constructor(t,r){this.transaction=t;this.options=r}static{a(this,"NATSTransaction")}user;writes_by_db=new Map;addWrite(t,r){r.expiresAt=this.context?.expiresAt;let n=this.writes_by_db.get(t);n||this.writes_by_db.set(t,n=[]),n.push(r)}commit({timestamp:t}){let r=gE.default.get(AE.default.CONFIG_PARAMS.CLUSTERING_NODENAME),n=[];for(let[s,i]of this.writes_by_db){let o=[],c=[],l,u;for(let d of i){let _=d.table,E=d.operation=="put"?"upsert":d.operation;l||(QS.trace(`Sending transaction event ${E}`),u=l={operation:E,schema:s,table:_,__origin:{user:this.user?.username,timestamp:t,node_name:r}},l.hash_values=c,E!=="delete"&&E!=="invalidate"&&(l.records=o)),l.table===_&&l.operation===E?(o.push(d.record),c.push(d.id)):u=u.next={operation:E,table:_,id:d.id,record:d.record},d.expiresAt&&(u.expiresAt=d.expiresAt)}l&&n.push(JS(`${PI.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,LI.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw QS.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},DI=class extends zS{static{a(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,wK.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};DK=new DI});async function HK({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let o=await vI.get(e,{returnNonexistent:!0});i=new xI(e,t,o),o&&(i.sessionWasPresent=!0)}else{if(e){let o=await vI.get(e);o&&o.delete()}i=new eT(e,t)}return n&&(n.id=e,n.user={username:t?.username},RE.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function BI(){return ZS++,ZS>65500&&(ZS=1),ZS}function HI(e,t,r){let{topic:n,retain:s}=e;e.data=t,e.async=!0,r.authorize=!0;let i=Oi.getMatch(n,"mqtt");if(!i)throw new Error(`Can not publish to topic ${n} as it does not exist, no resource has been defined to handle this topic`);e.url=i.relativeURL;let o=i.Resource;return Dt(r,()=>s?t===void 0?o.delete(e,r):o.put(e,e.data,r):o.publish(e,e.data,r))}var UK,Ma,vK,BK,MK,vI,RE,ZS,eT,xI,xK=Ie(()=>{De();Zl();UK=L(sn()),Ma=L(j());pc();vK=L(dt()),BK=L(RI());qr();MK=100,vI=Et({database:"system",table:"hdb_durable_session",attributes:[{name:"id",isPrimaryKey:!0},{name:"subscriptions",type:"array",elements:{attributes:[{name:"topic"},{name:"qos"},{name:"startTime"},{name:"acks"}]}}]}),RE=Et({database:"system",table:"hdb_session_will",attributes:[{name:"id",isPrimaryKey:!0},{name:"topic",type:"string"},{name:"data"},{name:"qos",type:"number"},{name:"retain",type:"boolean"},{name:"user",type:"any"}]});(0,vK.getWorkerIndex)()===0&&(async()=>{await BK.when_components_loaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of RE.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await it.getUser(r.user.username));try{await HI(r,t,r)}catch{(0,Ma.warn)("Failed to publish will",t)}RE.delete(e.id)}})();a(HK,"getSession");ZS=1;a(BI,"getNextMessageId");eT=class{static{a(this,"SubscriptionsSession")}listener;sessionId;user;request;socket;subscriptions=[];awaitingAcks;sessionWasPresent;keepalive;keepaliveTimer;constructor(t,r){this.sessionId=t,this.user=r}async addSubscription(t,r,n){let{topic:s,rh:i,startTime:o}=t,c=s.indexOf("?"),l,u;if(c>-1?(l=s.slice(c),u=s.slice(0,c)):u=s,!u)throw new Error("No topic provided");if(u.indexOf(".")>-1)throw new Error("Dots are not allowed in topic names");let d=this.subscriptions.find(g=>g.topic===s),_;d?(_=i>0,d.end(),this.subscriptions.splice(this.subscriptions.indexOf(d),1)):_=i===2;let E={search:l,async:!0,user:this.user,startTime:o,omitCurrent:_,url:""};o&&(0,Ma.trace)("Resuming subscription from",s,"from",o);let f=Oi.getMatch(u,"mqtt");if(!f){let g=new Error(`The topic ${s} does not exist, no resource has been defined to handle this topic`);throw g.statusCode=404,g}if(E.url=f.relativeURL,E.url.indexOf("+")>-1||E.url.indexOf("#")>-1){let g=E.url.slice(1);if(g.indexOf("#")>-1&&g.indexOf("#")!==g.length-1)throw new Error("Multi-level wildcards can only be used at the end of a topic");if(E.isCollection=!0,g.indexOf("+")===g.length-1)E.onlyChildren=!0,E.url="/"+g.slice(0,g.length-1);else{let S=g.split("/"),y;for(let H=0;H<S.length;H++)if(S[H].indexOf("+")>-1)if(S[H]==="+")y=!0;else throw new Error("Single-level wildcards can only be used as a topic level (between or after slashes)");if(n&&y)throw new Error("Filters can not be combined");let I=!0;S[S.length-1]==="#"&&(S.length--,I=!1),y&&(n=a(H=>{let X=H.id;if(!Array.isArray(X)||I&&X.length!==S.length)return!1;for(let Y=0;Y<S.length;Y++)if(S[Y]!=="+"&&S[Y]!==X[Y])return!1;return!0},"filter"));let U=S.indexOf("+");E.url="/"+(U>-1?S.slice(0,U):S).concat("").join("/")}}let h=f.path,T=f.Resource,m=await Dt(E,async()=>{let g=this.createContext();g.topic=s,g.retainHandling=i;let S=await T.subscribe(E,g);if(!S)return;if(!S[Symbol.asyncIterator])throw new Error(`Subscription is not (async) iterable for topic ${s}`);let y=(async()=>{for await(let I of S)try{let U;if(I.type&&I.type!=="put"&&I.type!=="delete"&&I.type!=="message"&&I.type!=="patch"||n&&!n(I))continue;r?(I.topic=s,U=this.needsAcknowledge(I)):(I.acknowledge?.(),U=BI());let H=I.id;if(Array.isArray(H)&&(H=Xl(H)),H==null&&(H=""),await this.listener(h+"/"+H,I.value,U,t)===!1)break;this.awaitingAcks?.size>MK?await new Promise(Y=>setTimeout(Y,this.awaitingAcks.size-MK)):await new Promise(setImmediate)}catch(U){(0,Ma.warn)(U)}})();return S});if(m)return m.topic=s,m.qos=t.qos,this.subscriptions.push(m),m}resume(){}needsAcknowledge(t){let r=BI();return t.acknowledge&&(this.awaitingAcks||(this.awaitingAcks=new Map),this.awaitingAcks.set(r,{acknowledge:t.acknowledge})),r}acknowledge(t){let r=this.awaitingAcks?.get(t);r&&(this.awaitingAcks.delete(t),r.acknowledge())}async removeSubscription(t){let r=this.subscriptions.find(n=>n.topic===t);if(r)return r.end(),this.subscriptions.splice(this.subscriptions.indexOf(r),1),!0}async publish(t,r){return HI(t,r,this.createContext())}createContext(){let t={session:this,socket:this.socket,user:this.user,authorize:!0};return this.request&&(t.request=this.request,t.url=this.request.url,t.headers=this.request.headers),t}setListener(t){this.listener=t}disconnect(t){this.keepaliveTimer&&clearTimeout(this.keepaliveTimer);let r=this.createContext();Dt(r,async()=>{try{if(!t){let n=await RE.get(this.sessionId);n?.doesExist()&&await HI(n,n.data,r)}}finally{await RE.delete(this.sessionId)}}).catch(n=>{(0,Ma.warn)(`Error publishing MQTT will for ${this.sessionId}`,n)});for(let n of this.subscriptions)n.end();this.subscriptions=[]}receivedPacket(){this.keepalive&&(clearTimeout(this.keepaliveTimer),this.keepaliveTimer=setTimeout(()=>{this.socket?.destroy?this.socket.destroy(new Error("Keepalive timeout")):this.socket?.terminate()},this.keepalive*1500))}};a(HI,"publish");xI=class extends eT{static{a(this,"DurableSubscriptionsSession")}sessionRecord;constructor(t,r,n){super(t,r),this.sessionRecord=n||{id:t,subscriptions:[]}}async resume(){for(let t of this.sessionRecord.subscriptions||[])await this.resumeSubscription({omitCurrent:!0,topic:t.topic,qos:t.qos,startTime:t.startTime},!0,t.acks?r=>!t.acks.includes(r.localTime):null)}resumeSubscription(t,r,n){return super.addSubscription(t,r,n)}needsAcknowledge(t){this.awaitingAcks||(this.awaitingAcks=new Map);let r=BI(),n={topic:t.topic,timestamp:t.localTime};return t.acknowledge&&(n.acknowledge=t.acknowledge),this.awaitingAcks.set(r,n),r}acknowledge(t){let r=this.awaitingAcks?.get(t);if(!r)return;this.awaitingAcks?.delete(t),r.acknowledge?.();let n=r.topic;for(let[,s]of this.awaitingAcks)if(s.topic===n&&s.timestamp<r.timestamp){for(let i of this.sessionRecord.subscriptions)if(i.topic===n){i.acks||(i.acks=[]),i.acks.push(r.timestamp),(0,Ma.trace)("Received ack",n,r.timestamp),this.sessionRecord.update();return}}for(let s of this.sessionRecord.subscriptions)s.topic===n&&(s.startTime=r.timestamp);this.sessionRecord.update()}async addSubscription(t,r){await this.resumeSubscription(t,r);let{qos:n,startTime:s}=t;return n>0&&!s&&this.saveSubscriptions(),t.qos}removeSubscription(t){let r=this.subscriptions.find(s=>s.topic===t),n=super.removeSubscription(t);return r.qos>0&&this.saveSubscriptions(),n}saveSubscriptions(){this.sessionRecord.subscriptions=this.subscriptions.map(t=>{let r=t.startTime;return r||(r=t.startTime=(0,UK.getNextMonotonicTime)()),(0,Ma.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),vI.put(this.sessionRecord)}}});var FI={};je(FI,{bypassAuth:()=>wpe,start:()=>Cpe});function wpe(){$K=!0}function Cpe({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new qK.EventEmitter},e.mqtt.events.on("error",()=>{}));let o=e.mqtt,c=[],l=r?.mtls;return n&&(c=e.ws((u,d,_,E)=>{if(d.headers.get("sec-websocket-protocol")!=="mqtt")return E(u,d,_);o.events.emit("connection",u),dr.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:f,onClose:h}=FK(u,T=>{u.send(T)},d,Promise.resolve(_).then(()=>d?.user),o);u.on("message",f),u.on("close",h),u.on("error",T=>{dr.info?.("WebSocket error",T)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(o.events.emit("connection",u),dr.debug?.(`Received ${u.getCertificate?"SSL":"TCP"} connection for MQTT from ${u.remoteAddress}`),l){if(u.authorized)try{let f=l.user;if(f!==null){(f===void 0||f==="Common Name"||f==="CN")&&(f=u.getPeerCertificate().subject.CN);try{d=await e.getUser(f,null,null),(0,Ed.get)(xr.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&rT.notify?.({username:d?.username,status:xr.AUTH_AUDIT_STATUS.SUCCESS,type:xr.AUTH_AUDIT_TYPES.AUTHENTICATION,auth_strategy:"MQTT mTLS",remote_address:u.remoteAddress})}catch(h){throw(0,Ed.get)(xr.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&rT.error?.({username:f,status:xr.AUTH_AUDIT_STATUS.FAILURE,type:xr.AUTH_AUDIT_TYPES.AUTHENTICATION,auth_strategy:"mqtt",remote_address:u.remoteAddress}),h}}else dr.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(f){o.events.emit("error",f,u),dr.error?.(f)}else if(l.required)return dr.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&$K&&u.remoteAddress.includes("127.0.0.1")&&(d=await(0,GK.getSuperUser)(),dr.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:_,onClose:E}=FK(u,f=>u.write(f),null,d,o);u.on("data",_),u.on("close",E),u.on("error",f=>{dr.info?.("Socket error",f)})},{port:t,securePort:s,mtls:l})),c}function FK(e,t,r,n,s){kK||(kK=!0,Y_(_=>{tT>0&&_.push({metric:"mqtt-connections",connections:tT,byThread:!0})}));let i;tT++;let o,c={protocolVersion:4},l=(0,nT.parser)({protocolVersion:5});function u(_){l.parse(_)}a(u,"onMessage");function d(){tT--,i||(i=!0,o?.disconnect?.(),s.events.emit("disconnected",o,e),s.sessions.delete(o),qn(!1,"connection","mqtt","disconnect"),dr.debug?.("MQTT connection was closed",e.remoteAddress))}return a(d,"onClose"),l.on("packet",async _=>{n?.then&&(n=await n);let E=_.cmd;if(o)o.then&&await o;else if(E!=="connect"){dr.info?.("Received packet before connection was established, closing connection"),e?.destroy?e.destroy():e?.terminate();return}let f=_.topic,h=f?.indexOf("/",1),T=h>0?f.slice(0,h):f;mr(_.length,"bytes-received",T,g(_),"mqtt");try{switch(o?.receivedPacket?.(),E){case"connect":if(c.protocolVersion=_.protocolVersion,_.username)try{n=await it.getUser(_.username,_.password.toString(),r),(0,Ed.get)(xr.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&rT.notify?.({username:n?.username,status:xr.AUTH_AUDIT_STATUS.SUCCESS,type:xr.AUTH_AUDIT_TYPES.AUTHENTICATION,auth_strategy:"MQTT",remote_address:e.remoteAddress})}catch(V){return(0,Ed.get)(xr.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&rT.error?.({username:_.username,status:xr.AUTH_AUDIT_STATUS.FAILURE,type:xr.AUTH_AUDIT_TYPES.AUTHENTICATION,auth_strategy:"mqtt",remote_address:e.remoteAddress}),s.events.emit("auth-failed",_,e,V),qn(!1,"connection","mqtt","connect"),m({cmd:"connack",reasonCode:4,returnCode:134})}if(!n&&s.requireAuthentication)return s.events.emit("auth-failed",_,e),qn(!1,"connection","mqtt","connect"),m({cmd:"connack",reasonCode:4,returnCode:134});try{if(s.authorizeClient?.(_,n),_.will){let V=e.deserialize||(e.deserialize=Ro(r?.headers.get?.("content-type")));_.will.data=_.will.payload?.length>0?V(_.will.payload):void 0,delete _.will.payload}o=HK({user:n,..._}),o=await o,o.socket=e,r&&(o.request=r),s.sessions.add(o)}catch(V){return dr.error?.(V),s.events.emit("auth-failed",_,e,V),qn(!1,"connection","mqtt","connect"),m({cmd:"connack",reasonCode:V.code||5,returnCode:V.code||128})}s.events.emit("connected",o,e),qn(!0,"connection","mqtt","connect"),m({cmd:"connack",sessionPresent:o.sessionWasPresent,reasonCode:0,returnCode:0}),o.setListener((V,ne,Q,de)=>{try{if(i)throw new Error("Session disconnected while trying to send message to",V);let W=V.indexOf("/",1),ae=W>0?V.slice(0,W):V;m({cmd:"publish",topic:V,payload:S(ne),messageId:Q||Math.floor(Math.random()*1e8),qos:de.qos},ae);let Oe=e._socket??e;return Oe.writableNeedDrain?new Promise(Ne=>Oe.once("drain",Ne)):!Oe.closed}catch(W){return dr.error?.(W),o?.disconnect(),s.sessions.delete(o),!1}}),o.sessionWasPresent&&await o.resume();break;case"subscribe":let y=[];for(let V of _.subscriptions){let ne;try{let Q=await o.addSubscription(V,V.qos>=1);ne=Q?Q.qos||0:c.protocolVersion<5?128:143}catch(Q){s.events.emit("error",Q,e,V,o),Q.statusCode?Q.statusCode===500?dr.warn?.(Q):dr.info?.(Q):dr.error?.(Q),ne=c.protocolVersion<5?128:Q.statusCode===403?135:Q.statusCode===404?143:128}y.push(ne)}await o.committed,m({cmd:"suback",granted:y,messageId:_.messageId});break;case"unsubscribe":{let V=[];for(let ne of _.unsubscriptions)V.push(o.removeSubscription(ne)?0:17);m({cmd:"unsuback",granted:V,messageId:_.messageId});break}case"pubrel":m({cmd:"pubcomp",messageId:_.messageId,reasonCode:0});return;case"publish":let I=_.qos===2?"pubrec":"puback",U=e.deserialize||(e.deserialize=Ro(r?.headers.get?.("content-type"))),X=(_.payload?.length||0)>0?U(_.payload):void 0,Y;try{Y=await o.publish(_,X)}catch(V){s.events.emit("error",V,e,_,o),dr.warn?.(V),_.qos>0&&m({cmd:I,messageId:_.messageId,reasonCode:128},_.topic);break}_.qos>0&&m({cmd:I,messageId:_.messageId,reasonCode:Y===!1?144:0},_.topic);break;case"pubrec":m({cmd:"pubrel",messageId:_.messageId,reasonCode:0});break;case"pubcomp":case"puback":o.acknowledge(_.messageId);break;case"pingreq":m({cmd:"pingresp"});break;case"disconnect":i=!0,o?.disconnect(!0),s.events.emit("disconnected",o,e),s.sessions.delete(o),qn(!0,"connection","mqtt","disconnect"),dr.debug?.("Received disconnect command, closing MQTT session",e.remoteAddress),e.close?e.close():e.end();break}}catch(y){s.events.emit("error",y,e,_,o),dr.error?.(y),m({cmd:"disconnect"})}function m(y,I){let U=(0,nT.generate)(y,c);t(U),mr(U.length,"bytes-sent",I,g(y),"mqtt")}a(m,"sendPacket");function g(y){return y.qos>0?y.cmd+",qos="+y.qos:y.cmd}a(g,"packetMethodName");function S(y){return qc(y,r)}a(S,"serialize")}),l.on("error",_=>{dr.warn("MQTT parsing error, closing connection:",_.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var nT,GK,Ed,xr,kI,qK,rT,dr,$K,kK,tT,VK=Ie(()=>{nT=require("mqtt-packet");xK();GK=L(xn());$c();Ii();qr();Ed=L(se()),xr=L(M()),kI=L(Sc()),qK=require("events"),rT=(0,kI.loggerWithTag)("auth-event"),dr=(0,kI.loggerWithTag)("mqtt"),$K=(0,Ed.get)(xr.CONFIG_PARAMS.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;a(wpe,"bypassAuth");a(Cpe,"start");tT=0;a(FK,"onSocket")});var kf={};je(kf,{component_errors:()=>pd,getComponentName:()=>Upe,loadComponent:()=>oT,loadComponentDirectories:()=>JK,setErrorReporter:()=>Mpe});function JK(e,t){t&&(qI=t),e&&($I=e);let r=[];if((0,Nt.existsSync)(GI)){let s=(0,Nt.readdirSync)(GI,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let o=i.name,c=(0,Ot.join)(GI,o);r.push(oT(c,qI,"hdb",!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(oT(n,qI,n,!1,null,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{QK=!0})}function Mpe(e){yE=e}async function oT(e,t,r,n,s,i){let o=(0,Nt.realpathSync)(e);if(sT.has(o))return sT.get(o);sT.set(o,!0),s&&($I=s);try{let c;n&&(pd=new Map);let l=(0,Ot.join)(e,n?"harperdb-config.yaml":"config.yaml");(0,Nt.existsSync)(l)?c=n?(0,aT.getConfigObj)():(0,YK.parseDocument)((0,Nt.readFileSync)(l,"utf8")).toJSON():c=VI;let u=(0,Ot.join)(e,"node_modules","harperdb");try{_l.isMainThread&&(n||(0,Nt.existsSync)(u)&&(0,Nt.realpathSync)(Sd.PACKAGE_ROOT)!==(0,Nt.realpathSync)(u))&&((0,Nt.rmSync)(u,{recursive:!0,force:!0}),(0,Nt.existsSync)((0,Ot.join)(e,"node_modules"))||(0,Nt.mkdirSync)((0,Ot.join)(e,"node_modules")),(0,Nt.symlinkSync)(Sd.PACKAGE_ROOT,u,"dir"))}catch(E){hd.default.error("Error symlinking harperdb module",E)}let d=iT,_=n;for(let E in c){iT=E;let f=c[E];if(pd.set(n?E:(0,Ot.basename)(e),!1),!f)continue;let h,T=f.package;try{if(T){let I=e,U;for(;!(0,Nt.existsSync)(U=(0,Ot.join)(I,"node_modules",E));)if(I=(0,Ot.dirname)(I),I.length<(0,zK.getHdbBasePath)().length){U=null;break}if(U)h=await oT(U,t,r,!1),_=!0;else throw new Error(`Unable to find package ${E}:${T}`)}else h=Lpe[E];if(!h)continue;let m=a(I=>(I.origin=r,Et(I)),"ensureTable"),g=f.network||(f.port||f.securePort)&&f,S=g?.securePort||g?.https&&g.port,y=!g?.https&&g?.port;if(_l.isMainThread&&(h=await h.startOnMainThread?.({server:it,ensureTable:m,port:y,securePort:S,resources:t,...f})||h,n&&g))for(let I of[y,S])try{if(+I&&!KK.includes(I)){let U=KI.get(Sd.CONFIG_PARAMS.HTTP_SESSIONAFFINITY);U&&hd.default.warn("Session affinity is not recommended and may cause memory leaks"),(U||!AS)&&(KK.push(I),II(I,U))}}catch(U){console.error("Error listening on socket",I,U,E)}if(t.isWorker&&(h=await h.start?.({server:it,ensureTable:m,port:y,securePort:S,resources:t,...f})||h),$I.set(h,!0),(h.handleFile||h.handleDirectory||h.setupFile||h.setupDirectory)&&f.files!=null){if(f.files.includes(".."))throw(0,jK.handleHDBError)("Can not reference parent directories");let I=(0,Ot.join)(e,f.files).replace(/\\/g,"/"),U=I.indexOf("/*");if(U>-1&&f.files!==VI[E]?.files&&!(0,Nt.existsSync)(I.slice(0,U)))throw new Error(`The path '${I.slice(0,U)}' does not exist and cannot be used as the base of the resolved 'files' path value '${f.files}'`);let H=(0,Ot.basename)(e),X=f.path||"/";X=X.startsWith("/")?X:X.startsWith("./")?"/"+H+X.slice(2):X==="."?"/"+H:"/"+H+"/"+X;let Y,V,ne;if(f.root){let de=f.root;de.startsWith("/")&&(de=de.slice(1)),de.endsWith("/")&&(de=de.slice(0,-1)),de+="/",V=(0,Ot.join)(e,de)}else(ne=I.indexOf("/*"))>-1?(V=I.slice(0,ne+1),Y=(0,Ot.relative)(e,V)):f.files.indexOf("/")>-1&&(V=I.slice(0,I.lastIndexOf("/")+1),Y=(0,Ot.relative)(e,V));let Q=!1;if(_l.isMainThread&&h.setupDirectory&&(Q=await h.setupDirectory?.(X,V,t)),t.isWorker&&h.handleDirectory&&(Q=await h.handleDirectory?.(X,V,t)),Q){_=!0;continue}for(let de of await(0,WK.default)(I,{onlyFiles:!1,objectMode:!0})){let{path:W,dirent:ae}=de;_=!0;let Oe=(0,Ot.relative)(e,W).replace(/\\/g,"/");if(Y)if(Oe.startsWith(Y))Oe=Oe.slice(Y.length+1);else throw new Error(`The root path '${f.root}' does not reference a valid part of the file path '${Oe}'.The root path should be used to indicate the relative path/part of the file path for determining the exported web path.`);let Ne=X+(X.endsWith("/")?"":"/")+Oe;try{if(ae.isFile()){let Me=await Ppe(W);_l.isMainThread&&await h.setupFile?.(Me,Ne,W,t),t.isWorker&&await h.handleFile?.(Me,Ne,W,t)}else _l.isMainThread&&await h.setupDirectory?.(Ne,W,t),t.isWorker&&await h.handleDirectory?.(Ne,W,t)}catch(Me){Me.message=`Could not load ${ae.isFile()?"file":"directory"} '${W}'${f.module?" using '"+f.module+"'":""} for application '${e}' due to: ${Me.message}`,yE?.(Me),((0,md.getWorkerIndex)()===0?console:hd.default).error(Me),t.set(f.path||"/",new Xo(Me)),pd.set(n?E:(0,Ot.basename)(e),Me.message)}}}}catch(m){m.message=`Could not load component '${E}' for application '${(0,Ot.basename)(e)}' due to: ${m.message}`,yE?.(m),((0,md.getWorkerIndex)()===0?console:hd.default).error(m),t.set(f.path||"/",new Xo(m),null,!0),pd.set(n?E:(0,Ot.basename)(e),m.message)}}if(iT=d,_l.isMainThread&&!QK&&i&&(0,md.watchDir)(e,async()=>JK()),c.extensionModule){let E=await dS((0,Ot.join)(e,c.extensionModule));return sT.set(o,E),E}if(!_&&t.isWorker){let E=`${e} did not load any modules, resources, or files, is this a valid component?`;yE?.(new Error(E)),((0,md.getWorkerIndex)()===0?console:hd.default).error(E),pd.set((0,Ot.basename)(e),E)}}catch(c){console.error(`Could not load application directory ${e}`,c),c.message=`Could not load application due to ${c.message}`,yE?.(c),t.set("",new Xo(c))}}var Nt,Ot,_l,YK,KI,Sd,WK,md,hd,jK,zK,Dpe,aT,Ppe,GI,$I,QK,qI,pd,Lpe,VI,KK,sT,yE,iT,Upe,Ff=Ie(()=>{Nt=require("fs"),Ot=require("path"),_l=require("worker_threads"),YK=require("yaml"),KI=L(se()),Sd=L(M());eD();p$();g$();b$();O$();k$();SV();bV();WK=L(require("fast-glob")),md=L(dt()),hd=L(j());cN();qr();jK=L(_e());De();_I();zK=L(se()),Dpe=L(bK());Nm();LK();ls();VK();aT=L(Ct());RS();WR();({readFile:Ppe}=Nt.promises),GI=(0,aT.resolvePath)(KI.get(Sd.CONFIG_PARAMS.COMPONENTSROOT)),$I=new Map,pd=new Map;a(JK,"loadComponentDirectories");Lpe={REST:pS,rest:pS,graphql:oN,graphqlSchema:Rg,roles:aN,jsResource:uN,fastifyRoutes:DN,login:_N,static:PN,operationsApi:Dpe,customFunctions:{},http:{},clustering:UI,replication:oa,authentication:Nf,mqtt:FI},VI={rest:!0,graphql:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js",path:"."}};Object.defineProperty(VI,"static",{value:{files:"web/**"}});KK=[],sT=new Map;a(Mpe,"setErrorReporter");Upe=a(()=>iT,"getComponentName");a(oT,"loadComponent")});var VS=N(($Le,ZK)=>{var{isMainThread:XK}=require("worker_threads"),{getTables:vpe,getDatabases:GLe,table:qLe}=(De(),oe(lt)),{loadComponentDirectories:Bpe,loadComponent:Hpe}=(Ff(),oe(kf)),{resetResources:xpe}=(Zl(),oe(n0)),kpe=rO(),Fpe=Ct(),{dirname:Gpe}=require("path"),{getConnection:qpe}=Tr(),$pe=se(),{CONFIG_PARAMS:Vpe}=M(),{loadCertificates:Kpe}=Js(),YI=new Map;async function Ype(e=!1){!XK&&$pe.get(Vpe.CLUSTERING_ENABLED)&&qpe();try{XK&&await kpe()}catch(n){console.error(n)}let t=xpe();vpe(),t.isWorker=e,await Kpe(),await Hpe(Gpe(Fpe.getConfigFilePath()),t,"hdb",!0,YI),await Bpe(YI,t);let r=[];for(let[n]of YI)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}a(Ype,"loadRootComponents");ZK.exports.loadRootComponents=Ype});var dt=N((KLe,oi)=>{"use strict";var{Worker:Wpe,MessageChannel:jpe,parentPort:Gi,isMainThread:JI,threadId:zpe,workerData:qi}=require("worker_threads"),{PACKAGE_ROOT:Qpe}=M(),{join:nY,isAbsolute:Jpe,extname:Xpe}=require("path"),{server:sY}=(qr(),oe(ja)),{watch:Zpe,readdir:eme}=require("fs/promises"),{totalmem:eY}=require("os"),bE=M(),iY=se(),$i=j(),{randomBytes:tme}=require("crypto"),{_assignPackageExport:rme}=_i(),nme=M(),tY=1024*1024,Ua=[],Ds=[],sme=50,XI=1e4,ime="restart",oY="request_thread_info",aY="resource_report",cY="thread_info",lY="added-port",ome="ack",WI;rme("threads",Ds);oi.exports={startWorker:jI,restartWorkers:ew,shutdownWorkers:dme,workers:Ua,setMonitorListener:Tme,onMessageFromWorkers:_me,onMessageByType:pY,broadcast:Eme,broadcastWithAcknowledgement:pme,setChildListenerByType:ume,getWorkerIndex:uY,getWorkerCount:dY,getTicketKeys:fY,setMainIsWorker:cme,setTerminateTimeout:ame,restartNumber:qi?.restartNumber||1};Ds.onMessageByType=pY;Ds.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=Ds.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};oi.exports.whenThreadsStarted=new Promise(e=>{oi.exports.threadsHaveStarted=e});var ZI;function ame(e){XI=e}a(ame,"setTerminateTimeout");function uY(){return qi?qi.workerIndex:ZI?0:void 0}a(uY,"getWorkerIndex");function dY(){return qi?qi.workerCount:ZI?1:void 0}a(dY,"getWorkerCount");function cme(e){ZI=e,oi.exports.threadsHaveStarted()}a(cme,"setMainIsWorker");var _Y=1,cT;function fY(){return cT||(cT=JI?tme(48):qi.ticketKeys,cT)}a(fY,"getTicketKeys");Object.defineProperty(sY,"workerIndex",{get(){return uY()}});Object.defineProperty(sY,"workerCount",{get(){return dY()}});var EY={[oY](e,t){mme(t)},[aY](e,t){Sme(t,e)}};function jI(e,t={}){let r=process.constrainedMemory?.()||eY();r=Math.min(r,eY(),2e4*tY);let n=iY.get(bE.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/tY/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],o=[];for(let l of Ds){let u=new jpe;u.existingPort=l,i.push(u),o.push(u.port2)}Xpe(e)||(e+=".js");let c=new Wpe(Jpe(e)?e:nY(Qpe,e),{resourceLimits:{maxOldGenerationSizeMb:n,maxYoungGenerationSizeMb:s},execArgv:["--enable-source-maps"],argv:process.argv.slice(2),workerData:{addPorts:o,addThreadIds:i.map(l=>l.existingPort.threadId),workerIndex:t.workerIndex,workerCount:_Y=t.threadCount,name:t.name,restartNumber:oi.exports.restartNumber,ticketKeys:fY()},transferList:o,...t});for(let{port1:l,existingPort:u}of i)u.postMessage({type:lY,port:l,threadId:c.threadId},[l]);return uT(c,!0),c.unexpectedRestarts=t.unexpectedRestarts||0,c.startCopy=()=>jI(e,t),c.on("error",l=>{$i.error(`Worker index ${t.workerIndex} error:`,l)}),c.on("exit",l=>{Ua.splice(Ua.indexOf(c),1),!c.wasShutdown&&t.autoRestart!==!1&&(c.unexpectedRestarts<sme?(t.unexpectedRestarts=c.unexpectedRestarts+1,jI(e,t)):$i.error(`Thread has been restarted ${c.restarts} times and will not be restarted`))}),c.on("message",l=>{EY[l.type]?.(l,c)}),Ua.push(c),Ame(),t.onStarted&&t.onStarted(c),c.name=t.name,c}a(jI,"startWorker");var lme=[bE.THREAD_TYPES.HTTP];async function ew(e=null,t=Math.max(_Y>3,1),r=!0){if(JI){if(r){let{loadRootComponents:o}=VS();await o()}oi.exports.restartNumber++,t<1&&(t=t*Ua.length);let n=[],s=[];for(let o of Ua.slice(0)){if(e&&o.name!==e||o.wasShutdown)continue;$i.trace("sending shutdown request to ",o.threadId),o.postMessage({restartNumber:oi.exports.restartNumber,type:bE.ITC_EVENT_TYPES.SHUTDOWN}),o.wasShutdown=!0,o.emit("shutdown",{});let c=lme.indexOf(o.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{$i.warn("Thread did not voluntarily terminate, terminating from the outside",o.threadId),o.terminate()},XI*2).unref();o.on("exit",()=>{clearTimeout(d),n.splice(n.indexOf(l)),!c&&r&&o.startCopy(),u()})});if(n.push(l),c&&r){let u=o.startCopy(),d=new Promise(_=>{let E=a(f=>{f.type===nme.ITC_EVENT_TYPES.CHILD_STARTED&&($i.trace("Worker has started",u.threadId),_(),s.splice(s.indexOf(d)),u.off("message",E))},"startListener");$i.trace("Waiting for worker to start",u.threadId),u.on("message",E)});s.push(d),n.length>=t&&await Promise.race(n),s.length>=t&&await Promise.race(s)}}await Promise.all(n),await Promise.all(s);let{restartService:i}=Hu();r&&(e==="http"||!e)&&iY.get(bE.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else Gi.postMessage({type:ime,workerType:e})}a(ew,"restartWorkers");function ume(e,t){EY[e]=t}a(ume,"setChildListenerByType");function dme(e){return ew(e,1/0,!1)}a(dme,"shutdownWorkers");var hY=[];function _me(e){hY.push(e)}a(_me,"onMessageFromWorkers");var zI=new Map;function pY(e,t){let r=zI.get(e);r||zI.set(e,r=[]),r.push(t)}a(pY,"onMessageByType");var fme=10;async function Eme(e,t){let r=0;for(let n of Ds)try{n.postMessage(e),r++>fme&&(r=0,await new Promise(setImmediate))}catch(s){$i.error("Unable to send message to worker",s)}t&&SY(e,null)}a(Eme,"broadcast");var lT=new Map,hme=1;function pme(e){return new Promise(t=>{let r=0;for(let n of Ds)try{let s=hme++,i=a(()=>{lT.delete(s),--r===0&&t(),n!==Gi&&--n.refCount===0&&n.unref()},"ack_handler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,lT.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,o]of lT)o.port===n&&o()})),n.postMessage(e),r++}catch(s){$i.error("Unable to send message to worker",s)}r===0&&t()})}a(pme,"broadcastWithAcknowledgement");function mme(e){e.postMessage({type:cY,workers:mY()})}a(mme,"sendThreadInfo");function mY(){let e=Date.now();return Ua.map(t=>({threadId:t.threadId,name:t.name,heapTotal:t.resources?.heapTotal,heapUsed:t.resources?.heapUsed,externalMemory:t.resources?.external,arrayBuffers:t.resources?.arrayBuffers,sinceLastUpdate:e-t.resources?.updated,...t.recentELU}))}a(mY,"getChildWorkerInfo");function Sme(e,t){e.resources=t,e.resources.updated=Date.now()}a(Sme,"recordResourceReport");var QI;function Tme(e){QI=e}a(Tme,"setMonitorListener");var gme=1e3,rY=!1;function Ame(){rY||(rY=!0,setInterval(()=>{for(let e of Ua){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}QI&&QI()},gme).unref())}a(Ame,"startMonitoring");var Rme=1e3;if(Gi&&qi?.addPorts){uT(Gi);for(let e=0,t=qi.addPorts.length;e<t;e++){let r=qi.addPorts[e];r.threadId=qi.addThreadIds[e],uT(r)}setInterval(()=>{let e=process.memoryUsage();Gi.postMessage({type:aY,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},Rme).unref(),WI=a(()=>new Promise((e,t)=>{Gi.on("message",r),Gi.postMessage({type:oY});function r(n){n.type===cY&&(Gi.off("message",r),e(n.workers))}a(r,"receiveThreadInfo")}),"getThreadInfo")}else WI=mY;oi.exports.getThreadInfo=WI;function uT(e,t){Ds.push(e),e.on("message",r=>{if(r.type===lY)r.port.threadId=r.threadId,uT(r.port);else if(r.type===ome){let n=lT.get(r.id);n&&n()}else SY(r,e)}).on("close",()=>{Ds.splice(Ds.indexOf(e),1)}).on("exit",()=>{Ds.splice(Ds.indexOf(e),1)}),t?e.refCount=100:e.unref()}a(uT,"addPort");function SY(e,t){for(let n of hY)n(e,t);let r=zI.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){$i.error(s)}}a(SY,"notifyMessageListeners");if(JI){let e,t,r=new Set,n=a(async(s,i)=>{i&&(e=i);for(let o of await eme(s,{withFileTypes:!0}))o.isDirectory()&&o.name!=="node_modules"&&n(nY(s,o.name));try{for await(let{filename:o}of Zpe(s,{persistent:!1}))r.add(o),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await ew(),console.log("Reloaded HarperDB components, changed files:",Array.from(r)),r.clear()},100)}catch(o){console.warn("Error trying to watch component directory",s,o)}},"watch_dir");oi.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else Gi.on("message",async e=>{let{type:t}=e;t===bE.ITC_EVENT_TYPES.SHUTDOWN&&(oi.exports.restartNumber=e.restartNumber,Gi.unref(),setTimeout(()=>{$i.warn("Thread did not voluntarily terminate",zpe),process.exit(0)},XI).unref())})});var rv={};je(rv,{AUDIT_STORE_OPTIONS:()=>gf,Decoder:()=>Oc,HAS_CURRENT_RESIDENCY_ID:()=>Ja,HAS_EXPIRATION_EXTENDED_TYPE:()=>t_,HAS_ORIGINATING_OPERATION:()=>e_,HAS_PREVIOUS_RESIDENCY_ID:()=>Xa,REMOTE_SEQUENCE_UPDATE:()=>Pp,createAuditEntry:()=>Pl,getLastRemoved:()=>Cy,openAuditStore:()=>hT,readAuditEntry:()=>xt,removeAuditEntry:()=>pT,setAuditRetention:()=>bme,transactionKeyEncoder:()=>wY});function hT(e){let t=e.auditStore=e.openDB(tw.AUDIT_STORE_NAME,{create:!1,...gf});t||(t=e.auditStore=e.openDB(tw.AUDIT_STORE_NAME,gf),gY(t,1)),t.rootStore=e;let r=[];t.addDeleteRemovalCallback=function(i,o){return r[i]=o,t.deleteCallbacks=r,{remove(){delete r[i]}}};let n=null;function s(i=dT){clearTimeout(n),n=setTimeout(async()=>{if(t.rootStore.status==="closed"||t.rootStore.status==="closing")return;let o=0,c,l;try{for(let{key:u,value:d}of t.getRange({start:1,snapshot:!1,end:Date.now()-rw}))if(c=pT(t,u,d),l=u,await new Promise(setImmediate),++o>=yme){i=10;break}await c}finally{o===0?i=Math.min(i<<1,rw/10):gY(t,l),s(i)}},i).unref()}if(a(s,"scheduleAuditCleanup"),t.scheduleAuditCleanup=s,(0,NE.getWorkerIndex)()===(0,NE.getWorkerCount)()-1&&s(dT),(0,NE.getWorkerIndex)()===0&&!TY)for(let i of t.getKeys({reverse:!0,limit:1}))i>Date.now()&&(TY=!0,ET.error("The current time is before the last recorded entry in the audit log. Time reversal can undermine the integrity of data tracking and certificate validation and the time must be corrected."));return t}function pT(e,t,r){if((Ome(r)&15)===nw){let n=xt(r),s=n.tableId;e.deleteCallbacks?.[s]?.(n.recordId)}return e.remove(t)}function gY(e,t){sw[0]=t,e.put(Symbol.for("last-removed"),CY)}function Cy(e){let t=e.get(Symbol.for("last-removed"));if(t)return CY.set(t),sw[0]}function bme(e,t=dT){rw=e,dT=t}function Pl(e,t,r,n,s,i,o,c,l,u,d,_,E){let f=DY[o];if(!f)throw new Error(`Invalid audit entry type ${o}`);let h=1;if(n&&(n>1?va.setFloat64(0,n):Ps.set(kg),h=9),l){if(l&16761087)throw new Error("Illegal extended type");h++}g(s),g(t),m(r),va.setFloat64(h,e),h+=8,l&Ja&&g(u),l&Xa&&g(d),l&t_&&(va.setFloat64(h,_),h+=8),l&e_&&g(PY[E]),i?m(i):Ps[h++]=0,l?va.setUint16(n?8:0,f|l|32768):Ps[n?8:0]=f;let T=Ps.subarray(0,h);if(c)return Buffer.concat([T,c]);return T;function m(S){let y=h;h+=1,h=(0,fl.writeKey)(S,Ps,h);let I=h-y-1;I>127?I>16383?(ET.error("Key or username was too large for audit entry",S),h=y+1,Ps[y]=0):(Ps.copyWithin(y+2,y+1,h),va.setUint16(y,I|32768),h++):Ps[y]=I}function g(S){S<128?Ps[h++]=S:S<16384?(va.setUint16(h,S|32768),h+=2):S<1056964608?(va.setUint32(h,S|3221225472),h+=4):(Ps[h]=255,va.setUint32(h+1,S),h+=5)}}function Ome(e){let t=0;e[0]==66&&(t=8);let r=e[t];if(r<128)return r;let n=e.dataView||(e.dataView=new Oc(e.buffer,e.byteOffset,e.byteLength));return n.position=t,n.readInt()}function xt(e,t=0,r=void 0){try{let n=e.dataView||(e.dataView=new Oc(e.buffer,e.byteOffset,e.byteLength));n.position=t;let s;e[n.position]==66&&(s=n.readFloat64());let i=n.readInt(),o=n.readInt(),c=n.readInt(),l=n.readInt(),u=n.position,d=n.position+=l,_=n.readFloat64(),E,f,h,T;if(i&Ja&&(E=n.readInt()),i&Xa&&(f=n.readInt()),i&t_&&(h=n.readFloat64()),i&e_){let S=n.readInt();T=PY[S]}l=n.readInt();let m=n.position,g=n.position+=l;return{type:DY[i&7],tableId:c,nodeId:o,get recordId(){return(0,fl.readKey)(e,u,d)},getBinaryRecordId(){return e.subarray(u,d)},version:_,previousLocalTime:s,get user(){return g>m?(0,fl.readKey)(e,m,g):void 0},get encoded(){return t?e.subarray(t,r):e},getValue(S,y,I){if(i&_T||i&OE&&!y)return S.decoder.decode(e.subarray(n.position,r));if(i&OE&&I)return iw(S.getEntry(this.recordId),I,S)},getBinaryValue(){return i&(_T|OE)?e.subarray(n.position,r):void 0},extendedType:i,residencyId:E,previousResidencyId:f,expiresAt:h,originatingOperation:T}}catch(n){return ET.error("Reading audit entry error",n,e),{}}}var fl,fT,tw,NY,NE,IY,ET,Ps,va,wY,gf,rw,yme,sw,CY,dT,TY,_T,OE,AY,nw,RY,yY,bY,OY,Pp,Ja,Xa,e_,t_,DY,PY,Oc,ji=Ie(()=>{fl=require("ordered-binary"),fT=L(se()),tw=L(Ht()),NY=L(M()),NE=L(dt()),IY=L(re());Ll();ET=L(j());mT();(0,fT.initSync)();Ps=Buffer.alloc(2816),va=new DataView(Ps.buffer,Ps.byteOffset,2816),wY={writeKey(e,t,r){return e===Zd?(t.set(Zd,r),r+8):typeof e=="number"?((t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))).setFloat64(r,e),r+8):(0,fl.writeKey)(e,t,r)},readKey(e,t,r){return e[t]===66?(e.dataView||(e.dataView=new DataView(e.buffer,e.byteOffset,e.byteLength))).getFloat64(t):(0,fl.readKey)(e,t,r)}},gf={encoding:"binary",keyEncoder:wY},rw=(0,IY.convertToMS)((0,fT.get)(NY.CONFIG_PARAMS.LOGGING_AUDITRETENTION))||86400*3,yme=1e3,sw=new Float64Array(1),CY=new Uint8Array(sw.buffer),dT=1e4,TY=!1;a(hT,"openAuditStore");a(pT,"removeAuditEntry");a(gY,"updateLastRemoved");a(Cy,"getLastRemoved");a(bme,"setAuditRetention");_T=16,OE=32,AY=1,nw=2,RY=3,yY=4,bY=5,OY=6,Pp=11,Ja=512,Xa=1024,e_=2048,t_=4096,DY={put:AY|_T,[AY]:"put",delete:nw,[nw]:"delete",message:RY|_T,[RY]:"message",invalidate:yY|OE,[yY]:"invalidate",patch:bY|OE,[bY]:"patch",relocate:OY,[OY]:"relocate"},PY={insert:1,update:2,upsert:3,1:"insert",2:"update",3:"upsert"};a(Pl,"createAuditEntry");a(Ome,"readAction");a(xt,"readAuditEntry");Oc=class extends DataView{static{a(this,"Decoder")}position=0;readInt(){let t;return t=this.getUint8(this.position++),t>=128?t>=192?t===255?(t=this.getUint32(this.position),this.position+=4,t):(t=this.getUint32(this.position-1)&1073741823,this.position+=3,t):(t=this.getUint16(this.position-1)&32767,this.position++,t):t}readFloat64(){try{let t=this.getFloat64(this.position);return this.position+=8,t}catch(t){throw t.message=`Error reading float64: ${t.message} at position ${this.position}`,t}}}});var ow={};je(ow,{add:()=>ST,applyReverse:()=>LY,getRecordAtTime:()=>iw,rebuildUpdateBefore:()=>TT});function ST(e,t,r){let n=e[t];typeof n=="bigint"?e[t]=n+BigInt(r.value):isNaN(e[t])?e[t]=r.value:e[t]=n+r.value}function TT(e,t,r){let n=null;for(let s in e)if(s in t){let i=t[s];if(i?.__op__){let o=e[s];if(o?.__op__)if(o.__op__===i.__op__)n||(n={}),n[s]=o;else throw new Error("Can not merge updates with different operations");else n||(n={}),n[s]=o,ST(n,s,i)}else r&&(n||(n={}),n[s]=i)}else n||(n={}),n[s]=e[s];return n}function LY(e,t){for(let r in t){let n=t[r];if(n?.__op__){let s=Nme[n.__op__]?.reverse;if(s)s(e,r,{value:n.value});else throw new Error(`Unsupported operation ${n.__op__}`)}else e[r]=MY}}function iw(e,t,r){let n=r.rootStore.auditStore,s={...e.value},i=e.localTime;for(;i>t;){let l=n.get(i),u=xt(l);switch(u.type){case"put":s=u.getValue(r);break;case"patch":LY(s,u.getValue(r));break;case"delete":s=null}i=u.previousLocalTime}let o={},c=0;for(let l in s)s[l]===MY&&(o[l]=!0,c++);for(;c>0&&i>0;){let l=n.get(i),u=xt(l),d;switch(u.type){case"put":d=u.getValue(r);break;case"patch":d=u.getValue(r);break}for(let _ in d)o[_]&&(s[_]=d[_],o[_]=!1,c--);i=u.previousLocalTime}if(c>0)for(let l in o)s[l]=null;return s}var Nme,MY,mT=Ie(()=>{ji();a(ST,"add");ST.reverse=function(e,t,r){let n=e[t];typeof n=="bigint"?e[t]=n-BigInt(r.value):isNaN(e[t])||(e[t]=n-r.value)};Nme={add:ST};a(TT,"rebuildUpdateBefore");a(LY,"applyReverse");MY={};a(iw,"getRecordAtTime")});function Zn(e){return e[_r]||(e[_r]=Object.create(null))}function bT(e,t){let r=e.prototype,n={},s=t.attributes||t.properties||[];for(let o of s){let c=o.name,l,u;if(o.resolve)u={get(){return o.resolve(this,this[Fe])},set(d){return o.set(this,d)},configurable:!0};else{switch(o.type){case"String":l=a(function(d){if(!(typeof d=="string"||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be a string, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"ID":l=a(function(d){if(!(typeof d=="string"||d?.length>0&&d.every?.(_=>typeof _=="string")||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be a string, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Float":case"Number":l=a(function(d){let _=d?.__op__?d.value:d;if(!(typeof _=="number"||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be a number, attempt to assign ${_}`);Zn(this)[c]=d},"set");break;case"Int":l=a(function(d){let _=d?.__op__?d.value:d;if(!(_>>0===_||d==null&&o.nullable!==!1))if(typeof _=="number"&&Math.abs((_>>0)-_)<=1)_=Math.round(_),d?.__op__?d.value=_:d=_;else throw new Ls.ClientError(`${c} must be an integer between -2147483648 and 2147483647, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Long":l=a(function(d){let _=d?.__op__?d.value:d;if(!(Math.round(_)===d&&Math.abs(_)<=9007199254740992||d==null&&o.nullable!==!1))if(typeof _=="number"&&Math.abs(_)<=9007199254740992)_=Math.round(_),d?.__op__?d.value=_:d=_;else throw new Ls.ClientError(`${c} must be an integer between -9007199254740992 and 9007199254740992, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"BigInt":l=a(function(d){let _=d?.__op__?d.value:d;if(!(typeof _=="bigint"||d==null&&o.nullable!==!1))if(typeof _=="string"||typeof _=="number")_=BigInt(_),d?.__op__?d.value=_:d=_;else throw new Ls.ClientError(`${c} must be a number, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Boolean":l=a(function(d){if(!(typeof d=="boolean"||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be a boolean, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Date":l=a(function(d){if(!(d instanceof Date||d==null&&o.nullable!==!1))if(typeof d=="string"||typeof d=="number")d=new Date(d);else throw new Ls.ClientError(`${c} must be a Date, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Bytes":l=a(function(d){if(!(d instanceof Uint8Array||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be a Buffer or Uint8Array, attempt to assign ${d}`);Zn(this)[c]=d},"set");break;case"Any":case void 0:l=a(function(d){Zn(this)[c]=d},"set");break;default:l=a(function(d){if(!(typeof d=="object"||d==null&&o.nullable!==!1))throw new Ls.ClientError(`${c} must be an object, attempt to assign ${d}`);Zn(this)[c]=d},"set")}u={get(){let d=this[_r];if(d&&c in d){let E=d[c];if(E?.__op__){let f=this[ve]?.[c];return E.update(f)}return E}let _=this[ve]?.[c];if(_&&typeof _=="object"){let E=vY(_,o);if(E)return d||(d=this[_r]=Object.create(null)),d[c]=E}return _},set:l,enumerable:!0,configurable:!0}}u.get.isAttribute=!0,n[c]=u,(!(c in r)||Object.getOwnPropertyDescriptor(r,c)?.get?.isAttribute)&&Object.defineProperty(r,c,u)}i("getProperty",function(o){let c=n[o];if(c)return c.get.call(this);let l=this[_r];return l?.[o]!==void 0?l[o]:this[ve]?.[o]}),i("set",function(o,c){let l=n[o];if(l)return l.set.call(this,c);if(t.sealed)throw new Ls.ClientError("Can not add a property to a sealed table schema");Zn(this)[o]=c}),i("deleteProperty",function(o){Zn(this)[o]=void 0}),i("toJSON",function(){let o=this[_r],c;for(let u in o){c||(c={...this[ve]});let d=o[u];if(d?.__op__){let _=c[u];d=d.update(_)}c[u]=d}return Object.keys(this).length>0&&(c||(c={...this[ve]}),Object.assign(c,this)),c||this[ve]}),r.get||i("get",r.getProperty),r.delete||i("delete",r.deleteProperty);function i(o,c){Object.defineProperty(r,o,{value:c,configurable:!0})}a(i,"setMethod")}function vY(e,t){let r;switch(e.constructor){case Object:return t?((r=t.TrackedObject)||(t.TrackedObject=r=class{static{a(this,"TrackedObject")}constructor(s){if(s?.[ve])throw new Error("Can not track an already tracked object, check for circular references");this[ve]=s}},bT(r,t)),new r(e)):new gT(e);case Array:let n=new RT(e.length);n[ve]=e;for(let s=0,i=e.length;s<i;s++){let o=e[s];o&&typeof o=="object"&&(o=vY(o,t?.elements)),n[s]=o}return n;default:return e}}function op(e){let t=e[_r],r;for(let s in t){r||(r={...e[ve]});let i=t[s];if(i&&typeof i=="object")if(i.__op__){let o=r[s];i=i.update(o)}else i=op(i);r[s]=i}return Object.keys(e).length>0&&(r||(r={...e[ve]}),Object.assign(r,e)),r||e[ve]}function hl(e,t=e[_r]){let r;if(UY.call(e,ve)&&e.constructor===Array&&!Object.isFrozen(e)){r=e;for(let n=0,s=e.length;n<s;n++){let i=e[n];if(i&&typeof i=="object"){let o=hl(i);o!==i&&r===e&&(r=e.slice(0)),i=o}r[n]=i}return Object.freeze(r)}for(let n in t){r||(r={...e[ve]});let s=t[n];if(s&&typeof s=="object")if(s.__op__){let i=ow[s?.__op__];if(i)i(r,n,s);else throw new Error("Invalid CRDT operation "+s.__op__);continue}else s=hl(s);r[n]=s}return r?Object.freeze(r):UY.call(e,ve)?e[ve]:e}function AT(e){let t=e[ve];if(t===void 0)return!0;if(e.constructor===Array){if(!t||e[El]||e.length!==t.length)return!0;for(let r=0,n=e.length;r<n;r++){let s=t[r],i=e[r];if(s&&i?.[ve]===s){if(AT(i))return!0}else return!0}}else{let r=e[_r];if(r&&!t)return!0;for(let n in r){let s=r[n];if(s&&typeof s=="object"){let i=t[n];if(i&&s[ve]===i){if(AT(s))return!0}else return!0}else return!0}}return!1}var Ls,_r,gT,UY,El,RT,yT,ap=Ie(()=>{Vs();Ls=L(_e());mT();_r=Symbol("own-data");a(Zn,"getChanges");a(bT,"assignTrackedAccessors");a(vY,"trackObject");gT=class{static{a(this,"GenericTrackedObject")}constructor(t){if(t?.[ve])throw new Error("Can not track an already tracked object, check for circular references");this[ve]=t}};bT(gT,{});a(op,"collapseData");UY=Object.prototype.hasOwnProperty;a(hl,"updateAndFreeze");a(AT,"hasChanges");El=Symbol.for("has-array-changes"),RT=class extends Array{static{a(this,"TrackedArray")}[El];constructor(t){super(t)}splice(...t){return this[El]=!0,super.splice(...t)}push(...t){return this[El]=!0,super.push(...t)}pop(){return this[El]=!0,super.pop()}unshift(...t){return this[El]=!0,super.unshift(...t)}shift(){return this[El]=!0,super.shift()}};RT.prototype.constructor=Array;yT=class{constructor(t){this.value=t}static{a(this,"Addition")}__op__="add";update(t){return(+t||0)+this.value}}});var uR={};je(uR,{CONTEXT:()=>Fe,ID_PROPERTY:()=>ze,IS_COLLECTION:()=>ai,MultiPartId:()=>NT,RECORD_PROPERTY:()=>ve,Resource:()=>Pr,snake_case:()=>wme,transformForSelect:()=>IT});function wme(e){return e[0].toLowerCase()+e.slice(1).replace(/[a-z][A-Z][a-z]/g,t=>t[0]+"_"+t.slice(1))}function BY(e,t){if(pl=!1,e==="")return null;if(e=e.slice(1),t.splitSegments){if(e.indexOf("/")===-1)return e===""?(pl=!0,null):t.coerceId(decodeURIComponent(e));let r=e.split("/"),n=new NT;for(let s=0;s<r.length;s++){let i=r[s];if(!i&&s===r.length-1){pl=!0;break}n[s]=t.coerceId(decodeURIComponent(i))}return n}else{if(e==="")return pl=!0,null;e[e.length-1]==="/"&&(pl=!0)}return t.coerceId(decodeURIComponent(e))}function es(e,t){n.reliesOnPrototype=!0;let r=t.hasContent;return n;function n(s,i,o){let c,l,u,d;if(r?(o?(d=i,o=o[Fe]||o):i?typeof s=="object"&&s&&(!Array.isArray(s)||typeof s[0]=="object")?(d=s,c=d[this.primaryKey]??null,o=i[Fe]||i):d=i:(d=s,s=void 0,c=d[ze]??d[this.primaryKey]),c===null&&(u=!0)):i?o=i[Fe]||i:s&&typeof s=="object"&&!Array.isArray(s)&&(o=s),c===void 0)if(typeof s=="object"&&s){if(l=s,typeof(c=s.url)=="string"){let f=c.indexOf("?");if(f>-1){let T=this.parseQuery(c.slice(f+1));l?T&&(l=Object.assign(T,l)):l=T,c=c.slice(0,f)}let h=this.parsePath(c,o,l);h?.id!==void 0?(h.query&&(l?l=Object.assign(h.query,l):l=h.query),u=h.isCollection,c=h.id):c=h}else if(s[Symbol.iterator]){c=[],u=!0;for(let f of s){if(typeof f=="object"&&f)break;c.push(f)}c.length===0?c=null:(c.length===1&&(c=c[0]),l.slice&&(l=l.slice(c.length,l.length),l.length===0&&(l=null,u=!1)))}c===void 0&&(c=s.id??null,c==null&&(u=!0))}else c=s,l=new el(c),c==null&&(u=!0);o||(o={});let _;if(l?.ensureLoaded!=null||l?.async||u?(_={...t},l?.ensureLoaded!=null&&(_.ensureLoaded=l.ensureLoaded),l?.async&&(_.async=l.async),u&&(_.isCollection=!0)):_=t,o.transaction){let f=this.getResource(c,o,_);return f.then?f.then(E):E(f)}else return Dt(o,()=>{let f=this.getResource(c,o,_);return f.then?f.then(E):E(f)},_);function E(f){if(o.authorize){o.authorize=!1;let h=t.type==="read"?f.allowRead(o.user,l,o):t.type==="update"?f.doesExist?.()===!1?f.allowCreate(o.user,d,o):f.allowUpdate(o.user,d,o):t.type==="create"?f.allowCreate(o.user,d,o):f.allowDelete(o.user,l,o);if(h?.then)return h.then(T=>{if(!T)throw new OT(o.user);return typeof d?.then=="function"?d.then(m=>e(f,l,o,m)):e(f,l,o,d)});if(!h)throw new OT(o.user)}return typeof d?.then=="function"?d.then(h=>e(f,l,o,h)):e(f,l,o,d)}a(E,"authorizeActionOnResource")}}function ts(e,t){let r=new kY.ClientError(`The ${e.constructor.name} does not have a ${t} method implemented`,405);r.allow=[],r.method=t;for(let n of["get","put","post","delete","query","move","copy"])typeof e[n]=="function"&&r.allow.push(n);throw r}function aw(e,t,r){let n=e[ve];if(n){let s=e[_r];return i=>{let o,c;return e.hasOwnProperty(i)&&typeof(o=e[i])!="function"?o:s&&i in s?s[i]:(c=t?.[i])?c(e,r):n[i]}}else return t?s=>{let i=t[s];return i?i(e,r):e[s]}:s=>e[s]}function IT(e,t){let r=t?.propertyResolvers,n=t[Fe],s;if(typeof e=="string")return a(function o(c){return c.then?c.then(o):Array.isArray(c)?c.map(o):aw(c,r,n)(e)},"transform");if(typeof e=="object"){if(e.asArray)return a(function c(l){if(l.then)return l.then(c);if(Array.isArray(l))return l.map(c);let u=[],d=i(aw(l,r,n));for(let _ of e)u.push(d(_));return u},"transform");let o=e.forceNulls;return a(function c(l){if(l.then)return l.then(c);if(Array.isArray(l))return l.map(E=>E&&typeof E=="object"?c(E):E);let u={},d=i(aw(l,r,n)),_;for(let E of e){let f=d(E);f===void 0&&o&&(f=null),f?.then?(_||(_=[]),_.push(f.then(h=>u[E.name||E]=h))):u[E.name||E]=f}return _?Promise.all(_).then(()=>u):u},"transform")}else throw new Error("Invalid select argument type "+typeof e);function i(o){return c=>{if(typeof c=="string")return o(c);if(typeof c=="object")if(c.name){s||(s={});let l=s[c.name];if(!l){let d=r[c.name]?.definition?.tableClass;l=s[c.name]=IT(c.select||c,d)}let u=o(c.name);return l(u)}else return o(c);else return c}}a(i,"handleProperty")}var HY,xY,kY,Fe,ze,ai,ve,Ime,Pr,OT,pl,NT,Vs=Ie(()=>{HY=require("crypto");Cl();xY=L(_i()),kY=L(_e());ap();pc();tE();Fe=Symbol.for("context"),ze=Symbol.for("primary-key"),ai=Symbol("is-collection"),ve=Symbol("stored-record"),Ime={json:"application/json",cbor:"application/cbor",msgpack:"application/x-msgpack",csv:"text/csv"},Pr=class{static{a(this,"Resource")}static transactions;constructor(t,r){this[ze]=t;let n=r?.[Fe];this[Fe]=n!==void 0?n:r||null}static get=es(function(t,r,n,s){let i=t.get?.(r);if(i?.then)return i.then(o);return o(i);function o(c){let l;if((l=r?.select)&&c!=null&&!c.selectApplied){let u=IT(l,t.constructor);return typeof c?.map=="function"?c.map(u):u(c)}return c}},{type:"read",letItLinger:!0,ensureLoaded:!0,async:!0});static put=es(function(t,r,n,s){if(Array.isArray(s)&&t[ai]){let i=[],o=n.authorize;for(let c of s){let l=t.constructor,u=l.getResource(c[l.primaryKey],n,{async:!0});u.then?i.push(u.then(d=>d.put(c,n))):i.push(u.put(c,n))}return Promise.all(i)}return t.put?t.put(s,r):ts(t,"put")},{hasContent:!0,type:"update"});static patch=es(function(t,r,n,s){return t.patch?t.patch(s,r):ts(t,"patch")},{hasContent:!0,type:"update"});static delete=es(function(t,r,n,s){return t.delete?t.delete(r):ts(t,"delete")},{hasContent:!1,type:"delete"});static getNewId(){return(0,HY.randomUUID)()}static create(t,r,n){let s;return t==null?s=r?.[this.primaryKey]??this.getNewId():Array.isArray(t)&&typeof t[0]!="object"?s=r?.[this.primaryKey]??[...t,this.getNewId()]:typeof t!="object"?s=r?.[this.primaryKey]??[t,this.getNewId()]:(s=t?.[this.primaryKey]??this.getNewId(),n=r||{},r=t),n||(n={}),Dt(n,()=>{let i=new this(s,n),o=i.update?i.update(r,!0):ts(i,"update");return n.newLocation=s,n.createdResource=!0,o?.then?o.then(()=>i):i})}static invalidate=es(function(t,r,n,s){return t.invalidate?t.invalidate(r):ts(t,"delete")},{hasContent:!1,type:"update"});static post=es(function(t,r,n,s){return t[ze]!=null&&t.update?.(),t.post(s,r)},{hasContent:!0,type:"create"});static connect=es(function(t,r,n,s){return t.connect?t.connect(s,r):ts(t,"connect")},{hasContent:!0,type:"read"});static subscribe=es(function(t,r,n,s){return t.subscribe?t.subscribe(r):ts(t,"subscribe")},{type:"read"});static publish=es(function(t,r,n,s){return t[ze]!=null&&t.update?.(),t.publish?t.publish(s,r):ts(t,"publish")},{hasContent:!0,type:"create"});static search=es(function(t,r,n,s){let i=t.search?t.search(r):ts(t,"search"),o=n.select;if(o&&n.hasOwnProperty("select")&&i!=null&&!i.selectApplied){let c=IT(o,t.constructor);return i.map(c)}return i},{type:"read"});static query=es(function(t,r,n,s){return t.search?t.search(s,r):ts(t,"search")},{hasContent:!0,type:"read"});static copy=es(function(t,r,n,s){return t.copy?t.copy(s,r):ts(t,"copy")},{hasContent:!0,type:"create"});static move=es(function(t,r,n,s){return t.move?t.move(s,r):ts(t,"move")},{hasContent:!0,type:"delete"});async post(t){if(this[ai])return(await this.constructor.create(this[ze],t,this[Fe]))[ze];ts(this,"post")}static isCollection(t){return t?.[ai]}static coerceId(t){return t}static parseQuery(t){return ES(t)}static parsePath(t,r,n){let s=t.indexOf(".");if(s>-1){let o=t.slice(s+1);t=t.slice(0,s);let c=r?.headers&&Ime[o];if(c)r.requestedContentType=c;else if(n)n.property=o;else return{query:{property:o},id:BY(t,this),isCollection:pl}}let i=BY(t,this);return pl?{id:i,isCollection:!0}:i}static getResource(t,r,n){let s,i=r[Fe],o;typeof r.isCollection=="boolean"&&r.hasOwnProperty("isCollection")?o=r.isCollection:o=n?.isCollection;let c=o&&this.Collection||this;if(i||(i=i===void 0?r:{}),i.transaction){let l;if(i.resourceCache?l=i.resourceCache:l=i.resourceCache=[],l.asMap){let u=l.asMap.get(t);if(s=u?.find(d=>d.constructor===c),s)return s;u||l.asMap.set(t,u=[]),u.push(s=new c(t,i))}else{if(s=l.find(u=>u[ze]===t&&u.constructor===c),s)return s;if(l.push(s=new c(t,i)),l.length>10){let u=new Map;for(let d of l){let _=d[ze],E=u.get(_);E?E.push(d):u.set(_,[d])}i.resourceCache.length=0,i.resourceCache.asMap=u}}}else s=new c(t,i);return o&&(s[ai]=!0),s}subscribe(t){return new Pn}connect(t){return t?.subscribe!==!1?this.subscribe?.(t):new Pn}allowRead(t){return t?.role.permission.super_user}allowUpdate(t){return t?.role.permission.super_user}allowCreate(t){return t?.role.permission.super_user}allowDelete(t){return t?.role.permission.super_user}getId(){return this[ze]}getContext(){return this[Fe]}};Pr.prototype[Fe]=null;(0,xY._assignPackageExport)("Resource",Pr);a(wme,"snake_case");OT=class extends Error{static{a(this,"AccessError")}constructor(t){t?(super("Unauthorized access to resource"),this.statusCode=403):(super("Must login"),this.statusCode=401)}};a(BY,"pathToId");NT=class extends Array{static{a(this,"MultiPartId")}toString(){return this.join("/")}};a(es,"transactional");a(ts,"missingMethod");a(aw,"selectFromObject");a(IT,"transformForSelect")});var bO={};je(bO,{EVICTED:()=>ya,INVALIDATED:()=>Os,coerceType:()=>CT,makeTable:()=>LT,setServerUtilities:()=>Hme,updateResource:()=>DT});function LT(e){let{primaryKey:t,indices:r,tableId:n,tableName:s,primaryStore:i,databasePath:o,databaseName:c,auditStore:l,schemaDefined:u,dbisDB:d,sealed:_,splitSegments:E,replicate:f}=e,{expirationMS:h,evictionMS:T,audit:m,trackDeletes:g}=e,{attributes:S}=e;S||(S=[]);let y=qg(i,n,l),I,U,H={},X=Promise.resolve(),Y,V,ne;for(let v of S)(v.assignCreatedTime||v.name==="__createdtime__")&&(Y=v),(v.assignUpdatedTime||v.name==="__updatedtime__")&&(V=v),v.expiresAt&&(ne=v),v.isPrimaryKey&&(H=v);let Q,de=[],W=[],ae=1,Oe=2,Ne={},Me={},Gr=864e5,wd,ka,wn,Cd=!1,Ol,Lw=new Map,KE=new Map,vt,Fa,Ga=gd.get(Ms.CONFIG_PARAMS.REPLICATION_DATABASES);if(Array.isArray(Ga)){for(let v of Ga)if(v.name===c&&v.replicateTo>=0){Fa=v.replicateTo;break}}let Us=i.getRange({start:!1,end:!1}).constructor,vs=10,YE=6;m&&ie();class Ve extends Pr{static name=s;static primaryStore=i;static auditStore=l;static primaryKey=t;static tableName=s;static tableId=n;static indices=r;static audit=m;static databasePath=o;static databaseName=c;static attributes=S;static replicate=f;static sealed=_;static splitSegments=E??!0;static createdTimeProperty=Y;static updatedTimeProperty=V;static propertyResolvers;static userResolvers={};static sources=[];static get expirationMS(){return h}static dbisDB=d;static schemaDefined=u;static sourcedFrom(p,A){if(A&&(this.sourceOptions=A,(A.expiration||A.eviction||A.scanInterval)&&this.setTTLExpiration(A)),A?.intermediateSource)p.intermediateSource=!0,this.sources.unshift(p);else{if(this.sources.some(O=>!O.intermediateSource)){if(this.sources.some(O=>O.name===p.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(p)}U=U||p.get&&(!p.get.reliesOnPrototype||p.prototype.get),I=I||p.load;let w=a(O=>{let B=this.sources;if(B=B.filter(k=>k.intermediateSource&&k[O]&&(!k[O].reliesOnPrototype||k.prototype[O])),B.length>0)if(B.length===1){let k=B[0];return(C,F,x)=>{if(C?.source!==k)return k[O](F,x,C)}}else return(k,C,F)=>{let x=[];for(let q of B){if(k?.source===q)break;x.push(q[O](C,F,k))}return Promise.all(x)}},"getApplyToIntermediateSource"),R=this.sources[this.sources.length-1];R.intermediateSource&&(R={});let b=a(O=>{if(R[O]&&(!R[O].reliesOnPrototype||R.prototype[O]))return(B,k,C)=>{if(!B?.source)return R[O](k,C,B)}},"getApplyToCanonicalSource");Ne={put:b("put"),patch:b("patch"),delete:b("delete"),publish:b("publish")},Me={put:w("put"),patch:w("patch"),delete:w("delete"),publish:w("publish"),invalidate:w("invalidate")};let D=R.shouldRevalidateEvents;return(async()=>{let O=!1,B,k=a(async(C,F)=>{let x=C.value,q=C.table?We[c][C.table]:Ve;if(c===Ms.SYSTEM_SCHEMA_NAME&&(C.table===Ms.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||C.table===Ms.SYSTEM_TABLE_NAMES.USER_TABLE_NAME)&&(O=!0),C.id===void 0&&(C.id=x[q.primaryKey],C.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(C));C.source=p;let ee={residencyId:tt(C.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:C.nodeId},G=await q.getResource(C.id,F,ee);switch(C.type){case"put":return D?G._writeInvalidate(ee):G._writeUpdate(x,!0,ee);case"patch":return D?G._writeInvalidate(ee):G._writeUpdate(x,!1,ee);case"delete":return G._writeDelete(ee);case"publish":return G._writePublish(x,ee);case"invalidate":return G._writeInvalidate(ee);case"relocate":return G._writeRelocate(ee);default:qe.default.error?.("Unknown operation",C.type,C.id)}},"writeUpdate");try{let C=p.subscribe;C&&g==null&&(g=!0);let F={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},x=p.subscribeOnThisThread?p.subscribeOnThisThread((0,ml.getWorkerIndex)(),F):(0,ml.getWorkerIndex)()===0,q=C&&x&&await p.subscribe?.(F);if(q){let ee;for await(let G of q)try{if(!(G.type==="transaction"?G.writes[0]:G)){qe.default.error?.("Bad subscription event",G);continue}if(G.source=p,G.type==="end_txn"){if(ee?.resolve(),G.localTime&&B!==G.localTime){if(G.remoteNodeIds?.length>0){let Ae=[Symbol.for("seq"),G.remoteNodeIds[0]],te=d.get(Ae),K=te?.nodes;K||(K=[]);for(let Be of G.remoteNodeIds.slice(1)){let we=K.find(ce=>ce.id===Be);K=K.filter(ce=>ce.id!==Be||ce===we),we||(we={id:Be,seqId:0},K.push(we)),we.seqId=Math.max(te?.seqId??1,G.localTime),Be===ee?.nodeId&&(we.lastTxnTime=G.timestamp)}let ge=Math.max(te?.seqId??1,G.localTime);qe.default.trace?.("Received txn",c,ge,G.localTime,G.remoteNodeIds),d.put(Ae,{seqId:ge,nodes:K})}B=G.localTime}G.onCommit&&ee?.committed.then(G.onCommit);continue}if(ee)if(G.beginTxn)ee.resolve();else{ee.write_promises.push(k(G,ee));continue}!G.timestamp&&G.version&&(G.timestamp=G.version);let Ee=Dt(G,()=>{if(G.type==="transaction"){let Ae=[];for(let te of G.writes)try{Ae.push(k(te,G))}catch(K){throw K.message+=" writing "+JSON.stringify(te)+" of event "+JSON.stringify(G),K}return Promise.all(Ae)}else if(G.type==="define_schema"){let Ae=this.attributes.slice(0),te;for(let K of G.attributes)Ae.find(ge=>ge.name===K.name)||(Ae.push(K),te=!0);te&&(Et({table:s,database:c,attributes:Ae,origin:"cluster"}),DE.signalSchemaChange(new PE.SchemaEventMsg(process.pid,Ms.OPERATIONS_ENUM.CREATE_TABLE,c,s)))}else return G.beginTxn?(ee=G,ee.write_promises=[k(G,G)],new Promise(Ae=>{ee.resolve=()=>Ae(Promise.all(ee.write_promises))})):k(G,G)});ee&&(ee.committed=Ee),O&&Ee&&!Ee?.waitingForUserChange&&(Ee.then(()=>DE.signalUserChange(new PE.UserEventMsg(process.pid))),Ee.waitingForUserChange=!0),G.onCommit&&(Ee?Ee.then(G.onCommit):G.onCommit())}catch(Re){qe.default.error?.("error in subscription handler",Re)}}}catch(C){qe.default.error?.(C)}})(),this}static get isCaching(){return U}static get shouldRevalidateEvents(){return this.prototype.get!==Ve.prototype.get}static getResource(p,A,w){let R=super.getResource(p,A,w);if(p!=null){Yi(p);try{if(R.hasOwnProperty(ve))return R;if(typeof p=="object"&&p&&!Array.isArray(p))throw new Error(`Invalid id ${JSON.stringify(p)}`);let b=!w?.async||i.cache?.get?.(p),D=Ir(A),O=D.getReadTxn();if(O?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return $a(p,A,{transaction:O,ensureLoaded:w?.ensureLoaded},b,B=>{if(B?DT(R,B):R[ve]=null,A.onlyIfCached&&A.noCacheStore){if(!R.doesExist())throw new Or.ServerError("Entry is not cached",504)}else if(w?.ensureLoaded){let k=Dd(p,B,A,R);if(k)return D?.disregardReadTxn(),R[cw]=!0,uw(k,C=>(DT(R,C),R))}return R})}catch(b){throw b.message.includes("Unable to serialize object")&&(b.message+=": "+JSON.stringify(p)),b}}return R}ensureLoaded(){let p=Dd(this[ze],this[kr],this[Fe]);if(p)return this[cw]=!0,uw(p,A=>{this[kr]=A,this[ve]=A.value,this[wE]=A.version})}static getNewId(){let p=H?.type;if(p==="String"||p==="ID")return super.getNewId();if(!vt){let b=i.getEntry(Symbol.for("id_allocation")),D=b?.value,O;if(D&&D.nodeName===server.hostname&&(!kme(i)||D.pid===process.pid)){let B=D.start,k=D.end;O=B;for(let C of i.getKeys({start:k,end:B,limit:1,reverse:!0}))O=C}else D=R(b?.version??null),O=D.start;vt=new BigInt64Array([BigInt(O)+1n]),vt=new BigInt64Array(i.getUserSharedBuffer("id",vt.buffer)),vt.maxSafeId=D.end}let A=Number(Atomics.add(vt,0,1n)),w=p==="Int"?512:1048576;if(A+w>=vt.maxSafeId){let b=a(D=>{vt.maxSafeId=A+(p==="Int"?1023:4194303);let O=(p==="Int"?Math.pow(2,31):Math.pow(2,49))-1,B=D?void 0:i.useReadTransaction(),k=Number(vt[0]);for(let x of i.getKeys({start:k+1,end:O,limit:1,transaction:B}))O=x;B?.done();let{value:C,version:F}=i.getEntry(Symbol.for("id_allocation"));if(vt.maxSafeId<O){if(C.end>vt.maxSafeId-100)return;qe.default.info?.("New id allocation",A,vt.maxSafeId,F),i.put(Symbol.for("id_allocation"),{start:C.start,end:vt.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),F)}else{qe.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${vt.maxSafeId}, but id of ${O} detected`);let x=R(F);x.alreadyUpdated||Atomics.store(vt,0,BigInt(x.start+1)),vt.maxSafeId=x.end}},"updateEnd");A+w===vt.maxSafeId?setImmediate(b):A+100>=vt.maxSafeId&&(qe.default.warn?.(`Synchronous id allocation required on table ${s}${p=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>b(!0)))}return A;function R(b){let D=(p==="Int"?Math.pow(2,31):Math.pow(2,49))-1,O=D/4,B,k,C=!1,F,x;do{F=Math.floor(Math.random()*D),x={start:F,end:F+(p==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},B=0;for(let q of i.getKeys({start:F,limit:1,reverse:!0}))B=q;k=D;for(let q of i.getKeys({start:F+1,end:D,limit:1}))k=q;O*=.875,O<1e3&&!C&&(C=!0,qe.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${p==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,F,B,k,O))}while(!(O<k-F&&(O<F-B||B===0)));return i.transactionSync(()=>{let q=i.getEntry(Symbol.for("id_allocation"));return(q?.version??null)==b?(qe.default.info?.("Allocated new id range",x),i.put(Symbol.for("id_allocation"),x,Date.now()),x):(qe.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...q.value})})}}static setTTLExpiration(p){if(typeof p=="number")h=p*1e3,T||(T=0);else if(p&&typeof p=="object")h=p.expiration*1e3,T=(p.eviction||0)*1e3,Gr=p.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(h<0)throw new Error("Expiration can not be negative");Gr=Gr||(h+T)/4,Ho()}static getResidencyRecord(p){return d.get([Symbol.for("residency_by_id"),p])}static setResidency(p){Ve.getResidency=p}static setResidencyById(p){Ve.getResidencyById=p}static getResidency(p,A,w){if(Ve.getResidencyById)return Ve.getResidencyById(p[t]);let R=Fa;if(A.replicateTo!=null){if(Array.isArray(A.replicateTo))return A.replicateTo.includes(server.hostname)?A.replicateTo:[server.hostname,...A.replicateTo];A.replicateTo>=0&&(R=A.replicateTo)}if(R>=0&&server.nodes){let b=[server.hostname];if(w)b.push(...w.slice(0,R));else{let D=server.nodes.map(k=>k.name),O=Math.floor(D.length*Math.random());b.push(...D.slice(O,O+R));let B=O+R-D.length;B>0&&b.push(...D.slice(0,B))}return b}}static enableAuditing(p=!0){m=p,p&&ie(),Ve.audit=p}static coerceId(p){return p===""?null:CT(p,H)}static async dropTable(){if(delete We[c][s],c===o){for(let p of S)d.remove(Ve.tableName+"/"+p.name),r[p.name]?.drop();d.remove(Ve.tableName+"/"),i.drop(),await d.committed}else console.log("legacy dropTable"),await i.close(),await fs.remove(data_path),await fs.remove(data_path===standard_path?data_path+MDB_LOCK_FILE_SUFFIX:path.join(path.dirname(data_path),MDB_LEGACY_LOCK_FILE_NAME));DE.signalSchemaChange(new PE.SchemaEventMsg(process.pid,Ms.OPERATIONS_ENUM.DROP_TABLE,c,s))}get(p){if(typeof p=="string")return this.getProperty(p);if(this[ai])return this.search(p);if(this[ze]===null){if(p?.conditions)return this.search(p);let A=Ve.getRecordCount();return{recordCount:A.recordCount,estimatedRecordRange:A.estimatedRange,records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:S}}if(p?.property)return this.getProperty(p.property);if(this.doesExist()||p?.ensureLoaded===!1||this[Fe]?.returnNonexistent)return this}allowRead(p,A){let w=Va(p);if(w?.read){if(w.isSuperUser)return!0;let R=w.attribute_permissions,b=A?.select;if(R?.length>0||Cd&&b){if(A||(A={}),b){let D=R?.length>0&&lw(R,"read");A.select=b.map(O=>{let B=O.name||O;if(!D||D[B]){let k=wn[B]?.definition?.tableClass;if(k){if(O.name||(O={name:O}),!k.prototype.allowRead.call(null,p,O))return!1;if(!O.select)return O.name}return O}}).filter(Boolean)}else A.select=R.filter(D=>D.read&&!wn[D.attribute_name]).map(D=>D.attribute_name);return A}else return!0}}allowUpdate(p,A){let w=Va(p);if(w?.update){let R=w.attribute_permissions;if(R?.length>0){let b=lw(R,"update");for(let D in A)if(!b[D])return!1;for(let D of R){let O=D.attribute_name;!D.update&&!(O in A)&&(A[O]=this.getProperty(O))}}return Ka(this[Fe])}}allowCreate(p,A){if(this[ai]){let w=Va(p);if(w?.insert){let R=w.attribute_permissions;if(R?.length>0){let b=lw(R,"insert");for(let D in A)if(!b[D])return!1;return Ka(this[Fe])}else return Ka(this[Fe])}}else return this.allowUpdate(p,{})}allowDelete(p){return Va(p)?.delete&&Ka(this[Fe])}update(p,A){if(!Ir(this[Fe]))throw new Error("Can not update a table resource outside of a transaction");if(p===!1)return this;let R;return typeof p=="object"&&p&&(A?(Object.isFrozen(p)&&(p={...p}),this[ve]={},this[_r]=p):(R=this[_r],R&&(p=Object.assign(R,p)),this[_r]=R=p)),this._writeUpdate(this[_r],A),this}addTo(p,A){if(typeof A=="number"||typeof A=="bigint")this[IE]===GY?this.set(p,(+this.getProperty(p)||0)+A):(this[IE]||this.update(),this.set(p,new yT(A)));else throw new Error("Can not add a non-numeric value")}subtractFrom(p,A){if(typeof A=="number")return this.addTo(p,-A);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this[kr]}invalidate(){this._writeInvalidate()}_writeInvalidate(p){let A=this[Fe],w=this[ze];Yi(w),Ir(this[Fe]).addWrite({key:w,store:i,invalidated:!0,entry:this[kr],before:Ne.invalidate?.bind(this,A,w),beforeIntermediate:Me.invalidate?.bind(this,A,w),commit:a((b,D)=>{if(ui(b,D,p?.nodeId)<=0)return;let O=null;for(let B in r)O||(O={}),O[B]=this.getProperty(B);qe.default.trace?.(`Invalidating entry id: ${w}, timestamp: ${new Date(b).toISOString()}`),y(w,O,this[kr],b,Os,m,{user:A?.user,residencyId:p?.residencyId,nodeId:p?.nodeId},"invalidate")},"commit")})}_writeRelocate(p){let A=this[Fe],w=this[ze];Yi(w),Ir(this[Fe]).addWrite({key:w,store:i,invalidated:!0,entry:this[kr],before:Ne.relocate?.bind(this,A,w),beforeIntermediate:Me.relocate?.bind(this,A,w),commit:a((b,D)=>{if(ui(b,D,p?.nodeId)<=0)return;let O=Ve.getResidencyRecord(p.residencyId),B=0,k=null,C=D?.value;if(O&&!O.includes(server.hostname)){for(let F in r)k||(k={}),k[F]=C(F);B=Os}else k=C;qe.default.trace?.(`Relocating entry id: ${w}, timestamp: ${new Date(b).toISOString()}`),y(w,k,this[kr],b,B,m,{user:A.user,residencyId:p.residencyId,nodeId:p.nodeId,expiresAt:p.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(p,A){let w={previousResidency:this.getResidencyRecord(p.residencyId),isRelocation:!0},R=this.getResidency(A.value,w),b;if(R){if(!Array.isArray(R))throw new Error("Residency must be an array, but was: "+R);if(!R.includes(server.hostname))return;b=tt(R)}let O=y(p.key,A.value,p,p.version,0,!0,{residencyId:b,expiresAt:A.expiresAt},"relocate",!1,null)}static evict(p,A,w){let R=this.Source,b;if(!((U||m)&&(!A||(b=i.getEntry(p),!b||!A)||b.version!==w))){if(U){if(i.hasLock(p,b.version))return;let D;for(let O in r)D||(D={}),D[O]=A[O];if(D)return y(p,D,b,w,ya,null,null,null,!0)}return i.ifVersion(p,w,()=>{qa(p,A,null)}),m?y(p,null,b,w,ya,null,null,null,!0):i.remove(p,w)}}lock(){throw new Error("Not yet implemented")}static operation(p,A){return p.table||=s,p.schema||=c,zY.operation(p,A)}put(p){this.update(p,!0)}patch(p){this.update(p,!1)}_writeUpdate(p,A,w){let R=this[Fe],b=Ir(R),D=this[ze];Yi(D);let O=this[kr];this[IE]=A?GY:Ume;let B={key:D,store:i,entry:O,nodeName:R?.nodeName,validate:a(k=>{p||(p=this[_r]),A||p&&AT(this[_r]===p?this:p)?R?.source||(b.checkOverloaded(),this.validate(p,!A),V&&(p[V.name]=V.type==="Date"?new Date(k):V.type==="String"?new Date(k).toISOString():k),A&&(t&&p[t]!==D&&(p[t]=D),Y&&(O?.value?p[Y.name]=O?.value[Y.name]:p[Y.name]=Y.type==="Date"?new Date(k):Y.type==="String"?new Date(k).toISOString():k),p=hl(p))):b.removeWrite(B)},"validate"),before:A?Ne.put?()=>Ne.put(R,D,p):null:Ne.patch?()=>Ne.patch(R,D,p):Ne.put?()=>Ne.put(R,D,hl(this)):null,beforeIntermediate:A?Me.put?()=>Me.put(R,D,p):null:Me.patch?()=>Me.patch(R,D,p):Me.put?()=>Me.put(R,D,hl(this)):null,commit:a((k,C,F)=>{if(F){if(R&&C?.version>(R.lastModified||0)&&(R.lastModified=C.version),this[kr]=C,C?.value?.[ve])throw new Error("Can not assign a record to a record, check for circular references");A||(this[ve]=C?.value??null)}this[_r]=void 0,this[wE]=k;let x=C?.value,q=p;this[IE]=0;let ee=ui(k,C,w?.nodeId),G;if(ee<=0)if(m){let K=C.localTime,ge=C.version;qe.default.trace?.("Applying CRDT update to record with id: ",D,"applying later update:",ge);let Be=[];for(;K>k||ge>=k&&K>0;){let we=l.get(K);if(!we)break;let ce=xt(we);if(ge=ce.version,ge>=k){if(ge===k){if(ee=ui(k,{version:ge,localTime:K},w?.nodeId),ee===0)return;if(ee>0)continue}if(ce.type==="patch")Be.push(ce),G=p;else if(ce.type==="put"||ce.type==="delete")return}K=ce.previousLocalTime}Be.sort((we,ce)=>we.version-ce.version);for(let we of Be){let ce=we.getValue(i);if(q=TT(q,ce,A),qe.default.debug?.("Rebuilding update with future patch:",q),!q)return}}else{if(A)return;q=TT(q,x,A),qe.default.debug?.("Rebuilding update without audit:",q)}let Re;if(A?Re=q:(this[ve]=x,Re=hl(this,q)),this[ve]=Re,Re?.[ve])throw new Error("Can not assign a record to a record, check for circular references");let Ee;if(w?.residencyId!=null)Ee=w.residencyId;else{O?.residencyId&&(R.previousResidency=Ve.getResidencyRecord(O.residencyId));let K=Ve.getResidency(Re,R);if(K){if(!Array.isArray(K))throw new Error("Residency must be an array, got: "+K);K.includes(server.hostname)||K.push(server.hostname)}Ee=tt(K)}A||(G=p);let Ae=R?.expiresAt??(h?h+Date.now():-1);qe.default.trace?.(`Saving record with id: ${D}, timestamp: ${new Date(k).toISOString()}${Ae?", expires at: "+new Date(Ae).toISOString():""}${C?", replaces entry from: "+new Date(C.version).toISOString():", new entry"}`,Re),qa(D,x,Re);let te=A?"put":"patch";y(D,Re,C,k,0,m,{user:R?.user,residencyId:Ee,expiresAt:Ae,nodeId:w?.nodeId,originatingOperation:R?.originatingOperation},te,!1,G),R.expiresAt&&Ho()},"commit")};b.addWrite(B)}async delete(p){if(typeof p=="string")return this.deleteProperty(p);if(this[ai]){for await(let A of this.search(p))(await Ve.getResource(A[t],this.getContext(),{ensureLoaded:!1}))._writeDelete(p);return}return this[ve]?this._writeDelete(p):!1}_writeDelete(p){let A=Ir(this[Fe]),w=this[ze];Yi(w);let R=this[Fe];return A.addWrite({key:w,store:i,resource:this,nodeName:R?.nodeName,before:Ne.delete?.bind(this,R,w),beforeIntermediate:Me.delete?.bind(this,R,w),commit:a((b,D,O)=>{let B=D?.value;O&&(R&&D?.version>(R.lastModified||0)&&(R.lastModified=D.version),DT(this,D)),!(ui(b,D,p?.nodeId)<=0)&&(qa(this[ze],B),qe.default.trace?.(`Deleting record with id: ${w}, txn timestamp: ${new Date(b).toISOString()}`),m||g?(y(w,null,this[kr],b,0,m,{user:R?.user,nodeId:p?.nodeId},"delete"),m||Ho()):i.remove(this[ze]))},"commit")}),!0}search(p){let A=this[Fe],w=Ir(A);if(!p)throw new Error("No query provided");let R=p.conditions;R?R.length===void 0&&(R=R[Symbol.iterator]?Array.from(R):[R]):R=Array.isArray(p)?p:p[Symbol.iterator]?Array.from(p):[],this[ze]&&(R=[{attribute:null,comparator:Array.isArray(this[ze])?"prefix":"starts_with",value:this[ze]}].concat(R));let b,D={};function O(K,ge){let Be;switch(ge){case"and":case void 0:if(K.length<1)throw new Error('An "and" operator requires at least one condition');Be=!0;break;case"or":if(K.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+ge)}for(let we of K){if(we.conditions){we.conditions=O(we.conditions,we.operator);continue}let ce=we[0]??we.attribute,Ye=ce==null?H:Mi(S,ce);if(Ye)(Ye.type||fN[we.comparator])&&(we[1]===void 0?we.value=k(we.value,Ye):we[1]=k(we[1],Ye));else if(ce!=null)throw(0,Or.handleHDBError)(new Error,`${ce} is not a defined attribute`,404);if(we.chainedConditions)if(we.chainedConditions.length===1&&(!we.operator||we.operator=="and")){let rt=we.chainedConditions[0],Ze,st;if(rt.comparator==="gt"||rt.comparator==="greater_than"||rt.comparator==="ge"||rt.comparator==="greater_than_equal"?(Ze=we,st=rt):(Ze=rt,st=we),Ze.comparator!=="lt"&&Ze.comparator!=="less_than"&&Ze.comparator!=="le"&&Ze.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let Bt=st.comparator==="ge"||st.comparator==="greater_than_equal",xo=Ze.comparator==="le"||Ze.comparator==="less_than_equal";we.comparator=(Bt?"ge":"gt")+(xo?"le":"lt"),we.value=[st.value,Ze.value]}else throw new Error("Multiple chained conditions are not currently supported")}return K}a(O,"prepareConditions");function B(K,ge){if(p.enforceExecutionOrder)return K;for(let Be of K)Be.conditions&&(Be.conditions=B(Be.conditions,Be.operator));return K.length>1&&ge!=="or"?(0,WY.sortBy)(K,fS(Ve)):K}a(B,"orderConditions");function k(K,ge){return Array.isArray(K)?K.map(Be=>CT(Be,ge)):CT(K,ge)}a(k,"coerceTypedValues");let C=p.operator;(R.length>0||C)&&(R=O(R,C));let F=typeof p.sort=="object"&&p.sort,x;if(F&&C!=="or"){let K=F.attribute;if(K==null)throw new Or.ClientError("Sort requires an attribute");if(b=R.find(ge=>Zu(ge.attribute)===Zu(K)),!b){let ge=Mi(S,K);if(!ge)throw(0,Or.handleHDBError)(new Error,`${Array.isArray(K)?K.join("."):K} is not a defined attribute`,404);if(ge.indexed)b={attribute:K,comparator:"sort"},R.push(b);else if(R.length===0&&!p.allowFullScan)throw(0,Or.handleHDBError)(new Error,`${Array.isArray(K)?K.join("."):K} is not indexed and not combined with any other conditions`,404)}b&&(b.descending=!!F.descending)}R=B(R,C),F&&(b&&R[0]===b?F.next&&(x={dbOrderedAttribute:F.attribute,attribute:F.next.attribute,descending:F.next.descending,next:F.next.next}):(b&&R.splice(R.indexOf(b),1),x=F));let q=p.select;if(R.length===0&&(R=[{attribute:t,comparator:"greater_than",value:!0}]),p.explain)return{conditions:R,operator:C,postOrdering:x,selectApplied:!!q};let ee=w.useReadTxn(),G=EN(R,C,Ve,ee,p,A,(K,ge)=>Pd(K,q,A,ee,ge),D),Re=p.ensureLoaded!==!1;x||(G=te(G));let Ee=Ve.transformEntryForSelect(q,A,ee,D,Re,!0),Ae=Ve.transformToOrderedSelect(G,q,x,ee,A,Ee);function te(K){return p.offset||p.limit!==void 0?K.slice(p.offset,p.limit!==void 0?(p.offset||0)+p.limit:void 0):K}return a(te,"applyOffset"),x&&(Ae=te(Ae)),Ae.onDone=()=>{Ae.onDone=null,w.doneReadTxn()},Ae.selectApplied=!0,Ae.getColumns=()=>{if(q){let K=[];for(let ge of q)ge==="*"?K.push(...S.map(Be=>Be.name)):K.push(ge.name||ge);return K}return S.filter(K=>!K.computed&&!K.relationship).map(K=>K.name)},Ae}static transformToOrderedSelect(p,A,w,R,b,D){let O=new Us;if(w){p=Pd(p,A,R,b,null);let B;O.iterate=function(){let C,F=p[Symbol.asyncIterator]?p[Symbol.asyncIterator]():p[Symbol.iterator](),x,q=w.dbOrderedAttribute,ee,G,Re=!0;function Ee(te){let K=te.next&&Ee(te.next),ge=te.descending;return(Be,we)=>{let ce=Nl(Be,te.attribute,R),Ye=Nl(we,te.attribute,R),rt=ge?(0,Sl.compareKeys)(Ye,ce):(0,Sl.compareKeys)(ce,Ye);return rt===0?K?.(Be,we)||0:rt}}a(Ee,"createComparator");let Ae=Ee(w);return{async next(){let te;if(C)if(te=C.next(),te.done){if(x)return O.onDone&&O.onDone(),te}else return{value:await D.call(this,te.value)};B=[],ee&&B.push(ee);do if(te=await F.next(),te.done){if(x=!0,B.length)break;return O.onDone&&O.onDone(),te}else{let K=te.value;if(K?.then&&(K=await K),q){let ge=Nl(K,q,R);if(Re)Re=!1,G=ge;else if(ge!==G){G=ge,ee=K;break}}B.push(K)}while(!0);return w.isGrouped,B.sort(Ae),C=B[Symbol.iterator](),te=C.next(),te.done?(O.onDone&&O.onDone(),te):{value:await D.call(this,te.value)}},return(){O.onDone&&O.onDone(),F.return()},throw(){O.onDone&&O.onDone(),F.throw()}}};let k=a(C=>{if(typeof A=="object"&&Array.isArray(C.attribute))for(let F=0;F<A.length;F++){let x=A[F],q;if(x.name===C.attribute[0]){for(q=x.sort||(x.sort={});q.next;)q=q.next;q.attribute=C.attribute.slice(1),q.descending=C.descending}else x===C.attribute[0]&&(A[F]=q={name:x,sort:{attribute:C.attribute.slice(1),descending:C.descending}})}C.next&&k(C.next)},"applySortingOnSelect");k(w)}else O.iterate=(p[Symbol.asyncIterator]||p[Symbol.iterator]).bind(p),O=O.map(function(B){try{let k=D.call(this,B);return typeof k?.catch=="function"?k.catch(C=>{throw C.partialObject={[t]:B.key},C}):k}catch(k){throw k.partialObject={[t]:B.key},k}});return O}static transformEntryForSelect(p,A,w,R,b,D){if(p&&(p===t||p?.length===1&&p[0]===t&&Array.isArray(p))){let C=a(F=>(A?.transaction?.stale&&(A.transaction.stale=!1),F?.key??F),"transform");return p===t?C:p.asArray?F=>[C(F)]:F=>({[t]:C(F)})}let O;b&&U&&!(typeof p=="string"?[p]:p)?.every(C=>{let F;return typeof C=="object"?F=C.name:F=C,r[F]||F===t})&&(O=!0);let B,k=a(function(C){let F;if(A?.transaction?.stale&&(A.transaction.stale=!1),C!=null){if(F=C.value||C.deref?.()?.value,!F&&(C.key===void 0||C.deref)||C.metadataFlags&Os){if(C.metadataFlags&Os&&A.replicateFrom===!1&&D&&C.residencyId)return Ba.SKIP;if(C=$a(C.key??C,A,{transaction:w,lazy:p?.length<4,ensureLoaded:b},this?.isSync,x=>x),C?.then)return C.then(k.bind(this));F=C?.value}if(O&&C?.metadataFlags&(Os|ya)||C?.expiresAt!=null&&C?.expiresAt<Date.now()){if(A.onlyIfCached&&A.noCacheStore)return{[t]:C.key,message:"This entry has expired"};let x=Dd(C.key??C,C,A);if(x?.then)return x.then(k)}}if(F==null)return D?Ba.SKIP:F;if(p&&!(p[0]==="*"&&p.length===1)){let x,q=a((G,Re)=>{let Ee;typeof G=="object"?Ee=G.name:Ee=G;let Ae=wn?.[Ee],te;if(Ae){let K=R?.[Ee];if(K)if(K.hasMappings){let Be=Ae.from?F[Ae.from]:Zu(C.key);te=K.get(Be),te||(te=[])}else te=K.fromRecord?.(F);else te=Ae(F,A,C);let ge=a(Be=>{if(Be&&typeof Be=="object"){let we=Ae.definition?.tableClass||Ve;B||(B={});let ce=B[Ee]||(B[Ee]=we.transformEntryForSelect(Ee===G?null:G.select||(Array.isArray(G)?G:null),A,w,K,b));if(Array.isArray(Be)){let Ye=[],rt=we.transformToOrderedSelect(Be,G.select,typeof G.sort=="object"&&G.sort,A,w,ce)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),Ze=a(Bt=>{for(;!Bt.done;){if(Bt?.then)return Bt.then(Ze);Ye.push(Bt.value),Bt=rt.next()}Re(Ye,Ee)},"nextValue"),st=Ze(rt.next());st&&(x||(x=[]),x.push(st));return}else if(Be=ce.call(this,Be),Be?.then){x||(x=[]),x.push(Be.then(Ye=>Re(Ye,Ee)));return}}Re(Be,Ee)},"handleResolvedValue");te?.then?(x||(x=[]),x.push(te.then(ge))):ge(te);return}else te=F[Ee],te&&typeof te=="object"&&Ee!==G&&(te=Ve.transformEntryForSelect(G.select||G,A,w,null)({value:te}));Re(te,Ee)},"selectAttribute"),ee;if(typeof p=="string")q(p,G=>{ee=G});else if(Array.isArray(p))if(p.asArray)ee=[],p.forEach((G,Re)=>{G==="*"?p[Re]=F:q(G,Ee=>ee[Re]=Ee)});else{ee={};let G=p.forceNulls;for(let Re of p)if(Re==="*")for(let Ee in F)ee[Ee]=F[Ee];else q(Re,(Ee,Ae)=>{Ee===void 0&&G&&(Ee=null),ee[Ae]=Ee})}else throw new Or.ClientError("Invalid select"+p);return x?Promise.all(x).then(()=>ee):ee}return F},"transform");return k}async subscribe(p){if(!l)throw new Error("Can not subscribe to a table without an audit log");m||Et({table:s,database:c,schemaDefined:u,attributes:S,audit:!0}),p||(p={});let A=!p.rawEvents,w=[],R=this,b=QR(Ve,this[ze]??null,function(O,B,k,C){try{let F=B.getValue?.(i,A),x=B.type;if(!F&&x==="patch"&&A){let ee=i.getEntry(O);ee?.version===B.version?F=ee.value:F=B.getValue?.(i,!0,k),x="put"}let q={id:O,localTime:k,value:F,version:B.version,type:x,beginTxn:C};w?w.push(q):this.send(q)}catch(F){qe.default.error?.(F)}},p.startTime||0,p),D=(async()=>{this[ai]&&(b.includeDescendants=!0,p.onlyChildren&&(b.onlyChildren=!0)),p.supportsTransactions&&(b.supportsTransactions=!0);let O=this[ze],B=p.previousCount;B>1e3&&(B=1e3);let k=p.startTime;if(this[ai]){if(k){if(B)throw new Or.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:C,value:F}of l.getRange({start:k,exclusiveStart:!0,snapshot:!1})){let x=xt(F);if(x.tableId!==n)continue;let q=x.recordId;if(O==null||KY(O,q)){let ee=x.getValue(i,A,C);if(b.send({id:q,localTime:C,value:ee,version:x.version,type:x.type}),b.queue?.length>$Y&&await b.waitForDrain()===!1)return}b.startTime=C}}else if(B){let C=[];for(let{key:F,value:x}of l.getRange({start:"z",end:!1,reverse:!0}))try{let q=xt(x);if(q.tableId!==n)continue;let ee=q.recordId;if(O==null||KY(O,ee)){let G=q.getValue(i,A,F);if(C.push({id:ee,localTime:F,value:G,version:q.version,type:q.type}),--B<=0)break}}catch(q){qe.default.error("Error getting history entry",F,q)}for(let F=C.length;F>0;)b.send(C[--F]);C[0]&&(b.startTime=C[0].localTime)}else if(!p.omitCurrent){for(let{key:C,value:F,version:x,localTime:q}of i.getRange({start:O??!1,end:O==null?void 0:[O,Sl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(F&&(b.send({id:C,localTime:q,value:F,version:x,type:"put"}),b.queue?.length>$Y&&await b.waitForDrain()===!1))return}}else{B&&!k&&(k=0);let C=this[kr]?.localTime;if(C===Gg&&(i.cache?.delete(O),this[kr]=i.getEntry(O),qe.default.trace?.("re-retrieved record",C,this[kr]?.localTime),C=this[kr]?.localTime),qe.default.trace?.("Subscription from",k,"from",O,C),k<C){let F=[],x=C;do{let q=l.get(x);if(q){p.omitCurrent=!0;let ee=xt(q),G=ee.getValue(i,A,x);A&&(ee.type="put"),F.push({id:O,value:G,localTime:x,...ee}),x=ee.previousLocalTime}else break;B&&B--}while(x>k&&B!==0);for(let q=F.length;q>0;)b.send(F[--q]);b.startTime=C}!p.omitCurrent&&this.doesExist()&&b.send({id:O,localTime:C,value:this[ve],version:this[wE],type:"put"})}for(let C of w)b.send(C);w=null})();return p.listener&&b.on("data",p.listener),b}static subscribeOnThisThread(p,A){return p===0||A?.crossThreads===!1}doesExist(){return!!(this[ve]||this[IE])}publish(p,A){this._writePublish(p,A)}_writePublish(p,A){let w=Ir(this[Fe]),R=this[ze]||null;R!=null&&Yi(R);let b=this[Fe];w.addWrite({key:R,store:i,entry:this[kr],nodeName:b?.nodeName,validate:a(()=>{b?.source||(w.checkOverloaded(),this.validate(p))},"validate"),before:Ne.publish?.bind(this,b,R,p),beforeIntermediate:Me.publish?.bind(this,b,R,p),commit:a((D,O,B)=>{O===void 0&&g&&!m&&Ho(),qe.default.trace?.(`Publishing message to id: ${R}, timestamp: ${new Date(D).toISOString()}`),y(R,O?.value??null,O,O?.version||D,0,!0,{user:b?.user,residencyId:A?.residencyId,expiresAt:b?.expiresAt,nodeId:A?.nodeId},"message",!1,p)},"commit")})}validate(p,A){let w,R=a((b,D,O)=>{if(D.type&&b!=null)if(A&&b.__op__&&(b=b.value),D.properties){typeof b!="object"&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be an object${D.type?" ("+D.type+")":""}`);let B=D.properties;for(let k=0,C=B.length;k<C;k++){let F=B[k],x=R(b[F.name],F,O+"."+F.name);x&&(b[F.name]=x)}if(D.sealed&&b!=null&&typeof b=="object")for(let k in b)B.find(C=>C.name===k)||(w||(w=[])).push(`Property ${k} is not allowed within object in property ${O}`)}else switch(D.type){case"Int":(typeof b!="number"||b>>0!==b)&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof b!="number"||!(Math.floor(b)===b&&Math.abs(b)<=9007199254740992))&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof b!="number"&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a number`);break;case"ID":typeof b=="string"||b?.length>0&&b.every?.(B=>typeof B=="string")||(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a string, or an array of strings`);break;case"String":typeof b!="string"&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a string`);break;case"Boolean":typeof b!="boolean"&&(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a boolean`);break;case"Date":if(!(b instanceof Date)){if(typeof b=="string"||typeof b=="number")return new Date(b);(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a Date`)}break;case"BigInt":if(typeof b!="bigint"){if(typeof b=="string"||typeof b=="number")return BigInt(b);(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a bigint`)}break;case"Bytes":b instanceof Uint8Array||(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a Buffer or Uint8Array`);break;case"array":if(Array.isArray(b)){if(D.elements)for(let B=0,k=b.length;B<k;B++){let C=b[B],F=R(C,D.elements,O+"[*]");F&&(b[B]=F)}}else(w||(w=[])).push(`Value ${ci(b)} in property ${O} must be a Buffer or Uint8Array`);break}D.nullable===!1&&b==null&&(w||(w=[])).push(`Property ${O} is required (and not does not allow null values)`)},"validateValue");for(let b=0,D=S.length;b<D;b++){let O=S[b];if(!(O.relationship||O.computed)&&(!A||O.name in p)){let B=R(p[O.name],O,O.name);B&&(p[O.name]=B)}}if(_)for(let b in p)S.find(D=>D.name===b)||(w||(w=[])).push(`Property ${b} is not allowed`);if(w)throw new Or.ClientError(w.join(". "))}getUpdatedTime(){return this[wE]}wasLoadedFromSource(){return U?!!this[cw]:void 0}static async addAttributes(p){let A=S.slice(0);for(let w of p){if(!w.name)throw new Or.ClientError("Attribute name is required");if(w.name.match(/[`/]/))throw new Or.ClientError("Attribute names cannot include backticks or forward slashes");(0,jY.validateAttribute)(w.name),A.push(w)}return Et({table:s,database:c,schemaDefined:u,attributes:A}),Ve.indexingOperation}static async removeAttributes(p){let A=S.filter(w=>!p.includes(w.name));return Et({table:s,database:c,schemaDefined:u,attributes:A}),Ve.indexingOperation}static getSize(){let p=i.getStats();return(p.treeBranchPageCount+p.treeLeafPageCount+p.overflowPages)*p.pageSize}static getAuditSize(){let p=l?.getStats();return p&&(p.treeBranchPageCount+p.treeLeafPageCount+p.overflowPages)*p.pageSize}static getRecordCount(p){let A=i.getStats().entryCount,w=1e3/2,R=performance.now(),b=Math.floor(A/2),D=p?.exactCount,O=0,B=0,k;for(let{value:C}of i.getRange({start:!0,lazy:!0}))if(C!=null&&O++,B++,!D&&B<b&&performance.now()-R>w){k=B;break}if(k){let C=O;O=0;for(let{value:te}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:k}))te!=null&&O++;let F=k*2,x=(O+C)/F,q=Math.pow((O-C+1)/k/2,2)+x*(1-x)/F,ee=Math.max(Math.sqrt(q)*A,1),G=Math.round(x*A),Re=Math.max(G-1.96*ee,O+C),Ee=Math.min(G+1.96*ee,A),Ae=Math.pow(10,Math.round(Math.log10(ee)));return Ae>G&&(Ae=Ae/10),O=Math.round(G/Ae)*Ae,{recordCount:O,estimatedRange:[Math.round(Re),Math.round(Ee)]}}return{recordCount:O}}static updatedAttributes(){wn=this.propertyResolvers={$id:a((p,A,w)=>({value:w.key}),"$id"),$updatedtime:a((p,A,w)=>w.version,"$updatedtime"),$record:a((p,A,w)=>w?{value:p}:p,"$record")};for(let p of this.attributes){p.resolve=null;let A=p.relationship,w=p.computed;if(A)if(p.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),w&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),Cd=!0,A.to)p.elements?.definition?(wn[p.name]=p.resolve=(R,b,D)=>{let O=R[A.from?A.from:t],B=p.elements.definition.tableClass;return D?Xu({attribute:A.to,value:O},Ir(b).getReadTxn(),!1,B,!1).asArray:B.search([{attribute:A.to,value:O}],b).asArray},p.set=()=>{throw new Error("Setting a one-to-many relationship property is not supported")},p.resolve.definition=p.elements.definition,A.from&&(p.resolve.from=A.from)):console.error(`The one-to-many/many-to-many relationship property "${p.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(A.from){let R=p.definition||p.elements?.definition;R?(wn[p.name]=p.resolve=(b,D,O)=>{let B=b[A.from];if(B!==void 0){if(p.elements){let k,C=B?.map(F=>{let x=O?R.tableClass.primaryStore.getEntry(F,{transaction:Ir(D).getReadTxn()}):R.tableClass.get(F,D);return x?.then&&(k=!0),x});return A.filterMissing?k?Promise.all(C).then(F=>F.filter(YY)):C.filter(YY):k?Promise.all(C):C}return O?R.tableClass.primaryStore.getEntry(B,{transaction:Ir(D).getReadTxn()}):R.tableClass.get(B,D)}},p.set=(b,D)=>{if(Array.isArray(D)){let O=D.map(B=>B[ze]||B[R.tableClass.primaryKey]);b[A.from]=O}else{let O=D[ze]||D[R.tableClass.primaryKey];b[A.from]=O}},p.resolve.definition=p.definition||p.elements?.definition,p.resolve.from=A.from):console.error(`The relationship property "${p.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${p.name}" in table "${s}" must use either "from" or "to" arguments`);else w&&(typeof w.from=="function"&&this.setComputedAttribute(p.name,w.from),wn[p.name]=p.resolve=(R,b,D)=>{let O=typeof w.from=="string"?R[w.from]:R,B=this.userResolvers[p.name];if(B)return B(O,b,D);qe.default.warn(`Computed attribute "${p.name}" does not have a function assigned to it. Please use setComputedAttribute('${p.name}', resolver) to assign a resolver function.`),this.userResolvers[p.name]=()=>{}})}bT(this,this)}static setComputedAttribute(p,A){let w=Mi(S,p);if(!w){console.error(`The attribute "${p}" does not exist in the table "${s}"`);return}if(!w.computed){console.error(`The attribute "${p}" is not defined as computed in the table "${s}"`);return}this.userResolvers[p]=A}static async deleteHistory(p=0,A=!1){let w;for(let{key:R,value:b}of l.getRange({start:0,end:p}))await Td(),xt(b).tableId===n&&(w=pT(l,R,b));if(A)for(let{key:R,value:b,localTime:D}of i.getRange({start:0,versions:!0}))await Td(),b===null&&D<p&&(w=i.remove(R));await w}static async*getHistory(p=0,A=1/0){for(let{key:w,value:R}of l.getRange({start:p||1,end:A})){await Td();let b=xt(R);b.tableId===n&&(yield{id:b.recordId,localTime:w,version:b.version,type:b.type,value:b.getValue(i,!0,w),user:b.user,operation:b.originatingOperation})}}static async getHistoryOfRecord(p){let A=[];if(p==null)throw new Error("An id is required");let w=i.getEntry(p);if(!w)return A;let R=w.localTime;if(!R)throw new Error("The entry does not have a local audit time");let b=0;do{await Td();let D=l.get(R);if(D){let O=xt(D);A.push({id:O.recordId,localTime:R,version:O.version,type:O.type,value:O.getValue(i,!0,R),user:O.user}),R=O.previousLocalTime}else break}while(b<1e3&&R);return A.reverse()}static cleanup(){Q?.remove()}}Ve.updatedAttributes();let ss=Ve.prototype;return ss[Mme]=!0,h&&Ve.setTTLExpiration(h/1e3),ne&&Se(),Ve;function qa(v,p,A){let w;for(let R in r){let b=r[R],D=b.isIndexing,O=wn[R],B=A&&(O?O(A):A[R]),k=p&&(O?O(p):p[R]);if(B===k&&!D)continue;w=!0;let C=b.indexNulls,F=(0,CE.getIndexedValues)(B,C),x=(0,CE.getIndexedValues)(k,C);if(x?.length>0){let q=new Set(x);if(F=F?F.filter(ee=>{if(q.has(ee))q.delete(ee);else return!0}):[],x=Array.from(q),(x.length>0||F.length>0)&&FY){let ee=x.concat(F).map(G=>({key:G,value:v}));b.prefetch(ee,VY)}for(let ee=0,G=x.length;ee<G;ee++)b.remove(x[ee],v)}else F?.length>0&&FY&&b.prefetch(F.map(q=>({key:q,value:v})),VY);if(F)for(let q=0,ee=F.length;q<ee;q++)b.put(F[q],v)}return w}a(qa,"updateIndices");function Yi(v){switch(typeof v){case"number":return!0;case"string":if(v.length<659)return!0;if(v.length>qY)throw new Error("Primary key size is too large: "+v.length);break;case"object":if(v===null)throw new Error("Invalid primary key of null");break;case"bigint":if(v<2n**64n&&v>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof v)}if((0,Sl.writeKey)(v,vme,0)>qY)throw new Error("Primary key size is too large: "+v.length);return!0}a(Yi,"checkValidId");function $a(v,p,A,w,R){if(Ve.getResidencyById&&A.ensureLoaded&&p?.replicateFrom!==!1){let D=Ve.getResidencyById(v);if(D&&!D.includes(server.hostname)&&I)return I({key:v,residency:D}).then(R)}let b=a(()=>{if(p?.transaction?.stale&&(p.transaction.stale=!1),A.transaction?.isDone)return R(null,v);let D=i.getEntry(v,A);return D?.residencyId&&D.metadataFlags&Os&&I&&A.ensureLoaded&&p?.replicateFrom!==!1?I(D).then(O=>R(O,v)):(D&&p&&(D?.version>(p.lastModified||0)&&(p.lastModified=D.version),D?.localTime&&!p.lastRefreshed&&(p.lastRefreshed=D.localTime)),R(D,v))},"whenPrefetched");return w?b():ae>0?(ae--,b()):new Promise((D,O)=>{ae===0?(ae--,i.prefetch([v],()=>{B(),k()})):(de.push(v),W.push(k),de.length>YE&&(ae--,B()));function B(){if(de.length>0){let C=W;i.prefetch(de,()=>{ae===-1?B():ae++;for(let F of C)F()}),de=[],W=[],Oe>2&&Oe--}else ae=Oe,Oe<vs&&Oe++}a(B,"prefetch");function k(){try{D(b())}catch(C){O(C)}}a(k,"load")})}a($a,"loadLocalRecord");function Va(v){if(!v?.role)return;let p=v.role.permission;if(p.super_user)return Bme;let A=p[c],w,R=A?.tables;if(R)return R[s];if(c==="data"&&(w=p[s])&&!w.tables)return w}a(Va,"getTablePermissions");function Dd(v,p,A,w){if(U){let R=!1;if(A.noCache?R=!0:(p?(!p.value||p.metadataFlags&(Os|ya)||p.expiresAt!=null&&p.expiresAt<Date.now())&&(R=!0):R=!0,qn(!R,"cache-hit",s)),R){let b=Ld(v,p,A).then(D=>(D?.value?.[ve]&&qe.default.error?.("Can not assign a record with a record property"),A&&(D?.version>(A.lastModified||0)&&(A.lastModified=D.version),A.lastRefreshed=Date.now()),D));if(A?.onlyIfCached||p?.value&&w?.allowStaleWhileRevalidate?.(p,v)){if(b.catch(D=>qe.default.warn?.(D)),A?.onlyIfCached&&!w.doesExist())throw new Or.ServerError("Entry is not cached",504);return}else return b}}else if(p?.value&&p.expiresAt!=null&&p.expiresAt<Date.now())return Ve.evict(p.key,p.value,p.version),p.value=null,{then(R){return R(p)}}}a(Dd,"ensureLoadedFromSource");function Ir(v){let p=v?.transaction;if(p){if(!p.lmdbDb)return p.lmdbDb=i,p;do{if(p.lmdbDb?.path===i.path)return p;let A=p.next;if(!A)return p=p.next=new hc,p.lmdbDb=i,p;p=A}while(!0)}else return new np}a(Ir,"txnForContext");function Nl(v,p,A){if(!v)return;let w=v.value||i.getEntry(v.key)?.value;if(typeof p=="object"){let b=wn,D=w;for(let O=0,B=p.length;O<B;O++){let k=p[O],C=b?.[k];D=C&&D?C(D,A,!0)?.value:D?.[k],b=C?.definition?.tableClass?.propertyResolvers}return D}let R=wn[p];return R?R(w,A):w[p]}a(Nl,"getAttributeValue");function Pd(v,p,A,w,R){let b=R?.length,D={transaction:w,lazy:b>0||typeof p=="string"||p?.length<4,alwaysPrefetch:!0},O;function B(k,C){let F=k?.value;if(!F)return Ba.SKIP;for(let x=0;x<b;x++)if(!O?.includes(x)&&!R[x](F,k))return Ba.SKIP;return C!==void 0&&(k.key=C),k}if(a(B,"processEntry"),b>0||!v.hasEntries){let k=v.map(C=>{if(O=null,typeof C=="object"&&C?.key!==void 0)return b>0?B(C):C;if(C==null)return Ba.SKIP;for(let F=0;F<b;F++){let q=R[F].idFilter;if(q){if(!q(C))return Ba.SKIP;O||(O=[]),O.push(F)}}return $a(C,A,D,!1,B)});return Array.isArray(v)&&(k=k.filter(C=>C!==Ba.SKIP)),k.hasEntries=!0,k}return v}a(Pd,"transformToEntries");function ui(v,p,A=server.replication?.getThisNodeId(l)){if(v<=p?.version){if(p?.version===v&&A!==void 0){let w=server.replication?.exportIdMapping(l),R=p.localTime,b=R&&l.get(R);if(b){let D,O,B=xt(b);for(let k in w)w[k]===A&&(D=k),w[k]===B.nodeId&&(O=k);if(D>O)return 1;if(D===O)return 0}}return-1}return 1}a(ui,"precedesExistingVersion");async function Ld(v,p,A){let w=p?.metadataFlags,R=p?.version,b,D;if(!i.attemptLock(v,R,()=>{clearTimeout(D);let C=i.getEntry(v);!C||!C.value||C.metadataFlags&(Os|ya)?b(Ld(v,i.getEntry(v),A)):b(C)}))return new Promise(C=>{b=C,D=setTimeout(()=>{i.unlock(v,R)},Lme)});let O=p?.value,B={requestContext:A,replacingRecord:O,replacingEntry:p,replacingVersion:R,noCacheStore:!1,source:null,resourceCache:A?.resourceCache},k=A?.responseHeaders;return new Promise((C,F)=>{let x;uw(Dt(B,async q=>{let ee=performance.now(),G,Re,Ee;try{for(let ge of Ve.sources)if(ge.get&&(!ge.get.reliesOnPrototype||ge.prototype.get)){if(ge.available?.(p)===!1)continue;if(B.source=ge,G=await ge.get(v,B),G)break}Ee=w&Os;let te=B.lastModified||Ee&&R;Re=Ee||te>R||!O,te||(te=(0,CE.getNextMonotonicTime)());let K=performance.now()-ee;if(mr(K,"cache-resolution",s,null,"success"),k&&ym(k,"Server-Timing",`cache-resolve;dur=${K.toFixed(2)}`,!0),q.timestamp=te,h&&B.expiresAt==null&&(B.expiresAt=Date.now()+h),G){if(typeof G!="object")throw new Error("Only objects can be cached and stored in tables");if(G.status>0&&G.headers)if(G.status>=300)if(G.status===304)G=O,te=R;else throw new Or.ServerError(G.body||"Error from source",G.status);else G=G.body;typeof G.toJSON=="function"&&(G=G.toJSON()),t&&G[t]!==v&&(G[t]=v)}x=!0,C({key:v,version:te,value:G})}catch(te){te.message+=` while resolving record ${v} for ${s}`,O&&((te.code==="ECONNRESET"||te.code==="ECONNREFUSED"||te.code==="EAI_AGAIN")&&!A?.mustRevalidate||A?.staleIfError&&(te.statusCode===500||te.statusCode===502||te.statusCode===503||te.statusCode===504))?(C({key:v,version:R,value:O}),qe.default.trace?.(te.message,"(returned stale record)")):F(te);let K=performance.now()-ee;mr(K,"cache-resolution",s,null,"fail"),k&&ym(k,"Server-Timing",`cache-resolve;dur=${K.toFixed(2)}`,!0),B.transaction.abort();return}if(A?.noCacheStore||B.noCacheStore){B.transaction.abort();return}Ir(B).addWrite({key:v,store:i,entry:p,nodeName:"source",commit:a((te,K)=>{if(K?.version!==R)return;let ge=qa(v,O,G);G?(Me.put?.(B,v,G),qe.default.trace?.(`Writing resolved record from source with id: ${v}, timestamp: ${new Date(te).toISOString()}`),y(v,G,K,te,0,m&&Re||null,{user:B?.user,expiresAt:B.expiresAt},"put",!!Ee)):K&&(Me.delete?.(B,v),qe.default.trace?.(`Deleting resolved record from source with id: ${v}, timestamp: ${new Date(te).toISOString()}`),m||g?y(v,null,K,te,0,m&&Re||null,{user:B?.user},"delete",!!Ee):i.remove(v,R))},"commit")})}),()=>{i.unlock(v,R)},q=>{i.unlock(v,R),x&&qe.default.error?.("Error committing cache update",q)})})}a(Ld,"getFromSource");function Ka(v){if(!v||v.user?.role?.permission?.super_user)return!0;if(v.replicateTo)throw new Or.ClientError("Can not specify replication parameters without super user permissions",403);if(v.replicatedConfirmation)throw new Or.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}a(Ka,"checkContextPermissions");function Ho(){if(Gr!==wd&&(wd=Gr,(0,ml.getWorkerIndex)()===(0,ml.getWorkerCount)()-1)){if(ka&&clearTimeout(ka),!Gr)return;let v=new Date;v.setMonth(0),v.setDate(1),v.setHours(0),v.setMinutes(0),v.setSeconds(0);let p=Math.ceil((Date.now()-v.getTime())/Gr)*Gr+v.getTime(),A=a(w=>{qe.default.trace?.(`Scheduled next cleanup scan at ${new Date(w)}ms`),ka=setTimeout(()=>X=X.then(async()=>{if(A(Math.max(w+Gr,Date.now())),i.rootStore.status!=="open"){clearTimeout(ka);return}let R=50,b=new Array(R),D=0;qe.default.info?.(`Starting cleanup scan for ${s}`);try{let O=0;for(let{key:B,value:k,version:C,expiresAt:F}of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let x;k===null&&!m&&C+Pme<Date.now()?x=i.remove(B,C):F!=null&&F+T<Date.now()&&(x=Ve.evict(B,k,C),O++),x&&(await b[D],b[D]=x.catch(q=>{qe.default.error?.("Cleanup error",q)}),++D>=R&&(D=0)),await Td()}qe.default.info?.(`Finished cleanup scan for ${s}, evicted ${O} entries`)}catch(O){qe.default.warn?.(`Error in cleanup scan for ${s}:`,O)}}),Math.min(w-Date.now(),2147483647)).unref()},"startNextTimer");A(p)}}a(Ho,"scheduleCleanup");function ie(){Q=l?.addDeleteRemovalCallback(n,v=>{let p=i.getEntry(v);p?.value===null&&i.remove(v,p.version)})}a(ie,"addDeleteRemoval");function Se(){(0,ml.getWorkerIndex)()===0&&setInterval(async()=>{if(!Ol){Ol=!0;try{let v=ne.name,p=r[v];if(!p)throw new Error(`expiresAt attribute ${ne} must be indexed`);for(let A of p.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let w of p.getValues(A)){let R=i.getEntry(w);R?.value?R.value[v]<Date.now()&&Ve.evict(w,R.value,R.version):i.ifVersion(w,R?.version,()=>p.remove(A,w))}await Td()}}catch(v){qe.default.error?.("Error in evicting old records",v)}finally{Ol=!1}}},Dme).unref()}a(Se,"runRecordExpirationEviction");function tt(v){if(v){let p=v.join(","),A=d.get([Symbol.for("residency_by_set"),p]);return A||(d.put([Symbol.for("residency_by_set"),p],A=Math.floor(Math.random()*2147483647)),d.put([Symbol.for("residency_by_id"),A],v),A)}}a(tt,"getResidencyId")}function lw(e,t){let r=e.attr_object||(e.attr_object={}),n=r[t];if(n)return n;n=r[t]=Object.create(null);for(let s of e)n[s.attribute_name]=s[t];return n}function VY(){}function Hme(e){zY=e}function CT(e,t){let r=t?.type;if(e===null)return e;if(e===""&&r&&r!=="String"&&r!=="Any")return null;try{switch(r){case"Int":case"Long":if(e[0]==="$")return wT(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return wT(+e);case"Float":return e==="null"?null:wT(+e);case"BigInt":return e==="null"?null:BigInt(e);case"Boolean":return e==="true"?!0:e==="false"?!1:e;case"Date":if(isNaN(e)){if(e==="null")return null;xme.test(e)||(e+="Z");let n=new Date(e);return wT(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,PT.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function wT(e){if(isNaN(e))throw new SyntaxError;return e}function KY(e,t){if(e==null)return!0;if(!Array.isArray(t))return e===t||t.startsWith?.(e);if(Array.isArray(e)){let r=e.length;if(e[r-1]===null&&r--,t.length>=r){for(let n=0;n<r;n++)if(t[n]!==e[n])return!1;return!0}return!1}else if(t[0]===e)return!0}function uw(e,t,r){return e?.then?e.then(t,r):t(e)}function DT(e,t){e[kr]=t,e[ve]=t?.value??null,e[wE]=t?.version}function YY(e){return e!=null}function ci(e){try{return JSON.stringify(e)}catch{return e}}function kme(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var Ms,Ba,CE,WY,jY,gd,Or,DE,PE,qe,Sl,ml,PT,Cme,zY,Dme,Pme,FY,Lme,wE,Mme,kr,IE,GY,Ume,cw,Os,ya,vme,qY,$Y,Bme,AMe,xme,Td,Lf=Ie(()=>{Ms=L(M()),Ba=require("lmdb"),CE=L(sn()),WY=require("lodash"),jY=L(Wd());Vs();sp();gd=L(se());JR();Or=L(_e()),DE=L(eo()),PE=L(qs());De();tE();qe=L(Sc());ap();pc();Sl=require("ordered-binary"),ml=L(dt());ji();PT=L(re());Ll();Ii();mT();Of();Cme=new Uint8Array(9);Cme[8]=192;Dme=6e4,Pme=864e5;gd.initSync();FY=gd.get(Ms.CONFIG_PARAMS.STORAGE_PREFETCHWRITES),Lme=1e4,wE=Symbol.for("version"),Mme=Symbol.for("incremental-update"),kr=Symbol("entry"),IE=Symbol("is-saving"),GY=1,Ume=2,cw=Symbol("loaded-from-source"),Os=1,ya=8,vme=Buffer.allocUnsafeSlow(8192),qY=1978,$Y=100,Bme={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},AMe=(0,PT.convertToMS)(gd.get(Ms.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;a(LT,"makeTable");a(lw,"attributesAsObject");a(VY,"noop");a(Hme,"setServerUtilities");xme=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;a(CT,"coerceType");a(wT,"rejectNaN");a(KY,"isDescendantId");Td=a(()=>new Promise(setImmediate),"rest");a(uw,"when");a(DT,"updateResource");a(YY,"exists");a(ci,"stringify");a(kme,"hasOtherProcesses")});var lt={};je(lt,{database:()=>zl,databases:()=>We,dropDatabase:()=>BR,dropTableMeta:()=>Vme,getDatabases:()=>ut,getDefaultCompression:()=>Tm,getTables:()=>Fme,onRemovedDB:()=>z_,onUpdatedTable:()=>Nc,readMetaDb:()=>LE,resetDatabases:()=>Uu,table:()=>Et,tables:()=>jn});function Fme(){return BT||ut(),jn||{}}function ut(){if(BT)return We;BT=!0,yd=new Map;let e=(0,er.getHdbBasePath)()&&(0,Ut.join)((0,er.getHdbBasePath)(),yr.DATABASES_DIR_NAME),t=(0,er.get)(yr.CONFIG_PARAMS.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,er.get)(yr.CONFIG_PARAMS.STORAGE_PATH)||e&&((0,rs.existsSync)(e)?e:(0,Ut.join)((0,er.getHdbBasePath)(),yr.LEGACY_DATABASES_DIR_NAME)),!e)return;if((0,rs.existsSync)(e))for(let n of(0,rs.readdirSync)(e,{withFileTypes:!0})){let s=(0,Ut.basename)(n.name,".mdb");n.isFile()&&(0,Ut.extname)(n.name).toLowerCase()===".mdb"&&!t[s]?.path&&LE((0,Ut.join)(e,n.name),null,s)}if((0,rs.existsSync)((0,Rd.getBaseSchemaPath)())){for(let n of(0,rs.readdirSync)((0,Rd.getBaseSchemaPath)(),{withFileTypes:!0}))if(!n.isFile()){let s=(0,Ut.join)((0,Rd.getBaseSchemaPath)(),n.name),i=(0,Ut.join)((0,Rd.getTransactionAuditStoreBasePath)(),n.name);for(let o of(0,rs.readdirSync)(s,{withFileTypes:!0}))if(o.isFile()&&(0,Ut.extname)(o.name).toLowerCase()===".mdb"){let c=(0,Ut.join)(i,o.name);LE((0,Ut.join)(s,o.name),(0,Ut.basename)(o.name,".mdb"),n.name,c,!0)}}}if(t)for(let n in t){let s=t[n],i=s.path;if((0,rs.existsSync)(i))for(let c of(0,rs.readdirSync)(i,{withFileTypes:!0}))c.isFile()&&(0,Ut.extname)(c.name).toLowerCase()===".mdb"&&LE((0,Ut.join)(i,c.name),(0,Ut.basename)(c.name,".mdb"),n);let o=s.tables;if(o)for(let c in o){let l=o[c],u=(0,Ut.join)(l.path,(0,Ut.basename)(c+".mdb"));(0,rs.existsSync)(u)&&LE(u,c,n,null,!0)}}for(let n in We){let s=yd.get(n);if(s){let i=We[n];n.includes("delete")&&Vt.trace(`defined tables ${Array.from(s.keys())}`);for(let o in i)s.has(o)||(Vt.trace(`delete table class ${o}`),delete i[o])}else if(delete We[n],n==="data"){for(let i in jn)delete jn[i];delete jn[HT]}}let r=["hdb_temp","hdb_certificate","hdb_analytics","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_license","hdb_info"];if(We.system)for(let n of r)We.system[n]&&(We.system[n].replicate=!1);return yd=null,We}function Uu(){BT=!1;for(let[,e]of Ha)e.needsDeletion=!0;ut();for(let[e,t]of Ha)t.needsDeletion&&!e.endsWith("system.mdb")&&(t.close(),Ha.delete(e),delete We[t.databaseName],UE.forEach(r=>r(t.databaseName)));return We}function LE(e,t,r=fw,n,s){let i=new dw.default(e,!1);try{let o=Ha.get(e);o?o.needsDeletion=!1:(o=(0,bd.open)(i),Ha.set(e,o));let c=new Tl.default(!1),l=o.dbisDb||(o.dbisDb=o.openDB(MT.INTERNAL_DBIS_NAME,c)),u=o.auditStore;u||(n?(0,rs.existsSync)(n)&&(i.path=n,u=(0,bd.open)(i),u.isLegacy=!0):u=hT(o));let d=ZY(r),_=d[HT],E=new Map;for(let{key:f,value:h}of l.getRange({start:!1})){let[T,m]=f.toString().split("/");m===""?m=h.name:m||(m=T,T=t,h.name||(h.name=m,h.indexed=!h.is_hash_attribute)),_?.add(T);let g=E.get(T);g||E.set(T,g={attributes:[]}),(m==null||h.is_hash_attribute)&&(g.primary=h),m!=null&&g.attributes.push(h),Object.defineProperty(h,"key",{value:f,configurable:!0})}for(let[f,h]of E){let{attributes:T,primary:m}=h;if(!m){for(let W of T)if(W.is_hash_attribute||W.isPrimaryKey){m=W;break}if(!m){Vt.warn(`Unable to find a primary key attribute on table ${f}, with attributes: ${JSON.stringify(T)}`);continue}}let g=d[f],S={},y=[],I,U,H=typeof m.audit=="boolean"?m.audit:(0,er.get)(yr.CONFIG_PARAMS.LOGGING_AUDITLOG),X=m.trackDeletes,Y=m.expiration,V=m.eviction,ne=m.sealed,Q=m.splitSegments,de=m.replicate;if(g)S=g.indices,y=g.attributes,g.schemaVersion++;else{I=m.tableId,I?I>=(l.get(Ad)||0)&&(l.putSync(Ad,I+1),Vt.info(`Updating next table id (it was out of sync) to ${I+1} for ${f}`)):(m.tableId=I=l.get(Ad),I||(I=1),Vt.debug("Table {table_name} missing an id, assigning {table_id}"),l.putSync(Ad,I+1),l.putSync(m.key,m));let W=new Tl.default(!m.is_hash_attribute,m.is_hash_attribute);if(W.compression=m.compression,W.compression){let ae=(0,er.get)(yr.CONFIG_PARAMS.STORAGE_COMPRESSION_THRESHOLD)||XY;W.compression.threshold=ae}U=mh(o.openDB(m.key,W)),o.databaseName=r,U.rootStore=o,U.tableId=I}for(let W of T){W.attribute=W.name;try{if(!W.is_hash_attribute&&(W.indexed||W.attribute&&!W.name)){if(!S[W.name]){let Oe=new Tl.default(!W.is_hash_attribute,W.is_hash_attribute);S[W.name]=o.openDB(W.key,Oe),S[W.name].indexNulls=W.indexNulls}let ae=y.find(Oe=>Oe.name===W.name);ae?y.splice(y.indexOf(ae),1,W):y.push(W)}}catch(ae){Vt.error("Error trying to update attribute",W,y,S,ae)}}if(!g){g=eW(d,f,LT({primaryStore:U,auditStore:u,audit:H,sealed:ne,splitSegments:Q,replicate:de,expirationMS:Y&&Y*1e3,evictionMS:V&&V*1e3,trackDeletes:X,tableName:f,tableId:I,primaryKey:m.name,databasePath:s?r+"/"+f:r,databaseName:r,indices:S,attributes:T,schemaDefined:m.schemaDefined,dbisDB:l})),g.schemaVersion=1;for(let W of ME)W(g)}}return o}catch(o){throw o.message+=` opening database ${e}`,o}}function ZY(e){let t=We[e];if(t||(e==="data"?t=We[e]=jn:e==="system"?Object.defineProperty(We,"system",{value:t=Object.create(null),configurable:!0}):t=We[e]=Object.create(null)),yd&&!yd.has(e)){let r=new Set;t[HT]=r,yd.set(e,r)}return t}function eW(e,t,r){return e[t]=r,r}function zl({database:e,table:t}){e||(e=fw),ut();let r=ZY(e),n=(0,Ut.join)((0,er.getHdbBasePath)(),yr.DATABASES_DIR_NAME),s=(0,er.get)(yr.CONFIG_PARAMS.DATABASES)||{};process.env.SCHEMAS_DATA_PATH&&(s.data={path:process.env.SCHEMAS_DATA_PATH});let i=t&&s[e]?.tables?.[t]?.path;n=i||s[e]?.path||process.env.STORAGE_PATH||(0,er.get)(yr.CONFIG_PARAMS.STORAGE_PATH)||((0,rs.existsSync)(n)?n:(0,Ut.join)((0,er.getHdbBasePath)(),yr.LEGACY_DATABASES_DIR_NAME));let o=(0,Ut.join)(n,(i?t:e)+".mdb"),c=Ha.get(o);if(!c||c.status==="closed"){let l=new dw.default(o,!1);c=(0,bd.open)(l),Ha.set(o,c)}return c.auditStore||(c.auditStore=hT(c)),c}async function BR(e){if(!We[e])throw new Error("Schema does not exist");let t=We[e],r;for(let n in t)r=t[n].primaryStore.rootStore,Ha.delete(r.path),r.status==="open"&&(await r.close(),await vE.remove(r.path));if(r||(r=zl({database:e,table:null}),r.status==="open"&&(await r.close(),await vE.remove(r.path))),e==="data"){for(let n in jn)delete jn[n];delete jn[HT]}delete We[e],UE.forEach(n=>n(e))}function Et(e){let{table:t,database:r,expiration:n,eviction:s,scanInterval:i,attributes:o,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:_,schemaDefined:E,origin:f}=e;r||(r=fw);let h=zl({database:r,table:t}),T=We[r];Vt.trace(`Defining ${t} in ${r}`);let m=T?.[t];if(h.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let g,S,y;E==null&&(E=!0);let I=new Tl.default(!1);for(let Q of o)Q.attribute&&!Q.name?(Q.name=Q.attribute,Q.indexed=!0):Q.attribute=Q.name,Q.expiresAt&&(Q.indexed=!0);let U,H;if(m){if(g=m.primaryKey,m.primaryStore.rootStore.status==="closed")throw new Error(`Can not use a closed data store from ${t} class`);u==null&&(u=m.splitSegments),m.attributes.splice(0,m.attributes.length,...o)}else{let Q=h.auditStore;S=o.find(Oe=>Oe.isPrimaryKey)||{},g=S.name,S.is_hash_attribute=S.isPrimaryKey=!0,S.schemaDefined=E,S.compression=Tm(),_&&(S.trackDeletes=!0),c=S.audit=typeof c=="boolean"?c:(0,er.get)(yr.CONFIG_PARAMS.LOGGING_AUDITLOG),n&&(S.expiration=n),s&&(S.eviction=s),S.splitSegments=!1,typeof l=="boolean"&&(S.sealed=l),typeof d=="boolean"&&(S.replicate=d),f&&(S.origins?S.origins.includes(f)||S.origins.push(f):S.origins=[f]),Vt.trace(`${t} table loading, opening primary store`);let de=new Tl.default(!1,!0);de.compression=S.compression;let W=t+"/";if(y=h.dbisDb=h.openDB(MT.INTERNAL_DBIS_NAME,I),ne(),y.get(W))return H&&H(),Uu(),Et(e);let ae=mh(h.openDB(W,de));h.databaseName=r,ae.rootStore=h,ae.tableId=y.get(Ad),Vt.trace(`Assigning new table id ${ae.tableId} for ${t}`),ae.tableId||(ae.tableId=1),y.put(Ad,ae.tableId+1),S.tableId=ae.tableId,m=eW(T,t,LT({primaryStore:ae,auditStore:Q,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:_,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:g,tableName:t,tableId:ae.tableId,databasePath:r,databaseName:r,indices:{},attributes:o,schemaDefined:E,dbisDB:y})),m.schemaVersion=1,U=!0,y.put(W,S)}let X=m.indices;y=y||(h.dbisDb=h.openDB(MT.INTERNAL_DBIS_NAME,I)),m.dbisDB=y;let Y=[];for(let{key:Q,value:de}of y.getRange({start:!0})){let[W,ae]=Q.toString().split("/");if(ae===""&&(ae=de.name),ae){if(W!==t)continue}else continue;let Oe=o.find(Me=>Me.name===ae),Ne=!Oe?.indexed&&de.indexed&&!de.isPrimaryKey;if((!Oe||Ne)&&(ne(),U=!0,Oe||y.remove(Q),Ne)){let Me=m.indices[W];Me&&Y.push(Me)}}let V=[];try{for(let Q of o||[]){if((Q.relationship||Q.computed)&&(U=!0,Q.relationship))continue;let de=t+"/"+(Q.name||"");Object.defineProperty(Q,"key",{value:de,configurable:!0});let W=y.get(de);if(Q.isPrimaryKey){if(W=W||y.get(de=t+"/")||{},c!==void 0&&c!==m.audit||l!==void 0&&l!==m.sealed||d!==void 0&&d!==m.replicate||(+n||void 0)!==(+W.expiration||void 0)||(+s||void 0)!==(+W.eviction||void 0)){let Oe={...W};typeof c=="boolean"&&(c&&m.enableAuditing(c),Oe.audit=c),n&&(Oe.expiration=+n),s&&(Oe.eviction=+s),l!==void 0&&(Oe.sealed=l),d!==void 0&&(Oe.replicate=d),U=!0,ne(),y.put(de,Oe)}continue}W?.attribute&&!W.name&&(W.indexed=!0);let ae=!W||W.type!==Q.type||W.indexed!==Q.indexed||W.nullable!==Q.nullable||W.version!==Q.version||JSON.stringify(W.properties)!==JSON.stringify(Q.properties)||JSON.stringify(W.elements)!==JSON.stringify(Q.elements);if(Q.indexed){let Oe=new Tl.default(!0,!1),Ne=h.openDB(de,Oe);(ae||W.indexingPID&&W.indexingPID!==process.pid||W.restartNumber<BE.workerData?.restartNumber)&&(U=!0,ne(),W=y.get(de),(ae||W.indexingPID&&W.indexingPID!==process.pid||W.restartNumber<BE.workerData?.restartNumber)&&(U=!0,Q.indexNulls===void 0&&(Q.indexNulls=!0),m.primaryStore.getStats().entryCount>0&&(Q.lastIndexedKey=W?.lastIndexedKey??void 0,Q.indexingPID=process.pid,Ne.isIndexing=!0,Object.defineProperty(Q,"dbi",{value:Ne}),V.push(Q))),y.put(de,Q)),W?.indexNulls&&Q.indexNulls===void 0&&(Q.indexNulls=!0),Ne.indexNulls=Q.indexNulls,X[Q.name]=Ne}else ae&&(U=!0,ne(),y.put(de,Q))}}finally{H&&H()}if(U&&(m.schemaVersion++,m.updatedAttributes()),Vt.trace(`${t} table loading, running index`),V.length>0||Y.length>0?m.indexingOperation=$me(m,V,Y):U&&UT.signalSchemaChange(new vT.SchemaEventMsg(process.pid,"schema-change",m.databaseName,m.tableName)),m.origin=f,U)for(let Q of ME)Q(m,f!=="cluster");return(n||s||i)&&m.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),Vt.trace(`${t} table loaded`),m;function ne(){H||h.transactionSync(()=>({then(Q){H=Q}}))}a(ne,"startTxn")}async function $me(e,t,r){try{Vt.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await UT.signalSchemaChange(new vT.SchemaEventMsg(process.pid,"schema-change",e.databaseName,e.tableName));let s;for(let u of r)s=u.drop();let i,o={},c=0,l=t.length;if(await new Promise(u=>setImmediate(u)),l>0){let u;for(let _ of t)(0,bd.compareKeys)(_.lastIndexedKey,u)<0&&(u=_.lastIndexedKey),_.lastIndexedKey==null&&_.dbi.clearAsync();let d=0;for(let{key:_,value:E,version:f}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(E){if(d++,s=e.primaryStore.ifVersion(_,f,()=>{for(let h=0;h<l;h++){let T=t[h],m=T.name;try{let g=T.resolve,S=E&&(g?g(E):E[m]),y=(0,QY.getIndexedValues)(S);if(y)for(let I=0,U=y.length;I<U;I++)T.dbi.put(y[I],_)}catch(g){o[m]||(o[m]=!0,Vt.error(`Error indexing attribute ${m}`,g))}}}),s.then(()=>d--,h=>{d--,Vt.error(h)}),BE.workerData&&BE.workerData.restartNumber!==JY.restartNumber&&(i=!0),++c%100===0||i){for(let h of t)h.lastIndexedKey=_,e.dbisDB.put(h.key,h);if(i)return}d>Gme?await s:d>qme&&await new Promise(h=>setImmediate(h))}for(let _ of t)delete _.lastIndexedKey,delete _.indexingPID,_.dbi.isIndexing=!1,s=e.dbisDB.put(_.key,_)}await s,await UT.signalSchemaChange(new vT.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),Vt.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){Vt.error("Error in indexing",n)}}function Vme({table:e,database:t}){let r=zl({database:t,table:e}),n=[],s=r.dbisDb;for(let i of s.getKeys({start:e+"/",end:e+"0"}))n.push(s.remove(i));return Promise.all(n)}function Nc(e){return ME.push(e),{remove(){let t=ME.indexOf(e);t>-1&&ME.splice(t,1)}}}function z_(e){return UE.push(e),{remove(){let t=UE.indexOf(e);t>-1&&UE.splice(t,1)}}}function Tm(){let e=(0,er.get)(yr.CONFIG_PARAMS.STORAGE_COMPRESSION),t=(0,er.get)(yr.CONFIG_PARAMS.STORAGE_COMPRESSION_DICTIONARY),r=(0,er.get)(yr.CONFIG_PARAMS.STORAGE_COMPRESSION_THRESHOLD)||XY,n={startingOffset:32};return t&&(n.dictionary=vE.readFileSync(t)),r&&(n.threshold=r),e&&n}var er,MT,bd,Ut,rs,Rd,Tl,dw,yr,vE,_w,QY,UT,vT,BE,Vt,JY,fw,HT,XY,jn,We,Ad,ME,UE,BT,Ha,yd,Gme,qme,De=Ie(()=>{er=L(se()),MT=L(Ht()),bd=require("lmdb"),Ut=require("path"),rs=require("fs"),Rd=L(Tt());Lf();Tl=L(r_()),dw=L(n_()),yr=L(M()),vE=L(require("fs-extra")),_w=L(_i()),QY=L(sn()),UT=L(eo()),vT=L(qs()),BE=require("worker_threads"),Vt=L(j()),JY=L(dt());ji();Ll();fw="data",HT=Symbol("defined-tables"),XY=((0,er.get)(yr.CONFIG_PARAMS.STORAGE_PAGESIZE)||4096)-60;(0,er.initSync)();jn=Object.create(null),We=Object.create(null);(0,_w._assignPackageExport)("databases",We);(0,_w._assignPackageExport)("tables",jn);Ad=Symbol.for("next-table-id"),ME=[],UE=[],Ha=new Map;a(Fme,"getTables");a(ut,"getDatabases");a(Uu,"resetDatabases");a(LE,"readMetaDb");a(ZY,"ensureDB");a(eW,"setTable");a(zl,"database");a(BR,"dropDatabase");a(Et,"table");Gme=1e3,qme=10;a($me,"runIndexing");a(Vme,"dropTableMeta");a(Nc,"onUpdatedTable");a(z_,"onRemovedDB");a(Tm,"getDefaultCompression")});var re=N((DMe,EW)=>{"use strict";var xa=require("path"),iW=require("fs-extra"),In=j(),tW=require("fs-extra"),xT=require("os"),Kme=require("net"),Yme=require("recursive-iterator"),Kt=M(),Wme=Eg(),rW=require("papaparse"),kT=require("moment"),{inspect:jme}=require("util"),nW=require("is-number"),CMe=require("lodash"),zme=require("minimist"),Qme=require("https"),Jme=require("http"),{hdb_errors:FT}=_e(),Xme=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,oW=require("util").promisify(setTimeout),Zme=100,eSe=5,tSe="",rSe=4,sW={true:!0,TRUE:!0,FALSE:!1,false:!1,undefined:null,null:null,NULL:null,NaN:NaN};EW.exports={isEmpty:ns,isEmptyOrZeroLength:Vi,arrayHasEmptyValues:iSe,arrayHasEmptyOrZeroLengthValues:oSe,buildFolderPath:aSe,isBoolean:aW,errorizeMessage:nSe,stripFileExtension:lSe,autoCast:uSe,autoCastJSON:cW,autoCastJSONDeep:hw,removeDir:dSe,compareVersions:_Se,isCompatibleDataVersion:fSe,escapeRawValue:ESe,unescapeValue:hSe,stringifyProps:pSe,timeoutPromise:SSe,isClusterOperation:gSe,getClusterUser:RSe,checkGlobalSchemaTable:ASe,getHomeDir:uW,getPropsFilePath:mSe,promisifyPapaParse:ySe,removeBOM:dW,createEventPromise:bSe,checkProcessRunning:OSe,checkSchemaTableExist:NSe,checkSchemaExists:_W,checkTableExists:fW,getStartOfTomorrowInSeconds:ISe,getLimitKey:wSe,isObject:cSe,isNotEmptyAndHasValue:sSe,autoCasterIsNumberCheck:lW,backtickASTSchemaItems:CSe,isPortTaken:TSe,createForkArgs:DSe,autoCastBoolean:PSe,async_set_timeout:oW,getTableHashAttribute:LSe,doesSchemaExist:MSe,doesTableExist:USe,stringifyObj:vSe,ms_to_time:BSe,changeExtension:HSe,getEnvCliRootPath:pw,noBootFile:xSe,httpRequest:kSe,transformReq:FSe,convertToMS:GSe,PACKAGE_ROOT:Kt.PACKAGE_ROOT};function nSe(e){return e instanceof Error?e:new Error(e)}a(nSe,"errorizeMessage");function ns(e){return e==null}a(ns,"isEmpty");function sSe(e){return!ns(e)&&(e||e===0||e===""||aW(e))}a(sSe,"isNotEmptyAndHasValue");function Vi(e){return ns(e)||e.length===0||e.size===0}a(Vi,"isEmptyOrZeroLength");function iSe(e){if(ns(e))return!0;for(let t=0;t<e.length;t++)if(ns(e[t]))return!0;return!1}a(iSe,"arrayHasEmptyValues");function oSe(e){if(Vi(e))return!0;for(let t=0;t<e.length;t++)if(Vi(e[t]))return!0;return!1}a(oSe,"arrayHasEmptyOrZeroLengthValues");function aSe(...e){try{return e.join(xa.sep)}catch{console.error(e)}}a(aSe,"buildFolderPath");function aW(e){return ns(e)?!1:e===!0||e===!1}a(aW,"isBoolean");function cSe(e){return ns(e)?!1:typeof e=="object"}a(cSe,"isObject");function lSe(e){return Vi(e)?tSe:e.slice(0,-rSe)}a(lSe,"stripFileExtension");function uSe(e){return ns(e)||e===""||typeof e!="string"?e:sW[e]!==void 0?sW[e]:lW(e)===!0?Number(e):Xme.test(e)?new Date(e):e}a(uSe,"autoCast");function cW(e){if(typeof e=="string"&&(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]")))try{return JSON.parse(e)}catch{}return e}a(cW,"autoCastJSON");function hw(e){if(e&&typeof e=="object"){if(Array.isArray(e))for(let t=0,r=e.length;t<r;t++){let n=e[t],s=hw(n);s!==n&&(e[t]=s)}else for(let t in e){let r=e[t],n=hw(r);n!==r&&(e[t]=n)}return e}else return cW(e)}a(hw,"autoCastJSONDeep");function lW(e){if(e.startsWith("0.")&&nW(e))return!0;let t=e.toUpperCase().includes("E");return!!((e!=="0"&&e.startsWith("0"))===!1&&t===!1&&nW(e))}a(lW,"autoCasterIsNumberCheck");async function dSe(e){if(Vi(e))throw new Error(`Directory path: ${e} does not exist`);try{await tW.emptyDir(e),await tW.remove(e)}catch(t){throw In.error(`Error removing files in ${e} -- ${t}`),t}}a(dSe,"removeDir");function _Se(e,t){if(Vi(e)){In.info("Invalid current version sent as parameter.");return}if(Vi(t)){In.info("Invalid upgrade version sent as parameter.");return}let r,n=/(\.0+)+$/,s=e.version?e.version:e,i=t.version?t.version:t,o=s.replace(n,"").split("."),c=i.replace(n,"").split("."),l=Math.min(o.length,c.length);for(let u=0;u<l;u++)if(r=parseInt(o[u],10)-parseInt(c[u],10),r)return r;return o.length-c.length}a(_Se,"compareVersions");function fSe(e,t,r=!1){let n=e.toString().split("."),s=t.toString().split(".");return n[0]===s[0]&&(!r||n[1]===s[1])}a(fSe,"isCompatibleDataVersion");function ESe(e){if(ns(e))return e;let t=String(e);return t==="."?Kt.UNICODE_PERIOD:t===".."?Kt.UNICODE_PERIOD+Kt.UNICODE_PERIOD:t.replace(Kt.FORWARD_SLASH_REGEX,Kt.UNICODE_FORWARD_SLASH)}a(ESe,"escapeRawValue");function hSe(e){if(ns(e))return e;let t=String(e);return t===Kt.UNICODE_PERIOD?".":t===Kt.UNICODE_PERIOD+Kt.UNICODE_PERIOD?"..":String(e).replace(Kt.ESCAPED_FORWARD_SLASH_REGEX,"/")}a(hSe,"unescapeValue");function pSe(e,t){if(ns(e))return In.info("Properties object is null"),"";let r="";return e.each(function(n,s){try{if(t&&t[n]){let i=t[n];for(let o of i)r+=";"+o+xT.EOL}!Vi(n)&&n[0]===";"?r+=" "+n+s+xT.EOL:Vi(n)||(r+=n+"="+s+xT.EOL)}catch{In.error(`Found bad property during upgrade with key ${n} and value: ${s}`)}}),r}a(pSe,"stringifyProps");function uW(){let e;try{e=xT.homedir()}catch{e=process.env.HOME}return e}a(uW,"getHomeDir");function mSe(){let e=xa.join(uW(),Kt.HDB_HOME_DIR_NAME,Kt.BOOT_PROPS_FILE_NAME);return iW.existsSync(e)||(e=xa.join(__dirname,"../","hdb_boot_properties.file")),e}a(mSe,"getPropsFilePath");function SSe(e,t){let r,n;return n=new Promise(function(s){r=setTimeout(function(){s(t)},e)}),{promise:n,cancel:a(function(){clearTimeout(r)},"cancel")}}a(SSe,"timeoutPromise");async function TSe(e){if(!e)throw new Error("Invalid port passed as parameter");return new Promise((t,r)=>{let n=Kme.createServer().once("error",s=>{s.code==="EADDRINUSE"?t(!0):r(s)}).once("listening",()=>n.once("close",()=>t(!1)).close()).listen(e)})}a(TSe,"isPortTaken");function gSe(e){try{return Kt.CLUSTER_OPERATIONS[e.toLowerCase()]!==void 0}catch(t){In.error(`Error checking operation against cluster ops ${t}`)}return!1}a(gSe,"isClusterOperation");function ASe(e,t){let r=(De(),oe(lt)).getDatabases();if(!r[e])return FT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e);if(!r[e][t])return FT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(ASe,"checkGlobalSchemaTable");function RSe(e,t){if(ns(t)){In.warn("No CLUSTERING_USER defined, clustering disabled");return}if(ns(e)||Vi(e)){In.warn("No users to search.");return}let r;try{let n=e.get(t);n&&n.role.permission.cluster_user===!0&&n.active===!0&&(r=n)}catch(n){In.error(`unable to find cluster_user due to: ${n.message}`);return}if(r===void 0){In.warn(`CLUSTERING_USER: ${t} not found or is not active.`);return}return r}a(RSe,"getClusterUser");function ySe(){rW.parsePromise=function(e,t,r){return new Promise(function(n,s){rW.parse(e,{header:!0,transformHeader:dW,chunk:t.bind(null,s),skipEmptyLines:!0,transform:r,dynamicTyping:!1,error:s,complete:n})})}}a(ySe,"promisifyPapaParse");function dW(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return e.charCodeAt(0)===65279?e.slice(1):e}a(dW,"removeBOM");function bSe(e,t,r){return new Promise(n=>{t.once(e,s=>{let i=r;In.info(`Got cluster status event response: ${jme(s)}`);try{i.cancel()}catch{In.error("Error trying to cancel timeout.")}n(s)})})}a(bSe,"createEventPromise");async function OSe(e){let t=!0,r=0;do await oW(Zme*r++),(await Wme.findPs(e)).length>0&&(t=!1);while(t&&r<eSe);if(t)throw new Error(`process ${e} was not started`)}a(OSe,"checkProcessRunning");function NSe(e,t){let r=_W(e);if(r)return r;let n=fW(e,t);if(n)return n}a(NSe,"checkSchemaTableExist");function _W(e){let{getDatabases:t}=(De(),oe(lt));if(!t()[e])return FT.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(_W,"checkSchemaExists");function fW(e,t){let{getDatabases:r}=(De(),oe(lt));if(!r()[e][t])return FT.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(fW,"checkTableExists");function ISe(){let e=kT().utc().add(1,Kt.MOMENT_DAYS_TAG).startOf(Kt.MOMENT_DAYS_TAG).unix(),t=kT().utc().unix();return e-t}a(ISe,"getStartOfTomorrowInSeconds");function wSe(){return kT().utc().format("DD-MM-YYYY")}a(wSe,"getLimitKey");function CSe(e){try{let t=new Yme(e);for(let{node:r}of t)r&&(r.columnid&&typeof r.columnid!="string"&&(r.columnid=r.columnid.toString()),r.columnid&&!r.columnid.startsWith("`")&&(r.columnid_orig=r.columnid,r.columnid=`\`${r.columnid}\``),r.tableid&&!r.tableid.startsWith("`")&&(r.tableid_orig=r.tableid,r.tableid=`\`${r.tableid}\``),r.databaseid&&!r.databaseid.startsWith("`")&&(r.databaseid_orig=r.databaseid,r.databaseid=`\`${r.databaseid}\``),r.as&&typeof r.as=="string"&&!r.as.startsWith("[")&&(r.as_orig=r.as,r.as=`\`${r.as}\``))}catch(t){In.error("Got an error back ticking items."),In.error(t)}}a(CSe,"backtickASTSchemaItems");function DSe(e){return[e]}a(DSe,"createForkArgs");function PSe(e){return e===!0||typeof e=="string"&&e.toLowerCase()==="true"}a(PSe,"autoCastBoolean");function LSe(e,t){let{getDatabases:r}=(De(),oe(lt)),n=r()[e]?.[t];return n?.primaryKey||n?.hash_attribute}a(LSe,"getTableHashAttribute");function MSe(e){let{getDatabases:t}=(De(),oe(lt));return t()[e]!==void 0}a(MSe,"doesSchemaExist");function USe(e,t){let{getDatabases:r}=(De(),oe(lt));return r()[e]?.[t]!==void 0}a(USe,"doesTableExist");function vSe(e){try{return JSON.stringify(e)}catch{return e}}a(vSe,"stringifyObj");function BSe(e){let t=kT.duration(e),r=t.seconds()>0?t.seconds()+"s":"",n=t.minutes()>0?t.minutes()+"m ":"",s=t.hours()>0?t.hours()+"h ":"",i=t.days()>0?t.days()+"d ":"";return(t.years()>0?t.years()+"y ":"")+i+s+n+r}a(BSe,"ms_to_time");function HSe(e,t){let r=xa.basename(e,xa.extname(e));return xa.join(xa.dirname(e),r+t)}a(HSe,"changeExtension");function pw(){if(process.env[Kt.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return process.env[Kt.CONFIG_PARAMS.ROOTPATH.toUpperCase()];let e=zme(process.argv);if(e[Kt.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return e[Kt.CONFIG_PARAMS.ROOTPATH.toUpperCase()]}a(pw,"getEnvCliRootPath");var Ew;function xSe(){if(Ew)return Ew;let e=pw();if(pw()&&iW.pathExistsSync(xa.join(e,Kt.HDB_CONFIG_FILE)))return Ew=!0,!0}a(xSe,"noBootFile");function kSe(e,t){let r;return e.protocol==="http:"?r=Jme:r=Qme,new Promise((n,s)=>{let i=r.request(e,o=>{o.setEncoding("utf8"),o.body="",o.on("data",c=>{o.body+=c}),o.on("end",()=>{n(o)})});i.on("error",o=>{s(o)}),i.write(t instanceof Buffer?t:JSON.stringify(t)),i.end()})}a(kSe,"httpRequest");function FSe(e){if(!e.schema&&!e.database){e.schema=Kt.DEFAULT_DATABASE_NAME;return}e.database&&(e.schema=e.database)}a(FSe,"transformReq");function GSe(e){let t=0;if(typeof e=="number"&&(t=e),typeof e=="string")switch(t=parseFloat(e),e.slice(-1)){case"M":t*=86400*30;break;case"D":case"d":t*=86400;break;case"H":case"h":t*=3600;break;case"m":t*=60;break}return t*1e3}a(GSe,"convertToMS")});var se=N((TW,gW)=>{"use strict";var mw=require("fs-extra"),gl=require("path"),hW=require("os"),qSe=require("properties-reader"),xE=j(),HE=re(),Le=M(),GT=Ct(),$Se="Error initializing environment manager",qT="BOOT_PROPS_FILE_PATH",pW=!1,VSe={[Le.HDB_SETTINGS_NAMES.INSTALL_USER]:!0,[Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY]:!0,[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]:!0,BOOT_PROPS_FILE_PATH:!0},Bo={};Object.assign(TW,gW.exports={BOOT_PROPS_FILE_PATH:qT,getHdbBasePath:KSe,setHdbBasePath:YSe,get:mW,initSync:jSe,setProperty:Je,initTestEnvironment:QSe,setCloneVar:zSe});function KSe(){return Bo[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]}a(KSe,"getHdbBasePath");function YSe(e){Bo[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]=e}a(YSe,"setHdbBasePath");function mW(e){let t=GT.getConfigValue(e);return t===void 0?Bo[e]:t}a(mW,"get");function Je(e,t){VSe[e]&&(Bo[e]=t),GT.updateConfigObject(e,t)}a(Je,"setProperty");function WSe(){let e;try{e=HE.getPropsFilePath(),mw.accessSync(e,mw.constants.F_OK|mw.constants.R_OK),pW=!0;let t=qSe(e);return Bo[Le.HDB_SETTINGS_NAMES.INSTALL_USER]=t.get(Le.HDB_SETTINGS_NAMES.INSTALL_USER),Bo[Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY]=t.get(Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY),Bo[qT]=e,!0}catch{return xE.trace(`Environment manager found no properties file at ${e}`),!1}}a(WSe,"doesPropFileExist");function jSe(e=!1){try{((pW||WSe()||HE.noBootFile())&&!SW||e)&&(GT.initConfig(e),Bo[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]=GT.getConfigValue(Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY))}catch(t){xE.error($Se),xE.error(t),console.error(t),process.exit(1)}}a(jSe,"initSync");var SW=!1;function zSe(e){SW=e}a(zSe,"setCloneVar");function QSe(e={}){try{let{keep_alive_timeout:t,headers_timeout:r,server_timeout:n,https_enabled:s,cors_enabled:i,cors_accesslist:o,local_studio_on:c}=e,l=gl.join(__dirname,"../../","unitTests");Bo[qT]=gl.join(l,"hdb_boot_properties.file"),Je(Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY,gl.join(l,"settings.test")),Je(Le.HDB_SETTINGS_NAMES.INSTALL_USER,hW.userInfo()?hW.userInfo().username:void 0),Je(Le.HDB_SETTINGS_NAMES.LOG_LEVEL_KEY,"debug"),Je(Le.HDB_SETTINGS_NAMES.LOG_PATH_KEY,gl.join(l,"envDir","log")),Je(Le.HDB_SETTINGS_NAMES.LOG_DAILY_ROTATE_KEY,!1),Je(Le.HDB_SETTINGS_NAMES.CLUSTERING_ENABLED_KEY,!0),Je(Le.HDB_SETTINGS_NAMES.CLUSTERING_NODE_NAME_KEY,"1231412de213"),Je(Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY,gl.join(l,"envDir")),Je(Le.CONFIG_PARAMS.STORAGE_PATH,gl.join(l,"envDir")),s&&(Je(Le.CONFIG_PARAMS.HTTP_SECUREPORT,mW(Le.CONFIG_PARAMS.HTTP_PORT)),Je(Le.CONFIG_PARAMS.HTTP_PORT,null)),Je(Le.CONFIG_PARAMS.CUSTOMFUNCTIONS_NETWORK_HTTPS,!!s),Je(Le.CONFIG_PARAMS.HTTP_PORT,9926),Je(Le.HDB_SETTINGS_NAMES.SERVER_PORT_KEY,9925),Je(Le.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT,9925),Je(Le.HDB_SETTINGS_NAMES.CORS_ENABLED_KEY,HE.isEmpty(i)?!1:i),Je(Le.CONFIG_PARAMS.HTTP_CORS,HE.isEmpty(i)?!1:i),Je(Le.HDB_SETTINGS_NAMES.MAX_CUSTOM_FUNCTION_PROCESSES,2),Je(Le.HDB_SETTINGS_NAMES.MAX_HDB_PROCESSES,4),Je(Le.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_PORT_KEY,9926),Je(Le.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_ENABLED_KEY,!0),Je(Le.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_DIRECTORY_KEY,gl.resolve(__dirname,"../../unitTests/server/fastifyRoutes/custom_functions")),Je(Le.HDB_SETTINGS_NAMES.LOCAL_STUDIO_ON,HE.isEmpty(c)?!1:c),o&&(Je("CORS_ACCESSLIST",o),Je(Le.CONFIG_PARAMS.HTTP_CORSACCESSLIST,o)),n&&(Je(Le.HDB_SETTINGS_NAMES.SERVER_TIMEOUT_KEY,n),Je(Le.CONFIG_PARAMS.HTTP_TIMEOUT,n)),t&&(Je(Le.HDB_SETTINGS_NAMES.SERVER_KEEP_ALIVE_TIMEOUT_KEY,t),Je(Le.CONFIG_PARAMS.HTTP_KEEPALIVETIMEOUT,t)),r&&(Je(Le.HDB_SETTINGS_NAMES.SERVER_HEADERS_TIMEOUT_KEY,r),Je(Le.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT,r))}catch(t){let r=`Error reading in HDB environment variables from path ${qT}. Please check your boot props and settings files`;xE.fatal(r),xE.error(t)}}a(QSe,"initTestEnvironment")});var Tr=N((xMe,HW)=>{"use strict";var Nr=se();Nr.initSync();var JSe=require("fs-extra"),XSe=require("semver"),GE=require("path"),{monotonicFactory:ZSe}=require("ulidx"),RW=ZSe(),eTe=require("util"),yW=require("child_process"),tTe=eTe.promisify(yW.exec),rTe=yW.spawn,Fr=It(),Xe=M(),$T=re(),li=j(),VT=Xi(),nTe=dp(),kE=Ct(),{broadcast:sTe,onMessageByType:iTe,getWorkerIndex:oTe}=dt(),{isMainThread:bW}=require("worker_threads"),{Encoder:aTe,decode:Aw}=require("msgpackr"),OW=new aTe,{isEmpty:bl}=$T,NW=xn(),MMe=48*36e11;bW&&iTe(Xe.ITC_EVENT_TYPES.RESTART,()=>{tn=void 0,yl=void 0});var{connect:cTe,StorageType:lTe,RetentionPolicy:uTe,AckPolicy:Rw,DeliverPolicy:yw,DiscardPolicy:dTe,NatsConnection:UMe,JetStreamManager:vMe,JetStreamClient:BMe,StringCodec:HMe,JSONCodec:_Te,createInbox:bw,headers:fTe,ErrorCode:AW}=require("nats"),{PACKAGE_ROOT:ETe}=M(),hTe=Ou(),{recordAction:pTe}=(Ii(),oe(W_)),IW=_Te(),mTe="clustering",STe=hTe.engines[Fr.NATS_SERVER_NAME],TTe=GE.join(ETe,"dependencies"),gw=GE.join(TTe,`${process.platform}-${process.arch}`,Fr.NATS_BINARY_NAME),Sw,Tw,FE,Al,Rl;HW.exports={runCommand:wW,checkNATSServerInstalled:gTe,createConnection:Ow,getConnection:qE,getJetStreamManager:$E,getJetStream:DW,getNATSReferences:Ki,getServerList:RTe,createLocalStream:Nw,listStreams:PW,deleteLocalStream:yTe,getServerConfig:Od,listRemoteStreams:bTe,viewStream:OTe,viewStreamIterator:NTe,publishToStream:ITe,request:DTe,reloadNATS:Iw,reloadNATSHub:PTe,reloadNATSLeaf:LTe,extractServerName:CTe,requestErrorHandler:MTe,createLocalTableStream:vW,createTableStreams:BTe,purgeTableStream:BW,purgeSchemaTableStreams:HTe,getStreamInfo:xTe,updateLocalStreams:FTe,closeConnection:ATe,getJsmServerName:KT,addNatsMsgHeader:LW,clearClientCache:CW,updateRemoteConsumer:UTe,createConsumer:MW,updateConsumerIterator:vTe};async function wW(e,t=void 0){let{stdout:r,stderr:n}=await tTe(e,{cwd:t});if(n)throw new Error(n.replace(`
|
|
132
132
|
`,""));return r.replace(`
|
|
133
133
|
`,"")}a(wW,"runCommand");async function gTe(){try{await JSe.access(gw)}catch{return!1}let e=await wW(`${gw} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return XSe.eq(t,STe)}a(gTe,"checkNATSServerInstalled");async function Ow(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await NW.getClusterUser();if(bl(o))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=o.username,r=o.decrypt_hash}li.trace("create nats connection called");let i=await cTe({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),li.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(o=>{o&&li.error("Error with Nats client connection, connection closed",o),i===tn&&CW()}),i}a(Ow,"createConnection");function CW(){tn=void 0,Al=void 0,Rl=void 0,yl=void 0}a(CW,"clearClientCache");async function ATe(){tn&&(await tn.drain(),tn=void 0,Al=void 0,Rl=void 0,yl=void 0)}a(ATe,"closeConnection");var tn,yl;async function qE(){return yl||(yl=Ow(Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),tn=await yl),tn||yl}a(qE,"getConnection");async function $E(){if(Al)return Al;bl(tn)&&await qE();let{domain:e}=Od(Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(bl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Al=await tn.jetstreamManager({domain:e,timeout:6e4}),Al}a($E,"getJetStreamManager");async function DW(){if(Rl)return Rl;bl(tn)&&await qE();let{domain:e}=Od(Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(bl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Rl=tn.jetstream({domain:e,timeout:6e4}),Rl}a(DW,"getJetStream");async function Ki(){let e=tn||await qE(),t=Al||await $E(),r=Rl||await DW();return{connection:e,jsm:t,js:r}}a(Ki,"getNATSReferences");async function RTe(e){let t=Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await NW.getClusterUser(),s=await Ow(t,r,n),i=bw(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let d of o){let _=IW.decode(d.data);_.response_time=Date.now()-l,c.push(_)}})();return l=Date.now(),await s.publish("$SYS.REQ.SERVER.PING.VARZ",void 0,{reply:i}),await s.publish("$SYS.REQ.SERVER.PING",void 0,{reply:i}),await s.flush(),await $T.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(RTe,"getServerList");async function Nw(e,t){let{jsm:r}=await Ki(),n=Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:lTe.File,retention:uTe.Limits,subjects:t,discard:dTe.Old,max_msgs:s,max_bytes:i,max_age:n})}a(Nw,"createLocalStream");async function PW(){let{jsm:e}=await Ki(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(PW,"listStreams");async function yTe(e){let{jsm:t}=await Ki();await t.streams.delete(e)}a(yTe,"deleteLocalStream");async function bTe(e){let{connection:t}=await Ki(),r=[],n=bw(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(IW.decode(o.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}a(bTe,"listRemoteStreams");async function OTe(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Ki(),i=RW(),o={durable_name:i,ack_policy:Rw.Explicit};t&&(o.deliver_policy=yw.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];let u=[];for await(let d of l){let _=Aw(d.data),E={nats_timestamp:d.info.timestampNanos,nats_sequence:d.info.streamSequence,entry:_};if(d.headers&&(E.origin=d.headers.get(Fr.MSG_HEADERS.ORIGIN)),u.push(E),d.ack(),d.info.pending===0)break}return await c.delete(),u}a(OTe,"viewStream");async function*NTe(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Ki(),i=RW(),o={durable_name:i,ack_policy:Rw.Explicit};t&&(o.deliver_policy=yw.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];for await(let u of l){let d=Aw(u.data);d[0]||(d=[d]);for(let _ of d){let E={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:_};u.headers&&(E.origin=u.headers.get(Fr.MSG_HEADERS.ORIGIN)),yield E}if(u.ack(),u.info.pending===0)break}await c.delete()}a(NTe,"viewStreamIterator");async function ITe(e,t,r,n){li.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=LW(n,r);let{js:s}=await Ki(),i=await KT(),o=`${e}.${i}`,c=n instanceof Uint8Array?n:OW.encode(n);try{li.trace(`publishToStream publishing to subject: ${o}`),pTe(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(o,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return UW(async()=>{try{await s.publish(o,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){li.trace(`publishToStream creating stream: ${t}`);let d=o.split(".");d[2]="*",await Nw(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(ITe,"publishToStream");function LW(e,t){t===void 0&&(t=fTe());let r=Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(Fr.MSG_HEADERS.ORIGIN)&&r&&t.append(Fr.MSG_HEADERS.ORIGIN,r),t}a(LW,"addNatsMsgHeader");function Od(e){e=e.toLowerCase();let t=GE.join(Nr.get(Xe.CONFIG_PARAMS.ROOTPATH),mTe);if(e===Xe.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return bl(Tw)&&(Tw={port:kE.getConfigFromFile(Xe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:kE.getConfigFromFile(Xe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Fr.SERVER_SUFFIX.HUB,config_file:Fr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:GE.join(t,Fr.PID_FILES.HUB),hdb_nats_path:t}),Tw;if(e===Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return bl(Sw)&&(Sw={port:kE.getConfigFromFile(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:kE.getConfigFromFile(Xe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Fr.SERVER_SUFFIX.LEAF,config_file:Fr.NATS_CONFIG_FILES.LEAF_SERVER,domain:kE.getConfigFromFile(Xe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Fr.SERVER_SUFFIX.LEAF,pid_file_path:GE.join(t,Fr.PID_FILES.LEAF),hdb_nats_path:t}),Sw;li.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a(Od,"getServerConfig");async function MW(e,t,r,n){try{await e.consumers.add(t,{ack_policy:Rw.Explicit,durable_name:r,deliver_policy:yw.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a(MW,"createConsumer");async function wTe(e,t,r){await e.consumers.delete(t,r)}a(wTe,"removeConsumer");function CTe(e){return e.split(".")[1]}a(CTe,"extractServerName");async function DTe(e,t,r=6e4,n=bw()){if(!$T.isObject(t))throw new Error("data param must be an object");let s=OW.encode(t),{connection:i}=await Ki(),o={timeout:r};n&&(o.reply=n,o.noMux=!0);let c=await i.request(e,s,o);return Aw(c.data)}a(DTe,"request");function Iw(e){return new Promise(async(t,r)=>{let n=rTe(gw,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",o=>{r(o)}),n.stdout.on("data",o=>{i+=o.toString()}),n.stderr.on("data",o=>{s+=o.toString()}),n.stderr.on("close",o=>{s&&r(s),t(i)})})}a(Iw,"reloadNATS");async function PTe(){let{pid_file_path:e}=Od(Xe.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await Iw(e)}a(PTe,"reloadNATSHub");async function LTe(){let{pid_file_path:e}=Od(Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await Iw(e)}a(LTe,"reloadNATSLeaf");function MTe(e,t,r){let n;switch(e.code){case AW.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case AW.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(MTe,"requestErrorHandler");async function UTe(e,t){let r=t+Fr.SERVER_SUFFIX.LEAF,{connection:n}=await Ki(),{jsm:s}=await qTe(r),{schema:i,table:o}=e,c=VT.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await UW(async()=>{if(e.subscribe===!0)await MW(s,c,n.info.server_name,l);else try{await wTe(s,c,n.info.server_name)}catch(u){li.trace(u)}})}a(UTe,"updateRemoteConsumer");async function vTe(e,t,r,n){let s=VT.createNatsTableStreamName(e,t),i=r+Fr.SERVER_SUFFIX.LEAF,o={type:Xe.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!bW&&oTe()<Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=XS();await c(o)}await sTe(o),n==="stop"&&await $T.async_set_timeout(1e3)}a(vTe,"updateConsumerIterator");function UW(e){return nTe.writeTransaction(Xe.SYSTEM_SCHEMA_NAME,Xe.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(UW,"exclusiveLock");async function vW(e,t){let r=VT.createNatsTableStreamName(e,t),n=await KT(),s=kTe(e,t,n);await Nw(r,[s])}a(vW,"createLocalTableStream");async function BTe(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await vW(n,s)}}a(BTe,"createTableStreams");async function BW(e,t,r=void 0){if(Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=VT.createNatsTableStreamName(e,t),{domain:s}=Od(Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await qE()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")li.warn(n);else throw n}}a(BW,"purgeTableStream");async function HTe(e,t){if(Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await BW(e,t[r])}a(HTe,"purgeSchemaTableStreams");async function xTe(e){return(await $E()).streams.info(e)}a(xTe,"getStreamInfo");function kTe(e,t,r){return`${Fr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(kTe,"createSubjectName");async function KT(){if(FE)return FE;if(FE=(await $E())?.nc?.info?.server_name,FE===void 0)throw new Error("Unable to get jetstream manager server name");return FE}a(KT,"getJsmServerName");async function FTe(){let e=await $E(),t=await KT(),r=await PW();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=GTe(n),c=i.split(".");if(c[c.length-1]===t&&!o||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let d=u.join(".");li.trace(`Updating stream subject name from: ${i} to: ${d}`),s.subjects[0]=d,await e.streams.update(s.name,s)}}a(FTe,"updateLocalStreams");function GTe(e){let{config:t}=e,r=!1,n=Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=Nr.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);return i=i===null?-1:i,n!==t.max_age&&(t.max_age=n,r=!0),s!==t.max_bytes&&(t.max_bytes=s,r=!0),i!==t.max_msgs&&(t.max_msgs=i,r=!0),r}a(GTe,"updateStreamLimits");async function qTe(e){let t,r;try{t=await tn.jetstream({domain:e}),r=await tn.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw li.error("Unable to connect to:",e),n}return{js:t,jsm:r}}a(qTe,"connectToRemoteJS")});var XS=N(($Me,zW)=>{"use strict";var{decode:$Te}=require("msgpackr"),{isMainThread:FMe,parentPort:GMe,threadId:qMe}=require("worker_threads"),jT=Tr(),Nd=It(),Dw=M(),rn=j(),Cw=se(),VTe=M(),{onMessageByType:KTe}=dt(),GW=Xi(),{recordAction:xW,recordActionBinary:YTe}=(Ii(),oe(W_)),{publishToStream:WTe}=jT,{ConsumerEvents:kW}=require("nats"),jTe=$r(),{promisify:zTe}=require("util"),qW=zTe(setTimeout),zT=1e4,QT,WT,QTe,JTe,$W,VE=new Map,Id=new Map;zW.exports={initialize:VW,ingestConsumer:Pw,setSubscription:XTe,setIgnoreOrigin:tge,getDatabaseSubscriptions:ege,updateConsumer:KW};async function VW(){KTe(Dw.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,async n=>{await KW(n)}),$W=!0,rn.notify("Initializing clustering ingest service.");let{connection:e,jsm:t,js:r}=await jT.getNATSReferences();QT=e,WT=e.info.server_name,QTe=t,JTe=r}a(VW,"initialize");async function KW(e){if(e.status==="start"){let{js:t,jsm:r}=await YW(e.node_domain_name);Pw(e.stream_name,t,r,e.node_domain_name)}else if(e.status==="stop"){let t=VE.get(e.stream_name+e.node_domain_name);t&&(rn.notify("Closing ingest consumer for node:",e.node_domain_name,"stream:",e.stream_name),await t.close?.(),VE.set(e.stream_name+e.node_domain_name,"close")),Id.get(e.node_domain_name)==="failed"&&Id.set(e.node_domain_name,"close")}}a(KW,"updateConsumer");var JT=new Map;function XTe(e,t,r){let n=JT.get(e);n||JT.set(e,n=new Map),n.set(t,r),$W||VW().then(ZTe)}a(XTe,"setSubscription");async function ZTe(){let e=await jTe.searchByValue({database:"system",table:"hdb_nodes",search_attribute:"name",search_value:"*"});for await(let t of e){let r=t.name+Nd.SERVER_SUFFIX.LEAF,n,s;for(let i of t.subscriptions||[])if(i.subscribe===!0){if(!n&&({js:n,jsm:s}=await YW(r),!n))break;let{schema:o,table:c}=i,l=GW.createNatsTableStreamName(o,c);Pw(l,n,s,r)}}}a(ZTe,"accessConsumers");async function YW(e){let t,r,n=1;for(;!r;)try{t=await QT.jetstream({domain:e}),r=await QT.jetstreamManager({domain:e,checkAPI:!1})}catch(s){if(Id.get(e)==="close")break;Id.set(e,"failed"),n%10===1&&rn.warn("Nats ingest attempting to connect to:",e,"Nats error:",s.message);let i=n++*100<zT?n++*100:zT;await qW(i)}return{js:t,jsm:r}}a(YW,"connectToRemoteJS");function ege(){return JT}a(ege,"getDatabaseSubscriptions");var WW;function tge(e){WW=e}a(tge,"setIgnoreOrigin");var jW=100,FW=new Array(jW),YT=0;async function Pw(e,t,r,n){let{connection:s}=await jT.getNATSReferences();QT=s,WT=s.info.server_name;let i,o=1;for(;!i;)try{i=await t.consumers.get(e,WT),rn.notify("Initializing ingest consumer for node:",n,"stream:",e)}catch(u){if(Id.get(n)==="close")break;o%10===1&&rn.warn("Nats ingest error getting consumer:",n,"stream:",e,"Nats error:",u.message),u.code==="404"&&(rn.notify("Nats ingest creating consumer for node:",n,"stream:",e),i=await jT.createConsumer(r,e,WT,new Date(Date.now()).toISOString()));let d=o++*100<zT?o++*100:zT;await qW(d)}let c=!1,l;for(;!c;){if(VE.get(e+n)==="close"||Id.get(n)==="close"){VE.delete(e+n),c=!0;continue}l=await i.consume({max_messages:Cw.get(Dw.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXCONSUMEMSGS)??100,bind:!0}),VE.set(e+n,l);let u=!1;(async()=>{for await(let d of await l.status())if(d.type===kW.ConsumerDeleted&&(await l.close(),c=!0),d.type===kW.HeartbeatsMissed){let _=d.data;rn.trace(`${_} clustering ingest consumer heartbeats missed, node: ${n} stream: ${l.consumer.stream}`),_===100&&(rn.warn(`Restarting clustering ingest consumer due to missed heartbeat threshold being met, node: ${n} stream: ${l.consumer.stream}`),l.stop(),u=!0)}})();try{for await(let d of l)await FW[YT],FW[YT]=rge(d).catch(_=>{rn.error(_)}),++YT>=jW&&(YT=0)}catch(d){d.message==="consumer deleted"?(rn.notify("Nats consumer deleted, closing messages for node:",n,"stream:",l.consumer.stream),await l.close(),c=!0):rn.error("Error consuming clustering ingest, restarting consumer",d)}}}a(Pw,"ingestConsumer");async function rge(e){let t=$Te(e.data);xW(e.data.length,"bytes-received",e.subject,t.operation,"ingest"),rn.trace("Nats message processor message size:",e?.msg?._msg?.size,"bytes");let r=e.headers,n=!1,s=Cw.get(Dw.CONFIG_PARAMS.CLUSTERING_NODENAME);r.has(Nd.MSG_HEADERS.TRANSACTED_NODES)&&r.values(Nd.MSG_HEADERS.TRANSACTED_NODES).indexOf(s)>-1&&(n=!0);let i=r.get(Nd.MSG_HEADERS.ORIGIN);if(n||(n=i===s&&!WW),YTe(n,"echo",e.subject,t.operation,"ingest"),n){e.ack();return}r.append(Nd.MSG_HEADERS.TRANSACTED_NODES,s);try{let{operation:o,schema:c,next:l,table:u,records:d,hash_values:_,__origin:E,expiresAt:f}=t;rn.trace("processing message:",o,c,u,(d?"records: "+d.map(U=>U?.id):"")+(_?"ids: "+_:""),"with sequence:",e.seq),rn.trace(`messageProcessor nats msg id: ${e.headers.get(Nd.MSG_HEADERS.NATS_MSG_ID)}`);let h;d||(d=_);let T=new Promise(U=>h=U),{timestamp:m,user:g,node_name:S}=E||{},y=JT.get(c)?.get(u);if(!y)throw new Error(`Missing table for replication message: ${u}`);if(o==="define_schema")t.type=o,t.onCommit=h,y.send(t);else if(d.length===1&&!l)y.send({type:ww(o),value:d[0],id:_?.[0],expiresAt:f,timestamp:m,table:u,onCommit:h,user:g,nodeName:S});else{let U=d.map((H,X)=>({type:ww(o),value:H,expiresAt:f,id:_?.[X],table:u}));for(;l;)U.push({type:ww(l.operation),value:l.record,expiresAt:l.expiresAt,id:l.id,table:l.table}),l=l.next;y.send({type:"transaction",writes:U,table:u,timestamp:m,onCommit:h,user:g,nodeName:S})}Cw.get(VTe.CONFIG_PARAMS.CLUSTERING_REPUBLISHMESSAGES)!==!1&&WTe(e.subject.split(".").slice(0,-1).join("."),GW.createNatsTableStreamName(c,u),e.headers,e.data),await T;let I=Date.now()-m;m&&xW(I,"replication-latency",e.subject,o,"ingest")}catch(o){rn.error(o)}e.ack()}a(rge,"messageProcessor");function ww(e){switch(e){case"insert":case"upsert":case"update":return"put"}return e}a(ww,"convertOperation")});var nge=XS();(async()=>{try{await nge.initialize()}catch(e){console.error("Error launching Nats ingest service."),console.error(e)}})();
|