harperdb 4.7.0-beta.2 → 4.7.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,11 +13,11 @@
13
13
  `),key:"-----BEGIN RSA PRIVATE KEY-----\rMIIEowIBAAKCAQEArBFJQRfFiJku/KwhV1Ssp7cX61vvuKmd4Rp6A9jB2QLgx8nj\r/+Xhp2hPRkISnOA8BuAxr4dMD9syGJwX4kNy9mbZ5Q0fWZCiEGBpVcU1J+k+N5K4\rSuZ2SqgxeN2IN2RLzt3GyQY4imcdHgNv7aHoXUrEwBx0MeYEw3IIDXtrYKCR2D8I\rvWBfwMUgWa24G8lpWILWA5hd9srRz9NxlAiHSjhbgT7B0xruEpHRCHSyKjvaIJVt\rWBR+amejYsAKVrD/hgrqjsA1123Y6++YqvU6vwg64xhS2kz5r3dkNKhvwbWgpZdI\rIaRvsiB77f4kLGo0vi8RFgJ1ZRjGg3RRK2w1LQIDAQABAoIBAQCEOmh78EOpnGZC\rYBjjHrvrysVD5gvLcfVUtl8Ls7gMB60re1eOIF+PoZZCHKZnDd6zPfiQtj1adg0C\rYnnsM/8VoaZS4gm0b3RLd3ubIQifWhuo40RissY2yxfxlPSH9LhZCY8ojnJG0cTL\resK579E8WCfopjUY33XLqEbN7Ylv39J+DSqInjqV3efJZUa+HqUJ98VxxzodcKMD\rP3bwUU4gHoSSp4pAsOFH5sQhaIWH1IcNjrAwpee2cJQuh4G157RRIuuUpagtaEG/\rXJIiAyBguJyu3JQFnIBQF01N5+omJgXYJ1L0m54543/iIRThmF3zDCDgCyUzmOk+\rH6As9fv1AoGBANOpOtOZLSAScjGsgJamT3ceJ2wCa86g2j8Oxu8lJUmUp5s3tA0v\rBFW5O3S4KR1EXwkLMBUMrfFM8YvzHWxsXBI6XV8azGLvyqPHxr65OhmpGYkGZMXu\rn9okgjkqlewnY2I073gvyK7ppX51UL5y9fF1vlsk+UlW+Rgx/vMHbdcjAoGBANAc\rxRUsxs4QJpbS4zD3JOkHjr24a97TrS3kCybAHUMpR2NrEHPZw9zex0/aphOJUHfL\rIMkOZdpfDqMfxWy4FAEmqBEMkO2SB+h0Wp4P+qp81ax4vGFiB0cD3wtixr11U1tt\rlZ/ZTdv4VDpDFNK1KaplhTDeyuCjeYfS3/GJia9vAoGAcOsAgjBevZR5rXx84WH6\rVO8WUu37u7FenXNxt9VWTinrPMh72uixZFY8nOk+rely1e1NCn3IMko9Ns9NbDFm\r8SaH95vhXArXTYbfxZIlp9jp0YtCqcHDL+p4Oq04bFMbFyJseu7rHj1x18QYfnHw\rOY/6LL/N6k1m+Hx7qgXVmIcCgYB/w0nTCBw84XlvWqSTqQaF8VfWbWP79mP5KmkW\rLxdH5g2noVEGbohqDnK6OXd/wusdwByukiJBf94Skyy25AOT+VFwthA7aU1ljhkb\rtJ+lDuJ28eBkwLPLCzthWBC+u0qjdJFJAzVjd/7tjcU43nNn4s90AzL12iaAFhvZ\rwyA+DQKBgGc/4cdyGJ3YkcA8150gQBawgJZ7q8V1JND87ggWA8wnK3cHn7rMZQl2\r3emDp9HEFXFex5dbGDDqZFAoesZCDxjknIn9oNfW4PvaWS8q7b6ZKLZG1p03Pu7/\rtYaD0kPbo0kysfFT/co+NgHbdykvIyboomfGdNLTUjYuy6lpwpvs\r-----END RSA PRIVATE KEY-----\r".replace(/\r/g,`\r
14
14
  `)},Gie="certificate.pem",$ie="privateKey.pem",Vie="caCertificate.pem",Kie="natsCertificate.pem",Yie="natsCaCertificate.pem",Pt={DEFAULT:"default","DEFAULT-CA":"default-ca",SERVER:"server",CA:"ca","OPERATIONS-API":"operations-api","OPERATIONS-CA":"operations-ca"},Wie={tls_certificate:Pt.SERVER,tlsCertificateAuthority:Pt.CA,customFunctions_tls_certificate:Pt.SERVER,customFunctionsTlsCertificateAuthority:Pt.CA,operationsApi_tls_certificate:Pt["OPERATIONS-API"],operationsApiTlsCertificateAuthority:Pt["OPERATIONS-CA"]},zie={[Pt.SERVER]:2,[Pt.DEFAULT]:1},jie={[Pt["OPERATIONS-API"]]:3,[Pt.SERVER]:2,[Pt.DEFAULT]:1},Qie={[Pt["OPERATIONS-API"]]:3,[Pt.SERVER]:2,[Pt.DEFAULT]:1},Jie={[Pt["OPERATIONS-CA"]]:3,[Pt.CA]:2,[Pt["DEFAULT-CA"]]:1},Xie={[Pt["OPERATIONS-CA"]]:3,[Pt.CA]:2,[Pt["DEFAULT-CA"]]:1},Zie={[Pt.CA]:2,[Pt["DEFAULT-CA"]]:1};_n.CERTIFICATE_PEM_NAME=Gie;_n.PRIVATEKEY_PEM_NAME=$ie;_n.CA_PEM_NAME=Vie;_n.CERT_NAME=Pt;_n.CERT_CONFIG_NAME_MAP=Wie;_n.CERT_PREFERENCE_APP=zie;_n.CERT_PREFERENCE_OPS=jie;_n.CERT_PREFERENCE_REP=Qie;_n.CA_CERT_PREFERENCE_REP=Jie;_n.CA_CERT_PREFERENCE_OPS=Xie;_n.CA_CERT_PREFERENCE_APP=Zie;_n.CERTIFICATE_VALUES=qie;_n.NATS_CERTIFICATE_PEM_NAME=Kie;_n.NATS_CA_PEM_NAME=Yie});var kw=v((JMe,VH)=>{"use strict";var GH=require("fs-extra"),ge=require("joi"),eoe=require("os"),{boolean:We,string:St,number:fr,array:Ja}=ge.types(),{totalmem:kH}=require("os"),Al=require("path"),toe=Q(),Fw=oe(),QMe=Bw(),HH=(q(),M(Y)),roe=at(),qH="log",noe="components",soe="Invalid logging.rotation.maxSize unit. Available units are G, M or K",ioe="Invalid logging.rotation.interval unit. Available units are D, H or M (minutes)",ooe="Invalid logging.rotation.maxSize value. Value should be a number followed by unit e.g. '10M'",aoe="Invalid logging.rotation.interval value. Value should be a number followed by unit e.g. '10D'",coe="rootPath config parameter is undefined",$n=ge.alternatives([fr.min(0),St]).optional().empty(null),Kg=ge.alternatives([Ja.items(St,{host:St.required(),port:$n},{hostname:St.required(),port:$n}).empty(null),Ja.items(St)]),eo,$H=!1;VH.exports={configValidator:loe,routesValidator:hoe,routeConstraints:Kg};function loe(e,t=!1){if($H=t,eo=e.rootPath,Fw.isEmpty(eo))throw coe;let r=We.optional(),n=fr.min(0).max(1e3).empty(null).default(poe),s=St.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").empty(null).default(Sp),i=St.optional().empty(null),a=St.pattern(/^[^\s.,*>]+$/).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >"}).empty(null).required(),c=ge.string().empty(null).default(Sp),l=ge.custom(doe).empty(null).default(Sp),u=e.clustering?.enabled,d=ge.object({certificate:i,certificateAuthority:i,privateKey:i}),f;return u===!0?f=ge.object({enabled:r,hubServer:ge.object({cluster:ge.object({name:ge.required().empty(null),network:ge.object({port:$n,routes:Kg}).required()}).required(),leafNodes:ge.object({network:ge.object({port:$n}).required()}).required(),network:ge.object({port:$n}).required()}).required(),leafServer:ge.object({network:ge.object({port:$n,routes:Kg}).required(),streams:ge.object({maxAge:fr.min(120).allow(null).optional(),maxBytes:fr.min(1).allow(null).optional(),maxMsgs:fr.min(1).allow(null).optional(),path:c}).required()}).required(),logLevel:ge.valid("error","warn","info","debug","trace"),nodeName:a,republishMessages:We.optional(),databaseLevel:We.optional(),tls:ge.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:We.required(),verify:We.optional()}),user:St.optional().empty(null)}).optional():f=ge.object({enabled:r,tls:ge.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:We.optional()})}).optional(),ge.object({authentication:ge.alternatives(ge.object({authorizeLocal:We,cacheTTL:fr.required(),cookie:ge.object({domains:Ja.items(St).optional(),expires:St.optional()}),enableSessions:We,hashFunction:St.valid("md5","sha256","argon2id").optional().empty(null)}),We).optional(),analytics:ge.object({aggregatePeriod:fr,replicate:We.optional()}),replication:ge.object({hostname:ge.alternatives(St,fr).optional().empty(null),url:St.optional().empty(null),port:$n,securePort:$n,routes:Ja.optional().empty(null),databases:ge.alternatives(St,Ja),enableRootCAs:We.optional(),copyTablesToCatchUp:We.optional()}).optional(),componentsRoot:s.optional(),clustering:f,localStudio:ge.object({enabled:r}).required(),logging:ge.object({auditAuthEvents:ge.object({logFailed:We,logSuccessful:We}),file:We.required(),level:ge.valid("notify","fatal","error","warn","info","debug","trace"),rotation:ge.object({enabled:We.optional(),compress:We.optional(),interval:St.custom(moe).optional().empty(null),maxSize:St.custom(foe).optional().empty(null),path:St.optional().empty(null).default(Sp)}).required(),root:s,stdStreams:We.required(),auditLog:We.required()}).required(),operationsApi:ge.object({network:ge.object({cors:We.optional(),corsAccessList:Ja.optional(),headersTimeout:fr.min(1).optional(),keepAliveTimeout:fr.min(1).optional(),port:$n,domainSocket:ge.optional().empty("hdb/operations-server").default(Sp),securePort:$n,timeout:fr.min(1).optional()}).optional(),tls:ge.alternatives([ge.array().items(d),d])}).required(),rootPath:St.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").required(),mqtt:ge.object({network:ge.object({port:$n,securePort:$n,mtls:ge.alternatives([We.optional(),ge.object({user:St.optional(),certificateAuthority:i,required:We.optional()})])}).required(),webSocket:We.optional(),requireAuthentication:We.optional()}),http:ge.object({compressionThreshold:fr.optional(),cors:We.optional(),corsAccessList:Ja.optional(),headersTimeout:fr.min(1).optional(),port:$n,securePort:$n,maxHeaderSize:fr.optional(),mtls:ge.alternatives([We.optional(),ge.object({user:St.optional(),certificateAuthority:i,required:We.optional()})]),threadRange:ge.alternatives([Ja.optional(),St.optional()])}).required(),threads:ge.alternatives(n.optional(),ge.object({count:n.optional(),debug:ge.alternatives(We.optional(),ge.object({startingPort:fr.min(1).optional(),host:St.optional(),waitForDebugger:We.optional()})),maxHeapMemory:fr.min(0).optional()})),storage:ge.object({writeAsync:We.required(),overlappingSync:We.optional(),caching:We.optional(),compression:ge.alternatives([We.optional(),ge.object({dictionary:St.optional(),threshold:fr.optional()})]),compactOnStart:We.optional(),compactOnStartKeepBackup:We.optional(),noReadAhead:We.optional(),path:l,prefetchWrites:We.optional(),maxFreeSpaceToLoad:fr.optional(),maxFreeSpaceToRetain:fr.optional()}).required(),ignoreScripts:We.optional(),tls:ge.alternatives([ge.array().items(d),d])}).validate(e,{allowUnknown:!0,abortEarly:!1,errors:{wrap:{label:"'"}}})}o(loe,"configValidator");function uoe(e){return $H||GH.existsSync(e)?null:`Specified path ${e} does not exist.`}o(uoe,"doesPathExist");function doe(e,t){ge.assert(e,St.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path"));let r=uoe(e);if(r)return t.message(r)}o(doe,"validatePath");function foe(e,t){let r=e.slice(-1);if(r!=="G"&&r!=="M"&&r!=="K")return t.message(soe);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(ooe):e}o(foe,"validateRotationMaxSize");function moe(e,t){let r=e.slice(-1);if(r!=="D"&&r!=="H"&&r!=="M")return t.message(ioe);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(aoe):e}o(moe,"validateRotationInterval");function poe(e,t){let r=t.state.path.join("."),n=eoe.cpus().length,s=n-1;s<=2&&(s=2);let i=process.constrainedMemory?.()||kH();return i=Math.round(Math.min(i,kH())/1e6),s=Math.max(Math.min(s,Math.round((i-750)/300)),1),toe.info(`Detected ${n} cores and ${i}MB on this machine, defaulting ${r} to ${s}`),s}o(poe,"setDefaultThreads");function Sp(e,t){let r=t.state.path.join(".");if(!Fw.isEmpty(t.original)&&r!=="operationsApi.network.domainSocket")return t.original;if(Fw.isEmpty(eo))throw new Error(`Error setting default root for: ${r}. HDB root is not defined`);switch(r){case"componentsRoot":return Al.join(eo,noe);case"logging.root":return Al.join(eo,qH);case"clustering.leafServer.streams.path":return Al.join(eo,"clustering","leaf");case"storage.path":let n=Al.join(eo,HH.LEGACY_DATABASES_DIR_NAME);return GH.existsSync(n)?n:Al.join(eo,HH.DATABASES_DIR_NAME);case"logging.rotation.path":return Al.join(eo,qH);case"operationsApi.network.domainSocket":return r==null?null:Al.join(eo,"operations-server");default:throw new Error(`Error setting default root for config parameter: ${r}. Unrecognized config parameter`)}}o(Sp,"setDefaultRoot");function hoe(e){let t=ge.object({routes:Kg});return roe.validateBySchema({routes:e},t)}o(hoe,"routesValidator")});var Tt=v(sr=>{"use strict";var Bs=(q(),M(Y)),Nr=oe(),mr=Q(),{configValidator:Eoe,routesValidator:KH}=kw(),gn=require("fs-extra"),WH=require("yaml"),ds=require("path"),_oe=require("is-number"),zH=require("properties-reader"),goe=require("lodash"),{handleHDBError:Soe}=_e(),{HTTP_STATUS_CODES:Toe,HDB_ERROR_MSGS:ud}=zr(),{server:yoe}=(Fr(),M(fm)),{PACKAGE_ROOT:jH}=Ot(),{DATABASES_PARAM_CONFIG:Tp,CONFIG_PARAMS:us,CONFIG_PARAM_MAP:hi}=Bs,Roe="Unable to get config value because config is uninitialized",boe="Config successfully initialized",Aoe="Error backing up config file",Ioe="Empty parameter sent to getConfigValue",QH=ds.join(jH,"config","yaml",Bs.HDB_DEFAULT_CONFIG_FILE),woe=ds.join(jH,"config","yaml","defaultNatsConfig.yaml"),Noe="Configuration successfully set. You must restart HarperDB for new config settings to take effect.",YH={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"},Yg,kt,Wg;sr.createConfigFile=Coe;sr.getDefaultConfig=Ooe;sr.getConfigValue=XH;sr.initConfig=zg;sr.flattenConfig=dd;sr.updateConfigValue=ZH;sr.updateConfigObject=Loe;sr.getConfiguration=voe;sr.setConfiguration=Uoe;sr.readConfigFile=$w;sr.getClusteringRoutes=xoe;sr.initOldConfig=eq;sr.getConfigFromFile=Boe;sr.getConfigFilePath=Il;sr.addConfig=Foe;sr.deleteConfigFromFile=koe;sr.getConfigObj=Hoe;sr.resolvePath=Hw;sr.getFlatConfigObj=qoe;function Hw(e){if(e?.startsWith("~/"))return ds.join(Nr.getHomeDir(),e.slice(1));let t=ce();try{return ds.resolve(t.getHdbBasePath(),e)}catch(r){return console.error("Unable to resolve path",e,r),e}}o(Hw,"resolvePath");function Coe(e,t=!1){let r=Xa(QH);if(e.clustering_enabled||e.CLUSTERING_ENABLED||e.clustering){let c=WH.parseDocument(gn.readFileSync(woe,"utf8"),{simpleKeys:!0});r.addIn(["clustering"],c.toJSON().clustering)}Yg=dd(r.toJSON());let n;for(let c in e){let l=hi[c.toLowerCase()];if(l===us.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=qw(l,e[c]);l==="rootPath"&&d?.endsWith("/")&&(d=d.slice(0,-1));try{u.length>1&&typeof r.getIn(u.slice(0,-1))=="boolean"&&r.deleteIn(u.slice(0,-1)),r.setIn([...u],d)}catch(f){mr.error(f)}}}n&&JH(r,n),Gw(r,t);let s=r.toJSON();kt=dd(s);let i=r.getIn(["rootPath"]),a=ds.join(i,Bs.HDB_CONFIG_FILE);if(gn.createFileSync(a),r.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${r.errors}`);gn.writeFileSync(a,String(r)),mr.trace(`Config file written to ${a}`)}o(Coe,"createConfigFile");function JH(e,t){let r;try{try{r=JSON.parse(t)}catch(n){if(!Nr.isObject(t))throw n;r=t}for(let n of r){let s=Object.keys(n)[0];if(n[s].hasOwnProperty(Tp.TABLES))for(let i in n[s][Tp.TABLES])for(let a in n[s][Tp.TABLES][i]){let c=n[s][Tp.TABLES][i][a],l=[us.DATABASES,s,Tp.TABLES,i,a];e.hasIn(l)?e.setIn(l,c):e.addIn(l,c)}else for(let i in n[s]){let a=n[s][i],c=[us.DATABASES,s,i];e.hasIn(c)?e.setIn(c,a):e.addIn(c,a)}}}catch(n){mr.error("Error parsing schemas CLI/env config arguments",n)}}o(JH,"setSchemasConfig");function Ooe(e){if(Yg===void 0){let r=Xa(QH);Yg=dd(r.toJSON())}let t=hi[e.toLowerCase()];if(t!==void 0)return Yg[t.toLowerCase()]}o(Ooe,"getDefaultConfig");function XH(e){if(e==null){mr.info(Ioe);return}if(kt===void 0){mr.trace(Roe);return}let t=hi[e.toLowerCase()];if(t!==void 0)return kt[t.toLowerCase()]}o(XH,"getConfigValue");function Il(e=Nr.getPropsFilePath()){let t=Nr.getEnvCliRootPath();if(t)return Hw(ds.join(t,Bs.HDB_CONFIG_FILE));let r=zH(e);return Hw(r.get(Bs.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY))}o(Il,"getConfigFilePath");function zg(e=!1){if(kt===void 0||e){let t;if(!Nr.noBootFile()){t=Nr.getPropsFilePath();try{gn.accessSync(t,gn.constants.F_OK|gn.constants.R_OK)}catch(i){throw mr.error(i),new Error(`HarperDB properties file at path ${t} does not exist`)}}let r=Il(t),n;if(r.includes("config/settings.js"))try{eq(r);return}catch(i){if(i.code!==Bs.NODE_ERROR_CODES.ENOENT)throw i}try{n=Xa(r)}catch(i){if(i.code===Bs.NODE_ERROR_CODES.ENOENT){mr.trace(`HarperDB config file not found at ${r}.
15
15
  This can occur during early stages of install where the config file has not yet been created`);return}else throw mr.error(i),new Error(`Error reading HarperDB config file at ${r}`)}Poe(n,r),Gw(n);let s=n.toJSON();if(yoe.config=s,kt=dd(s),kt.logging_rotation_rotate)for(let i in YH)kt[i]&&mr.error(`Config ${YH[i]} has been deprecated. Please check https://docs.harperdb.io/docs/ for further details.`);mr.trace(boe)}}o(zg,"initConfig");function Poe(e,t){let r=e.getIn(["rootPath"]),n=!1;if(e.hasIn(["storage","path"])||(e.setIn(["storage","path"],ds.join(r,"database")),n=!0),e.hasIn(["logging","rotation","path"])||(e.setIn(["logging","rotation","path"],ds.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,replicate:!1}),n=!0),n){if(mr.trace("Updating config file with missing config params"),e.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${e.errors}`);gn.writeFileSync(t,String(e))}}o(Poe,"checkForUpdatedConfig");function Gw(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 ud.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 ud.CONFIG_VALIDATION("operationsApi.network.port and operationsApi.network.securePort cannot be the same value");let n=Eoe(r,t);if(n.error)throw ud.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)}o(Gw,"validateConfig");function Loe(e,t){kt===void 0&&(kt={});let r=hi[e.toLowerCase()];if(r===void 0){mr.trace(`Unable to update config object because config param '${e}' does not exist`);return}kt[r.toLowerCase()]=t}o(Loe,"updateConfigObject");function ZH(e,t,r=void 0,n=!1,s=!1,i=!1){kt===void 0&&zg();let a=XH(hi.hdb_root),c=ds.join(a,Bs.HDB_CONFIG_FILE),l=Xa(c),u;if(r&&kt){let m=!1;for(let p in r)if(r[p]!=kt[p.toLowerCase()]){m=!0;break}if(!m){mr.trace("No changes detected in config parameters, skipping update");return}}if(r===void 0&&e.toLowerCase()===us.DATABASES)u=t;else if(r===void 0){let m;if(i)m=e;else if(m=hi[e.toLowerCase()],m===void 0)throw new Error(`Unable to update config, unrecognized config parameter: ${e}`);let p=m.split("_"),h=qw(m,t);l.setIn([...p],h)}else for(let m in r){let p=hi[m.toLowerCase()];if(p===us.HTTP_SECUREPORT&&r[m]===kt[us.HTTP_PORT]?.toString()&&l.setIn(["http","port"],null),p===us.OPERATIONSAPI_NETWORK_SECUREPORT&&r[m]===kt[us.OPERATIONSAPI_NETWORK_PORT.toLowerCase()]?.toString()&&l.setIn(["operationsApi","network","port"],null),p===us.DATABASES){u=r[m];continue}if(p?.startsWith("threads_")){let h=l.getIn(["threads"]);h>=0&&(l.deleteIn(["threads"]),l.setIn(["threads","count"],h))}if(!p&&(m.endsWith("_package")||m.endsWith("_port"))&&(p=m),p!==void 0){let h=p.split("_"),E=Bs.LEGACY_CONFIG_PARAMS[m.toUpperCase()];E&&E.startsWith("customFunctions")&&l.hasIn(E.split("_"))&&(p=E,h=E.split("_"));let g=qw(p,r[m]);p==="rootPath"&&g?.endsWith("/")&&(g=g.slice(0,-1));try{h.length>1&&typeof l.getIn(h.slice(0,-1))=="boolean"&&l.deleteIn(h.slice(0,-1)),l.setIn([...h],g)}catch(R){mr.error(R)}}}u&&JH(l,u),Gw(l);let d=l.getIn(["rootPath"]),f=ds.join(d,Bs.HDB_CONFIG_FILE);if(n===!0&&Doe(c,d),l.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${l.errors}`);gn.writeFileSync(f,String(l)),s&&(kt=dd(l.toJSON())),mr.trace(`Config parameter: ${e} updated with value: ${t}`)}o(ZH,"updateConfigValue");function Doe(e,t){try{let r=ds.join(t,"backup",`${new Date(Date.now()).toISOString().replaceAll(":","-")}-${Bs.HDB_CONFIG_FILE}.bak`);gn.copySync(e,r),mr.trace(`Config file: ${e} backed up to: ${r}`)}catch(r){mr.error(Aoe),mr.error(r)}}o(Doe,"backupConfigFile");var Moe=["databases"];function dd(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}),Wg=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])&&!Moe.includes(i)){let a=r(n[i]);for(let c in a){if(!a.hasOwnProperty(c))continue;c!=="package"&&(i=i.toLowerCase());let l=i+"_"+c;!us[l.toUpperCase()]&&hi[l]&&(s[hi[l].toLowerCase()]=a[c]),s[l]=a[c]}}n[i]!==void 0&&(s[i.toLowerCase()]=n[i])}return s}o(r,"squashObj")}o(dd,"flattenConfig");function qw(e,t){if(e===us.CLUSTERING_NODENAME||e===us.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(_oe(t))return parseFloat(t);if(t===!0||t===!1||Array.isArray(t)||Nr.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 Nr.autoCast(t)}o(qw,"castConfigValue");function voe(){let e=Nr.getPropsFilePath(),t=Il(e);return Xa(t).toJSON()}o(voe,"getConfiguration");async function Uoe(e){let{operation:t,hdb_user:r,hdbAuthHeader:n,...s}=e;try{return ZH(void 0,void 0,s,!0),Noe}catch(i){throw typeof i=="string"||i instanceof String?Soe(i,i,Toe.BAD_REQUEST,void 0,void 0,!0):i}}o(Uoe,"setConfiguration");function $w(){let e=Nr.getPropsFilePath();try{gn.accessSync(e,gn.constants.F_OK|gn.constants.R_OK)}catch(n){if(!Nr.noBootFile())throw mr.error(n),new Error(`HarperDB properties file at path ${e} does not exist`)}let t=Il(e);return Xa(t).toJSON()}o($w,"readConfigFile");function Xa(e){return WH.parseDocument(gn.readFileSync(e,"utf8"),{simpleKeys:!0})}o(Xa,"parseYamlDoc");function xoe(){let e=$w(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=Nr.isEmptyOrZeroLength(t)?[]:t;let r=KH(t);if(r)throw ud.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=Nr.isEmptyOrZeroLength(n)?[]:n;let s=KH(n);if(s)throw ud.CONFIG_VALIDATION(s.message);if(!Nr.isEmptyOrZeroLength(n)&&!Nr.isEmptyOrZeroLength(t)){let i=t.filter(a=>n.some(c=>c.host===a.host&&c.port===a.port));if(!Nr.isEmptyOrZeroLength(i)){let a=`Duplicate hub and leaf routes found ${JSON.stringify(i)}`;throw ud.CONFIG_VALIDATION(a)}}return{hub_routes:t,leaf_routes:n}}o(xoe,"getClusteringRoutes");function eq(e){let t=zH(e);kt={};for(let r in hi){let n=t.get(r.toUpperCase());if(Nr.isEmpty(n)||typeof n=="string"&&n.trim().length===0)continue;let s=hi[r].toLowerCase();s===us.LOGGING_ROOT?kt[s]=ds.dirname(n):kt[s]=n}return kt}o(eq,"initOldConfig");function Boe(e){let t=$w();return goe.get(t,e.replaceAll("_","."))}o(Boe,"getConfigFromFile");async function Foe(e,t){let r=Xa(Il());if(r.hasIn([e])?r.setIn([e],t):r.addIn([e],t),r.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${r.errors}`);await gn.writeFile(Il(),String(r))}o(Foe,"addConfig");function koe(e){let t=Il(Nr.getPropsFilePath()),r=Xa(t);r.deleteIn(e);let n=r.getIn(["rootPath"]),s=ds.join(n,Bs.HDB_CONFIG_FILE);gn.writeFileSync(s,String(r))}o(koe,"deleteConfigFromFile");function Hoe(){return Wg||(zg(),Wg)}o(Hoe,"getConfigObj");function qoe(){return kt||zg(),kt}o(qoe,"getFlatConfigObj")});var fs=v((tve,Gr)=>{"use strict";var nq="username is required",sq="nothing to update, must supply active, role or password to update",iq="password cannot be an empty string",oq="If role is specified, it cannot be empty.",aq="active must be true or false";Gr.exports.addUser=Qoe;Gr.exports.alterUser=Joe;Gr.exports.dropUser=Zoe;Gr.exports.getSuperUser=sae;Gr.exports.userInfo=eae;Gr.exports.listUsers=Qg;Gr.exports.listUsersExternal=tae;Gr.exports.setUsersWithRolesCache=wl;Gr.exports.findAndValidateUser=Xw;Gr.exports.getClusterUser=iae;Gr.exports.getUsersWithRolesCache=nae;Gr.exports.USERNAME_REQUIRED=nq;Gr.exports.ALTERUSER_NOTHING_TO_UPDATE=sq;Gr.exports.EMPTY_PASSWORD=iq;Gr.exports.EMPTY_ROLE=oq;Gr.exports.ACTIVE_BOOLEAN=aq;var cq=pn(),Goe=Qa(),yp=(Aw(),M(bw)),lq=nH(),Rp=En(),zw=qo(),to=oe(),uq=require("validate.js"),jw=Q(),{promisify:$oe}=require("util"),Qw=Zi(),Kw=(q(),M(Y)),tq=pt(),Voe=Tt(),Koe=ce(),Yoe=ji(),{hdbErrors:Woe,ClientError:Ei}=_e(),{HTTP_STATUS_CODES:Ko,AUTHENTICATION_ERROR_MSGS:Vw,HDB_ERROR_MSGS:fd}=Woe,{UserEventMsg:Jw}=is(),Yw=require("lodash"),{server:jg}=(Fr(),M(fm)),zoe=Q();jg.getUser=(e,t)=>Xw(e,t,t!=null);jg.authenticateUser=(e,t)=>Xw(e,t);var dq={username:!0,active:!0,role:!0,password:!0},rq=new Map,joe=$oe(Goe.delete),Ww=Koe.get(Kw.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??yp.HASH_FUNCTION.SHA256,ro;async function Qoe(e){let t=uq.cleanAttributes(e,dq),r=lq.addUserValidation(t);if(r)throw new Ei(r.message);let n=await Rp.searchByValue({schema:"system",table:"hdb_role",attribute:"role",value:t.role,get_attributes:["id","permission","role"]});if(!n||n.length<1)throw new Ei(fd.ROLE_NAME_NOT_FOUND(t.role),Ko.NOT_FOUND);if(n.length>1)throw new Ei(fd.DUP_ROLES_FOUND(t.role),Ko.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=Qw.encrypt(t.password)),t.password=await yp.hash(t.password,Ww),t.hash_function=Ww,t.role=n[0].id;let s=await cq.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(jw.debug(s),await wl(),s.skipped_hashes.length===1)throw new Ei(fd.USER_ALREADY_EXISTS(t.username),Ko.CONFLICT);return zw.signalUserChange(new Jw(process.pid)),`${t.username} successfully added`}o(Qoe,"addUser");async function Joe(e){let t=uq.cleanAttributes(e,dq);if(to.isEmptyOrZeroLength(t.username))throw new Error(nq);if(to.isEmptyOrZeroLength(t.password)&&to.isEmptyOrZeroLength(t.role)&&to.isEmptyOrZeroLength(t.active))throw new Error(sq);if(!to.isEmpty(t.password)&&to.isEmptyOrZeroLength(t.password.trim()))throw new Error(iq);if(!to.isEmpty(t.active)&&!to.isBoolean(t.active))throw new Error(aq);if(!to.isEmpty(t.password)&&!to.isEmptyOrZeroLength(t.password.trim())&&(Xoe(t.username)&&(t.hash=Qw.encrypt(t.password)),t.password=await yp.hash(t.password,Ww)),t.role==="")throw new Error(oq);if(t.role){let n=await Rp.searchByValue({schema:"system",table:"hdb_role",attribute:"role",value:t.role,get_attributes:["*"]});if(!n||n.length===0)throw new Ei(fd.ALTER_USER_ROLE_NOT_FOUND(t.role),Ko.NOT_FOUND);if(n.length>1)throw new Ei(fd.DUP_ROLES_FOUND(t.role),Ko.CONFLICT);t.role=n[0].id}let r=await cq.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await wl(),zw.signalUserChange(new Jw(process.pid)),r}o(Joe,"alterUser");function Xoe(e){let t=!1,r=ro.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}o(Xoe,"isClusterUser");async function Zoe(e){let t=lq.dropUserValidation(e);if(t)throw new Ei(t.message);if(ro.get(e.username)===void 0)throw new Ei(fd.USER_NOT_EXIST(e.username),Ko.NOT_FOUND);let r=await joe({table:"hdb_user",schema:"system",hash_values:[e.username]});return jw.debug(r),await wl(),zw.signalUserChange(new Jw(process.pid)),`${e.username} successfully deleted`}o(Zoe,"dropUser");async function eae(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=Yw.cloneDeep(e.hdb_user);let r=await Rp.searchByHash({schema:"system",table:"hdb_role",hash_values:[t.role.id],get_attributes:["*"]});return t.role=r[0],delete t.password,delete t.refresh_token,delete t.hash,delete t.hash_function,t}o(eae,"userInfo");async function tae(){let e=await Qg();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}o(tae,"listUsersExternal");async function Qg(){let e=await Rp.searchByValue({schema:"system",table:"hdb_role",value:"*",attribute:"role",get_attributes:["*"]}),t={};for(let s of e)t[s.id]=Yw.cloneDeep(s);if(Object.keys(t).length===0)return null;let r=await Rp.searchByValue({schema:"system",table:"hdb_user",value:"*",attribute:"username",get_attributes:["*"]}),n=new Map;for(let s of r)s=Yw.cloneDeep(s),s.role=t[s.role],rae(s.role),n.set(s.username,s);return n}o(Qg,"listUsers");function rae(e){if(!e){jw.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(Yoe)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}o(rae,"appendSystemTablesToRole");async function wl(e=void 0){e?ro=e:ro=await Qg()}o(wl,"setUsersWithRolesCache");async function nae(){return ro||await wl(),ro}o(nae,"getUsersWithRolesCache");async function Xw(e,t,r=!0){ro||await wl();let n=ro.get(e);if(!n){if(!r)return{username:e};throw new Ei(Vw.GENERIC_AUTH_FAIL,Ko.UNAUTHORIZED)}if(n&&!n.active)throw new Ei(Vw.USER_INACTIVE,Ko.UNAUTHORIZED);let s={active:n.active,username:n.username};if(n.refresh_token&&(s.refresh_token=n.refresh_token),n.role&&(s.role=n.role),r===!0){if(rq.get(t)===n.password)return s;{let i=yp.validate(n.password,t,n.hash_function||yp.HASH_FUNCTION.MD5);if(i?.then&&(i=await i),i===!0)rq.set(t,n.password);else throw new Ei(Vw.GENERIC_AUTH_FAIL,Ko.UNAUTHORIZED)}}return s}o(Xw,"findAndValidateUser");async function sae(){ro||await wl();for(let[,e]of ro)if(e.role.role==="super_user")return e}o(sae,"getSuperUser");async function iae(){let e=await Qg(),t=Voe.getConfigFromFile(Kw.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==Kw.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=Qw.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+tq.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+tq.SERVER_SUFFIX.ADMIN,r}o(iae,"getClusterUser");var fq=[];jg.invalidateUser=function(e){for(let t of fq)try{t(e)}catch(r){zoe.error("Error invalidating user",r)}};jg.onInvalidatedUser=function(e){fq.push(e)}});var Ie,md=se(()=>{Ie={HEALTHY:"healthy",WARNING:"warning",ERROR:"error",UNKNOWN:"unknown",LOADING:"loading"}});var pd,Zw=se(()=>{md();pd=class{static{o(this,"ComponentStatus")}lastChecked;status;message;error;constructor(t,r,n){this.lastChecked=new Date,this.status=t,this.message=r,this.error=n}updateStatus(t,r){this.status=t,this.message=r,this.lastChecked=new Date,t!==Ie.ERROR&&(this.error=void 0)}markHealthy(t){this.updateStatus(Ie.HEALTHY,t||"Component is healthy")}markError(t,r){this.status=Ie.ERROR,this.error=t,this.message=r||(typeof t=="string"?t:t.message),this.lastChecked=new Date}markWarning(t){this.updateStatus(Ie.WARNING,t)}markLoading(t){this.updateStatus(Ie.LOADING,t||"Component is loading")}isHealthy(){return this.status===Ie.HEALTHY}hasError(){return this.status===Ie.ERROR}isLoading(){return this.status===Ie.LOADING}hasWarning(){return this.status===Ie.WARNING}getSummary(){let t=this.status.toUpperCase(),r=this.message?`: ${this.message}`:"";return`${t}${r}`}}});var Nl,Za,eN,hd,tN,Ed,rN,Jg=se(()=>{Nl=b(zr()),Za=class extends Error{static{o(this,"ComponentStatusError")}statusCode;timestamp;constructor(t,r=Nl.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR){super(t),this.name="ComponentStatusError",this.statusCode=r,this.timestamp=new Date,Error.captureStackTrace(this,this.constructor)}},eN=class extends Za{static{o(this,"CrossThreadTimeoutError")}requestId;timeoutMs;collectedCount;constructor(t,r,n){super(`Component status collection timeout after ${r}ms. Collected ${n} responses for request ${t}.`,Nl.HTTP_STATUS_CODES.GATEWAY_TIMEOUT),this.name="CrossThreadTimeoutError",this.requestId=t,this.timeoutMs=r,this.collectedCount=n}},hd=class extends Za{static{o(this,"ITCError")}operation;cause;constructor(t,r){super(`Inter-thread communication failed during ${t}: ${r?.message||"Unknown error"}`,Nl.HTTP_STATUS_CODES.SERVICE_UNAVAILABLE),this.name="ITCError",this.operation=t,this.cause=r}},tN=class extends Za{static{o(this,"AggregationError")}componentCount;cause;constructor(t,r){super(`Failed to aggregate status for ${t} components: ${r?.message||"Unknown error"}`,Nl.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="AggregationError",this.componentCount=t,this.cause=r}},Ed=class extends Za{static{o(this,"ComponentStatusOperationError")}componentName;operation;constructor(t,r,n){super(`Component '${t}' ${r} failed: ${n}`,Nl.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="ComponentStatusOperationError",this.componentName=t,this.operation=r}},rN=class extends Za{static{o(this,"CrossThreadCollectionError")}result;constructor(t){let r=t.success?`Partial collection success: ${t.collectedFromThreads} threads responded`+(t.timedOutThreads.length>0?`, ${t.timedOutThreads.length} timed out`:""):`Collection failed: ${t.errors.map(n=>n.message).join(", ")}`;super(r,Nl.HTTP_STATUS_CODES.OK),this.name="CrossThreadCollectionError",this.result=t}getDiagnostics(){let t=[`Cross-thread collection ${this.result.success?"partially succeeded":"failed"}`,`Threads responded: ${this.result.collectedFromThreads}`];return this.result.expectedThreads&&t.push(`Expected threads: ${this.result.expectedThreads}`),this.result.timedOutThreads.length>0&&t.push(`Timed out threads: ${this.result.timedOutThreads.join(", ")}`),this.result.errors.length>0&&(t.push("Errors:"),this.result.errors.forEach((r,n)=>{t.push(` ${n+1}. ${r.name}: ${r.message}`)})),t.join(`
16
- `)}}});var mq,Cl,pq,ec,bp,_d,oae,Xg,nN=se(()=>{mq=b(is()),Cl=b(Ze());q();pq=b(Zn());md();Jg();ec=(0,pq.loggerWithTag)("componentStatus.crossThread"),bp=class{static{o(this,"CrossThreadStatusCollector")}awaitingResponses=new Map;responseCheckers=new Map;nextRequestId=1;listenerAttached=!1;timeout;cleanupTimer=null;constructor(t=5e3){this.timeout=t}attachListener(){this.listenerAttached||((0,Cl.onMessageByType)(u_.COMPONENT_STATUS_RESPONSE,({message:t})=>{let r=t.isMainThread?"main":`worker-${t.workerIndex}`;ec.trace?.("Received component status response from %s, with requestId: %d",r,t.requestId);let n=this.awaitingResponses.get(t.requestId);if(n){n.push({workerIndex:t.workerIndex,isMainThread:t.isMainThread||!1,statuses:t.statuses||[]});let s=this.responseCheckers.get(t.requestId);s&&s()}}),this.listenerAttached=!0)}scheduleCleanup(){this.cleanupTimer&&clearTimeout(this.cleanupTimer),this.awaitingResponses.size>0&&(this.cleanupTimer=setTimeout(()=>{this.awaitingResponses.size>0&&(ec.debug?.(`Cleaning up ${this.awaitingResponses.size} stale pending requests`),this.awaitingResponses.clear()),this.cleanupTimer=null},3e4))}async collect(t){try{this.attachListener(),this.scheduleCleanup();let r=this.nextRequestId++,n=[];this.awaitingResponses.set(r,n);let a=((0,Cl.getWorkerCount)()||1)+1-1,l=await new Promise((p,h)=>{let E=!1,g=o(()=>{let y=this.awaitingResponses.get(r);y&&y.length>=a&&!E&&(E=!0,S(),ec.trace?.(`Collected all ${y.length} expected responses for request ${r}`),p(y))},"checkComplete"),R=setTimeout(()=>{if(!E){E=!0;let y=this.awaitingResponses.get(r)||[];this.awaitingResponses.delete(r),ec.debug?.(`Collection timeout for request ${r}: collected ${y.length}/${a} responses`),p(y)}},this.timeout),S=o(()=>{this.awaitingResponses.delete(r),clearTimeout(R)},"cleanup");this.responseCheckers.set(r,g),(0,mq.sendItcEvent)({type:u_.COMPONENT_STATUS_REQUEST,message:{requestId:r}}).then(()=>{g()}).catch(y=>{E=!0,S(),this.responseCheckers.delete(r),h(new hd("sendItcEvent",y))})});this.responseCheckers.delete(r);let u=new Map,d=t.getAllStatuses(),f=(0,Cl.getWorkerIndex)(),m=f===void 0?"main":`worker-${f}`;for(let[p,h]of d)u.set(`${p}@${m}`,{...h,workerIndex:f});for(let p of l)for(let[h,E]of p.statuses){let g=p.isMainThread?"main":`worker-${p.workerIndex}`;u.set(`${h}@${g}`,{...E,workerIndex:p.workerIndex})}return ec.debug?.(`Collected component status from ${l.length+1} threads (including local)`),u}catch(r){return r instanceof hd?ec.error?.(`ITC failure during component status collection: ${r.message}`):ec.warn?.("Failed to collect component status from all threads:",r),ec.debug?.(`Collection failed for request. Error: ${r instanceof Error?r.message:"Unknown error"}`),this.getLocalStatusOnly(t)}}getLocalStatusOnly(t){let r=t.getAllStatuses(),n=new Map,s=(0,Cl.getWorkerIndex)(),i=s===void 0?"main":`worker-${s}`;for(let[a,c]of r)n.set(`${a}@${i}`,{...c,workerIndex:s});return n}cleanup(){this.awaitingResponses.clear(),this.responseCheckers.clear(),this.cleanupTimer&&(clearTimeout(this.cleanupTimer),this.cleanupTimer=null)}},_d=class{static{o(this,"StatusAggregator")}static aggregate(t){let r=new Map,n=new Map;for(let[s,i]of t){let a=s.indexOf("@"),c=a!==-1?s.substring(0,a):s,l=n.get(c);l||(l=[],n.set(c,l)),l.push([s,i])}for(let[s,i]of n){let a=this.aggregateComponentGroup(s,i);r.set(s,a)}return r}static aggregateComponentGroup(t,r){let n={workers:{}},s=0,i,a,c=new Map,l=new Map;for(let[m,p]of r){let h=m.lastIndexOf("@"),E=h!==-1?m.substring(h+1):"",g=p.lastChecked instanceof Date?p.lastChecked.getTime():new Date(p.lastChecked).getTime();if(E==="main")n.main=g;else if(E&&E.startsWith("worker-")){let R=parseInt(E.substring(7));isNaN(R)||(n.workers[R]=g)}c.set(p.status,(c.get(p.status)||0)+1),p.status!==Ie.HEALTHY&&p.message&&(!i||g>s)&&(s=g,i=p.message),p.error&&!a&&(a=p.error)}let u=this.determineOverallStatus(c);if(Array.from(c.keys()).length>1)for(let[m,p]of r)p.status!==u&&l.set(m,{workerIndex:p.workerIndex!==void 0?p.workerIndex:-1,status:p.status,message:p.message,error:p.error});let f={componentName:t,status:u,lastChecked:n,latestMessage:i,error:a};return l.size>0&&(f.abnormalities=l),f}static determineOverallStatus(t){let r=[Ie.ERROR,Ie.WARNING,Ie.LOADING,Ie.UNKNOWN,Ie.HEALTHY];for(let n of r)if(t.has(n)&&t.get(n)>0)return n;return Ie.UNKNOWN}},oae=parseInt(process.env.COMPONENT_STATUS_TIMEOUT||"5000"),Xg=new bp(oae)});var tc,Zg=se(()=>{Zw();md();nN();Jg();tc=class e{static{o(this,"ComponentStatusRegistry")}statusMap=new Map;reset(){this.statusMap=new Map}setStatus(t,r,n,s){if(!t||typeof t!="string")throw new Ed(String(t),"setStatus","Component name must be a non-empty string");if(!Object.values(Ie).includes(r))throw new Ed(t,"setStatus",`Invalid status level: ${r}. Must be one of: ${Object.values(Ie).join(", ")}`);this.statusMap.set(t,new pd(r,n,s))}getStatus(t){return this.statusMap.get(t)}getAllStatuses(){return this.statusMap}reportHealthy(t,r){this.setStatus(t,Ie.HEALTHY,r)}reportError(t,r,n){this.setStatus(t,Ie.ERROR,n,r)}reportWarning(t,r){this.setStatus(t,Ie.WARNING,r)}initializeLoading(t,r){this.setStatus(t,Ie.LOADING,r||"Component is loading")}markLoaded(t,r){this.setStatus(t,Ie.HEALTHY,r||"Component loaded successfully")}markFailed(t,r,n){this.setStatus(t,Ie.ERROR,n,r)}getComponentsByStatus(t){let r=[];for(let[n,s]of this.statusMap)s.status===t&&r.push({name:n,status:s});return r}getStatusSummary(){let t={[Ie.HEALTHY]:0,[Ie.ERROR]:0,[Ie.WARNING]:0,[Ie.LOADING]:0,[Ie.UNKNOWN]:0};for(let r of this.statusMap.values())t[r.status]++;return t}static async getAggregatedFromAllThreads(t){let r=await Xg.collect(t);return _d.aggregate(r)}async getAggregatedStatusFor(t,r){r||(r=await e.getAggregatedFromAllThreads(this));let n=[],s=t+".",i=r.get(t);i&&n.push({key:t,...i});for(let[f,m]of r)f.startsWith(s)&&n.push({key:f,...m});if(n.length===0)return{status:Ie.UNKNOWN,message:"The component has not been loaded yet (may need a restart)",lastChecked:{workers:{}}};let a=n.some(f=>f.status===Ie.ERROR),c=n.some(f=>f.status===Ie.LOADING),l=a?Ie.ERROR:c?Ie.LOADING:Ie.HEALTHY,u="All components loaded successfully",d={};if(a||c){u=n.filter(m=>m.status===Ie.ERROR||m.status===Ie.LOADING).map(m=>`${m.key}: ${m.latestMessage||m.status}`).join("; ");for(let m of n)m.status!==Ie.HEALTHY&&(d[m.key]={status:m.status,message:m.latestMessage})}return{status:l,message:u,...Object.keys(d).length>0&&{details:d},lastChecked:n[0]?.lastChecked||{workers:{}}}}}});var pr,eS=se(()=>{Zg();pr=new tc});function Eq(e){let t=hq.get(e);return t||(t=new sN(e),hq.set(e,t)),t}function _q(){pr.reset()}var sN,hq,no,gq,Sq=se(()=>{eS();md();sN=class{static{o(this,"ComponentStatusBuilder")}componentName;constructor(t){this.componentName=t}healthy(t){return pr.setStatus(this.componentName,Ie.HEALTHY,t),this}warning(t){return pr.setStatus(this.componentName,Ie.WARNING,t),this}error(t,r){return pr.setStatus(this.componentName,Ie.ERROR,t,r),this}loading(t){return pr.setStatus(this.componentName,Ie.LOADING,t||"Loading..."),this}unknown(t){return pr.setStatus(this.componentName,Ie.UNKNOWN,t),this}get(){return pr.getStatus(this.componentName)}},hq=new Map;o(Eq,"statusForComponent");no={loading(e,t){pr.initializeLoading(e,t)},loaded(e,t){pr.markLoaded(e,t)},failed(e,t,r){pr.markFailed(e,t,r)}};o(_q,"reset");gq=Ie});var Ap={};Re(Ap,{AggregationError:()=>tN,COMPONENT_STATUS_LEVELS:()=>Ie,ComponentStatus:()=>pd,ComponentStatusError:()=>Za,ComponentStatusOperationError:()=>Ed,ComponentStatusRegistry:()=>tc,CrossThreadCollectionError:()=>rN,CrossThreadStatusCollector:()=>bp,CrossThreadTimeoutError:()=>eN,ITCError:()=>hd,StatusAggregator:()=>_d,componentStatusRegistry:()=>pr,crossThreadCollector:()=>Xg,query:()=>aae});var aae,Tq=se(()=>{eS();Zg();Zw();Zg();nN();eS();Jg();md();aae={get(e){return pr.getStatus(e)},all(){return pr.getAllStatuses()},byStatus(e){return pr.getComponentsByStatus(e)},summary(){return pr.getStatusSummary()},async allThreads(){return tc.getAggregatedFromAllThreads(pr)}}});var iN={};Re(iN,{STATUS:()=>gq,internal:()=>Ap,lifecycle:()=>no,reset:()=>_q,statusForComponent:()=>Eq});var Ip=se(()=>{Sq();Tq()});var Np=v((Uve,bq)=>{"use strict";var ms=Q(),Sn=(q(),M(Y)),cae=G0(),lae=fs(),{validateEvent:oN}=is(),wp=cs(),uae=require("process"),{resetDatabases:dae}=(we(),M(mt)),fae={[Sn.ITC_EVENT_TYPES.SCHEMA]:mae,[Sn.ITC_EVENT_TYPES.USER]:Rq,[Sn.ITC_EVENT_TYPES.COMPONENT_STATUS_REQUEST]:hae};async function mae(e){let t=oN(e);if(t){ms.error(t);return}ms.trace("ITC schemaHandler received schema event:",e),await cae(e.message),await pae(e.message)}o(mae,"schemaHandler");async function pae(e){try{wp.resetReadTxn(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),wp.resetReadTxn(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),wp.resetReadTxn(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=dae();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){ms.error(t)}}o(pae,"syncSchemaMetadata");var yq=[];async function Rq(e){try{try{wp.resetReadTxn(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),wp.resetReadTxn(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){ms.warn(r)}let t=oN(e);if(t){ms.error(t);return}ms.trace(`ITC userHandler ${Sn.HDB_ITC_CLIENT_PREFIX}${uae.pid} received user event:`,e),await lae.setUsersWithRolesCache();for(let r of yq)r()}catch(t){ms.error(t)}}o(Rq,"userHandler");Rq.addListener=function(e){yq.push(e)};async function hae(e){try{let t=oN(e);if(t){ms.error(t);return}ms.trace("ITC componentStatusRequestHandler received request:",e);let{internal:r}=(Ip(),M(iN)),{getWorkerIndex:n}=Ze(),{sendItcEvent:s}=is(),i=r.componentStatusRegistry.getAllStatuses(),a=Array.from(i.entries()),c=n(),l=c===void 0,u=e.message.originator,d={type:Sn.ITC_EVENT_TYPES.COMPONENT_STATUS_RESPONSE,message:{requestId:e.message.requestId,statuses:a,workerIndex:c,isMainThread:l}};u!==void 0&&threads.sendToThread(u,d)?ms.trace(`Sent component status response directly to thread ${u}`):(u===void 0?ms.debug("No originator threadId, falling back to broadcast"):ms.warn(`Failed to send direct response to thread ${u}, falling back to broadcast`),await s(d))}catch(t){ms.error("Error handling component status request:",t)}}o(hae,"componentStatusRequestHandler");bq.exports=fae});var is=v((qve,Iq)=>{"use strict";var Bve=Q(),aN=oe(),Eae=(q(),M(Y)),{ITC_ERRORS:Cp}=zr(),{parentPort:Fve,threadId:_ae,isMainThread:gae,workerData:kve}=require("worker_threads"),{onMessageFromWorkers:Sae,broadcast:Hve,broadcastWithAcknowledgement:Tae}=Ze();Iq.exports={sendItcEvent:yae,validateEvent:Aq,SchemaEventMsg:Rae,UserEventMsg:bae};var tS;Sae(async(e,t)=>{tS=tS||Np(),Aq(e),tS[e.type]&&await tS[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function yae(e){return!gae&&e.message&&(e.message.originator=_ae),Tae(e)}o(yae,"sendItcEvent");function Aq(e){if(typeof e!="object")return Cp.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||aN.isEmpty(e.type))return Cp.MISSING_TYPE;if(!e.hasOwnProperty("message")||aN.isEmpty(e.message))return Cp.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||aN.isEmpty(e.message.originator))return Cp.MISSING_ORIGIN;if(Eae.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return Cp.INVALID_EVENT(e.type)}o(Aq,"validateEvent");function Rae(e,t,r,n=void 0,s=void 0){this.originator=e,this.operation=t,this.schema=r,this.table=n,this.attribute=s}o(Rae,"SchemaEventMsg");function bae(e){this.originator=e}o(bae,"UserEventMsg")});var qo=v((Vve,Oq)=>{"use strict";var wq=(q(),M(Y)),$ve=oe(),rS=Q(),Nq=A0(),gd,{sendItcEvent:Cq}=is();function Aae(e){try{rS.debug("signalSchemaChange called with message:",e),gd=gd||Np();let t=new Nq(wq.ITC_EVENT_TYPES.SCHEMA,e);return gd.schema(t),Cq(t)}catch(t){rS.error(t)}}o(Aae,"signalSchemaChange");function Iae(e){try{rS.trace("signalUserChange called with message:",e),gd=gd||Np();let t=new Nq(wq.ITC_EVENT_TYPES.USER,e);return gd.user(t),Cq(t)}catch(t){rS.error(t)}}o(Iae,"signalUserChange");Oq.exports={signalSchemaChange:Aae,signalUserChange:Iae}});function Op(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 Pq(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new Fs(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 Fs,Pp=se(()=>{Fs=class extends Map{static{o(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 a=i[1];if(n)r=(typeof a=="string"?a:a.join(", "))+", "+r;else if(typeof a=="string")r=[a,r];else{a.push(r);return}}return super.set(s,[t,r])}[Symbol.iterator](){return super.values()[Symbol.iterator]()}};o(Op,"appendHeader");o(Pq,"mergeHeaders")});function nS(e,t,r=Nae){let n;return function(...i){return n?n.length*cN>r?t(...i):new Promise((a,c)=>{n.push({args:i,fn(){try{let l=e(...i);a(l)}catch(l){c(l)}}})}):(n=[],s(performance.now(),i),e(...i))};function s(i,a){setImmediate(()=>{let c=performance.now();cN=(cN*4+c-i)/5;let l=n.shift();if(l){let{args:u,fn:d}=l;d(),s(c,u)}else n=null})}}var Mq,wae,Nae,Lq,Cae,lN,Dq,cN,uN=se(()=>{Mq=b(Zn()),wae=3e3,Nae=2e4,Lq=0,Cae=3e4,lN=3e3,Dq=performance.now()+lN,cN=0;o(nS,"throttle");setInterval(()=>{let e=performance.now();e-Dq-lN>wae&&Lq+Cae<e&&(Mq.default.warn?.("JavaScript execution has taken too long and is not allowing proper event queue cycling, consider using 'await new Promise(setImmediate)' in code that will execute for a long duration"),Lq=e),Dq=e},lN).unref()});var Vq={};Re(Vq,{EVICTED:()=>qa,INVALIDATED:()=>xn,coerceType:()=>iS,makeTable:()=>aS});function aS(e){let{primaryKey:t,indices:r,tableId:n,tableName:s,primaryStore:i,databasePath:a,databaseName:c,auditStore:l,schemaDefined:u,dbisDB:d,sealed:f,splitSegments:m,replicate:p}=e,{expirationMS:h,evictionMS:E,audit:g,trackDeletes:R}=e;E??=0;let{attributes:S}=e;S||(S=[]);let y=kA(i,n,l),C,I,k={},J=Promise.resolve(),G,H,X;for(let K of S)(K.assignCreatedTime||K.name==="__createdtime__")&&(G=K),(K.assignUpdatedTime||K.name==="__updatedtime__")&&(H=K),K.expiresAt&&(X=K),K.isPrimaryKey&&(k=K);let z,de=[],le=[],te=1,ye=2,Ae={},Ye={},Ge=864e5,Ar=0,rr,Wr,vr,Tu=!1,Gc,xt,ni,Ca=Pl.get(F.REPLICATION_DATABASES);if(Array.isArray(Ca)){for(let K of Ca)if(K.name===c&&K.replicateTo>=0){ni=K.replicateTo;break}}let QE=i.getRange({start:!1,end:!1}).constructor,em=10,JE=6;g&&im(),Mm(i.env.path,K=>{if(I)return Pa(K)});class tm extends _l{static{o(this,"Updatable")}getUpdatedTime(){return ka.get(this.getRecord())?.version}getExpiresAt(){return ka.get(this.getRecord())?.expiresAt}addTo(_,T){if(typeof T=="number"||typeof T=="bigint")this.set(_,new up(T));else throw new Error("Can not add or subtract a non-numeric value")}subtractFrom(_,T){return this.addTo(_,-T)}}class Pe extends Hr{#e;#t;#r;#n;#s;#i;static name=s;static primaryStore=i;static auditStore=l;static primaryKey=t;static tableName=s;static tableId=n;static indices=r;static audit=g;static databasePath=a;static databaseName=c;static attributes=S;static replicate=p;static sealed=f;static splitSegments=m??!0;static createdTimeProperty=G;static updatedTimeProperty=H;static propertyResolvers;static userResolvers={};static sources=[];static getResidencyById;static get expirationMS(){return h}static dbisDB=d;static schemaDefined=u;static sourcedFrom(_,T){if(T&&(this.sourceOptions=T,(T.expiration||T.eviction||T.scanInterval)&&this.setTTLExpiration(T)),T?.intermediateSource)_.intermediateSource=!0,this.sources.unshift(_);else{if(this.sources.some(L=>!L.intermediateSource)){if(this.sources.some(L=>L.name===_.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(_)}I=I||_.get&&(!_.get.reliesOnPrototype||_.prototype.get),C=C||_.load;let N=o(L=>{let A=this.sources;if(A=A.filter(U=>U.intermediateSource&&U[L]&&(!U[L].reliesOnPrototype||U.prototype[L])),A.length>0)if(A.length===1){let U=A[0];return(w,D,$)=>{if(w?.source!==U)return U[L](D,$,w)}}else return(U,w,D)=>{let $=[];for(let W of A){if(U?.source===W)break;$.push(W[L](w,D,U))}return Promise.all($)}},"getApplyToIntermediateSource"),P=this.sources[this.sources.length-1];P.intermediateSource&&(P={});let O=o(L=>{if(P[L]&&(!P[L].reliesOnPrototype||P.prototype[L]))return(A,U,w)=>{if(!A?.source)return P[L](U,w,A)}},"getApplyToCanonicalSource");Ae={put:O("put"),patch:O("patch"),delete:O("delete"),publish:O("publish")},Ye={put:N("put"),patch:N("patch"),delete:N("delete"),publish:N("publish"),invalidate:N("invalidate")};let x=P.shouldRevalidateEvents;return(async()=>{let L=!1,A,U=o(async(w,D)=>{let $=w.value,W=w.table?De[c][w.table]:Pe;if(c===lm&&(w.table===wu.ROLE_TABLE_NAME||w.table===wu.USER_TABLE_NAME)&&(L=!0),w.id===void 0&&(w.id=$[W.primaryKey],w.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(w));w.source=_;let j={residencyId:$c(w.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:w.nodeId,async:!0},B=w.id,Ee=await W.getResource(B,D,j);switch(w.finished&&await w.finished,w.type){case"put":return x?Ee._writeInvalidate(B,$,j):Ee._writeUpdate(B,$,!0,j);case"patch":return x?Ee._writeInvalidate(B,$,j):Ee._writeUpdate(B,$,!1,j);case"delete":return Ee._writeDelete(B,j);case"publish":case"message":return Ee._writePublish(B,$,j);case"invalidate":return Ee._writeInvalidate(B,$,j);case"relocate":return Ee._writeRelocate(B,j);default:Fe.default.error?.("Unknown operation",w.type,w.id)}},"writeUpdate");try{let w=_.subscribe;w&&R==null&&(R=!0);let D={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},$=_.subscribeOnThisThread?_.subscribeOnThisThread((0,Ol.getWorkerIndex)(),D):(0,Ol.getWorkerIndex)()===0,W=w&&$&&await _.subscribe?.(D);if(W){let j;for await(let B of W)try{if(!(B.type==="transaction"?B.writes[0]:B)){Fe.default.error?.("Bad subscription event",B);continue}if(B.source=_,B.type==="end_txn"){if(j?.resolve(),B.localTime&&A!==B.localTime){if(B.remoteNodeIds?.length>0){let pe=[Symbol.for("seq"),B.remoteNodeIds[0]],ne=d.get(pe),ie=ne?.nodes;ie||(ie=[]);for(let fe of B.remoteNodeIds.slice(1)){let ae=ie.find(ke=>ke.id===fe);ie=ie.filter(ke=>ke.id!==fe||ke===ae),ae||(ae={id:fe,seqId:0},ie.push(ae)),ae.seqId=Math.max(ne?.seqId??1,B.localTime),fe===j?.nodeId&&(ae.lastTxnTime=B.timestamp)}let xe=Math.max(ne?.seqId??1,B.localTime);Fe.default.trace?.("Received txn",c,xe,new Date(xe),B.localTime,new Date(B.localTime),B.remoteNodeIds),d.put(pe,{seqId:xe,nodes:ie})}A=B.localTime}B.onCommit&&j?.committed.then(B.onCommit);continue}if(j)if(B.beginTxn)j.resolve();else{j.write_promises.push(U(B,j));continue}!B.timestamp&&B.version&&(B.timestamp=B.version);let me=At(B,()=>{if(B.type==="transaction"){let pe=[];for(let ne of B.writes)try{pe.push(U(ne,B))}catch(ie){throw ie.message+=" writing "+JSON.stringify(ne)+" of event "+JSON.stringify(B),ie}return Promise.all(pe)}else if(B.type==="define_schema"){let pe=this.attributes.slice(0),ne=!1;for(let ie of B.attributes)pe.find(xe=>xe.name===ie.name)||(pe.push(ie),ne=!0);ne&&(et({table:s,database:c,attributes:pe,origin:"cluster"}),Dp.signalSchemaChange(new Mp.SchemaEventMsg(process.pid,V.CREATE_TABLE,c,s)))}else return B.beginTxn?(j=B,j.write_promises=[U(B,B)],new Promise(pe=>{j.resolve=()=>pe(Promise.all(j.write_promises))})):U(B,B)});j&&(j.committed=me),L&&me&&!me?.waitingForUserChange&&(me.then(()=>Dp.signalUserChange(new Mp.UserEventMsg(process.pid))),me.waitingForUserChange=!0),B.onCommit&&(me?me.then(B.onCommit):B.onCommit())}catch(Ee){Fe.default.error?.("error in subscription handler",Ee)}}}catch(w){Fe.default.error?.(w)}})(),this}static get isCaching(){return I}static get shouldRevalidateEvents(){return this.prototype.get!==Pe.prototype.get}static getResource(_,T,N){let P=super.getResource(_,T,N);if(this.loadAsInstance===!1&&(T._freezeRecords=!0),_!=null&&this.loadAsInstance!==!1){Bi(_);try{if(P.getRecord?.())return P;if(typeof _=="object"&&_&&!Array.isArray(_))throw new Error(`Invalid id ${JSON.stringify(_)}`);let O=!N?.async||i.cache?.get?.(_),x=Ur(T),L=x.getReadTxn();if(L?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return wo(_,T,{transaction:L,ensureLoaded:N?.ensureLoaded},O,A=>{if(A?Pe._updateResource(P,A):P.#e=null,T.onlyIfCached){if(!P.doesExist())throw new ut.ServerError("Entry is not cached",504)}else if(N?.ensureLoaded){let U=dn(_,A,T,P);if(U)return x?.disregardReadTxn(),P.#i=!0,T.loadedFromSource=!0,ks(U,w=>(Pe._updateResource(P,w),P))}return P})}catch(O){throw O.message.includes("Unable to serialize object")&&(O.message+=": "+JSON.stringify(_)),O}}return P}static _updateResource(_,T){_.#n=T,_.#e=T?.value??null,_.#r=T?.version}ensureLoaded(){let _=dn(this.getId(),this.#n,this.getContext());if(_)return this.#i=!0,this.getContext().loadedFromSource=!0,ks(_,T=>{this.#n=T,this.#e=T.value,this.#r=T.version})}static getNewId(){let _=k?.type;if(_==="String"||_==="ID")return super.getNewId();if(!xt){let O=i.getEntry(Symbol.for("id_allocation")),x=O?.value,L;if(x&&x.nodeName===server.hostname&&(!Hae(i)||x.pid===process.pid)){let A=x.start,U=x.end;L=A;for(let w of i.getKeys({start:U,end:A,limit:1,reverse:!0}))L=w}else x=P(O?.version??null),L=x.start;xt=new BigInt64Array([BigInt(L)+1n]),xt=new BigInt64Array(i.getUserSharedBuffer("id",xt.buffer)),xt.maxSafeId=x.end}let T=Number(Atomics.add(xt,0,1n)),N=_==="Int"?512:1048576;if(T+N>=xt.maxSafeId){let O=o(x=>{xt.maxSafeId=T+(_==="Int"?1023:4194303);let L=(_==="Int"?Math.pow(2,31):Math.pow(2,49))-1,A=x?void 0:i.useReadTransaction(),U=Number(xt[0]);for(let $ of i.getKeys({start:U+1,end:L,limit:1,transaction:A}))L=$;A?.done();let{value:w,version:D}=i.getEntry(Symbol.for("id_allocation"));if(xt.maxSafeId<L){if(w.end>xt.maxSafeId-100)return;Fe.default.info?.("New id allocation",T,xt.maxSafeId,D),i.put(Symbol.for("id_allocation"),{start:w.start,end:xt.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),D)}else{Fe.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${xt.maxSafeId}, but id of ${L} detected`);let $=P(D);$.alreadyUpdated||Atomics.store(xt,0,BigInt($.start+1)),xt.maxSafeId=$.end}},"updateEnd");T+N===xt.maxSafeId?setImmediate(O):T+100>=xt.maxSafeId&&(Fe.default.warn?.(`Synchronous id allocation required on table ${s}${_=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>O(!0)))}return T;function P(O){let x=(_==="Int"?Math.pow(2,31):Math.pow(2,49))-1,L=x/4,A,U,w=!1,D,$;do{D=Math.floor(Math.random()*x),$={start:D,end:D+(_==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},A=0;for(let W of i.getKeys({start:D,limit:1,reverse:!0}))A=W;U=x;for(let W of i.getKeys({start:D+1,end:x,limit:1}))U=W;L*=.875,L<1e3&&!w&&(w=!0,Fe.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${_==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,D,A,U,L))}while(!(L<U-D&&(L<D-A||A===0)));return i.transactionSync(()=>{let W=i.getEntry(Symbol.for("id_allocation"));return(W?.version??null)==O?(Fe.default.info?.("Allocated new id range",$),i.put(Symbol.for("id_allocation"),$,Date.now()),$):(Fe.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...W.value})})}}static setTTLExpiration(_){if(typeof _=="number")h=_*1e3,E||(E=0);else if(_&&typeof _=="object")h=_.expiration*1e3,E=(_.eviction||0)*1e3,Ge=_.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(h<0)throw new Error("Expiration can not be negative");Ge=Ge||(h+E)/4,Pa()}static getResidencyRecord(_){return d.get([Symbol.for("residency_by_id"),_])}static setResidency(_){Pe.getResidency=_&&((T,N)=>{try{return _(T,N)}catch(P){throw P.message+=` in residency function for table ${s}`,P}})}static setResidencyById(_){Pe.getResidencyById=_&&(T=>{try{return _(T)}catch(N){throw N.message+=` in residency function for table ${s}`,N}})}static getResidency(_,T){if(Pe.getResidencyById)return Pe.getResidencyById(_[t]);let N=ni;if(T.replicateTo!=null){if(Array.isArray(T.replicateTo))return T.replicateTo.includes(server.hostname)?T.replicateTo:[server.hostname,...T.replicateTo];T.replicateTo>=0&&(N=T.replicateTo)}if(N>=0&&server.nodes){let P=[server.hostname];if(T.previousResidency)P.push(...T.previousResidency.slice(0,N));else{let O=server.nodes.map(A=>A.name),x=Math.floor(O.length*Math.random());P.push(...O.slice(x,x+N));let L=x+N-O.length;L>0&&P.push(...O.slice(0,L))}return P}}static enableAuditing(){g||(g=!0,im(),Pe.audit=!0)}static coerceId(_){return _===""?null:iS(_,k)}static async dropTable(){delete De[c][s];for(let _ of i.getRange({versions:!0,snapshot:!1,lazy:!0}))_.metadataFlags&Jr&&_.value&&xa(_.value);if(c===a){for(let _ of S)d.remove(Pe.tableName+"/"+_.name),r[_.name]?.drop();d.remove(Pe.tableName+"/"),i.drop(),await d.committed}else console.log("legacy dropTable"),await i.close(),fN.default.unlinkSync(i.env.path);Dp.signalSchemaChange(new Mp.SchemaEventMsg(process.pid,V.DROP_TABLE,c,s))}get(_){let T=this.constructor;if(typeof _=="string"&&T.loadAsInstance!==!1)return this.getProperty(_);if(rm(_))return this.search(_);if(_&&_.id===void 0&&!_.toString()){let N={records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:S,recordCount:void 0,estimatedRecordRange:void 0};return this.getContext()?.includeExpensiveRecordCountEstimates?Pe.getRecordCount().then(P=>(N.recordCount=P.recordCount,N.estimatedRecordRange=P.estimatedRange,N)):N}if(_!==void 0&&T.loadAsInstance===!1){let N=this.getContext(),P=Ur(N),O=P.getReadTxn();if(O?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");let x=Os(_);Bi(x);let L=!0;return _.checkPermission&&(L=this.allowRead(N.user,_)),ks(ks(L,A=>{if(!A)throw new ut.AccessViolation(N.user);let U=!0;return wo(x,N,{transaction:O,ensureLoaded:U},!1,w=>{if(N.onlyIfCached){if(!w?.value)throw new ut.ServerError("Entry is not cached",504)}else if(U){let D=dn(x,w,N);if(D)return P?.disregardReadTxn(),N.loadedFromSource=!0,D.then($=>$?.value)}return w?.value})}),A=>{let U=_?.select;return U&&A!=null?Wu(U,this.constructor)(A):A})}if(_?.property)return this.getProperty(_.property);if(this.doesExist()||_?.ensureLoaded===!1||this.getContext()?.returnNonexistent)return this}allowRead(_,T){let N=Pn(_,T);if(N?.read){if(N.isSuperUser)return!0;let P=N.attribute_permissions,O=T?.select;if(P?.length>0||Tu&&O){if(T||(T={}),O){let x=P?.length>0&&dN(P,"read");T.select=O.map(L=>{let A=L.name||L;if(!x||x[A]){let U=vr[A]?.definition?.tableClass;if(U){if(L.name||(L={name:L}),!L.checkPermission&&T.checkPermission&&(L.checkPermission=T.checkPermission),!U.prototype.allowRead.call(null,_,L))return!1;if(!L.select)return L.name}return L}}).filter(Boolean)}else T.select=P.filter(x=>x.read&&!vr[x.attribute_name]).map(x=>x.attribute_name);return T}else return!0}}allowUpdate(_,T,N){let P=Pn(_,N);if(P?.update){let O=P.attribute_permissions;if(O?.length>0){let x=dN(O,"update");for(let L in T)if(!x[L])return!1;for(let L of O){let A=L.attribute_name;!L.update&&!(A in T)&&(T[A]=this.getProperty(A))}}return Oa(this.getContext())}}allowCreate(_,T,N){if(this.isCollection){let P=Pn(_,N);if(P?.insert){let O=P.attribute_permissions;if(O?.length>0){let x=dN(O,"insert");for(let L in T)if(!x[L])return!1;return Oa(this.getContext())}else return Oa(this.getContext())}}else return this.allowUpdate(_,{})}allowDelete(_,T){return Pn(_,T)?.delete&&Oa(this.getContext())}update(_,T){let N,P=typeof T=="boolean"||T===void 0&&(_==null||typeof _=="object"&&!(_ instanceof URLSearchParams)),O=!1;P?(O=T,T=_,N=this.getId()):N=Os(_);let x=this.getContext();if(!Ur(x))throw new Error("Can not update a table resource outside of a transaction");if(T===!1)return this;if(typeof T=="object"&&T)if(O)Object.isFrozen(T)&&(T={...T}),this.#e={},this.#t=T;else if(P){let A=this.#t;A&&(T=Object.assign(A,T)),this.#t=T}else{let A=!0;if(_==null)throw new TypeError("Can not put a record without a target");return _.checkPermission&&(A=this.allowUpdate(x.user,T,_)),ks(A,U=>{if(!U)throw new ut.AccessViolation(x.user);return ks(i.get(Os(_)),w=>{let D=new tm(w);return D._setChanges(T),this._writeUpdate(N,D.getChanges(),!1),D})})}return this._writeUpdate(N,this.#t,O),this}addTo(_,T){if(typeof T=="number"||typeof T=="bigint")this.#s===Uq?this.set(_,(+this.getProperty(_)||0)+T):(this.#s||this.update(),this.set(_,new up(T)));else throw new Error("Can not add a non-numeric value")}subtractFrom(_,T){if(typeof T=="number")return this.addTo(_,-T);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this.#n}getRecord(){return this.#e}getChanges(){return this.#t}_setChanges(_){this.#t=_}setRecord(_){this.#e=_}invalidate(_){let T=!0,N=this.getContext();return _?.checkPermission&&(T=this.allowDelete(N.user,_,N)),ks(T,P=>{if(!P)throw new ut.AccessViolation(N.user);this._writeInvalidate(_?Os(_):this.getId())})}_writeInvalidate(_,T,N){let P=this.getContext();Bi(_),Ur(this.getContext()).addWrite({key:_,store:i,invalidated:!0,entry:this.#n,before:Ae.invalidate?.bind(this,P,_),beforeIntermediate:Au(T,Ye.invalidate?.bind(this,P,_)),commit:o((x,L)=>{if(!(xr(x,L,N?.nodeId)<=0)){T??=null;for(let A in r)T||(T={}),T[A]===void 0&&(T[A]=this.getProperty(A));Fe.default.trace?.(`Invalidating entry in ${s} id: ${_}, timestamp: ${new Date(x).toISOString()}`),y(_,T,L,x,xn,g,{user:P?.user,residencyId:N?.residencyId,nodeId:N?.nodeId,tableToTrack:s},"invalidate")}},"commit")})}_writeRelocate(_,T){let N=this.getContext();Bi(_),Ur(this.getContext()).addWrite({key:_,store:i,invalidated:!0,entry:this.#n,before:Ae.relocate?.bind(this,N,_),beforeIntermediate:Ye.relocate?.bind(this,N,_),commit:o((O,x)=>{if(xr(O,x,T?.nodeId)<=0)return;let L=Pe.getResidencyRecord(T.residencyId),A=0,U=null,w=x?.value;if(L&&!L.includes(server.hostname)){for(let D in r)U||(U={}),U[D]=w[D];A=xn}else U=w;Fe.default.trace?.(`Relocating entry id: ${_}, timestamp: ${new Date(O).toISOString()}`),y(_,U,x,O,A,g,{user:N.user,residencyId:T.residencyId,nodeId:T.nodeId,expiresAt:T.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(_,T){let N={previousResidency:this.getResidencyRecord(_.residencyId),isRelocation:!0},P=La(this.getResidency(T.value,N)),O;if(P){if(!P.includes(server.hostname))return!1;O=$c(P)}let x=0;Fe.default.debug?.("Performing a relocate of an entry",existing_entry.key,T.value,P);let L=y(_.key,T.value,_,_.version,x,!0,{residencyId:O,expiresAt:T.expiresAt},"relocate",!1,null);return!0}static evict(_,T,N){let P=this.Source,O;if(!((I||g)&&(!T||(O=i.getEntry(_),!O||!T)||O.version!==N))){if(I){if(i.hasLock(_,O.version))return;let x;for(let L in r)x||(x={}),x[L]=T[L];if(x)return y(_,x,O,N,qa,null,null,null,!0)}if(i.ifVersion(_,N,()=>{yu(_,T,null)}),g)return y(_,null,O,N,qa,null,null,null,!0);al(i,O??i.getEntry(_),N)}}lock(){throw new Error("Not yet implemented")}static operation(_,T){return _.table||=s,_.schema||=c,global.operation(_,T)}put(_,T){if(T===void 0||T instanceof URLSearchParams)this.update(_,!0);else{let N=!0;if(_==null)throw new TypeError("Can not put a record without a target");let P=this.getContext();return _.checkPermission&&(N=this.allowUpdate(P.user,T,_)),ks(N,O=>{if(!O)throw new ut.AccessViolation(P.user);if(Array.isArray(T))for(let x of T){let L=x[t];this._writeUpdate(L,x,!0)}else{let x=Os(_);this._writeUpdate(x,T,!0)}})}}create(_,T){let N=!0,P=this.getContext();if(!T&&!(_ instanceof URLSearchParams)&&(T=_,_=void 0),!T||typeof T!="object"||Array.isArray(T))throw new TypeError("Can not create a record without an object");return _?.checkPermission&&(N=this.allowCreate(P.user,T,_)),ks(N,O=>{if(!O)throw new ut.AccessViolation(P.user);let x=Os(_)??T[t];if(x===void 0)x=this.constructor.getNewId();else if(i.get(x))throw new ut.ClientError("Record already exists",409);return this._writeUpdate(x,T,!0),T})}patch(_,T){if(T===void 0||T instanceof URLSearchParams)this.update(_,!1);else{let N=this.update(_,T);if(N?.then)return N.then(()=>{})}}_writeUpdate(_,T,N,P){let O=this.getContext(),x=Ur(O);Bi(_);let L=this.#n??i.getEntry(_);this.#s=N?Uq:xae;let A=o(w=>N?w.put?()=>w.put(O,_,T):null:w.patch?()=>w.patch(O,_,T):w.put?()=>w.put(O,_,gl(this)):null,"writeToSources"),U={key:_,store:i,entry:L,nodeName:O?.nodeName,validate:o(w=>{T||(T=this.#t),N||T&&Mg(this.#t===T?this:T)?O?.source||(x.checkOverloaded(),this.validate(T,!N),H&&(T[H.name]=H.type==="Date"?new Date(w):H.type==="String"?new Date(w).toISOString():w),N&&(t&&T[t]!==_&&(T[t]=_),G&&(L?.value?T[G.name]=L?.value[G.name]:T[G.name]=G.type==="Date"?new Date(w):G.type==="String"?new Date(w).toISOString():w),T=gl(T))):x.removeWrite(U)},"validate"),before:A(Ae),beforeIntermediate:Au(T,A(Ye)),commit:o((w,D,$)=>{if($){if(O&&D?.version>(O.lastModified||0)&&(O.lastModified=D.version),this.#n=D,D?.value&&D.value.getRecord)throw new Error("Can not assign a record to a record, check for circular references");N||(this.#e=D?.value??null)}this.#t=void 0,this.#r=w;let W=D?.value,j;this.#s=0;let B=!1,Ee=xr(w,D,P?.nodeId),me;if(Ee<=0){if(g){let fe=D.localTime,ae=D.version;Fe.default.trace?.("Applying CRDT update to record with id: ",_,"txn time",new Date(w),"applying later update from:",new Date(ae),"local recorded time",new Date(fe));let ke=[];for(;fe>w||ae>=w&&fe>0;){let Be=l.get(fe);if(!Be)break;let Le=It(Be);if(ae=Le.version,ae>=w){if(ae===w){if(Ee=xr(w,{version:ae,localTime:fe},P?.nodeId),Ee===0)return;if(Ee>0)continue}if(Le.type==="patch")ke.push(Le),me=T;else if(Le.type==="put"||Le.type==="delete")return}fe=Le.previousLocalTime}fe||Fe.default.debug?.("No further audit history, applying incremental updates based on available history",_,"existing version preserved",D),ke.sort((Be,Le)=>Be.version-Le.version);for(let Be of ke){let Le=Be.getValue(i);if(Fe.default.debug?.("Rebuilding update with future patch:",new Date(Be.version),Le,Be),j=A_(j??T,Le,N),!j)return}}else{if(N)return;j=A_(j??T,W,N),Fe.default.debug?.("Rebuilding update without audit:",j)}Fe.default.trace?.("Rebuilt record to save:",j," is full update:",N)}let pe;if(N&&!j?pe=T:this.constructor.loadAsInstance===!1?pe=gl(W,j??T):(this.#e=W,pe=gl(this,j??T)),this.#e=pe,pe&&pe.getRecord)throw new Error("Can not assign a record to a record, check for circular references");let ne;if(P?.residencyId!=null)ne=P.residencyId;else{L?.residencyId&&(O.previousResidency=Pe.getResidencyRecord(L.residencyId));let fe=La(Pe.getResidency(pe,O));if(fe&&!fe.includes(server.hostname))if(me??=pe,B=!0,Pe.getResidencyById)pe=void 0;else{pe=null;for(let ae in r)pe||(pe={}),pe[ae]=me[ae]}ne=$c(fe)}N||(me=T);let ie=O?.expiresAt??(h?h+Date.now():-1);Fe.default.trace?.(`Saving record with id: ${_}, timestamp: ${new Date(w).toISOString()}${ie?", expires at: "+new Date(ie).toISOString():""}${D?", replaces entry from: "+new Date(D.version).toISOString():", new entry"}`,(()=>{try{return JSON.stringify(pe).slice(0,100)}catch{return""}})()),yu(_,W,pe);let xe=N?"put":"patch";y(_,pe,D,w,B?xn:0,g,{omitLocalRecord:B,user:O?.user,residencyId:ne,expiresAt:ie,nodeId:P?.nodeId,originatingOperation:O?.originatingOperation,tableToTrack:c==="system"?null:s},xe,!1,me),O.expiresAt&&Pa()},"commit")};x.addWrite(U)}async delete(_){if(rm(_)){_.select=["$id"];for await(let T of this.search(_))this._writeDelete(T.$id);return!0}if(_){let T=!0,N=this.getContext();return _.checkPermission&&(T=this.allowDelete(N.user,_,N)),ks(T,P=>{if(!P)throw new ut.AccessViolation(N.user);let O=Os(_);return this._writeDelete(O),!0})}return this._writeDelete(this.getId()),!!this.#e}_writeDelete(_,T){let N=Ur(this.getContext());Bi(_);let P=this.getContext();return N.addWrite({key:_,store:i,entry:this.#n,nodeName:P?.nodeName,before:Ae.delete?.bind(this,P,_),beforeIntermediate:Ye.delete?.bind(this,P,_),commit:o((O,x,L)=>{let A=x?.value;L&&(P&&x?.version>(P.lastModified||0)&&(P.lastModified=x.version),Pe._updateResource(this,x)),!(xr(O,x,T?.nodeId)<=0)&&(yu(this.getId(),A),Fe.default.trace?.(`Deleting record with id: ${_}, txn timestamp: ${new Date(O).toISOString()}`),g||R?(y(_,null,x,O,0,g,{user:P?.user,nodeId:T?.nodeId,tableToTrack:s},"delete"),g||Pa()):al(i,x))},"commit")}),!0}search(_){let T=this.getContext(),N=Ur(T);if(!_)throw new Error("No query provided");if(_.parseError)throw _.parseError;if(_.checkPermission&&!this.allowRead(T.user,_))throw new ut.AccessViolation(T.user);T&&(T.lastModified=Dae);let P=_.conditions;P?P.length===void 0&&(P=P[Symbol.iterator]?Array.from(P):[P]):P=Array.isArray(_)?_:_[Symbol.iterator]?Array.from(_):[];let O=_.id??this.getId();O&&(P=[{attribute:null,comparator:Array.isArray(O)?"prefix":"starts_with",value:O}].concat(P));let x,L={};function A(ie,xe){let fe;switch(xe){case"and":case void 0:if(ie.length<1)throw new Error('An "and" operator requires at least one condition');fe=!0;break;case"or":if(ie.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+xe)}for(let ae of ie){if(ae.conditions){ae.conditions=A(ae.conditions,ae.operator);continue}let ke=ae[0]??ae.attribute,Be=ke==null?k:Ki(S,ke);if(Be)(Be.type||qA[ae.comparator])&&(ae[1]===void 0?ae.value=w(ae.value,Be):ae[1]=w(ae[1],Be));else if(ke!=null)throw(0,ut.handleHDBError)(new Error,`${ke} is not a defined attribute`,404);if(ae.chainedConditions)if(ae.chainedConditions.length===1&&(!ae.operator||ae.operator=="and")){let Le=ae.chainedConditions[0],Me,ht;if(Le.comparator==="gt"||Le.comparator==="greater_than"||Le.comparator==="ge"||Le.comparator==="greater_than_equal"?(Me=ae,ht=Le):(Me=Le,ht=ae),Me.comparator!=="lt"&&Me.comparator!=="less_than"&&Me.comparator!=="le"&&Me.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let Nt=ht.comparator==="ge"||ht.comparator==="greater_than_equal",_t=Me.comparator==="le"||Me.comparator==="less_than_equal";ae.comparator=(Nt?"ge":"gt")+(_t?"le":"lt"),ae.value=[ht.value,Me.value]}else throw new Error("Multiple chained conditions are not currently supported")}return ie}o(A,"prepareConditions");function U(ie,xe){if(_.enforceExecutionOrder)return ie;for(let fe of ie)fe.conditions&&(fe.conditions=U(fe.conditions,fe.operator));return ie.length>1&&xe!=="or"?Oae(ie,cg(Pe)):ie}o(U,"orderConditions");function w(ie,xe){return Array.isArray(ie)?ie.map(fe=>iS(fe,xe)):iS(ie,xe)}o(w,"coerceTypedValues");let D=_.operator;(P.length>0||D)&&(P=A(P,D));let $=typeof _.sort=="object"&&_.sort,W;if($&&D!=="or"){let ie=$.attribute;if(ie==null)throw new ut.ClientError("Sort requires an attribute");if(x=P.find(xe=>Vu(xe.attribute)===Vu(ie)),!x){let xe=Ki(S,ie);if(!xe)throw(0,ut.handleHDBError)(new Error,`${Array.isArray(ie)?ie.join("."):ie} is not a defined attribute`,404);if(xe.indexed)x={...$,comparator:"sort"},P.push(x);else if(P.length===0&&!_.allowFullScan)throw(0,ut.handleHDBError)(new Error,`${Array.isArray(ie)?ie.join("."):ie} is not indexed and not combined with any other conditions`,404)}x&&(x.descending=!!$.descending)}P=U(P,D),$&&(x&&P[0]===x?$.next&&(W={dbOrderedAttribute:$.attribute,attribute:$.next.attribute,descending:$.next.descending,next:$.next.next}):(x&&P.splice(P.indexOf(x),1),W=$));let j=_.select;if(P.length===0&&(P=[{attribute:t,comparator:"greater_than",value:!0}]),_.explain)return{conditions:P,operator:D,postOrdering:W,selectApplied:!!j};let B=N.useReadTxn(),Ee=GA(P,D,Pe,B,_,T,(ie,xe)=>sm(ie,j,T,B,xe),L),me=_.ensureLoaded!==!1,pe=Pe.transformEntryForSelect(j,T,B,L,me,!0),ne=Pe.transformToOrderedSelect(Ee,j,W,T,B,pe);return(_.offset||_.limit!==void 0)&&(ne=ne.slice(_.offset,_.limit!==void 0?(_.offset||0)+_.limit:void 0)),ne.onDone=()=>{ne.onDone=null,N.doneReadTxn()},ne.selectApplied=!0,ne.getColumns=()=>{if(j){let ie=[];for(let xe of j)xe==="*"?ie.push(...S.map(fe=>fe.name)):ie.push(xe.name||xe);return ie}return S.filter(ie=>!ie.computed&&!ie.relationship).map(ie=>ie.name)},ne}static transformToOrderedSelect(_,T,N,P,O,x){let L=new QE;if(N){_=sm(_,T,P,O,null);let A;L.iterate=function(){let w,D=_[Symbol.asyncIterator]?_[Symbol.asyncIterator]():_[Symbol.iterator](),$,W=N.dbOrderedAttribute,j,B,Ee=!0;function me(ne){let ie=ne.next&&me(ne.next),xe=ne.descending;return P.sort=ne,(fe,ae)=>{let ke=Ru(fe,ne.attribute,P),Be=Ru(ae,ne.attribute,P),Le=xe?(0,Ll.compareKeys)(Be,ke):(0,Ll.compareKeys)(ke,Be);return Le===0?ie?.(fe,ae)||0:Le}}o(me,"createComparator");let pe=me(N);return{async next(){let ne;if(w)if(ne=w.next(),ne.done){if($)return L.onDone&&L.onDone(),ne}else return{value:await x.call(this,ne.value)};A=[],j&&A.push(j);do if(ne=await D.next(),ne.done){if($=!0,A.length)break;return L.onDone&&L.onDone(),ne}else{let ie=ne.value;if(ie?.then&&(ie=await ie),W){let xe=Ru(ie,W,P);if(Ee)Ee=!1,B=xe;else if(xe!==B){B=xe,j=ie;break}}A.push(ie)}while(!0);return N.isGrouped,A.sort(pe),w=A[Symbol.iterator](),ne=w.next(),ne.done?(L.onDone&&L.onDone(),ne):{value:await x.call(this,ne.value)}},return(){return L.onDone&&L.onDone(),D.return()},throw(){return L.onDone&&L.onDone(),D.throw()}}};let U=o(w=>{if(typeof T=="object"&&Array.isArray(w.attribute))for(let D=0;D<T.length;D++){let $=T[D],W;if($.name===w.attribute[0]){for(W=$.sort||($.sort={});W.next;)W=W.next;W.attribute=w.attribute.slice(1),W.descending=w.descending}else $===w.attribute[0]&&(T[D]=W={name:$,sort:{attribute:w.attribute.slice(1),descending:w.descending}})}w.next&&U(w.next)},"applySortingOnSelect");U(N)}else L.iterate=(_[Symbol.asyncIterator]||_[Symbol.iterator]).bind(_),L=L.map(function(A){try{let U=x.call(this,A);return typeof U?.catch=="function"?U.catch(w=>{throw w.partialObject={[t]:A.key},w}):U}catch(U){throw U.partialObject={[t]:A.key},U}});return L}static transformEntryForSelect(_,T,N,P,O,x){let L;O&&I&&!(typeof _=="string"?[_]:_)?.every(w=>{let D;return typeof w=="object"?D=w.name:D=w,r[D]||D===t})&&(L=!0);let A,U=o(function(w){let D;if(T?.transaction?.stale&&(T.transaction.stale=!1),w!=null){if(D=w.deref?w.deref():w.value,!D&&(w.key===void 0||w.deref)||w.metadataFlags&xn){if(w.metadataFlags&xn&&T.replicateFrom===!1&&x&&w.residencyId)return nc.SKIP;if(w=wo(w.key??w,T,{transaction:N,lazy:_?.length<4,ensureLoaded:O},this?.isSync,$=>$),w?.then)return w.then(U.bind(this));D=w?.value}if(L&&w?.metadataFlags&(xn|qa)||w?.expiresAt!=null&&w?.expiresAt<Date.now()){if(T.onlyIfCached)return{[t]:w.key,message:"This entry has expired"};let $=dn(w.key??w,w,T);if($?.then)return $.then(U)}}if(D==null)return x?nc.SKIP:D;if(_&&!(_[0]==="*"&&_.length===1)){let $,W=o((B,Ee)=>{let me;typeof B=="object"?me=B.name:me=B;let pe=vr?.[me],ne;if(pe){let ie=P?.[me];if(ie)if(ie.hasMappings){let fe=pe.from?D[pe.from]:Vu(w.key);ne=ie.get(fe),ne||(ne=[])}else ne=ie.fromRecord?.(D);else ne=pe(D,T,w,!0);let xe=o(fe=>{if(pe.directReturn)return Ee(fe,me);if(fe&&typeof fe=="object"){let ae=pe.definition?.tableClass||Pe;A||(A={});let ke=A[me]||(A[me]=ae.transformEntryForSelect(me===B?null:B.select||(Array.isArray(B)?B:null),T,N,ie,O));if(Array.isArray(fe)){let Be=[],Le=ae.transformToOrderedSelect(fe,B.select,typeof B.sort=="object"&&B.sort,T,N,ke)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),Me=o(Nt=>{for(;!Nt.done;){if(Nt?.then)return Nt.then(Me);Be.push(Nt.value),Nt=Le.next()}Ee(Be,me)},"nextValue"),ht=Me(Le.next());ht&&($||($=[]),$.push(ht));return}else if(fe=ke.call(this,fe),fe?.then){$||($=[]),$.push(fe.then(Be=>Ee(Be,me)));return}}Ee(fe,me)},"handleResolvedValue");ne?.then?($||($=[]),$.push(ne.then(xe))):xe(ne);return}else ne=D[me],ne&&typeof ne=="object"&&me!==B&&(ne=Pe.transformEntryForSelect(B.select||B,T,N,null)({value:ne}));Ee(ne,me)},"selectAttribute"),j;if(typeof _=="string")W(_,B=>{j=B});else if(Array.isArray(_))if(_.asArray)j=[],_.forEach((B,Ee)=>{B==="*"?_[Ee]=D:W(B,me=>j[Ee]=me)});else{j={};let B=_.forceNulls;for(let Ee of _)if(Ee==="*")for(let me in D)j[me]=D[me];else W(Ee,(me,pe)=>{me===void 0&&B&&(me=null),j[pe]=me})}else throw new ut.ClientError("Invalid select"+_);return $?Promise.all($).then(()=>j):j}return D},"transform");return U}async subscribe(_){if(!l)throw new Error("Can not subscribe to a table without an audit log");g||et({table:s,database:c,schemaDefined:u,attributes:S,audit:!0}),_||(_={});let T=!_.rawEvents,N=[],P=jA(Pe,this.getId()??null,function(L,A,U,w){try{let D=A.getValue?.(i,T),$=A.type;if(!D&&$==="patch"&&T){let j=i.getEntry(L);j?.version===A.version?D=j.value:D=A.getValue?.(i,!0,U),$="put"}let W={id:L,localTime:U,value:D,version:A.version,type:$,beginTxn:w};N?N.push(W):(c!=="system"&&Ve(A.size??1,"db-message",s,null),this.send(W))}catch(D){Fe.default.error?.(D)}},_.startTime||0,_),O=(async()=>{this.isCollection&&(P.includeDescendants=!0,_.onlyChildren&&(P.onlyChildren=!0)),_.supportsTransactions&&(P.supportsTransactions=!0);let L=this.getId(),A=_.previousCount;A>1e3&&(A=1e3);let U=_.startTime;if(this.isCollection){if(U){if(A)throw new ut.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:w,value:D}of l.getRange({start:U,exclusiveStart:!0,snapshot:!1})){let $=It(D);if($.tableId!==n)continue;let W=$.recordId;if(L==null||kq(L,W)){let j=$.getValue(i,T,w);if(x({id:W,localTime:w,value:j,version:$.version,type:$.type,size:$.size}),P.queue?.length>Bq&&await P.waitForDrain()===!1)return}P.startTime=w}}else if(A){let w=[];for(let{key:D,value:$}of l.getRange({start:"z",end:!1,reverse:!0}))try{let W=It($);if(W.tableId!==n)continue;let j=W.recordId;if(L==null||kq(L,j)){let B=W.getValue(i,T,D);if(w.push({id:j,localTime:D,value:B,version:W.version,type:W.type}),--A<=0)break}}catch(W){Fe.default.error("Error getting history entry",D,W)}for(let D=w.length;D>0;)x(w[--D]);w[0]&&(P.startTime=w[0].localTime)}else if(!_.omitCurrent){for(let{key:w,value:D,version:$,localTime:W,size:j}of i.getRange({start:L??!1,end:L==null?void 0:[L,Ll.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(D&&(x({id:w,localTime:W,value:D,version:$,type:"put",size:j}),P.queue?.length>Bq&&await P.waitForDrain()===!1))return}}else{A&&!U&&(U=0);let w=this.#n?.localTime;if(w===FA&&(i.cache?.delete(L),this.#n=i.getEntry(L),Fe.default.trace?.("re-retrieved record",w,this.#n?.localTime),w=this.#n?.localTime),Fe.default.trace?.("Subscription from",U,"from",L,w),U<w){let D=[],$=w;do{let W=l.get($);if(W){_.omitCurrent=!0;let j=It(W),B=j.getValue(i,T,$);T&&(j.type="put"),D.push({id:L,value:B,localTime:$,...j}),$=j.previousLocalTime}else break;A&&A--}while($>U&&A!==0);for(let W=D.length;W>0;)x(D[--W]);P.startTime=w}!_.omitCurrent&&this.doesExist()&&x({id:L,localTime:w,value:this.#e,version:this.#r,type:"put"})}for(let w of N)x(w);N=null})();function x(L){c!=="system"&&Ve(L.size??1,"db-message",s,null),P.send(L)}return o(x,"send"),_.listener&&P.on("data",_.listener),P}static subscribeOnThisThread(_,T){return _===0||T?.crossThreads===!1}doesExist(){return!!(this.#e||this.#s)}publish(_,T,N){if(T===void 0||T instanceof URLSearchParams)this._writePublish(this.getId(),_,T);else{let P=!0,O=this.getContext();return _.checkPermission&&(P=this.allowCreate(O.user,_,O)),ks(P,x=>{if(!x)throw new ut.AccessViolation(O.user);let L=Os(_);this._writePublish(L,T,N)})}}_writePublish(_,T,N){let P=Ur(this.getContext());_??=null,_!==null&&Bi(_);let O=this.getContext();P.addWrite({key:_,store:i,entry:this.#n,nodeName:O?.nodeName,validate:o(()=>{O?.source||(P.checkOverloaded(),this.validate(T))},"validate"),before:Ae.publish?.bind(this,O,_,T),beforeIntermediate:Au(T,Ye.publish?.bind(this,O,_,T)),commit:o((x,L,A)=>{L===void 0&&R&&!g&&Pa(),Fe.default.trace?.(`Publishing message to id: ${_}, timestamp: ${new Date(x).toISOString()}`),y(_,L?.value??null,L,L?.version||x,0,!0,{user:O?.user,residencyId:N?.residencyId,expiresAt:O?.expiresAt,nodeId:N?.nodeId,tableToTrack:s},"message",!1,T)},"commit")})}validate(_,T){let N,P=o((O,x,L)=>{if(x.type&&O!=null)if(T&&O.__op__&&(O=O.value),x.properties){typeof O!="object"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an object${x.type?" ("+x.type+")":""}`);let A=x.properties;for(let U=0,w=A.length;U<w;U++){let D=A[U];if(D.relationship||D.computed){_.hasOwnProperty(D.name)&&(N||(N=[])).push(`Computed property ${L}.${D.name} may not be directly assigned a value`);continue}let $=P(O[D.name],D,L+"."+D.name);$&&(O[D.name]=$)}if(x.sealed&&O!=null&&typeof O=="object")for(let U in O)A.find(w=>w.name===U)||(N||(N=[])).push(`Property ${U} is not allowed within object in property ${L}`)}else switch(x.type){case"Int":(typeof O!="number"||O>>0!==O)&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof O!="number"||!(Math.floor(O)===O&&Math.abs(O)<=9007199254740992))&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof O!="number"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a number`);break;case"ID":typeof O=="string"||O?.length>0&&O.every?.(A=>typeof A=="string")||(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a string, or an array of strings`);break;case"String":typeof O!="string"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a string`);break;case"Boolean":typeof O!="boolean"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a boolean`);break;case"Date":if(!(O instanceof Date)){if(typeof O=="string"||typeof O=="number")return new Date(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Date`)}break;case"BigInt":if(typeof O!="bigint"){if(typeof O=="string"||typeof O=="number")return BigInt(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a bigint`)}break;case"Bytes":if(!(O instanceof Uint8Array)){if(typeof O=="string")return Buffer.from(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Buffer or Uint8Array`)}break;case"Blob":if(!(O instanceof Ls)){if(typeof O=="string"&&(O=Buffer.from(O)),O instanceof Buffer)return createBlob(O,{type:"text/plain"});(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Blob`)}break;case"array":if(Array.isArray(O)){if(x.elements)for(let A=0,U=O.length;A<U;A++){let w=O[A],D=P(w,x.elements,L+"[*]");D&&(O[A]=D)}}else(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an Array`);break}x.nullable===!1&&O==null&&(N||(N=[])).push(`Property ${L} is required (and not does not allow null values)`)},"validateValue");for(let O=0,x=S.length;O<x;O++){let L=S[O];if(L.relationship||L.computed){Object.hasOwn(_,L.name)&&(N||(N=[])).push(`Computed property ${L.name} may not be directly assigned a value`);continue}if(!T||L.name in _){let A=P(_[L.name],L,L.name);A!==void 0&&(_[L.name]=A)}}if(f)for(let O in _)S.find(x=>x.name===O)||(N||(N=[])).push(`Property ${O} is not allowed`);if(N)throw new ut.ClientError(N.join(". "))}getUpdatedTime(){return this.#r}wasLoadedFromSource(){return I?!!this.#i:void 0}static async addAttributes(_){let T=S.slice(0);for(let N of _){if(!N.name)throw new ut.ClientError("Attribute name is required");if(N.name.match(/[`/]/))throw new ut.ClientError("Attribute names cannot include backticks or forward slashes");Pae(N.name),T.push(N)}return et({table:s,database:c,schemaDefined:u,attributes:T}),Pe.indexingOperation}static async removeAttributes(_){let T=S.filter(N=>!_.includes(N.name));return et({table:s,database:c,schemaDefined:u,attributes:T}),Pe.indexingOperation}static getSize(){let _=i.getStats();return(_.treeBranchPageCount+_.treeLeafPageCount+_.overflowPages)*_.pageSize}static getAuditSize(){let _=l?.getStats();return _&&(_.treeBranchPageCount+_.treeLeafPageCount+_.overflowPages)*_.pageSize}static getStorageStats(){let _=i.env.path,T=fN.default.statfsSync?.(_)??{};return{available:T.bavail*T.bsize,free:T.bfree*T.bsize,size:T.blocks*T.bsize}}static async getRecordCount(_){let T=i.getStats().entryCount,N=1e3/2,P=performance.now(),O=Math.floor(T/2),x=_?.exactCount,L=0,A=0,U;for(let{value:w}of i.getRange({start:!0,lazy:!0,snapshot:!1}))if(w!=null&&L++,A++,await rc(),!x&&A<O&&performance.now()-P>N){U=A;break}if(U){let w=L;L=0;for(let{value:ne}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:U,snapshot:!1}))ne!=null&&L++,await rc();let D=U*2,$=(L+w)/D,W=Math.pow((L-w+1)/U/2,2)+$*(1-$)/D,j=Math.max(Math.sqrt(W)*T,1),B=Math.round($*T),Ee=Math.max(B-1.96*j,L+w),me=Math.min(B+1.96*j,T),pe=Math.pow(10,Math.round(Math.log10(j)));return pe>B&&(pe=pe/10),L=Math.round(B/pe)*pe,{recordCount:L,estimatedRange:[Math.round(Ee),Math.round(me)]}}return{recordCount:L}}static updatedAttributes(){vr=this.propertyResolvers={$id:o((_,T,N)=>({value:N.key}),"$id"),$updatedtime:o((_,T,N)=>N.version,"$updatedtime"),$updatedTime:o((_,T,N)=>N.version,"$updatedTime"),$expiresAt:o((_,T,N)=>N.expiresAt,"$expiresAt"),$record:o((_,T,N)=>N?{value:_}:_,"$record"),$distance:o((_,T,N)=>N&&(N.distance??T?.vectorDistances?.get(N)),"$distance")};for(let _ of this.attributes){_.isPrimaryKey&&(k=_),_.resolve=null;let T=_.relationship,N=_.computed;if(T)if(_.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),N&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),Tu=!0,T.to)_.elements?.definition?(vr[_.name]=_.resolve=(P,O,x,L)=>{let A=P[T.from?T.from:t],U=_.elements.definition.tableClass;return L?$u({attribute:T.to,value:A},Ur(O).getReadTxn(),!1,U,!1).map(w=>w&&w.key!==void 0?w:U.primaryStore.getEntry(w,{transaction:Ur(O).getReadTxn()})).asArray:U.search([{attribute:T.to,value:A}],O).asArray},_.set=()=>{},_.resolve.definition=_.elements.definition,_.resolve.to=T.to,T.from&&(_.resolve.from=T.from)):console.error(`The one-to-many/many-to-many relationship property "${_.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(T.from){let P=_.definition||_.elements?.definition;P?(vr[_.name]=_.resolve=(O,x,L,A)=>{let U=O[T.from];if(U===void 0)return;if(_.elements){let D,$=U?.map(W=>{let j=P.tableClass.primaryStore[A?"getEntry":"get"](W,{transaction:Ur(x).getReadTxn()});return j?.then&&(D=!0),Pe.loadAsInstance===!1&&Object.freeze(A?j?.value:j),j});return T.filterMissing?D?Promise.all($).then(W=>W.filter(Hq)):$.filter(Hq):D?Promise.all($):$}let w=P.tableClass.primaryStore[A?"getEntry":"get"](U,{transaction:Ur(x).getReadTxn()});return Pe.loadAsInstance===!1&&Object.freeze(A?w?.value:w),w},_.set=(O,x)=>{if(Array.isArray(x)){let L=x.map(A=>A.getId?.()||A[P.tableClass.primaryKey]);O[T.from]=L}else{let L=x.getId?.()||x[P.tableClass.primaryKey];O[T.from]=L}},_.resolve.definition=_.definition||_.elements?.definition,_.resolve.from=T.from):console.error(`The relationship property "${_.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${_.name}" in table "${s}" must use either "from" or "to" arguments`);else if(N)typeof N.from=="function"&&this.setComputedAttribute(_.name,N.from),vr[_.name]=_.resolve=(P,O,x)=>{let L=typeof N.from=="string"?P[N.from]:P,A=this.userResolvers[_.name];if(A)return A(L,O,x);Fe.default.warn(`Computed attribute "${_.name}" does not have a function assigned to it. Please use setComputedAttribute('${_.name}', resolver) to assign a resolver function.`),this.userResolvers[_.name]=()=>{}},_.resolve.directReturn=!0;else if(r[_.name]?.customIndex?.propertyResolver){let P=r[_.name].customIndex;vr[_.name]=(O,x,L)=>{let A=O[_.name];return P.propertyResolver(A,x,L)},vr[_.name].directReturn=!0}}dp(this,this),dp(tm,this,!0);for(let _ of S){let T=_.name;_.resolve&&Object.defineProperty(i.encoder.structPrototype,T,{get(){return _.resolve(this,Yu.getStore())},set(N){return _.set(this,N)},configurable:!0})}}static setComputedAttribute(_,T){let N=Ki(S,_);if(!N){console.error(`The attribute "${_}" does not exist in the table "${s}"`);return}if(!N.computed){console.error(`The attribute "${_}" is not defined as computed in the table "${s}"`);return}this.userResolvers[_]=T}static async deleteHistory(_=0,T=!1){let N;for(let{key:P,value:O}of l.getRange({start:0,end:_}))await rc(),It(O).tableId===n&&(N=Y_(l,P,O));if(T)for(let P of i.getRange({start:0,versions:!0})){let{key:O,value:x,localTime:L}=P;await rc(),x===null&&L<_&&(N=al(i,P))}await N}static async*getHistory(_=0,T=1/0){for(let{key:N,value:P}of l.getRange({start:_||1,end:T})){await rc();let O=It(P);O.tableId===n&&(yield{id:O.recordId,localTime:N,version:O.version,type:O.type,value:O.getValue(i,!0,N),user:O.user,operation:O.originatingOperation})}}static async getHistoryOfRecord(_){let T=[];if(_==null)throw new Error("An id is required");let N=i.getEntry(_);if(!N)return T;let P=N.localTime;if(!P)throw new Error("The entry does not have a local audit time");let O=0;do{await rc();let x=l.get(P);if(x){let L=It(x);T.push({id:L.recordId,localTime:P,version:L.version,type:L.type,value:L.getValue(i,!0,P),user:L.user}),P=L.previousLocalTime}else break}while(O<1e3&&P);return T.reverse()}static cleanup(){z?.remove()}}let XE=nS(async(K,_,T)=>{for(let N of Pe.sources)if(N.get&&(!N.get.reliesOnPrototype||N.prototype.get)){if(N.available?.(T)===!1)continue;_.source=N;let P=await N.get(K,_);if(P)return P}},()=>{throw new ut.ServerError("Service unavailable, exceeded request queue limit for resolving cache record",503)});Pe.updatedAttributes();let gb=Pe.prototype;return h&&Pe.setTTLExpiration(h/1e3),X&&ZE(),Pe;function yu(K,_,T){let N;for(let P in r){let O=r[P],x=O.isIndexing,L=vr[P],A=T&&(L?L(T):T[P]),U=_&&(L?L(_):_[P]);if(A===U&&!x)continue;if(O.customIndex){O.customIndex.index(K,A,U);continue}N=!0;let w=O.indexNulls,D=(0,Lp.getIndexedValues)(A,w),$=(0,Lp.getIndexedValues)(U,w);if($?.length>0){let W=new Set($);if(D=D?D.filter(j=>{if(W.has(j))W.delete(j);else return!0}):[],$=Array.from(W),($.length>0||D.length>0)&&vq){let j=$.concat(D).map(B=>({key:B,value:K}));O.prefetch(j,Fq)}for(let j=0,B=$.length;j<B;j++)O.remove($[j],K)}else D?.length>0&&vq&&O.prefetch(D.map(W=>({key:W,value:K})),Fq);if(D)for(let W=0,j=D.length;W<j;W++)O.put(D[W],K)}return N}o(yu,"updateIndices");function Bi(K){switch(typeof K){case"number":return!0;case"string":if(K.length<659)return!0;if(K.length>xq)throw new Error("Primary key size is too large: "+K.length);break;case"object":if(K===null)throw new Error("Invalid primary key of null");break;case"bigint":if(K<2n**64n&&K>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof K)}if((0,Ll.writeKey)(K,Bae,0)>xq)throw new Error("Primary key size is too large: "+K.length);return!0}o(Bi,"checkValidId");function Os(K){return typeof K=="object"&&K?K.id:K}o(Os,"requestTargetToId");function rm(K){return typeof K=="object"&&K&&K.isCollection}o(rm,"isSearchTarget");function nm(K){}o(nm,"isRequestTarget");function wo(K,_,T,N,P){if(Pe.getResidencyById&&T.ensureLoaded&&_?.replicateFrom!==!1){let x=La(Pe.getResidencyById(K));if(x&&!x.includes(server.hostname)&&C)return C({key:K,residency:x}).then(P)}let O=o(()=>{if(_?.transaction?.stale&&(_.transaction.stale=!1),T.transaction?.isDone)return P(null,K);let x=i.getEntry(K,T);return(c!=="system"||s==="hdb_analytics")&&($q.default.trace?.("Recording db-read action for",`${c}.${s}`),Ve(x?.size??1,"db-read",s,null)),_?._freezeRecords&&Object.freeze(x?.value),x?.residencyId&&x.metadataFlags&xn&&C&&T.ensureLoaded&&_?.replicateFrom!==!1?C(x).then(L=>P(L,K),L=>(Fe.default.error?.("Error loading remote record",K,x,T,L),P(null,K))):(x&&_&&(x?.version>(_.lastModified||0)&&(_.lastModified=x.version),x?.localTime&&!_.lastRefreshed&&(_.lastRefreshed=x.localTime)),P(x,K))},"whenPrefetched");return N?O():te>0?(te--,O()):new Promise((x,L)=>{te===0?(te--,i.prefetch([K],()=>{A(),U()})):(de.push(K),le.push(U),de.length>JE&&(te--,A()));function A(){if(de.length>0){let w=le;i.prefetch(de,()=>{te===-1?A():te++;for(let D of w)D()}),de=[],le=[],ye>2&&ye--}else te=ye,ye<em&&ye++}o(A,"prefetch");function U(){try{x(O())}catch(w){L(w)}}o(U,"load")})}o(wo,"loadLocalRecord");function Pn(K,_){let T=_?.checkPermission;if(typeof T!="object"){if(!K?.role)return;T=K.role.permission}if(T.super_user)return Fae;let N=T[c],P,O=N?.tables;if(O)return O[s];if(c==="data"&&(P=T[s])&&!P.tables)return P}o(Pn,"getTablePermissions");function dn(K,_,T,N){if(I){let P=!1;if(T.noCache?P=!0:(_?(!_.value||_.metadataFlags&(xn|qa)||_.expiresAt!=null&&_.expiresAt<Date.now())&&(P=!0):P=!0,Zr(!P,"cache-hit",s)),P){let O=bu(K,_,T).then(x=>(x?.value&&x?.value.getRecord?.()&&Fe.default.error?.("Can not assign a record that is already a resource"),T&&(x?.version>(T.lastModified||0)&&(T.lastModified=x.version),T.lastRefreshed=Date.now()),x));if(T?.onlyIfCached||_?.value&&N?.allowStaleWhileRevalidate?.(_,K)){if(O.catch(x=>Fe.default.warn?.(x)),T?.onlyIfCached&&!N.doesExist())throw new ut.ServerError("Entry is not cached",504);return}else return O}}else if(_?.value&&_.expiresAt!=null&&_.expiresAt<Date.now())return Pe.evict(_.key,_.value,_.version),_.value=null,{then(P){return P(_)}}}o(dn,"ensureLoadedFromSource");function Ur(K){let _=K?.transaction;if(_){if(!_.lmdbDb)return _.lmdbDb=i,_;do{if(_.lmdbDb?.path===i.path)return _;let T=_.next;if(!T)return _=_.next=new Co,_.lmdbDb=i,_;_=T}while(!0)}else return new R_}o(Ur,"txnForContext");function Ru(K,_,T){if(!K)return;let N=(K.deref?K.deref():K.value)??i.getEntry(K.key)?.value;if(typeof _=="object"){let O=vr,x=N;for(let L=0,A=_.length;L<A;L++){let U=_[L],w=O?.[U];x=w&&x?w(x,T,K):x?.[U],K=null,O=w?.definition?.tableClass?.propertyResolvers}return x}let P=vr[_];return P?P(N,T,K):N[_]}o(Ru,"getAttributeValue");function sm(K,_,T,N,P){let O=P?.length,x={transaction:N,lazy:O>0||typeof _=="string"||_?.length<4,alwaysPrefetch:!0},L;function A(U,w){let D=U?.value;if(!D)return nc.SKIP;for(let $=0;$<O;$++)if(!L?.includes($)&&!P[$](D,U))return nc.SKIP;return w!==void 0&&(U.key=w),U}if(o(A,"processEntry"),O>0||!K.hasEntries){let U=K.map(w=>{if(L=null,typeof w=="object"&&w?.key!==void 0)return O>0?A(w):w;if(w==null)return nc.SKIP;for(let D=0;D<O;D++){let W=P[D].idFilter;if(W){if(!W(w))return nc.SKIP;L||(L=[]),L.push(D)}}return wo(w,T,x,!1,A)});return Array.isArray(K)&&(U=U.filter(w=>w!==nc.SKIP)),U.hasEntries=!0,U}return K}o(sm,"transformToEntries");function xr(K,_,T=server.replication?.getThisNodeId(l)){if(K<=_?.version){if(_?.version===K&&T!==void 0){let N=server.replication?.exportIdMapping(l),P=_.localTime,O=P&&l.get(P);if(O){let x,L,A=It(O);for(let U in N)N[U]===T&&(x=U),N[U]===A.nodeId&&(L=U);if(x>L)return 1;if(x===L)return 0}}return-1}return 1}o(xr,"precedesExistingVersion");async function bu(K,_,T){let N=_?.metadataFlags,P=_?.version,O,x;if(!i.attemptLock(K,P,()=>{clearTimeout(x);let w=i.getEntry(K);!w||!w.value||w.metadataFlags&(xn|qa)?O(bu(K,i.getEntry(K),T)):O(w)}))return new Promise(w=>{O=w,x=setTimeout(()=>{i.unlock(K,P)},Uae)});let L=_?.value,A={requestContext:T,replacingRecord:L,replacingEntry:_,replacingVersion:P,noCacheStore:!1,source:null,resourceCache:T?.resourceCache,transaction:void 0,expiresAt:void 0,lastModified:void 0},U=T?.responseHeaders;return new Promise((w,D)=>{let $;ks(At(A,async W=>{let j=performance.now(),B,Ee,me;try{B=await XE(K,A,_),me=N&xn;let ne=A.lastModified||me&&P;Ee=me||ne>P||!L,ne||(ne=(0,Lp.getNextMonotonicTime)());let ie=performance.now()-j;if(Ve(ie,"cache-resolution",s,null,"success"),U&&Op(U,"Server-Timing",`cache-resolve;dur=${ie.toFixed(2)}`,!0),W.timestamp=ne,h&&A.expiresAt==null&&(A.expiresAt=Date.now()+h),B){if(typeof B!="object")throw new Error("Only objects can be cached and stored in tables");if(B.status>0&&B.headers)if(B.status>=300)if(B.status===304)B=L,ne=P;else throw new ut.ServerError(B.body||"Error from source",B.status);else B=B.body;typeof B.toJSON=="function"&&(B=B.toJSON()),t&&B[t]!==K&&(B[t]=K)}$=!0,w({key:K,version:ne,value:B})}catch(ne){ne.message+=` while resolving record ${K} for ${s}`,L&&((ne.code==="ECONNRESET"||ne.code==="ECONNREFUSED"||ne.code==="EAI_AGAIN")&&!T?.mustRevalidate||T?.staleIfError&&(ne.statusCode===500||ne.statusCode===502||ne.statusCode===503||ne.statusCode===504))?(w({key:K,version:P,value:L}),Fe.default.trace?.(ne.message,"(returned stale record)")):D(ne);let ie=performance.now()-j;Ve(ie,"cache-resolution",s,null,"fail"),U&&Op(U,"Server-Timing",`cache-resolve;dur=${ie.toFixed(2)}`,!0),A.transaction.abort();return}if(T?.noCacheStore||A.noCacheStore){A.transaction.abort();return}Ur(A).addWrite({key:K,store:i,entry:_,nodeName:"source",before:Au(B),commit:o((ne,ie)=>{if(ie?.version!==P)return;let xe=yu(K,L,B);if(B){Ye.put?.(A,K,B),ie&&(T.previousResidency=Pe.getResidencyRecord(ie.residencyId));let fe,ae=!1,ke,Be=La(Pe.getResidency(B,T));if(Be){if(!Be.includes(server.hostname))if(fe=B,ae=!0,Pe.getResidencyById)B=void 0;else{B=null;for(let Le in r)B||(B={}),B[Le]=fe[Le]}ke=$c(Be)}Fe.default.trace?.(`Writing resolved record from source with id: ${K}, timestamp: ${new Date(ne).toISOString()}`),y(K,B,ie,ne,ae?xn:0,g&&(Ee||ae)||null,{user:A?.user,expiresAt:A.expiresAt,residencyId:ke,tableToTrack:s},"put",!!me,fe)}else ie&&(Ye.delete?.(A,K),Fe.default.trace?.(`Deleting resolved record from source with id: ${K}, timestamp: ${new Date(ne).toISOString()}`),g||R?y(K,null,ie,ne,0,g&&Ee||null,{user:A?.user,tableToTrack:s},"delete",!!me):al(i,ie,P))},"commit")})}),()=>{i.unlock(K,P)},W=>{i.unlock(K,P),$&&Fe.default.error?.("Error committing cache update",W)})})}o(bu,"getFromSource");function Oa(K){if(!K||K.user?.role?.permission?.super_user)return!0;if(K.replicateTo)throw new ut.ClientError("Can not specify replication parameters without super user permissions",403);if(K.replicatedConfirmation)throw new ut.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}o(Oa,"checkContextPermissions");function Pa(K){let _=!1;if(K&&(K-Ar>1&&(_=!0),Ar=K),!(Ge===rr&&!_)&&(rr=Ge,(0,Ol.getWorkerIndex)()===(0,Ol.getWorkerCount)()-1))return Wr&&clearTimeout(Wr),Ge?new Promise(T=>{let N=new Date;N.setMonth(0),N.setDate(1),N.setHours(0),N.setMinutes(0),N.setSeconds(0);let P=Ge/(1+Ar),O=_?Date.now():Math.ceil((Date.now()-N.getTime())/P)*P+N.getTime(),x=o(L=>{Fe.default.trace?.(`Scheduled next cleanup scan at ${new Date(L)}`),Wr=setTimeout(()=>J=J.then(async()=>{if(x(Math.max(L+Ge,Date.now())),i.rootStore.status!=="open"){clearTimeout(Wr);return}let A=50,U=new Array(A),w=0,D=Math.pow(Ar,8)*(Pl.get(F.STORAGE_RECLAMATION_EVICTIONFACTOR)??1e5),$=E/Math.pow(Math.max(Ar,1),4);Fe.default.debug?.(`Starting cleanup scan for ${s}, evict threshold ${D}, adjusted eviction ${$}ms`);function W(j,B,Ee,me){let pe=j+$-Date.now();if(pe<0)return!0;if(Ar){let ne=i.lastSize;return Ee&Jr&&Jc(me,ie=>{ie.size&&(ne+=ie.size)}),Fe.default.trace?.(`shouldEvict adjusted ${pe} ${ne}, ${pe*(j-B)/ne} < ${D}`),pe*(j-B)/ne<D}return!1}o(W,"shouldEvict");try{let j=0;for(let B of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let{key:Ee,value:me,version:pe,expiresAt:ne,metadataFlags:ie}=B,xe;me===null&&!g&&pe+vae<Date.now()?xe=al(i,B,pe):ne!=null&&W(ne,pe,ie,me)&&(xe=Pe.evict(Ee,me,pe),j++),xe&&(await U[w],U[w]=xe.catch(fe=>{Fe.default.error?.("Cleanup error",fe)}),++w>=A&&(w=0)),await rc()}Fe.default.debug?.(`Finished cleanup scan for ${s}, evicted ${j} entries`)}catch(j){Fe.default.warn?.(`Error in cleanup scan for ${s}:`,j)}T(void 0),Ar=0}),Math.min(L-Date.now(),2147483647)).unref()},"startNextTimer");x(O)}):void 0}o(Pa,"scheduleCleanup");function im(){z=l?.addDeleteRemovalCallback(n,i,(K,_)=>{i.remove(K,_)})}o(im,"addDeleteRemoval");function ZE(){(0,Ol.getWorkerIndex)()===0&&setInterval(async()=>{if(!Gc){Gc=!0;try{let K=X.name,_=r[K];if(!_)throw new Error(`expiresAt attribute ${X} must be indexed`);for(let T of _.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let N of _.getValues(T)){let P=i.getEntry(N);P?.value?P.value[K]<Date.now()&&Pe.evict(N,P.value,P.version):i.ifVersion(N,P?.version,()=>_.remove(T,N))}await rc()}}catch(K){Fe.default.error?.("Error in evicting old records",K)}finally{Gc=!1}}},Mae).unref()}o(ZE,"runRecordExpirationEviction");function La(K){if(K!=null){if(Array.isArray(K))return K;if(typeof K=="number"){if(K>=65536)throw new Error(`Shard id ${K} must be below 65536`);let _=server.shards?.get?.(K);if(_)return Fe.default.trace?.(`Shard ${K} mapped to ${_.map(T=>T.name).join(", ")}`),_.map(T=>T.name);throw new Error(`Shard ${K} is not defined`)}throw new Error(`Shard or residency list ${K} is not a valid type, must be a shard number or residency list of node hostnames`)}}o(La,"residencyFromFunction");function $c(K){if(K){let _=K.join(","),T=d.get([Symbol.for("residency_by_set"),_]);return T||(d.put([Symbol.for("residency_by_set"),_],T=Math.floor(Math.random()*2147418112)+65535),d.put([Symbol.for("residency_by_id"),T],K),T)}}o($c,"getResidencyId");function Au(K,_){let T=lA(K,i.rootStore);if(T){let N=_;return N?async()=>{await N(),await T}:()=>T}return _}o(Au,"preCommitBlobsForRecordBefore")}function dN(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 Fq(){}function iS(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 sS(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return sS(+e);case"Float":return e==="null"?null:sS(+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;kae.test(e)||(e+="Z");let n=new Date(e);return sS(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,oS.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function sS(e){if(isNaN(e))throw new SyntaxError;return e}function kq(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 ks(e,t,r){return e?.then?e.then(t,r):t(e)}function Hq(e){return e!=null}function Hs(e){try{return JSON.stringify(e)}catch{return e}}function Hae(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var nc,Lp,qq,Gq,Pl,ut,Dp,Mp,Fe,Ll,Ol,oS,fN,$q,Oae,Pae,Lae,Dae,Mae,vae,vq,Uae,Uq,xae,xn,qa,Bae,xq,Bq,Fae,fUe,kae,rc,dg=se(()=>{q();nc=require("lmdb"),Lp=b(Mn()),qq=b(require("lodash")),Gq=b(Tm());Ga();Rm();Pl=b(ce());QA();ut=b(_e()),Dp=b(qo()),Mp=b(is());we();ug();Fe=b(Zn());sw();Ua();Ll=require("ordered-binary"),Ol=b(Ze());Hi();oS=b(oe());sl();ts();I_();Pp();fN=b(require("node:fs"));es();G_();$q=b(Q());uN();({sortBy:Oae}=qq.default),{validateAttribute:Pae}=Gq.default,Lae=new Uint8Array(9);Lae[8]=192;Dae=1/0,Mae=6e4,vae=864e5;Pl.initSync();vq=Pl.get(F.STORAGE_PREFETCHWRITES),Uae=1e4,Uq=1,xae=2,xn=1,qa=8,Bae=Buffer.allocUnsafeSlow(8192),xq=1978,Bq=100,Fae={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},fUe=(0,oS.convertToMS)(Pl.get(F.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;o(aS,"makeTable");o(dN,"attributesAsObject");o(Fq,"noop");kae=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;o(iS,"coerceType");o(sS,"rejectNaN");o(kq,"isDescendantId");rc=o(()=>new Promise(setImmediate),"rest");o(ks,"when");o(Hq,"exists");o(Hs,"stringify");o(Hae,"hasOtherProcesses")});function cS(e,t){if(!Array.isArray(e)||!Array.isArray(t))throw new Error("Euclidean distance comparison requires an array");let r=0,n=Math.max(e.length,t.length);for(let s=0;s<n;s++){let i=e[s]||0,a=t[s]||0,c=i-a;r+=c*c}return r}function lS(e,t){if(!Array.isArray(e)||!Array.isArray(t))throw new Error("Cosine distance comparison requires an array");let r=0,n=0,s=0,i=Math.max(e.length,t.length);for(let a=0;a<i;a++){let c=e[a]||0,l=t[a]||0;r+=c*l,n+=c*c,s+=l*l}return n=Math.sqrt(n),s=Math.sqrt(s),1-r/(n*s||1)}var Kq=se(()=>{o(cS,"euclideanDistance");o(lS,"cosineDistance")});var Yq,Wq,Td,so,Sd,qae,Gae,uS,zq=se(()=>{Kq();Yq=require("msgpackr"),Wq=b(Zn()),Td=b(_e()),so=(0,Wq.loggerWithTag)("HNSW"),Sd=Symbol.for("entryPoint"),qae=Symbol.for("key"),Gae=10,uS=class{static{o(this,"HierarchicalNavigableSmallWorld")}static useObjectStore=!0;indexStore;M=16;efConstruction=100;efConstructionSearch=50;mL=1/Math.log(this.M);optimizeRouting=.5;nodesVisitedCount=0;idIncrementer;distance;constructor(t,r){this.indexStore=t,t&&(this.indexStore.encoder.useFloat32=Yq.FLOAT32_OPTIONS.ALWAYS),this.distance=r?.distance==="euclidean"?cS:lS,r&&(r.M!==void 0&&(this.M=r.M,this.mL=1/Math.log(this.M)),r.efConstruction!==void 0&&(this.efConstruction=this.efConstructionSearch=r.efConstruction),r.efConstructionSearch!==void 0&&(this.efConstructionSearch=r.efConstructionSearch),r.mL!==void 0&&(this.mL=r.mL),r.optimizeRouting!==void 0&&(this.optimizeRouting=r.optimizeRouting))}index(t,r,n){let s=typeof t=="number"?[qae,t]:t,i=this.indexStore.get(s);if(!i){if(!r)return;if(!this.idIncrementer){let f=0;for(let m of this.indexStore.getKeys({reverse:!0,limit:1,start:1/0,end:0}))typeof m=="number"&&(f=m);this.idIncrementer=new BigInt64Array([BigInt(f)+1n]),this.idIncrementer=new BigInt64Array(this.indexStore.getUserSharedBuffer("next-id",this.idIncrementer.buffer))}i=Number(Atomics.add(this.idIncrementer,0,1n)),this.indexStore.put(s,i)}let a=new Map,c,l=this.indexStore.get(Sd);if(n?c={...this.indexStore.get(i)}:c={},r){let f=l&&this.indexStore.get(l);if(f===void 0){let E=Math.floor(-Math.log(Math.random())*this.mL),g={vector:r,level:E,primaryKey:t};for(let R=0;R<=E;R++)g[R]=[];if(this.indexStore.put(i,g),typeof i!="number")throw new Error("Invalid nodeId: "+i);so.debug?.("setting entry point to",i),this.indexStore.put(Sd,i);return}let m=c.level??Math.min(Math.floor(-Math.log(Math.random())*this.mL),Gae),p=f.level;if(m>=p){if(typeof i!="number")throw new Error("Invalid nodeId: "+i);so.debug?.("setting entry point to",i),this.indexStore.put(Sd,i)}for(;p>m;){let E=this.searchLayer(r,l,f,this.efConstruction,p);E.length>0&&(l=E[0].id,f=E[0].node),p--}let h=new Array(m+1);for(let E=0;E<=m;E++)h[E]=[];for(let E=Math.min(m,p);E>=0;E--){let g=this.searchLayer(r,l,f,this.efConstruction,E);g=g.slice(0,this.M<<1),g.length===0&&E===0&&so.info?.("should not have zero connections for",l);let R=h[E];for(let S=0;S<g.length;S++){let{id:y,distance:C,node:I}=g[S];if(y===i)continue;let k=[];if(this.optimizeRouting){let H=!1,X=I[E],z=1+this.optimizeRouting*(1+.5*S/this.M);for(let de=0;de<X.length;de++){let{id:le,distance:te}=X[de],ye=1+this.optimizeRouting*(1+.5*de/this.M);for(let Ae=0;Ae<R.length;Ae++){let{id:Ye,distance:Ge}=R[Ae];if(Ye===le){C*z>Ge+te?H=!0:te*ye>C+Ge&&(k.push({fromId:Ye,toId:y}),k.push({fromId:y,toId:Ye}));break}}if(H)break}if(H)continue}else if(S>=(E>0?this.M:this.M<<1))continue;R.push({id:y,distance:C});for(let{fromId:H,toId:X}of k){let z=d(H);z||(z=d(H,this.indexStore.get(H)));for(let de=0;de<z[E].length;de++)if(z[E][de].id===X){Object.isFrozen(z[E])&&(z[E]=z[E].slice()),z[E].splice(de,1);break}}let J=c[E],G=J?.find(({id:H})=>H===y);if(G){let H=J?.indexOf(G);J.copied||(J=[...J],J.copied=!0,c[E]=J),J.splice(H,1)}else this.addConnection(y,d(y,I),i,E,C,d)}}this.indexStore.put(i,{vector:r,level:m,primaryKey:t,...h})}else{if(l===i){let f=c.level??0;for(let m=f;m>=0&&(l=c[m][0]?.id,l===void 0);m--);if(l===void 0){let m=-1;for(let{key:p,value:h}of this.indexStore.getRange({start:0,end:1/0}))if(h.level>m){if(l=p,h.level===f)break;m=h.level}}if(l===void 0)this.indexStore.remove(Sd);else{if(typeof l!="number")throw new Error("Invalid nodeId: "+l);so.debug?.("setting entry point to",l),this.indexStore.put(Sd,l)}}this.indexStore.remove(i)}let u=new Map;if(c.level!==void 0)for(let f=0;f<=c.level;f++){let m=c[f];for(let{id:p}of m){let h=d(p,this.indexStore.get(p));for(let E=0;E<=f;E++)h[E]=h[E]?.filter(({id:g})=>g!==i),h[E].length===0&&(so.info?.("node was left orphaned, will reindex",p),u.set(h.primaryKey,h.vector))}}function d(f,m){let p=a.get(f);return!p&&m&&(p={...m},a.set(f,p)),p}o(d,"updateNode");for(let[f,m]of a)this.indexStore.put(f,m);for(let[f,m]of u)this.index(f,m,m);this.checkSymmetry(i,this.indexStore.get(i))}getEntryPoint(){let t=this.indexStore.get(Sd);if(t===void 0)return;let r=this.indexStore.get(t);return{id:t,...r}}searchLayer(t,r,n,s,i,a=this.distance){let c=new Set([r]),l=[{id:r,distance:this.distance(t,n.vector),node:n}],u=[...l];for(;l.length>0;){l.sort((p,h)=>p.distance-h.distance);let d=l.shift(),f=u[u.length-1].distance;if(d.distance>f)break;let m=d.node;for(let{id:p}of m[i]||[]){if(c.has(p)||p===void 0)continue;c.add(p);let h=this.indexStore.get(p);if(!h)continue;this.nodesVisitedCount++;let E=a(t,h.vector);if(E<f||u.length<s){let g={id:p,distance:E,node:h};l.push(g),u.push(g)}}u.sort((p,h)=>p.distance-h.distance),u.length>s&&u.splice(s,u.length-s)}return u.visited=c.size,u}search({target:t,value:r,descending:n,distance:s,comparator:i}){let a=0;switch(i){case"lt":case"le":a=r;case"sort":break;default:throw new Td.ClientError(`Can not use "${i}" comparator with HNSW`)}if(n)throw new Td.ClientError("Can not use descending sort order with HNSW");let c;if(s==="cosine")c=lS;else if(s==="euclidean")c=cS;else{if(s)throw new Td.ClientError("Unknown distance function");c=this.distance}if(!t)throw new Td.ClientError("A target vector must be provided for an HNSW query");if(!Array.isArray(t))throw new Td.ClientError("The target vector must be an array");let l=this.getEntryPoint();if(!l)return[];let u=l.id,d=[];for(let f=l.level;f>=0;f--)if(d=this.searchLayer(t,u,l,this.efConstructionSearch,f,c),d.length>0){let m=d[0];l=m.node,u=m.id}return a&&(d=d.filter(f=>f.distance<a)),d.map(f=>({key:f.node.primaryKey,distance:f.distance}))}checkSymmetry(t,r){if(!r)return;let n=0,s;for(;(s=r[n])&&s.length!==0;){for(let{id:i}of s){let a=this.indexStore.get(i);if(!a){so.info?.("could not find neighbor node",a);continue}a[n]?.find(({id:l})=>l==t)||so.info?.("asymmetry detected",a[n])}n++}}addConnection(t,r,n,s,i,a){r[s]||(r[s]=[]);let c=s===0?this.M<<1:this.M;if(this.optimizeRouting&&(c<<=2),r[s].length>=c+(c>>2)){so.warn?.("maxConnections reached, removing some connections",c);let l=[...r[s]];l.sort((f,m)=>f.distance-m.distance);let u=l.slice(0,c),d=l.slice(c);r[s]=u;for(let f of d){let m=a(f.id)??this.indexStore.get(f.id);m&&m[s]&&(m=a(f.id,m),m[s]=m[s].filter(({id:p})=>p!==t),s===0&&m[s].length===0&&so.info?.("should not remove last connection",t,n))}}r[s].find(({id:l})=>l===n)?so.debug?.("already connected",t,n):r[s]=[...r[s],{id:n,distance:i}]}validateConnectivity(t=0){let r=this.getEntryPoint(),n=new Set,s=[r.id];n.add(r.id);let i=0;for(;s.length>0;){let a=s.shift(),c=this.indexStore.get(a);for(let l=t;l<=c.level;l++)for(let{id:u}of c[l]||[])i++,n.has(u)||(n.add(u),s.push(u))}return n.size!==this.totalNodes&&console.log("visited",n.size,"total",this.totalNodes),{isFullyConnected:n.size===this.totalNodes,averageConnections:i/n.size}}get totalNodes(){return Array.from(this.indexStore.getKeys({start:0,end:1/0})).length}estimateCountAsSort(){return Math.sqrt(this.indexStore.getStats().entryCount*this.efConstructionSearch)}propertyResolver(t,r,n){let s=r?.sort;if(s){let i=s.vectorDistances;if(i){let l=i.get(n);if(l)return l}else i=r.vectorDistances=s.vectorDistances=new Map;let a=this.distance;s.type&&(a=s.distance==="euclidean"?cS:lS);let c=a(s.target,t);return i.set(n,c),c}return t}}});var mN,jq=se(()=>{zq();mN={HNSW:uS}});var mt={};Re(mt,{NON_REPLICATING_SYSTEM_TABLES:()=>dS,database:()=>od,databaseEnvs:()=>Yo,databases:()=>De,dropDatabase:()=>lw,dropTableMeta:()=>zae,getDatabases:()=>ct,getDefaultCompression:()=>gS,getTables:()=>Vae,onRemovedDB:()=>Hp,onUpdatedTable:()=>Dl,readMetaDb:()=>vp,resetDatabases:()=>Id,table:()=>et,tables:()=>Tn});function kp(e,t){let r=ES.OpenDBIObject??ES.default.OpenDBIObject;return new r(e,t)}function Vae(){return hS||ct(),Tn||{}}function ct(){if(hS)return De;hS=!0,bd=new Map;let e=(0,jt.getHdbBasePath)()&&(0,Ht.join)((0,jt.getHdbBasePath)(),Yc),t=(0,jt.get)(F.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,jt.get)(F.STORAGE_PATH)||e&&((0,ps.existsSync)(e)?e:(0,Ht.join)((0,jt.getHdbBasePath)(),a_)),!!e){if((0,ps.existsSync)(e))for(let r of(0,ps.readdirSync)(e,{withFileTypes:!0})){let n=(0,Ht.basename)(r.name,".mdb");r.isFile()&&(0,Ht.extname)(r.name).toLowerCase()===".mdb"&&!t[n]?.path&&vp((0,Ht.join)(e,r.name),null,n)}if((0,ps.existsSync)((0,Rd.getBaseSchemaPath)())){for(let r of(0,ps.readdirSync)((0,Rd.getBaseSchemaPath)(),{withFileTypes:!0}))if(!r.isFile()){let n=(0,Ht.join)((0,Rd.getBaseSchemaPath)(),r.name),s=(0,Ht.join)((0,Rd.getTransactionAuditStoreBasePath)(),r.name);for(let i of(0,ps.readdirSync)(n,{withFileTypes:!0}))if(i.isFile()&&(0,Ht.extname)(i.name).toLowerCase()===".mdb"){let a=(0,Ht.join)(s,i.name);vp((0,Ht.join)(n,i.name),(0,Ht.basename)(i.name,".mdb"),r.name,a,!0)}}}if(t)for(let r in t){let n=t[r],s=n.path;if((0,ps.existsSync)(s))for(let a of(0,ps.readdirSync)(s,{withFileTypes:!0}))a.isFile()&&(0,Ht.extname)(a.name).toLowerCase()===".mdb"&&vp((0,Ht.join)(s,a.name),(0,Ht.basename)(a.name,".mdb"),r);let i=n.tables;if(i)for(let a in i){let c=i[a],l=(0,Ht.join)(c.path,(0,Ht.basename)(a+".mdb"));(0,ps.existsSync)(l)&&vp(l,a,r,null,!0)}}for(let r in De){let n=bd.get(r);if(n){let s=De[r];r.includes("delete")&&Cr.trace(`defined tables ${Array.from(n.keys())}`);for(let i in s)n.has(i)||(Cr.trace(`delete table class ${i}`),delete s[i])}else if(delete De[r],r==="data"){for(let s in Tn)delete Tn[s];delete Tn[_S]}}if((0,jt.get)(F.ANALYTICS_REPLICATE)===!1?dS.includes("hdb_analytics")||dS.push("hdb_analytics"):(De.system?.hdb_analytics?.enableAuditing(),De.system?.hdb_analytics_hostname?.enableAuditing()),De.system)for(let r of dS)De.system[r]&&(De.system[r].replicate=!1);return bd=null,De}}function Id(){hS=!1;for(let[,e]of Yo)e.needsDeletion=!0;ct();for(let[e,t]of Yo)if(t.needsDeletion&&!e.endsWith("system.mdb")){t.close(),Yo.delete(e);let r=De[t.databaseName];for(let n in r)if(r[n].primaryStore.path===e){delete De[t.databaseName],xp.forEach(i=>i(t.databaseName));break}}return De}function vp(e,t,r=EN,n,s){let i=new pN.default(e,!1);try{let a=Yo.get(e);a?a.needsDeletion=!1:(a=(0,Ad.open)(i),Yo.set(e,a));let c=new kp(!1),l=a.dbisDb||(a.dbisDb=a.openDB(fS.INTERNAL_DBIS_NAME,c)),u=a.auditStore;u||(n?(0,ps.existsSync)(n)&&(i.path=n,u=(0,Ad.open)(i),u.isLegacy=!0):u=K_(a));let d=eG(r),f=d[_S],m=new Map;for(let{key:p,value:h}of l.getRange({start:!1})){let[E,g]=p.toString().split("/");g===""?g=h.name:g||(g=E,E=t,h.name||(h.name=g,h.indexed=!h.is_hash_attribute)),f?.add(E);let R=m.get(E);R||m.set(E,R={attributes:[]}),(g==null||h.is_hash_attribute)&&(R.primary=h),g!=null&&R.attributes.push(h),Object.defineProperty(h,"key",{value:p,configurable:!0})}for(let[p,h]of m){let{attributes:E,primary:g}=h;if(!g){for(let te of E)if(te.is_hash_attribute||te.isPrimaryKey){g=te;break}if(!g){Cr.warn(`Unable to find a primary key attribute on table ${p}, with attributes: ${JSON.stringify(E)}`);continue}}let R=d[p],S={},y=[],C,I,k=typeof g.audit=="boolean"?g.audit:(0,jt.get)(F.LOGGING_AUDITLOG),J=g.trackDeletes,G=g.expiration,H=g.eviction,X=g.sealed,z=g.splitSegments,de=g.replicate;if(R)S=R.indices,y=R.attributes,R.schemaVersion++;else{C=g.tableId,C?C>=(l.get(yd)||0)&&(l.putSync(yd,C+1),Cr.info(`Updating next table id (it was out of sync) to ${C+1} for ${p}`)):(g.tableId=C=l.get(yd),C||(C=1),Cr.debug("Table {tableName} missing an id, assigning {tableId}"),l.putSync(yd,C+1),l.putSync(g.key,g));let te=new kp(!g.is_hash_attribute,g.is_hash_attribute);if(te.compression=g.compression,te.compression){let ye=(0,jt.get)(F.STORAGE_COMPRESSION_THRESHOLD)||Zq;te.compression.threshold=ye}I=og(a.openDB(g.key,te),a),a.databaseName=r,I.tableId=C}let le;for(let te of E){te.attribute=te.name;try{if(!te.is_hash_attribute&&(te.indexed||te.attribute&&!te.name)){if(!S[te.name]){let Ae=rG(te.key,a,te);S[te.name]=Ae,S[te.name].indexNulls=te.indexNulls}let ye=y.find(Ae=>Ae.name===te.name);ye?y.splice(y.indexOf(ye),1,te):y.push(te),le=!0}}catch(ye){Cr.error("Error trying to update attribute",te,y,S,ye)}}for(let te of y)if(!E.find(Ae=>Ae.name===te.name)){if(te.is_hash_attribute){Cr.error("Unable to remove existing primary key attribute",te);continue}te.indexed&&(y.splice(y.indexOf(te),1),le=!0)}if(R)le&&(R.schemaVersion++,R.updatedAttributes());else{R=tG(d,p,aS({primaryStore:I,auditStore:u,audit:k,sealed:X,splitSegments:z,replicate:de,expirationMS:G&&G*1e3,evictionMS:H&&H*1e3,trackDeletes:J,tableName:p,tableId:C,primaryKey:g.name,databasePath:s?r+"/"+p:r,databaseName:r,indices:S,attributes:E,schemaDefined:g.schemaDefined,dbisDB:l})),R.schemaVersion=1;for(let te of Up)te(R)}}return a}catch(a){throw a.message+=` opening database ${e}`,a}}function eG(e){let t=De[e];if(t||(e==="data"?t=De[e]=Tn:e==="system"?Object.defineProperty(De,"system",{value:t=Object.create(null),configurable:!0}):t=De[e]=Object.create(null)),bd&&!bd.has(e)){let r=new Set;t[_S]=r,bd.set(e,r)}return t}function tG(e,t,r){return e[t]=r,r}function od({database:e,table:t}){e||(e=EN),ct();let r=eG(e),n=(0,Ht.join)((0,jt.getHdbBasePath)(),Yc),s=(0,jt.get)(F.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,jt.get)(F.STORAGE_PATH)||((0,ps.existsSync)(n)?n:(0,Ht.join)((0,jt.getHdbBasePath)(),a_));let a=(0,Ht.join)(n,(i?t:e)+".mdb"),c=Yo.get(a);if(!c||c.status==="closed"){let l=new pN.default(a,!1);c=(0,Ad.open)(l),Yo.set(a,c)}return c.auditStore||(c.auditStore=K_(c)),c}async function lw(e){if(!De[e])throw new Error("Schema does not exist");let t=De[e],r;for(let n in t)r=t[n].primaryStore.rootStore,Yo.delete(r.path),r.status==="open"&&(await r.close(),await Bp.remove(r.path));if(r||(r=od({database:e,table:null}),r.status==="open"&&(await r.close(),await Bp.remove(r.path))),e==="data"){for(let n in Tn)delete Tn[n];delete Tn[_S]}delete De[e],xp.forEach(n=>n(e)),await cA(r)}function rG(e,t,r){let n=r.is_hash_attribute||r.indexed.type&&mN[r.indexed.type]?.useObjectStore,s=new kp(!n,n),i=t.openDB(e,s);if(r.indexed.type){let a=mN[r.indexed.type];a?i.customIndex=new a(i,r.indexed):Cr.error(`The indexing type '${r.indexed.type}' is unknown`)}return i}function et(e){let{table:t,database:r,expiration:n,eviction:s,scanInterval:i,attributes:a,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,schemaDefined:m,origin:p}=e;r||(r=EN);let h=od({database:r,table:t}),E=De[r];Cr.trace(`Defining ${t} in ${r}`);let g=E?.[t];if(h.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let R,S,y;m==null&&(m=!0);let C=new kp(!1);for(let z of a)z.attribute&&!z.name?(z.name=z.attribute,z.indexed=!0):z.attribute=z.name,z.expiresAt&&(z.indexed=!0);let I,k;if(g){if(R=g.primaryKey,g.primaryStore.rootStore.status==="closed")throw new Error(`Can not use a closed data store from ${t} class`);u==null&&(u=g.splitSegments),g.attributes.splice(0,g.attributes.length,...a)}else{let z=h.auditStore;S=a.find(ye=>ye.isPrimaryKey)||{},R=S.name,S.is_hash_attribute=S.isPrimaryKey=!0,S.schemaDefined=m,S.compression=gS(),f&&(S.trackDeletes=!0),c=S.audit=typeof c=="boolean"?c:(0,jt.get)(F.LOGGING_AUDITLOG),n&&(S.expiration=n),s&&(S.eviction=s),u??=!1,S.splitSegments=u,typeof l=="boolean"&&(S.sealed=l),typeof d=="boolean"&&(S.replicate=d),p&&(S.origins?S.origins.includes(p)||S.origins.push(p):S.origins=[p]),Cr.trace(`${t} table loading, opening primary store`);let de=new kp(!1,!0);de.compression=S.compression;let le=t+"/";if(y=h.dbisDb=h.openDB(fS.INTERNAL_DBIS_NAME,C),X(),y.get(le))return k&&k(),Id(),et(e);let te=og(h.openDB(le,de),h);h.databaseName=r,te.tableId=y.get(yd),Cr.trace(`Assigning new table id ${te.tableId} for ${t}`),te.tableId||(te.tableId=1),y.put(yd,te.tableId+1),S.tableId=te.tableId,g=tG(E,t,aS({primaryStore:te,auditStore:z,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:R,tableName:t,tableId:te.tableId,databasePath:r,databaseName:r,indices:{},attributes:a,schemaDefined:m,dbisDB:y})),g.schemaVersion=1,I=!0,y.put(le,S)}let J=g.indices;y=y||(h.dbisDb=h.openDB(fS.INTERNAL_DBIS_NAME,C)),g.dbisDB=y;let G=[];for(let{key:z,value:de}of y.getRange({start:!0})){let[le,te]=z.toString().split("/");if(te===""&&(te=de.name),te){if(le!==t)continue}else continue;let ye=a.find(Ye=>Ye.name===te),Ae=!ye?.indexed&&de.indexed&&!de.isPrimaryKey;if((!ye||Ae)&&(X(),I=!0,ye||y.remove(z),Ae)){let Ye=g.indices[le];Ye&&G.push(Ye)}}let H=[];try{for(let z of a||[]){if((z.relationship||z.computed)&&(I=!0,z.relationship))continue;let de=t+"/"+(z.name||"");Object.defineProperty(z,"key",{value:de,configurable:!0});let le=y.get(de);if(z.isPrimaryKey){if(le=le||y.get(de=t+"/")||{},c!==void 0&&c!==g.audit||l!==void 0&&l!==g.sealed||d!==void 0&&d!==g.replicate||(+n||void 0)!==(+le.expiration||void 0)||(+s||void 0)!==(+le.eviction||void 0)||z.type!==le.type){let ye={...le};typeof c=="boolean"&&(c&&g.enableAuditing(c),ye.audit=c),n&&(ye.expiration=+n),s&&(ye.eviction=+s),l!==void 0&&(ye.sealed=l),d!==void 0&&(ye.replicate=d),z.type&&(ye.type=z.type),I=!0,X(),y.put(de,ye)}continue}le?.attribute&&!le.name&&(le.indexed=!0);let te=!le||le.type!==z.type||JSON.stringify(le.indexed)!==JSON.stringify(z.indexed)||le.nullable!==z.nullable||le.version!==z.version||JSON.stringify(le.properties)!==JSON.stringify(z.properties)||JSON.stringify(le.elements)!==JSON.stringify(z.elements);if(z.indexed){let ye=rG(de,h,z);(te||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<Fp.workerData?.restartNumber)&&(I=!0,X(),le=y.get(de),(te||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<Fp.workerData?.restartNumber)&&(I=!0,z.indexNulls===void 0&&(z.indexNulls=!0),g.primaryStore.getStats().entryCount>0&&(z.lastIndexedKey=le?.lastIndexedKey??void 0,z.indexingPID=process.pid,ye.isIndexing=!0,Object.defineProperty(z,"dbi",{value:ye}),H.push(z))),y.put(de,z)),le?.indexNulls&&z.indexNulls===void 0&&(z.indexNulls=!0),ye.indexNulls=z.indexNulls,J[z.name]=ye}else te&&(I=!0,X(),y.put(de,z))}}finally{k&&k()}if(I&&(g.schemaVersion++,g.updatedAttributes()),Cr.trace(`${t} table loading, running index`),H.length>0||G.length>0?g.indexingOperation=Wae(g,H,G):I&&mS.signalSchemaChange(new pS.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=p,I)for(let z of Up)z(g,p!=="cluster");return(n||s||i)&&g.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),Cr.trace(`${t} table loaded`),g;function X(){k||h.transactionSync(()=>({then(z){k=z}}))}o(X,"startTxn")}async function Wae(e,t,r){try{Cr.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await mS.signalSchemaChange(new pS.SchemaEventMsg(process.pid,"schema-change",e.databaseName,e.tableName));let s;for(let u of r)s=u.drop();let i,a={},c=0,l=t.length;if(await new Promise(u=>setImmediate(u)),l>0){let u;for(let f of t)(0,Ad.compareKeys)(f.lastIndexedKey,u)<0&&(u=f.lastIndexedKey),f.lastIndexedKey==null&&f.dbi.clearAsync();let d=0;for(let{key:f,value:m,version:p}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(m){if(d++,s=e.primaryStore.ifVersion(f,p,()=>{for(let h=0;h<l;h++){let E=t[h],g=E.name,R=E.dbi;try{let S=E.resolve,y=m&&(S?S(m):m[g]);if(R.customIndex){R.customIndex.index(f,y);continue}let C=(0,Qq.getIndexedValues)(y);if(C)for(let I=0,k=C.length;I<k;I++)R.put(C[I],f)}catch(S){a[g]||(a[g]=!0,Cr.error(`Error indexing attribute ${g}`,S))}}}),s.then(()=>d--,h=>{d--,Cr.error(h)}),Fp.workerData&&Fp.workerData.restartNumber!==Xq.restartNumber&&(i=!0),++c%100===0||i){for(let h of t)h.lastIndexedKey=f,e.dbisDB.put(h.key,h);if(i)return}d>Kae?await s:d>Yae&&await new Promise(h=>setImmediate(h))}for(let f of t)delete f.lastIndexedKey,delete f.indexingPID,f.dbi.isIndexing=!1,s=e.dbisDB.put(f.key,f)}await s,await mS.signalSchemaChange(new pS.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),Cr.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){Cr.error("Error in indexing",n)}}function zae({table:e,database:t}){let r=od({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 Dl(e){return Up.push(e),{remove(){let t=Up.indexOf(e);t>-1&&Up.splice(t,1)}}}function Hp(e){return xp.push(e),{remove(){let t=xp.indexOf(e);t>-1&&xp.splice(t,1)}}}function gS(){let e=(0,jt.get)(F.STORAGE_COMPRESSION),t=(0,jt.get)(F.STORAGE_COMPRESSION_DICTIONARY),r=(0,jt.get)(F.STORAGE_COMPRESSION_THRESHOLD)||Zq,n={startingOffset:32};return t&&(n.dictionary=Bp.readFileSync(t)),r&&(n.threshold=r),e&&n}var jt,fS,Ad,Ht,ps,Rd,pN,Bp,hN,Qq,mS,pS,Fp,Jq,Xq,ES,$ae,Cr,EN,_S,Zq,dS,Tn,De,yd,Up,xp,hS,Yo,bd,Kae,Yae,we=se(()=>{jt=b(ce()),fS=b(Wt()),Ad=require("lmdb"),Ht=require("path"),ps=require("fs"),Rd=b(bt());dg();pN=b(jm());q();Bp=b(require("fs-extra")),hN=b(oi()),Qq=b(Mn()),mS=b(qo()),pS=b(is()),Fp=require("worker_threads"),Jq=b(Q()),Xq=b(Ze());Hi();sl();es();jq();ES=b(zm()),{forComponent:$ae}=Jq.default;o(kp,"OpenDBIObject");Cr=$ae("storage"),EN="data",_S=Symbol("defined-tables"),Zq=((0,jt.get)(F.STORAGE_PAGESIZE)||4096)-60;(0,jt.initSync)();dS=["hdb_temp","hdb_certificate","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_info"],Tn=Object.create(null),De=Object.create(null);(0,hN._assignPackageExport)("databases",De);(0,hN._assignPackageExport)("tables",Tn);yd=Symbol.for("next-table-id"),Up=[],xp=[],Yo=new Map;o(Vae,"getTables");o(ct,"getDatabases");o(Id,"resetDatabases");o(vp,"readMetaDb");o(eG,"ensureDB");o(tG,"setTable");o(od,"database");o(lw,"dropDatabase");o(rG,"openIndex");o(et,"table");Kae=1e3,Yae=10;o(Wae,"runIndexing");o(zae,"dropTableMeta");o(Dl,"onUpdatedTable");o(Hp,"onRemovedDB");o(gS,"getDefaultCompression")});var SN={};Re(SN,{loadGQLSchema:()=>Jae,start:()=>gN,startOnMainThread:()=>Qae});function gN({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r,n,s,i){let{parse:a,Source:c,Kind:l,NamedTypeNode:u,StringValueNode:d}=await import("graphql"),f=a(new c(r.toString(),s)),m=new Map,p=[],h;for(let R of f.definitions)switch(R.kind){case l.OBJECT_TYPE_DEFINITION:let k=function(G){if(G.kind==="NonNullType"){let z=k(G.type);return z.nullable=!1,z}if(G.kind==="ListType")return{type:"array",elements:k(G.type)};let X={type:G.name?.value};return Object.defineProperty(X,"location",{value:G.loc.startToken}),X};o(k,"getProperty");let S=R.name.value,y=[],C={table:null,database:null,properties:y};m.set(S,C),i.allTypes.set(S,C);for(let G of R.directives){if(G.name.value==="table"){for(let X of G.arguments)C[X.name.value]=X.value.value;C.schema&&(C.database=C.schema),C.table||(C.table=S),C.audit&&(C.audit=C.audit!=="false"),C.attributes=C.properties,p.push(C)}if(G.name.value==="sealed"&&(C.sealed=!0),G.name.value==="splitSegments"&&(C.splitSegments=!0),G.name.value==="replicate"&&(C.replicate=!0),G.name.value==="export"){C.export=!0;for(let X of G.arguments)typeof C.export!="object"&&(C.export={}),C.export[X.name.value]=X.value.value}}let I=!1,J={};for(let G of R.fields){let H=k(G.type);H.name=G.name.value,y.push(H),J[H.name]=void 0;for(let X of G.directives){let z=X.name.value;if(z==="primaryKey")I?console.warn("Can not define two attributes as a primary key at",X.loc):(H.isPrimaryKey=!0,I=!0);else if(z==="indexed"){let de={};for(let le of X.arguments||[])de[le.name.value]=le.value.value;H.indexed=de}else if(z==="computed"){for(let de of X.arguments||[])if(de.name.value==="from"){let le=de.value.value;H.computed={from:g(le,de,J)},H.version==null&&(H.version=le)}else de.name.value==="version"&&(H.version=de.value.value);H.computed=H.computed||!0}else if(z==="relationship"){let de={};for(let le of X.arguments)de[le.name.value]=le.value.value;H.relationship=de}else if(z==="createdTime")H.assignCreatedTime=!0;else if(z==="updatedTime")H.assignUpdatedTime=!0;else if(z==="expiresAt")H.expiresAt=!0;else if(z==="allow"){let de=H.authorizedRoles=[];for(let le of X.arguments)le.name.value==="role"&&de.push(le.value.value)}else server.knownGraphQLDirectives.includes(z)&&console.warn(`@${z} is an unknown directive, at`,X.loc)}}C.type=S,S==="Query"&&(h=C)}function E(R){let S=m.get(R.type);S?(Object.defineProperty(R,"properties",{value:S.properties}),Object.defineProperty(R,"definition",{value:S})):R.type==="array"?E(R.elements):jae.includes(R.type)||(0,sG.getWorkerIndex)()===0&&console.error(`The type ${R.type} is unknown at line ${R.location.line}, column ${R.location.column}, in ${s}`)}o(E,"connectPropertyType");for(let R of m.values())for(let S of R.properties)E(S);for(let R of p)R.tableClass=e(R),R.export&&(R.export.name===""?i.set((0,_N.dirname)(n),R.tableClass):i.set((0,_N.dirname)(n)+"/"+(R.export.name||R.type),R.tableClass,R.export));function g(R,S,y){return new nG.Script(`function computed(attributes) { return function(record) { with(attributes) { with (record) { return ${R}; } } } } computed;`,{filename:s,lineOffset:S.loc.startToken.line-1,columnOffset:S.loc.startToken.column}).runInThisContext()(y)}o(g,"createComputedFrom")}}var _N,nG,sG,jae,Qae,Jae,iG=se(()=>{_N=require("path"),nG=require("node:vm");we();sG=b(Ze());$a();jae=["ID","Int","Float","Long","String","Boolean","Date","Bytes","Any","BigInt","Blob"];server.knownGraphQLDirectives&&(server.knownGraphQLDirectives=["table","sealed","export","primaryKey","indexed","computed","relationship","createdTime","updatedTime","expiresAt","allow"]);o(gN,"start");Qae=gN,Jae=o(e=>gN({ensureTable:et}).handleFile(e,null,null,new zu),"loadGQLSchema")});var yN={};Re(yN,{start:()=>oce});function Xae(e){if(e.kind!==He.Kind.OPERATION_DEFINITION&&e.kind!==He.Kind.FRAGMENT_DEFINITION)throw new $r(`Unexpected non-executable definition type ${e.kind}.`)}function oG(e){if(typeof e!="object"||e===null)throw new io("Request body must be an object.");if(!("query"in e))throw new io("Request body must contain a `query` field.");if(typeof e.query!="string")throw new io("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new io("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new io("Request body `operationName` field must be a string.")}function TN(e){return parseInt(e.value,10)}function cG(e){return parseFloat(e.value)}function lG(e,t,r){let n=r.get(e.name.value);return uG(n)?dG(n,t):{attribute:t,value:n}}function uG(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function dG(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],uG(n)?dG(n,t):{attribute:t,value:n}))}function Zae(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case He.Kind.NULL:return{attribute:t,value:null};case He.Kind.INT:return{attribute:t,value:TN(e.value)};case He.Kind.FLOAT:return{attribute:t,value:cG(e.value)};case He.Kind.BOOLEAN:case He.Kind.STRING:return{attribute:t,value:e.value.value};case He.Kind.VARIABLE:return lG(e.value,t,r);case He.Kind.OBJECT:return fG(e.value,t,r);case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Value type, ${e.value.kind}, is not supported.`)}}function fG(e,t,r){return e.fields.flatMap(n=>Zae(n,t,r))}function ece(e,t){switch(e.value.kind){case He.Kind.NULL:return{attribute:e.name.value,value:null};case He.Kind.INT:return{attribute:e.name.value,value:TN(e.value)};case He.Kind.FLOAT:return{attribute:e.name.value,value:cG(e.value)};case He.Kind.BOOLEAN:case He.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case He.Kind.VARIABLE:return lG(e.value,e.name.value,t);case He.Kind.OBJECT:return fG(e.value,[e.name.value],t);case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Argument type, ${e.value.kind}, is not supported.`)}}function tce(e,t){return e.flatMap(r=>ece(r,t))}function SS(e,t){return e.selections.flatMap(r=>{switch(r.kind){case He.Kind.FIELD:return r;case He.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new $r(`Fragment \`${n}\` not found.`);return SS(s.selectionSet,t)}case He.Kind.INLINE_FRAGMENT:return SS(r.selectionSet,t)}})}function mG(e,t){return SS(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:mG(r.selectionSet,t)}:r.name.value)}async function rce(e,t,r,n){let s=vs.getMatch(e.name.value,"graphql");if(s===void 0)throw new $r(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,a={select:mG(e.selectionSet,r),conditions:tce(e.arguments,t)},c=[];n.authorize=!0;for await(let l of i.search(a,n))c.push(l);return[e.name.value,c]}function pG(e){switch(e.kind){case He.Kind.NULL:return null;case He.Kind.INT:return TN(e);case He.Kind.FLOAT:return parseFloat(e.value);case He.Kind.STRING:case He.Kind.BOOLEAN:return e.value;case He.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:pG(r.value),...t}),{});case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Value type, ${e.kind}, is not supported.`)}}function nce(e,t){let r=new Map;for(let n of e){let s=n.variable.name.value,i=t?.[s];if(i===void 0&&n.defaultValue!==void 0&&(i=pG(n.defaultValue)),n.type.kind===He.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new $r(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function sce(e,t,r,n){if(e.operation===He.OperationTypeNode.SUBSCRIPTION)throw new $r("Subscriptions are not supported.");if(e.operation===He.OperationTypeNode.MUTATION)throw new $r("Mutations are not supported yet.");let s=nce(e.variableDefinitions,t),i=await Promise.all(SS(e.selectionSet,r).map(c=>rce(c,s,r,n))),a={data:{}};for(let[c,l]of i)a.data[c]=l;return a}async function aG({query:e,variables:t={},operationName:r},n){let s=He.parse(e),i=new Map,a=new Map;for(let u of s.definitions)if(Xae(u),u.kind===He.Kind.FRAGMENT_DEFINITION)a.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new $r("Unnamed operations are only allowed when there is a single operation in the document.");let d=u.name?.value??"Unnamed Query";if(i.has(d))throw new $r(`Duplicate operation definition: ${d}`);i.set(d,u)}let c;if(r==null)if(i.size===1)c=i.entries().next().value[1];else throw new $r("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new $r(`Operation \`${r}\` not found.`);let l=await sce(c,t,a,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function ice(e){switch(e.method){case"GET":{let t=new URLSearchParams(e.url.split("?")[1]),r={};for(let[n,s]of t)r[n]=n==="variables"||n==="extensions"?JSON.parse(s):s;return oG(r),aG(r,e)}case"POST":{let r=await Do(e.headers.get("content-type"),!0)(e._nodeRequest);return oG(r),aG(r,e)}default:throw new io("Method Not Allowed",405,{Allow:"GET, POST"})}}function oce(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await ice(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof io)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof He.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof $r)return{status:200,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};break}default:logger.info(`Unsupported accept header, ${s}, defaulting to application/graphql-response+json`);case"application/graphql-response+json":{if(n instanceof io)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof He.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof $r)return{status:400,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};break}}throw n}},{port:e.port,securePort:e.securePort})}var He,$r,io,hG=se(()=>{He=b(require("graphql"));Mo();$a();o(Xae,"assertExecutableDefinitionNode");o(oG,"assertRequestParams");o(TN,"processIntValueNode");o(cG,"processFloatValueNode");o(lG,"processVariableNode");o(uG,"isObject");o(dG,"transformObjectIntoQueryCondition");o(Zae,"processObjectFieldNode");o(fG,"processObjectValueNode");o(ece,"processArgumentNode");o(tce,"buildConditionsQuery");o(SS,"fillInFragments");o(mG,"buildSelectQuery");o(rce,"processFieldNode");o(pG,"processConstValueNode");o(nce,"resolveVariables");o(sce,"executeOperation");o(aG,"resolver");$r=class extends Error{static{o(this,"GraphQLQueryingError")}},io=class extends Error{static{o(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};o(ice,"graphqlQueryingHandler");o(oce,"start")});var yG=v((vUe,TG)=>{var wd=require("validate.js"),_G=at(),Nd=(q(),M(Y)),{handleHDBError:ace,hdbErrors:cce}=_e(),{HDB_ERROR_MSGS:ir,HTTP_STATUS_CODES:lce}=cce,RN=o(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),uce={STRUCTURE_USER:"structure_user"},EG=Object.values(Nd.ROLE_TYPES_ENUM),dce="attribute_permissions",fce="attribute_name",{PERMS_CRUD_ENUM:Cd}=Nd,mce=[dce,...Object.values(Cd)],gG=[Cd.READ,Cd.INSERT,Cd.UPDATE],pce=[fce,...gG];function hce(e){let t=RN();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,SG(e,t)}o(hce,"addRoleValidation");function Ece(e){let t=RN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,SG(e,t)}o(Ece,"alterRoleValidation");function _ce(e){let t=RN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,_G.validateObject(e,t)}o(_ce,"dropRoleValidation");var gce=["operation","role","id","permission","hdb_user","access"];function SG(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let a=0,c=n.length;a<c;a++)gce.includes(n[a])||s.push(n[a]);s.length>0&&hr(ir.INVALID_ROLE_JSON_KEYS(s),r);let i=_G.validateObject(e,t);if(i&&i.message.split(",").forEach(a=>{hr(a,r)}),e.permission){let a=Sce(e);a&&hr(a,r),EG.forEach(c=>{e.permission[c]&&!wd.isBoolean(e.permission[c])&&hr(ir.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let a in e.permission)if(EG.indexOf(a)<0){if(a===uce.STRUCTURE_USER){let l=e.permission[a];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,d=l.length;u<d;u++){let f=l[u];global.hdb_schema[f]||hr(ir.SCHEMA_NOT_FOUND(f),r)}continue}hr(ir.STRUCTURE_USER_ROLE_TYPE_ERROR(a),r);continue}let c=e.permission[a];if(!a||!global.hdb_schema[a]){hr(ir.SCHEMA_NOT_FOUND(a),r);continue}if(c.tables)for(let l in c.tables){let u=c.tables[l];if(!l||!global.hdb_schema[a][l]){hr(ir.TABLE_NOT_FOUND(a,l),r);continue}if(Object.keys(u).forEach(d=>{mce.includes(d)||hr(ir.INVALID_PERM_KEY(d),r,a,l)}),Object.values(Cd).forEach(d=>{wd.isDefined(u[d])?wd.isBoolean(u[d])||hr(ir.TABLE_PERM_NOT_BOOLEAN(d),r,a,l):hr(ir.TABLE_PERM_MISSING(d),r,a,l)}),u.attribute_permissions===void 0){hr(ir.ATTR_PERMS_ARRAY_MISSING,r,a,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){hr(ir.ATTR_PERMS_NOT_ARRAY,r,a,l);continue}if(u.attribute_permissions){let d=global.hdb_schema[a][l].attributes.map(({attribute:m})=>m),f={read:!1,insert:!1,update:!1};for(let m in u.attribute_permissions){let p=u.attribute_permissions[m];if(Object.keys(p).forEach(E=>{!pce.includes(E)&&E!==Cd.DELETE&&hr(ir.INVALID_ATTR_PERM_KEY(E),r,a,l)}),!wd.isDefined(p.attribute_name)){hr(ir.ATTR_PERM_MISSING_NAME,r,a,l);continue}let h=p.attribute_name;if(!d.includes(h)){hr(ir.INVALID_ATTRIBUTE_IN_PERMS(h),r,a,l);continue}gG.forEach(E=>{wd.isDefined(p[E])?wd.isBoolean(p[E])||hr(ir.ATTR_PERM_NOT_BOOLEAN(E,h),r,a,l):hr(ir.ATTR_PERM_MISSING(E,h),r,a,l)}),!f.read&&p.read===!0&&(f.read=!0),!f.insert&&p.insert===!0&&(f.insert=!0),!f.update&&p.update===!0&&(f.update=!0)}if(u.read===!1&&f.read===!0||u.insert===!1&&f.insert===!0||u.update===!1&&f.update===!0){let m=`${a}.${l}`;hr(ir.MISMATCHED_TABLE_ATTR_PERMS(m),r,a,l)}}}}return Tce(r)}o(SG,"customValidate");TG.exports={addRoleValidation:hce,alterRoleValidation:Ece,dropRoleValidation:_ce};function Sce(e){let{operation:t,permission:r}=e;if(t===Nd.OPERATIONS_ENUM.ADD_ROLE||t===Nd.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 ir.SU_CU_ROLE_COMBINED_ERROR;{let a=r.super_user?Nd.ROLE_TYPES_ENUM.SUPER_USER:Nd.ROLE_TYPES_ENUM.CLUSTER_USER;return ir.SU_CU_ROLE_NO_PERMS_ALLOWED(a)}}}return null}o(Sce,"validateNoSUPerms");function Tce(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:ir.ROLE_PERMS_ERROR,...e};return ace(new Error,n,lce.BAD_REQUEST)}else return null}o(Tce,"generateRolePermResponse");function hr(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]}}o(hr,"addPermError")});var Gp=v((BUe,IG)=>{"use strict";var RG=pn(),bG=En(),yce=Qa(),AN=yG(),IN=qo(),xUe=require("uuid").v4,Rce=require("util"),TS=(q(),M(Y)),bce=oe(),wN=bG.searchByValue,Ace=bG.searchByHash,Ice=Rce.promisify(yce.delete),wce=di(),Nce=rd(),{hdbErrors:Cce,handleHDBError:Ml}=_e(),{HDB_ERROR_MSGS:AG,HTTP_STATUS_CODES:qp}=Cce,{UserEventMsg:NN}=is();IG.exports={addRole:Oce,alterRole:Pce,dropRole:Lce,listRoles:Dce};function bN(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}o(bN,"scrubRoleDetails");async function Oce(e){let t=AN.addRoleValidation(e);if(t)throw t;e=bN(e);let r={schema:"system",table:"hdb_role",attribute:"role",value:e.role,hash_attribute:"id",get_attributes:["*"]},n;try{n=Array.from(await wN(r)||[])}catch(i){throw Ml(i)}if(n&&n.length>0)throw Ml(new Error,AG.ROLE_ALREADY_EXISTS(e.role),qp.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 RG.insert(s),IN.signalUserChange(new NN(process.pid)),e=bN(e),e}o(Oce,"addRole");async function Pce(e){let t=AN.alterRoleValidation(e);if(t)throw t;e=bN(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await RG.update(r)}catch(s){throw Ml(s)}if(n&&n?.message==="updated 0 of 1 records")throw Ml(new Error,"Invalid role id",qp.BAD_REQUEST,void 0,void 0,!0);return await IN.signalUserChange(new NN(process.pid)),e}o(Pce,"alterRole");async function Lce(e){let t=AN.dropRoleValidation(e);if(t)throw Ml(new Error,t,qp.BAD_REQUEST,void 0,void 0,!0);let r=new Nce(TS.SYSTEM_SCHEMA_NAME,TS.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Ace(r));if(n.length===0)throw Ml(new Error,AG.ROLE_NOT_FOUND,qp.NOT_FOUND,void 0,void 0,!0);let s=new wce(TS.SYSTEM_SCHEMA_NAME,TS.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await wN(s)),a=!1;if(bce.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){a=!0;break}}if(a===!0)throw Ml(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,qp.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Ice(c),IN.signalUserChange(new NN(process.pid)),`${n[0].role} successfully deleted`}o(Lce,"dropRole");async function Dce(){return wN({table:"hdb_role",schema:"system",hash_attribute:"id",attribute:"id",value:"*",get_attributes:["*"]})}o(Dce,"listRoles")});var CN={};Re(CN,{start:()=>CG,startOnMainThread:()=>Uce});function CG({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,wG.parseDocument)(r.toString(),{simpleKeys:!0}).toJSON();for(let s in n){let i=n[s];i.permission||(i={permission:i},i.permission.access&&(i.access=i.permission.access,delete i.permission.access));for(let a in i.permission){if(Mce.includes(a))continue;let c=i.permission[a];c.tables||(i.permission[a]=c={tables:c});for(let l in c.tables){let u=c.tables[l];if(u.read=!!u.read,u.insert=!!u.insert,u.update=!!u.update,u.delete=!!u.delete,u.attributes){let d=[];for(let f in u.attributes){let m=u.attributes[f];m.attribute_name=f,d.push(m)}u.attribute_permissions=d,delete u.attributes}if(u.attribute_permissions){if(!Array.isArray(u.attribute_permissions))throw new Error("attribute_permissions must be an array if defined");for(let d of u.attribute_permissions)d.read=!!d.read,d.insert=!!d.insert,d.update=!!d.update}else u.attribute_permissions=null}}i.role=i.id=s,await vce(i)}}}async function vce(e){let t=ct().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,NG.isEqual)(i,e)?void 0:(e.id=r.id,(0,yS.alterRole)(e))}return(0,yS.addRole)(e)}var yS,wG,NG,Mce,Uce,OG=se(()=>{we();yS=b(Gp()),wG=require("yaml"),NG=require("lodash"),Mce=["super_user","cluster_user","structure_user"];o(CG,"start");o(vce,"ensureRole");Uce=CG});async function RS(e){let t=(0,DG.pathToFileURL)(e).toString();if(xce)return $p||($p=Bce(kce)),(await(await $p).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function Bce(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),$p=new Compartment({console,Math,Date,fetch:Fce,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,LG.extname)(r)||(r+=".js"),r)},importHook:o(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){s.Resource=Hr,s.tables=Tn,s.databases=De}};let n=await(0,PG.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),$p}function Fce(e,t){let r=typeof e=="string"||e.url;if(new URL(r).protocol!="https")throw new Error("Only https is allowed in fetch");return fetch(e,t)}function kce(){return{Resource:Hr,tables:Tn}}var PG,LG,DG,xce,$p,ON=se(()=>{Ga();we();PG=require("fs/promises"),LG=require("path"),DG=require("url"),xce=!1;o(RS,"secureImport");o(Bce,"getCompartment");o(Fce,"secureOnlyFetch");o(kce,"getGlobalVars")});var PN={};Re(PN,{handleApplication:()=>Hce,suppressHandleApplicationWarning:()=>qce});function MG(e){return typeof e=="function"&&("get"in e||"put"in e||"post"in e||"delete"in e)}async function Hce(e){e.handleEntry(t=>{if(t.entryType!=="file"){e.logger.warn(`jsResource plugin cannot handle entry type ${t.entryType}. Modify the 'files' option in ${e.configFilePath} to only include files.`);return}if(t.eventType!=="add"){e.requestRestart();return}RS(t.absolutePath).then(r=>{let n=(0,bS.dirname)(t.urlPath);MG(r.default)&&(e.resources.set(n,r.default),e.logger.debug(`Registered root resource: ${n}`)),vG(e,r,n)}).catch(r=>{e.logger.error(`Failed to load resource module ${t.absolutePath}: ${r}`),e.requestRestart()})})}function vG(e,t,r){for(let n in t){let s=t[n],i=(0,bS.join)(r,n);MG(s)?(e.resources.set(i,s),e.logger.debug(`Registered resource: ${i}`)):typeof s=="object"&&vG(e,s,i)}}var bS,qce,UG=se(()=>{ON();bS=require("path");o(MG,"isResource");o(Hce,"handleApplication");o(vG,"recurseForResources");qce=!0});var DN={};Re(DN,{start:()=>Gce});function Gce({resources:e}){e.set("login",LN),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var LN,xG=se(()=>{Ga();o(Gce,"start");LN=class extends Hr{static{o(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:a}=r;return{data:await n.login(s,i)}}}});function GG(e){let t={openapi:$ce,info:{title:"HarperDB HTTP REST interface",version:HG.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}],n=o(s=>{if(s.type&&!t.components.schemas[s.type]){t.components.schemas[s.type]={};let i={},a=[];for(let c of s.properties)AS[c.type]?i[c.name]=new vN(AS[c.type],c.type):c.properties?(i[c.name]=new $G(c.type),n(c)):c.elements?.properties&&(i[c.name]=new jce(c.elements.type),n(c.elements)),c.nullable===!1&&a.push(c.name);t.components.schemas[s.type]=new kG(i,!s.sealed,a)}},"includeDefinitionInSchema");for(let[,s]of e){if(!s.path||s.Resource.isError)continue;let{path:i}=s,a=i.split("/").pop(),{attributes:c,sealed:l}=s.Resource,{prototype:u,primaryKey:d="id"}=s.Resource;if(!c&&e.allTypes.has(s.path)){let J=e.allTypes.get(s.path);l=J.sealed,c=J.properties}if(!d)continue;let f={},m=[],p=[];if(c)for(let{type:J,name:G,elements:H,relationship:X,definition:z,nullable:de}of c){let le=z??H?.definition;le&&n(le),de===!1&&p.push(G),X?J==="array"?f[G]={type:"array",items:{$ref:qs+H.type}}:f[G]={$ref:qs+J}:le?J==="array"?f[G]={type:"array",items:{$ref:qs+le.type}}:f[G]={$ref:qs+le.type}:J==="array"?H.type==="Any"?f[G]={type:"array",items:{format:H.type}}:f[G]={type:"array",items:new vN(AS[H.type],H.type)}:J==="Any"?f[G]={format:J}:f[G]=new vN(AS[J],J),m.push(new UN(G,"query",f[G]))}let h=Object.keys(f),E=new UN(d,"path",{type:"string",format:"ID"});E.required=!0,E.description="primary key of record";let g=new UN("property","path",{enum:h});g.required=!0,t.components.schemas[a]=new kG(f,!l,p);let R=u.post!==Resource.prototype.post||u.update,S=typeof u.put=="function",y=typeof u.get=="function",C=typeof u.delete=="function",I=typeof u.patch=="function",k="/"+i+"/";R&&(t.paths[k]={},t.paths[k].post=new Vce(a,r,{200:new Od({$ref:qs+a},{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}})},"create a new record auto-assigning a primary key")),y&&(t.paths[k]||(t.paths[k]={}),t.paths[k].get=new MN(m,r,{200:new Od({type:"array",items:{$ref:qs+a}})},"search for records by the specified property name and value pairs")),t.paths[k]||(t.paths[k]={}),t.paths[k].options=new Kce(m,r,{200:new Yce},"retrieve information about the communication options available for a target resource or the server as a whole, without performing any resource action"),C&&(t.paths[k]||(t.paths[k]={}),t.paths[k].delete=new FG(m,r,"delete all the records that match the provided query",{204:new BG})),k="/"+i+"/{"+d+"}",y&&(t.paths[k]={},t.paths[k].get=new MN([E],r,{200:new Od({$ref:qs+a})},"retrieve a record by its primary key")),S&&(t.paths[k]||(t.paths[k]={}),t.paths[k].put=new Wce([E],r,a,{200:new Od({$ref:qs+a})},"create or update the record with the URL path that maps to the record's primary key")),I&&(t.paths[k]||(t.paths[k]={}),t.paths[k].patch=new zce([E],r,a,{200:new Od({$ref:qs+a})},"patch the record with the URL path that maps to the record's primary key")),C&&(t.paths[k]||(t.paths[k]={}),t.paths[k].delete=new FG([E],r,"delete a record with the given primary key",{204:new BG})),y&&g.schema.enum.length>0&&(k="/"+i+"/{"+d+"}.{property}",t.paths[k]={},t.paths[k].get=new MN([E,g],r,{200:new Od({enum:h})},"used to retrieve the specified property of the specified record"))}for(let[,s]of e.allTypes)n(s),s.sealed&&t.components.schemas[s.type].additionalProperties&&(t.components.schemas[s.type].additionalProperties=!1);return t}function Vce(e,t,r,n){this.description=n,this.requestBody={content:{"application/json":{schema:{$ref:qs+e}}}},this.security=t,this.responses=r}function MN(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function Kce(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function Yce(){this.description=qG,this.headers={},this.content={}}function Od(e,t){this.description=qG,this.content={"application/json":{schema:e}},this.headers=t}function BG(){this.description="successfully processed request, no content returned to client"}function Wce(e,t,r,n,s){this.description=s,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:qs+r}}}},this.responses=n}function zce(e,t,r,n,s){this.description=s,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:qs+r}}}},this.responses=n}function FG(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function kG(e,t,r){this.type="object",this.properties=e,this.additionalProperties=t,this.required=r}function vN(e,t){this.type=e,(e==="string"||e==="number"||e==="integer")&&t!=="String"&&(this.format=t)}function $G(e){this.$ref=`#/components/schemas/${e}`}function jce(e){this.type="array",this.items=new $G(e)}function UN(e,t,r){this.name=e,this.in=t,this.schema=r}var HG,$ce,AS,qs,qG,VG=se(()=>{HG=b(Ot()),$ce="3.0.3",AS={Int:"integer",Float:"number",Long:"integer",ID:"string",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer"},qs="#/components/schemas/",qG="successful operation";o(GG,"generateJsonApi");o(Vce,"Post");o(MN,"Get");o(Kce,"Options");o(Yce,"ResponseOptions200");o(Od,"Response200");o(BG,"Response204");o(Wce,"Put");o(zce,"Patch");o(FG,"Delete");o(kG,"ResourceSchema");o(vN,"Type");o($G,"Ref");o(jce,"ArrayRef");o(UN,"Parameter")});var YG={};Re(YG,{Request:()=>sc,createReuseportFd:()=>IS});var KG,sc,xN,BN,IS,Vp=se(()=>{KG=require("os"),sc=class{static{o(this,"Request")}#e;#t;_nodeRequest;_nodeResponse;method;url;headers;isWebSocket;user;constructor(t,r){this.method=t.method;let n=t.url;this._nodeRequest=t,this._nodeResponse=r,this.url=n,this.headers=new BN(t.headers)}get absoluteURL(){return this.protocol+"://"+this.host+this.url}get pathname(){let t=this.url.indexOf("?");return t>-1?this.url.slice(0,t):this.url}set pathname(t){let r=this.url.indexOf("?");r>-1?this.url=t+this.url.slice(r):this.url=t}get protocol(){return this._nodeRequest.socket.encrypted?"https":"http"}get ip(){return this._nodeRequest.socket.remoteAddress}get authorized(){return this._nodeRequest.socket.authorized}get peerCertificate(){return this.#t===void 0&&(this.#t=this._nodeRequest.socket.getPeerCertificate?.(!0)||null),this.#t}get mtlsConfig(){return this._nodeRequest.socket.server.mtlsConfig}get body(){return this.#e||(this.#e=new xN(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get httpVersion(){return this._nodeRequest.httpVersion}get isAborted(){return!1}get nodeRequest(){return this._nodeRequest}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},xN=class{static{o(this,"RequestBody")}#e;constructor(t){this.#e=t}on(t,r){return this.#e.on(t,r),this}pipe(t,r){return this.#e.pipe(t,r)}},BN=class{static{o(this,"Headers")}asObject;constructor(t){this.asObject=t}set(t,r){this.asObject[t.toLowerCase()]=r}get(t){return this.asObject[t.toLowerCase()]}has(t){return Object.prototype.hasOwnProperty.call(this.asObject,t.toLowerCase())}[Symbol.iterator](){return Object.entries(this.asObject)[Symbol.iterator]()}keys(){return Object.keys(this.asObject)}values(){return Object.values(this.asObject)}delete(t){delete this.asObject[t.toLowerCase()]}forEach(t){for(let[r,n]of this)t(n,r,this)}};(0,KG.platform)()!="win32"&&(IS=require("node-unix-socket").createReuseportFd)});var NS={};Re(NS,{parseHeaderValue:()=>kN,start:()=>Xce});async function Jce(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&lg(e);let i=new Fs;try{e.responseHeaders=i;let a=e.url.slice(1),c,l;if(a!==WG){let g=wS.getMatch(a,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new ci(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=kN(g);for(let S of R)switch(S.name){case"max-age":e.expiresAt=S.value*1e3+Date.now();break;case"only-if-cached":e.onlyIfCached=!0;break;case"no-cache":e.noCache=!0;break;case"no-store":e.noCacheStore=!0;break;case"stale-if-error":e.staleIfError=!0;break;case"must-revalidate":e.mustRevalidate=!0;break}}}let u=r["x-replicate-to"];if(u){let g=kN(u).map(R=>(R.next?.name==="confirm"&&R.next.value>=0&&(e.replicatedConfirmation=+R.next.value),R.name));e.replicateTo=g.length===1&&+g[0]>=0?+g[0]:g[0]==="*"?void 0:g}r["x-replicate-from"]==="none"&&(e.replicateFrom=!1);let f=await At(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=Do(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new Pd.ClientError(g,400)}if(e.authorize=!0,a===WG&&s==="GET"){if(e?.user?.role?.permission?.super_user)return GG(wS);throw new Pd.ServerError("Forbidden",403)}switch(c.checkPermission=e.user?.role?.permission??{},s){case"GET":case"HEAD":return l.get(c,e);case"POST":return l.post(c,e.data,e);case"PUT":return l.put(c,e.data,e);case"DELETE":return l.delete(c,e);case"PATCH":return l.patch(c,e.data,e);case"OPTIONS":i.setIfNone("Allow","GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE");return;case"CONNECT":return l.connect(c,null,e);case"TRACE":return"HarperDB is the terminating server";case"QUERY":return l.query(c,e.data,e);case"COPY":return l.copy(c,r.destination,e);case"MOVE":return l.move(c,r.destination,e);case"BREW":throw new Pd.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Pd.ServerError(`Method ${s} is not recognized`,501)}}),m=200,p=e.lastModified;if(f==null)m=s==="GET"||s==="HEAD"?404:204,FN.lastModified&&isFinite(p)&&i.setIfNone("Last-Modified",new Date(p).toUTCString());else if(f.status>0&&f.headers){let g=Pq(f.headers,i);return f.headers!==g&&(f.headers=g),f.data!==void 0&&(f.body=Cm(f.data,e,f)),f}else if(isFinite(p)){Qce[0]=p;let g=String.fromCharCode(34,(rn[0]&63)+62,(rn[0]>>6)+(rn[1]<<2&63)+62,(rn[1]>>4)+(rn[2]<<4&63)+62,(rn[2]>>2)+62,(rn[3]&63)+62,(rn[3]>>6)+(rn[4]<<2&63)+62,(rn[4]>>4)+(rn[5]<<4&63)+62,(rn[5]>>2)+62,(rn[6]&63)+62,(rn[6]>>6)+(rn[7]<<2&63)+62,34),R=r["if-none-match"];R&&g==R?(f?.onDone&&f.onDone(),m=304,f=void 0):i.setIfNone("ETag",g),FN.lastModified&&i.setIfNone("Last-Modified",new Date(p).toUTCString())}e.createdResource&&(m=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let h={status:m,headers:i,body:void 0},E=e.loadedFromSource??f?.wasLoadedFromSource?.();return E!==void 0&&(h.wasCacheMiss=E,!E&&isFinite(p)&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||p))/1e3))),f!==void 0&&(h.body=Cm(f,e,h),s==="HEAD"&&(h.body=void 0)),h}catch(a){a.statusCode?a.statusCode===500?_i.warn(a):_i.info(a):_i.error(a),a.statusCode===405&&(a.method&&(a.message+=` to handle HTTP method ${a.method.toUpperCase()||""}`),a.allow&&(a.allow.push("trace","head","options"),i.setIfNone("Allow",a.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:a.statusCode||500,headers:i,body:void 0};return c.body=Cm(a.contentType?a:QG(a),e,c),c}}function Xce(e){FN=e,e.includeExpensiveRecordCountEstimates&&(sc.prototype.includeExpensiveRecordCountEstimates=!0),!zG&&(zG=!0,wS=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return Jce(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{Kp++;let s=new Xn;jG||(jG=!0,$m(l=>{Kp>0&&l.push({metric:"ws-connections",connections:Kp,byThread:!0})}));let i;t.on("error",l=>{i=!0,_i.warn(l)});let a;t.on("message",o(function(u){a||(a=Do(r.requestedContentType??r.headers.asObject["content-type"],!1));let d=a(u);Ve(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(d)},"message"));let c;t.on("close",()=>{Kp--,Zr(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=wS.getMatch(l,"ws");if(Zr(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,Ve(h=>({count:h.count,total:Kp}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let d=new ci(u.relativeURL);d.checkPermission=r.user?.role?.permission??{};let f=u.Resource;c=(await At(r,()=>f.connect(d,s,r)))[Symbol.asyncIterator]();let p;for(;!(p=await c.next()).done;){let h=await Lo(p.value,r);t.send(h),Ve(h.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(E=>t._socket.once("drain",E))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?_i.warn(l):_i.info(l):_i.error(l),t.close(Zce[l.statusCode]||1011,QG(l))}t.close()},e))}function kN(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,a]=s.trim().split("=");i=i.trim(),a&&(a=a.trim()),r={name:i.toLowerCase(),value:a,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var _i,Pd,QG,rn,Qce,FN,WG,zG,wS,jG,Kp,Zce,JG=se(()=>{Mo();ts();_i=b(Q()),Pd=b(_e());ug();Ou();Ua();Pp();VG();Vp();fg();({errorToString:QG}=_i),rn=new Uint8Array(8),Qce=new Float64Array(rn.buffer,0,1),FN={},WG="openapi";o(Jce,"http");Kp=0;o(Xce,"start");Zce={401:3e3,403:3003};o(kN,"parseHeaderValue")});var HN=v((lxe,ZG)=>{var{recordAction:CS,recordActionBinary:XG}=(ts(),M(tg)),ele=require("fastify-plugin"),tle=200;ZG.exports=ele(function(e,t,r){e.addHook("onResponse",async(n,s)=>{let i=s.elapsedTime}),e.addHook("onSend",async(n,s,i)=>{let a=s.elapsedTime,c=performance.now(),l=s.request.routeOptions,u,d,f;l.config?.isOperation?(u=n.body?.operation,d="operation"):(u=l.url,d="fastify-route",f=l.method),CS(a,"duration",u,f,d),XG(s.raw.statusCode<400,"success",u,f,d),XG(1,"response_"+s.raw.statusCode,u,f,d);let m=tle;i?.pipe?(i.on("data",g=>{m+=g.length}),i.on("end",()=>{CS(performance.now()-c,"transfer",u,f,d),CS(m,"bytes-sent",u,f,d)})):(m+=i?.length||0,CS(m,"bytes-sent",u,f,d));let p=a.toFixed(3),h=s.getHeader("Server-Timing"),E=`db;dur=${p}`;s.header("Server-Timing",h?`${h}, ${E}`:E)}),r()},{name:"hdb-request-time"})});var t$=v((uxe,e$)=>{var rle=at(),nle={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};e$.exports=function(e){return rle.validateObject(e,nle)}});var Yp=v((dxe,r$)=>{"use strict";var sle=(q(),M(Y)).OPERATIONS_ENUM,qN=class{static{o(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=sle.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};r$.exports=qN});var jp={};Re(jp,{createTokens:()=>VN,getJWTRSAKeys:()=>MS,refreshOperationToken:()=>KN,validateOperationToken:()=>YN,validateRefreshToken:()=>vS});async function MS(){if(OS)return OS;try{let e=Wp.default.join(zp.default.getHdbBasePath(),Cb),t=await PS.default.readFile(Wp.default.join(e,dm.JWT_PASSPHRASE_NAME),"utf8"),r=await PS.default.readFile(Wp.default.join(e,dm.JWT_PRIVATE_KEY_NAME),"utf8");return OS={publicKey:await PS.default.readFile(Wp.default.join(e,dm.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},OS}catch(e){throw DS.default.error(e),new gi.ClientError(Dd.NO_ENCRYPTION_KEYS,Ld.INTERNAL_SERVER_ERROR)}}async function VN(e){let t=(0,GN.validateBySchema)(e,oo.default.object({username:oo.default.string().optional(),password:oo.default.string().optional(),role:oo.default.string().optional(),expires_in:oo.default.alternatives(oo.default.string(),oo.default.number()).optional()}));if(t)throw new gi.ClientError(t.message);let r;try{let f=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,f=!1),r=await(0,$N.findAndValidateUser)(e.username,e.password,f)}catch(f){throw DS.default.error(f),new gi.ClientError(Dd.INVALID_CREDENTIALS,Ld.UNAUTHORIZED)}if(!r)throw new gi.ClientError(Dd.INVALID_CREDENTIALS,Ld.UNAUTHORIZED);let n=!1,s=!1;r.role?.permission&&(n=r.role.permission.super_user===!0,s=r.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s};e.role&&(i.role=e.role);let a=await MS(),c=await Md.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:e.expires_in??a$,algorithm:LS,subject:vd.OPERATION}),l=await Md.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:ile,algorithm:LS,subject:vd.REFRESH}),u=yw(l,qr.SHA256);if((await(0,n$.update)(new s$.default(lm,wu.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new gi.ClientError(Dd.REFRESH_TOKEN_SAVE_FAILED,Ld.INTERNAL_SERVER_ERROR);return i$.default.signalUserChange(new o$.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function KN(e){let t=(0,GN.validateBySchema)(e,oo.default.object({refresh_token:oo.default.string().required()}).required());if(t)throw new gi.ClientError(t.message);let{refresh_token:r}=e;await vS(r);let n=await MS(),s=await Md.default.decode(r);return{operation_token:await Md.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:a$,algorithm:LS,subject:vd.OPERATION})}}async function YN(e){return c$(e,vd.OPERATION)}async function vS(e){return c$(e,vd.REFRESH)}async function c$(e,t){try{let r=await MS(),n=await Md.default.verify(e,r.publicKey,{algorithms:LS,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,$N.findAndValidateUser)(n.username,void 0,!1);if(t===vd.REFRESH&&!Rw(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw DS.default.warn(r),r?.name==="TokenExpiredError"?new gi.ClientError(Dd.TOKEN_EXPIRED,Ld.FORBIDDEN):new gi.ClientError(Dd.INVALID_TOKEN,Ld.UNAUTHORIZED)}}var Md,PS,Wp,oo,GN,gi,DS,$N,n$,s$,i$,o$,zp,Ld,Dd,a$,ile,LS,vd,OS,Ud=se(()=>{Md=b(require("jsonwebtoken")),PS=b(require("fs-extra")),Wp=b(require("node:path")),oo=b(require("joi")),GN=b(at());q();gi=b(_e()),DS=b(Q());Aw();$N=b(fs()),n$=b(pn()),s$=b(Yp()),i$=b(qo()),o$=b(is()),zp=b(ce()),{HTTP_STATUS_CODES:Ld,AUTHENTICATION_ERROR_MSGS:Dd}=gi.hdbErrors;zp.default.initSync();a$=zp.default.get(F.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",ile=zp.default.get(F.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",LS="RS256",vd={OPERATION:"operation",REFRESH:"refresh"};o(MS,"getJWTRSAKeys");o(VN,"createTokens");o(KN,"refreshOperationToken");o(YN,"validateOperationToken");o(vS,"validateRefreshToken");o(c$,"validateToken")});var WN=v((Exe,d$)=>{"use strict";var ole=t$(),xd=require("passport"),ale=require("passport-local").Strategy,cle=require("passport-http").BasicStrategy,lle=require("util"),ule=fs(),u$=lle.callbackify(ule.findAndValidateUser),hxe=zr(),dle=(q(),M(Y)),l$=(Ud(),M(jp));xd.use(new ale(function(e,t,r){u$(e,t,r)}));xd.use(new cle(function(e,t,r){u$(e,t,r)}));xd.serializeUser(function(e,t){t(null,e)});xd.deserializeUser(function(e,t){t(null,e)});function fle(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let a=e.headers.authorization.split(" ");n=a[0],s=a[1]}function i(a,c){return a?r(a):c?r(null,c):r("Must login")}switch(o(i,"handleResponse"),n){case"Basic":xd.authenticate("basic",{session:!1},(a,c)=>{i(a,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===dle.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?l$.validateRefreshToken(s).then(a=>{e.body.refresh_token=s,r(null,a)}).catch(a=>{r(a)}):l$.validateOperationToken(s).then(a=>{r(null,a)}).catch(a=>{r(a)});break;default:xd.authenticate("local",{session:!1},function(a,c){i(a,c)})(e,t,r);break}}o(fle,"authorize");function mle(e,t){let r=ole(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 a=i[e.schema].tables[e.table].attribute_permissions;for(let c in a)e.attributes.indexOf(a[c].attribute_name)>-1&&!a[c][e.operation]&&(n.authorized=!1,n.messages.push(`Not authorized to ${e.operation} ${a[c].attribute_name} `))}return t(null,n)}o(mle,"checkPermissions");d$.exports={authorize:fle,checkPermissions:mle}});var ZN=v((Txe,h$)=>{var FS=require("clone"),kS=at(),ple=oe(),xS=(q(),M(Y)),gxe=Q(),zN=require("fs"),QN=require("joi"),{string:BS}=QN.types(),{hdbErrors:hle,handleHDBError:US}=_e(),{HDB_ERROR_MSGS:Sxe,HTTP_STATUS_CODES:jN}=hle,{commonValidators:Bd}=Wi(),f$=" is required",Ele=["insert","update","upsert"],JN={database:{presence:!1,format:Bd.schema_format,length:Bd.schema_length},schema:{presence:!1,format:Bd.schema_format,length:Bd.schema_length},table:{presence:!0,format:Bd.schema_format,length:Bd.schema_length},action:{inclusion:{within:Ele,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},_le={schema:BS.required(),table:BS.required(),action:BS.valid("insert","update","upsert")},{AWS_ACCESS_KEY:gle,AWS_SECRET:Sle,AWS_BUCKET:Tle,AWS_FILE_KEY:yle,REGION:Rle}=xS.S3_BUCKET_AUTH_KEYS,ble={s3:{presence:!0},[`s3.${gle}`]:{presence:!0,type:"String"},[`s3.${Sle}`]:{presence:!0,type:"String"},[`s3.${Tle}`]:{presence:!0,type:"String"},[`s3.${yle}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${Rle}`]:{presence:!0,type:"String"}},m$=FS(JN);m$.data.presence={message:f$};var p$=FS(JN);p$.file_path.presence={message:f$};var Ale=Object.assign(FS(JN),ble),XN=FS(_le);XN.csv_url=BS.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();XN.passthrough_headers=QN.object();function Ile(e){let t=kS.validateObject(e,m$);return HS(e,t)}o(Ile,"dataObject");function wle(e){let t=kS.validateBySchema(e,QN.object(XN));return HS(e,t)}o(wle,"urlObject");function Nle(e){let t=kS.validateObject(e,p$);return HS(e,t)}o(Nle,"fileObject");function Cle(e){let t=kS.validateObject(e,Ale);return HS(e,t)}o(Cle,"s3FileObject");function HS(e,t){if(!t){let r=ple.checkGlobalSchemaTable(e.schema,e.table);if(r)return US(new Error,r,jN.BAD_REQUEST);if(e.operation===xS.OPERATIONS_ENUM.CSV_FILE_LOAD)try{zN.accessSync(e.file_path,zN.constants.R_OK|zN.constants.F_OK)}catch(n){return n.code===xS.NODE_ERROR_CODES.ENOENT?US(n,`No such file or directory ${n.path}`,jN.BAD_REQUEST):n.code===xS.NODE_ERROR_CODES.EACCES?US(n,`Permission denied ${n.path}`,jN.BAD_REQUEST):US(n)}}return t}o(HS,"postValidateChecks");h$.exports={dataObject:Ile,urlObject:wle,fileObject:Nle,s3FileObject:Cle}});var eC=v((Rxe,E$)=>{"use strict";var Qp=Q(),qS=(q(),M(Y));async function Ole(e,t,r,n=void 0){if(!e||typeof e!="function")throw new Error("Invalid function parameter");let s;try{return s=await e(t),r&&await r(t,s,n),t.operation===qS.OPERATIONS_ENUM.INSERT||t.operation===qS.OPERATIONS_ENUM.UPDATE||t.operation===qS.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===qS.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(Qp.info(i.message),i):i.http_resp_msg?(Qp.error(`Error calling operation: ${e.name}`),Qp.error(i.http_resp_msg),i):(Qp.error(`Error calling operation: ${e.name}`),Qp.error(i),i)}}o(Ole,"callOperationFunctionAsAwait");E$.exports={callOperationFunctionAsAwait:Ole}});var tC=v((Axe,g$)=>{"use strict";var{S3:Ple,GetObjectCommand:Lle}=require("@aws-sdk/client-s3");g$.exports={getFileStreamFromS3:Dle,getS3AuthObj:_$};async function Dle(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await _$(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new Lle(r))).Body}o(Dle,"getFileStreamFromS3");function _$(e,t,r){return new Ple({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(_$,"getS3AuthObj")});var T$=v((wxe,S$)=>{"use strict";var rC=class{static{o(this,"BulkLoadFileObject")}constructor(t,r,n,s,i,a,c=null){this.op=t,this.action=r,this.schema=n,this.table=s,this.file_path=i,this.file_type=a,this.role_perms=c}},nC=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};S$.exports={BulkLoadFileObject:rC,BulkLoadDataObject:nC}});var R$=v((Cxe,y$)=>{"use strict";var sC=class{static{o(this,"PermissionTableResponseObject")}constructor(t,r,n=[],s=[]){this.schema=t,this.table=r,this.required_table_permissions=n,this.required_attribute_permissions=s}};y$.exports=sC});var A$=v((Pxe,b$)=>{"use strict";var iC=class{static{o(this,"PermissionAttributeResponseObject")}constructor(t,r=[]){this.attribute_name=t,this.required_permissions=r}};b$.exports=iC});var aC=v((Dxe,w$)=>{"use strict";var I$=R$(),Mle=A$(),{HDB_ERROR_MSGS:vle}=zr(),oC=class{static{o(this,"PermissionResponseObject")}constructor(){this.error=vle.OP_AUTH_PERMS_ERROR,this.unauthorized_access={},this.invalid_schema_items=[]}handleUnauthorizedItem(t){return this.invalid_schema_items=[],this.unauthorized_access=[t],this}handleInvalidItem(t){return this.invalid_schema_items=[t],this.unauthorized_access=[],this}addInvalidItem(t,r,n){if(r&&n){let s=`${r}_${n}`;if(this.unauthorized_access[s])return}this.invalid_schema_items.push(t)}addUnauthorizedTable(t,r,n){let s=new I$(t,r,n),i=`${t}_${r}`;this.unauthorized_access[i]=s}addUnauthorizedAttributes(t,r,n,s){let i=[];t.forEach(c=>{let l=new Mle(c,s[c]);i.push(l)});let a=`${r}_${n}`;if(this.unauthorized_access[a])this.unauthorized_access[a].required_attribute_permissions=i;else{let c=new I$(r,n,[],i);this.unauthorized_access[a]=c}}getPermsResponse(){let t=Object.values(this.unauthorized_access);return t.length>0||this.invalid_schema_items.length>0?(this.unauthorized_access=t,this):null}};w$.exports=oC});var ic=v((Uxe,P$)=>{"use strict";var vxe=En(),Jp=Q(),{validateBySchema:N$}=at(),Wo=require("joi"),Ule=Zi(),GS=oe(),{handleHDBError:$S,hdbErrors:xle,ClientError:C$}=_e(),{HDB_ERROR_MSGS:VS,HTTP_STATUS_CODES:cC}=xle,O$=ce();O$.initSync();var{getDatabases:lC}=(we(),M(mt)),Ble=require("fs-extra"),Fle=(q(),M(Y));P$.exports={describeAll:kle,describeTable:KS,describeSchema:Hle};async function kle(e={}){try{let t=GS.isEmptyOrZeroLength(e),r=!!e.bypass_auth,n,s;!t&&!r&&(n=e.hdb_user?.role?.permission,s=n?.super_user||n?.cluster_user);let i=lC(),a={},c={},l=[],u=e?.exact_count,d=e?.include_computed;for(let m in i){a[m]=!0,!t&&!s&&!r&&(c[m]=e.hdb_user?.role?.permission[m]?.describe);let p=i[m];for(let h in p)try{let E;if(t||s||r)E=await KS({schema:m,table:h,exact_count:u,include_computed:d});else if(n&&n[m].describe&&n[m].tables[h].describe){let g=n[m].tables[h].attribute_permissions;E=await KS({schema:m,table:h,exact_count:u,include_computed:d},g)}E&&l.push(E)}catch(E){Jp.error(E)}}let f={};for(let m in l)t||s||r?(f[l[m].schema]==null&&(f[l[m].schema]={}),f[l[m].schema][l[m].name]=l[m],a[l[m].schema]&&delete a[l[m].schema]):c[l[m].schema]&&(f[l[m].schema]==null&&(f[l[m].schema]={}),f[l[m].schema][l[m].name]=l[m],a[l[m].schema]&&delete a[l[m].schema]);for(let m in a)t||s||r?f[m]={}:c[m]&&(f[m]={});return f}catch(t){return Jp.error("Got an error in describeAll"),Jp.error(t),$S(new Error,VS.DESCRIBE_ALL_ERR)}}o(kle,"describeAll");async function KS(e,t){GS.transformReq(e);let{schema:r,table:n}=e;r=r?.toString(),n=n?.toString();let s=t;e.hdb_user&&!e.hdb_user?.role?.permission?.super_user&&(s=e.hdb_user?.role?.permission[r]?.tables[n]?.attribute_permissions);let i=N$(e,Wo.object({database:Wo.string(),table:Wo.string().required(),exact_count:Wo.boolean().strict(),include_computed:Wo.boolean().strict()}));if(i)throw new C$(i.message);let c=lC()[r];if(!c)throw $S(new Error,VS.SCHEMA_NOT_FOUND(e.schema),cC.NOT_FOUND);let l=c[n];if(!l)throw $S(new Error,VS.TABLE_NOT_FOUND(e.schema,e.table),cC.NOT_FOUND);function u(p){(!p.computed||e.include_computed)&&d.push({attribute:p.attribute,type:p.type,elements:p.elements?.type,indexed:p.indexed,is_primary_key:p.isPrimaryKey,assigned_created_time:p.assignCreatedTime,assigned_updated_time:p.assignUpdatedTime,nullable:p.nullable,computed:p.computed?!0:void 0,properties:p.properties?p.properties.map(h=>({type:h.type,name:h.name})):void 0})}o(u,"pushAtt");let d=[];if(s){let p={};s.forEach(h=>{h.describe&&(p[h.attribute_name]=!0)}),l.attributes.forEach(h=>{p[h.name]&&u(h)})}else l.attributes?.forEach(p=>u(p));let f;try{f=(await Ble.stat(l.primaryStore.env.path)).size}catch(p){Jp.warn("unable to get database size",p)}let m={schema:r,name:l.tableName,hash_attribute:l.attributes.find(p=>p.isPrimaryKey||p.is_hash_attribute)?.name,audit:l.audit,schema_defined:l.schemaDefined,attributes:d,db_size:f};l.replicate!==void 0&&(m.replicate=l.replicate),l.expirationMS!==void 0&&(m.expiration=l.expirationMS/1e3+"s"),l.sealed!==void 0&&(m.sealed=l.sealed),l.sources?.length>0&&(m.sources=l.sources.map(p=>p.name).filter(p=>p&&p!=="NATSReplicator"&&p!=="Replicator")),O$.get(Fle.CONFIG_PARAMS.CLUSTERING_ENABLED)&&(m.clustering_stream_name=Ule.createNatsTableStreamName(m.schema,m.name));try{let p=await l.getRecordCount({exactCount:!!e.exact_count});m.record_count=p.recordCount,m.table_size=l.getSize(),m.db_audit_size=l.getAuditSize(),m.estimated_record_range=p.estimatedRange;let h=l.auditStore;if(h)for(let E of h.getKeys({reverse:!0,limit:1}))m.last_updated_record=E[0];if(!m.last_updated_record&&l.indices.__updatedtime__)for(let E of l.indices.__updatedtime__.getKeys({reverse:!0,limit:1}))m.last_updated_record=E}catch(p){Jp.warn(`unable to stat table dbi due to ${p}`)}return m}o(KS,"descTable");async function Hle(e){GS.transformReq(e);let t=N$(e,Wo.object({database:Wo.string(),exact_count:Wo.boolean().strict(),include_computed:Wo.boolean().strict()}));if(t)throw new C$(t.message);let r;e.hdb_user&&!e.hdb_user?.role?.permission?.super_user&&(r=e.hdb_user?.role?.permission[e.schema]);let n=e.schema.toString(),i=lC()[n];if(!i)throw $S(new Error,VS.SCHEMA_NOT_FOUND(e.schema),cC.NOT_FOUND);let a={};for(let c in i){let l;if(r&&r.tables[c]&&(l=r.tables[c]),GS.isEmpty(l)||l.describe){let u=await KS({schema:e.schema,table:c,exact_count:e.exact_count,include_computed:e.include_computed},l?l.attribute_permissions:null);u&&(a[u.name]=u)}}return a}o(Hle,"describeSchema")});var U$=v((Bxe,v$)=>{"use strict";var qle=ic(),{hdbErrors:L$}=_e(),{getDatabases:D$}=(we(),M(mt));v$.exports={checkSchemaExists:M$,checkSchemaTableExists:Gle,schemaDescribe:qle};async function M$(e){if(!D$()[e])return L$.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}o(M$,"checkSchemaExists");async function Gle(e,t){let r=await M$(e);if(r)return r;if(!D$()[e][t])return L$.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}o(Gle,"checkSchemaTableExists")});var YS=v((kxe,x$)=>{"use strict";var $le=cs();x$.exports={writeTransaction:Vle};function Vle(e,t,r){return $le.writeTransaction(e,t,r)}o(Vle,"writeTransaction")});var pC=v((Vxe,z$)=>{"use strict";var{decode:Kle}=require("msgpackr"),{isMainThread:qxe,parentPort:Gxe,threadId:$xe}=require("worker_threads"),jS=qt(),Fd=pt(),fC=(q(),M(Y)),yn=Q(),dC=ce(),Yle=(q(),M(Y)),{onMessageByType:Wle}=Ze(),H$=Zi(),{recordAction:B$,recordActionBinary:zle}=(ts(),M(tg)),{publishToStream:jle}=jS,{ConsumerEvents:F$}=require("nats"),Qle=En(),{promisify:Jle}=require("util"),{decodeBlobsWithWrites:Xle}=(es(),M(F_)),q$=Jle(setTimeout),QS=1e4,JS,zS,Zle,eue,G$,Xp=new Map,kd=new Map;z$.exports={initialize:$$,ingestConsumer:mC,setSubscription:tue,setIgnoreOrigin:sue,getDatabaseSubscriptions:nue,updateConsumer:V$};async function $$(){Wle(fC.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,async n=>{await V$(n)}),G$=!0,yn.notify("Initializing clustering ingest service.");let{connection:e,jsm:t,js:r}=await jS.getNATSReferences();JS=e,zS=e.info.server_name,Zle=t,eue=r}o($$,"initialize");async function V$(e){if(e.status==="start"){let{js:t,jsm:r}=await K$(e.node_domain_name);mC(e.stream_name,t,r,e.node_domain_name)}else if(e.status==="stop"){let t=Xp.get(e.stream_name+e.node_domain_name);t&&(yn.notify("Closing ingest consumer for node:",e.node_domain_name,"stream:",e.stream_name),await t.close?.(),Xp.set(e.stream_name+e.node_domain_name,"close")),kd.get(e.node_domain_name)==="failed"&&kd.set(e.node_domain_name,"close")}}o(V$,"updateConsumer");var XS=new Map;function tue(e,t,r){let n=XS.get(e);n||XS.set(e,n=new Map),n.set(t,r),G$||$$().then(rue)}o(tue,"setSubscription");async function rue(){let e=await Qle.searchByValue({database:"system",table:"hdb_nodes",attribute:"name",value:"*"});for await(let t of e){let r=t.name+Fd.SERVER_SUFFIX.LEAF,n,s;for(let i of t.subscriptions||[])if(i.subscribe===!0){if(!n&&({js:n,jsm:s}=await K$(r),!n))break;let{schema:a,table:c}=i,l=H$.createNatsTableStreamName(a,c);mC(l,n,s,r)}}}o(rue,"accessConsumers");async function K$(e){let t,r,n=1;for(;!r;)try{t=await JS.jetstream({domain:e}),r=await JS.jetstreamManager({domain:e,checkAPI:!1})}catch(s){if(kd.get(e)==="close")break;kd.set(e,"failed"),n%10===1&&yn.warn("Nats ingest attempting to connect to:",e,"Nats error:",s.message);let i=n++*100<QS?n++*100:QS;await q$(i)}return{js:t,jsm:r}}o(K$,"connectToRemoteJS");function nue(){return XS}o(nue,"getDatabaseSubscriptions");var Y$;function sue(e){Y$=e}o(sue,"setIgnoreOrigin");var W$=100,k$=new Array(W$),WS=0;async function mC(e,t,r,n){let{connection:s}=await jS.getNATSReferences();JS=s,zS=s.info.server_name;let i,a=1;for(;!i;)try{i=await t.consumers.get(e,zS),yn.notify("Initializing ingest consumer for node:",n,"stream:",e)}catch(u){if(kd.get(n)==="close")break;a%10===1&&yn.warn("Nats ingest error getting consumer:",n,"stream:",e,"Nats error:",u.message),u.code==="404"&&(yn.notify("Nats ingest creating consumer for node:",n,"stream:",e),i=await jS.createConsumer(r,e,zS,new Date(Date.now()).toISOString()));let d=a++*100<QS?a++*100:QS;await q$(d)}let c=!1,l;for(;!c;){if(Xp.get(e+n)==="close"||kd.get(n)==="close"){Xp.delete(e+n),c=!0;continue}l=await i.consume({max_messages:dC.get(fC.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXCONSUMEMSGS)??100,bind:!0}),Xp.set(e+n,l);let u=!1;(async()=>{for await(let d of await l.status())if(d.type===F$.ConsumerDeleted&&(await l.close(),c=!0),d.type===F$.HeartbeatsMissed){let f=d.data;yn.trace(`${f} clustering ingest consumer heartbeats missed, node: ${n} stream: ${l.consumer.stream}`),f===100&&(yn.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 k$[WS],k$[WS]=iue(d).catch(f=>{yn.error(f)}),++WS>=W$&&(WS=0)}catch(d){d.message==="consumer deleted"?(yn.notify("Nats consumer deleted, closing messages for node:",n,"stream:",l.consumer.stream),await l.close(),c=!0):yn.error("Error consuming clustering ingest, restarting consumer",d)}}}o(mC,"ingestConsumer");async function iue(e){let t;await Xle(()=>{t=Kle(e.data)}),B$(e.data.length,"bytes-received",e.subject,t.operation,"ingest"),yn.trace("Nats message processor message size:",e?.msg?._msg?.size,"bytes");let r=e.headers,n=!1,s=dC.get(fC.CONFIG_PARAMS.CLUSTERING_NODENAME);r.has(Fd.MSG_HEADERS.TRANSACTED_NODES)&&r.values(Fd.MSG_HEADERS.TRANSACTED_NODES).indexOf(s)>-1&&(n=!0);let i=r.get(Fd.MSG_HEADERS.ORIGIN);if(n||(n=i===s&&!Y$),zle(n,"echo",e.subject,t.operation,"ingest"),n){e.ack();return}r.append(Fd.MSG_HEADERS.TRANSACTED_NODES,s);try{let{operation:a,schema:c,next:l,table:u,records:d,hash_values:f,__origin:m,expiresAt:p}=t;yn.trace("processing message:",a,c,u,(d?"records: "+d.map(I=>I?.id):"")+(f?"ids: "+f:""),"with sequence:",e.seq),yn.trace(`messageProcessor nats msg id: ${e.headers.get(Fd.MSG_HEADERS.NATS_MSG_ID)}`);let h;d||(d=f);let E=new Promise(I=>h=I),{timestamp:g,user:R,node_name:S}=m||{},y=XS.get(c)?.get(u);if(!y)throw new Error(`Missing table for replication message: ${u}`);if(a==="define_schema")t.type=a,t.onCommit=h,y.send(t);else if(d.length===1&&!l)y.send({type:uC(a),value:d[0],id:f?.[0],expiresAt:p,timestamp:g,table:u,onCommit:h,user:R,nodeName:S});else{let I=d.map((k,J)=>({type:uC(a),value:k,expiresAt:p,id:f?.[J],table:u}));for(;l;)I.push({type:uC(l.operation),value:l.record,expiresAt:l.expiresAt,id:l.id,table:l.table}),l=l.next;y.send({type:"transaction",writes:I,table:u,timestamp:g,onCommit:h,user:R,nodeName:S})}dC.get(Yle.CONFIG_PARAMS.CLUSTERING_REPUBLISHMESSAGES)!==!1&&jle(e.subject.split(".").slice(0,-1).join("."),H$.createNatsTableStreamName(c,u),e.headers,e.data),await E;let C=Date.now()-g;g&&B$(C,"replication-latency",e.subject,a,"ingest")}catch(a){yn.error(a)}e.ack()}o(iue,"messageProcessor");function uC(e){switch(e){case"insert":case"upsert":case"update":return"put"}return e}o(uC,"convertOperation")});var qt=v((Jxe,dV)=>{"use strict";var Vr=ce();Vr.initSync();var oue=require("fs-extra"),aue=require("semver"),th=require("path"),{monotonicFactory:cue}=require("ulidx"),Q$=cue(),lue=require("util"),J$=require("child_process"),uue=lue.promisify(J$.exec),due=J$.spawn,nn=pt(),rt=(q(),M(Y)),{packageJson:fue,PACKAGE_ROOT:mue}=Ot(),ZS=oe(),Si=Q(),eT=Zi(),pue=YS(),Zp=Tt(),{broadcast:hue,onMessageByType:Eue,getWorkerIndex:_ue}=Ze(),{isMainThread:X$}=require("worker_threads"),{Encoder:gue,decode:gC}=require("msgpackr"),Z$=new gue,{isEmpty:Bl}=ZS,eV=fs(),Yxe=48*36e11;X$&&Eue(rt.ITC_EVENT_TYPES.RESTART,()=>{Rn=void 0,xl=void 0});var{connect:Sue,StorageType:Tue,RetentionPolicy:yue,AckPolicy:SC,DeliverPolicy:TC,DiscardPolicy:Rue,NatsConnection:Wxe,JetStreamManager:zxe,JetStreamClient:jxe,StringCodec:Qxe,JSONCodec:bue,createInbox:yC,headers:Aue,ErrorCode:j$}=require("nats"),{recordAction:Iue}=(ts(),M(tg)),{encodeBlobsAsBuffers:wue}=(es(),M(F_)),tV=bue(),Nue="clustering",Cue=fue.engines[nn.NATS_SERVER_NAME],Oue=th.join(mue,"dependencies"),_C=th.join(Oue,`${process.platform}-${process.arch}`,nn.NATS_BINARY_NAME),hC,EC,eh,vl,Ul;dV.exports={runCommand:rV,checkNATSServerInstalled:Pue,createConnection:RC,getConnection:rh,getJetStreamManager:nh,getJetStream:sV,getNATSReferences:ao,getServerList:Due,createLocalStream:bC,listStreams:iV,deleteLocalStream:Mue,getServerConfig:Hd,listRemoteStreams:vue,viewStream:Uue,viewStreamIterator:xue,publishToStream:Bue,request:Hue,reloadNATS:AC,reloadNATSHub:que,reloadNATSLeaf:Gue,extractServerName:kue,requestErrorHandler:$ue,createLocalTableStream:lV,createTableStreams:Yue,purgeTableStream:uV,purgeSchemaTableStreams:Wue,getStreamInfo:zue,updateLocalStreams:Que,closeConnection:Lue,getJsmServerName:tT,addNatsMsgHeader:oV,clearClientCache:nV,updateRemoteConsumer:Vue,createConsumer:aV,updateConsumerIterator:Kue};async function rV(e,t=void 0){let{stdout:r,stderr:n}=await uue(e,{cwd:t});if(n)throw new Error(n.replace(`
16
+ `)}}});var mq,Cl,pq,ec,bp,_d,oae,Xg,nN=se(()=>{mq=b(is()),Cl=b(Ze());q();pq=b(Zn());md();Jg();ec=(0,pq.loggerWithTag)("componentStatus.crossThread"),bp=class{static{o(this,"CrossThreadStatusCollector")}awaitingResponses=new Map;responseCheckers=new Map;nextRequestId=1;listenerAttached=!1;timeout;cleanupTimer=null;constructor(t=5e3){this.timeout=t}attachListener(){this.listenerAttached||((0,Cl.onMessageByType)(u_.COMPONENT_STATUS_RESPONSE,({message:t})=>{let r=t.isMainThread?"main":`worker-${t.workerIndex}`;ec.trace?.("Received component status response from %s, with requestId: %d",r,t.requestId);let n=this.awaitingResponses.get(t.requestId);if(n){n.push({workerIndex:t.workerIndex,isMainThread:t.isMainThread||!1,statuses:t.statuses||[]});let s=this.responseCheckers.get(t.requestId);s&&s()}}),this.listenerAttached=!0)}scheduleCleanup(){this.cleanupTimer&&clearTimeout(this.cleanupTimer),this.awaitingResponses.size>0&&(this.cleanupTimer=setTimeout(()=>{this.awaitingResponses.size>0&&(ec.debug?.(`Cleaning up ${this.awaitingResponses.size} stale pending requests`),this.awaitingResponses.clear()),this.cleanupTimer=null},3e4))}async collect(t){try{this.attachListener(),this.scheduleCleanup();let r=this.nextRequestId++,n=[];this.awaitingResponses.set(r,n);let a=((0,Cl.getWorkerCount)()||1)+1-1,l=await new Promise((p,h)=>{let E=!1,g=o(()=>{let y=this.awaitingResponses.get(r);y&&y.length>=a&&!E&&(E=!0,S(),ec.trace?.(`Collected all ${y.length} expected responses for request ${r}`),p(y))},"checkComplete"),R=setTimeout(()=>{if(!E){E=!0;let y=this.awaitingResponses.get(r)||[];this.awaitingResponses.delete(r),ec.debug?.(`Collection timeout for request ${r}: collected ${y.length}/${a} responses`),p(y)}},this.timeout),S=o(()=>{this.awaitingResponses.delete(r),clearTimeout(R)},"cleanup");this.responseCheckers.set(r,g),(0,mq.sendItcEvent)({type:u_.COMPONENT_STATUS_REQUEST,message:{requestId:r}}).then(()=>{g()}).catch(y=>{E=!0,S(),this.responseCheckers.delete(r),h(new hd("sendItcEvent",y))})});this.responseCheckers.delete(r);let u=new Map,d=t.getAllStatuses(),f=(0,Cl.getWorkerIndex)(),m=f===void 0?"main":`worker-${f}`;for(let[p,h]of d)u.set(`${p}@${m}`,{...h,workerIndex:f});for(let p of l)for(let[h,E]of p.statuses){let g=p.isMainThread?"main":`worker-${p.workerIndex}`;u.set(`${h}@${g}`,{...E,workerIndex:p.workerIndex})}return ec.debug?.(`Collected component status from ${l.length+1} threads (including local)`),u}catch(r){return r instanceof hd?ec.error?.(`ITC failure during component status collection: ${r.message}`):ec.warn?.("Failed to collect component status from all threads:",r),ec.debug?.(`Collection failed for request. Error: ${r instanceof Error?r.message:"Unknown error"}`),this.getLocalStatusOnly(t)}}getLocalStatusOnly(t){let r=t.getAllStatuses(),n=new Map,s=(0,Cl.getWorkerIndex)(),i=s===void 0?"main":`worker-${s}`;for(let[a,c]of r)n.set(`${a}@${i}`,{...c,workerIndex:s});return n}cleanup(){this.awaitingResponses.clear(),this.responseCheckers.clear(),this.cleanupTimer&&(clearTimeout(this.cleanupTimer),this.cleanupTimer=null)}},_d=class{static{o(this,"StatusAggregator")}static aggregate(t){let r=new Map,n=new Map;for(let[s,i]of t){let a=s.indexOf("@"),c=a!==-1?s.substring(0,a):s,l=n.get(c);l||(l=[],n.set(c,l)),l.push([s,i])}for(let[s,i]of n){let a=this.aggregateComponentGroup(s,i);r.set(s,a)}return r}static aggregateComponentGroup(t,r){let n={workers:{}},s=0,i,a,c=new Map,l=new Map;for(let[m,p]of r){let h=m.lastIndexOf("@"),E=h!==-1?m.substring(h+1):"",g=p.lastChecked instanceof Date?p.lastChecked.getTime():new Date(p.lastChecked).getTime();if(E==="main")n.main=g;else if(E&&E.startsWith("worker-")){let R=parseInt(E.substring(7));isNaN(R)||(n.workers[R]=g)}c.set(p.status,(c.get(p.status)||0)+1),p.status!==Ie.HEALTHY&&p.message&&(!i||g>s)&&(s=g,i=p.message),p.error&&!a&&(a=p.error)}let u=this.determineOverallStatus(c);if(Array.from(c.keys()).length>1)for(let[m,p]of r)p.status!==u&&l.set(m,{workerIndex:p.workerIndex!==void 0?p.workerIndex:-1,status:p.status,message:p.message,error:p.error});let f={componentName:t,status:u,lastChecked:n,latestMessage:i,error:a};return l.size>0&&(f.abnormalities=l),f}static determineOverallStatus(t){let r=[Ie.ERROR,Ie.WARNING,Ie.LOADING,Ie.UNKNOWN,Ie.HEALTHY];for(let n of r)if(t.has(n)&&t.get(n)>0)return n;return Ie.UNKNOWN}},oae=parseInt(process.env.COMPONENT_STATUS_TIMEOUT||"5000"),Xg=new bp(oae)});var tc,Zg=se(()=>{Zw();md();nN();Jg();tc=class e{static{o(this,"ComponentStatusRegistry")}statusMap=new Map;reset(){this.statusMap=new Map}setStatus(t,r,n,s){if(!t||typeof t!="string")throw new Ed(String(t),"setStatus","Component name must be a non-empty string");if(!Object.values(Ie).includes(r))throw new Ed(t,"setStatus",`Invalid status level: ${r}. Must be one of: ${Object.values(Ie).join(", ")}`);this.statusMap.set(t,new pd(r,n,s))}getStatus(t){return this.statusMap.get(t)}getAllStatuses(){return this.statusMap}reportHealthy(t,r){this.setStatus(t,Ie.HEALTHY,r)}reportError(t,r,n){this.setStatus(t,Ie.ERROR,n,r)}reportWarning(t,r){this.setStatus(t,Ie.WARNING,r)}initializeLoading(t,r){this.setStatus(t,Ie.LOADING,r||"Component is loading")}markLoaded(t,r){this.setStatus(t,Ie.HEALTHY,r||"Component loaded successfully")}markFailed(t,r,n){this.setStatus(t,Ie.ERROR,n,r)}getComponentsByStatus(t){let r=[];for(let[n,s]of this.statusMap)s.status===t&&r.push({name:n,status:s});return r}getStatusSummary(){let t={[Ie.HEALTHY]:0,[Ie.ERROR]:0,[Ie.WARNING]:0,[Ie.LOADING]:0,[Ie.UNKNOWN]:0};for(let r of this.statusMap.values())t[r.status]++;return t}static async getAggregatedFromAllThreads(t){let r=await Xg.collect(t);return _d.aggregate(r)}async getAggregatedStatusFor(t,r){r||(r=await e.getAggregatedFromAllThreads(this));let n=[],s=t+".",i=r.get(t);i&&n.push({key:t,...i});for(let[f,m]of r)f.startsWith(s)&&n.push({key:f,...m});if(n.length===0)return{status:Ie.UNKNOWN,message:"The component has not been loaded yet (may need a restart)",lastChecked:{workers:{}}};let a=n.some(f=>f.status===Ie.ERROR),c=n.some(f=>f.status===Ie.LOADING),l=a?Ie.ERROR:c?Ie.LOADING:Ie.HEALTHY,u="All components loaded successfully",d={};if(a||c){u=n.filter(m=>m.status===Ie.ERROR||m.status===Ie.LOADING).map(m=>`${m.key}: ${m.latestMessage||m.status}`).join("; ");for(let m of n)m.status!==Ie.HEALTHY&&(d[m.key]={status:m.status,message:m.latestMessage})}return{status:l,message:u,...Object.keys(d).length>0&&{details:d},lastChecked:n[0]?.lastChecked||{workers:{}}}}}});var pr,eS=se(()=>{Zg();pr=new tc});function Eq(e){let t=hq.get(e);return t||(t=new sN(e),hq.set(e,t)),t}function _q(){pr.reset()}var sN,hq,no,gq,Sq=se(()=>{eS();md();sN=class{static{o(this,"ComponentStatusBuilder")}componentName;constructor(t){this.componentName=t}healthy(t){return pr.setStatus(this.componentName,Ie.HEALTHY,t),this}warning(t){return pr.setStatus(this.componentName,Ie.WARNING,t),this}error(t,r){return pr.setStatus(this.componentName,Ie.ERROR,t,r),this}loading(t){return pr.setStatus(this.componentName,Ie.LOADING,t||"Loading..."),this}unknown(t){return pr.setStatus(this.componentName,Ie.UNKNOWN,t),this}get(){return pr.getStatus(this.componentName)}},hq=new Map;o(Eq,"statusForComponent");no={loading(e,t){pr.initializeLoading(e,t)},loaded(e,t){pr.markLoaded(e,t)},failed(e,t,r){pr.markFailed(e,t,r)}};o(_q,"reset");gq=Ie});var Ap={};Re(Ap,{AggregationError:()=>tN,COMPONENT_STATUS_LEVELS:()=>Ie,ComponentStatus:()=>pd,ComponentStatusError:()=>Za,ComponentStatusOperationError:()=>Ed,ComponentStatusRegistry:()=>tc,CrossThreadCollectionError:()=>rN,CrossThreadStatusCollector:()=>bp,CrossThreadTimeoutError:()=>eN,ITCError:()=>hd,StatusAggregator:()=>_d,componentStatusRegistry:()=>pr,crossThreadCollector:()=>Xg,query:()=>aae});var aae,Tq=se(()=>{eS();Zg();Zw();Zg();nN();eS();Jg();md();aae={get(e){return pr.getStatus(e)},all(){return pr.getAllStatuses()},byStatus(e){return pr.getComponentsByStatus(e)},summary(){return pr.getStatusSummary()},async allThreads(){return tc.getAggregatedFromAllThreads(pr)}}});var iN={};Re(iN,{STATUS:()=>gq,internal:()=>Ap,lifecycle:()=>no,reset:()=>_q,statusForComponent:()=>Eq});var Ip=se(()=>{Sq();Tq()});var Np=v((Uve,bq)=>{"use strict";var ms=Q(),Sn=(q(),M(Y)),cae=G0(),lae=fs(),{validateEvent:oN}=is(),wp=cs(),uae=require("process"),{resetDatabases:dae}=(we(),M(mt)),fae={[Sn.ITC_EVENT_TYPES.SCHEMA]:mae,[Sn.ITC_EVENT_TYPES.USER]:Rq,[Sn.ITC_EVENT_TYPES.COMPONENT_STATUS_REQUEST]:hae};async function mae(e){let t=oN(e);if(t){ms.error(t);return}ms.trace("ITC schemaHandler received schema event:",e),await cae(e.message),await pae(e.message)}o(mae,"schemaHandler");async function pae(e){try{wp.resetReadTxn(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),wp.resetReadTxn(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),wp.resetReadTxn(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=dae();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){ms.error(t)}}o(pae,"syncSchemaMetadata");var yq=[];async function Rq(e){try{try{wp.resetReadTxn(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),wp.resetReadTxn(Sn.SYSTEM_SCHEMA_NAME,Sn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){ms.warn(r)}let t=oN(e);if(t){ms.error(t);return}ms.trace(`ITC userHandler ${Sn.HDB_ITC_CLIENT_PREFIX}${uae.pid} received user event:`,e),await lae.setUsersWithRolesCache();for(let r of yq)r()}catch(t){ms.error(t)}}o(Rq,"userHandler");Rq.addListener=function(e){yq.push(e)};async function hae(e){try{let t=oN(e);if(t){ms.error(t);return}ms.trace("ITC componentStatusRequestHandler received request:",e);let{internal:r}=(Ip(),M(iN)),{getWorkerIndex:n}=Ze(),{sendItcEvent:s}=is(),i=r.componentStatusRegistry.getAllStatuses(),a=Array.from(i.entries()),c=n(),l=c===void 0,u=e.message.originator,d={type:Sn.ITC_EVENT_TYPES.COMPONENT_STATUS_RESPONSE,message:{requestId:e.message.requestId,statuses:a,workerIndex:c,isMainThread:l}};u!==void 0&&threads.sendToThread(u,d)?ms.trace(`Sent component status response directly to thread ${u}`):(u===void 0?ms.debug("No originator threadId, falling back to broadcast"):ms.warn(`Failed to send direct response to thread ${u}, falling back to broadcast`),await s(d))}catch(t){ms.error("Error handling component status request:",t)}}o(hae,"componentStatusRequestHandler");bq.exports=fae});var is=v((qve,Iq)=>{"use strict";var Bve=Q(),aN=oe(),Eae=(q(),M(Y)),{ITC_ERRORS:Cp}=zr(),{parentPort:Fve,threadId:_ae,isMainThread:gae,workerData:kve}=require("worker_threads"),{onMessageFromWorkers:Sae,broadcast:Hve,broadcastWithAcknowledgement:Tae}=Ze();Iq.exports={sendItcEvent:yae,validateEvent:Aq,SchemaEventMsg:Rae,UserEventMsg:bae};var tS;Sae(async(e,t)=>{tS=tS||Np(),Aq(e),tS[e.type]&&await tS[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function yae(e){return!gae&&e.message&&(e.message.originator=_ae),Tae(e)}o(yae,"sendItcEvent");function Aq(e){if(typeof e!="object")return Cp.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||aN.isEmpty(e.type))return Cp.MISSING_TYPE;if(!e.hasOwnProperty("message")||aN.isEmpty(e.message))return Cp.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||aN.isEmpty(e.message.originator))return Cp.MISSING_ORIGIN;if(Eae.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return Cp.INVALID_EVENT(e.type)}o(Aq,"validateEvent");function Rae(e,t,r,n=void 0,s=void 0){this.originator=e,this.operation=t,this.schema=r,this.table=n,this.attribute=s}o(Rae,"SchemaEventMsg");function bae(e){this.originator=e}o(bae,"UserEventMsg")});var qo=v((Vve,Oq)=>{"use strict";var wq=(q(),M(Y)),$ve=oe(),rS=Q(),Nq=A0(),gd,{sendItcEvent:Cq}=is();function Aae(e){try{rS.debug("signalSchemaChange called with message:",e),gd=gd||Np();let t=new Nq(wq.ITC_EVENT_TYPES.SCHEMA,e);return gd.schema(t),Cq(t)}catch(t){rS.error(t)}}o(Aae,"signalSchemaChange");function Iae(e){try{rS.trace("signalUserChange called with message:",e),gd=gd||Np();let t=new Nq(wq.ITC_EVENT_TYPES.USER,e);return gd.user(t),Cq(t)}catch(t){rS.error(t)}}o(Iae,"signalUserChange");Oq.exports={signalSchemaChange:Aae,signalUserChange:Iae}});function Op(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 Pq(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new Fs(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 Fs,Pp=se(()=>{Fs=class extends Map{static{o(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 a=i[1];if(n)r=(typeof a=="string"?a:a.join(", "))+", "+r;else if(typeof a=="string")r=[a,r];else{a.push(r);return}}return super.set(s,[t,r])}[Symbol.iterator](){return super.values()[Symbol.iterator]()}};o(Op,"appendHeader");o(Pq,"mergeHeaders")});function nS(e,t,r=Nae){let n;return function(...i){return n?n.length*cN>r?t(...i):new Promise((a,c)=>{n.push({args:i,fn(){try{let l=e(...i);a(l)}catch(l){c(l)}}})}):(n=[],s(performance.now(),i),e(...i))};function s(i,a){setImmediate(()=>{let c=performance.now();cN=(cN*4+c-i)/5;let l=n.shift();if(l){let{args:u,fn:d}=l;d(),s(c,u)}else n=null})}}var Mq,wae,Nae,Lq,Cae,lN,Dq,cN,uN=se(()=>{Mq=b(Zn()),wae=3e3,Nae=2e4,Lq=0,Cae=3e4,lN=3e3,Dq=performance.now()+lN,cN=0;o(nS,"throttle");setInterval(()=>{let e=performance.now();e-Dq-lN>wae&&Lq+Cae<e&&(Mq.default.warn?.("JavaScript execution has taken too long and is not allowing proper event queue cycling, consider using 'await new Promise(setImmediate)' in code that will execute for a long duration"),Lq=e),Dq=e},lN).unref()});var Vq={};Re(Vq,{EVICTED:()=>qa,INVALIDATED:()=>xn,coerceType:()=>iS,makeTable:()=>aS});function aS(e){let{primaryKey:t,indices:r,tableId:n,tableName:s,primaryStore:i,databasePath:a,databaseName:c,auditStore:l,schemaDefined:u,dbisDB:d,sealed:f,splitSegments:m,replicate:p}=e,{expirationMS:h,evictionMS:E,audit:g,trackDeletes:R}=e;E??=0;let{attributes:S}=e;S||(S=[]);let y=kA(i,n,l),C,I,k={},J=Promise.resolve(),G,H,X;for(let K of S)(K.assignCreatedTime||K.name==="__createdtime__")&&(G=K),(K.assignUpdatedTime||K.name==="__updatedtime__")&&(H=K),K.expiresAt&&(X=K),K.isPrimaryKey&&(k=K);let z,de=[],le=[],te=1,ye=2,Ae={},Ye={},Ge=864e5,Ar=0,rr,Wr,vr,Tu=!1,Gc,xt,ni,Ca=Pl.get(F.REPLICATION_DATABASES);if(Array.isArray(Ca)){for(let K of Ca)if(K.name===c&&K.replicateTo>=0){ni=K.replicateTo;break}}let QE=i.getRange({start:!1,end:!1}).constructor,em=10,JE=6;g&&im(),Mm(i.env.path,K=>{if(I)return Pa(K)});class tm extends _l{static{o(this,"Updatable")}getUpdatedTime(){return ka.get(this.getRecord())?.version}getExpiresAt(){return ka.get(this.getRecord())?.expiresAt}addTo(_,T){if(typeof T=="number"||typeof T=="bigint")this.set(_,new up(T));else throw new Error("Can not add or subtract a non-numeric value")}subtractFrom(_,T){return this.addTo(_,-T)}}class Pe extends Hr{#e;#t;#r;#n;#s;#i;static name=s;static primaryStore=i;static auditStore=l;static primaryKey=t;static tableName=s;static tableId=n;static indices=r;static audit=g;static databasePath=a;static databaseName=c;static attributes=S;static replicate=p;static sealed=f;static splitSegments=m??!0;static createdTimeProperty=G;static updatedTimeProperty=H;static propertyResolvers;static userResolvers={};static sources=[];static getResidencyById;static get expirationMS(){return h}static dbisDB=d;static schemaDefined=u;static sourcedFrom(_,T){if(T&&(this.sourceOptions=T,(T.expiration||T.eviction||T.scanInterval)&&this.setTTLExpiration(T)),T?.intermediateSource)_.intermediateSource=!0,this.sources.unshift(_);else{if(this.sources.some(L=>!L.intermediateSource)){if(this.sources.some(L=>L.name===_.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(_)}I=I||_.get&&(!_.get.reliesOnPrototype||_.prototype.get),C=C||_.load;let N=o(L=>{let A=this.sources;if(A=A.filter(U=>U.intermediateSource&&U[L]&&(!U[L].reliesOnPrototype||U.prototype[L])),A.length>0)if(A.length===1){let U=A[0];return(w,D,$)=>{if(w?.source!==U)return U[L](D,$,w)}}else return(U,w,D)=>{let $=[];for(let W of A){if(U?.source===W)break;$.push(W[L](w,D,U))}return Promise.all($)}},"getApplyToIntermediateSource"),P=this.sources[this.sources.length-1];P.intermediateSource&&(P={});let O=o(L=>{if(P[L]&&(!P[L].reliesOnPrototype||P.prototype[L]))return(A,U,w)=>{if(!A?.source)return P[L](U,w,A)}},"getApplyToCanonicalSource");Ae={put:O("put"),patch:O("patch"),delete:O("delete"),publish:O("publish")},Ye={put:N("put"),patch:N("patch"),delete:N("delete"),publish:N("publish"),invalidate:N("invalidate")};let x=P.shouldRevalidateEvents;return(async()=>{let L=!1,A,U=o(async(w,D)=>{let $=w.value,W=w.table?De[c][w.table]:Pe;if(c===lm&&(w.table===wu.ROLE_TABLE_NAME||w.table===wu.USER_TABLE_NAME)&&(L=!0),w.id===void 0&&(w.id=$[W.primaryKey],w.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(w));w.source=_;let j={residencyId:$c(w.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:w.nodeId,async:!0},B=w.id,Ee=await W.getResource(B,D,j);switch(w.finished&&await w.finished,w.type){case"put":return x?Ee._writeInvalidate(B,$,j):Ee._writeUpdate(B,$,!0,j);case"patch":return x?Ee._writeInvalidate(B,$,j):Ee._writeUpdate(B,$,!1,j);case"delete":return Ee._writeDelete(B,j);case"publish":case"message":return Ee._writePublish(B,$,j);case"invalidate":return Ee._writeInvalidate(B,$,j);case"relocate":return Ee._writeRelocate(B,j);default:Fe.default.error?.("Unknown operation",w.type,w.id)}},"writeUpdate");try{let w=_.subscribe;w&&R==null&&(R=!0);let D={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},$=_.subscribeOnThisThread?_.subscribeOnThisThread((0,Ol.getWorkerIndex)(),D):(0,Ol.getWorkerIndex)()===0,W=w&&$&&await _.subscribe?.(D);if(W){let j;for await(let B of W)try{if(!(B.type==="transaction"?B.writes[0]:B)){Fe.default.error?.("Bad subscription event",B);continue}if(B.source=_,B.type==="end_txn"){if(j?.resolve(),B.localTime&&A!==B.localTime){if(B.remoteNodeIds?.length>0){let pe=[Symbol.for("seq"),B.remoteNodeIds[0]],ne=d.get(pe),ie=ne?.nodes;ie||(ie=[]);for(let fe of B.remoteNodeIds.slice(1)){let ae=ie.find(ke=>ke.id===fe);ie=ie.filter(ke=>ke.id!==fe||ke===ae),ae||(ae={id:fe,seqId:0},ie.push(ae)),ae.seqId=Math.max(ne?.seqId??1,B.localTime),fe===j?.nodeId&&(ae.lastTxnTime=B.timestamp)}let xe=Math.max(ne?.seqId??1,B.localTime);Fe.default.trace?.("Received txn",c,xe,new Date(xe),B.localTime,new Date(B.localTime),B.remoteNodeIds),d.put(pe,{seqId:xe,nodes:ie})}A=B.localTime}B.onCommit&&j?.committed.then(B.onCommit);continue}if(j)if(B.beginTxn)j.resolve();else{j.write_promises.push(U(B,j));continue}!B.timestamp&&B.version&&(B.timestamp=B.version);let me=At(B,()=>{if(B.type==="transaction"){let pe=[];for(let ne of B.writes)try{pe.push(U(ne,B))}catch(ie){throw ie.message+=" writing "+JSON.stringify(ne)+" of event "+JSON.stringify(B),ie}return Promise.all(pe)}else if(B.type==="define_schema"){let pe=this.attributes.slice(0),ne=!1;for(let ie of B.attributes)pe.find(xe=>xe.name===ie.name)||(pe.push(ie),ne=!0);ne&&(et({table:s,database:c,attributes:pe,origin:"cluster"}),Dp.signalSchemaChange(new Mp.SchemaEventMsg(process.pid,V.CREATE_TABLE,c,s)))}else return B.beginTxn?(j=B,j.write_promises=[U(B,B)],new Promise(pe=>{j.resolve=()=>pe(Promise.all(j.write_promises))})):U(B,B)});j&&(j.committed=me),L&&me&&!me?.waitingForUserChange&&(me.then(()=>Dp.signalUserChange(new Mp.UserEventMsg(process.pid))),me.waitingForUserChange=!0),B.onCommit&&(me?me.then(B.onCommit):B.onCommit())}catch(Ee){Fe.default.error?.("error in subscription handler",Ee)}}}catch(w){Fe.default.error?.(w)}})(),this}static get isCaching(){return I}static get shouldRevalidateEvents(){return this.prototype.get!==Pe.prototype.get}static getResource(_,T,N){let P=super.getResource(_,T,N);if(this.loadAsInstance===!1&&(T._freezeRecords=!0),_!=null&&this.loadAsInstance!==!1){Bi(_);try{if(P.getRecord?.())return P;if(typeof _=="object"&&_&&!Array.isArray(_))throw new Error(`Invalid id ${JSON.stringify(_)}`);let O=!N?.async||i.cache?.get?.(_),x=Ur(T),L=x.getReadTxn();if(L?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return wo(_,T,{transaction:L,ensureLoaded:N?.ensureLoaded},O,A=>{if(A?Pe._updateResource(P,A):P.#e=null,T.onlyIfCached){if(!P.doesExist())throw new ut.ServerError("Entry is not cached",504)}else if(N?.ensureLoaded){let U=dn(_,A,T,P);if(U)return x?.disregardReadTxn(),P.#i=!0,T.loadedFromSource=!0,ks(U,w=>(Pe._updateResource(P,w),P))}return P})}catch(O){throw O.message.includes("Unable to serialize object")&&(O.message+=": "+JSON.stringify(_)),O}}return P}static _updateResource(_,T){_.#n=T,_.#e=T?.value??null,_.#r=T?.version}ensureLoaded(){let _=dn(this.getId(),this.#n,this.getContext());if(_)return this.#i=!0,this.getContext().loadedFromSource=!0,ks(_,T=>{this.#n=T,this.#e=T.value,this.#r=T.version})}static getNewId(){let _=k?.type;if(_==="String"||_==="ID")return super.getNewId();if(!xt){let O=i.getEntry(Symbol.for("id_allocation")),x=O?.value,L;if(x&&x.nodeName===server.hostname&&(!Hae(i)||x.pid===process.pid)){let A=x.start,U=x.end;L=A;for(let w of i.getKeys({start:U,end:A,limit:1,reverse:!0}))L=w}else x=P(O?.version??null),L=x.start;xt=new BigInt64Array([BigInt(L)+1n]),xt=new BigInt64Array(i.getUserSharedBuffer("id",xt.buffer)),xt.maxSafeId=x.end}let T=Number(Atomics.add(xt,0,1n)),N=_==="Int"?512:1048576;if(T+N>=xt.maxSafeId){let O=o(x=>{xt.maxSafeId=T+(_==="Int"?1023:4194303);let L=(_==="Int"?Math.pow(2,31):Math.pow(2,49))-1,A=x?void 0:i.useReadTransaction(),U=Number(xt[0]);for(let $ of i.getKeys({start:U+1,end:L,limit:1,transaction:A}))L=$;A?.done();let{value:w,version:D}=i.getEntry(Symbol.for("id_allocation"));if(xt.maxSafeId<L){if(w.end>xt.maxSafeId-100)return;Fe.default.info?.("New id allocation",T,xt.maxSafeId,D),i.put(Symbol.for("id_allocation"),{start:w.start,end:xt.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),D)}else{Fe.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${xt.maxSafeId}, but id of ${L} detected`);let $=P(D);$.alreadyUpdated||Atomics.store(xt,0,BigInt($.start+1)),xt.maxSafeId=$.end}},"updateEnd");T+N===xt.maxSafeId?setImmediate(O):T+100>=xt.maxSafeId&&(Fe.default.warn?.(`Synchronous id allocation required on table ${s}${_=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>O(!0)))}return T;function P(O){let x=(_==="Int"?Math.pow(2,31):Math.pow(2,49))-1,L=x/4,A,U,w=!1,D,$;do{D=Math.floor(Math.random()*x),$={start:D,end:D+(_==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},A=0;for(let W of i.getKeys({start:D,limit:1,reverse:!0}))A=W;U=x;for(let W of i.getKeys({start:D+1,end:x,limit:1}))U=W;L*=.875,L<1e3&&!w&&(w=!0,Fe.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${_==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,D,A,U,L))}while(!(L<U-D&&(L<D-A||A===0)));return i.transactionSync(()=>{let W=i.getEntry(Symbol.for("id_allocation"));return(W?.version??null)==O?(Fe.default.info?.("Allocated new id range",$),i.put(Symbol.for("id_allocation"),$,Date.now()),$):(Fe.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...W.value})})}}static setTTLExpiration(_){if(typeof _=="number")h=_*1e3,E||(E=0);else if(_&&typeof _=="object")h=_.expiration*1e3,E=(_.eviction||0)*1e3,Ge=_.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(h<0)throw new Error("Expiration can not be negative");Ge=Ge||(h+E)/4,Pa()}static getResidencyRecord(_){return d.get([Symbol.for("residency_by_id"),_])}static setResidency(_){Pe.getResidency=_&&((T,N)=>{try{return _(T,N)}catch(P){throw P.message+=` in residency function for table ${s}`,P}})}static setResidencyById(_){Pe.getResidencyById=_&&(T=>{try{return _(T)}catch(N){throw N.message+=` in residency function for table ${s}`,N}})}static getResidency(_,T){if(Pe.getResidencyById)return Pe.getResidencyById(_[t]);let N=ni;if(T.replicateTo!=null){if(Array.isArray(T.replicateTo))return T.replicateTo.includes(server.hostname)?T.replicateTo:[server.hostname,...T.replicateTo];T.replicateTo>=0&&(N=T.replicateTo)}if(N>=0&&server.nodes){let P=[server.hostname];if(T.previousResidency)P.push(...T.previousResidency.slice(0,N));else{let O=server.nodes.map(A=>A.name),x=Math.floor(O.length*Math.random());P.push(...O.slice(x,x+N));let L=x+N-O.length;L>0&&P.push(...O.slice(0,L))}return P}}static enableAuditing(){g||(g=!0,im(),Pe.audit=!0)}static coerceId(_){return _===""?null:iS(_,k)}static async dropTable(){delete De[c][s];for(let _ of i.getRange({versions:!0,snapshot:!1,lazy:!0}))_.metadataFlags&Jr&&_.value&&xa(_.value);if(c===a){for(let _ of S)d.remove(Pe.tableName+"/"+_.name),r[_.name]?.drop();d.remove(Pe.tableName+"/"),i.drop(),await d.committed}else console.log("legacy dropTable"),await i.close(),fN.default.unlinkSync(i.env.path);Dp.signalSchemaChange(new Mp.SchemaEventMsg(process.pid,V.DROP_TABLE,c,s))}get(_){let T=this.constructor;if(typeof _=="string"&&T.loadAsInstance!==!1)return this.getProperty(_);if(rm(_))return this.search(_);if(_&&_.id===void 0&&!_.toString()){let N={records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:S,recordCount:void 0,estimatedRecordRange:void 0};return this.getContext()?.includeExpensiveRecordCountEstimates?Pe.getRecordCount().then(P=>(N.recordCount=P.recordCount,N.estimatedRecordRange=P.estimatedRange,N)):N}if(_!==void 0&&T.loadAsInstance===!1){let N=this.getContext(),P=Ur(N),O=P.getReadTxn();if(O?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");let x=Os(_);Bi(x);let L=!0;return _.checkPermission&&(L=this.allowRead(N.user,_)),ks(ks(L,A=>{if(!A)throw new ut.AccessViolation(N.user);let U=!0;return wo(x,N,{transaction:O,ensureLoaded:U},!1,w=>{if(N.onlyIfCached){if(!w?.value)throw new ut.ServerError("Entry is not cached",504)}else if(U){let D=dn(x,w,N);if(D)return P?.disregardReadTxn(),N.loadedFromSource=!0,D.then($=>$?.value)}return w?.value})}),A=>{let U=_?.select;return U&&A!=null?Wu(U,this.constructor)(A):A})}if(_?.property)return this.getProperty(_.property);if(this.doesExist()||_?.ensureLoaded===!1||this.getContext()?.returnNonexistent)return this}allowRead(_,T){let N=Pn(_,T);if(N?.read){if(N.isSuperUser)return!0;let P=N.attribute_permissions,O=T?.select;if(P?.length>0||Tu&&O){if(T||(T={}),O){let x=P?.length>0&&dN(P,"read");T.select=O.map(L=>{let A=L.name||L;if(!x||x[A]){let U=vr[A]?.definition?.tableClass;if(U){if(L.name||(L={name:L}),!L.checkPermission&&T.checkPermission&&(L.checkPermission=T.checkPermission),!U.prototype.allowRead.call(null,_,L))return!1;if(!L.select)return L.name}return L}}).filter(Boolean)}else T.select=P.filter(x=>x.read&&!vr[x.attribute_name]).map(x=>x.attribute_name);return T}else return!0}}allowUpdate(_,T,N){let P=Pn(_,N);if(P?.update){let O=P.attribute_permissions;if(O?.length>0){let x=dN(O,"update");for(let L in T)if(!x[L])return!1;for(let L of O){let A=L.attribute_name;!L.update&&!(A in T)&&(T[A]=this.getProperty(A))}}return Oa(this.getContext())}}allowCreate(_,T,N){if(this.isCollection){let P=Pn(_,N);if(P?.insert){let O=P.attribute_permissions;if(O?.length>0){let x=dN(O,"insert");for(let L in T)if(!x[L])return!1;return Oa(this.getContext())}else return Oa(this.getContext())}}else return this.allowUpdate(_,{})}allowDelete(_,T){return Pn(_,T)?.delete&&Oa(this.getContext())}update(_,T){let N,P=typeof T=="boolean"||T===void 0&&(_==null||typeof _=="object"&&!(_ instanceof URLSearchParams)),O=!1;P?(O=T,T=_,N=this.getId()):N=Os(_);let x=this.getContext();if(!Ur(x))throw new Error("Can not update a table resource outside of a transaction");if(T===!1)return this;if(typeof T=="object"&&T)if(O)Object.isFrozen(T)&&(T={...T}),this.#e={},this.#t=T;else if(P){let A=this.#t;A&&(T=Object.assign(A,T)),this.#t=T}else{let A=!0;if(_==null)throw new TypeError("Can not put a record without a target");return _.checkPermission&&(A=this.allowUpdate(x.user,T,_)),ks(A,U=>{if(!U)throw new ut.AccessViolation(x.user);return ks(i.get(Os(_)),w=>{let D=new tm(w);return D._setChanges(T),this._writeUpdate(N,D.getChanges(),!1),D})})}return this._writeUpdate(N,this.#t,O),this}addTo(_,T){if(typeof T=="number"||typeof T=="bigint")this.#s===Uq?this.set(_,(+this.getProperty(_)||0)+T):(this.#s||this.update(),this.set(_,new up(T)));else throw new Error("Can not add a non-numeric value")}subtractFrom(_,T){if(typeof T=="number")return this.addTo(_,-T);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this.#n}getRecord(){return this.#e}getChanges(){return this.#t}_setChanges(_){this.#t=_}setRecord(_){this.#e=_}invalidate(_){let T=!0,N=this.getContext();return _?.checkPermission&&(T=this.allowDelete(N.user,_,N)),ks(T,P=>{if(!P)throw new ut.AccessViolation(N.user);this._writeInvalidate(_?Os(_):this.getId())})}_writeInvalidate(_,T,N){let P=this.getContext();Bi(_),Ur(this.getContext()).addWrite({key:_,store:i,invalidated:!0,entry:this.#n,before:Ae.invalidate?.bind(this,P,_),beforeIntermediate:Au(T,Ye.invalidate?.bind(this,P,_)),commit:o((x,L)=>{if(!(xr(x,L,N?.nodeId)<=0)){T??=null;for(let A in r)T||(T={}),T[A]===void 0&&(T[A]=this.getProperty(A));Fe.default.trace?.(`Invalidating entry in ${s} id: ${_}, timestamp: ${new Date(x).toISOString()}`),y(_,T,L,x,xn,g,{user:P?.user,residencyId:N?.residencyId,nodeId:N?.nodeId,tableToTrack:s},"invalidate")}},"commit")})}_writeRelocate(_,T){let N=this.getContext();Bi(_),Ur(this.getContext()).addWrite({key:_,store:i,invalidated:!0,entry:this.#n,before:Ae.relocate?.bind(this,N,_),beforeIntermediate:Ye.relocate?.bind(this,N,_),commit:o((O,x)=>{if(xr(O,x,T?.nodeId)<=0)return;let L=Pe.getResidencyRecord(T.residencyId),A=0,U=null,w=x?.value;if(L&&!L.includes(server.hostname)){for(let D in r)U||(U={}),U[D]=w[D];A=xn}else U=w;Fe.default.trace?.(`Relocating entry id: ${_}, timestamp: ${new Date(O).toISOString()}`),y(_,U,x,O,A,g,{user:N.user,residencyId:T.residencyId,nodeId:T.nodeId,expiresAt:T.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(_,T){let N={previousResidency:this.getResidencyRecord(_.residencyId),isRelocation:!0},P=La(this.getResidency(T.value,N)),O;if(P){if(!P.includes(server.hostname))return!1;O=$c(P)}let x=0;Fe.default.debug?.("Performing a relocate of an entry",existing_entry.key,T.value,P);let L=y(_.key,T.value,_,_.version,x,!0,{residencyId:O,expiresAt:T.expiresAt},"relocate",!1,null);return!0}static evict(_,T,N){let P=this.Source,O;if(!((I||g)&&(!T||(O=i.getEntry(_),!O||!T)||O.version!==N))){if(I){if(i.hasLock(_,O.version))return;let x;for(let L in r)x||(x={}),x[L]=T[L];if(x)return y(_,x,O,N,qa,null,null,null,!0)}if(i.ifVersion(_,N,()=>{yu(_,T,null)}),g)return y(_,null,O,N,qa,null,null,null,!0);al(i,O??i.getEntry(_),N)}}lock(){throw new Error("Not yet implemented")}static operation(_,T){return _.table||=s,_.schema||=c,global.operation(_,T)}put(_,T){if(T===void 0||T instanceof URLSearchParams)this.update(_,!0);else{let N=!0;if(_==null)throw new TypeError("Can not put a record without a target");let P=this.getContext();return _.checkPermission&&(N=this.allowUpdate(P.user,T,_)),ks(N,O=>{if(!O)throw new ut.AccessViolation(P.user);if(Array.isArray(T))for(let x of T){let L=x[t];this._writeUpdate(L,x,!0)}else{let x=Os(_);this._writeUpdate(x,T,!0)}})}}create(_,T){let N=!0,P=this.getContext();if(!T&&!(_ instanceof URLSearchParams)&&(T=_,_=void 0),!T||typeof T!="object"||Array.isArray(T))throw new TypeError("Can not create a record without an object");return _?.checkPermission&&(N=this.allowCreate(P.user,T,_)),ks(N,O=>{if(!O)throw new ut.AccessViolation(P.user);let x=Os(_)??T[t];if(x===void 0)x=this.constructor.getNewId();else if(i.get(x))throw new ut.ClientError("Record already exists",409);return this._writeUpdate(x,T,!0),T})}patch(_,T){if(T===void 0||T instanceof URLSearchParams)this.update(_,!1);else{let N=this.update(_,T);if(N?.then)return N.then(()=>{})}}_writeUpdate(_,T,N,P){let O=this.getContext(),x=Ur(O);Bi(_);let L=this.#n??i.getEntry(_);this.#s=N?Uq:xae;let A=o(w=>N?w.put?()=>w.put(O,_,T):null:w.patch?()=>w.patch(O,_,T):w.put?()=>w.put(O,_,gl(this)):null,"writeToSources"),U={key:_,store:i,entry:L,nodeName:O?.nodeName,validate:o(w=>{T||(T=this.#t),N||T&&Mg(this.#t===T?this:T)?O?.source||(x.checkOverloaded(),this.validate(T,!N),H&&(T[H.name]=H.type==="Date"?new Date(w):H.type==="String"?new Date(w).toISOString():w),N&&(t&&T[t]!==_&&(T[t]=_),G&&(L?.value?T[G.name]=L?.value[G.name]:T[G.name]=G.type==="Date"?new Date(w):G.type==="String"?new Date(w).toISOString():w),T=gl(T))):x.removeWrite(U)},"validate"),before:A(Ae),beforeIntermediate:Au(T,A(Ye)),commit:o((w,D,$)=>{if($){if(O&&D?.version>(O.lastModified||0)&&(O.lastModified=D.version),this.#n=D,D?.value&&D.value.getRecord)throw new Error("Can not assign a record to a record, check for circular references");N||(this.#e=D?.value??null)}this.#t=void 0,this.#r=w;let W=D?.value,j;this.#s=0;let B=!1,Ee=xr(w,D,P?.nodeId),me;if(Ee<=0){if(g){let fe=D.localTime,ae=D.version;Fe.default.trace?.("Applying CRDT update to record with id: ",_,"txn time",new Date(w),"applying later update from:",new Date(ae),"local recorded time",new Date(fe));let ke=[];for(;fe>w||ae>=w&&fe>0;){let Be=l.get(fe);if(!Be)break;let Le=It(Be);if(ae=Le.version,ae>=w){if(ae===w){if(Ee=xr(w,{version:ae,localTime:fe},P?.nodeId),Ee===0)return;if(Ee>0)continue}if(Le.type==="patch")ke.push(Le),me=T;else if(Le.type==="put"||Le.type==="delete")return}fe=Le.previousLocalTime}fe||Fe.default.debug?.("No further audit history, applying incremental updates based on available history",_,"existing version preserved",D),ke.sort((Be,Le)=>Be.version-Le.version);for(let Be of ke){let Le=Be.getValue(i);if(Fe.default.debug?.("Rebuilding update with future patch:",new Date(Be.version),Le,Be),j=A_(j??T,Le,N),!j)return}}else{if(N)return;j=A_(j??T,W,N),Fe.default.debug?.("Rebuilding update without audit:",j)}Fe.default.trace?.("Rebuilt record to save:",j," is full update:",N)}let pe;if(N&&!j?pe=T:this.constructor.loadAsInstance===!1?pe=gl(W,j??T):(this.#e=W,pe=gl(this,j??T)),this.#e=pe,pe&&pe.getRecord)throw new Error("Can not assign a record to a record, check for circular references");let ne;if(P?.residencyId!=null)ne=P.residencyId;else{L?.residencyId&&(O.previousResidency=Pe.getResidencyRecord(L.residencyId));let fe=La(Pe.getResidency(pe,O));if(fe&&!fe.includes(server.hostname))if(me??=pe,B=!0,Pe.getResidencyById)pe=void 0;else{pe=null;for(let ae in r)pe||(pe={}),pe[ae]=me[ae]}ne=$c(fe)}N||(me=T);let ie=O?.expiresAt??(h?h+Date.now():-1);Fe.default.trace?.(`Saving record with id: ${_}, timestamp: ${new Date(w).toISOString()}${ie?", expires at: "+new Date(ie).toISOString():""}${D?", replaces entry from: "+new Date(D.version).toISOString():", new entry"}`,(()=>{try{return JSON.stringify(pe).slice(0,100)}catch{return""}})()),yu(_,W,pe);let xe=N?"put":"patch";y(_,pe,D,w,B?xn:0,g,{omitLocalRecord:B,user:O?.user,residencyId:ne,expiresAt:ie,nodeId:P?.nodeId,originatingOperation:O?.originatingOperation,tableToTrack:c==="system"?null:s},xe,!1,me),O.expiresAt&&Pa()},"commit")};x.addWrite(U)}async delete(_){if(rm(_)){_.select=["$id"];for await(let T of this.search(_))this._writeDelete(T.$id);return!0}if(_){let T=!0,N=this.getContext();return _.checkPermission&&(T=this.allowDelete(N.user,_,N)),ks(T,P=>{if(!P)throw new ut.AccessViolation(N.user);let O=Os(_);return this._writeDelete(O),!0})}return this._writeDelete(this.getId()),!!this.#e}_writeDelete(_,T){let N=Ur(this.getContext());Bi(_);let P=this.getContext();return N.addWrite({key:_,store:i,entry:this.#n,nodeName:P?.nodeName,before:Ae.delete?.bind(this,P,_),beforeIntermediate:Ye.delete?.bind(this,P,_),commit:o((O,x,L)=>{let A=x?.value;L&&(P&&x?.version>(P.lastModified||0)&&(P.lastModified=x.version),Pe._updateResource(this,x)),!(xr(O,x,T?.nodeId)<=0)&&(yu(this.getId(),A),Fe.default.trace?.(`Deleting record with id: ${_}, txn timestamp: ${new Date(O).toISOString()}`),g||R?(y(_,null,x,O,0,g,{user:P?.user,nodeId:T?.nodeId,tableToTrack:s},"delete"),g||Pa()):al(i,x))},"commit")}),!0}search(_){let T=this.getContext(),N=Ur(T);if(!_)throw new Error("No query provided");if(_.parseError)throw _.parseError;if(_.checkPermission&&!this.allowRead(T.user,_))throw new ut.AccessViolation(T.user);T&&(T.lastModified=Dae);let P=_.conditions;P?P.length===void 0&&(P=P[Symbol.iterator]?Array.from(P):[P]):P=Array.isArray(_)?_:_[Symbol.iterator]?Array.from(_):[];let O=_.id??this.getId();O&&(P=[{attribute:null,comparator:Array.isArray(O)?"prefix":"starts_with",value:O}].concat(P));let x,L={};function A(ie,xe){let fe;switch(xe){case"and":case void 0:if(ie.length<1)throw new Error('An "and" operator requires at least one condition');fe=!0;break;case"or":if(ie.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+xe)}for(let ae of ie){if(ae.conditions){ae.conditions=A(ae.conditions,ae.operator);continue}let ke=ae[0]??ae.attribute,Be=ke==null?k:Ki(S,ke);if(Be)(Be.type||qA[ae.comparator])&&(ae[1]===void 0?ae.value=w(ae.value,Be):ae[1]=w(ae[1],Be));else if(ke!=null&&!_.allowConditionsOnDynamicAttributes)throw(0,ut.handleHDBError)(new Error,`${ke} is not a defined attribute`,404);if(ae.chainedConditions)if(ae.chainedConditions.length===1&&(!ae.operator||ae.operator=="and")){let Le=ae.chainedConditions[0],Me,ht;if(Le.comparator==="gt"||Le.comparator==="greater_than"||Le.comparator==="ge"||Le.comparator==="greater_than_equal"?(Me=ae,ht=Le):(Me=Le,ht=ae),Me.comparator!=="lt"&&Me.comparator!=="less_than"&&Me.comparator!=="le"&&Me.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let Nt=ht.comparator==="ge"||ht.comparator==="greater_than_equal",_t=Me.comparator==="le"||Me.comparator==="less_than_equal";ae.comparator=(Nt?"ge":"gt")+(_t?"le":"lt"),ae.value=[ht.value,Me.value]}else throw new Error("Multiple chained conditions are not currently supported")}return ie}o(A,"prepareConditions");function U(ie,xe){if(_.enforceExecutionOrder)return ie;for(let fe of ie)fe.conditions&&(fe.conditions=U(fe.conditions,fe.operator));return ie.length>1&&xe!=="or"?Oae(ie,cg(Pe)):ie}o(U,"orderConditions");function w(ie,xe){return Array.isArray(ie)?ie.map(fe=>iS(fe,xe)):iS(ie,xe)}o(w,"coerceTypedValues");let D=_.operator;(P.length>0||D)&&(P=A(P,D));let $=typeof _.sort=="object"&&_.sort,W;if($&&D!=="or"){let ie=$.attribute;if(ie==null)throw new ut.ClientError("Sort requires an attribute");if(x=P.find(xe=>Vu(xe.attribute)===Vu(ie)),!x){let xe=Ki(S,ie);if(!xe)throw(0,ut.handleHDBError)(new Error,`${Array.isArray(ie)?ie.join("."):ie} is not a defined attribute`,404);if(xe.indexed)x={...$,comparator:"sort"},P.push(x);else if(P.length===0&&!_.allowFullScan)throw(0,ut.handleHDBError)(new Error,`${Array.isArray(ie)?ie.join("."):ie} is not indexed and not combined with any other conditions`,404)}x&&(x.descending=!!$.descending)}P=U(P,D),$&&(x&&P[0]===x?$.next&&(W={dbOrderedAttribute:$.attribute,attribute:$.next.attribute,descending:$.next.descending,next:$.next.next}):(x&&P.splice(P.indexOf(x),1),W=$));let j=_.select;if(P.length===0&&(P=[{attribute:t,comparator:"greater_than",value:!0}]),_.explain)return{conditions:P,operator:D,postOrdering:W,selectApplied:!!j};let B=N.useReadTxn(),Ee=GA(P,D,Pe,B,_,T,(ie,xe)=>sm(ie,j,T,B,xe),L),me=_.ensureLoaded!==!1,pe=Pe.transformEntryForSelect(j,T,B,L,me,!0),ne=Pe.transformToOrderedSelect(Ee,j,W,T,B,pe);return(_.offset||_.limit!==void 0)&&(ne=ne.slice(_.offset,_.limit!==void 0?(_.offset||0)+_.limit:void 0)),ne.onDone=()=>{ne.onDone=null,N.doneReadTxn()},ne.selectApplied=!0,ne.getColumns=()=>{if(j){let ie=[];for(let xe of j)xe==="*"?ie.push(...S.map(fe=>fe.name)):ie.push(xe.name||xe);return ie}return S.filter(ie=>!ie.computed&&!ie.relationship).map(ie=>ie.name)},ne}static transformToOrderedSelect(_,T,N,P,O,x){let L=new QE;if(N){_=sm(_,T,P,O,null);let A;L.iterate=function(){let w,D=_[Symbol.asyncIterator]?_[Symbol.asyncIterator]():_[Symbol.iterator](),$,W=N.dbOrderedAttribute,j,B,Ee=!0;function me(ne){let ie=ne.next&&me(ne.next),xe=ne.descending;return P.sort=ne,(fe,ae)=>{let ke=Ru(fe,ne.attribute,P),Be=Ru(ae,ne.attribute,P),Le=xe?(0,Ll.compareKeys)(Be,ke):(0,Ll.compareKeys)(ke,Be);return Le===0?ie?.(fe,ae)||0:Le}}o(me,"createComparator");let pe=me(N);return{async next(){let ne;if(w)if(ne=w.next(),ne.done){if($)return L.onDone&&L.onDone(),ne}else return{value:await x.call(this,ne.value)};A=[],j&&A.push(j);do if(ne=await D.next(),ne.done){if($=!0,A.length)break;return L.onDone&&L.onDone(),ne}else{let ie=ne.value;if(ie?.then&&(ie=await ie),W){let xe=Ru(ie,W,P);if(Ee)Ee=!1,B=xe;else if(xe!==B){B=xe,j=ie;break}}A.push(ie)}while(!0);return N.isGrouped,A.sort(pe),w=A[Symbol.iterator](),ne=w.next(),ne.done?(L.onDone&&L.onDone(),ne):{value:await x.call(this,ne.value)}},return(){return L.onDone&&L.onDone(),D.return()},throw(){return L.onDone&&L.onDone(),D.throw()}}};let U=o(w=>{if(typeof T=="object"&&Array.isArray(w.attribute))for(let D=0;D<T.length;D++){let $=T[D],W;if($.name===w.attribute[0]){for(W=$.sort||($.sort={});W.next;)W=W.next;W.attribute=w.attribute.slice(1),W.descending=w.descending}else $===w.attribute[0]&&(T[D]=W={name:$,sort:{attribute:w.attribute.slice(1),descending:w.descending}})}w.next&&U(w.next)},"applySortingOnSelect");U(N)}else L.iterate=(_[Symbol.asyncIterator]||_[Symbol.iterator]).bind(_),L=L.map(function(A){try{let U=x.call(this,A);return typeof U?.catch=="function"?U.catch(w=>{throw w.partialObject={[t]:A.key},w}):U}catch(U){throw U.partialObject={[t]:A.key},U}});return L}static transformEntryForSelect(_,T,N,P,O,x){let L;O&&I&&!(typeof _=="string"?[_]:_)?.every(w=>{let D;return typeof w=="object"?D=w.name:D=w,r[D]||D===t})&&(L=!0);let A,U=o(function(w){let D;if(T?.transaction?.stale&&(T.transaction.stale=!1),w!=null){if(D=w.deref?w.deref():w.value,!D&&(w.key===void 0||w.deref)||w.metadataFlags&xn){if(w.metadataFlags&xn&&T.replicateFrom===!1&&x&&w.residencyId)return nc.SKIP;if(w=wo(w.key??w,T,{transaction:N,lazy:_?.length<4,ensureLoaded:O},this?.isSync,$=>$),w?.then)return w.then(U.bind(this));D=w?.value}if(L&&w?.metadataFlags&(xn|qa)||w?.expiresAt!=null&&w?.expiresAt<Date.now()){if(T.onlyIfCached)return{[t]:w.key,message:"This entry has expired"};let $=dn(w.key??w,w,T);if($?.then)return $.then(U)}}if(D==null)return x?nc.SKIP:D;if(_&&!(_[0]==="*"&&_.length===1)){let $,W=o((B,Ee)=>{let me;typeof B=="object"?me=B.name:me=B;let pe=vr?.[me],ne;if(pe){let ie=P?.[me];if(ie)if(ie.hasMappings){let fe=pe.from?D[pe.from]:Vu(w.key);ne=ie.get(fe),ne||(ne=[])}else ne=ie.fromRecord?.(D);else ne=pe(D,T,w,!0);let xe=o(fe=>{if(pe.directReturn)return Ee(fe,me);if(fe&&typeof fe=="object"){let ae=pe.definition?.tableClass||Pe;A||(A={});let ke=A[me]||(A[me]=ae.transformEntryForSelect(me===B?null:B.select||(Array.isArray(B)?B:null),T,N,ie,O));if(Array.isArray(fe)){let Be=[],Le=ae.transformToOrderedSelect(fe,B.select,typeof B.sort=="object"&&B.sort,T,N,ke)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),Me=o(Nt=>{for(;!Nt.done;){if(Nt?.then)return Nt.then(Me);Be.push(Nt.value),Nt=Le.next()}Ee(Be,me)},"nextValue"),ht=Me(Le.next());ht&&($||($=[]),$.push(ht));return}else if(fe=ke.call(this,fe),fe?.then){$||($=[]),$.push(fe.then(Be=>Ee(Be,me)));return}}Ee(fe,me)},"handleResolvedValue");ne?.then?($||($=[]),$.push(ne.then(xe))):xe(ne);return}else ne=D[me],ne&&typeof ne=="object"&&me!==B&&(ne=Pe.transformEntryForSelect(B.select||B,T,N,null)({value:ne}));Ee(ne,me)},"selectAttribute"),j;if(typeof _=="string")W(_,B=>{j=B});else if(Array.isArray(_))if(_.asArray)j=[],_.forEach((B,Ee)=>{B==="*"?_[Ee]=D:W(B,me=>j[Ee]=me)});else{j={};let B=_.forceNulls;for(let Ee of _)if(Ee==="*")for(let me in D)j[me]=D[me];else W(Ee,(me,pe)=>{me===void 0&&B&&(me=null),j[pe]=me})}else throw new ut.ClientError("Invalid select"+_);return $?Promise.all($).then(()=>j):j}return D},"transform");return U}async subscribe(_){if(!l)throw new Error("Can not subscribe to a table without an audit log");g||et({table:s,database:c,schemaDefined:u,attributes:S,audit:!0}),_||(_={});let T=!_.rawEvents,N=[],P=jA(Pe,this.getId()??null,function(L,A,U,w){try{let D=A.getValue?.(i,T),$=A.type;if(!D&&$==="patch"&&T){let j=i.getEntry(L);j?.version===A.version?D=j.value:D=A.getValue?.(i,!0,U),$="put"}let W={id:L,localTime:U,value:D,version:A.version,type:$,beginTxn:w};N?N.push(W):(c!=="system"&&Ve(A.size??1,"db-message",s,null),this.send(W))}catch(D){Fe.default.error?.(D)}},_.startTime||0,_),O=(async()=>{this.isCollection&&(P.includeDescendants=!0,_.onlyChildren&&(P.onlyChildren=!0)),_.supportsTransactions&&(P.supportsTransactions=!0);let L=this.getId(),A=_.previousCount;A>1e3&&(A=1e3);let U=_.startTime;if(this.isCollection){if(U){if(A)throw new ut.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:w,value:D}of l.getRange({start:U,exclusiveStart:!0,snapshot:!1})){let $=It(D);if($.tableId!==n)continue;let W=$.recordId;if(L==null||kq(L,W)){let j=$.getValue(i,T,w);if(x({id:W,localTime:w,value:j,version:$.version,type:$.type,size:$.size}),P.queue?.length>Bq&&await P.waitForDrain()===!1)return}P.startTime=w}}else if(A){let w=[];for(let{key:D,value:$}of l.getRange({start:"z",end:!1,reverse:!0}))try{let W=It($);if(W.tableId!==n)continue;let j=W.recordId;if(L==null||kq(L,j)){let B=W.getValue(i,T,D);if(w.push({id:j,localTime:D,value:B,version:W.version,type:W.type}),--A<=0)break}}catch(W){Fe.default.error("Error getting history entry",D,W)}for(let D=w.length;D>0;)x(w[--D]);w[0]&&(P.startTime=w[0].localTime)}else if(!_.omitCurrent){for(let{key:w,value:D,version:$,localTime:W,size:j}of i.getRange({start:L??!1,end:L==null?void 0:[L,Ll.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(D&&(x({id:w,localTime:W,value:D,version:$,type:"put",size:j}),P.queue?.length>Bq&&await P.waitForDrain()===!1))return}}else{A&&!U&&(U=0);let w=this.#n?.localTime;if(w===FA&&(i.cache?.delete(L),this.#n=i.getEntry(L),Fe.default.trace?.("re-retrieved record",w,this.#n?.localTime),w=this.#n?.localTime),Fe.default.trace?.("Subscription from",U,"from",L,w),U<w){let D=[],$=w;do{let W=l.get($);if(W){_.omitCurrent=!0;let j=It(W),B=j.getValue(i,T,$);T&&(j.type="put"),D.push({id:L,value:B,localTime:$,...j}),$=j.previousLocalTime}else break;A&&A--}while($>U&&A!==0);for(let W=D.length;W>0;)x(D[--W]);P.startTime=w}!_.omitCurrent&&this.doesExist()&&x({id:L,localTime:w,value:this.#e,version:this.#r,type:"put"})}for(let w of N)x(w);N=null})();function x(L){c!=="system"&&Ve(L.size??1,"db-message",s,null),P.send(L)}return o(x,"send"),_.listener&&P.on("data",_.listener),P}static subscribeOnThisThread(_,T){return _===0||T?.crossThreads===!1}doesExist(){return!!(this.#e||this.#s)}publish(_,T,N){if(T===void 0||T instanceof URLSearchParams)this._writePublish(this.getId(),_,T);else{let P=!0,O=this.getContext();return _.checkPermission&&(P=this.allowCreate(O.user,_,O)),ks(P,x=>{if(!x)throw new ut.AccessViolation(O.user);let L=Os(_);this._writePublish(L,T,N)})}}_writePublish(_,T,N){let P=Ur(this.getContext());_??=null,_!==null&&Bi(_);let O=this.getContext();P.addWrite({key:_,store:i,entry:this.#n,nodeName:O?.nodeName,validate:o(()=>{O?.source||(P.checkOverloaded(),this.validate(T))},"validate"),before:Ae.publish?.bind(this,O,_,T),beforeIntermediate:Au(T,Ye.publish?.bind(this,O,_,T)),commit:o((x,L,A)=>{L===void 0&&R&&!g&&Pa(),Fe.default.trace?.(`Publishing message to id: ${_}, timestamp: ${new Date(x).toISOString()}`),y(_,L?.value??null,L,L?.version||x,0,!0,{user:O?.user,residencyId:N?.residencyId,expiresAt:O?.expiresAt,nodeId:N?.nodeId,tableToTrack:s},"message",!1,T)},"commit")})}validate(_,T){let N,P=o((O,x,L)=>{if(x.type&&O!=null)if(T&&O.__op__&&(O=O.value),x.properties){typeof O!="object"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an object${x.type?" ("+x.type+")":""}`);let A=x.properties;for(let U=0,w=A.length;U<w;U++){let D=A[U];if(D.relationship||D.computed){_.hasOwnProperty(D.name)&&(N||(N=[])).push(`Computed property ${L}.${D.name} may not be directly assigned a value`);continue}let $=P(O[D.name],D,L+"."+D.name);$&&(O[D.name]=$)}if(x.sealed&&O!=null&&typeof O=="object")for(let U in O)A.find(w=>w.name===U)||(N||(N=[])).push(`Property ${U} is not allowed within object in property ${L}`)}else switch(x.type){case"Int":(typeof O!="number"||O>>0!==O)&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof O!="number"||!(Math.floor(O)===O&&Math.abs(O)<=9007199254740992))&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof O!="number"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a number`);break;case"ID":typeof O=="string"||O?.length>0&&O.every?.(A=>typeof A=="string")||(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a string, or an array of strings`);break;case"String":typeof O!="string"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a string`);break;case"Boolean":typeof O!="boolean"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a boolean`);break;case"Date":if(!(O instanceof Date)){if(typeof O=="string"||typeof O=="number")return new Date(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Date`)}break;case"BigInt":if(typeof O!="bigint"){if(typeof O=="string"||typeof O=="number")return BigInt(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a bigint`)}break;case"Bytes":if(!(O instanceof Uint8Array)){if(typeof O=="string")return Buffer.from(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Buffer or Uint8Array`)}break;case"Blob":if(!(O instanceof Ls)){if(typeof O=="string"&&(O=Buffer.from(O)),O instanceof Buffer)return createBlob(O,{type:"text/plain"});(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Blob`)}break;case"array":if(Array.isArray(O)){if(x.elements)for(let A=0,U=O.length;A<U;A++){let w=O[A],D=P(w,x.elements,L+"[*]");D&&(O[A]=D)}}else(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an Array`);break}x.nullable===!1&&O==null&&(N||(N=[])).push(`Property ${L} is required (and not does not allow null values)`)},"validateValue");for(let O=0,x=S.length;O<x;O++){let L=S[O];if(L.relationship||L.computed){Object.hasOwn(_,L.name)&&(N||(N=[])).push(`Computed property ${L.name} may not be directly assigned a value`);continue}if(!T||L.name in _){let A=P(_[L.name],L,L.name);A!==void 0&&(_[L.name]=A)}}if(f)for(let O in _)S.find(x=>x.name===O)||(N||(N=[])).push(`Property ${O} is not allowed`);if(N)throw new ut.ClientError(N.join(". "))}getUpdatedTime(){return this.#r}wasLoadedFromSource(){return I?!!this.#i:void 0}static async addAttributes(_){let T=S.slice(0);for(let N of _){if(!N.name)throw new ut.ClientError("Attribute name is required");if(N.name.match(/[`/]/))throw new ut.ClientError("Attribute names cannot include backticks or forward slashes");Pae(N.name),T.push(N)}return et({table:s,database:c,schemaDefined:u,attributes:T}),Pe.indexingOperation}static async removeAttributes(_){let T=S.filter(N=>!_.includes(N.name));return et({table:s,database:c,schemaDefined:u,attributes:T}),Pe.indexingOperation}static getSize(){let _=i.getStats();return(_.treeBranchPageCount+_.treeLeafPageCount+_.overflowPages)*_.pageSize}static getAuditSize(){let _=l?.getStats();return _&&(_.treeBranchPageCount+_.treeLeafPageCount+_.overflowPages)*_.pageSize}static getStorageStats(){let _=i.env.path,T=fN.default.statfsSync?.(_)??{};return{available:T.bavail*T.bsize,free:T.bfree*T.bsize,size:T.blocks*T.bsize}}static async getRecordCount(_){let T=i.getStats().entryCount,N=1e3/2,P=performance.now(),O=Math.floor(T/2),x=_?.exactCount,L=0,A=0,U;for(let{value:w}of i.getRange({start:!0,lazy:!0,snapshot:!1}))if(w!=null&&L++,A++,await rc(),!x&&A<O&&performance.now()-P>N){U=A;break}if(U){let w=L;L=0;for(let{value:ne}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:U,snapshot:!1}))ne!=null&&L++,await rc();let D=U*2,$=(L+w)/D,W=Math.pow((L-w+1)/U/2,2)+$*(1-$)/D,j=Math.max(Math.sqrt(W)*T,1),B=Math.round($*T),Ee=Math.max(B-1.96*j,L+w),me=Math.min(B+1.96*j,T),pe=Math.pow(10,Math.round(Math.log10(j)));return pe>B&&(pe=pe/10),L=Math.round(B/pe)*pe,{recordCount:L,estimatedRange:[Math.round(Ee),Math.round(me)]}}return{recordCount:L}}static updatedAttributes(){vr=this.propertyResolvers={$id:o((_,T,N)=>({value:N.key}),"$id"),$updatedtime:o((_,T,N)=>N.version,"$updatedtime"),$updatedTime:o((_,T,N)=>N.version,"$updatedTime"),$expiresAt:o((_,T,N)=>N.expiresAt,"$expiresAt"),$record:o((_,T,N)=>N?{value:_}:_,"$record"),$distance:o((_,T,N)=>N&&(N.distance??T?.vectorDistances?.get(N)),"$distance")};for(let _ of this.attributes){_.isPrimaryKey&&(k=_),_.resolve=null;let T=_.relationship,N=_.computed;if(T)if(_.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),N&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),Tu=!0,T.to)_.elements?.definition?(vr[_.name]=_.resolve=(P,O,x,L)=>{let A=P[T.from?T.from:t],U=_.elements.definition.tableClass;return L?$u({attribute:T.to,value:A},Ur(O).getReadTxn(),!1,U,!1).map(w=>w&&w.key!==void 0?w:U.primaryStore.getEntry(w,{transaction:Ur(O).getReadTxn()})).asArray:U.search([{attribute:T.to,value:A}],O).asArray},_.set=()=>{},_.resolve.definition=_.elements.definition,_.resolve.to=T.to,T.from&&(_.resolve.from=T.from)):console.error(`The one-to-many/many-to-many relationship property "${_.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(T.from){let P=_.definition||_.elements?.definition;P?(vr[_.name]=_.resolve=(O,x,L,A)=>{let U=O[T.from];if(U===void 0)return;if(_.elements){let D,$=U?.map(W=>{let j=P.tableClass.primaryStore[A?"getEntry":"get"](W,{transaction:Ur(x).getReadTxn()});return j?.then&&(D=!0),Pe.loadAsInstance===!1&&Object.freeze(A?j?.value:j),j});return T.filterMissing?D?Promise.all($).then(W=>W.filter(Hq)):$.filter(Hq):D?Promise.all($):$}let w=P.tableClass.primaryStore[A?"getEntry":"get"](U,{transaction:Ur(x).getReadTxn()});return Pe.loadAsInstance===!1&&Object.freeze(A?w?.value:w),w},_.set=(O,x)=>{if(Array.isArray(x)){let L=x.map(A=>A.getId?.()||A[P.tableClass.primaryKey]);O[T.from]=L}else{let L=x.getId?.()||x[P.tableClass.primaryKey];O[T.from]=L}},_.resolve.definition=_.definition||_.elements?.definition,_.resolve.from=T.from):console.error(`The relationship property "${_.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${_.name}" in table "${s}" must use either "from" or "to" arguments`);else if(N)typeof N.from=="function"&&this.setComputedAttribute(_.name,N.from),vr[_.name]=_.resolve=(P,O,x)=>{let L=typeof N.from=="string"?P[N.from]:P,A=this.userResolvers[_.name];if(A)return A(L,O,x);Fe.default.warn(`Computed attribute "${_.name}" does not have a function assigned to it. Please use setComputedAttribute('${_.name}', resolver) to assign a resolver function.`),this.userResolvers[_.name]=()=>{}},_.resolve.directReturn=!0;else if(r[_.name]?.customIndex?.propertyResolver){let P=r[_.name].customIndex;vr[_.name]=(O,x,L)=>{let A=O[_.name];return P.propertyResolver(A,x,L)},vr[_.name].directReturn=!0}}dp(this,this),dp(tm,this,!0);for(let _ of S){let T=_.name;_.resolve&&Object.defineProperty(i.encoder.structPrototype,T,{get(){return _.resolve(this,Yu.getStore())},set(N){return _.set(this,N)},configurable:!0})}}static setComputedAttribute(_,T){let N=Ki(S,_);if(!N){console.error(`The attribute "${_}" does not exist in the table "${s}"`);return}if(!N.computed){console.error(`The attribute "${_}" is not defined as computed in the table "${s}"`);return}this.userResolvers[_]=T}static async deleteHistory(_=0,T=!1){let N;for(let{key:P,value:O}of l.getRange({start:0,end:_}))await rc(),It(O).tableId===n&&(N=Y_(l,P,O));if(T)for(let P of i.getRange({start:0,versions:!0})){let{key:O,value:x,localTime:L}=P;await rc(),x===null&&L<_&&(N=al(i,P))}await N}static async*getHistory(_=0,T=1/0){for(let{key:N,value:P}of l.getRange({start:_||1,end:T})){await rc();let O=It(P);O.tableId===n&&(yield{id:O.recordId,localTime:N,version:O.version,type:O.type,value:O.getValue(i,!0,N),user:O.user,operation:O.originatingOperation})}}static async getHistoryOfRecord(_){let T=[];if(_==null)throw new Error("An id is required");let N=i.getEntry(_);if(!N)return T;let P=N.localTime;if(!P)throw new Error("The entry does not have a local audit time");let O=0;do{await rc();let x=l.get(P);if(x){let L=It(x);T.push({id:L.recordId,localTime:P,version:L.version,type:L.type,value:L.getValue(i,!0,P),user:L.user}),P=L.previousLocalTime}else break}while(O<1e3&&P);return T.reverse()}static cleanup(){z?.remove()}}let XE=nS(async(K,_,T)=>{for(let N of Pe.sources)if(N.get&&(!N.get.reliesOnPrototype||N.prototype.get)){if(N.available?.(T)===!1)continue;_.source=N;let P=await N.get(K,_);if(P)return P}},()=>{throw new ut.ServerError("Service unavailable, exceeded request queue limit for resolving cache record",503)});Pe.updatedAttributes();let gb=Pe.prototype;return h&&Pe.setTTLExpiration(h/1e3),X&&ZE(),Pe;function yu(K,_,T){let N;for(let P in r){let O=r[P],x=O.isIndexing,L=vr[P],A=T&&(L?L(T):T[P]),U=_&&(L?L(_):_[P]);if(A===U&&!x)continue;if(O.customIndex){O.customIndex.index(K,A,U);continue}N=!0;let w=O.indexNulls,D=(0,Lp.getIndexedValues)(A,w),$=(0,Lp.getIndexedValues)(U,w);if($?.length>0){let W=new Set($);if(D=D?D.filter(j=>{if(W.has(j))W.delete(j);else return!0}):[],$=Array.from(W),($.length>0||D.length>0)&&vq){let j=$.concat(D).map(B=>({key:B,value:K}));O.prefetch(j,Fq)}for(let j=0,B=$.length;j<B;j++)O.remove($[j],K)}else D?.length>0&&vq&&O.prefetch(D.map(W=>({key:W,value:K})),Fq);if(D)for(let W=0,j=D.length;W<j;W++)O.put(D[W],K)}return N}o(yu,"updateIndices");function Bi(K){switch(typeof K){case"number":return!0;case"string":if(K.length<659)return!0;if(K.length>xq)throw new Error("Primary key size is too large: "+K.length);break;case"object":if(K===null)throw new Error("Invalid primary key of null");break;case"bigint":if(K<2n**64n&&K>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof K)}if((0,Ll.writeKey)(K,Bae,0)>xq)throw new Error("Primary key size is too large: "+K.length);return!0}o(Bi,"checkValidId");function Os(K){return typeof K=="object"&&K?K.id:K}o(Os,"requestTargetToId");function rm(K){return typeof K=="object"&&K&&K.isCollection}o(rm,"isSearchTarget");function nm(K){}o(nm,"isRequestTarget");function wo(K,_,T,N,P){if(Pe.getResidencyById&&T.ensureLoaded&&_?.replicateFrom!==!1){let x=La(Pe.getResidencyById(K));if(x&&!x.includes(server.hostname)&&C)return C({key:K,residency:x}).then(P)}let O=o(()=>{if(_?.transaction?.stale&&(_.transaction.stale=!1),T.transaction?.isDone)return P(null,K);let x=i.getEntry(K,T);return(c!=="system"||s==="hdb_analytics")&&($q.default.trace?.("Recording db-read action for",`${c}.${s}`),Ve(x?.size??1,"db-read",s,null)),_?._freezeRecords&&Object.freeze(x?.value),x?.residencyId&&x.metadataFlags&xn&&C&&T.ensureLoaded&&_?.replicateFrom!==!1?C(x).then(L=>P(L,K),L=>(Fe.default.error?.("Error loading remote record",K,x,T,L),P(null,K))):(x&&_&&(x?.version>(_.lastModified||0)&&(_.lastModified=x.version),x?.localTime&&!_.lastRefreshed&&(_.lastRefreshed=x.localTime)),P(x,K))},"whenPrefetched");return N?O():te>0?(te--,O()):new Promise((x,L)=>{te===0?(te--,i.prefetch([K],()=>{A(),U()})):(de.push(K),le.push(U),de.length>JE&&(te--,A()));function A(){if(de.length>0){let w=le;i.prefetch(de,()=>{te===-1?A():te++;for(let D of w)D()}),de=[],le=[],ye>2&&ye--}else te=ye,ye<em&&ye++}o(A,"prefetch");function U(){try{x(O())}catch(w){L(w)}}o(U,"load")})}o(wo,"loadLocalRecord");function Pn(K,_){let T=_?.checkPermission;if(typeof T!="object"){if(!K?.role)return;T=K.role.permission}if(T.super_user)return Fae;let N=T[c],P,O=N?.tables;if(O)return O[s];if(c==="data"&&(P=T[s])&&!P.tables)return P}o(Pn,"getTablePermissions");function dn(K,_,T,N){if(I){let P=!1;if(T.noCache?P=!0:(_?(!_.value||_.metadataFlags&(xn|qa)||_.expiresAt!=null&&_.expiresAt<Date.now())&&(P=!0):P=!0,Zr(!P,"cache-hit",s)),P){let O=bu(K,_,T).then(x=>(x?.value&&x?.value.getRecord?.()&&Fe.default.error?.("Can not assign a record that is already a resource"),T&&(x?.version>(T.lastModified||0)&&(T.lastModified=x.version),T.lastRefreshed=Date.now()),x));if(T?.onlyIfCached||_?.value&&N?.allowStaleWhileRevalidate?.(_,K)){if(O.catch(x=>Fe.default.warn?.(x)),T?.onlyIfCached&&!N.doesExist())throw new ut.ServerError("Entry is not cached",504);return}else return O}}else if(_?.value&&_.expiresAt!=null&&_.expiresAt<Date.now())return Pe.evict(_.key,_.value,_.version),_.value=null,{then(P){return P(_)}}}o(dn,"ensureLoadedFromSource");function Ur(K){let _=K?.transaction;if(_){if(!_.lmdbDb)return _.lmdbDb=i,_;do{if(_.lmdbDb?.path===i.path)return _;let T=_.next;if(!T)return _=_.next=new Co,_.lmdbDb=i,_;_=T}while(!0)}else return new R_}o(Ur,"txnForContext");function Ru(K,_,T){if(!K)return;let N=(K.deref?K.deref():K.value)??i.getEntry(K.key)?.value;if(typeof _=="object"){let O=vr,x=N;for(let L=0,A=_.length;L<A;L++){let U=_[L],w=O?.[U];x=w&&x?w(x,T,K):x?.[U],K=null,O=w?.definition?.tableClass?.propertyResolvers}return x}let P=vr[_];return P?P(N,T,K):N[_]}o(Ru,"getAttributeValue");function sm(K,_,T,N,P){let O=P?.length,x={transaction:N,lazy:O>0||typeof _=="string"||_?.length<4,alwaysPrefetch:!0},L;function A(U,w){let D=U?.value;if(!D)return nc.SKIP;for(let $=0;$<O;$++)if(!L?.includes($)&&!P[$](D,U))return nc.SKIP;return w!==void 0&&(U.key=w),U}if(o(A,"processEntry"),O>0||!K.hasEntries){let U=K.map(w=>{if(L=null,typeof w=="object"&&w?.key!==void 0)return O>0?A(w):w;if(w==null)return nc.SKIP;for(let D=0;D<O;D++){let W=P[D].idFilter;if(W){if(!W(w))return nc.SKIP;L||(L=[]),L.push(D)}}return wo(w,T,x,!1,A)});return Array.isArray(K)&&(U=U.filter(w=>w!==nc.SKIP)),U.hasEntries=!0,U}return K}o(sm,"transformToEntries");function xr(K,_,T=server.replication?.getThisNodeId(l)){if(K<=_?.version){if(_?.version===K&&T!==void 0){let N=server.replication?.exportIdMapping(l),P=_.localTime,O=P&&l.get(P);if(O){let x,L,A=It(O);for(let U in N)N[U]===T&&(x=U),N[U]===A.nodeId&&(L=U);if(x>L)return 1;if(x===L)return 0}}return-1}return 1}o(xr,"precedesExistingVersion");async function bu(K,_,T){let N=_?.metadataFlags,P=_?.version,O,x;if(!i.attemptLock(K,P,()=>{clearTimeout(x);let w=i.getEntry(K);!w||!w.value||w.metadataFlags&(xn|qa)?O(bu(K,i.getEntry(K),T)):O(w)}))return new Promise(w=>{O=w,x=setTimeout(()=>{i.unlock(K,P)},Uae)});let L=_?.value,A={requestContext:T,replacingRecord:L,replacingEntry:_,replacingVersion:P,noCacheStore:!1,source:null,resourceCache:T?.resourceCache,transaction:void 0,expiresAt:void 0,lastModified:void 0},U=T?.responseHeaders;return new Promise((w,D)=>{let $;ks(At(A,async W=>{let j=performance.now(),B,Ee,me;try{B=await XE(K,A,_),me=N&xn;let ne=A.lastModified||me&&P;Ee=me||ne>P||!L,ne||(ne=(0,Lp.getNextMonotonicTime)());let ie=performance.now()-j;if(Ve(ie,"cache-resolution",s,null,"success"),U&&Op(U,"Server-Timing",`cache-resolve;dur=${ie.toFixed(2)}`,!0),W.timestamp=ne,h&&A.expiresAt==null&&(A.expiresAt=Date.now()+h),B){if(typeof B!="object")throw new Error("Only objects can be cached and stored in tables");if(B.status>0&&B.headers)if(B.status>=300)if(B.status===304)B=L,ne=P;else throw new ut.ServerError(B.body||"Error from source",B.status);else B=B.body;typeof B.toJSON=="function"&&(B=B.toJSON()),t&&B[t]!==K&&(B[t]=K)}$=!0,w({key:K,version:ne,value:B})}catch(ne){ne.message+=` while resolving record ${K} for ${s}`,L&&((ne.code==="ECONNRESET"||ne.code==="ECONNREFUSED"||ne.code==="EAI_AGAIN")&&!T?.mustRevalidate||T?.staleIfError&&(ne.statusCode===500||ne.statusCode===502||ne.statusCode===503||ne.statusCode===504))?(w({key:K,version:P,value:L}),Fe.default.trace?.(ne.message,"(returned stale record)")):D(ne);let ie=performance.now()-j;Ve(ie,"cache-resolution",s,null,"fail"),U&&Op(U,"Server-Timing",`cache-resolve;dur=${ie.toFixed(2)}`,!0),A.transaction.abort();return}if(T?.noCacheStore||A.noCacheStore){A.transaction.abort();return}Ur(A).addWrite({key:K,store:i,entry:_,nodeName:"source",before:Au(B),commit:o((ne,ie)=>{if(ie?.version!==P)return;let xe=yu(K,L,B);if(B){Ye.put?.(A,K,B),ie&&(T.previousResidency=Pe.getResidencyRecord(ie.residencyId));let fe,ae=!1,ke,Be=La(Pe.getResidency(B,T));if(Be){if(!Be.includes(server.hostname))if(fe=B,ae=!0,Pe.getResidencyById)B=void 0;else{B=null;for(let Le in r)B||(B={}),B[Le]=fe[Le]}ke=$c(Be)}Fe.default.trace?.(`Writing resolved record from source with id: ${K}, timestamp: ${new Date(ne).toISOString()}`),y(K,B,ie,ne,ae?xn:0,g&&(Ee||ae)||null,{user:A?.user,expiresAt:A.expiresAt,residencyId:ke,tableToTrack:s},"put",!!me,fe)}else ie&&(Ye.delete?.(A,K),Fe.default.trace?.(`Deleting resolved record from source with id: ${K}, timestamp: ${new Date(ne).toISOString()}`),g||R?y(K,null,ie,ne,0,g&&Ee||null,{user:A?.user,tableToTrack:s},"delete",!!me):al(i,ie,P))},"commit")})}),()=>{i.unlock(K,P)},W=>{i.unlock(K,P),$&&Fe.default.error?.("Error committing cache update",W)})})}o(bu,"getFromSource");function Oa(K){if(!K||K.user?.role?.permission?.super_user)return!0;if(K.replicateTo)throw new ut.ClientError("Can not specify replication parameters without super user permissions",403);if(K.replicatedConfirmation)throw new ut.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}o(Oa,"checkContextPermissions");function Pa(K){let _=!1;if(K&&(K-Ar>1&&(_=!0),Ar=K),!(Ge===rr&&!_)&&(rr=Ge,(0,Ol.getWorkerIndex)()===(0,Ol.getWorkerCount)()-1))return Wr&&clearTimeout(Wr),Ge?new Promise(T=>{let N=new Date;N.setMonth(0),N.setDate(1),N.setHours(0),N.setMinutes(0),N.setSeconds(0);let P=Ge/(1+Ar),O=_?Date.now():Math.ceil((Date.now()-N.getTime())/P)*P+N.getTime(),x=o(L=>{Fe.default.trace?.(`Scheduled next cleanup scan at ${new Date(L)}`),Wr=setTimeout(()=>J=J.then(async()=>{if(x(Math.max(L+Ge,Date.now())),i.rootStore.status!=="open"){clearTimeout(Wr);return}let A=50,U=new Array(A),w=0,D=Math.pow(Ar,8)*(Pl.get(F.STORAGE_RECLAMATION_EVICTIONFACTOR)??1e5),$=E/Math.pow(Math.max(Ar,1),4);Fe.default.debug?.(`Starting cleanup scan for ${s}, evict threshold ${D}, adjusted eviction ${$}ms`);function W(j,B,Ee,me){let pe=j+$-Date.now();if(pe<0)return!0;if(Ar){let ne=i.lastSize;return Ee&Jr&&Jc(me,ie=>{ie.size&&(ne+=ie.size)}),Fe.default.trace?.(`shouldEvict adjusted ${pe} ${ne}, ${pe*(j-B)/ne} < ${D}`),pe*(j-B)/ne<D}return!1}o(W,"shouldEvict");try{let j=0;for(let B of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let{key:Ee,value:me,version:pe,expiresAt:ne,metadataFlags:ie}=B,xe;me===null&&!g&&pe+vae<Date.now()?xe=al(i,B,pe):ne!=null&&W(ne,pe,ie,me)&&(xe=Pe.evict(Ee,me,pe),j++),xe&&(await U[w],U[w]=xe.catch(fe=>{Fe.default.error?.("Cleanup error",fe)}),++w>=A&&(w=0)),await rc()}Fe.default.debug?.(`Finished cleanup scan for ${s}, evicted ${j} entries`)}catch(j){Fe.default.warn?.(`Error in cleanup scan for ${s}:`,j)}T(void 0),Ar=0}),Math.min(L-Date.now(),2147483647)).unref()},"startNextTimer");x(O)}):void 0}o(Pa,"scheduleCleanup");function im(){z=l?.addDeleteRemovalCallback(n,i,(K,_)=>{i.remove(K,_)})}o(im,"addDeleteRemoval");function ZE(){(0,Ol.getWorkerIndex)()===0&&setInterval(async()=>{if(!Gc){Gc=!0;try{let K=X.name,_=r[K];if(!_)throw new Error(`expiresAt attribute ${X} must be indexed`);for(let T of _.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let N of _.getValues(T)){let P=i.getEntry(N);P?.value?P.value[K]<Date.now()&&Pe.evict(N,P.value,P.version):i.ifVersion(N,P?.version,()=>_.remove(T,N))}await rc()}}catch(K){Fe.default.error?.("Error in evicting old records",K)}finally{Gc=!1}}},Mae).unref()}o(ZE,"runRecordExpirationEviction");function La(K){if(K!=null){if(Array.isArray(K))return K;if(typeof K=="number"){if(K>=65536)throw new Error(`Shard id ${K} must be below 65536`);let _=server.shards?.get?.(K);if(_)return Fe.default.trace?.(`Shard ${K} mapped to ${_.map(T=>T.name).join(", ")}`),_.map(T=>T.name);throw new Error(`Shard ${K} is not defined`)}throw new Error(`Shard or residency list ${K} is not a valid type, must be a shard number or residency list of node hostnames`)}}o(La,"residencyFromFunction");function $c(K){if(K){let _=K.join(","),T=d.get([Symbol.for("residency_by_set"),_]);return T||(d.put([Symbol.for("residency_by_set"),_],T=Math.floor(Math.random()*2147418112)+65535),d.put([Symbol.for("residency_by_id"),T],K),T)}}o($c,"getResidencyId");function Au(K,_){let T=lA(K,i.rootStore);if(T){let N=_;return N?async()=>{await N(),await T}:()=>T}return _}o(Au,"preCommitBlobsForRecordBefore")}function dN(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 Fq(){}function iS(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 sS(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return sS(+e);case"Float":return e==="null"?null:sS(+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;kae.test(e)||(e+="Z");let n=new Date(e);return sS(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,oS.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function sS(e){if(isNaN(e))throw new SyntaxError;return e}function kq(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 ks(e,t,r){return e?.then?e.then(t,r):t(e)}function Hq(e){return e!=null}function Hs(e){try{return JSON.stringify(e)}catch{return e}}function Hae(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var nc,Lp,qq,Gq,Pl,ut,Dp,Mp,Fe,Ll,Ol,oS,fN,$q,Oae,Pae,Lae,Dae,Mae,vae,vq,Uae,Uq,xae,xn,qa,Bae,xq,Bq,Fae,fUe,kae,rc,dg=se(()=>{q();nc=require("lmdb"),Lp=b(Mn()),qq=b(require("lodash")),Gq=b(Tm());Ga();Rm();Pl=b(ce());QA();ut=b(_e()),Dp=b(qo()),Mp=b(is());we();ug();Fe=b(Zn());sw();Ua();Ll=require("ordered-binary"),Ol=b(Ze());Hi();oS=b(oe());sl();ts();I_();Pp();fN=b(require("node:fs"));es();G_();$q=b(Q());uN();({sortBy:Oae}=qq.default),{validateAttribute:Pae}=Gq.default,Lae=new Uint8Array(9);Lae[8]=192;Dae=1/0,Mae=6e4,vae=864e5;Pl.initSync();vq=Pl.get(F.STORAGE_PREFETCHWRITES),Uae=1e4,Uq=1,xae=2,xn=1,qa=8,Bae=Buffer.allocUnsafeSlow(8192),xq=1978,Bq=100,Fae={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},fUe=(0,oS.convertToMS)(Pl.get(F.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;o(aS,"makeTable");o(dN,"attributesAsObject");o(Fq,"noop");kae=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;o(iS,"coerceType");o(sS,"rejectNaN");o(kq,"isDescendantId");rc=o(()=>new Promise(setImmediate),"rest");o(ks,"when");o(Hq,"exists");o(Hs,"stringify");o(Hae,"hasOtherProcesses")});function cS(e,t){if(!Array.isArray(e)||!Array.isArray(t))throw new Error("Euclidean distance comparison requires an array");let r=0,n=Math.max(e.length,t.length);for(let s=0;s<n;s++){let i=e[s]||0,a=t[s]||0,c=i-a;r+=c*c}return r}function lS(e,t){if(!Array.isArray(e)||!Array.isArray(t))throw new Error("Cosine distance comparison requires an array");let r=0,n=0,s=0,i=Math.max(e.length,t.length);for(let a=0;a<i;a++){let c=e[a]||0,l=t[a]||0;r+=c*l,n+=c*c,s+=l*l}return n=Math.sqrt(n),s=Math.sqrt(s),1-r/(n*s||1)}var Kq=se(()=>{o(cS,"euclideanDistance");o(lS,"cosineDistance")});var Yq,Wq,Td,so,Sd,qae,Gae,uS,zq=se(()=>{Kq();Yq=require("msgpackr"),Wq=b(Zn()),Td=b(_e()),so=(0,Wq.loggerWithTag)("HNSW"),Sd=Symbol.for("entryPoint"),qae=Symbol.for("key"),Gae=10,uS=class{static{o(this,"HierarchicalNavigableSmallWorld")}static useObjectStore=!0;indexStore;M=16;efConstruction=100;efConstructionSearch=50;mL=1/Math.log(this.M);optimizeRouting=.5;nodesVisitedCount=0;idIncrementer;distance;constructor(t,r){this.indexStore=t,t&&(this.indexStore.encoder.useFloat32=Yq.FLOAT32_OPTIONS.ALWAYS),this.distance=r?.distance==="euclidean"?cS:lS,r&&(r.M!==void 0&&(this.M=r.M,this.mL=1/Math.log(this.M)),r.efConstruction!==void 0&&(this.efConstruction=this.efConstructionSearch=r.efConstruction),r.efConstructionSearch!==void 0&&(this.efConstructionSearch=r.efConstructionSearch),r.mL!==void 0&&(this.mL=r.mL),r.optimizeRouting!==void 0&&(this.optimizeRouting=r.optimizeRouting))}index(t,r,n){let s=typeof t=="number"?[qae,t]:t,i=this.indexStore.get(s);if(!i){if(!r)return;if(!this.idIncrementer){let f=0;for(let m of this.indexStore.getKeys({reverse:!0,limit:1,start:1/0,end:0}))typeof m=="number"&&(f=m);this.idIncrementer=new BigInt64Array([BigInt(f)+1n]),this.idIncrementer=new BigInt64Array(this.indexStore.getUserSharedBuffer("next-id",this.idIncrementer.buffer))}i=Number(Atomics.add(this.idIncrementer,0,1n)),this.indexStore.put(s,i)}let a=new Map,c,l=this.indexStore.get(Sd);if(n?c={...this.indexStore.get(i)}:c={},r){let f=l&&this.indexStore.get(l);if(f===void 0){let E=Math.floor(-Math.log(Math.random())*this.mL),g={vector:r,level:E,primaryKey:t};for(let R=0;R<=E;R++)g[R]=[];if(this.indexStore.put(i,g),typeof i!="number")throw new Error("Invalid nodeId: "+i);so.debug?.("setting entry point to",i),this.indexStore.put(Sd,i);return}let m=c.level??Math.min(Math.floor(-Math.log(Math.random())*this.mL),Gae),p=f.level;if(m>=p){if(typeof i!="number")throw new Error("Invalid nodeId: "+i);so.debug?.("setting entry point to",i),this.indexStore.put(Sd,i)}for(;p>m;){let E=this.searchLayer(r,l,f,this.efConstruction,p);E.length>0&&(l=E[0].id,f=E[0].node),p--}let h=new Array(m+1);for(let E=0;E<=m;E++)h[E]=[];for(let E=Math.min(m,p);E>=0;E--){let g=this.searchLayer(r,l,f,this.efConstruction,E);g=g.slice(0,this.M<<1),g.length===0&&E===0&&so.info?.("should not have zero connections for",l);let R=h[E];for(let S=0;S<g.length;S++){let{id:y,distance:C,node:I}=g[S];if(y===i)continue;let k=[];if(this.optimizeRouting){let H=!1,X=I[E],z=1+this.optimizeRouting*(1+.5*S/this.M);for(let de=0;de<X.length;de++){let{id:le,distance:te}=X[de],ye=1+this.optimizeRouting*(1+.5*de/this.M);for(let Ae=0;Ae<R.length;Ae++){let{id:Ye,distance:Ge}=R[Ae];if(Ye===le){C*z>Ge+te?H=!0:te*ye>C+Ge&&(k.push({fromId:Ye,toId:y}),k.push({fromId:y,toId:Ye}));break}}if(H)break}if(H)continue}else if(S>=(E>0?this.M:this.M<<1))continue;R.push({id:y,distance:C});for(let{fromId:H,toId:X}of k){let z=d(H);z||(z=d(H,this.indexStore.get(H)));for(let de=0;de<z[E].length;de++)if(z[E][de].id===X){Object.isFrozen(z[E])&&(z[E]=z[E].slice()),z[E].splice(de,1);break}}let J=c[E],G=J?.find(({id:H})=>H===y);if(G){let H=J?.indexOf(G);J.copied||(J=[...J],J.copied=!0,c[E]=J),J.splice(H,1)}else this.addConnection(y,d(y,I),i,E,C,d)}}this.indexStore.put(i,{vector:r,level:m,primaryKey:t,...h})}else{if(l===i){let f=c.level??0;for(let m=f;m>=0&&(l=c[m][0]?.id,l===void 0);m--);if(l===void 0){let m=-1;for(let{key:p,value:h}of this.indexStore.getRange({start:0,end:1/0}))if(h.level>m){if(l=p,h.level===f)break;m=h.level}}if(l===void 0)this.indexStore.remove(Sd);else{if(typeof l!="number")throw new Error("Invalid nodeId: "+l);so.debug?.("setting entry point to",l),this.indexStore.put(Sd,l)}}this.indexStore.remove(i)}let u=new Map;if(c.level!==void 0)for(let f=0;f<=c.level;f++){let m=c[f];for(let{id:p}of m){let h=d(p,this.indexStore.get(p));for(let E=0;E<=f;E++)h[E]=h[E]?.filter(({id:g})=>g!==i),h[E].length===0&&(so.info?.("node was left orphaned, will reindex",p),u.set(h.primaryKey,h.vector))}}function d(f,m){let p=a.get(f);return!p&&m&&(p={...m},a.set(f,p)),p}o(d,"updateNode");for(let[f,m]of a)this.indexStore.put(f,m);for(let[f,m]of u)this.index(f,m,m);this.checkSymmetry(i,this.indexStore.get(i))}getEntryPoint(){let t=this.indexStore.get(Sd);if(t===void 0)return;let r=this.indexStore.get(t);return{id:t,...r}}searchLayer(t,r,n,s,i,a=this.distance){let c=new Set([r]),l=[{id:r,distance:this.distance(t,n.vector),node:n}],u=[...l];for(;l.length>0;){l.sort((p,h)=>p.distance-h.distance);let d=l.shift(),f=u[u.length-1].distance;if(d.distance>f)break;let m=d.node;for(let{id:p}of m[i]||[]){if(c.has(p)||p===void 0)continue;c.add(p);let h=this.indexStore.get(p);if(!h)continue;this.nodesVisitedCount++;let E=a(t,h.vector);if(E<f||u.length<s){let g={id:p,distance:E,node:h};l.push(g),u.push(g)}}u.sort((p,h)=>p.distance-h.distance),u.length>s&&u.splice(s,u.length-s)}return u.visited=c.size,u}search({target:t,value:r,descending:n,distance:s,comparator:i}){let a=0;switch(i){case"lt":case"le":a=r;case"sort":break;default:throw new Td.ClientError(`Can not use "${i}" comparator with HNSW`)}if(n)throw new Td.ClientError("Can not use descending sort order with HNSW");let c;if(s==="cosine")c=lS;else if(s==="euclidean")c=cS;else{if(s)throw new Td.ClientError("Unknown distance function");c=this.distance}if(!t)throw new Td.ClientError("A target vector must be provided for an HNSW query");if(!Array.isArray(t))throw new Td.ClientError("The target vector must be an array");let l=this.getEntryPoint();if(!l)return[];let u=l.id,d=[];for(let f=l.level;f>=0;f--)if(d=this.searchLayer(t,u,l,this.efConstructionSearch,f,c),d.length>0){let m=d[0];l=m.node,u=m.id}return a&&(d=d.filter(f=>f.distance<a)),d.map(f=>({key:f.node.primaryKey,distance:f.distance}))}checkSymmetry(t,r){if(!r)return;let n=0,s;for(;(s=r[n])&&s.length!==0;){for(let{id:i}of s){let a=this.indexStore.get(i);if(!a){so.info?.("could not find neighbor node",a);continue}a[n]?.find(({id:l})=>l==t)||so.info?.("asymmetry detected",a[n])}n++}}addConnection(t,r,n,s,i,a){r[s]||(r[s]=[]);let c=s===0?this.M<<1:this.M;if(this.optimizeRouting&&(c<<=2),r[s].length>=c+(c>>2)){so.warn?.("maxConnections reached, removing some connections",c);let l=[...r[s]];l.sort((f,m)=>f.distance-m.distance);let u=l.slice(0,c),d=l.slice(c);r[s]=u;for(let f of d){let m=a(f.id)??this.indexStore.get(f.id);m&&m[s]&&(m=a(f.id,m),m[s]=m[s].filter(({id:p})=>p!==t),s===0&&m[s].length===0&&so.info?.("should not remove last connection",t,n))}}r[s].find(({id:l})=>l===n)?so.debug?.("already connected",t,n):r[s]=[...r[s],{id:n,distance:i}]}validateConnectivity(t=0){let r=this.getEntryPoint(),n=new Set,s=[r.id];n.add(r.id);let i=0;for(;s.length>0;){let a=s.shift(),c=this.indexStore.get(a);for(let l=t;l<=c.level;l++)for(let{id:u}of c[l]||[])i++,n.has(u)||(n.add(u),s.push(u))}return n.size!==this.totalNodes&&console.log("visited",n.size,"total",this.totalNodes),{isFullyConnected:n.size===this.totalNodes,averageConnections:i/n.size}}get totalNodes(){return Array.from(this.indexStore.getKeys({start:0,end:1/0})).length}estimateCountAsSort(){return Math.sqrt(this.indexStore.getStats().entryCount*this.efConstructionSearch)}propertyResolver(t,r,n){let s=r?.sort;if(s){let i=s.vectorDistances;if(i){let l=i.get(n);if(l)return l}else i=r.vectorDistances=s.vectorDistances=new Map;let a=this.distance;s.type&&(a=s.distance==="euclidean"?cS:lS);let c=a(s.target,t);return i.set(n,c),c}return t}}});var mN,jq=se(()=>{zq();mN={HNSW:uS}});var mt={};Re(mt,{NON_REPLICATING_SYSTEM_TABLES:()=>dS,database:()=>od,databaseEnvs:()=>Yo,databases:()=>De,dropDatabase:()=>lw,dropTableMeta:()=>zae,getDatabases:()=>ct,getDefaultCompression:()=>gS,getTables:()=>Vae,onRemovedDB:()=>Hp,onUpdatedTable:()=>Dl,readMetaDb:()=>vp,resetDatabases:()=>Id,table:()=>et,tables:()=>Tn});function kp(e,t){let r=ES.OpenDBIObject??ES.default.OpenDBIObject;return new r(e,t)}function Vae(){return hS||ct(),Tn||{}}function ct(){if(hS)return De;hS=!0,bd=new Map;let e=(0,jt.getHdbBasePath)()&&(0,Ht.join)((0,jt.getHdbBasePath)(),Yc),t=(0,jt.get)(F.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,jt.get)(F.STORAGE_PATH)||e&&((0,ps.existsSync)(e)?e:(0,Ht.join)((0,jt.getHdbBasePath)(),a_)),!!e){if((0,ps.existsSync)(e))for(let r of(0,ps.readdirSync)(e,{withFileTypes:!0})){let n=(0,Ht.basename)(r.name,".mdb");r.isFile()&&(0,Ht.extname)(r.name).toLowerCase()===".mdb"&&!t[n]?.path&&vp((0,Ht.join)(e,r.name),null,n)}if((0,ps.existsSync)((0,Rd.getBaseSchemaPath)())){for(let r of(0,ps.readdirSync)((0,Rd.getBaseSchemaPath)(),{withFileTypes:!0}))if(!r.isFile()){let n=(0,Ht.join)((0,Rd.getBaseSchemaPath)(),r.name),s=(0,Ht.join)((0,Rd.getTransactionAuditStoreBasePath)(),r.name);for(let i of(0,ps.readdirSync)(n,{withFileTypes:!0}))if(i.isFile()&&(0,Ht.extname)(i.name).toLowerCase()===".mdb"){let a=(0,Ht.join)(s,i.name);vp((0,Ht.join)(n,i.name),(0,Ht.basename)(i.name,".mdb"),r.name,a,!0)}}}if(t)for(let r in t){let n=t[r],s=n.path;if((0,ps.existsSync)(s))for(let a of(0,ps.readdirSync)(s,{withFileTypes:!0}))a.isFile()&&(0,Ht.extname)(a.name).toLowerCase()===".mdb"&&vp((0,Ht.join)(s,a.name),(0,Ht.basename)(a.name,".mdb"),r);let i=n.tables;if(i)for(let a in i){let c=i[a],l=(0,Ht.join)(c.path,(0,Ht.basename)(a+".mdb"));(0,ps.existsSync)(l)&&vp(l,a,r,null,!0)}}for(let r in De){let n=bd.get(r);if(n){let s=De[r];r.includes("delete")&&Cr.trace(`defined tables ${Array.from(n.keys())}`);for(let i in s)n.has(i)||(Cr.trace(`delete table class ${i}`),delete s[i])}else if(delete De[r],r==="data"){for(let s in Tn)delete Tn[s];delete Tn[_S]}}if((0,jt.get)(F.ANALYTICS_REPLICATE)===!1?dS.includes("hdb_analytics")||dS.push("hdb_analytics"):(De.system?.hdb_analytics?.enableAuditing(),De.system?.hdb_analytics_hostname?.enableAuditing()),De.system)for(let r of dS)De.system[r]&&(De.system[r].replicate=!1);return bd=null,De}}function Id(){hS=!1;for(let[,e]of Yo)e.needsDeletion=!0;ct();for(let[e,t]of Yo)if(t.needsDeletion&&!e.endsWith("system.mdb")){t.close(),Yo.delete(e);let r=De[t.databaseName];for(let n in r)if(r[n].primaryStore.path===e){delete De[t.databaseName],xp.forEach(i=>i(t.databaseName));break}}return De}function vp(e,t,r=EN,n,s){let i=new pN.default(e,!1);try{let a=Yo.get(e);a?a.needsDeletion=!1:(a=(0,Ad.open)(i),Yo.set(e,a));let c=new kp(!1),l=a.dbisDb||(a.dbisDb=a.openDB(fS.INTERNAL_DBIS_NAME,c)),u=a.auditStore;u||(n?(0,ps.existsSync)(n)&&(i.path=n,u=(0,Ad.open)(i),u.isLegacy=!0):u=K_(a));let d=eG(r),f=d[_S],m=new Map;for(let{key:p,value:h}of l.getRange({start:!1})){let[E,g]=p.toString().split("/");g===""?g=h.name:g||(g=E,E=t,h.name||(h.name=g,h.indexed=!h.is_hash_attribute)),f?.add(E);let R=m.get(E);R||m.set(E,R={attributes:[]}),(g==null||h.is_hash_attribute)&&(R.primary=h),g!=null&&R.attributes.push(h),Object.defineProperty(h,"key",{value:p,configurable:!0})}for(let[p,h]of m){let{attributes:E,primary:g}=h;if(!g){for(let te of E)if(te.is_hash_attribute||te.isPrimaryKey){g=te;break}if(!g){Cr.warn(`Unable to find a primary key attribute on table ${p}, with attributes: ${JSON.stringify(E)}`);continue}}let R=d[p],S={},y=[],C,I,k=typeof g.audit=="boolean"?g.audit:(0,jt.get)(F.LOGGING_AUDITLOG),J=g.trackDeletes,G=g.expiration,H=g.eviction,X=g.sealed,z=g.splitSegments,de=g.replicate;if(R)S=R.indices,y=R.attributes,R.schemaVersion++;else{C=g.tableId,C?C>=(l.get(yd)||0)&&(l.putSync(yd,C+1),Cr.info(`Updating next table id (it was out of sync) to ${C+1} for ${p}`)):(g.tableId=C=l.get(yd),C||(C=1),Cr.debug("Table {tableName} missing an id, assigning {tableId}"),l.putSync(yd,C+1),l.putSync(g.key,g));let te=new kp(!g.is_hash_attribute,g.is_hash_attribute);if(te.compression=g.compression,te.compression){let ye=(0,jt.get)(F.STORAGE_COMPRESSION_THRESHOLD)||Zq;te.compression.threshold=ye}I=og(a.openDB(g.key,te),a),a.databaseName=r,I.tableId=C}let le;for(let te of E){te.attribute=te.name;try{if(!te.is_hash_attribute&&(te.indexed||te.attribute&&!te.name)){if(!S[te.name]){let Ae=rG(te.key,a,te);S[te.name]=Ae,S[te.name].indexNulls=te.indexNulls}let ye=y.find(Ae=>Ae.name===te.name);ye?y.splice(y.indexOf(ye),1,te):y.push(te),le=!0}}catch(ye){Cr.error("Error trying to update attribute",te,y,S,ye)}}for(let te of y)if(!E.find(Ae=>Ae.name===te.name)){if(te.is_hash_attribute){Cr.error("Unable to remove existing primary key attribute",te);continue}te.indexed&&(y.splice(y.indexOf(te),1),le=!0)}if(R)le&&(R.schemaVersion++,R.updatedAttributes());else{R=tG(d,p,aS({primaryStore:I,auditStore:u,audit:k,sealed:X,splitSegments:z,replicate:de,expirationMS:G&&G*1e3,evictionMS:H&&H*1e3,trackDeletes:J,tableName:p,tableId:C,primaryKey:g.name,databasePath:s?r+"/"+p:r,databaseName:r,indices:S,attributes:E,schemaDefined:g.schemaDefined,dbisDB:l})),R.schemaVersion=1;for(let te of Up)te(R)}}return a}catch(a){throw a.message+=` opening database ${e}`,a}}function eG(e){let t=De[e];if(t||(e==="data"?t=De[e]=Tn:e==="system"?Object.defineProperty(De,"system",{value:t=Object.create(null),configurable:!0}):t=De[e]=Object.create(null)),bd&&!bd.has(e)){let r=new Set;t[_S]=r,bd.set(e,r)}return t}function tG(e,t,r){return e[t]=r,r}function od({database:e,table:t}){e||(e=EN),ct();let r=eG(e),n=(0,Ht.join)((0,jt.getHdbBasePath)(),Yc),s=(0,jt.get)(F.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,jt.get)(F.STORAGE_PATH)||((0,ps.existsSync)(n)?n:(0,Ht.join)((0,jt.getHdbBasePath)(),a_));let a=(0,Ht.join)(n,(i?t:e)+".mdb"),c=Yo.get(a);if(!c||c.status==="closed"){let l=new pN.default(a,!1);c=(0,Ad.open)(l),Yo.set(a,c)}return c.auditStore||(c.auditStore=K_(c)),c}async function lw(e){if(!De[e])throw new Error("Schema does not exist");let t=De[e],r;for(let n in t)r=t[n].primaryStore.rootStore,Yo.delete(r.path),r.status==="open"&&(await r.close(),await Bp.remove(r.path));if(r||(r=od({database:e,table:null}),r.status==="open"&&(await r.close(),await Bp.remove(r.path))),e==="data"){for(let n in Tn)delete Tn[n];delete Tn[_S]}delete De[e],xp.forEach(n=>n(e)),await cA(r)}function rG(e,t,r){let n=r.is_hash_attribute||r.indexed.type&&mN[r.indexed.type]?.useObjectStore,s=new kp(!n,n),i=t.openDB(e,s);if(r.indexed.type){let a=mN[r.indexed.type];a?i.customIndex=new a(i,r.indexed):Cr.error(`The indexing type '${r.indexed.type}' is unknown`)}return i}function et(e){let{table:t,database:r,expiration:n,eviction:s,scanInterval:i,attributes:a,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,schemaDefined:m,origin:p}=e;r||(r=EN);let h=od({database:r,table:t}),E=De[r];Cr.trace(`Defining ${t} in ${r}`);let g=E?.[t];if(h.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let R,S,y;m==null&&(m=!0);let C=new kp(!1);for(let z of a)z.attribute&&!z.name?(z.name=z.attribute,z.indexed=!0):z.attribute=z.name,z.expiresAt&&(z.indexed=!0);let I,k;if(g){if(R=g.primaryKey,g.primaryStore.rootStore.status==="closed")throw new Error(`Can not use a closed data store from ${t} class`);u==null&&(u=g.splitSegments),g.attributes.splice(0,g.attributes.length,...a)}else{let z=h.auditStore;S=a.find(ye=>ye.isPrimaryKey)||{},R=S.name,S.is_hash_attribute=S.isPrimaryKey=!0,S.schemaDefined=m,S.compression=gS(),f&&(S.trackDeletes=!0),c=S.audit=typeof c=="boolean"?c:(0,jt.get)(F.LOGGING_AUDITLOG),n&&(S.expiration=n),s&&(S.eviction=s),u??=!1,S.splitSegments=u,typeof l=="boolean"&&(S.sealed=l),typeof d=="boolean"&&(S.replicate=d),p&&(S.origins?S.origins.includes(p)||S.origins.push(p):S.origins=[p]),Cr.trace(`${t} table loading, opening primary store`);let de=new kp(!1,!0);de.compression=S.compression;let le=t+"/";if(y=h.dbisDb=h.openDB(fS.INTERNAL_DBIS_NAME,C),X(),y.get(le))return k&&k(),Id(),et(e);let te=og(h.openDB(le,de),h);h.databaseName=r,te.tableId=y.get(yd),Cr.trace(`Assigning new table id ${te.tableId} for ${t}`),te.tableId||(te.tableId=1),y.put(yd,te.tableId+1),S.tableId=te.tableId,g=tG(E,t,aS({primaryStore:te,auditStore:z,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:R,tableName:t,tableId:te.tableId,databasePath:r,databaseName:r,indices:{},attributes:a,schemaDefined:m,dbisDB:y})),g.schemaVersion=1,I=!0,y.put(le,S)}let J=g.indices;y=y||(h.dbisDb=h.openDB(fS.INTERNAL_DBIS_NAME,C)),g.dbisDB=y;let G=[];for(let{key:z,value:de}of y.getRange({start:!0})){let[le,te]=z.toString().split("/");if(te===""&&(te=de.name),te){if(le!==t)continue}else continue;let ye=a.find(Ye=>Ye.name===te),Ae=!ye?.indexed&&de.indexed&&!de.isPrimaryKey;if((!ye||Ae)&&(X(),I=!0,ye||y.remove(z),Ae)){let Ye=g.indices[le];Ye&&G.push(Ye)}}let H=[];try{for(let z of a||[]){if((z.relationship||z.computed)&&(I=!0,z.relationship))continue;let de=t+"/"+(z.name||"");Object.defineProperty(z,"key",{value:de,configurable:!0});let le=y.get(de);if(z.isPrimaryKey){if(le=le||y.get(de=t+"/")||{},c!==void 0&&c!==g.audit||l!==void 0&&l!==g.sealed||d!==void 0&&d!==g.replicate||(+n||void 0)!==(+le.expiration||void 0)||(+s||void 0)!==(+le.eviction||void 0)||z.type!==le.type){let ye={...le};typeof c=="boolean"&&(c&&g.enableAuditing(c),ye.audit=c),n&&(ye.expiration=+n),s&&(ye.eviction=+s),l!==void 0&&(ye.sealed=l),d!==void 0&&(ye.replicate=d),z.type&&(ye.type=z.type),I=!0,X(),y.put(de,ye)}continue}le?.attribute&&!le.name&&(le.indexed=!0);let te=!le||le.type!==z.type||JSON.stringify(le.indexed)!==JSON.stringify(z.indexed)||le.nullable!==z.nullable||le.version!==z.version||JSON.stringify(le.properties)!==JSON.stringify(z.properties)||JSON.stringify(le.elements)!==JSON.stringify(z.elements);if(z.indexed){let ye=rG(de,h,z);(te||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<Fp.workerData?.restartNumber)&&(I=!0,X(),le=y.get(de),(te||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<Fp.workerData?.restartNumber)&&(I=!0,z.indexNulls===void 0&&(z.indexNulls=!0),g.primaryStore.getStats().entryCount>0&&(z.lastIndexedKey=le?.lastIndexedKey??void 0,z.indexingPID=process.pid,ye.isIndexing=!0,Object.defineProperty(z,"dbi",{value:ye}),H.push(z))),y.put(de,z)),le?.indexNulls&&z.indexNulls===void 0&&(z.indexNulls=!0),ye.indexNulls=z.indexNulls,J[z.name]=ye}else te&&(I=!0,X(),y.put(de,z))}}finally{k&&k()}if(I&&(g.schemaVersion++,g.updatedAttributes()),Cr.trace(`${t} table loading, running index`),H.length>0||G.length>0?g.indexingOperation=Wae(g,H,G):I&&mS.signalSchemaChange(new pS.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=p,I)for(let z of Up)z(g,p!=="cluster");return(n||s||i)&&g.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),Cr.trace(`${t} table loaded`),g;function X(){k||h.transactionSync(()=>({then(z){k=z}}))}o(X,"startTxn")}async function Wae(e,t,r){try{Cr.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await mS.signalSchemaChange(new pS.SchemaEventMsg(process.pid,"schema-change",e.databaseName,e.tableName));let s;for(let u of r)s=u.drop();let i,a={},c=0,l=t.length;if(await new Promise(u=>setImmediate(u)),l>0){let u;for(let f of t)(0,Ad.compareKeys)(f.lastIndexedKey,u)<0&&(u=f.lastIndexedKey),f.lastIndexedKey==null&&f.dbi.clearAsync();let d=0;for(let{key:f,value:m,version:p}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(m){if(d++,s=e.primaryStore.ifVersion(f,p,()=>{for(let h=0;h<l;h++){let E=t[h],g=E.name,R=E.dbi;try{let S=E.resolve,y=m&&(S?S(m):m[g]);if(R.customIndex){R.customIndex.index(f,y);continue}let C=(0,Qq.getIndexedValues)(y);if(C)for(let I=0,k=C.length;I<k;I++)R.put(C[I],f)}catch(S){a[g]||(a[g]=!0,Cr.error(`Error indexing attribute ${g}`,S))}}}),s.then(()=>d--,h=>{d--,Cr.error(h)}),Fp.workerData&&Fp.workerData.restartNumber!==Xq.restartNumber&&(i=!0),++c%100===0||i){for(let h of t)h.lastIndexedKey=f,e.dbisDB.put(h.key,h);if(i)return}d>Kae?await s:d>Yae&&await new Promise(h=>setImmediate(h))}for(let f of t)delete f.lastIndexedKey,delete f.indexingPID,f.dbi.isIndexing=!1,s=e.dbisDB.put(f.key,f)}await s,await mS.signalSchemaChange(new pS.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),Cr.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){Cr.error("Error in indexing",n)}}function zae({table:e,database:t}){let r=od({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 Dl(e){return Up.push(e),{remove(){let t=Up.indexOf(e);t>-1&&Up.splice(t,1)}}}function Hp(e){return xp.push(e),{remove(){let t=xp.indexOf(e);t>-1&&xp.splice(t,1)}}}function gS(){let e=(0,jt.get)(F.STORAGE_COMPRESSION),t=(0,jt.get)(F.STORAGE_COMPRESSION_DICTIONARY),r=(0,jt.get)(F.STORAGE_COMPRESSION_THRESHOLD)||Zq,n={startingOffset:32};return t&&(n.dictionary=Bp.readFileSync(t)),r&&(n.threshold=r),e&&n}var jt,fS,Ad,Ht,ps,Rd,pN,Bp,hN,Qq,mS,pS,Fp,Jq,Xq,ES,$ae,Cr,EN,_S,Zq,dS,Tn,De,yd,Up,xp,hS,Yo,bd,Kae,Yae,we=se(()=>{jt=b(ce()),fS=b(Wt()),Ad=require("lmdb"),Ht=require("path"),ps=require("fs"),Rd=b(bt());dg();pN=b(jm());q();Bp=b(require("fs-extra")),hN=b(oi()),Qq=b(Mn()),mS=b(qo()),pS=b(is()),Fp=require("worker_threads"),Jq=b(Q()),Xq=b(Ze());Hi();sl();es();jq();ES=b(zm()),{forComponent:$ae}=Jq.default;o(kp,"OpenDBIObject");Cr=$ae("storage"),EN="data",_S=Symbol("defined-tables"),Zq=((0,jt.get)(F.STORAGE_PAGESIZE)||4096)-60;(0,jt.initSync)();dS=["hdb_temp","hdb_certificate","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_info"],Tn=Object.create(null),De=Object.create(null);(0,hN._assignPackageExport)("databases",De);(0,hN._assignPackageExport)("tables",Tn);yd=Symbol.for("next-table-id"),Up=[],xp=[],Yo=new Map;o(Vae,"getTables");o(ct,"getDatabases");o(Id,"resetDatabases");o(vp,"readMetaDb");o(eG,"ensureDB");o(tG,"setTable");o(od,"database");o(lw,"dropDatabase");o(rG,"openIndex");o(et,"table");Kae=1e3,Yae=10;o(Wae,"runIndexing");o(zae,"dropTableMeta");o(Dl,"onUpdatedTable");o(Hp,"onRemovedDB");o(gS,"getDefaultCompression")});var SN={};Re(SN,{loadGQLSchema:()=>Jae,start:()=>gN,startOnMainThread:()=>Qae});function gN({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r,n,s,i){let{parse:a,Source:c,Kind:l,NamedTypeNode:u,StringValueNode:d}=await import("graphql"),f=a(new c(r.toString(),s)),m=new Map,p=[],h;for(let R of f.definitions)switch(R.kind){case l.OBJECT_TYPE_DEFINITION:let k=function(G){if(G.kind==="NonNullType"){let z=k(G.type);return z.nullable=!1,z}if(G.kind==="ListType")return{type:"array",elements:k(G.type)};let X={type:G.name?.value};return Object.defineProperty(X,"location",{value:G.loc.startToken}),X};o(k,"getProperty");let S=R.name.value,y=[],C={table:null,database:null,properties:y};m.set(S,C),i.allTypes.set(S,C);for(let G of R.directives){if(G.name.value==="table"){for(let X of G.arguments)C[X.name.value]=X.value.value;C.schema&&(C.database=C.schema),C.table||(C.table=S),C.audit&&(C.audit=C.audit!=="false"),C.attributes=C.properties,p.push(C)}if(G.name.value==="sealed"&&(C.sealed=!0),G.name.value==="splitSegments"&&(C.splitSegments=!0),G.name.value==="replicate"&&(C.replicate=!0),G.name.value==="export"){C.export=!0;for(let X of G.arguments)typeof C.export!="object"&&(C.export={}),C.export[X.name.value]=X.value.value}}let I=!1,J={};for(let G of R.fields){let H=k(G.type);H.name=G.name.value,y.push(H),J[H.name]=void 0;for(let X of G.directives){let z=X.name.value;if(z==="primaryKey")I?console.warn("Can not define two attributes as a primary key at",X.loc):(H.isPrimaryKey=!0,I=!0);else if(z==="indexed"){let de={};for(let le of X.arguments||[])de[le.name.value]=le.value.value;H.indexed=de}else if(z==="computed"){for(let de of X.arguments||[])if(de.name.value==="from"){let le=de.value.value;H.computed={from:g(le,de,J)},H.version==null&&(H.version=le)}else de.name.value==="version"&&(H.version=de.value.value);H.computed=H.computed||!0}else if(z==="relationship"){let de={};for(let le of X.arguments)de[le.name.value]=le.value.value;H.relationship=de}else if(z==="createdTime")H.assignCreatedTime=!0;else if(z==="updatedTime")H.assignUpdatedTime=!0;else if(z==="expiresAt")H.expiresAt=!0;else if(z==="allow"){let de=H.authorizedRoles=[];for(let le of X.arguments)le.name.value==="role"&&de.push(le.value.value)}else server.knownGraphQLDirectives.includes(z)&&console.warn(`@${z} is an unknown directive, at`,X.loc)}}C.type=S,S==="Query"&&(h=C)}function E(R){let S=m.get(R.type);S?(Object.defineProperty(R,"properties",{value:S.properties}),Object.defineProperty(R,"definition",{value:S})):R.type==="array"?E(R.elements):jae.includes(R.type)||(0,sG.getWorkerIndex)()===0&&console.error(`The type ${R.type} is unknown at line ${R.location.line}, column ${R.location.column}, in ${s}`)}o(E,"connectPropertyType");for(let R of m.values())for(let S of R.properties)E(S);for(let R of p)R.tableClass=e(R),R.export&&(R.export.name===""?i.set((0,_N.dirname)(n),R.tableClass):i.set((0,_N.dirname)(n)+"/"+(R.export.name||R.type),R.tableClass,R.export));function g(R,S,y){return new nG.Script(`function computed(attributes) { return function(record) { with(attributes) { with (record) { return ${R}; } } } } computed;`,{filename:s,lineOffset:S.loc.startToken.line-1,columnOffset:S.loc.startToken.column}).runInThisContext()(y)}o(g,"createComputedFrom")}}var _N,nG,sG,jae,Qae,Jae,iG=se(()=>{_N=require("path"),nG=require("node:vm");we();sG=b(Ze());$a();jae=["ID","Int","Float","Long","String","Boolean","Date","Bytes","Any","BigInt","Blob"];server.knownGraphQLDirectives&&(server.knownGraphQLDirectives=["table","sealed","export","primaryKey","indexed","computed","relationship","createdTime","updatedTime","expiresAt","allow"]);o(gN,"start");Qae=gN,Jae=o(e=>gN({ensureTable:et}).handleFile(e,null,null,new zu),"loadGQLSchema")});var yN={};Re(yN,{start:()=>oce});function Xae(e){if(e.kind!==He.Kind.OPERATION_DEFINITION&&e.kind!==He.Kind.FRAGMENT_DEFINITION)throw new $r(`Unexpected non-executable definition type ${e.kind}.`)}function oG(e){if(typeof e!="object"||e===null)throw new io("Request body must be an object.");if(!("query"in e))throw new io("Request body must contain a `query` field.");if(typeof e.query!="string")throw new io("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new io("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new io("Request body `operationName` field must be a string.")}function TN(e){return parseInt(e.value,10)}function cG(e){return parseFloat(e.value)}function lG(e,t,r){let n=r.get(e.name.value);return uG(n)?dG(n,t):{attribute:t,value:n}}function uG(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function dG(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],uG(n)?dG(n,t):{attribute:t,value:n}))}function Zae(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case He.Kind.NULL:return{attribute:t,value:null};case He.Kind.INT:return{attribute:t,value:TN(e.value)};case He.Kind.FLOAT:return{attribute:t,value:cG(e.value)};case He.Kind.BOOLEAN:case He.Kind.STRING:return{attribute:t,value:e.value.value};case He.Kind.VARIABLE:return lG(e.value,t,r);case He.Kind.OBJECT:return fG(e.value,t,r);case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Value type, ${e.value.kind}, is not supported.`)}}function fG(e,t,r){return e.fields.flatMap(n=>Zae(n,t,r))}function ece(e,t){switch(e.value.kind){case He.Kind.NULL:return{attribute:e.name.value,value:null};case He.Kind.INT:return{attribute:e.name.value,value:TN(e.value)};case He.Kind.FLOAT:return{attribute:e.name.value,value:cG(e.value)};case He.Kind.BOOLEAN:case He.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case He.Kind.VARIABLE:return lG(e.value,e.name.value,t);case He.Kind.OBJECT:return fG(e.value,[e.name.value],t);case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Argument type, ${e.value.kind}, is not supported.`)}}function tce(e,t){return e.flatMap(r=>ece(r,t))}function SS(e,t){return e.selections.flatMap(r=>{switch(r.kind){case He.Kind.FIELD:return r;case He.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new $r(`Fragment \`${n}\` not found.`);return SS(s.selectionSet,t)}case He.Kind.INLINE_FRAGMENT:return SS(r.selectionSet,t)}})}function mG(e,t){return SS(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:mG(r.selectionSet,t)}:r.name.value)}async function rce(e,t,r,n){let s=vs.getMatch(e.name.value,"graphql");if(s===void 0)throw new $r(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,a={select:mG(e.selectionSet,r),conditions:tce(e.arguments,t)},c=[];n.authorize=!0;for await(let l of i.search(a,n))c.push(l);return[e.name.value,c]}function pG(e){switch(e.kind){case He.Kind.NULL:return null;case He.Kind.INT:return TN(e);case He.Kind.FLOAT:return parseFloat(e.value);case He.Kind.STRING:case He.Kind.BOOLEAN:return e.value;case He.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:pG(r.value),...t}),{});case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Value type, ${e.kind}, is not supported.`)}}function nce(e,t){let r=new Map;for(let n of e){let s=n.variable.name.value,i=t?.[s];if(i===void 0&&n.defaultValue!==void 0&&(i=pG(n.defaultValue)),n.type.kind===He.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new $r(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function sce(e,t,r,n){if(e.operation===He.OperationTypeNode.SUBSCRIPTION)throw new $r("Subscriptions are not supported.");if(e.operation===He.OperationTypeNode.MUTATION)throw new $r("Mutations are not supported yet.");let s=nce(e.variableDefinitions,t),i=await Promise.all(SS(e.selectionSet,r).map(c=>rce(c,s,r,n))),a={data:{}};for(let[c,l]of i)a.data[c]=l;return a}async function aG({query:e,variables:t={},operationName:r},n){let s=He.parse(e),i=new Map,a=new Map;for(let u of s.definitions)if(Xae(u),u.kind===He.Kind.FRAGMENT_DEFINITION)a.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new $r("Unnamed operations are only allowed when there is a single operation in the document.");let d=u.name?.value??"Unnamed Query";if(i.has(d))throw new $r(`Duplicate operation definition: ${d}`);i.set(d,u)}let c;if(r==null)if(i.size===1)c=i.entries().next().value[1];else throw new $r("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new $r(`Operation \`${r}\` not found.`);let l=await sce(c,t,a,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function ice(e){switch(e.method){case"GET":{let t=new URLSearchParams(e.url.split("?")[1]),r={};for(let[n,s]of t)r[n]=n==="variables"||n==="extensions"?JSON.parse(s):s;return oG(r),aG(r,e)}case"POST":{let r=await Do(e.headers.get("content-type"),!0)(e._nodeRequest);return oG(r),aG(r,e)}default:throw new io("Method Not Allowed",405,{Allow:"GET, POST"})}}function oce(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await ice(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof io)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof He.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof $r)return{status:200,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};break}default:logger.info(`Unsupported accept header, ${s}, defaulting to application/graphql-response+json`);case"application/graphql-response+json":{if(n instanceof io)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof He.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof $r)return{status:400,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};break}}throw n}},{port:e.port,securePort:e.securePort})}var He,$r,io,hG=se(()=>{He=b(require("graphql"));Mo();$a();o(Xae,"assertExecutableDefinitionNode");o(oG,"assertRequestParams");o(TN,"processIntValueNode");o(cG,"processFloatValueNode");o(lG,"processVariableNode");o(uG,"isObject");o(dG,"transformObjectIntoQueryCondition");o(Zae,"processObjectFieldNode");o(fG,"processObjectValueNode");o(ece,"processArgumentNode");o(tce,"buildConditionsQuery");o(SS,"fillInFragments");o(mG,"buildSelectQuery");o(rce,"processFieldNode");o(pG,"processConstValueNode");o(nce,"resolveVariables");o(sce,"executeOperation");o(aG,"resolver");$r=class extends Error{static{o(this,"GraphQLQueryingError")}},io=class extends Error{static{o(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};o(ice,"graphqlQueryingHandler");o(oce,"start")});var yG=v((vUe,TG)=>{var wd=require("validate.js"),_G=at(),Nd=(q(),M(Y)),{handleHDBError:ace,hdbErrors:cce}=_e(),{HDB_ERROR_MSGS:ir,HTTP_STATUS_CODES:lce}=cce,RN=o(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),uce={STRUCTURE_USER:"structure_user"},EG=Object.values(Nd.ROLE_TYPES_ENUM),dce="attribute_permissions",fce="attribute_name",{PERMS_CRUD_ENUM:Cd}=Nd,mce=[dce,...Object.values(Cd)],gG=[Cd.READ,Cd.INSERT,Cd.UPDATE],pce=[fce,...gG];function hce(e){let t=RN();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,SG(e,t)}o(hce,"addRoleValidation");function Ece(e){let t=RN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,SG(e,t)}o(Ece,"alterRoleValidation");function _ce(e){let t=RN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,_G.validateObject(e,t)}o(_ce,"dropRoleValidation");var gce=["operation","role","id","permission","hdb_user","access"];function SG(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let a=0,c=n.length;a<c;a++)gce.includes(n[a])||s.push(n[a]);s.length>0&&hr(ir.INVALID_ROLE_JSON_KEYS(s),r);let i=_G.validateObject(e,t);if(i&&i.message.split(",").forEach(a=>{hr(a,r)}),e.permission){let a=Sce(e);a&&hr(a,r),EG.forEach(c=>{e.permission[c]&&!wd.isBoolean(e.permission[c])&&hr(ir.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let a in e.permission)if(EG.indexOf(a)<0){if(a===uce.STRUCTURE_USER){let l=e.permission[a];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,d=l.length;u<d;u++){let f=l[u];global.hdb_schema[f]||hr(ir.SCHEMA_NOT_FOUND(f),r)}continue}hr(ir.STRUCTURE_USER_ROLE_TYPE_ERROR(a),r);continue}let c=e.permission[a];if(!a||!global.hdb_schema[a]){hr(ir.SCHEMA_NOT_FOUND(a),r);continue}if(c.tables)for(let l in c.tables){let u=c.tables[l];if(!l||!global.hdb_schema[a][l]){hr(ir.TABLE_NOT_FOUND(a,l),r);continue}if(Object.keys(u).forEach(d=>{mce.includes(d)||hr(ir.INVALID_PERM_KEY(d),r,a,l)}),Object.values(Cd).forEach(d=>{wd.isDefined(u[d])?wd.isBoolean(u[d])||hr(ir.TABLE_PERM_NOT_BOOLEAN(d),r,a,l):hr(ir.TABLE_PERM_MISSING(d),r,a,l)}),u.attribute_permissions===void 0){hr(ir.ATTR_PERMS_ARRAY_MISSING,r,a,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){hr(ir.ATTR_PERMS_NOT_ARRAY,r,a,l);continue}if(u.attribute_permissions){let d=global.hdb_schema[a][l].attributes.map(({attribute:m})=>m),f={read:!1,insert:!1,update:!1};for(let m in u.attribute_permissions){let p=u.attribute_permissions[m];if(Object.keys(p).forEach(E=>{!pce.includes(E)&&E!==Cd.DELETE&&hr(ir.INVALID_ATTR_PERM_KEY(E),r,a,l)}),!wd.isDefined(p.attribute_name)){hr(ir.ATTR_PERM_MISSING_NAME,r,a,l);continue}let h=p.attribute_name;if(!d.includes(h)){hr(ir.INVALID_ATTRIBUTE_IN_PERMS(h),r,a,l);continue}gG.forEach(E=>{wd.isDefined(p[E])?wd.isBoolean(p[E])||hr(ir.ATTR_PERM_NOT_BOOLEAN(E,h),r,a,l):hr(ir.ATTR_PERM_MISSING(E,h),r,a,l)}),!f.read&&p.read===!0&&(f.read=!0),!f.insert&&p.insert===!0&&(f.insert=!0),!f.update&&p.update===!0&&(f.update=!0)}if(u.read===!1&&f.read===!0||u.insert===!1&&f.insert===!0||u.update===!1&&f.update===!0){let m=`${a}.${l}`;hr(ir.MISMATCHED_TABLE_ATTR_PERMS(m),r,a,l)}}}}return Tce(r)}o(SG,"customValidate");TG.exports={addRoleValidation:hce,alterRoleValidation:Ece,dropRoleValidation:_ce};function Sce(e){let{operation:t,permission:r}=e;if(t===Nd.OPERATIONS_ENUM.ADD_ROLE||t===Nd.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 ir.SU_CU_ROLE_COMBINED_ERROR;{let a=r.super_user?Nd.ROLE_TYPES_ENUM.SUPER_USER:Nd.ROLE_TYPES_ENUM.CLUSTER_USER;return ir.SU_CU_ROLE_NO_PERMS_ALLOWED(a)}}}return null}o(Sce,"validateNoSUPerms");function Tce(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:ir.ROLE_PERMS_ERROR,...e};return ace(new Error,n,lce.BAD_REQUEST)}else return null}o(Tce,"generateRolePermResponse");function hr(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]}}o(hr,"addPermError")});var Gp=v((BUe,IG)=>{"use strict";var RG=pn(),bG=En(),yce=Qa(),AN=yG(),IN=qo(),xUe=require("uuid").v4,Rce=require("util"),TS=(q(),M(Y)),bce=oe(),wN=bG.searchByValue,Ace=bG.searchByHash,Ice=Rce.promisify(yce.delete),wce=di(),Nce=rd(),{hdbErrors:Cce,handleHDBError:Ml}=_e(),{HDB_ERROR_MSGS:AG,HTTP_STATUS_CODES:qp}=Cce,{UserEventMsg:NN}=is();IG.exports={addRole:Oce,alterRole:Pce,dropRole:Lce,listRoles:Dce};function bN(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}o(bN,"scrubRoleDetails");async function Oce(e){let t=AN.addRoleValidation(e);if(t)throw t;e=bN(e);let r={schema:"system",table:"hdb_role",attribute:"role",value:e.role,hash_attribute:"id",get_attributes:["*"]},n;try{n=Array.from(await wN(r)||[])}catch(i){throw Ml(i)}if(n&&n.length>0)throw Ml(new Error,AG.ROLE_ALREADY_EXISTS(e.role),qp.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 RG.insert(s),IN.signalUserChange(new NN(process.pid)),e=bN(e),e}o(Oce,"addRole");async function Pce(e){let t=AN.alterRoleValidation(e);if(t)throw t;e=bN(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await RG.update(r)}catch(s){throw Ml(s)}if(n&&n?.message==="updated 0 of 1 records")throw Ml(new Error,"Invalid role id",qp.BAD_REQUEST,void 0,void 0,!0);return await IN.signalUserChange(new NN(process.pid)),e}o(Pce,"alterRole");async function Lce(e){let t=AN.dropRoleValidation(e);if(t)throw Ml(new Error,t,qp.BAD_REQUEST,void 0,void 0,!0);let r=new Nce(TS.SYSTEM_SCHEMA_NAME,TS.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Ace(r));if(n.length===0)throw Ml(new Error,AG.ROLE_NOT_FOUND,qp.NOT_FOUND,void 0,void 0,!0);let s=new wce(TS.SYSTEM_SCHEMA_NAME,TS.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await wN(s)),a=!1;if(bce.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){a=!0;break}}if(a===!0)throw Ml(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,qp.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Ice(c),IN.signalUserChange(new NN(process.pid)),`${n[0].role} successfully deleted`}o(Lce,"dropRole");async function Dce(){return wN({table:"hdb_role",schema:"system",hash_attribute:"id",attribute:"id",value:"*",get_attributes:["*"]})}o(Dce,"listRoles")});var CN={};Re(CN,{start:()=>CG,startOnMainThread:()=>Uce});function CG({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,wG.parseDocument)(r.toString(),{simpleKeys:!0}).toJSON();for(let s in n){let i=n[s];i.permission||(i={permission:i},i.permission.access&&(i.access=i.permission.access,delete i.permission.access));for(let a in i.permission){if(Mce.includes(a))continue;let c=i.permission[a];c.tables||(i.permission[a]=c={tables:c});for(let l in c.tables){let u=c.tables[l];if(u.read=!!u.read,u.insert=!!u.insert,u.update=!!u.update,u.delete=!!u.delete,u.attributes){let d=[];for(let f in u.attributes){let m=u.attributes[f];m.attribute_name=f,d.push(m)}u.attribute_permissions=d,delete u.attributes}if(u.attribute_permissions){if(!Array.isArray(u.attribute_permissions))throw new Error("attribute_permissions must be an array if defined");for(let d of u.attribute_permissions)d.read=!!d.read,d.insert=!!d.insert,d.update=!!d.update}else u.attribute_permissions=null}}i.role=i.id=s,await vce(i)}}}async function vce(e){let t=ct().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,NG.isEqual)(i,e)?void 0:(e.id=r.id,(0,yS.alterRole)(e))}return(0,yS.addRole)(e)}var yS,wG,NG,Mce,Uce,OG=se(()=>{we();yS=b(Gp()),wG=require("yaml"),NG=require("lodash"),Mce=["super_user","cluster_user","structure_user"];o(CG,"start");o(vce,"ensureRole");Uce=CG});async function RS(e){let t=(0,DG.pathToFileURL)(e).toString();if(xce)return $p||($p=Bce(kce)),(await(await $p).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function Bce(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),$p=new Compartment({console,Math,Date,fetch:Fce,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,LG.extname)(r)||(r+=".js"),r)},importHook:o(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){s.Resource=Hr,s.tables=Tn,s.databases=De}};let n=await(0,PG.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),$p}function Fce(e,t){let r=typeof e=="string"||e.url;if(new URL(r).protocol!="https")throw new Error("Only https is allowed in fetch");return fetch(e,t)}function kce(){return{Resource:Hr,tables:Tn}}var PG,LG,DG,xce,$p,ON=se(()=>{Ga();we();PG=require("fs/promises"),LG=require("path"),DG=require("url"),xce=!1;o(RS,"secureImport");o(Bce,"getCompartment");o(Fce,"secureOnlyFetch");o(kce,"getGlobalVars")});var PN={};Re(PN,{handleApplication:()=>Hce,suppressHandleApplicationWarning:()=>qce});function MG(e){return typeof e=="function"&&("get"in e||"put"in e||"post"in e||"delete"in e)}async function Hce(e){e.handleEntry(t=>{if(t.entryType!=="file"){e.logger.warn(`jsResource plugin cannot handle entry type ${t.entryType}. Modify the 'files' option in ${e.configFilePath} to only include files.`);return}if(t.eventType!=="add"){e.requestRestart();return}RS(t.absolutePath).then(r=>{let n=(0,bS.dirname)(t.urlPath);MG(r.default)&&(e.resources.set(n,r.default),e.logger.debug(`Registered root resource: ${n}`)),vG(e,r,n)}).catch(r=>{e.logger.error(`Failed to load resource module ${t.absolutePath}: ${r}`),e.requestRestart()})})}function vG(e,t,r){for(let n in t){let s=t[n],i=(0,bS.join)(r,n);MG(s)?(e.resources.set(i,s),e.logger.debug(`Registered resource: ${i}`)):typeof s=="object"&&vG(e,s,i)}}var bS,qce,UG=se(()=>{ON();bS=require("path");o(MG,"isResource");o(Hce,"handleApplication");o(vG,"recurseForResources");qce=!0});var DN={};Re(DN,{start:()=>Gce});function Gce({resources:e}){e.set("login",LN),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var LN,xG=se(()=>{Ga();o(Gce,"start");LN=class extends Hr{static{o(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:a}=r;return{data:await n.login(s,i)}}}});function GG(e){let t={openapi:$ce,info:{title:"HarperDB HTTP REST interface",version:HG.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}],n=o(s=>{if(s.type&&!t.components.schemas[s.type]){t.components.schemas[s.type]={};let i={},a=[];for(let c of s.properties)AS[c.type]?i[c.name]=new vN(AS[c.type],c.type):c.properties?(i[c.name]=new $G(c.type),n(c)):c.elements?.properties&&(i[c.name]=new jce(c.elements.type),n(c.elements)),c.nullable===!1&&a.push(c.name);t.components.schemas[s.type]=new kG(i,!s.sealed,a)}},"includeDefinitionInSchema");for(let[,s]of e){if(!s.path||s.Resource.isError)continue;let{path:i}=s,a=i.split("/").pop(),{attributes:c,sealed:l}=s.Resource,{prototype:u,primaryKey:d="id"}=s.Resource;if(!c&&e.allTypes.has(s.path)){let J=e.allTypes.get(s.path);l=J.sealed,c=J.properties}if(!d)continue;let f={},m=[],p=[];if(c)for(let{type:J,name:G,elements:H,relationship:X,definition:z,nullable:de}of c){let le=z??H?.definition;le&&n(le),de===!1&&p.push(G),X?J==="array"?f[G]={type:"array",items:{$ref:qs+H.type}}:f[G]={$ref:qs+J}:le?J==="array"?f[G]={type:"array",items:{$ref:qs+le.type}}:f[G]={$ref:qs+le.type}:J==="array"?H.type==="Any"?f[G]={type:"array",items:{format:H.type}}:f[G]={type:"array",items:new vN(AS[H.type],H.type)}:J==="Any"?f[G]={format:J}:f[G]=new vN(AS[J],J),m.push(new UN(G,"query",f[G]))}let h=Object.keys(f),E=new UN(d,"path",{type:"string",format:"ID"});E.required=!0,E.description="primary key of record";let g=new UN("property","path",{enum:h});g.required=!0,t.components.schemas[a]=new kG(f,!l,p);let R=u.post!==Resource.prototype.post||u.update,S=typeof u.put=="function",y=typeof u.get=="function",C=typeof u.delete=="function",I=typeof u.patch=="function",k="/"+i+"/";R&&(t.paths[k]={},t.paths[k].post=new Vce(a,r,{200:new Od({$ref:qs+a},{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}})},"create a new record auto-assigning a primary key")),y&&(t.paths[k]||(t.paths[k]={}),t.paths[k].get=new MN(m,r,{200:new Od({type:"array",items:{$ref:qs+a}})},"search for records by the specified property name and value pairs")),t.paths[k]||(t.paths[k]={}),t.paths[k].options=new Kce(m,r,{200:new Yce},"retrieve information about the communication options available for a target resource or the server as a whole, without performing any resource action"),C&&(t.paths[k]||(t.paths[k]={}),t.paths[k].delete=new FG(m,r,"delete all the records that match the provided query",{204:new BG})),k="/"+i+"/{"+d+"}",y&&(t.paths[k]={},t.paths[k].get=new MN([E],r,{200:new Od({$ref:qs+a})},"retrieve a record by its primary key")),S&&(t.paths[k]||(t.paths[k]={}),t.paths[k].put=new Wce([E],r,a,{200:new Od({$ref:qs+a})},"create or update the record with the URL path that maps to the record's primary key")),I&&(t.paths[k]||(t.paths[k]={}),t.paths[k].patch=new zce([E],r,a,{200:new Od({$ref:qs+a})},"patch the record with the URL path that maps to the record's primary key")),C&&(t.paths[k]||(t.paths[k]={}),t.paths[k].delete=new FG([E],r,"delete a record with the given primary key",{204:new BG})),y&&g.schema.enum.length>0&&(k="/"+i+"/{"+d+"}.{property}",t.paths[k]={},t.paths[k].get=new MN([E,g],r,{200:new Od({enum:h})},"used to retrieve the specified property of the specified record"))}for(let[,s]of e.allTypes)n(s),s.sealed&&t.components.schemas[s.type].additionalProperties&&(t.components.schemas[s.type].additionalProperties=!1);return t}function Vce(e,t,r,n){this.description=n,this.requestBody={content:{"application/json":{schema:{$ref:qs+e}}}},this.security=t,this.responses=r}function MN(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function Kce(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function Yce(){this.description=qG,this.headers={},this.content={}}function Od(e,t){this.description=qG,this.content={"application/json":{schema:e}},this.headers=t}function BG(){this.description="successfully processed request, no content returned to client"}function Wce(e,t,r,n,s){this.description=s,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:qs+r}}}},this.responses=n}function zce(e,t,r,n,s){this.description=s,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:qs+r}}}},this.responses=n}function FG(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function kG(e,t,r){this.type="object",this.properties=e,this.additionalProperties=t,this.required=r}function vN(e,t){this.type=e,(e==="string"||e==="number"||e==="integer")&&t!=="String"&&(this.format=t)}function $G(e){this.$ref=`#/components/schemas/${e}`}function jce(e){this.type="array",this.items=new $G(e)}function UN(e,t,r){this.name=e,this.in=t,this.schema=r}var HG,$ce,AS,qs,qG,VG=se(()=>{HG=b(Ot()),$ce="3.0.3",AS={Int:"integer",Float:"number",Long:"integer",ID:"string",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer"},qs="#/components/schemas/",qG="successful operation";o(GG,"generateJsonApi");o(Vce,"Post");o(MN,"Get");o(Kce,"Options");o(Yce,"ResponseOptions200");o(Od,"Response200");o(BG,"Response204");o(Wce,"Put");o(zce,"Patch");o(FG,"Delete");o(kG,"ResourceSchema");o(vN,"Type");o($G,"Ref");o(jce,"ArrayRef");o(UN,"Parameter")});var YG={};Re(YG,{Request:()=>sc,createReuseportFd:()=>IS});var KG,sc,xN,BN,IS,Vp=se(()=>{KG=require("os"),sc=class{static{o(this,"Request")}#e;#t;_nodeRequest;_nodeResponse;method;url;headers;isWebSocket;user;constructor(t,r){this.method=t.method;let n=t.url;this._nodeRequest=t,this._nodeResponse=r,this.url=n,this.headers=new BN(t.headers)}get absoluteURL(){return this.protocol+"://"+this.host+this.url}get pathname(){let t=this.url.indexOf("?");return t>-1?this.url.slice(0,t):this.url}set pathname(t){let r=this.url.indexOf("?");r>-1?this.url=t+this.url.slice(r):this.url=t}get protocol(){return this._nodeRequest.socket.encrypted?"https":"http"}get ip(){return this._nodeRequest.socket.remoteAddress}get authorized(){return this._nodeRequest.socket.authorized}get peerCertificate(){return this.#t===void 0&&(this.#t=this._nodeRequest.socket.getPeerCertificate?.(!0)||null),this.#t}get mtlsConfig(){return this._nodeRequest.socket.server.mtlsConfig}get body(){return this.#e||(this.#e=new xN(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get httpVersion(){return this._nodeRequest.httpVersion}get isAborted(){return!1}get nodeRequest(){return this._nodeRequest}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},xN=class{static{o(this,"RequestBody")}#e;constructor(t){this.#e=t}on(t,r){return this.#e.on(t,r),this}pipe(t,r){return this.#e.pipe(t,r)}},BN=class{static{o(this,"Headers")}asObject;constructor(t){this.asObject=t}set(t,r){this.asObject[t.toLowerCase()]=r}get(t){return this.asObject[t.toLowerCase()]}has(t){return Object.prototype.hasOwnProperty.call(this.asObject,t.toLowerCase())}[Symbol.iterator](){return Object.entries(this.asObject)[Symbol.iterator]()}keys(){return Object.keys(this.asObject)}values(){return Object.values(this.asObject)}delete(t){delete this.asObject[t.toLowerCase()]}forEach(t){for(let[r,n]of this)t(n,r,this)}};(0,KG.platform)()!="win32"&&(IS=require("node-unix-socket").createReuseportFd)});var NS={};Re(NS,{parseHeaderValue:()=>kN,start:()=>Xce});async function Jce(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&lg(e);let i=new Fs;try{e.responseHeaders=i;let a=e.url.slice(1),c,l;if(a!==WG){let g=wS.getMatch(a,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new ci(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=kN(g);for(let S of R)switch(S.name){case"max-age":e.expiresAt=S.value*1e3+Date.now();break;case"only-if-cached":e.onlyIfCached=!0;break;case"no-cache":e.noCache=!0;break;case"no-store":e.noCacheStore=!0;break;case"stale-if-error":e.staleIfError=!0;break;case"must-revalidate":e.mustRevalidate=!0;break}}}let u=r["x-replicate-to"];if(u){let g=kN(u).map(R=>(R.next?.name==="confirm"&&R.next.value>=0&&(e.replicatedConfirmation=+R.next.value),R.name));e.replicateTo=g.length===1&&+g[0]>=0?+g[0]:g[0]==="*"?void 0:g}r["x-replicate-from"]==="none"&&(e.replicateFrom=!1);let f=await At(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=Do(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new Pd.ClientError(g,400)}if(e.authorize=!0,a===WG&&s==="GET"){if(e?.user?.role?.permission?.super_user)return GG(wS);throw new Pd.ServerError("Forbidden",403)}switch(c.checkPermission=e.user?.role?.permission??{},s){case"GET":case"HEAD":return l.get(c,e);case"POST":return l.post(c,e.data,e);case"PUT":return l.put(c,e.data,e);case"DELETE":return l.delete(c,e);case"PATCH":return l.patch(c,e.data,e);case"OPTIONS":i.setIfNone("Allow","GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE");return;case"CONNECT":return l.connect(c,null,e);case"TRACE":return"HarperDB is the terminating server";case"QUERY":return l.query(c,e.data,e);case"COPY":return l.copy(c,r.destination,e);case"MOVE":return l.move(c,r.destination,e);case"BREW":throw new Pd.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Pd.ServerError(`Method ${s} is not recognized`,501)}}),m=200,p=e.lastModified;if(f==null)m=s==="GET"||s==="HEAD"?404:204,FN.lastModified&&isFinite(p)&&i.setIfNone("Last-Modified",new Date(p).toUTCString());else if(f.status>0&&f.headers){let g=Pq(f.headers,i);return f.headers!==g&&(f.headers=g),f.data!==void 0&&(f.body=Cm(f.data,e,f)),f}else if(isFinite(p)){Qce[0]=p;let g=String.fromCharCode(34,(rn[0]&63)+62,(rn[0]>>6)+(rn[1]<<2&63)+62,(rn[1]>>4)+(rn[2]<<4&63)+62,(rn[2]>>2)+62,(rn[3]&63)+62,(rn[3]>>6)+(rn[4]<<2&63)+62,(rn[4]>>4)+(rn[5]<<4&63)+62,(rn[5]>>2)+62,(rn[6]&63)+62,(rn[6]>>6)+(rn[7]<<2&63)+62,34),R=r["if-none-match"];R&&g==R?(f?.onDone&&f.onDone(),m=304,f=void 0):i.setIfNone("ETag",g),FN.lastModified&&i.setIfNone("Last-Modified",new Date(p).toUTCString())}e.createdResource&&(m=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let h={status:m,headers:i,body:void 0},E=e.loadedFromSource??f?.wasLoadedFromSource?.();return E!==void 0&&(h.wasCacheMiss=E,!E&&isFinite(p)&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||p))/1e3))),f!==void 0&&(h.body=Cm(f,e,h),s==="HEAD"&&(h.body=void 0)),h}catch(a){a.statusCode?a.statusCode===500?_i.warn(a):_i.info(a):_i.error(a),a.statusCode===405&&(a.method&&(a.message+=` to handle HTTP method ${a.method.toUpperCase()||""}`),a.allow&&(a.allow.push("trace","head","options"),i.setIfNone("Allow",a.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:a.statusCode||500,headers:i,body:void 0};return c.body=Cm(a.contentType?a:QG(a),e,c),c}}function Xce(e){FN=e,e.includeExpensiveRecordCountEstimates&&(sc.prototype.includeExpensiveRecordCountEstimates=!0),!zG&&(zG=!0,wS=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return Jce(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{Kp++;let s=new Xn;jG||(jG=!0,$m(l=>{Kp>0&&l.push({metric:"ws-connections",connections:Kp,byThread:!0})}));let i;t.on("error",l=>{i=!0,_i.warn(l)});let a;t.on("message",o(function(u){a||(a=Do(r.requestedContentType??r.headers.asObject["content-type"],!1));let d=a(u);Ve(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(d)},"message"));let c;t.on("close",()=>{Kp--,Zr(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=wS.getMatch(l,"ws");if(Zr(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,Ve(h=>({count:h.count,total:Kp}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let d=new ci(u.relativeURL);d.checkPermission=r.user?.role?.permission??{};let f=u.Resource;c=(await At(r,()=>f.connect(d,s,r)))[Symbol.asyncIterator]();let p;for(;!(p=await c.next()).done;){let h=await Lo(p.value,r);t.send(h),Ve(h.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(E=>t._socket.once("drain",E))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?_i.warn(l):_i.info(l):_i.error(l),t.close(Zce[l.statusCode]||1011,QG(l))}t.close()},e))}function kN(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,a]=s.trim().split("=");i=i.trim(),a&&(a=a.trim()),r={name:i.toLowerCase(),value:a,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var _i,Pd,QG,rn,Qce,FN,WG,zG,wS,jG,Kp,Zce,JG=se(()=>{Mo();ts();_i=b(Q()),Pd=b(_e());ug();Ou();Ua();Pp();VG();Vp();fg();({errorToString:QG}=_i),rn=new Uint8Array(8),Qce=new Float64Array(rn.buffer,0,1),FN={},WG="openapi";o(Jce,"http");Kp=0;o(Xce,"start");Zce={401:3e3,403:3003};o(kN,"parseHeaderValue")});var HN=v((lxe,ZG)=>{var{recordAction:CS,recordActionBinary:XG}=(ts(),M(tg)),ele=require("fastify-plugin"),tle=200;ZG.exports=ele(function(e,t,r){e.addHook("onResponse",async(n,s)=>{let i=s.elapsedTime}),e.addHook("onSend",async(n,s,i)=>{let a=s.elapsedTime,c=performance.now(),l=s.request.routeOptions,u,d,f;l.config?.isOperation?(u=n.body?.operation,d="operation"):(u=l.url,d="fastify-route",f=l.method),CS(a,"duration",u,f,d),XG(s.raw.statusCode<400,"success",u,f,d),XG(1,"response_"+s.raw.statusCode,u,f,d);let m=tle;i?.pipe?(i.on("data",g=>{m+=g.length}),i.on("end",()=>{CS(performance.now()-c,"transfer",u,f,d),CS(m,"bytes-sent",u,f,d)})):(m+=i?.length||0,CS(m,"bytes-sent",u,f,d));let p=a.toFixed(3),h=s.getHeader("Server-Timing"),E=`db;dur=${p}`;s.header("Server-Timing",h?`${h}, ${E}`:E)}),r()},{name:"hdb-request-time"})});var t$=v((uxe,e$)=>{var rle=at(),nle={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};e$.exports=function(e){return rle.validateObject(e,nle)}});var Yp=v((dxe,r$)=>{"use strict";var sle=(q(),M(Y)).OPERATIONS_ENUM,qN=class{static{o(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=sle.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};r$.exports=qN});var jp={};Re(jp,{createTokens:()=>VN,getJWTRSAKeys:()=>MS,refreshOperationToken:()=>KN,validateOperationToken:()=>YN,validateRefreshToken:()=>vS});async function MS(){if(OS)return OS;try{let e=Wp.default.join(zp.default.getHdbBasePath(),Cb),t=await PS.default.readFile(Wp.default.join(e,dm.JWT_PASSPHRASE_NAME),"utf8"),r=await PS.default.readFile(Wp.default.join(e,dm.JWT_PRIVATE_KEY_NAME),"utf8");return OS={publicKey:await PS.default.readFile(Wp.default.join(e,dm.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},OS}catch(e){throw DS.default.error(e),new gi.ClientError(Dd.NO_ENCRYPTION_KEYS,Ld.INTERNAL_SERVER_ERROR)}}async function VN(e){let t=(0,GN.validateBySchema)(e,oo.default.object({username:oo.default.string().optional(),password:oo.default.string().optional(),role:oo.default.string().optional(),expires_in:oo.default.alternatives(oo.default.string(),oo.default.number()).optional()}));if(t)throw new gi.ClientError(t.message);let r;try{let f=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,f=!1),r=await(0,$N.findAndValidateUser)(e.username,e.password,f)}catch(f){throw DS.default.error(f),new gi.ClientError(Dd.INVALID_CREDENTIALS,Ld.UNAUTHORIZED)}if(!r)throw new gi.ClientError(Dd.INVALID_CREDENTIALS,Ld.UNAUTHORIZED);let n=!1,s=!1;r.role?.permission&&(n=r.role.permission.super_user===!0,s=r.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s};e.role&&(i.role=e.role);let a=await MS(),c=await Md.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:e.expires_in??a$,algorithm:LS,subject:vd.OPERATION}),l=await Md.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:ile,algorithm:LS,subject:vd.REFRESH}),u=yw(l,qr.SHA256);if((await(0,n$.update)(new s$.default(lm,wu.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new gi.ClientError(Dd.REFRESH_TOKEN_SAVE_FAILED,Ld.INTERNAL_SERVER_ERROR);return i$.default.signalUserChange(new o$.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function KN(e){let t=(0,GN.validateBySchema)(e,oo.default.object({refresh_token:oo.default.string().required()}).required());if(t)throw new gi.ClientError(t.message);let{refresh_token:r}=e;await vS(r);let n=await MS(),s=await Md.default.decode(r);return{operation_token:await Md.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:a$,algorithm:LS,subject:vd.OPERATION})}}async function YN(e){return c$(e,vd.OPERATION)}async function vS(e){return c$(e,vd.REFRESH)}async function c$(e,t){try{let r=await MS(),n=await Md.default.verify(e,r.publicKey,{algorithms:LS,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,$N.findAndValidateUser)(n.username,void 0,!1);if(t===vd.REFRESH&&!Rw(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw DS.default.warn(r),r?.name==="TokenExpiredError"?new gi.ClientError(Dd.TOKEN_EXPIRED,Ld.FORBIDDEN):new gi.ClientError(Dd.INVALID_TOKEN,Ld.UNAUTHORIZED)}}var Md,PS,Wp,oo,GN,gi,DS,$N,n$,s$,i$,o$,zp,Ld,Dd,a$,ile,LS,vd,OS,Ud=se(()=>{Md=b(require("jsonwebtoken")),PS=b(require("fs-extra")),Wp=b(require("node:path")),oo=b(require("joi")),GN=b(at());q();gi=b(_e()),DS=b(Q());Aw();$N=b(fs()),n$=b(pn()),s$=b(Yp()),i$=b(qo()),o$=b(is()),zp=b(ce()),{HTTP_STATUS_CODES:Ld,AUTHENTICATION_ERROR_MSGS:Dd}=gi.hdbErrors;zp.default.initSync();a$=zp.default.get(F.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",ile=zp.default.get(F.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",LS="RS256",vd={OPERATION:"operation",REFRESH:"refresh"};o(MS,"getJWTRSAKeys");o(VN,"createTokens");o(KN,"refreshOperationToken");o(YN,"validateOperationToken");o(vS,"validateRefreshToken");o(c$,"validateToken")});var WN=v((Exe,d$)=>{"use strict";var ole=t$(),xd=require("passport"),ale=require("passport-local").Strategy,cle=require("passport-http").BasicStrategy,lle=require("util"),ule=fs(),u$=lle.callbackify(ule.findAndValidateUser),hxe=zr(),dle=(q(),M(Y)),l$=(Ud(),M(jp));xd.use(new ale(function(e,t,r){u$(e,t,r)}));xd.use(new cle(function(e,t,r){u$(e,t,r)}));xd.serializeUser(function(e,t){t(null,e)});xd.deserializeUser(function(e,t){t(null,e)});function fle(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let a=e.headers.authorization.split(" ");n=a[0],s=a[1]}function i(a,c){return a?r(a):c?r(null,c):r("Must login")}switch(o(i,"handleResponse"),n){case"Basic":xd.authenticate("basic",{session:!1},(a,c)=>{i(a,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===dle.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?l$.validateRefreshToken(s).then(a=>{e.body.refresh_token=s,r(null,a)}).catch(a=>{r(a)}):l$.validateOperationToken(s).then(a=>{r(null,a)}).catch(a=>{r(a)});break;default:xd.authenticate("local",{session:!1},function(a,c){i(a,c)})(e,t,r);break}}o(fle,"authorize");function mle(e,t){let r=ole(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 a=i[e.schema].tables[e.table].attribute_permissions;for(let c in a)e.attributes.indexOf(a[c].attribute_name)>-1&&!a[c][e.operation]&&(n.authorized=!1,n.messages.push(`Not authorized to ${e.operation} ${a[c].attribute_name} `))}return t(null,n)}o(mle,"checkPermissions");d$.exports={authorize:fle,checkPermissions:mle}});var ZN=v((Txe,h$)=>{var FS=require("clone"),kS=at(),ple=oe(),xS=(q(),M(Y)),gxe=Q(),zN=require("fs"),QN=require("joi"),{string:BS}=QN.types(),{hdbErrors:hle,handleHDBError:US}=_e(),{HDB_ERROR_MSGS:Sxe,HTTP_STATUS_CODES:jN}=hle,{commonValidators:Bd}=Wi(),f$=" is required",Ele=["insert","update","upsert"],JN={database:{presence:!1,format:Bd.schema_format,length:Bd.schema_length},schema:{presence:!1,format:Bd.schema_format,length:Bd.schema_length},table:{presence:!0,format:Bd.schema_format,length:Bd.schema_length},action:{inclusion:{within:Ele,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},_le={schema:BS.required(),table:BS.required(),action:BS.valid("insert","update","upsert")},{AWS_ACCESS_KEY:gle,AWS_SECRET:Sle,AWS_BUCKET:Tle,AWS_FILE_KEY:yle,REGION:Rle}=xS.S3_BUCKET_AUTH_KEYS,ble={s3:{presence:!0},[`s3.${gle}`]:{presence:!0,type:"String"},[`s3.${Sle}`]:{presence:!0,type:"String"},[`s3.${Tle}`]:{presence:!0,type:"String"},[`s3.${yle}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${Rle}`]:{presence:!0,type:"String"}},m$=FS(JN);m$.data.presence={message:f$};var p$=FS(JN);p$.file_path.presence={message:f$};var Ale=Object.assign(FS(JN),ble),XN=FS(_le);XN.csv_url=BS.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();XN.passthrough_headers=QN.object();function Ile(e){let t=kS.validateObject(e,m$);return HS(e,t)}o(Ile,"dataObject");function wle(e){let t=kS.validateBySchema(e,QN.object(XN));return HS(e,t)}o(wle,"urlObject");function Nle(e){let t=kS.validateObject(e,p$);return HS(e,t)}o(Nle,"fileObject");function Cle(e){let t=kS.validateObject(e,Ale);return HS(e,t)}o(Cle,"s3FileObject");function HS(e,t){if(!t){let r=ple.checkGlobalSchemaTable(e.schema,e.table);if(r)return US(new Error,r,jN.BAD_REQUEST);if(e.operation===xS.OPERATIONS_ENUM.CSV_FILE_LOAD)try{zN.accessSync(e.file_path,zN.constants.R_OK|zN.constants.F_OK)}catch(n){return n.code===xS.NODE_ERROR_CODES.ENOENT?US(n,`No such file or directory ${n.path}`,jN.BAD_REQUEST):n.code===xS.NODE_ERROR_CODES.EACCES?US(n,`Permission denied ${n.path}`,jN.BAD_REQUEST):US(n)}}return t}o(HS,"postValidateChecks");h$.exports={dataObject:Ile,urlObject:wle,fileObject:Nle,s3FileObject:Cle}});var eC=v((Rxe,E$)=>{"use strict";var Qp=Q(),qS=(q(),M(Y));async function Ole(e,t,r,n=void 0){if(!e||typeof e!="function")throw new Error("Invalid function parameter");let s;try{return s=await e(t),r&&await r(t,s,n),t.operation===qS.OPERATIONS_ENUM.INSERT||t.operation===qS.OPERATIONS_ENUM.UPDATE||t.operation===qS.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===qS.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(Qp.info(i.message),i):i.http_resp_msg?(Qp.error(`Error calling operation: ${e.name}`),Qp.error(i.http_resp_msg),i):(Qp.error(`Error calling operation: ${e.name}`),Qp.error(i),i)}}o(Ole,"callOperationFunctionAsAwait");E$.exports={callOperationFunctionAsAwait:Ole}});var tC=v((Axe,g$)=>{"use strict";var{S3:Ple,GetObjectCommand:Lle}=require("@aws-sdk/client-s3");g$.exports={getFileStreamFromS3:Dle,getS3AuthObj:_$};async function Dle(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await _$(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new Lle(r))).Body}o(Dle,"getFileStreamFromS3");function _$(e,t,r){return new Ple({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(_$,"getS3AuthObj")});var T$=v((wxe,S$)=>{"use strict";var rC=class{static{o(this,"BulkLoadFileObject")}constructor(t,r,n,s,i,a,c=null){this.op=t,this.action=r,this.schema=n,this.table=s,this.file_path=i,this.file_type=a,this.role_perms=c}},nC=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};S$.exports={BulkLoadFileObject:rC,BulkLoadDataObject:nC}});var R$=v((Cxe,y$)=>{"use strict";var sC=class{static{o(this,"PermissionTableResponseObject")}constructor(t,r,n=[],s=[]){this.schema=t,this.table=r,this.required_table_permissions=n,this.required_attribute_permissions=s}};y$.exports=sC});var A$=v((Pxe,b$)=>{"use strict";var iC=class{static{o(this,"PermissionAttributeResponseObject")}constructor(t,r=[]){this.attribute_name=t,this.required_permissions=r}};b$.exports=iC});var aC=v((Dxe,w$)=>{"use strict";var I$=R$(),Mle=A$(),{HDB_ERROR_MSGS:vle}=zr(),oC=class{static{o(this,"PermissionResponseObject")}constructor(){this.error=vle.OP_AUTH_PERMS_ERROR,this.unauthorized_access={},this.invalid_schema_items=[]}handleUnauthorizedItem(t){return this.invalid_schema_items=[],this.unauthorized_access=[t],this}handleInvalidItem(t){return this.invalid_schema_items=[t],this.unauthorized_access=[],this}addInvalidItem(t,r,n){if(r&&n){let s=`${r}_${n}`;if(this.unauthorized_access[s])return}this.invalid_schema_items.push(t)}addUnauthorizedTable(t,r,n){let s=new I$(t,r,n),i=`${t}_${r}`;this.unauthorized_access[i]=s}addUnauthorizedAttributes(t,r,n,s){let i=[];t.forEach(c=>{let l=new Mle(c,s[c]);i.push(l)});let a=`${r}_${n}`;if(this.unauthorized_access[a])this.unauthorized_access[a].required_attribute_permissions=i;else{let c=new I$(r,n,[],i);this.unauthorized_access[a]=c}}getPermsResponse(){let t=Object.values(this.unauthorized_access);return t.length>0||this.invalid_schema_items.length>0?(this.unauthorized_access=t,this):null}};w$.exports=oC});var ic=v((Uxe,P$)=>{"use strict";var vxe=En(),Jp=Q(),{validateBySchema:N$}=at(),Wo=require("joi"),Ule=Zi(),GS=oe(),{handleHDBError:$S,hdbErrors:xle,ClientError:C$}=_e(),{HDB_ERROR_MSGS:VS,HTTP_STATUS_CODES:cC}=xle,O$=ce();O$.initSync();var{getDatabases:lC}=(we(),M(mt)),Ble=require("fs-extra"),Fle=(q(),M(Y));P$.exports={describeAll:kle,describeTable:KS,describeSchema:Hle};async function kle(e={}){try{let t=GS.isEmptyOrZeroLength(e),r=!!e.bypass_auth,n,s;!t&&!r&&(n=e.hdb_user?.role?.permission,s=n?.super_user||n?.cluster_user);let i=lC(),a={},c={},l=[],u=e?.exact_count,d=e?.include_computed;for(let m in i){a[m]=!0,!t&&!s&&!r&&(c[m]=e.hdb_user?.role?.permission[m]?.describe);let p=i[m];for(let h in p)try{let E;if(t||s||r)E=await KS({schema:m,table:h,exact_count:u,include_computed:d});else if(n&&n[m].describe&&n[m].tables[h].describe){let g=n[m].tables[h].attribute_permissions;E=await KS({schema:m,table:h,exact_count:u,include_computed:d},g)}E&&l.push(E)}catch(E){Jp.error(E)}}let f={};for(let m in l)t||s||r?(f[l[m].schema]==null&&(f[l[m].schema]={}),f[l[m].schema][l[m].name]=l[m],a[l[m].schema]&&delete a[l[m].schema]):c[l[m].schema]&&(f[l[m].schema]==null&&(f[l[m].schema]={}),f[l[m].schema][l[m].name]=l[m],a[l[m].schema]&&delete a[l[m].schema]);for(let m in a)t||s||r?f[m]={}:c[m]&&(f[m]={});return f}catch(t){return Jp.error("Got an error in describeAll"),Jp.error(t),$S(new Error,VS.DESCRIBE_ALL_ERR)}}o(kle,"describeAll");async function KS(e,t){GS.transformReq(e);let{schema:r,table:n}=e;r=r?.toString(),n=n?.toString();let s=t;e.hdb_user&&!e.hdb_user?.role?.permission?.super_user&&(s=e.hdb_user?.role?.permission[r]?.tables[n]?.attribute_permissions);let i=N$(e,Wo.object({database:Wo.string(),table:Wo.string().required(),exact_count:Wo.boolean().strict(),include_computed:Wo.boolean().strict()}));if(i)throw new C$(i.message);let c=lC()[r];if(!c)throw $S(new Error,VS.SCHEMA_NOT_FOUND(e.schema),cC.NOT_FOUND);let l=c[n];if(!l)throw $S(new Error,VS.TABLE_NOT_FOUND(e.schema,e.table),cC.NOT_FOUND);function u(p){(!p.computed||e.include_computed)&&d.push({attribute:p.attribute,type:p.type,elements:p.elements?.type,indexed:p.indexed,is_primary_key:p.isPrimaryKey,assigned_created_time:p.assignCreatedTime,assigned_updated_time:p.assignUpdatedTime,nullable:p.nullable,computed:p.computed?!0:void 0,properties:p.properties?p.properties.map(h=>({type:h.type,name:h.name})):void 0})}o(u,"pushAtt");let d=[];if(s){let p={};s.forEach(h=>{h.describe&&(p[h.attribute_name]=!0)}),l.attributes.forEach(h=>{p[h.name]&&u(h)})}else l.attributes?.forEach(p=>u(p));let f;try{f=(await Ble.stat(l.primaryStore.env.path)).size}catch(p){Jp.warn("unable to get database size",p)}let m={schema:r,name:l.tableName,hash_attribute:l.attributes.find(p=>p.isPrimaryKey||p.is_hash_attribute)?.name,audit:l.audit,schema_defined:l.schemaDefined,attributes:d,db_size:f};l.replicate!==void 0&&(m.replicate=l.replicate),l.expirationMS!==void 0&&(m.expiration=l.expirationMS/1e3+"s"),l.sealed!==void 0&&(m.sealed=l.sealed),l.sources?.length>0&&(m.sources=l.sources.map(p=>p.name).filter(p=>p&&p!=="NATSReplicator"&&p!=="Replicator")),O$.get(Fle.CONFIG_PARAMS.CLUSTERING_ENABLED)&&(m.clustering_stream_name=Ule.createNatsTableStreamName(m.schema,m.name));try{let p=await l.getRecordCount({exactCount:!!e.exact_count});m.record_count=p.recordCount,m.table_size=l.getSize(),m.db_audit_size=l.getAuditSize(),m.estimated_record_range=p.estimatedRange;let h=l.auditStore;if(h)for(let E of h.getKeys({reverse:!0,limit:1}))m.last_updated_record=E[0];if(!m.last_updated_record&&l.indices.__updatedtime__)for(let E of l.indices.__updatedtime__.getKeys({reverse:!0,limit:1}))m.last_updated_record=E}catch(p){Jp.warn(`unable to stat table dbi due to ${p}`)}return m}o(KS,"descTable");async function Hle(e){GS.transformReq(e);let t=N$(e,Wo.object({database:Wo.string(),exact_count:Wo.boolean().strict(),include_computed:Wo.boolean().strict()}));if(t)throw new C$(t.message);let r;e.hdb_user&&!e.hdb_user?.role?.permission?.super_user&&(r=e.hdb_user?.role?.permission[e.schema]);let n=e.schema.toString(),i=lC()[n];if(!i)throw $S(new Error,VS.SCHEMA_NOT_FOUND(e.schema),cC.NOT_FOUND);let a={};for(let c in i){let l;if(r&&r.tables[c]&&(l=r.tables[c]),GS.isEmpty(l)||l.describe){let u=await KS({schema:e.schema,table:c,exact_count:e.exact_count,include_computed:e.include_computed},l?l.attribute_permissions:null);u&&(a[u.name]=u)}}return a}o(Hle,"describeSchema")});var U$=v((Bxe,v$)=>{"use strict";var qle=ic(),{hdbErrors:L$}=_e(),{getDatabases:D$}=(we(),M(mt));v$.exports={checkSchemaExists:M$,checkSchemaTableExists:Gle,schemaDescribe:qle};async function M$(e){if(!D$()[e])return L$.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}o(M$,"checkSchemaExists");async function Gle(e,t){let r=await M$(e);if(r)return r;if(!D$()[e][t])return L$.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}o(Gle,"checkSchemaTableExists")});var YS=v((kxe,x$)=>{"use strict";var $le=cs();x$.exports={writeTransaction:Vle};function Vle(e,t,r){return $le.writeTransaction(e,t,r)}o(Vle,"writeTransaction")});var pC=v((Vxe,z$)=>{"use strict";var{decode:Kle}=require("msgpackr"),{isMainThread:qxe,parentPort:Gxe,threadId:$xe}=require("worker_threads"),jS=qt(),Fd=pt(),fC=(q(),M(Y)),yn=Q(),dC=ce(),Yle=(q(),M(Y)),{onMessageByType:Wle}=Ze(),H$=Zi(),{recordAction:B$,recordActionBinary:zle}=(ts(),M(tg)),{publishToStream:jle}=jS,{ConsumerEvents:F$}=require("nats"),Qle=En(),{promisify:Jle}=require("util"),{decodeBlobsWithWrites:Xle}=(es(),M(F_)),q$=Jle(setTimeout),QS=1e4,JS,zS,Zle,eue,G$,Xp=new Map,kd=new Map;z$.exports={initialize:$$,ingestConsumer:mC,setSubscription:tue,setIgnoreOrigin:sue,getDatabaseSubscriptions:nue,updateConsumer:V$};async function $$(){Wle(fC.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,async n=>{await V$(n)}),G$=!0,yn.notify("Initializing clustering ingest service.");let{connection:e,jsm:t,js:r}=await jS.getNATSReferences();JS=e,zS=e.info.server_name,Zle=t,eue=r}o($$,"initialize");async function V$(e){if(e.status==="start"){let{js:t,jsm:r}=await K$(e.node_domain_name);mC(e.stream_name,t,r,e.node_domain_name)}else if(e.status==="stop"){let t=Xp.get(e.stream_name+e.node_domain_name);t&&(yn.notify("Closing ingest consumer for node:",e.node_domain_name,"stream:",e.stream_name),await t.close?.(),Xp.set(e.stream_name+e.node_domain_name,"close")),kd.get(e.node_domain_name)==="failed"&&kd.set(e.node_domain_name,"close")}}o(V$,"updateConsumer");var XS=new Map;function tue(e,t,r){let n=XS.get(e);n||XS.set(e,n=new Map),n.set(t,r),G$||$$().then(rue)}o(tue,"setSubscription");async function rue(){let e=await Qle.searchByValue({database:"system",table:"hdb_nodes",attribute:"name",value:"*"});for await(let t of e){let r=t.name+Fd.SERVER_SUFFIX.LEAF,n,s;for(let i of t.subscriptions||[])if(i.subscribe===!0){if(!n&&({js:n,jsm:s}=await K$(r),!n))break;let{schema:a,table:c}=i,l=H$.createNatsTableStreamName(a,c);mC(l,n,s,r)}}}o(rue,"accessConsumers");async function K$(e){let t,r,n=1;for(;!r;)try{t=await JS.jetstream({domain:e}),r=await JS.jetstreamManager({domain:e,checkAPI:!1})}catch(s){if(kd.get(e)==="close")break;kd.set(e,"failed"),n%10===1&&yn.warn("Nats ingest attempting to connect to:",e,"Nats error:",s.message);let i=n++*100<QS?n++*100:QS;await q$(i)}return{js:t,jsm:r}}o(K$,"connectToRemoteJS");function nue(){return XS}o(nue,"getDatabaseSubscriptions");var Y$;function sue(e){Y$=e}o(sue,"setIgnoreOrigin");var W$=100,k$=new Array(W$),WS=0;async function mC(e,t,r,n){let{connection:s}=await jS.getNATSReferences();JS=s,zS=s.info.server_name;let i,a=1;for(;!i;)try{i=await t.consumers.get(e,zS),yn.notify("Initializing ingest consumer for node:",n,"stream:",e)}catch(u){if(kd.get(n)==="close")break;a%10===1&&yn.warn("Nats ingest error getting consumer:",n,"stream:",e,"Nats error:",u.message),u.code==="404"&&(yn.notify("Nats ingest creating consumer for node:",n,"stream:",e),i=await jS.createConsumer(r,e,zS,new Date(Date.now()).toISOString()));let d=a++*100<QS?a++*100:QS;await q$(d)}let c=!1,l;for(;!c;){if(Xp.get(e+n)==="close"||kd.get(n)==="close"){Xp.delete(e+n),c=!0;continue}l=await i.consume({max_messages:dC.get(fC.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXCONSUMEMSGS)??100,bind:!0}),Xp.set(e+n,l);let u=!1;(async()=>{for await(let d of await l.status())if(d.type===F$.ConsumerDeleted&&(await l.close(),c=!0),d.type===F$.HeartbeatsMissed){let f=d.data;yn.trace(`${f} clustering ingest consumer heartbeats missed, node: ${n} stream: ${l.consumer.stream}`),f===100&&(yn.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 k$[WS],k$[WS]=iue(d).catch(f=>{yn.error(f)}),++WS>=W$&&(WS=0)}catch(d){d.message==="consumer deleted"?(yn.notify("Nats consumer deleted, closing messages for node:",n,"stream:",l.consumer.stream),await l.close(),c=!0):yn.error("Error consuming clustering ingest, restarting consumer",d)}}}o(mC,"ingestConsumer");async function iue(e){let t;await Xle(()=>{t=Kle(e.data)}),B$(e.data.length,"bytes-received",e.subject,t.operation,"ingest"),yn.trace("Nats message processor message size:",e?.msg?._msg?.size,"bytes");let r=e.headers,n=!1,s=dC.get(fC.CONFIG_PARAMS.CLUSTERING_NODENAME);r.has(Fd.MSG_HEADERS.TRANSACTED_NODES)&&r.values(Fd.MSG_HEADERS.TRANSACTED_NODES).indexOf(s)>-1&&(n=!0);let i=r.get(Fd.MSG_HEADERS.ORIGIN);if(n||(n=i===s&&!Y$),zle(n,"echo",e.subject,t.operation,"ingest"),n){e.ack();return}r.append(Fd.MSG_HEADERS.TRANSACTED_NODES,s);try{let{operation:a,schema:c,next:l,table:u,records:d,hash_values:f,__origin:m,expiresAt:p}=t;yn.trace("processing message:",a,c,u,(d?"records: "+d.map(I=>I?.id):"")+(f?"ids: "+f:""),"with sequence:",e.seq),yn.trace(`messageProcessor nats msg id: ${e.headers.get(Fd.MSG_HEADERS.NATS_MSG_ID)}`);let h;d||(d=f);let E=new Promise(I=>h=I),{timestamp:g,user:R,node_name:S}=m||{},y=XS.get(c)?.get(u);if(!y)throw new Error(`Missing table for replication message: ${u}`);if(a==="define_schema")t.type=a,t.onCommit=h,y.send(t);else if(d.length===1&&!l)y.send({type:uC(a),value:d[0],id:f?.[0],expiresAt:p,timestamp:g,table:u,onCommit:h,user:R,nodeName:S});else{let I=d.map((k,J)=>({type:uC(a),value:k,expiresAt:p,id:f?.[J],table:u}));for(;l;)I.push({type:uC(l.operation),value:l.record,expiresAt:l.expiresAt,id:l.id,table:l.table}),l=l.next;y.send({type:"transaction",writes:I,table:u,timestamp:g,onCommit:h,user:R,nodeName:S})}dC.get(Yle.CONFIG_PARAMS.CLUSTERING_REPUBLISHMESSAGES)!==!1&&jle(e.subject.split(".").slice(0,-1).join("."),H$.createNatsTableStreamName(c,u),e.headers,e.data),await E;let C=Date.now()-g;g&&B$(C,"replication-latency",e.subject,a,"ingest")}catch(a){yn.error(a)}e.ack()}o(iue,"messageProcessor");function uC(e){switch(e){case"insert":case"upsert":case"update":return"put"}return e}o(uC,"convertOperation")});var qt=v((Jxe,dV)=>{"use strict";var Vr=ce();Vr.initSync();var oue=require("fs-extra"),aue=require("semver"),th=require("path"),{monotonicFactory:cue}=require("ulidx"),Q$=cue(),lue=require("util"),J$=require("child_process"),uue=lue.promisify(J$.exec),due=J$.spawn,nn=pt(),rt=(q(),M(Y)),{packageJson:fue,PACKAGE_ROOT:mue}=Ot(),ZS=oe(),Si=Q(),eT=Zi(),pue=YS(),Zp=Tt(),{broadcast:hue,onMessageByType:Eue,getWorkerIndex:_ue}=Ze(),{isMainThread:X$}=require("worker_threads"),{Encoder:gue,decode:gC}=require("msgpackr"),Z$=new gue,{isEmpty:Bl}=ZS,eV=fs(),Yxe=48*36e11;X$&&Eue(rt.ITC_EVENT_TYPES.RESTART,()=>{Rn=void 0,xl=void 0});var{connect:Sue,StorageType:Tue,RetentionPolicy:yue,AckPolicy:SC,DeliverPolicy:TC,DiscardPolicy:Rue,NatsConnection:Wxe,JetStreamManager:zxe,JetStreamClient:jxe,StringCodec:Qxe,JSONCodec:bue,createInbox:yC,headers:Aue,ErrorCode:j$}=require("nats"),{recordAction:Iue}=(ts(),M(tg)),{encodeBlobsAsBuffers:wue}=(es(),M(F_)),tV=bue(),Nue="clustering",Cue=fue.engines[nn.NATS_SERVER_NAME],Oue=th.join(mue,"dependencies"),_C=th.join(Oue,`${process.platform}-${process.arch}`,nn.NATS_BINARY_NAME),hC,EC,eh,vl,Ul;dV.exports={runCommand:rV,checkNATSServerInstalled:Pue,createConnection:RC,getConnection:rh,getJetStreamManager:nh,getJetStream:sV,getNATSReferences:ao,getServerList:Due,createLocalStream:bC,listStreams:iV,deleteLocalStream:Mue,getServerConfig:Hd,listRemoteStreams:vue,viewStream:Uue,viewStreamIterator:xue,publishToStream:Bue,request:Hue,reloadNATS:AC,reloadNATSHub:que,reloadNATSLeaf:Gue,extractServerName:kue,requestErrorHandler:$ue,createLocalTableStream:lV,createTableStreams:Yue,purgeTableStream:uV,purgeSchemaTableStreams:Wue,getStreamInfo:zue,updateLocalStreams:Que,closeConnection:Lue,getJsmServerName:tT,addNatsMsgHeader:oV,clearClientCache:nV,updateRemoteConsumer:Vue,createConsumer:aV,updateConsumerIterator:Kue};async function rV(e,t=void 0){let{stdout:r,stderr:n}=await uue(e,{cwd:t});if(n)throw new Error(n.replace(`
17
17
  `,""));return r.replace(`
18
18
  `,"")}o(rV,"runCommand");async function Pue(){try{await oue.access(_C)}catch{return!1}let e=await rV(`${_C} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return aue.eq(t,Cue)}o(Pue,"checkNATSServerInstalled");async function RC(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let a=await eV.getClusterUser();if(Bl(a))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=a.username,r=a.decrypt_hash}Si.trace("create nats connection called");let i=await Sue({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:Vr.get(rt.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:Vr.get(rt.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:Vr.get(rt.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),Si.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(a=>{a&&Si.error("Error with Nats client connection, connection closed",a),i===Rn&&nV()}),i}o(RC,"createConnection");function nV(){Rn=void 0,vl=void 0,Ul=void 0,xl=void 0}o(nV,"clearClientCache");async function Lue(){Rn&&(await Rn.drain(),Rn=void 0,vl=void 0,Ul=void 0,xl=void 0)}o(Lue,"closeConnection");var Rn,xl;async function rh(){return xl||(xl=RC(Vr.get(rt.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),Rn=await xl),Rn||xl}o(rh,"getConnection");async function nh(){if(vl)return vl;Bl(Rn)&&await rh();let{domain:e}=Hd(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Bl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return vl=await Rn.jetstreamManager({domain:e,timeout:6e4}),vl}o(nh,"getJetStreamManager");async function sV(){if(Ul)return Ul;Bl(Rn)&&await rh();let{domain:e}=Hd(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Bl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Ul=Rn.jetstream({domain:e,timeout:6e4}),Ul}o(sV,"getJetStream");async function ao(){let e=Rn||await rh(),t=vl||await nh(),r=Ul||await sV();return{connection:e,jsm:t,js:r}}o(ao,"getNATSReferences");async function Due(e){let t=Vr.get(rt.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await eV.getClusterUser(),s=await RC(t,r,n),i=yC(),a=s.subscribe(i),c=[],l,u=(async()=>{for await(let d of a){let f=tV.decode(d.data);f.response_time=Date.now()-l,c.push(f)}})();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 ZS.asyncSetTimeout(e),await a.drain(),await s.close(),await u,c}o(Due,"getServerList");async function bC(e,t){let{jsm:r}=await ao(),n=Vr.get(rt.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Vr.get(rt.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=Vr.get(rt.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:Tue.File,retention:yue.Limits,subjects:t,discard:Rue.Old,maxMsgs:s,maxBytes:i,maxAge:n})}o(bC,"createLocalStream");async function iV(){let{jsm:e}=await ao(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}o(iV,"listStreams");async function Mue(e){let{jsm:t}=await ao();await t.streams.delete(e)}o(Mue,"deleteLocalStream");async function vue(e){let{connection:t}=await ao(),r=[],n=yC(),s=t.subscribe(n),i=(async()=>{for await(let a of s)r.push(tV.decode(a.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}o(vue,"listRemoteStreams");async function Uue(e,t=void 0,r=void 0){let{jsm:n,js:s}=await ao(),i=Q$(),a={durable_name:i,ack_policy:SC.Explicit};t&&(a.deliver_policy=TC.StartTime,a.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,a);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 f=gC(d.data),m={nats_timestamp:d.info.timestampNanos,nats_sequence:d.info.streamSequence,entry:f};if(d.headers&&(m.origin=d.headers.get(nn.MSG_HEADERS.ORIGIN)),u.push(m),d.ack(),d.info.pending===0)break}return await c.delete(),u}o(Uue,"viewStream");async function*xue(e,t=void 0,r=void 0){let{jsm:n,js:s}=await ao(),i=Q$(),a={durable_name:i,ack_policy:SC.Explicit};t&&(a.deliver_policy=TC.StartTime,a.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,a);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=gC(u.data);d[0]||(d=[d]);for(let f of d){let m={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:f};u.headers&&(m.origin=u.headers.get(nn.MSG_HEADERS.ORIGIN)),yield m}if(u.ack(),u.info.pending===0)break}await c.delete()}o(xue,"viewStreamIterator");async function Bue(e,t,r,n){Si.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=oV(n,r);let{js:s}=await ao(),i=await tT(),a=`${e}.${i}`,c=await wue(()=>n instanceof Uint8Array?n:Z$.encode(n));try{Si.trace(`publishToStream publishing to subject: ${a}`),Iue(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(a,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return cV(async()=>{try{await s.publish(a,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){Si.trace(`publishToStream creating stream: ${t}`);let d=a.split(".");d[2]="*",await bC(t,[a]),await s.publish(a,c,{headers:r})}else throw l}});throw l}}o(Bue,"publishToStream");function oV(e,t){t===void 0&&(t=Aue());let r=Vr.get(rt.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(nn.MSG_HEADERS.ORIGIN)&&r&&t.append(nn.MSG_HEADERS.ORIGIN,r),t}o(oV,"addNatsMsgHeader");function Hd(e){e=e.toLowerCase();let t=th.join(Vr.get(rt.CONFIG_PARAMS.ROOTPATH),Nue);if(e===rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return Bl(EC)&&(EC={port:Zp.getConfigFromFile(rt.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:Zp.getConfigFromFile(rt.CONFIG_PARAMS.CLUSTERING_NODENAME)+nn.SERVER_SUFFIX.HUB,config_file:nn.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:th.join(t,nn.PID_FILES.HUB),hdbNatsPath:t}),EC;if(e===rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return Bl(hC)&&(hC={port:Zp.getConfigFromFile(rt.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:Zp.getConfigFromFile(rt.CONFIG_PARAMS.CLUSTERING_NODENAME)+nn.SERVER_SUFFIX.LEAF,config_file:nn.NATS_CONFIG_FILES.LEAF_SERVER,domain:Zp.getConfigFromFile(rt.CONFIG_PARAMS.CLUSTERING_NODENAME)+nn.SERVER_SUFFIX.LEAF,pid_file_path:th.join(t,nn.PID_FILES.LEAF),hdbNatsPath:t}),hC;Si.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}o(Hd,"getServerConfig");async function aV(e,t,r,n){try{await e.consumers.add(t,{ack_policy:SC.Explicit,durable_name:r,deliver_policy:TC.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}o(aV,"createConsumer");async function Fue(e,t,r){await e.consumers.delete(t,r)}o(Fue,"removeConsumer");function kue(e){return e.split(".")[1]}o(kue,"extractServerName");async function Hue(e,t,r=6e4,n=yC()){if(!ZS.isObject(t))throw new Error("data param must be an object");let s=Z$.encode(t),{connection:i}=await ao(),a={timeout:r};n&&(a.reply=n,a.noMux=!0);let c=await i.request(e,s,a);return gC(c.data)}o(Hue,"request");function AC(e){return new Promise(async(t,r)=>{let n=due(_C,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",a=>{r(a)}),n.stdout.on("data",a=>{i+=a.toString()}),n.stderr.on("data",a=>{s+=a.toString()}),n.stderr.on("close",a=>{s&&r(s),t(i)})})}o(AC,"reloadNATS");async function que(){let{pid_file_path:e}=Hd(rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await AC(e)}o(que,"reloadNATSHub");async function Gue(){let{pid_file_path:e}=Hd(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await AC(e)}o(Gue,"reloadNATSLeaf");function $ue(e,t,r){let n;switch(e.code){case j$.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case j$.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}o($ue,"requestErrorHandler");async function Vue(e,t){let r=t+nn.SERVER_SUFFIX.LEAF,{connection:n}=await ao(),{jsm:s}=await Xue(r),{schema:i,table:a}=e,c=eT.createNatsTableStreamName(i,a),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await cV(async()=>{if(e.subscribe===!0)await aV(s,c,n.info.server_name,l);else try{await Fue(s,c,n.info.server_name)}catch(u){Si.trace(u)}})}o(Vue,"updateRemoteConsumer");async function Kue(e,t,r,n){let s=eT.createNatsTableStreamName(e,t),i=r+nn.SERVER_SUFFIX.LEAF,a={type:rt.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!X$&&_ue()<Vr.get(rt.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=pC();await c(a)}await hue(a),n==="stop"&&await ZS.asyncSetTimeout(1e3)}o(Kue,"updateConsumerIterator");function cV(e){return pue.writeTransaction(rt.SYSTEM_SCHEMA_NAME,rt.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}o(cV,"exclusiveLock");async function lV(e,t){let r=eT.createNatsTableStreamName(e,t),n=await tT(),s=jue(e,t,n);await bC(r,[s])}o(lV,"createLocalTableStream");async function Yue(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await lV(n,s)}}o(Yue,"createTableStreams");async function uV(e,t,r=void 0){if(Vr.get(rt.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=eT.createNatsTableStreamName(e,t),{domain:s}=Hd(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await rh()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")Si.warn(n);else throw n}}o(uV,"purgeTableStream");async function Wue(e,t){if(Vr.get(rt.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await uV(e,t[r])}o(Wue,"purgeSchemaTableStreams");async function zue(e){return(await nh()).streams.info(e)}o(zue,"getStreamInfo");function jue(e,t,r){return`${nn.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}o(jue,"createSubjectName");async function tT(){if(eh)return eh;if(eh=(await nh())?.nc?.info?.server_name,eh===void 0)throw new Error("Unable to get jetstream manager server name");return eh}o(tT,"getJsmServerName");async function Que(){let e=await nh(),t=await tT(),r=await iV();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let a=Jue(n),c=i.split(".");if(c[c.length-1]===t&&!a||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let d=u.join(".");Si.trace(`Updating stream subject name from: ${i} to: ${d}`),s.subjects[0]=d,await e.streams.update(s.name,s)}}o(Que,"updateLocalStreams");function Jue(e){let{config:t}=e,r=!1,n=Vr.get(rt.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Vr.get(rt.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=Vr.get(rt.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}o(Jue,"updateStreamLimits");async function Xue(e){let t,r;try{t=await Rn.jetstream({domain:e}),r=await Rn.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw Si.error("Unable to connect to:",e),n}return{js:t,jsm:r}}o(Xue,"connectToRemoteJS")});function IC(e){let t=e.get(rT),r=t?(0,qd.unpack)(t):null;r||(r={remoteNameToId:{}});let n=it(),s=!1;r.nodeName=it();let i=r.remoteNameToId;if(i[n]!==0){let a=0,c;for(let l in i){let u=i[l];u===0?c=l:u>a&&(a=u)}if(c){a++,i[c]=a;let l=[Symbol.for("seq"),a];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:ih(e)??1,nodes:[]})})}i[n]=0,e.putSync(rT,(0,qd.pack)(r))}return r}function sh(e){return IC(e).remoteNameToId}function mV(e,t){let r=IC(t),n=r.remoteNameToId,s=new Map,i=!1;for(let a in e){let c=e[a],l=n[a];if(l==null){let u=0;for(let d in n){let f=n[d];f>u&&(u=f)}l=u+1,n[a]=l,i=!0}s.set(c,l)}return i&&t.putSync(rT,(0,qd.pack)(r)),s}function nT(e,t){let r=IC(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let a in n){let c=n[a];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(rT,(0,qd.pack)(r))}return fV.trace?.("The remote node name map",e,n,s),s}var fV,qd,rT,wC=se(()=>{fV=b(Zn());hs();qd=require("msgpackr"),rT=Symbol.for("remote-ids");o(IC,"getIdMappingRecord");o(sh,"exportIdMapping");o(mV,"remoteToLocalNodeId");o(nT,"getIdOfRemoteNode")});var SV={};Re(SV,{commitsAwaitingReplication:()=>$d,getHDBNodeTable:()=>Qt,getReplicationSharedStatus:()=>Vd,iterateRoutes:()=>ah,shouldReplicateToNode:()=>oh,subscribeToNodeUpdates:()=>Kd});function Qt(){return pV||(pV=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:"revoked_certificates"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]}))}function Vd(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(64),n&&{callback:n}))}function Kd(e){Qt().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;gV.debug?.("adding node",n,"on node",it()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==it()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of Qt().search({}))if(i.shard!=null){let a=s.get(i.shard);a||s.set(i.shard,a=[]),a.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function oh(e,t){return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&Qt().primaryStore.get(it())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function Zue(){Kd(e=>{oc({},(t,r)=>{let n=e.name,s=hV.get(n);if(s||hV.set(n,s=new Map),s.has(r))return;let i;for(let a in t)if(i=t[a].auditStore,i)break;if(i){let a=Vd(i,r,n,()=>{let c=a[0],l=a.lastTime;for(let{txnTime:u,onConfirm:d}of $d.get(r)||[])u>l&&u<=c&&d();a.lastTime=c});a.lastTime=0,s.set(r,a)}})})}function*ah(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=Gd.default.get(F.REPLICATION_SECUREPORT)??(!Gd.default.get(F.REPLICATION_PORT)&&Gd.default.get(F.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||Gd.default.get(F.REPLICATION_PORT)||Gd.default.get(F.OPERATIONSAPI_NETWORK_PORT);let a=i?.lastIndexOf?.(":");a>0&&(i=+i.slice(a+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){EV.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,startTime:t.startTime,revoked_certificates:t.revokedCertificates}}}var EV,_V,Gd,gV,pV,hV,$d,Yd=se(()=>{we();hs();Rm();EV=require("worker_threads"),_V=b(_e()),Gd=b(ce());q();gV=b(Zn());server.nodes=[];o(Qt,"getHDBNodeTable");o(Vd,"getReplicationSharedStatus");o(Kd,"subscribeToNodeUpdates");o(oh,"shouldReplicateToNode");hV=new Map;AU((e,t,r)=>{if(r>server.nodes.length)throw new _V.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);$d||($d=new Map,Zue());let n=$d.get(e);return n||(n=[],$d.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:o(()=>{++i===r&&s()},"onConfirm")})})});o(Zue,"startSubscriptionToReplications");o(ah,"iterateRoutes")});var AV={};Re(AV,{connectedToNode:()=>Fl,disconnectedFromNode:()=>zd,ensureNode:()=>zo,requestClusterStatus:()=>bV,startOnMainThread:()=>NC});async function NC(e){let t=0,r=ct();for(let i of Object.getOwnPropertyNames(r)){let a=r[i];for(let c in a){let l=a[c];if(l.auditStore){sT.set(i,ih(l.auditStore));break}}}lo.whenThreadsStarted.then(async()=>{let i=[];for await(let l of r.system.hdb_nodes?.search([])||[])i.push(l);let a=it();function c(){let l=Qt().primaryStore.get(a);if(l!==null){let u=e.url??ac();if(l===void 0||l.url!==u||l.shard!==e.shard)return zo(a,{name:a,url:u,shard:e.shard,replicates:!0})}}o(c,"ensureThisNode"),Qt().primaryStore.get(a)&&c();for(let l of ah(e))try{let u=!l.subscriptions;if(u&&await c(),u&&l.replicates==null&&(l.replicates=!0),i.find(d=>d.url===l.url))continue;s(l)}catch(u){console.error(u)}Kd(s)});let n;function s(i,a=i?.name){let c=it()&&a===it()||ac()&&i?.url===ac();if(c){let f=!!i?.replicates;if(n!==void 0&&n!==f)for(let m of Qt().search([]))m.replicates&&m.name!==a&&s(m,m.name);n=f}if(dt.trace("Setting up node replication for",i),!i){for(let[f,m]of co){let p;for(let[h,{worker:E,nodes:g}]of m){let R=g[0];if(R&&R.name==a){p=!0;for(let[S,{worker:y}]of m)m.delete(S),dt.warn("Node was deleted, unsubscribing from node",a,S,f),y?.postMessage({type:"unsubscribe-from-node",node:a,database:S,url:f});break}}if(p){co.get(f).iterator.remove(),co.delete(f);return}}return}if(c)return;if(!i.url){dt.info(`Node ${i.name} is missing url`);return}let l=co.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(dt.info(`Added node ${i.name} at ${i.url} for process ${it()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[f,m]of Wd)if(i.url===m.url){Wd.delete(f);break}Wd.set(i.name,i)}let u=ct();if(l||(l=new Map,co.set(i.url,l)),l.iterator=oc(e,(f,m,p)=>{p?d(m,!0):d(m,!1)}),i.subscriptions)for(let f of i.subscriptions){let m=f.database||f.schema;u[m]||(dt.warn(`Database ${m} not found for node ${i.name}, making a subscription anyway`),d(m,!1))}function d(f,m){dt.trace("Setting up replication for database",f,"on node",i.name);let p=l.get(f),h,E=[{replicateByDefault:m,...i}];sT.has(f)&&ch.default.get(F.REPLICATION_FAILOVER)&&(E.push({replicateByDefault:m,name:it(),startTime:sT.get(f),endTime:Date.now(),replicates:!0}),sT.delete(f));let g=oh(i,f),R=lo.workers.filter(S=>S.name==="http");if(p?(h=p.worker,p.nodes=E):g&&(t=t%R.length,h=R[t++],l.set(f,{worker:h,nodes:E,url:i.url}),h?.on("exit",()=>{l.get(f)?.worker===h&&(l.delete(f),d(f,m))})),g)setTimeout(()=>{let S={type:"subscribe-to-node",database:f,nodes:E};h?h.postMessage(S):lh(S)},ede);else{dt.info("Node no longer should be used, unsubscribing from node",{replicates:i.replicates,databaseName:f,node:i,subscriptions:i.subscriptions,hasDatabase:!!u[f],thisReplicates:Qt().primaryStore.get(it())?.replicates}),Qt().primaryStore.get(it())?.replicates||(n=!1,dt.info("Disabling replication, this node name",it(),Qt().primaryStore.get(it()),f));let S={type:"unsubscribe-from-node",database:f,url:i.url,name:i.name};h?h.postMessage(S):oT(S)}}o(d,"onDatabase")}o(s,"onNodeUpdate"),zd=o(function(i){try{dt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let a=Array.from(Wd.keys()),c=a.sort(),l=c.indexOf(i.name||Ti(i.url));if(l===-1){dt.warn("Disconnected node not found in node map",i.name,a);return}let u=co.get(i.url),d=u?.get(i.database);if(!d){dt.warn("Disconnected node not found in replication map",i.database,u);return}if(d.connected=!1,i.finished||!ch.default.get(F.REPLICATION_FAILOVER))return;let f=d.nodes[0];if(!(f.replicates===!0||f.replicates?.sends||f.subscriptions?.length))return;let m=f.shard,p=(l+1)%c.length;for(;l!==p;){let h=c[p],E=Wd.get(h);u=co.get(E.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==m){p=(p+1)%c.length;continue}let{worker:R,nodes:S}=g,y=!1;for(let C of d.nodes){if(S.some(I=>I.name===C.name)){dt.info(`Disconnected node is already failing over to ${h} for ${i.database}`);continue}C.endTime<Date.now()||(S.push(C),y=!0)}if(d.nodes=[d.nodes[0]],!y){dt.info(`Disconnected node ${i.name} has no nodes to fail over to ${h}`);return}dt.info(`Failing over ${i.database} from ${i.name} to ${h}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:S}):lh({database:i.database,nodes:S});return}dt.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(a){dt.error("Error failing over node",a)}},"disconnectedFromNode"),Fl=o(function(i){let a=co.get(i.url),c=a?.get(i.database);if(!c){dt.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,a);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){dt.warn("Newly connected node has no node subscriptions",i.database,c);return}if(!l.name){dt.debug("Connected node is not named yet",i.database,c);return}if(!ch.default.get(F.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let d of co.values()){let f=d.get(i.database);if(!f||f==c)continue;let{worker:m,nodes:p,connected:h}=f;if(p)if(h===!1&&p[0].shard===l.shard)u=!0,c.nodes.push(p[0]);else{let E=p.filter(g=>g&&g.name!==l.name);E.length<p.length&&(f.nodes=E,m.postMessage({type:"subscribe-to-node",database:i.database,nodes:p}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,lo.onMessageByType)("disconnected-from-node",zd),(0,lo.onMessageByType)("connected-to-node",Fl),(0,lo.onMessageByType)("request-cluster-status",bV)}function bV(e,t){let r=[];for(let[n,s]of Wd)try{let i=co.get(s.url);dt.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let a=[];if(i){for(let[l,{worker:u,connected:d,nodes:f,latency:m}]of i)a.push({database:l,connected:d,latency:m,threadId:u?.threadId,nodes:f.filter(p=>!(p.endTime<Date.now())).map(p=>p.name)});let c=yV(s);c.database_sockets=a,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){dt.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function zo(e,t){let r=Qt();e=e??Ti(t.url),t.name=e;try{if(t.ca){let s=new RV.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subjectAltName:s.subjectAltName,serialNumber:s.serialNumber,validFrom:s.validFrom,validTo:s.validTo}}}catch(s){dt.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(dt.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!ch.default.get(F.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],a=yV(n[s]);for(let c of t[s]){let l=!1;for(let u of a)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=[...a,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}dt.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var lo,iT,dt,TV,ch,RV,yV,ede,co,zd,Fl,Wd,sT,uh=se(()=>{we();lo=b(Ze());hs();iT=require("worker_threads");Yd();dt=b(Q()),TV=b(require("lodash")),ch=b(ce());q();RV=require("crypto"),{cloneDeep:yV}=TV.default,ede=200,co=new Map,Wd=new Map,sT=new Map;o(NC,"startOnMainThread");o(bV,"requestClusterStatus");iT.parentPort&&(zd=o(e=>{iT.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Fl=o(e=>{iT.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,lo.onMessageByType)("subscribe-to-node",e=>{lh(e)}),(0,lo.onMessageByType)("unsubscribe-from-node",e=>{oT(e)}));o(zo,"ensureNode")});var _s=v(Gt=>{"use strict";var Er=require("path"),{watch:tde}=require("chokidar"),Vn=require("fs-extra"),jd=require("node-forge"),PV=require("net"),{generateKeyPair:CC,X509Certificate:jo,createPrivateKey:LV,randomBytes:rde}=require("node:crypto"),nde=require("util");CC=nde.promisify(CC);var Lt=jd.pki,yi=require("joi"),{v4:DV}=require("uuid"),{validateBySchema:DC}=at(),{forComponent:sde}=Q(),Es=ce(),Gs=(q(),M(Y)),{CONFIG_PARAMS:Hl}=Gs,Ri=Bw(),{ClientError:cc}=_e(),cT=require("node:tls"),{relative:MV,join:ide}=require("node:path"),{CERTIFICATE_VALUES:IV}=Ri,ode=Wc(),OC=Tt(),{table:ade,getDatabases:cde,databases:aT}=(we(),M(mt)),{getJWTRSAKeys:wV}=(Ud(),M(jp)),Qe=sde("tls").conditional;Gt.generateKeys=UC;Gt.updateConfigCert=qV;Gt.createCsr=hde;Gt.signCertificate=Ede;Gt.setCertTable=Qd;Gt.loadCertificates=FV;Gt.reviewSelfSignedCert=BC;Gt.createTLSSelector=$V;Gt.listCertificates=KV;Gt.addCertificate=Rde;Gt.removeCertificate=Ade;Gt.createNatsCerts=Sde;Gt.generateCertsKeys=gde;Gt.getReplicationCert=fh;Gt.getReplicationCertAuth=pde;Gt.renewSelfSigned=Tde;Gt.hostnamesFromCert=kC;Gt.getKey=Ide;Gt.getHostnamesFromCertificate=wde;Gt.getPrimaryHostName=FC;Gt.generateSerialNumber=dT;var{urlToNodeName:vV,getThisNodeUrl:lde,getThisNodeName:uT,clearThisNodeName:ude}=(hs(),M(Qo)),{readFileSync:dde,statSync:UV}=require("node:fs"),p0e=ce(),{getTicketKeys:fde,onMessageFromWorkers:mde}=Ze(),{isMainThread:xV}=require("worker_threads"),{TLSSocket:BV,createSecureContext:h0e}=require("node:tls"),MC=3650,dh=["127.0.0.1","localhost","::1"],vC=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];function dT(){let e=rde(8);return e[0]=e[0]&127|1,e.toString("hex")}o(dT,"generateSerialNumber");mde(async e=>{e.type===Gs.ITC_EVENT_TYPES.RESTART&&(Es.initSync(!0),await BC())});var sn;function uc(){return sn||(sn=cde().system.hdb_certificate,sn||(sn=ade({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__"}]}))),sn}o(uc,"getCertTable");async function fh(){let e=$V("operations-api"),t={secureContexts:null,setSecureContext:o(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(uT());if(!r)return;let n=new jo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}o(fh,"getReplicationCert");async function pde(){uc();let e=(await fh()).options.cert,r=new jo(e).issuer.match(/CN=(.*)/)?.[1];return sn.get(r)}o(pde,"getReplicationCertAuth");var NV,lc=new Map;function FV(){if(NV)return;NV=!0;let e=[{configKey:Hl.TLS},{configKey:Hl.OPERATIONSAPI_TLS}];uc();let t=Er.dirname(OC.getConfigFilePath()),r;for(let{configKey:n}of e){let s=OC.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let a=i.privateKey,c=a&&MV(ide(t,"keys"),a);c&&CV(a,l=>{lc.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&xV){let d;CV(u,f=>{if(IV.cert===f)return;let m=i.hostname??i.hostnames??i.host??i.hosts;m&&!Array.isArray(m)&&(m=[m]);let p=GV(u),h=new jo(p),E;try{E=FC(h)}catch(y){Qe.error?.("error extracting host name from certificate",y);return}if(E==null){Qe.error?.("No host name found on certificate");return}if(h.checkIssued(new jo(IV.cert)))return;let g=sn.primaryStore.get(E),R=UV(u).mtimeMs,S=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&R<=S){R<S&&Qe.info?.(`Certificate ${E} at ${u} is older (${new Date(R)}) than the certificate in the database (${S>1?new Date(S):"only self signed certificate available"})`);return}r=sn.put({name:E,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:p,private_key_name:c,is_authority:l,hostnames:m,fileTimestamp:R,details:{issuer:h.issuer.replace(/\n/g," "),subject:h.subject?.replace(/\n/g," "),subject_alt_name:h.subjectAltName,serial_number:h.serialNumber,valid_from:h.validFrom,valid_to:h.validTo}})},l?"certificate authority":"certificate")}}}}}return r}o(FV,"loadCertificates");function CV(e,t,r){let n,s=o((i,a)=>{try{let c=a.mtimeMs;c&&c!==n&&(n&&xV&&Qe.warn?.(`Reloading ${r}:`,i),n=c,t(GV(i)))}catch(c){Qe.error?.(`Error loading ${r}:`,i,c)}},"loadFile");Vn.existsSync(e)?s(e,UV(e)):Qe.error?.(`${r} file not found:`,e),tde(e,{persistent:!1}).on("change",s)}o(CV,"loadAndWatch");function PC(){let e=lde();if(e==null){let t=dh[0];return Qe.info?.("replication url is missing from harperdb-config.yaml, using default host"+t),t}return vV(e)}o(PC,"getHost");function lT(){let e=uT();if(e==null){let t=dh[0];return Qe.info?.("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}o(lT,"getCommonName");async function hde(){let e=await fh(),t=Lt.certificateFromPem(e.options.cert),r=Lt.privateKeyFromPem(e.options.key);Qe.info?.("Creating CSR with cert named:",e.name);let n=Lt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:lT()},...vC];Qe.info?.("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:kV()}];return Qe.info?.("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),jd.pki.certificationRequestToPem(n)}o(hde,"createCsr");function kV(){let e=dh.includes(lT())?dh:[...dh,lT()];return e.includes(PC())||e.push(PC()),[{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=>PV.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}o(kV,"certExtensions");async function Ede(e){let t={},r=Er.join(Es.getHdbBasePath(),Gs.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;uc();for await(let d of sn.search([]))if(d.is_authority&&!d.details.issuer.includes("HarperDB-Certificate-Authority")){if(lc.has(d.private_key_name)){n=lc.get(d.private_key_name),s=d;break}else if(d.private_key_name&&await Vn.exists(Er.join(r,d.private_key_name))){n=Vn.readFile(Er.join(r,d.private_key_name)),s=d;break}}if(!n){let d=await LC();s=d.ca,n=d.private_key}n=Lt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=Lt.certificateFromPem(s.certificate);Qe.info?.("Signing CSR with cert named",s.name);let a=Lt.certificationRequestFromPem(e.csr);try{a.verify()}catch(d){return Qe.error?.(d),new Error("Error verifying CSR: "+d.message)}let c=jd.pki.createCertificate();c.serialNumber=dT(),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+MC),Qe.info?.("sign cert setting validity:",c.validity),Qe.info?.("sign cert setting subject from CSR:",a.subject.attributes),c.setSubject(a.subject.attributes),Qe.info?.("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=a.getAttribute({name:"extensionRequest"}).extensions;Qe.info?.("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=a.publicKey,c.sign(n,jd.md.sha256.create()),t.certificate=Lt.certificateToPem(c)}else Qe.info?.("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}o(Ede,"signCertificate");async function _de(e,t){await Qd({name:uT(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Qd({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:Lt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}o(_de,"createCertificateTable");async function Qd(e){let t;try{t=new jo(e.certificate)}catch(r){Qe.error?.(`Failed to parse certificate for ${e.name}:`,r.message),Qe.debug?.("Certificate record details:",JSON.stringify(e,null,2));let n=new Error(`Invalid certificate format for ${e.name}: ${r.message}. This may be due to corrupted certificate data during transfer or encoding issues.`);throw n.code="INVALID_CERTIFICATE_FORMAT",n.cause=r,n}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},uc(),await sn.patch(e)}o(Qd,"setCertTable");async function UC(){let e=await CC("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{publicKey:Lt.publicKeyFromPem(e.publicKey),privateKey:Lt.privateKeyFromPem(e.privateKey)}}o(UC,"generateKeys");async function xC(e,t,r){let n=Lt.createCertificate();if(!t){let a=await fh();t=Lt.certificateFromPem(a.options.cert).publicKey}n.publicKey=t,n.serialNumber=dT(),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+MC);let i=[{name:"commonName",value:lT()},...vC];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(kV()),n.sign(e,jd.md.sha256.create()),Lt.certificateToPem(n)}o(xC,"generateCertificates");async function LC(){let e=await KV(),t;for(let r of e){if(!r.is_authority)continue;let n=await VV(r.private_key_name);if(r.private_key_name&&n&&new jo(r.certificate).checkPrivateKey(LV(n))){Qe.trace?.(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;Qe.trace?.("No CA found with matching private key")}o(LC,"getCertAuthority");async function HV(e,t,r=!0){let n=Lt.createCertificate();n.publicKey=t,n.serialNumber=dT(),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+MC);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${Es.get(Hl.REPLICATION_HOSTNAME)??vV(Es.get(Hl.REPLICATION_URL))??DV().split("-")[0]}`},...vC];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0},{name:"subjectKeyIdentifier"}]),n.sign(e,jd.md.sha256.create());let a=Er.join(Es.getHdbBasePath(),Gs.LICENSE_KEY_DIR_NAME),c=Er.join(a,Ri.PRIVATEKEY_PEM_NAME);return r&&await Vn.writeFile(c,Lt.privateKeyToPem(e)),n}o(HV,"generateCertAuthority");async function gde(){let{privateKey:e,publicKey:t}=await UC(),r=await HV(e,t),n=await xC(e,t,r);await _de(n,r),qV()}o(gde,"generateCertsKeys");async function Sde(){let e=await xC(Lt.privateKeyFromPem(Ri.CERTIFICATE_VALUES.key),void 0,Lt.certificateFromPem(Ri.CERTIFICATE_VALUES.cert)),t=Er.join(Es.getHdbBasePath(),Gs.LICENSE_KEY_DIR_NAME),r=Er.join(t,Ri.NATS_CERTIFICATE_PEM_NAME);await Vn.exists(r)||await Vn.writeFile(r,e);let n=Er.join(t,Ri.NATS_CA_PEM_NAME);await Vn.exists(n)||await Vn.writeFile(n,Ri.CERTIFICATE_VALUES.cert)}o(Sde,"createNatsCerts");async function Tde(){uc();for await(let e of sn.search([{attribute:"is_self_signed",value:!0}]))await sn.delete(e.name);await BC()}o(Tde,"renewSelfSigned");async function BC(){ude(),await FV(),uc();let e=await LC();if(!e){Qe.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=o(u=>{try{return{key:Lt.privateKeyFromPem(Vn.readFileSync(u)),keyPath:u}}catch(d){return Qe.warn?.(`Failed to parse private key from ${u}:`,d.message),{key:null,keyPath:u}}},"tryToParseKey"),n=Es.get(Hl.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let d=r(u.privateKey);if(s=d.key,i=d.keyPath,d.key)break}}else{let u=Es.get(Hl.TLS_PRIVATEKEY),d=r(u);s=d.key,i=d.keyPath}let a=Er.join(Es.getHdbBasePath(),Gs.LICENSE_KEY_DIR_NAME),c=MV(a,i);s||(Qe.warn?.("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{privateKey:s}=await UC(),Vn.existsSync(Er.join(a,Ri.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${DV().split("-")[0]}.pem`),await Vn.writeFile(Er.join(a,c),Lt.privateKeyToPem(s)));let l=await HV(s,Lt.setRsaPublicKey(s.n,s.e),!1);await Qd({name:l.subject.getField("CN").value,uses:["https"],certificate:Lt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await fh()){let r=uT();Qe.notify?.(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await LC();let n=Lt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await xC(Lt.privateKeyFromPem(e.private_key),s,n);await Qd({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}o(BC,"reviewSelfSignedCert");function qV(){let e=ode(Object.keys(Gs.CONFIG_PARAM_MAP),!0),t=Er.join(Es.getHdbBasePath(),Gs.LICENSE_KEY_DIR_NAME),r=Er.join(t,Ri.PRIVATEKEY_PEM_NAME),n=Er.join(t,Ri.NATS_CERTIFICATE_PEM_NAME),s=Er.join(t,Ri.NATS_CA_PEM_NAME),i=Gs.CONFIG_PARAMS,a={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(a[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(a[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,a[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,a[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),OC.updateConfigValue(void 0,void 0,a,!1,!0)}o(qV,"updateConfigCert");function GV(e){return e.startsWith("-----BEGIN")?e:dde(e,"utf8")}o(GV,"readPEM");var OV=cT.createSecureContext;cT.createSecureContext=function(e){if(!e.cert||!e.key)return OV(e);let t={...e};delete t.key,delete t.cert;let r=OV(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var yde=BV.prototype._init;BV.prototype._init=function(e,t){yde.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,a)=>{this.sni_context=a?.context||a,this.certCbDone()})}};var kl=new Map;function $V(e,t){let r=new Map,n,s=!1;return i.initialize=a=>i.ready?i.ready:(a&&(a.secureContexts=r,a.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),kl.clear();let d=0;if(aT===void 0){c();return}for await(let f of aT.system.hdb_certificate.search([])){let m=f.certificate,p=new jo(m);f.is_authority&&(p.asString=m,kl.set(p.subject,m))}for await(let f of aT.system.hdb_certificate.search([]))try{if(f.is_authority)continue;let m=e==="operations-api",p=f.is_self_signed?1:3;m&&f.uses?.includes?.("operations")&&(p+=1);let h=await VV(f.private_key_name),E=f.certificate,g=new jo(E);if(kl.has(g.issuer)&&(E+=`
19
19
  `+kl.get(g.issuer)),!h||!E)throw new Error("Missing private key or certificate for secure server");let R={ciphers:f.ciphers,ticketKeys:fde(),availableCAs:kl,ca:t&&Array.from(kl.values()),cert:E,key:h,key_file:f.private_key_name,is_self_signed:f.is_self_signed};a&&(R.sessionIdContext=a.sessionIdContext);let S=f.hostnames??kC(g);Array.isArray(S)||(S=[S]);for(let I of S)I===PC()&&(p+=1);let y=cT.createSecureContext(R);y.name=f.name,y.options=R,y.quality=p,y.certificateAuthorities=Array.from(kl),y.certStart=E.toString().slice(0,100);let C;for(let I of S)if(I){I[0]==="*"&&(s=!0,I=I.slice(1)),PV.isIP(I)&&(C=!0);let k=r.get(I)?.quality??0;Qe.trace?.("Assigning TLS for hostname",I,"if",p,">",k),p>k&&r.set(I,y)}else Qe.error?.("No hostname found for certificate at",cT.certificate);Qe.trace?.("Adding TLS",y.name,"for",a.ports||"client","cert named",f.name,"hostnames",S,"quality",p,"best quality",d),p>d&&(i.defaultContext=n=y,d=p,a&&(a.defaultContext=y))}catch(m){Qe.error?.("Error applying TLS for",f.name,m)}a?.secureContextsListeners.forEach(f=>f()),c(n)}catch(d){l(d)}}o(u,"updateTLS"),aT?.system.hdb_certificate.subscribe({listener:o(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(a,c){Qe.info?.("TLS requested for",a||"(no SNI)");let l=a;for(;;){let d=r.get(l);if(d)return Qe.debug?.("Found certificate for",a,d.certStart),d.updatedContext&&(d=d.updatedContext),c(null,d);if(s&&l){let f=l.indexOf(".",1);f<0?l="":l=l.slice(f)}else break}a?Qe.debug?.("No certificate found to match",a,"using the default certificate"):Qe.debug?.("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):Qe.info?.("No default certificate found"),c(null,u)}o(i,"SNICallback")}o($V,"createTLSSelector");async function VV(e){let t=lc.get(e);return!t&&e?await Vn.readFile(Er.join(Es.get(Hl.ROOTPATH),Gs.LICENSE_KEY_DIR_NAME,e),"utf8"):t}o(VV,"getPrivateKeyByName");async function KV(){uc();let e=[];for await(let t of sn.search([]))e.push(t);return e}o(KV,"listCertificates");async function Rde(e){let t=DC(e,yi.object({name:yi.string().required(),certificate:yi.string().required(),is_authority:yi.boolean().required(),private_key:yi.string(),hosts:yi.array(),uses:yi.array()}));if(t)throw new cc(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,a=new jo(n),c=!1,l=!1,u;for(let[p,h]of lc)!s&&!c&&a.checkPrivateKey(LV(h))&&(c=!0,u=p),s&&s===h&&(l=!0,u=p);if(!i&&!s&&!c)throw new cc("A suitable private key was not found for this certificate");let d;if(!r){try{d=FC(a)}catch(p){Qe.error?.(p)}if(d==null)throw new cc("Error extracting certificate host name, please provide a name parameter")}let f=bde(r??d);s&&!c&&!l&&(await Vn.writeFile(Er.join(Es.getHdbBasePath(),Gs.LICENSE_KEY_DIR_NAME,f+".pem"),s),lc.set(f,s));let m={name:r??d,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(m.private_key_name=u??f+".pem"),e.ciphers&&(m.ciphers=e.ciphers),await Qd(m),"Successfully added certificate: "+f}o(Rde,"addCertificate");function bde(e){return e.replace(/[^a-z0-9\.]/gi,"-")}o(bde,"sanitizeName");async function Ade(e){let t=DC(e,yi.object({name:yi.string().required()}));if(t)throw new cc(t.message);let{name:r}=e;uc();let n=await sn.get(r);if(!n)throw new cc(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await sn.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(Qe.info?.("Removing private key named",s),await Vn.remove(Er.join(Es.getHdbBasePath(),Gs.LICENSE_KEY_DIR_NAME,s)))}return await sn.delete(r),"Successfully removed "+r}o(Ade,"removeCertificate");function FC(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||kC(e)[0]}o(FC,"getPrimaryHostName");function kC(e){if(e.subjectAltName)return e.subjectAltName.split(",").map(r=>{let n=r.indexOf(":");if(r=r.slice(n+1),r=r.trim(),r[0]==='"')try{r=JSON.parse(r)}catch{}return r.indexOf("=")>-1?r.match(/CN=([^,]*)/)?.[1]:r}).filter(r=>r);let t=e.subject?.match(/CN=(.*)/)?.[1];return t?[t]:[]}o(kC,"hostnamesFromCert");async function Ide(e){if(e.bypass_auth!==!0)throw new cc("Unauthorized","401");let t=DC(e,yi.object({name:yi.string().required()}));if(t)throw new cc(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await wV()).privateKey;if(r===".jwtPublic")return(await wV()).publicKey;if(lc.get(r))return lc.get(e.name);throw new cc("Key not found")}o(Ide,"getKey");function wde(e){return[e.subject?.CN,...e.subjectaltname.split(",").filter(t=>t.trim().startsWith("DNS:")).map(t=>t.trim().substring(4))]}o(wde,"getHostnamesFromCertificate")});var E1={};Re(E1,{BACK_PRESSURE_RATIO_POSITION:()=>m1,CONFIRMATION_STATUS_POSITION:()=>f1,LATENCY_POSITION:()=>gT,NodeReplicationConnection:()=>Xd,OPERATION_REQUEST:()=>VC,RECEIVED_TIME_POSITION:()=>YC,RECEIVED_VERSION_POSITION:()=>KC,RECEIVING_STATUS_POSITION:()=>WC,RECEIVING_STATUS_RECEIVING:()=>h1,RECEIVING_STATUS_WAITING:()=>p1,SENDING_TIME_POSITION:()=>mh,createWebSocket:()=>ST,databaseSubscriptions:()=>fc,replicateOverWS:()=>ph,tableUpdateListeners:()=>jC});async function ST(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=it(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!GC){let l=(0,a1.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),GC=u.secureContexts}if(i=GC.get(s),i&&ue.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let a={};r&&(a.Authorization=r);let c={headers:a,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,l1.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(_T?.caCount!==Jo.size&&(_T=c1.createSecureContext({...i.options,ca:[...Jo,...i.options.availableCAs.values()]}),_T.caCount=Jo.size),c.secureContext=_T),new s1.WebSocket(e,"harperdb-replication-v1",c)}function ph(e,t,r){let n=t.port||t.securePort,s=ql.pid%1e3+"-"+i1.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3);ue.debug?.(s,"Initializing replication connection",r);let i=0,a=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(a.buffer,0,1024),u=t.database,d=t.databaseSubscriptions||fc,f,m,p=!1,h=t.subscription;h?.then&&h.then(A=>{h=A,h.auditStore&&(f=h.auditStore)});let E=t.tables||u&&ct()[u],g,R=new Map,S=[];g=r.name,g&&t.connection&&(t.connection.nodeName=g);let y,C,I,k,J,G,H,X=6e4,z,de=0,le=0,te=0,ye=n1.default.get(F.REPLICATION_BLOBTIMEOUT)??12e4,Ae=new Map,Ye=[],Ge=0,Ar;if(t.url){let A=o(()=>{J&&le===e._socket?.bytesRead&&te===e._socket?.bytesWritten?e.terminate():(J=performance.now(),e.ping(),le=e._socket?.bytesRead,te=e._socket?.bytesWritten)},"sendPing");I=setInterval(A,t1).unref(),A()}else rr();e._socket?.setMaxListeners(200);function rr(){clearTimeout(k),le=e._socket?.bytesRead,te=e._socket?.bytesWritten,k=setTimeout(()=>{le===e._socket?.bytesRead&&te===e._socket?.bytesWritten&&(ue.warn?.(`Timeout waiting for ping from ${g}, terminating connection and reconnecting`),e.terminate())},t1*2).unref()}o(rr,"resetPingTimer");let Wr=0,vr=0,Tu=!1,Gc=3e4;function xt(){if(dn?.length>0){let A=performance.now(),U=A-vr;Wr=(Wr*Gc+(Tu?U:0))/(Gc+U),m[m1]=Wr,vr=A}}o(xt,"updateBackPressureRatio"),setInterval(xt,Gc).unref();function ni(){if(!(!g||!u))return m||(m=Vd(f,u,g)),m}o(ni,"getSharedStatus"),u&&$c(u);let Ca,QE,em=[],JE=[],tm,Pe=[],XE=[],gb=[],yu=150,Bi=25,Os=0,rm=0,nm=!1,wo,Pn,dn,Ur;e.on("message",Ru);async function Ru(A){if(r=await r,!r){ue.error?.(s,"No authorization provided"),xr(1008,"Unauthorized");return}sm(A),e.off("message",Ru),e.on("message",sm)}o(Ru,"onWSMessageWhenAuthorized");function sm(A){de=performance.now();try{let U=A.dataView=new el(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let W=(0,ot.decode)(A),[j,B,Ee]=W;switch(j){case WV:{if(B){if(g){if(g!==B){ue.error?.(s,`Node name mismatch, expecting to connect to ${g}, but peer reported name as ${B}, disconnecting`),e.send((0,ot.encode)([Jd])),xr(1008,"Node name mismatch");return}}else if(g=B,t.connection?.tentativeNode){let fe=t.connection.tentativeNode;fe.name=g,t.connection.tentativeNode=null,zo(g,fe)}if(t.connection&&(t.connection.nodeName=g),ue.debug?.(s,"received node name:",g,"db:",u??W[2]),!u)try{$c(u=W[2]),u==="system"&&(Ca=oc(t,(fe,ae)=>{La(ae)&&K(ae)}),e.on("close",()=>{Ca?.remove()}))}catch(fe){ue.warn?.(s,"Error setting database",fe),e.send((0,ot.encode)([Jd])),xr(1008,fe.message);return}im()}break}case ZV:{ue.debug?.(s,"Received table definitions for",B.map(fe=>fe.table));for(let fe of B){let ae=W[2];fe.database=ae;let ke;if(La(ae)){if(u==="system")De[ae]?.[fe.table]||(ke=L(fe,De[ae]?.[fe.table]));else{if(ae!=="data"&&!De[ae]){ue.warn?.("Database not found",ae);return}ke=L(fe,De[ae]?.[fe.table])}f||(f=ke?.auditStore),E||(E=ct()?.[ae])}}break}case Jd:xr();break;case VC:try{let fe=r?.replicates||r?.subscribers||r?.name;ue.debug?.("Received operation request",B,"from",g),server.operation(B,{user:r},!fe).then(ae=>{ue.debug?.("Requested request from finished",g,ae),Array.isArray(ae)&&(ae={results:ae}),ae.requestId=B.requestId,e.send((0,ot.encode)([mT,ae]))},ae=>{ue.debug?.("Failed requested operation from",g,ae),e.send((0,ot.encode)([mT,{requestId:B.requestId,error:HC(ae)}]))})}catch(fe){e.send((0,ot.encode)([mT,{requestId:B.requestId,error:HC(fe)}]))}break;case mT:let{resolve:me,reject:pe}=R.get(B.requestId);ue.debug?.("Received completed operation request",g,B),B.error?pe(new Error(B.error)):me(B),R.delete(B.requestId);break;case qC:let ne=W[3];if(!E){u?ue.error?.(s,"No database found for",u):ue.error?.(s,"Database name never received"),xr();return}let ie=E[ne];ie=L({table:ne,database:u,attributes:B.attributes,schemaDefined:B.schemaDefined},ie),em[Ee]={name:ne,decoder:new ot.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:B.typedStructs,structures:B.structures}),getEntry(fe){return ie.primaryStore.getEntry(fe)},rootStore:ie.primaryStore.rootStore};break;case zV:Ur=f?mV(B,f):new Map,tm=W[2],ue.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${tm}`);break;case jV:let xe=Ee;gb[xe]=B;break;case XV:ni()[f1]=B,ue.trace?.(s,"received and broadcasting committed update",B),ni().buffer.notify();break;case JV:y=B,h.send({type:"end_txn",localTime:y,remoteNodeIds:S});break;case pT:{let fe=W[1],{fileId:ae,size:ke,finished:Be,error:Le}=fe,Me=Ae.get(ae);ue.debug?.("Received blob",ae,"has stream",!!Me,"connectedToBlob",!!Me?.connectedToBlob,"length",W[2].length,"finished",Be),Me||(Me=new $C.PassThrough,Me.expectedSize=ke,Ae.set(ae,Me)),Me.lastChunk=Date.now();let ht=W[2];Ve(ht.byteLength,"bytes-received",`${g}.${u}`,"replication","blob");try{Be?(Le?(Me.on("error",()=>{}),Me.destroy(new Error("Blob error: "+Le+" for record "+(Me.recordId??"unknown")+" from "+remote_node_name))):Me.end(ht),Me.connectedToBlob&&Ae.delete(ae)):Me.write(ht)}catch(Nt){ue.error?.(`Error receiving blob for ${Me.recordId} from ${g} and streaming to storage`,Nt),Ae.delete(ae)}break}case QV:{let fe=B,ae;try{let ke=W[3],Be=JE[Ee]||(JE[Ee]=E[W[4]]);if(!Be)return ue.warn?.("Unknown table id trying to handle record request",Ee);let Le=Be.primaryStore.getBinaryFast(Symbol.for("structures")),Me=Le?.length??0;if(Me>0&&Me!==rm){rm=Me;let Nt=(0,ot.decode)(Le);e.send((0,ot.encode)([qC,{typedStructs:Nt.typed,structures:Nt.named},Ee,Be.tableName]))}let ht=Be.primaryStore.getBinaryFast(ke);if(ht){let Nt=Be.primaryStore.decoder.decode(ht,{valueAsBuffer:!0}),_t=lt||{};_t.version=(0,u1.getLastVersion)(),lt&&lt[ku]&Jr&&(Nt=Buffer.from(Nt),Dm(()=>Be.primaryStore.decoder.decode(ht),e_=>Oa(e_,ke),Be.primaryStore.rootStore)),ae=(0,ot.encode)([fT,fe,{value:Nt,expiresAt:_t.expiresAt,version:_t.version,residencyId:_t.residencyId,nodeId:_t.nodeId,user:_t.user}])}else ae=(0,ot.encode)([fT,fe])}catch(ke){ae=(0,ot.encode)([fT,fe,{error:ke.message}])}e.send(ae);break}case fT:{let{resolve:fe,reject:ae,tableId:ke,key:Be}=R.get(W[1]),Le=W[2];if(Le?.error)ae(new Error(Le.error));else if(Le){let Me;B_(()=>{let ht=em[ke].decoder.decode(Le.value);Le.value=ht,Le.key=Be,fe(Le)||Me&&setTimeout(()=>Me.forEach(v_),6e4).unref()},f?.rootStore,ht=>{let Nt=Pa(ht,Be);return Me||(Me=[]),Me.push(Nt),Nt})}else fe();R.delete(W[1]);break}case YV:{dn=B;let fe,ae,ke=!1;if(h){if(u!==h.databaseName&&!h.then){ue.error?.("Subscription request for wrong database",u,h.databaseName);return}}else h=d.get(u);if(ue.debug?.(s,"received subscription request for",u,"at",dn),!h){let Ce;h=new Promise(Yt=>{ue.debug?.("Waiting for subscription to database "+u),Ce=Yt}),h.ready=Ce,fc.set(u,h)}if(r.name)ae=Qt().subscribe(r.name),ae.then(async Ce=>{fe=Ce;for await(let Yt of fe){let Bt=Yt.value;if(!(Bt?.replicates===!0||Bt?.replicates?.receives||Bt?.subscriptions?.some(Br=>(Br.database||Br.schema)===u&&Br.publish!==!1))){ke=!0,e.send((0,ot.encode)([Jd])),xr(1008,`Unauthorized database subscription to ${u}`);return}}},Ce=>{ue.error?.(s,"Error subscribing to HDB nodes",Ce)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,ot.encode)([Jd])),xr(1008,`Unauthorized database subscription to ${u}`);return}if(Pn&&(ue.debug?.(s,"stopping previous subscription",u),Pn.emit("close")),dn.length===0)return;let Be=dn[0],Le=o(Ce=>{if(Ce&&(Be.replicateByDefault?!Be.tables.includes(Ce.tableName):Be.tables.includes(Ce.tableName)))return{table:Ce}},"tableToTableEntry"),Me={txnTime:0},ht,Nt,_t=1/0,e_,t_=o((Ce,Yt)=>{if(Ce.type==="end_txn"){Me.txnTime&&(a[i]!==66&&ue.error?.("Invalid encoding of message"),N(9),N(z_),O(e_=Yt),lv()),i=c,Me.txnTime=0;return}let Bt=Ce.nodeId,Br=Ce.tableId,Ct=Nt[Br];if(!Ct&&(Ct=Nt[Br]=Le(h.tableById[Br]),!Ct))return ue.debug?.("Not subscribed to table",Br);let Ps=Ct.table,Ft=Ps.primaryStore,si=Ft.encoder;(Ce.extendedType&ig||!si.typedStructs)&&(si._mergeStructures(si.getStructures()),si.typedStructs&&(si.lastTypedStructuresLength=si.typedStructs.length));let Iu=ht[Bt];if(!(Iu&&Iu.startTime<Yt&&(!Iu.endTime||Iu.endTime>Yt)))return ET&&ue.trace?.(s,"skipping replication update",Ce.recordId,"to:",g,"from:",Bt,"subscribed:",ht),uv();ET&&ue.trace?.(s,"sending replication update",Ce.recordId,"to:",g,"from:",Bt,"subscribed:",ht);let Sb=Ce.version;Me.txnTime!==Sb&&(Me.txnTime&&(ET&&ue.trace?.(s,"new txn time, sending queued txn",Me.txnTime),a[i]!==66&&ue.error?.("Invalid encoding of message"),lv()),Me.txnTime=Sb,i=c,O(Sb));let Vc=Ce.residencyId,Tb=ZE(Vc,Ps),r_;if(Tb&&!Tb.includes(g)){let Fi=ZE(Ce.previousResidencyId,Ps);if(Fi&&!Fi.includes(g)&&(Ce.type==="put"||Ce.type==="patch")||Ps.getResidencyById)return uv();let Kc=Ce.recordId;ue.trace?.(s,"sending invalidation",Kc,g,"from",Bt);let om=0;Vc&&(om|=tl),Ce.previousResidencyId&&(om|=rl);let bb,n_=null;for(let dv in Ps.indices){if(!n_){if(bb=Ce.getValue(Ft,!0),!bb)break;n_={}}n_[dv]=bb[dv]}r_=nl(Ce.version,Br,Kc,null,Bt,Ce.user,Ce.type==="put"||Ce.type==="patch"?"invalidate":Ce.type,si.encode(n_),om,Vc,Ce.previousResidencyId,Ce.expiresAt)}function uv(){return ue.trace?.(s,"skipping audit record",Ce.recordId),G||(G=setTimeout(()=>{G=null,(e_||0)+e1/2<_t&&(ET&&ue.trace?.(s,"sending skipped sequence update",_t),e.send((0,ot.encode)([JV,_t])))},e1).unref()),new Promise(setImmediate)}o(uv,"skipAuditRecord");let yb=si.typedStructs,Rb=si.structures;if((yb?.length!=Ct.typed_length||Rb?.length!=Ct.structure_length)&&(Ct.typed_length=yb?.length,Ct.structure_length=Rb.length,ue.debug?.(s,"send table struct",Ct.typed_length,Ct.structure_length),Ct.sentName||(Ct.sentName=!0),e.send((0,ot.encode)([qC,{typedStructs:yb,structures:Rb,attributes:Ps.attributes,schemaDefined:Ps.schemaDefined},Br,Ct.table.tableName]))),Vc&&!XE[Vc]&&(e.send((0,ot.encode)([jV,Tb,Vc])),XE[Vc]=!0),r_)N(r_.length),P(r_);else{let Fi=Ce.encoded;Ce.extendedType&Jr&&Dm(()=>Ce.getValue(Ft),om=>Oa(om,Ce.recordId),Ft.rootStore);let Kc=Fi[0]===66?8:0;N(Fi.length-Kc),P(Fi,Kc),ue.trace?.("wrote record",Ce.recordId,"length:",Fi.length)}if(e._socket.writableNeedDrain){let Fi=performance.now();return Tu=!0,xt(),new Promise(Kc=>{ue.debug?.(`Waiting for remote node ${g} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",()=>{Kc(),Tu=!1,xt()})})}else return Ge>Bi?new Promise(Fi=>{Ar=Fi}):new Promise(setImmediate)},"sendAuditRecord"),lv=o(()=>{c-i>8?(e.send(a.subarray(i,c)),ue.debug?.(s,"Sent message, size:",c-i),u!=="system"&&Ve(c-i,"bytes-sent",`${g}.${u}`,"replication","egress")):ue.debug?.(s,"skipping empty transaction")},"sendQueuedData");Pn=new zC.EventEmitter,Pn.once("close",()=>{ke=!0,fe?.end()});for(let{startTime:Ce}of dn)Ce<_t&&(_t=Ce);(ae||Promise.resolve()).then(async()=>{h=await h,f=h.auditStore,Nt=h.tableById.map(Le),ht=[];for(let{name:Yt,startTime:Bt,endTime:Br}of dn){let Ct=nT(Yt,f);ue.debug?.("subscription to",Yt,"using local id",Ct,"starting",Bt),ht[Ct]={startTime:Bt,endTime:Br}}K(u),Ca||(Ca=Dl(Yt=>{Yt.databaseName===u&&K(u)}),QE=Hp(Yt=>{Yt===u&&(e.send((0,ot.encode)([Jd])),xr())}),e.on("close",()=>{Ca?.remove(),QE?.remove()})),e.send((0,ot.encode)([zV,sh(h.auditStore),dn.map(({name:Yt})=>Yt)]));let Ce=!0;do{isFinite(_t)||(ue.warn?.("Invalid sequence id "+_t),xr(1008,"Invalid sequence id"+_t));let Yt;if(Ce&&!ke&&(Ce=!1,_t===0)){ue.info?.("Replicating all tables to",g);let Bt=_t,Br=TT(f);for(let Ct in E){if(!Le(Ct))continue;let Ps=E[Ct];for(let Ft of Ps.primaryStore.getRange({snapshot:!1,versions:!0})){if(ke)return;if(Ft.localTime>=_t){ue.trace?.(s,"Copying record from",u,Ct,Ft.key,Ft.localTime),Bt=Math.max(Ft.localTime,Bt),Yt=!0,ni()[mh]=1;let si=nl(Ft.version,Ps.tableId,Ft.key,null,Br,null,"put",Dm(()=>Ps.primaryStore.encoder.encode(Ft.value),Iu=>Oa(Iu,Ft.key)),Ft.metadataFlags&-256,Ft.residencyId,null,Ft.expiresAt);await t_({recordId:Ft.key,tableId:Ps.tableId,type:"put",getValue(){return Ft.value},encoded:si,version:Ft.version,residencyId:Ft.residencyId,nodeId:Br,extendedType:Ft.metadataFlags},Ft.localTime)}}}Yt&&t_({type:"end_txn"},_t),ni()[mh]=0,_t=Bt}for(let{key:Bt,value:Br}of f.getRange({start:_t||1,exclusiveStart:!0,snapshot:!1})){if(ke)return;let Ct=It(Br);ue.debug?.("sending audit record",Bt,Ct.recordId),ni()[mh]=Bt,_t=Bt,await t_(Ct,Bt),Pn.startTime=Bt,Yt=!0}Yt&&t_({type:"end_txn"},_t),ni()[mh]=0,await R0(f)}while(!ke)}).catch(Ce=>{ue.error?.(s,"Error handling subscription to node",Ce),xr(1008,"Error handling subscription to node")});break}}return}U.position=8;let w=!0,D,$;do{ni();let W=U.readInt();if(W===9&&U.getUint8(U.position)==z_){U.position++,y=$=U.readFloat64(),m[KC]=y,m[YC]=Date.now(),m[WC]=p1,ue.trace?.("received remote sequence update",y,u);break}let j=U.position,B=It(A,j,j+W),Ee=em[B.tableId];Ee||ue.error?.(`No table found with an id of ${B.tableId}`);let me;B.residencyId&&(me=gb[B.residencyId],ue.trace?.(s,"received residency list",me,B.type,B.recordId));try{let pe=B.recordId;B_(()=>{D={table:Ee.name,id:B.recordId,type:B.type,nodeId:Ur.get(B.nodeId),residencyList:me,timestamp:B.version,value:B.getValue(Ee),user:B.user,beginTxn:w,expiresAt:B.expiresAt}},f?.rootStore,ne=>Pa(ne,pe))}catch(pe){throw pe.message+="typed structures for current decoder"+JSON.stringify(Ee.decoder.typedStructs),pe}w=!1,ue.debug?.(s,"received replication message",B.type,"id",D.id,"version",new Date(B.version),"nodeId",D.nodeId),m[KC]=B.version,m[YC]=Date.now(),m[WC]=h1,h.send(D),U.position=j+W}while(U.position<A.byteLength);Os++,u!=="system"&&Ve(A.byteLength,"bytes-received",`${g}.${u}.${D?.table||"unknown_table"}`,"replication","ingest"),Os>yu&&!nm&&(nm=!0,e.pause(),ue.debug?.(`Commit backlog causing replication back-pressure, requesting that ${g} pause replication`)),h.send({type:"end_txn",localTime:y,remoteNodeIds:S,async onCommit(){if(D){let W=Date.now()-D.timestamp;u!=="system"&&Ve(W,"replication-latency",g+"."+u+"."+D.table,D.type,"ingest")}Os--,nm&&(nm=!1,e.resume(),ue.debug?.(`Replication resuming ${g}`)),Ye.length>0&&await Promise.all(Ye),ue.trace?.("All blobs finished"),!C&&$&&(ue.trace?.(s,"queuing confirmation of a commit at",$),setTimeout(()=>{e.send((0,ot.encode)([XV,C])),ue.trace?.(s,"sent confirmation of a commit at",C),C=null},Ode)),C=$,ue.debug?.("last sequence committed",new Date($),u)}})}catch(U){ue.error?.(s,"Error handling incoming replication message",U)}}o(sm,"onWSMessage"),e.on("ping",rr),e.on("pong",()=>{if(t.connection){let A=performance.now()-J;t.connection.latency=A,ni()&&(m[gT]=A),t.isSubscriptionConnection&&Fl({name:g,database:u,url:t.url,latency:A})}J=null}),e.on("close",(A,U)=>{clearInterval(I),clearTimeout(k),clearInterval(H),Pn&&Pn.emit("close"),wo&&wo.end();for(let[w,{reject:D}]of R)D(new Error(`Connection closed ${U?.toString()} ${A}`));ue.debug?.(s,"closed",A,U?.toString())});function xr(A,U){try{e.isFinished=!0,ue.debug?.(s,"closing",g,u,A,U),e.close(A,U),t.connection?.emit("finished")}catch(w){ue.error?.(s,"Error closing connection",w)}}o(xr,"close");let bu=new Set;async function Oa(A,U){let w=U_(A);if(bu.has(w)){ue.debug?.("Blob already being sent",w);return}bu.add(w);try{let D;Ge++;for await(let $ of A.stream())D&&(ue.debug?.("Sending blob chunk",w,"length",D.length),e.send((0,ot.encode)([pT,{fileId:w,size:A.size},D]))),D=$,e._socket.writableNeedDrain&&(ue.debug?.("draining",w),await new Promise(W=>e._socket.once("drain",W)),ue.debug?.("drained",w)),Ve($.length,"bytes-sent",`${g}.${u}`,"replication","blob");ue.debug?.("Sending final blob chunk",w,"length",D.length),e.send((0,ot.encode)([pT,{fileId:w,size:A.size,finished:!0},D]))}catch(D){ue.warn?.("Error sending blob",D,"blob id",w,"for record",U),e.send((0,ot.encode)([pT,{fileId:w,finished:!0,error:HC(D)},Buffer.alloc(0)]))}finally{bu.delete(w),Ge--,Ge<Bi&&Ar?.()}}o(Oa,"sendBlobs");function Pa(A,U){let w=U_(A),D=Ae.get(w);ue.debug?.("Received transaction with blob",w,"has stream",!!D,"ended",!!D?.writableEnded),D?D.writableEnded&&Ae.delete(w):(D=new $C.PassThrough,Ae.set(w,D)),D.connectedToBlob=!0,D.lastChunk=Date.now(),D.recordId=U,A.size===void 0&&D.expectedSize&&(A.size=D.expectedSize);let $=D.blob??createBlob(D,A);D.blob=$;let W=Uo(()=>Lm($).saving,h.auditStore?.rootStore);return W&&(W.blobId=w,Ye.push(W),W.finally(()=>{ue.debug?.(`Finished receiving blob stream ${w}`),Ye.splice(Ye.indexOf(W),1)})),$}o(Pa,"receiveBlobs");function im(){if(p||(p=!0,t.connection?.on("subscriptions-updated",im)),!f&&h&&(f=h.auditStore),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let A=new Map;f||(f=h?.auditStore);try{for(let D of h?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let $ of D.value.nodes||[])$.lastTxnTime>(A.get($.id)??0)&&A.set($.id,$.lastTxnTime)}catch(D){if(!D.message.includes("Can not re"))throw D}let U=t.connection?.nodeSubscriptions?.[0];S=[];let w=t.connection?.nodeSubscriptions.map((D,$)=>{let W=[],{replicateByDefault:j}=D;if(D.subscriptions){for(let pe of D.subscriptions)if(pe.subscribe&&(pe.schema||pe.database)===u){let ne=pe.table;E?.[ne]?.replicate!==!1&&W.push(ne)}j=!1}else for(let pe in E)(j?E[pe].replicate===!1:E[pe].replicate)&&W.push(pe);let B=f&&nT(D.name,f),Ee=h?.dbisDB?.get([Symbol.for("seq"),B])??1,me=Math.max(Ee?.seqId??1,(typeof D.startTime=="string"?new Date(D.startTime).getTime():D.startTime)??1);if(ue.debug?.("Starting time recorded in db",D.name,B,u,Ee?.seqId,"start time:",me,new Date(me)),U!==D){let pe=f&&nT(U.name,f),ne=h?.dbisDB?.get([Symbol.for("seq"),pe])??1;for(let ie of ne?.nodes||[])ie.name===D.name&&(me=ie.seqId,ue.debug?.("Using sequence id from proxy node",U.name,me))}if(B===void 0?ue.warn("Starting subscription request from node",D,"but no node id found"):S.push(B),A.get(B)>me&&(me=A.get(B),ue.debug?.("Updating start time from more recent txn recorded",U.name,me)),me===1&&hT)try{new URL(hT).hostname===D.name?(ue.warn?.(`Requesting full copy of database ${u} from ${hT}`),me=0):me=Date.now()-6e4}catch(pe){ue.error?.("Error parsing leader URL",hT,pe)}return ue.trace?.(s,"defining subscription request",D.name,u,new Date(me)),{name:D.name,replicateByDefault:j,tables:W,startTime:me,endTime:D.endTime}});if(w)if(ue.debug?.(s,"sending subscription request",w,h?.dbisDB?.path),clearTimeout(z),w.length>0)e.send((0,ot.encode)([YV,w]));else{let D=o(()=>{let $=performance.now();z=setTimeout(()=>{de<=$?xr(1008,"Connection has no subscriptions and is no longer used"):D()},X).unref()},"scheduleClose");D()}}o(im,"sendSubscriptionRequestUpdate");function ZE(A,U){if(!A)return;let w=Pe[A];return w||(w=U.getResidencyRecord(A),Pe[A]=w),w}o(ZE,"getResidence");function La(A){return!(dc&&dc!="*"&&!dc[A]&&!dc.includes?.(A)&&!dc.some?.(U=>U.name===A))}o(La,"checkDatabaseAccess");function $c(A){if(h=h||d.get(A),!La(A))throw new Error(`Access to database "${A}" is not permitted`);h||ue.warn?.(`No database named "${A}" was declared and registered`),f=h?.auditStore,E||(E=ct()?.[A]);let U=it();if(U===g)throw U?new Error("Should not connect to self",U):new Error("Node name not defined");return Au(U,A),!0}o($c,"setDatabase");function Au(A,U){let w=ct()?.[U],D=[];for(let $ in w){let W=w[$];D.push({table:$,schemaDefined:W.schemaDefined,attributes:W.attributes.map(j=>({name:j.name,type:j.type,isPrimaryKey:j.isPrimaryKey}))})}ue.trace?.("Sending database info for node",A,"database name",U),e.send((0,ot.encode)([WV,A,U,D]))}o(Au,"sendNodeDBName");function K(A){let U=ct()?.[A],w=[];for(let D in U){if(dn&&!dn.some(W=>W.replicateByDefault?!W.tables.includes(D):W.tables.includes(D)))continue;let $=U[D];w.push({table:D,schemaDefined:$.schemaDefined,attributes:$.attributes.map(W=>({name:W.name,type:W.type,isPrimaryKey:W.isPrimaryKey}))})}e.send((0,ot.encode)([ZV,w,A]))}o(K,"sendDBSchema"),H=setInterval(()=>{for(let[A,U]of Ae)U.lastChunk+ye<Date.now()&&(ue.warn?.(`Timeout waiting for blob stream to finish ${A} for record ${U.recordId??"unknown"} from ${g}`),Ae.delete(A),U.end())},ye).unref();let _=1,T=[];return{end(){wo&&wo.end(),Pn&&Pn.emit("close")},getRecord(A){let U=_++;return new Promise((w,D)=>{let $=[QV,U,A.table.tableId,A.id];T[A.table.tableId]||($.push(A.table.tableName),T[A.table.tableId]=!0),e.send((0,ot.encode)($)),de=performance.now(),R.set(U,{tableId:A.table.tableId,key:A.id,resolve(W){let{table:j,entry:B}=A;if(w(W),W)return j._recordRelocate(B,W)},reject:D})})},sendOperation(A){let U=_++;return A.requestId=U,e.send((0,ot.encode)([VC,A])),new Promise((w,D)=>{R.set(U,{resolve:w,reject:D})})}};function N(A){x(5),A<128?a[c++]=A:A<16384?(l.setUint16(c,A|32768),c+=2):A<1056964608?(l.setUint32(c,A|3221225472),c+=4):(a[c]=255,l.setUint32(c+1,A),c+=5)}function P(A,U=0,w=A.length){let D=w-U;x(D),A.copy(a,c,U,w),c+=D}function O(A){x(8),l.setFloat64(c,A),c+=8}function x(A){if(A+16>a.length-c){let U=Buffer.allocUnsafeSlow(c+A-i+65536>>10<<11);a.copy(U,0,i,c),c=c-i,i=0,a=U,l=new DataView(a.buffer,0,a.length)}}function L(A,U){let w=A.database??"data";U||(U={});let D=U.schemaDefined,$=!1,W=A.schemaDefined,j=U.attributes||[];for(let B=0;B<A.attributes?.length;B++){let Ee=A.attributes[B],me=j.find(pe=>pe.name===Ee.name);(!me||me.type!==Ee.type)&&(D?ue.error?.(`Schema for '${u}.${A.table}' is defined locally, but attribute '${Ee.name}: ${Ee.type}' from '${g}' does not match local attribute ${me?"'"+me.name+": "+me.type+"'":"which does not exist"}`):($=!0,W||(Ee.indexed=!0),me?j[j.indexOf(me)]=Ee:j.push(Ee)))}return $?(ue.debug?.("(Re)creating",A),et({table:A.table,database:A.database,schemaDefined:A.schemaDefined,attributes:j,...U})):U}}var n1,ot,s1,i1,o1,zC,a1,c1,ql,l1,$C,u1,d1,Nde,HC,ue,YV,WV,zV,Jd,jV,qC,QV,fT,VC,mT,JV,XV,ZV,pT,f1,KC,YC,mh,gT,WC,m1,p1,h1,Cde,hT,jC,fc,ET,e1,Ode,t1,GC,_T,r1,Xd,QC=se(()=>{we();Hi();wC();QA();hs();n1=b(ce());q();sl();ot=require("msgpackr"),s1=require("ws"),i1=require("worker_threads"),o1=b(Q());uh();zC=require("events"),a1=b(_s()),c1=b(require("node:tls"));Yd();ql=b(require("node:process")),l1=require("node:net");ts();es();$C=require("node:stream"),u1=require("lmdb"),d1=b(require("minimist")),{forComponent:Nde,errorToString:HC}=o1.default,ue=Nde("replication").conditional,YV=129,WV=140,zV=141,Jd=142,jV=130,qC=132,QV=133,fT=134,VC=136,mT=137,JV=143,XV=144,ZV=145,pT=146,f1=0,KC=1,YC=2,mh=3,gT=4,WC=5,m1=6,p1=0,h1=1,Cde=(0,d1.default)(ql.argv),hT=Cde.HDB_LEADER_URL??ql.env.HDB_LEADER_URL,jC=new Map,fc=new Map,ET=!0,e1=300,Ode=2,t1=3e4;o(ST,"createWebSocket");r1=500,Xd=class extends zC.EventEmitter{static{o(this,"NodeReplicationConnection")}socket;startTime;retryTime=r1;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;url;subscription;databaseName;nodeName;authorization;constructor(t,r,n,s,i){super(),this.url=t,this.subscription=r,this.databaseName=n,this.authorization=i,this.nodeName=this.nodeName??Ti(t)}async connect(){this.session||this.resetSession();let t=[];this.socket=await ST(this.url,{serverName:this.nodeName,authorization:this.authorization});let r;ue.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${ql.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ue[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=r1,this.nodeSubscriptions&&Fl({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,r=ph(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(r)}),this.socket.on("error",n=>{n.code==="SELF_SIGNED_CERT_IN_CHAIN"?(ue.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),n.isHandled=!0):n.code!=="ECONNREFUSED"&&(n.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?ue.error?.(`Can not connect to ${this.url}, the certificate provided by ${this.url} is not trusted, this node needs to be added to the cluster, or a certificate authority needs to be added`):ue.error?.(`Error in connection to ${this.url} due to ${n.message}`)),this.sessionReject(n)}),this.socket.on("close",(n,s)=>{if(this.isConnected&&(this.nodeSubscriptions&&zd({name:this.nodeName,database:this.databaseName,url:this.url,finished:this.socket.isFinished}),this.isConnected=!1),this.removeAllListeners("subscriptions-updated"),this.socket.isFinished){this.isFinished=!0,r?.end(),this.emit("finished");return}if(++this.retries%20===1){let i=s?.toString();ue.warn?.(`${r?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${i?'"'+i+'" ':""}(code: ${n})`)}r=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((t,r)=>{this.sessionResolve=t,this.sessionReject=r})}subscribe(t,r){this.nodeSubscriptions=t,this.replicateTablesByDefault=r,this.emit("subscriptions-updated",t)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(t){return this.session.then(r=>r.getRecord(t))}};o(ph,"replicateOverWS")});function hh(e){return e===g1||e===Pde}function Lde(e){return e===S1||e===T1}function JC(e){return e===g1?S1:T1}function Dde(){if(_1)return;_1=!0;let e=Gl.CryptoEngine.prototype,t=Gl.Certificate.prototype,r={getHashAlgorithm:e.getHashAlgorithm,getAlgorithmByOID:e.getAlgorithmByOID,getAlgorithmParameters:e.getAlgorithmParameters,verifyWithPublicKey:e.verifyWithPublicKey,certificateVerify:t.verify,getPublicKey:t.getPublicKey};e.getHashAlgorithm=function(...n){let[s]=n;return hh(s.algorithmId)?"UNUSED-EDDSA-BUILTIN-HASH":r.getHashAlgorithm.call(this,s)},e.getAlgorithmByOID=function(...n){let[s]=n;return hh(s)?{name:JC(s)}:r.getAlgorithmByOID.call(this,...n)},e.getAlgorithmParameters=function(...n){let[s,i]=n;return Lde(s)?{algorithm:{name:s},usages:i==="sign"?["sign"]:["verify"]}:r.getAlgorithmParameters.call(this,...n)},t.getPublicKey=async function(...n){let[,s=Gl.getCrypto(!0)]=n,i=this.subjectPublicKeyInfo.algorithm.algorithmId;if(hh(i)){let a=JC(i);return s.importKey("spki",this.subjectPublicKeyInfo.toSchema().toBER(!1),a,!0,["verify"])}return r.getPublicKey.call(this,...n)},t.verify=async function(...n){let[s]=n;if(hh(this.signatureAlgorithm.algorithmId))try{let i=this.toSchema().toBER(!1),a=s.toSchema().toBER(!1),c=new Eh.X509Certificate(Buffer.from(i)),l=new Eh.X509Certificate(Buffer.from(a));return c.verify(l.publicKey)}catch{return!1}return r.certificateVerify.call(this,...n)},r.verifyWithPublicKey&&(e.verifyWithPublicKey=async function(...n){let[s,i,a]=n,c=a.algorithm.algorithmId;if(hh(c)){let l=JC(c);try{let u=this.crypto?.subtle||this.subtle||Gl.getCrypto(!0)?.subtle||Eh.webcrypto?.subtle;if(!u)throw new Error("No crypto.subtle available");let d=await u.importKey("spki",a.toSchema().toBER(!1),l,!1,["verify"]),f=i.valueBlock.valueHexView;return i.valueBlock.unusedBits>0&&(f=f.slice(0,f.length-1)),await u.verify(l,d,f,s)}catch{return!1}}return r.verifyWithPublicKey.call(this,...n)})}var Gl,Eh,g1,Pde,S1,T1,_1,y1=se(()=>{Gl=b(require("pkijs")),Eh=require("node:crypto"),g1="1.3.101.112",Pde="1.3.101.113",S1="Ed25519",T1="Ed448",_1=!1;o(hh,"isEd25519OrEd448");o(Lde,"isEdDSAAlgorithmName");o(JC,"getEdDSAAlgorithmName");o(Dde,"applyEd25519Patch");Dde()});function Mde(){return yT||(yT=et({table:"hdb_certificate_cache",database:"system",attributes:[{name:"certificate_id",isPrimaryKey:!0},{name:"status"},{name:"reason"},{name:"checked_at"},{name:"expiresAt",expiresAt:!0,indexed:!0},{name:"method"}]}),yT.sourcedFrom(XC)),yT}function vde(e){if(Et.trace?.("getCertificateVerificationConfig called with:",{mtlsConfig:e}),!e)return!1;if(e===!0)return Et.debug?.("mTLS enabled with default certificate verification"),{};let t=e.certificateVerification;return Et.trace?.("Certificate verification config:",{verificationConfig:t}),t==null?{}:t===!1?!1:t===!0?{}:t}async function Zd(e,t){Et.debug?.("verifyCertificate called for:",e.subject?.CN||"unknown");let r=vde(t);if(r===!1)return Et.debug?.("Certificate verification disabled"),{valid:!0,status:"disabled",method:"disabled"};let n=Bde(e);return Et.trace?.("Certificate chain length:",n.length),n.length===1&&!n[0].issuer?(Et.debug?.("Certificate without issuer - cannot perform OCSP check"),{valid:!0,status:"no-issuer-cert",method:"disabled"}):n.length<2||!n[0].issuer?(Et.debug?.("Certificate chain too short for revocation checking"),{valid:!0,status:"insufficient-chain",method:"disabled"}):Ude(n[0].cert,n[0].issuer,r)}async function Ude(e,t,r){Et.debug?.("verifyOCSP called");try{Buffer.isBuffer(e)&&(e=R1(e,"CERTIFICATE")),Buffer.isBuffer(t)&&(t=R1(t,"CERTIFICATE"));let n={certPem:e,issuerPem:t,method:"ocsp"},i=`ocsp:${(0,b1.createHash)("sha256").update(JSON.stringify(n)).digest("hex")}`;Et.trace?.("OCSP cache key:",i);let c=await Mde().get(i,{certPem:e,issuerPem:t,config:r||{}});if(!c)return(r?.failureMode??Xo.failureMode)==="fail-closed"?{valid:!1,status:"error",error:"Cache fetch failed",method:"ocsp"}:(Et.warn?.("OCSP cache fetch failed, allowing connection (fail-open mode)"),{valid:!0,status:"error-allowed",method:"ocsp"});let l=c,u=c.wasLoadedFromSource?.();if(Et.trace?.(`OCSP ${u?"source fetch":"cache hit"} for certificate`),l.status==="unknown"&&u&&(l.reason==="ocsp-error"||l.reason==="timeout"||l.reason==="OCSP timeout")){let m=(r?.failureMode??Xo.failureMode)==="fail-closed";return m||Et.warn?.("OCSP check failed, allowing connection (fail-open mode)"),{valid:!m,status:m?l.status:"error-allowed",cached:!u,method:l.method||"ocsp"}}return{valid:l.status==="good",status:l.status,cached:!u,method:l.method||"ocsp"}}catch(n){return Et.error?.("OCSP verification error:",n),(r?.failureMode??Xo.failureMode)==="fail-closed"?{valid:!1,status:"error",error:n.message,method:"ocsp"}:(Et.warn?.("OCSP check failed, allowing connection (fail-open mode)"),{valid:!0,status:"error-allowed",method:"ocsp"})}}async function xde(e,t,r){Et.trace?.("Performing OCSP check with timeout:",r);try{(0,RT.getCertURLs)(e)}catch(n){return Et.debug?.("Certificate does not contain OCSP URL:",n.message),{status:"unknown",reason:"no-ocsp-url"}}try{let n=await(0,RT.getCertStatus)(e,{ca:t,timeout:r});switch(Et.debug?.("OCSP response:",n.status),n.status){case"good":return{status:"good"};case"revoked":return{status:"revoked",reason:n.revocationReason?.toString()||"unspecified"};default:return{status:"unknown",reason:"unknown-status"}}}catch(n){let s=n;return Et.debug?.("OCSP check failed:",s.message),{status:"unknown",reason:s.name==="AbortError"?"timeout":"ocsp-error"}}}function R1(e,t){let r=e.toString("base64"),n=[`-----BEGIN ${t}-----`];for(let s=0;s<r.length;s+=64)n.push(r.substring(s,s+64));return n.push(`-----END ${t}-----`),n.join(`
20
- `)}function Bde(e){let t=[],r=e;for(;r?.raw;){let n={cert:r.raw};if(r.issuerCertificate&&r.issuerCertificate!==r&&r.issuerCertificate.raw&&(n.issuer=r.issuerCertificate.raw),t.push(n),r.issuerCertificate&&r.issuerCertificate!==r)r=r.issuerCertificate;else break}return t}var RT,b1,A1,Et,XC,Xo,yT,bT=se(()=>{y1();RT=require("easy-ocsp"),b1=require("node:crypto"),A1=b(Zn());we();Ga();Et=(0,A1.loggerWithTag)("cert-verification"),XC=class extends Hr{static{o(this,"CertificateVerificationSource")}async get(t){Et.debug?.("CertificateVerificationSource.get called for:",t);let r=this.getContext(),n=r?.requestContext;if(!n||!n.certPem||!n.issuerPem)throw new Error(`No certificate data provided for cache key: ${t}`);let{certPem:s,issuerPem:i,config:a}=n;Et.trace?.("Performing OCSP check with config:",a);try{let c=a?.timeout??Xo.timeout,l=await Promise.race([xde(s,i,c),new Promise((m,p)=>setTimeout(()=>p(new Error("OCSP timeout")),c))]);if(Et.debug?.("OCSP check result:",l),l.status==="unknown"&&(l.reason==="ocsp-error"||l.reason==="timeout"||l.reason==="no-ocsp-url")){let m=a?.failureMode??Xo.failureMode;if(Et.error?.("OCSP check failed:",l.reason),m==="fail-closed"){let p=a?.errorCacheTtl??Xo.errorCacheTtl,h=Date.now()+p;return r&&(r.expiresAt=h),{certificate_id:t,status:l.status,reason:l.reason,checked_at:Date.now(),expiresAt:h,method:"ocsp"}}else return Et.warn?.("OCSP check failed, allowing connection (fail-open mode)"),null}let d=a?.cacheTtl??Xo.cacheTtl,f=Date.now()+d;return r&&(r.expiresAt=f),{certificate_id:t,status:l.status,reason:l.reason,checked_at:Date.now(),expiresAt:f,method:"ocsp"}}catch(c){if(Et.error?.("OCSP verification error:",c),(a?.failureMode??Xo.failureMode)==="fail-closed"){let u=a?.errorCacheTtl??Xo.errorCacheTtl,d=Date.now()+u;return r&&(r.expiresAt=d),{certificate_id:t,status:"unknown",reason:c.message,checked_at:Date.now(),expiresAt:d,method:"ocsp"}}return Et.warn?.("OCSP check failed, allowing connection (fail-open mode)"),null}}},Xo={timeout:5e3,cacheTtl:36e5,errorCacheTtl:3e5,failureMode:"fail-open"};o(Mde,"getCertificateCacheTable");o(vde,"getCertificateVerificationConfig");o(Zd,"verifyCertificate");o(Ude,"verifyOCSP");o(xde,"performOCSPCheck");o(R1,"bufferToPem");o(Bde,"extractCertificateChain")});var Qo={};Re(Qo,{clearThisNodeName:()=>Yde,disableReplication:()=>qde,enabledDatabases:()=>dc,forEachReplicatedDatabase:()=>oc,getThisNodeId:()=>TT,getThisNodeName:()=>it,getThisNodeUrl:()=>ac,hostnameToUrl:()=>NT,lastTimeInAuditStore:()=>ih,monitorNodeCAs:()=>M1,replicateOperation:()=>zde,replicationCertificateAuthorities:()=>Jo,sendOperationToNode:()=>_h,servers:()=>kde,setReplicator:()=>U1,start:()=>Hde,startOnMainThread:()=>NC,subscribeToNode:()=>lh,unsubscribeFromNode:()=>oT,urlToNodeName:()=>Ti});function Hde(e){if(!e.port&&!e.securePort&&(e.port=$s.default.get(F.OPERATIONSAPI_NETWORK_PORT),e.securePort=$s.default.get(F.OPERATIONSAPI_NETWORK_SECUREPORT)),!it())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of ah(e))t.set(Ti(s.url),s);Gde(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=ve.ws(async(s,i,a,c)=>{if(wt.debug("Incoming WS connection received "+i.url),i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,a);s._socket.unref(),ph(s,e,a.then(()=>i?.user)),s.on("error",l=>{l.code!=="ECONNREFUSED"&&wt.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,ve.http(async(s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){wt.debug("Incoming replication WS connection received, authorized: "+s.authorized),!s.authorized&&s._nodeRequest.socket.authorizationError&&wt.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let a=Qt().primaryStore;if(s.authorized&&s.peerCertificate.subjectaltname){let c=(0,L1.getHostnamesFromCertificate)(s.peerCertificate),l;for(let u of c)if(l=u&&(a.get(u)||t.get(u)),l)break;if(l){let u=await Zd(s.peerCertificate,e);if(!u.valid){wt.warn("Certificate verification failed:",u.status,"for node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){wt.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l}else wt.warn(`No node found for certificate common name/SANs: ${c}, available nodes are ${Array.from(a.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=a.get(s.ip)||t.get(s.ip);c?s.user=c:wt.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...a.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=o(()=>{let a=new Set(s.secureContexts.values());s.defaultContext&&a.add(s.defaultContext);for(let c of a)try{let l=Array.from(Jo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=wT.createSecureContext(u)}catch(l){wt.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),$s.default.get(F.REPLICATION_ENABLEROOTCAS)!==!1&&i()}M1(()=>{for(let s of n)s()})}function M1(e){let t=0;Kd(r=>{r?.ca&&(Jo.add(r.ca),Jo.size!==t&&(t=Jo.size,e?.()))})}function qde(e=!0){D1=e}function Gde(e){D1||(ct(),dc=e.databases,oc(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||fc;for(let[s,i]of IT){let a=i.get(r);a&&(a.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];U1(r,s,e),jC.get(s)?.forEach(i=>i(s))}}))}function U1(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 v1 extends Hr{static{o(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||fc,a=i.get(e),c=a?.tableById||[];c[t.tableId]=t;let l=a?.ready;if(wt.trace("Setting up replicator subscription to database",e),!a?.auditStore)return this.subscription=a=new Xn,i.set(e,a),a.tableById=c,a.auditStore=t.auditStore,a.dbisDB=t.dbisDB,a.databaseName=e,l&&l(a),a;this.subscription=a}static subscribeOnThisThread(i,a){return!0}static async load(i){if(i){let a=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),a]);if(c){let l,u=new Set;do{let d,f="",m=1/0;for(let h of c){if(u.has(h)||h===ve.hostname)continue;let E=Vde(h,v1.subscription,e);if(E?.isConnected){let g=Vd(t.auditStore,e,h)[gT];(!d||g<m)&&(d=E,f=h,m=g)}}if(!d)throw l||new O1.ServerError(`No connection to any other nodes are available: ${c}`,502);let p={requestId:Fde++,table:t,entry:i,id:i.key};u.add(f);try{return await d.getRecord(p)}catch(h){if(d.isConnected)throw h;wt.warn("Error in load from node",$l,h),l||(l=h)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function $de(e,t,r,n,s){let i=IT.get(e);i||IT.set(e,i=new Map);let a=i.get(r);if(a)return a;if(t)return i.set(r,a=new Xd(e,t,r,n,s)),a.connect(),a.once("finished",()=>i.delete(r)),a}function Vde(e,t,r){let n=I1.get($l);n||(n=new Map,I1.set($l,n));let s=n.get(r);if(s)return s;let i=Qt().primaryStore.get(e);return i?.url&&(s=new Xd(i.url,t,r,$l,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function _h(e,t,r){r||(r={}),r.serverName=e.name;let n=await ST(e.url,r),s=ph(n,{},{});return new Promise((i,a)=>{n.on("open",()=>{wt.debug("Sending operation connection to "+e.url+" opened",t),i(s.sendOperation(t))}),n.on("error",c=>{a(c)}),n.on("close",c=>{wt.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function lh(e){try{P1.isMainThread&&wt.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=fc.get(e.database);if(!t){let n;t=new Promise(s=>{wt.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,fc.set(e.database,t)}let r=$de(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=>oh(n,e.database)),e.replicateByDefault)}catch(t){wt.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function oT({name:e,url:t,database:r}){wt.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(Qt().primaryStore.getRange({})));let n=IT.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Kde(){if(ZC!==void 0)return ZC;let e=$s.default.get(F.OPERATIONSAPI_TLS_CERTIFICATE)||$s.default.get(F.TLS_CERTIFICATE);if(e)return ZC=new N1.X509Certificate((0,C1.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function it(){return $l||($l=$s.default.get("replication_hostname")??Ti($s.default.get("replication_url"))??Kde()??w1("operationsapi_network_secureport")??w1("operationsapi_network_port")??"127.0.0.1")}function Yde(){$l=void 0}function w1(e){let t=$s.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function AT(e){let t=$s.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function TT(e){return sh(e)?.[it()]}function ac(){let e=$s.default.get("replication_url");return e||NT(it())}function NT(e){let t=AT("replication_port");if(t)return`ws://${e}:${t}`;if(t=AT("replication_secureport"),t)return`wss://${e}:${t}`;if(t=AT("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=AT("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function Ti(e){if(e)return new URL(e).hostname}function oc(e,t){for(let n of Object.getOwnPropertyNames(De))r(n);return Hp(n=>{r(n)}),Dl((n,s)=>{r(n.databaseName)});function r(n){let s=De[n];wt.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):Wde(n)&&t(s,n,!1)}o(r,"forDatabase")}function Wde(e){let t=De[e];for(let r in t)if(t[r].replicate)return!0}function ih(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function zde(e){let t={message:""};if(e.replicated){e.replicated=!1,wt.trace?.("Replicating operation",e.operation,"to nodes",ve.nodes.map(n=>n.name));let r=await Promise.allSettled(ve.nodes.map(n=>_h(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=ve.nodes[s]?.name,i})}return t}var $s,wt,N1,C1,wT,O1,P1,L1,D1,Fde,kde,Jo,dc,IT,I1,ZC,$l,hs=se(()=>{we();Ga();Ou();QC();Fr();$s=b(ce()),wt=b(Q()),N1=require("crypto");bT();C1=require("fs");uh();Yd();q();wC();wT=b(require("node:tls")),O1=b(_e()),P1=require("worker_threads"),L1=b(_s()),Fde=1,kde=[],Jo=$s.default.get(F.REPLICATION_ENABLEROOTCAS)!==!1?new Set(wT.rootCertificates):new Set;o(Hde,"start");o(M1,"monitorNodeCAs");o(qde,"disableReplication");o(Gde,"assignReplicationSource");o(U1,"setReplicator");IT=new Map;o($de,"getSubscriptionConnection");I1=new Map;o(Vde,"getRetrievalConnectionByName");o(_h,"sendOperationToNode");o(lh,"subscribeToNode");o(oT,"unsubscribeFromNode");o(Kde,"getCommonNameFromCert");o(it,"getThisNodeName");o(Yde,"clearThisNodeName");Object.defineProperty(ve,"hostname",{get(){return it()}});o(w1,"getHostFromListeningPort");o(AT,"getPortFromListeningPort");o(TT,"getThisNodeId");ve.replication={getThisNodeId:TT,exportIdMapping:sh};o(ac,"getThisNodeUrl");o(NT,"hostnameToUrl");o(Ti,"urlToNodeName");o(oc,"forEachReplicatedDatabase");o(Wde,"hasExplicitlyReplicatedTable");o(ih,"lastTimeInAuditStore");o(zde,"replicateOperation")});var Sh=v((z0e,H1)=>{"use strict";var ef=U$(),{validateBySchema:gh}=at(),{commonValidators:tf,schemaRegex:eO}=Wi(),_r=require("joi"),jde=Q(),Qde=require("uuid").v4,PT=qo(),rf=(q(),M(Y)),Jde=require("util"),mc=cs(),{handleHDBError:Zo,hdbErrors:Xde,ClientError:Vl}=_e(),{HDB_ERROR_MSGS:CT,HTTP_STATUS_CODES:ea}=Xde,{SchemaEventMsg:LT}=is(),x1=qt(),{getDatabases:Zde}=(we(),M(mt)),{transformReq:nf}=oe(),{replicateOperation:B1}=(hs(),M(Qo)),{cleanupOrphans:efe}=(es(),M(F_)),OT=_r.string().min(1).max(tf.schema_length.maximum).pattern(eO).messages({"string.pattern.base":"{:#label} "+tf.schema_format.message}),tfe=_r.string().min(1).max(tf.schema_length.maximum).pattern(eO).messages({"string.pattern.base":"{:#label} "+tf.schema_format.message}).required(),rfe=_r.string().min(1).max(tf.schema_length.maximum).pattern(eO).messages({"string.pattern.base":"{:#label} "+tf.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();H1.exports={createSchema:nfe,createSchemaStructure:F1,createTable:sfe,createTableStructure:k1,createAttribute:lfe,dropSchema:ife,dropTable:ofe,dropAttribute:afe,getBackup:ufe,cleanupOrphanBlobs:dfe};async function nfe(e){let t=await F1(e);return PT.signalSchemaChange(new LT(process.pid,e.operation,e.schema)),t}o(nfe,"createSchema");async function F1(e){let t=gh(e,_r.object({database:OT,schema:OT}));if(t)throw new Vl(t.message);if(nf(e),!await ef.checkSchemaExists(e.schema))throw Zo(new Error,CT.SCHEMA_EXISTS_ERR(e.schema),ea.BAD_REQUEST,rf.LOG_LEVELS.ERROR,CT.SCHEMA_EXISTS_ERR(e.schema),!0);return await mc.createSchema(e),`database '${e.schema}' successfully created`}o(F1,"createSchemaStructure");async function sfe(e){return nf(e),e.hash_attribute=e.primary_key??e.hash_attribute,await k1(e)}o(sfe,"createTable");async function k1(e){let t=gh(e,_r.object({database:OT,schema:OT,table:tfe,residence:_r.array().items(_r.string().min(1)).optional(),hash_attribute:rfe}));if(t)throw new Vl(t.message);if(!await ef.checkSchemaTableExists(e.schema,e.table))throw Zo(new Error,CT.TABLE_EXISTS_ERR(e.schema,e.table),ea.BAD_REQUEST,rf.LOG_LEVELS.ERROR,CT.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Qde(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await mc.createTable(n,e);else throw Zo(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",ea.BAD_REQUEST);else await mc.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}o(k1,"createTableStructure");async function ife(e){let t=gh(e,_r.object({database:_r.string(),schema:_r.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Vl(t.message);nf(e);let r=await ef.checkSchemaExists(e.schema);if(r)throw Zo(new Error,r,ea.NOT_FOUND,rf.LOG_LEVELS.ERROR,r,!0);let n=await ef.schemaDescribe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await mc.dropSchema(e),PT.signalSchemaChange(new LT(process.pid,e.operation,e.schema)),await x1.purgeSchemaTableStreams(e.schema,s);let i=await B1(e);return i.message=`successfully deleted '${e.schema}'`,i}o(ife,"dropSchema");async function ofe(e){let t=gh(e,_r.object({database:_r.string(),schema:_r.string(),table:_r.string().required()}));if(t)throw new Vl(t.message);nf(e);let r=await ef.checkSchemaTableExists(e.schema,e.table);if(r)throw Zo(new Error,r,ea.NOT_FOUND,rf.LOG_LEVELS.ERROR,r,!0);await mc.dropTable(e),await x1.purgeTableStream(e.schema,e.table);let n=await B1(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}o(ofe,"dropTable");async function afe(e){let t=gh(e,_r.object({database:_r.string(),schema:_r.string(),table:_r.string().required(),attribute:_r.string().required()}));if(t)throw new Vl(t.message);nf(e);let r=await ef.checkSchemaTableExists(e.schema,e.table);if(r)throw Zo(new Error,r,ea.NOT_FOUND,rf.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Zo(new Error,"You cannot drop a hash attribute",ea.BAD_REQUEST,void 0,void 0,!0);if(rf.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Zo(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,ea.BAD_REQUEST,void 0,void 0,!0);try{return await mc.dropAttribute(e),cfe(e),PT.signalSchemaChange(new LT(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw jde.error(`Got an error deleting attribute ${Jde.inspect(e)}.`),n}}o(afe,"dropAttribute");function cfe(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)}o(cfe,"dropAttributeFromGlobal");async function lfe(e){nf(e);let t=Zde()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Zo(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,ea.BAD_REQUEST,void 0,void 0,!0);return await mc.createAttribute(e),PT.signalSchemaChange(new LT(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}o(lfe,"createAttribute");function ufe(e){return mc.getBackup(e)}o(ufe,"getBackup");function dfe(e){if(!e.database)throw new Vl('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new Vl(`Unknown database '${e.database}'`);return efe(databases[e.database]),{message:"Orphaned blobs cleanup started, check logs for progress"}}o(dfe,"cleanupOrphanBlobs")});var G1=v((Q0e,q1)=>{"use strict";var{OPERATIONS_ENUM:ffe}=(q(),M(Y)),tO=class{static{o(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=ffe.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};q1.exports=tO});var rO=v((Z0e,W1)=>{"use strict";var mfe=cs(),X0e=G1(),DT=oe(),MT=(q(),M(Y)),pfe=ce(),{handleHDBError:$1,hdbErrors:hfe}=_e(),{HDB_ERROR_MSGS:V1,HTTP_STATUS_CODES:K1}=hfe,Efe=Object.values(MT.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),Y1="To use this operation audit log must be enabled in harperdb-config.yaml";W1.exports=_fe;async function _fe(e){if(DT.isEmpty(e.schema))throw new Error(V1.SCHEMA_REQUIRED_ERR);if(DT.isEmpty(e.table))throw new Error(V1.TABLE_REQUIRED_ERR);if(!pfe.get(MT.CONFIG_PARAMS.LOGGING_AUDITLOG))throw $1(new Error,Y1,K1.BAD_REQUEST,MT.LOG_LEVELS.ERROR,Y1,!0);let t=DT.checkSchemaTableExist(e.schema,e.table);if(t)throw $1(new Error,t,K1.NOT_FOUND,MT.LOG_LEVELS.ERROR,t,!0);if(!DT.isEmpty(e.search_type)&&Efe.indexOf(e.search_type)<0)throw new Error(`Invalid searchType '${read_audit_log_object.search_type}'`);return await mfe.readAuditLog(e)}o(_fe,"readAuditLog")});var j1=v((tBe,z1)=>{"use strict";var{OPERATIONS_ENUM:gfe}=(q(),M(Y)),nO=class{static{o(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=gfe.GET_BACKUP,this.schema=t,this.table=r}};z1.exports=nO});var X1=v((iBe,J1)=>{"use strict";var Sfe=cs(),nBe=j1(),sO=oe(),Tfe=(q(),M(Y)),sBe=ce(),{handleHDBError:yfe,hdbErrors:Rfe}=_e(),{HDB_ERROR_MSGS:Q1,HTTP_STATUS_CODES:bfe}=Rfe;J1.exports=Afe;async function Afe(e){if(sO.isEmpty(e.schema))throw new Error(Q1.SCHEMA_REQUIRED_ERR);if(sO.isEmpty(e.table))throw new Error(Q1.TABLE_REQUIRED_ERR);let t=sO.checkSchemaTableExist(e.schema,e.table);if(t)throw yfe(new Error,t,bfe.NOT_FOUND,Tfe.LOG_LEVELS.ERROR,t,!0);return await Sfe.getBackup(readAuditLogObject)}o(Afe,"getBackup")});var rK=v((aBe,tK)=>{"use strict";var Ife=ce(),pc=require("joi"),wfe=at(),Z1=require("moment"),Nfe=require("fs-extra"),iO=require("path"),Cfe=require("lodash"),Th=(q(),M(Y)),{LOG_LEVELS:Kl}=(q(),M(Y)),Ofe="YYYY-MM-DD hh:mm:ss",Pfe=iO.resolve(__dirname,"../logs");tK.exports=function(e){return wfe.validateBySchema(e,Lfe)};var Lfe=pc.object({from:pc.custom(eK),until:pc.custom(eK),level:pc.valid(Kl.NOTIFY,Kl.FATAL,Kl.ERROR,Kl.WARN,Kl.INFO,Kl.DEBUG,Kl.TRACE),order:pc.valid("asc","desc"),limit:pc.number().min(1),start:pc.number().min(0),log_name:pc.custom(Dfe)});function eK(e,t){if(Z1(e,Z1.ISO_8601).format(Ofe)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}o(eK,"validateDatetime");function Dfe(e,t){if(Cfe.invert(Th.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Ife.get(Th.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?Th.LOG_NAMES.HDB:e,i=s===Th.LOG_NAMES.INSTALL?iO.join(Pfe,Th.LOG_NAMES.INSTALL):iO.join(n,s);return Nfe.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}o(Dfe,"validateReadLogPath")});var aO=v((lBe,sK)=>{"use strict";var vT=(q(),M(Y)),Mfe=Q(),vfe=ce(),Ufe=rK(),oO=require("path"),nK=require("fs-extra"),{once:xfe}=require("events"),{handleHDBError:Bfe,hdbErrors:Ffe}=_e(),{PACKAGE_ROOT:kfe}=Ot(),{replicateOperation:Hfe}=(hs(),M(Qo)),qfe=oO.join(kfe,"logs"),Gfe=1e3,$fe=200;sK.exports=Vfe;async function Vfe(e){let t=Ufe(e);if(t)throw Bfe(t,t.message,Ffe.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=Hfe(e),n=vfe.get(vT.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e.log_name===void 0?vT.LOG_NAMES.HDB:e.log_name,i=s===vT.LOG_NAMES.INSTALL?oO.join(qfe,vT.LOG_NAMES.INSTALL):oO.join(n,s),a=e.level!==void 0,c=a?e.level:void 0,l=e.from!==void 0,u=l?new Date(e.from):void 0,d=e.until!==void 0,f=d?new Date(e.until):void 0,m=e.limit===void 0?Gfe:e.limit,p=e.order===void 0?void 0:e.order,h=e.start===void 0?0:e.start,E=h+m,g=0;p==="desc"&&!u&&!f&&(g=Math.max(nK.statSync(i).size-(E+5)*$fe,0));let R=nK.createReadStream(i,{start:g});R.on("error",G=>{Mfe.error(G)});let S=0,y=[],C="",I;R.on("data",G=>{let H=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;G=C+G;let X=0,z;for(;(z=H.exec(G))&&!R.destroyed;){I&&(I.message=G.slice(X,z.index),k(I));let[de,le,te]=z,ye=te.split("] ["),Ae=ye[0],Ye=ye[1];ye.splice(0,2),I={timestamp:le,thread:Ae,level:Ye,tags:ye,message:""},X=z.index+de.length}C=G.slice(X)}),R.on("end",G=>{R.destroyed||I&&(I.message=C.trim(),k(I))}),R.resume();function k(G){let H,X,z;switch(!0){case(a&&l&&d):H=new Date(G.timestamp),X=new Date(u),z=new Date(f),G.level===c&&H>=X&&H<=z&&S<h?S++:G.level===c&&H>=X&&H<=z&&(uo(G,p,y),S++,S===E&&R.destroy());break;case(a&&l):H=new Date(G.timestamp),X=new Date(u),G.level===c&&H>=X&&S<h?S++:G.level===c&&H>=X&&(uo(G,p,y),S++,S===E&&R.destroy());break;case(a&&d):H=new Date(G.timestamp),z=new Date(f),G.level===c&&H<=z&&S<h?S++:G.level===c&&H<=z&&(uo(G,p,y),S++,S===E&&R.destroy());break;case(l&&d):H=new Date(G.timestamp),X=new Date(u),z=new Date(f),H>=X&&H<=z&&S<h?S++:H>=X&&H<=z&&(uo(G,p,y),S++,S===E&&R.destroy());break;case a:G.level===c&&S<h?S++:G.level===c&&(uo(G,p,y),S++,S===E&&R.destroy());break;case l:H=new Date(G.timestamp),X=new Date(u),H>=X&&S<h?S++:H>=X&&S>=h&&(uo(G,p,y),S++,S===E&&R.destroy());break;case d:H=new Date(G.timestamp),z=new Date(f),H<=z&&S<h?S++:H<=z&&S>=h&&(uo(G,p,y),S++,S===E&&R.destroy());break;default:S<h?S++:(uo(G,p,y),S++,S===E&&R.destroy())}}o(k,"onLogMessage"),await xfe(R,"close");let J=await r;if(J.replicated){for(let G of y)G.node=server.hostname;for(let G of J.replicated){let H=G.node;if(G.status==="failed")uo({timestamp:new Date().toISOString(),level:"error",node:H,message:`Error retrieving logs: ${G.reason}`},p,y);else for(let X of G.results)X.node=H,uo(X,p,y)}}return y}o(Vfe,"readLog");function uo(e,t,r){t==="desc"?Kfe(e,r):t==="asc"?Yfe(e,r):r.push(e)}o(uo,"pushLineToResult");function Kfe(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)}o(Kfe,"insertDescending");function Yfe(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)}o(Yfe,"insertAscending")});var UT=v((hBe,cK)=>{"use strict";var cO=require("joi"),{string:sf,boolean:iK,date:Wfe}=cO.types(),zfe=at(),{validateSchemaExists:dBe,validateTableExists:fBe,validateSchemaName:mBe}=Wi(),jfe=(q(),M(Y)),Qfe=pt(),oK=ce();oK.initSync();var pBe=sf.invalid(oK.get(jfe.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Qfe.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),aK={operation:sf.valid("add_node","update_node","set_node_replication"),node_name:sf.optional(),subscriptions:cO.array().items({table:sf.optional(),schema:sf.optional(),database:sf.optional(),subscribe:iK.required(),publish:iK.required().custom(Xfe),start_time:Wfe.iso()})};function Jfe(e){return zfe.validateBySchema(e,cO.object(aK))}o(Jfe,"addUpdateNodeValidator");function Xfe(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`)}o(Xfe,"checkForFalsy");cK.exports={addUpdateNodeValidator:Jfe,validationSchema:aK}});var hc=v((_Be,lK)=>{"use strict";var lO=class{static{o(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},uO=class{static{o(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};lK.exports={Node:lO,NodeSubscription:uO}});var dK=v((SBe,uK)=>{"use strict";var Zfe=(q(),M(Y)).OPERATIONS_ENUM,dO=class{static{o(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Zfe.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};uK.exports=dO});var yh=v((yBe,fK)=>{"use strict";var fO=class{static{o(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},mO=class{static{o(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,a,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=a,c!==void 0&&(this.attributes=c)}};fK.exports={RemotePayloadObject:fO,RemotePayloadSubscription:mO}});var pK=v((bBe,mK)=>{"use strict";var pO=class{static{o(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,a=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=a}};mK.exports=pO});var EK=v((OBe,hK)=>{"use strict";var eme=pK(),IBe=Wt(),wBe=gt(),tme=Q(),{getSchemaPath:NBe,getTransactionAuditStorePath:CBe}=bt(),{getDatabases:rme}=(we(),M(mt));hK.exports=nme;async function nme(e){let t=new eme;try{let r=rme()[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){tme.warn(`unable to stat table dbi due to ${r}`)}return t}o(nme,"lmdbGetTableSize")});var gK=v((LBe,_K)=>{"use strict";var hO=class{static{o(this,"SystemInformationObject")}constructor(t,r,n,s,i,a,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=a,this.harperdb_processes=c}};_K.exports=hO});var bh=v((BBe,RK)=>{"use strict";var sme=require("fs-extra"),ime=require("path"),bn=require("systeminformation"),Ec=Q(),SK=qt(),MBe=pt(),of=(q(),M(Y)),ome=EK(),ame=ic(),{getThreadInfo:TK}=Ze(),Rh=ce();Rh.initSync();var cme=gK(),{openEnvironment:vBe}=gt(),{getSchemaPath:UBe}=bt(),{database:xBe,databases:EO}=(we(),M(mt)),xT;RK.exports={getHDBProcessInfo:TO,getNetworkInfo:RO,getDiskInfo:yO,getMemoryInfo:SO,getCPUInfo:gO,getTimeInfo:_O,getSystemInformation:bO,systemInformation:lme,getTableSize:AO,getMetrics:IO};function _O(){return bn.time()}o(_O,"getTimeInfo");async function gO(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:a,governor:c,socket:l,cache:u,...d}=await bn.cpu();d.cpu_speed=await bn.cpuCurrentSpeed();let{rawCurrentload:f,rawCurrentloadIdle:m,rawCurrentloadIrq:p,rawCurrentloadNice:h,rawCurrentloadSystem:E,rawCurrentloadUser:g,cpus:R,...S}=await bn.currentLoad();return S.cpus=[],R.forEach(y=>{let{rawLoad:C,rawLoadIdle:I,rawLoadIrq:k,rawLoadNice:J,rawLoadSystem:G,rawLoadUser:H,...X}=y;S.cpus.push(X)}),d.current_load=S,d}catch(e){return Ec.error(`error in getCPUInfo: ${e}`),{}}}o(gO,"getCPUInfo");async function SO(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await bn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return Ec.error(`error in getMemoryInfo: ${e}`),{}}}o(SO,"getMemoryInfo");async function TO(){let e={core:[],clustering:[]};try{let t=await bn.processes(),r;try{r=Number.parseInt(await sme.readFile(ime.join(Rh.get(of.CONFIG_PARAMS.ROOTPATH),of.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===of.NODE_ERROR_CODES.ENOENT)Ec.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 Ec.error(`error in getHDBProcessInfo: ${t}`),e}}o(TO,"getHDBProcessInfo");async function yO(){let e={};try{if(!Rh.get(of.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await bn.disksIO();e.io=i;let{rxSec:a,txSec:c,wxSec:l,...u}=await bn.fsStats();return e.read_write=u,e.size=await bn.fsSize(),e}catch(t){return Ec.error(`error in getDiskInfo: ${t}`),e}}o(yO,"getDiskInfo");async function RO(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Rh.get(of.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await bn.networkInterfaceDefault(),e.latency=await bn.inetChecksite("google.com"),(await bn.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:a,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrierChanges:f,...m}=n;e.interfaces.push(m)}),(await bn.networkStats()).forEach(n=>{let{rxSec:s,txSec:i,ms:a,...c}=n;e.stats.push(c)})),e}catch(t){return Ec.error(`error in getNetworkInfo: ${t}`),e}}o(RO,"getNetworkInfo");async function bO(){if(xT!==void 0)return xT;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:a,...c}=await bn.osInfo();e=c;let l=await bn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,xT=e,xT}catch(t){return Ec.error(`error in getSystemInformation: ${t}`),e}}o(bO,"getSystemInformation");async function AO(){let e=[],t=await ame.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await ome(n));return e}o(AO,"getTableSize");async function IO(){let e={};for(let t in EO){let r=e[t]={},n=r.tables={};for(let s in EO[t])try{let i=EO[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,f]=l.trim().split(" ");return{pid:u,thread:d,txnid:f}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}}let a=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=a[l];n[s]=c}catch(i){Ec.notify(`Error getting stats for table ${s}: ${i}`)}}return e}o(IO,"getMetrics");async function yK(){if(Rh.get(of.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await SK.getNATSReferences(),t=await SK.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 a={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(a)}return r}}o(yK,"getNatsStreamInfo");async function lme(e){let t=new cme;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await bO(),t.time=_O(),t.cpu=await gO(),t.memory=await SO(),t.disk=await yO(),t.network=await RO(),t.harperdb_processes=await TO(),t.table_size=await AO(),t.metrics=await IO(),t.threads=await TK(),t.replication=await yK(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await bO();break;case"time":t.time=_O();break;case"cpu":t.cpu=await gO();break;case"memory":t.memory=await SO();break;case"disk":t.disk=await yO();break;case"network":t.network=await RO();break;case"harperdb_processes":t.harperdb_processes=await TO();break;case"table_size":t.table_size=await AO();break;case"database_metrics":case"metrics":t.metrics=await IO();break;case"threads":t.threads=await TK();break;case"replication":t.replication=await yK();break;default:break}return t}o(lme,"systemInformation")});var Vs=v((GBe,wK)=>{"use strict";var ume=pn(),wO=oe(),dme=require("util"),Yl=(q(),M(Y)),bK=ce();bK.initSync();var fme=WN(),AK=En(),{Node:kBe,NodeSubscription:HBe}=hc(),mme=rd(),pme=dK(),{RemotePayloadObject:hme,RemotePayloadSubscription:Eme}=yh(),{handleHDBError:_me,hdbErrors:gme}=_e(),{HTTP_STATUS_CODES:Sme,HDB_ERROR_MSGS:Tme}=gme,yme=di(),Rme=bh(),{packageJson:bme}=Ot(),{getDatabases:Ame}=(we(),M(mt)),qBe=dme.promisify(fme.authorize),Ime=AK.searchByHash,wme=AK.searchByValue;wK.exports={isEmpty:Nme,getNodeRecord:Cme,upsertNodeRecord:Ome,buildNodePayloads:Pme,checkClusteringEnabled:Lme,getAllNodeRecords:Dme,getSystemInfo:Mme,reverseSubscription:IK};function Nme(e){return e==null}o(Nme,"isEmpty");async function Cme(e){let t=new mme(Yl.SYSTEM_SCHEMA_NAME,Yl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Ime(t)}o(Cme,"getNodeRecord");async function Ome(e){let t=new pme(Yl.SYSTEM_SCHEMA_NAME,Yl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return ume.upsert(t)}o(Ome,"upsertNodeRecord");function IK(e){if(wO.isEmpty(e.subscribe)||wO.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}o(IK,"reverseSubscription");function Pme(e,t,r,n){let s=[];for(let i=0,a=e.length;i<a;i++){let c=e[i],{schema:l,table:u}=c,d=wO.getTableHashAttribute(l,u),{subscribe:f,publish:m}=IK(c),p=Ame()[l]?.[u],h=new Eme(l,u,d,m,f,c.start_time,p.schemaDefined?p.attributes:void 0);s.push(h)}return new hme(r,t,s,n)}o(Pme,"buildNodePayloads");function Lme(){if(!bK.get(Yl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw _me(new Error,Tme.CLUSTERING_NOT_ENABLED,Sme.BAD_REQUEST,void 0,void 0,!0)}o(Lme,"checkClusteringEnabled");async function Dme(){let e=new yme(Yl.SYSTEM_SCHEMA_NAME,Yl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await wme(e))}o(Dme,"getAllNodeRecords");async function Mme(){let e=await Rme.getSystemInformation();return{hdb_version:bme.version,node_version:e.node_version,platform:e.platform}}o(Mme,"getSystemInfo")});var NO=v((VBe,vK)=>{"use strict";var BT=qt(),NK=oe(),CK=pt(),OK=(q(),M(Y)),FT=Q(),PK=Sh(),vme=sd(),{RemotePayloadObject:Ume}=yh(),{handleHDBError:LK,hdbErrors:xme}=_e(),{HTTP_STATUS_CODES:DK}=xme,{NodeSubscription:MK}=hc();vK.exports=Bme;async function Bme(e,t){let r;try{r=await BT.request(`${t}.${CK.REQUEST_SUFFIX}`,new Ume(OK.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),FT.trace("Response from remote describe all request:",r)}catch(a){FT.error(`addNode received error from describe all request to remote node: ${a}`);let c=BT.requestErrorHandler(a,"add_node",t);throw LK(new Error,c,DK.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===CK.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let a=`Error returned from remote node ${t}: ${r.message}`;throw LK(new Error,a,DK.INTERNAL_SERVER_ERROR,"error",a)}let n=r.message,s=[],i=[];for(let a of e){let{table:c}=a,l=a.database??a.schema??"data";if(l===OK.SYSTEM_SCHEMA_NAME){await BT.createLocalTableStream(l,c);let h=new MK(l,c,a.publish,a.subscribe);h.start_time=a.start_time,i.push(h);continue}let u=NK.doesSchemaExist(l),d=n[l]!==void 0,f=c?NK.doesTableExist(l,c):!0,m=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!f&&!m){s.push(a);continue}if(!u&&d&&(FT.trace(`addNode creating schema: ${l}`),await PK.createSchema({operation:"create_schema",schema:l})),!f&&m){FT.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let h=new vme(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(h.attributes=n[l][c].attributes),await PK.createTable(h)}await BT.createLocalTableStream(l,c);let p=new MK(l,c,a.publish,a.subscribe);p.start_time=a.start_time,i.push(p)}return{added:i,skipped:s}}o(Bme,"reviewSubscriptions")});var af={};Re(af,{addNodeBack:()=>CO,removeNodeBack:()=>OO,setNode:()=>qme});async function qme(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=Ti(t)):t=NT(r);let n=(0,xK.validateBySchema)(e,Hme);if(n)throw(0,ta.handleHDBError)(n,n.message,kme.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new ta.ClientError("url or hostname is required for remove_node operation");let p=r,h=Qt(),E=await h.get(p);if(!E)throw new ta.ClientError(p+" does not exist");try{await _h({url:E.url},{operation:V.REMOVE_NODE_BACK,name:E?.subscriptions?.length>0?it():p},void 0)}catch(g){gs.warn(`Error removing node from target node ${p}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,g)}return await h.delete(p),`Successfully removed '${p}' from cluster`}if(!t)throw new ta.ClientError("url required for this operation");let s=ac();if(s==null)throw new ta.ClientError("replication url is missing from harperdb-config.yaml");let i,a,c;if(t?.startsWith("wss:")){i=await(0,Ks.getReplicationCert)();let p=await(0,Ks.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(a=await(0,Ks.createCsr)(),gs.info("Sending CSR to target node:",t)):p&&(c=p.certificate,gs.info("Sending CA named",p.name,"to target node",t))}let l={operation:V.ADD_NODE_BACK,hostname:(0,gc.get)(F.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:a,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,gc.get)(F.REPLICATION_SHARD)!==void 0&&(l.shard=(0,gc.get)(F.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(UK):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let p=UK(e);l.subscribe=p.subscribe,l.publish=p.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 _h({url:t},l,e)}catch(p){p.message=`Error returned from ${t}: `+p.message,gs.warn("Error adding node:",t,"to cluster:",p),d=p}if(a&&(!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)}`);a&&(gs.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ks.setCertTable)({name:Fme.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ks.setCertTable)({name:it(),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 f={url:t,ca:u?.usingCA};if(e.hostname&&(f.name=e.hostname),e.subscriptions?f.subscriptions=e.subscriptions:f.replicates=!0,e.start_time&&(f.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(f.authorization=e.authorization),e.revoked_certificates&&(f.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?f.shard=u.shard:e.shard!==void 0&&(f.shard=e.shard),f.replicates){let p={url:s,ca:c,replicates:!0,subscriptions:null};(0,gc.get)(F.REPLICATION_SHARD)!==void 0&&(p.shard=(0,gc.get)(F.REPLICATION_SHARD)),e.retain_authorization&&(p.authorization=e.authorization),e.start_time&&(p.start_time=e.start_time),await zo(it(),p)}await zo(u?u.nodeName:f.name??Ti(t),f);let m;return e.operation==="update_node"?m=`Successfully updated '${t}'`:m=`Successfully added '${t}' to cluster`,d&&(m+=" but there was an error updating target node: "+d.message),m}async function CO(e){gs.trace("addNodeBack received request:",e);let t=await(0,Ks.signCertificate)(e),r;e.csr?(r=t.signingCA,gs.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,gs.info("addNodeBack received CA from node:",e.url));let n={url:e.url,ca:r};e.subscriptions?n.subscriptions=e.subscriptions:(n.replicates=!0,n.subscriptions=null),e.start_time&&(n.start_time=e.start_time),e.authorization&&(n.authorization=e.authorization),e.shard!==void 0&&(n.shard=e.shard);let s=await(0,Ks.getReplicationCertAuth)();if(n.replicates){let i={url:ac(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,gc.get)(F.REPLICATION_SHARD)!==void 0&&(i.shard=(0,gc.get)(F.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await zo(it(),i)}return await zo(e.hostname,n),t.nodeName=it(),t.usingCA=s?.certificate,gs.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function OO(e){gs.trace("removeNodeBack received request:",e),await Qt().delete(e.name)}function UK(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ks,xK,_c,gc,gs,ta,Fme,kme,Hme,cf=se(()=>{Ks=b(_s()),xK=b(at()),_c=b(require("joi")),gc=b(ce());q();uh();Yd();hs();gs=b(Q()),ta=b(_e()),{pki:Fme}=require("node-forge"),{HTTP_STATUS_CODES:kme}=ta.hdbErrors,Hme=_c.default.object({hostname:_c.default.string(),verify_tls:_c.default.boolean(),replicates:_c.default.boolean(),subscriptions:_c.default.array(),revoked_certificates:_c.default.array(),shard:_c.default.number()});o(qme,"setNode");o(CO,"addNodeBack");o(OO,"removeNodeBack");o(UK,"reverseSubscription")});var $T=v((ZBe,FK)=>{"use strict";var{handleHDBError:kT,hdbErrors:Gme}=_e(),{HTTP_STATUS_CODES:HT}=Gme,{addUpdateNodeValidator:$me}=UT(),qT=Q(),GT=(q(),M(Y)),BK=pt(),Vme=oe(),Ah=qt(),Ih=Vs(),PO=ce(),Kme=NO(),{Node:Yme,NodeSubscription:Wme}=hc(),{broadcast:zme}=Ze(),{setNode:jme}=(cf(),M(af)),JBe=ce(),XBe=(q(),M(Y)),Qme="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Jme="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Xme=PO.get(GT.CONFIG_PARAMS.CLUSTERING_NODENAME);FK.exports=Zme;async function Zme(e,t=!1){if(qT.trace("addNode called with:",e),PO.get(GT.CONFIG_PARAMS.REPLICATION_URL)||PO.get(GT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return jme(e);Ih.checkClusteringEnabled();let r=$me(e);if(r)throw kT(r,r.message,HT.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let f=await Ih.getNodeRecord(n);if(!Vme.isEmptyOrZeroLength(f))throw kT(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,HT.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Kme(e.subscriptions,n),a={message:void 0,added:s,skipped:i};if(s.length===0)return a.message=Qme,a;let c=Ih.buildNodePayloads(s,Xme,GT.OPERATIONS_ENUM.ADD_NODE,await Ih.getSystemInfo()),l=[];for(let f=0,m=s.length;f<m;f++){let p=s[f];s[f].start_time===void 0&&delete s[f].start_time,l.push(new Wme(p.schema,p.table,p.publish,p.subscribe))}qT.trace("addNode sending remote payload:",c);let u;try{u=await Ah.request(`${n}.${BK.REQUEST_SUFFIX}`,c)}catch(f){qT.error(`addNode received error from request: ${f}`);for(let p=0,h=s.length;p<h;p++){let E=s[p];E.publish=!1,E.subscribe=!1,await Ah.updateRemoteConsumer(E,n)}let m=Ah.requestErrorHandler(f,"add_node",n);throw kT(new Error,m,HT.INTERNAL_SERVER_ERROR,"error",m)}if(u.status===BK.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${n}: ${u.message}`;throw kT(new Error,f,HT.INTERNAL_SERVER_ERROR,"error",f)}qT.trace(u);for(let f=0,m=s.length;f<m;f++){let p=s[f];await Ah.updateRemoteConsumer(p,n),p.subscribe===!0&&await Ah.updateConsumerIterator(p.schema,p.table,n,"start")}let d=new Yme(n,l,u.system_info);return await Ih.upsertNodeRecord(d),zme({type:"nats_update"}),i.length>0?a.message=Jme:a.message=`Successfully added '${n}' to manifest`,a}o(Zme,"addNode")});var vO=v((rFe,HK)=>{"use strict";var{handleHDBError:LO,hdbErrors:epe}=_e(),{HTTP_STATUS_CODES:DO}=epe,{addUpdateNodeValidator:tpe}=UT(),wh=Q(),VT=(q(),M(Y)),kK=pt(),tFe=oe(),Nh=qt(),Ch=Vs(),MO=ce(),{cloneDeep:rpe}=require("lodash"),npe=NO(),{Node:spe,NodeSubscription:ipe}=hc(),{broadcast:ope}=Ze(),{setNode:ape}=(cf(),M(af)),cpe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",lpe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",upe=MO.get(VT.CONFIG_PARAMS.CLUSTERING_NODENAME);HK.exports=dpe;async function dpe(e){if(wh.trace("updateNode called with:",e),MO.get(VT.CONFIG_PARAMS.REPLICATION_URL)??MO.get(VT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return ape(e);Ch.checkClusteringEnabled();let t=tpe(e);if(t)throw LO(t,t.message,DO.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await Ch.getNodeRecord(r);s.length>0&&(n=rpe(s));let{added:i,skipped:a}=await npe(e.subscriptions,r),c={message:void 0,updated:i,skipped:a};if(i.length===0)return c.message=cpe,c;let l=Ch.buildNodePayloads(i,upe,VT.OPERATIONS_ENUM.UPDATE_NODE,await Ch.getSystemInfo());for(let d=0,f=i.length;d<f;d++){let m=i[d];wh.trace(`updateNode updating work stream for node: ${r} subscription:`,m),i[d].start_time===void 0&&delete i[d].start_time}wh.trace("updateNode sending remote payload:",l);let u;try{u=await Nh.request(`${r}.${kK.REQUEST_SUFFIX}`,l)}catch(d){wh.error(`updateNode received error from request: ${d}`);let f=Nh.requestErrorHandler(d,"update_node",r);throw LO(new Error,f,DO.INTERNAL_SERVER_ERROR,"error",f)}if(u.status===kK.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw LO(new Error,d,DO.INTERNAL_SERVER_ERROR,"error",d)}wh.trace(u);for(let d=0,f=i.length;d<f;d++){let m=i[d];await Nh.updateRemoteConsumer(m,r),m.subscribe===!0?await Nh.updateConsumerIterator(m.schema,m.table,r,"start"):await Nh.updateConsumerIterator(m.schema,m.table,r,"stop")}return n||(n=[new spe(r,[],u.system_info)]),await fpe(n[0],i,u.system_info),a.length>0?c.message=lpe:c.message=`Successfully updated '${r}'`,c}o(dpe,"updateNode");async function fpe(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let a=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let d=n.subscriptions[l];if(d.schema===a.schema&&d.table===a.table){d.publish=a.publish,d.subscribe=a.subscribe,c=!0;break}}c||n.subscriptions.push(new ipe(a.schema,a.table,a.publish,a.subscribe))}n.system_info=r,await Ch.upsertNodeRecord(n),ope({type:"nats_update"})}o(fpe,"updateNodeTable")});var KK=v((sFe,VK)=>{"use strict";var $K=require("joi"),{string:qK}=$K.types(),mpe=at(),GK=(q(),M(Y)),ppe=ce(),hpe=pt();VK.exports=Epe;function Epe(e){let t=qK.invalid(ppe.get(GK.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(hpe.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=$K.object({operation:qK.valid(GK.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return mpe.validateBySchema(e,r)}o(Epe,"removeNodeValidator")});var KT=v((oFe,QK)=>{"use strict";var{handleHDBError:YK,hdbErrors:_pe}=_e(),{HTTP_STATUS_CODES:WK}=_pe,gpe=KK(),Oh=Q(),zK=Vs(),Spe=oe(),lf=(q(),M(Y)),jK=pt(),UO=qt(),xO=ce(),{RemotePayloadObject:Tpe}=yh(),{NodeSubscription:ype}=hc(),Rpe=nd(),bpe=Qa(),{broadcast:Ape}=Ze(),{setNode:Ipe}=(cf(),M(af)),wpe=xO.get(lf.CONFIG_PARAMS.CLUSTERING_NODENAME);QK.exports=Npe;async function Npe(e){if(Oh.trace("removeNode called with:",e),xO.get(lf.CONFIG_PARAMS.REPLICATION_URL)??xO.get(lf.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Ipe(e);zK.checkClusteringEnabled();let t=gpe(e);if(t)throw YK(t,t.message,WK.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await zK.getNodeRecord(r);if(Spe.isEmptyOrZeroLength(n))throw YK(new Error,`Node '${r}' was not found.`,WK.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new Tpe(lf.OPERATIONS_ENUM.REMOVE_NODE,wpe,[]),i,a=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await UO.updateConsumerIterator(d.schema,d.table,r,"stop");try{await UO.updateRemoteConsumer(new ype(d.schema,d.table,!1,!1),r)}catch(f){Oh.error(f)}}try{i=await UO.request(`${r}.${jK.REQUEST_SUFFIX}`,s),Oh.trace("Remove node reply from remote node:",r,i)}catch(l){Oh.error("removeNode received error from request:",l),a=!0}let c=new Rpe(lf.SYSTEM_SCHEMA_NAME,lf.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await bpe.deleteRecord(c),Ape({type:"nats_update"}),i?.status===jK.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||a?(Oh.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`}o(Npe,"removeNode")});var ZK=v((cFe,XK)=>{"use strict";var JK=require("joi"),{string:Cpe,array:Ope}=JK.types(),Ppe=at(),Lpe=UT();XK.exports=Dpe;function Dpe(e){let t=JK.object({operation:Cpe.valid("configure_cluster").required(),connections:Ope.items(Lpe.validationSchema).required()});return Ppe.validateBySchema(e,t)}o(Dpe,"configureClusterValidator")});var BO=v((uFe,sY)=>{"use strict";var eY=(q(),M(Y)),YT=Q(),Mpe=oe(),vpe=ce(),Upe=KT(),xpe=$T(),Bpe=Vs(),Fpe=ZK(),{handleHDBError:tY,hdbErrors:kpe}=_e(),{HTTP_STATUS_CODES:rY}=kpe,Hpe="Configure cluster complete.",qpe="Failed to configure the cluster. Check the logs for more details.",Gpe="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";sY.exports=$pe;async function $pe(e){YT.trace("configure cluster called with:",e);let t=Fpe(e);if(t)throw tY(t,t.message,rY.BAD_REQUEST,void 0,void 0,!0);let r=await Bpe.getAllNodeRecords(),n=[];if(vpe.get(eY.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,f=r.length;d<f;d++){let m=await nY(Upe,{operation:eY.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(m)}YT.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let f=e.connections[d],m=await nY(xpe,f,f.node_name);s.push(m)}YT.trace("All results from configure_cluster add node:",s);let a=[],c=[],l=!1,u=n.concat(s);for(let d=0,f=u.length;d<f;d++){let m=u[d];m.status==="rejected"&&(YT.error(m.node_name,m?.error?.message,m?.error?.stack),a.includes(m.node_name)||a.push(m.node_name)),(m?.result?.message?.includes?.("Successfully")||m?.result?.includes?.("Successfully"))&&(l=!0),!(typeof m.result=="string"&&m.result.includes("Successfully removed")||m.status==="rejected")&&c.push({node_name:m?.node_name,response:m?.result})}if(Mpe.isEmptyOrZeroLength(a))return{message:Hpe,connections:c};if(l)return{message:Gpe,failed_nodes:a,connections:c};throw tY(new Error,qpe,rY.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}o($pe,"configureCluster");async function nY(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}o(nY,"functionWrapper")});var cY=v((fFe,aY)=>{"use strict";var Ph=require("joi"),Vpe=at(),{validateSchemaExists:iY,validateTableExists:Kpe,validateSchemaName:oY}=Wi(),Ype=Ph.object({operation:Ph.string().valid("purge_stream"),schema:Ph.string().custom(iY).custom(oY).optional(),database:Ph.string().custom(iY).custom(oY).optional(),table:Ph.string().custom(Kpe).required()});function Wpe(e){return Vpe.validateBySchema(e,Ype)}o(Wpe,"purgeStreamValidator");aY.exports=Wpe});var FO=v((pFe,lY)=>{"use strict";var{handleHDBError:zpe,hdbErrors:jpe}=_e(),{HTTP_STATUS_CODES:Qpe}=jpe,Jpe=cY(),Xpe=qt(),Zpe=Vs();lY.exports=ehe;async function ehe(e){e.schema=e.schema??e.database;let t=Jpe(e);if(t)throw zpe(t,t.message,Qpe.BAD_REQUEST,void 0,void 0,!0);Zpe.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Xpe.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}o(ehe,"purgeStream")});var qO=v((EFe,_Y)=>{"use strict";var HO=Vs(),the=qt(),zT=ce(),uf=(q(),M(Y)),Wl=pt(),rhe=oe(),kO=Q(),{RemotePayloadObject:nhe}=yh(),{ErrorCode:uY}=require("nats"),{parentPort:dY}=require("worker_threads"),{onMessageByType:she}=Ze(),{getThisNodeName:ihe}=(hs(),M(Qo)),{requestClusterStatus:ohe}=(uh(),M(AV)),{getReplicationSharedStatus:ahe,getHDBNodeTable:che}=(Yd(),M(SV)),{CONFIRMATION_STATUS_POSITION:lhe,RECEIVED_VERSION_POSITION:fY,RECEIVED_TIME_POSITION:uhe,SENDING_TIME_POSITION:dhe,RECEIVING_STATUS_POSITION:fhe,RECEIVING_STATUS_RECEIVING:mhe,BACK_PRESSURE_RATIO_POSITION:phe}=(QC(),M(E1)),mY=zT.get(uf.CONFIG_PARAMS.CLUSTERING_ENABLED),pY=zT.get(uf.CONFIG_PARAMS.CLUSTERING_NODENAME);_Y.exports={clusterStatus:hhe,buildNodeStatus:EY};var hY;she("cluster-status",async e=>{hY(e)});async function hhe(){if(zT.get(uf.CONFIG_PARAMS.REPLICATION_URL)||zT.get(uf.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(dY){dY.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{hY=i});for(let i of n.connections){let a=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let f of Object.values(databases[l]||{}))if(u=f.auditStore,u)break;if(!u)continue;let d=ahe(u,l,a);c.lastCommitConfirmed=WT(d[lhe]),c.lastReceivedRemoteTime=WT(d[fY]),c.lastReceivedLocalTime=WT(d[uhe]),c.lastReceivedVersion=d[fY],c.sendingMessage=WT(d[dhe]),c.backPressurePercent=d[phe]*100,c.lastReceivedStatus=d[fhe]===mhe?"Receiving":"Waiting"}}}else n=ohe();n.node_name=ihe();let s=che().primaryStore.get(n.node_name);return s?.shard&&(n.shard=s.shard),s?.url&&(n.url=s.url),n.is_enabled=!0,n}let e={node_name:pY,is_enabled:mY,connections:[]};if(!mY)return e;let t=await HO.getAllNodeRecords();if(rhe.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(EY(t[n],e.connections));return await Promise.allSettled(r),e}o(hhe,"clusterStatus");function WT(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}o(WT,"asDate");async function EY(e,t){let r=e.name,n=new nhe(uf.OPERATIONS_ENUM.CLUSTER_STATUS,pY,void 0,await HO.getSystemInfo()),s,i,a=Wl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await the.request(Wl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Wl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(a=Wl.CLUSTER_STATUS_STATUSES.CLOSED,kO.error(`Error getting node status from ${r} `,s))}catch(l){kO.warn(`Error getting node status from ${r}`,l),l.code===uY.NoResponders?a=Wl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===uY.Timeout?a=Wl.CLUSTER_STATUS_STATUSES.TIMEOUT:a=Wl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Ehe(r,a,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!==uf.PRE_4_0_0_VERSION&&await HO.upsertNodeRecord(l)}catch(l){kO.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}o(EY,"buildNodeStatus");function Ehe(e,t,r,n,s,i,a,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=a,this.system_info=c}o(Ehe,"NodeStatusObject")});var $O=v((gFe,gY)=>{"use strict";var{handleHDBError:_he,hdbErrors:ghe}=_e(),{HTTP_STATUS_CODES:She}=ghe,The=qt(),yhe=Vs(),GO=oe(),jT=require("joi"),Rhe=at(),bhe=2e3,Ahe=jT.object({timeout:jT.number().min(1),connected_nodes:jT.boolean(),routes:jT.boolean()});gY.exports=Ihe;async function Ihe(e){yhe.checkClusteringEnabled();let t=Rhe.validateBySchema(e,Ahe);if(t)throw _he(t,t.message,She.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||GO.autoCastBoolean(n),a=s===void 0||GO.autoCastBoolean(s),c={nodes:[]},l=await The.getServerList(r??bhe),u={};if(i)for(let d=0,f=l.length;d<f;d++){let m=l[d].statsz;m&&(u[l[d].server.name]=m.routes)}for(let d=0,f=l.length;d<f;d++){if(l[d].statsz)continue;let m=l[d].server,p=l[d].data;if(m.name.endsWith("-hub")){let h={name:m.name.slice(0,-4),response_time:l[d].response_time};i&&(h.connected_nodes=[],u[m.name]&&u[m.name].forEach(E=>{h.connected_nodes.includes(E.name.slice(0,-4))||h.connected_nodes.push(E.name.slice(0,-4))})),a&&(h.routes=p.cluster?.urls?p.cluster?.urls.map(E=>({host:E.split(":")[0],port:GO.autoCast(E.split(":")[1])})):[]),c.nodes.push(h)}}return c}o(Ihe,"clusterNetwork")});var RY=v((TFe,yY)=>{"use strict";var VO=require("joi"),SY=at(),{routeConstraints:TY}=kw();yY.exports={setRoutesValidator:whe,deleteRoutesValidator:Nhe};function whe(e){let t=VO.object({server:VO.valid("hub","leaf"),routes:TY.required()});return SY.validateBySchema(e,t)}o(whe,"setRoutesValidator");function Nhe(e){let t=VO.object({routes:TY.required()});return SY.validateBySchema(e,t)}o(Nhe,"deleteRoutesValidator")});var QT=v((RFe,OY)=>{"use strict";var ra=Tt(),KO=oe(),Ys=(q(),M(Y)),df=ce(),bY=RY(),{handleHDBError:AY,hdbErrors:Che}=_e(),{HTTP_STATUS_CODES:IY}=Che,wY="cluster routes successfully set",NY="cluster routes successfully deleted";OY.exports={setRoutes:Phe,getRoutes:Lhe,deleteRoutes:Dhe};function Ohe(e){let t=ra.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 a=0,c=e.routes.length;a<c;a++){let l=e.routes[a];l.port=KO.autoCast(l.port);let u=r.some(f=>f.host===l.host&&f.port===l.port),d=n.some(f=>f.host===l.host&&f.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?ra.updateConfigValue(Ys.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):ra.updateConfigValue(Ys.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:wY,set:i,skipped:s}}o(Ohe,"setRoutesNats");function Phe(e){let t=bY.setRoutesValidator(e);if(t)throw AY(t,t.message,IY.BAD_REQUEST,void 0,void 0,!0);if(df.get(Ys.CONFIG_PARAMS.CLUSTERING_ENABLED))return Ohe(e);let r=[],n=[],s=df.get(Ys.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{CY(s,i)?n.push(i):(s.push(i),r.push(i))}),ra.updateConfigValue(Ys.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:wY,set:r,skipped:n}}o(Phe,"setRoutes");function CY(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}o(CY,"existsInArray");function Lhe(){if(df.get(Ys.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=ra.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return df.get(Ys.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}o(Lhe,"getRoutes");function Dhe(e){let t=bY.deleteRoutesValidator(e);if(t)throw AY(t,t.message,IY.BAD_REQUEST,void 0,void 0,!0);if(df.get(Ys.CONFIG_PARAMS.CLUSTERING_ENABLED))return Mhe(e);let r=[],n=[],s=df.get(Ys.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(a=>{CY(e.routes,a)?r.push(a):(i.push(a),n.push(a))}),ra.updateConfigValue(Ys.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:NY,deleted:r,skipped:n}}o(Dhe,"deleteRoutes");function Mhe(e){let t=ra.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],a=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let d=e.routes[l],f=!1;for(let m=0,p=r.length;m<p;m++){let h=r[m];if(d.host===h.host&&d.port===h.port){r.splice(m,1),f=!0,a=!0,s.push(d);break}}if(!f){let m=!0;for(let p=0,h=n.length;p<h;p++){let E=n[p];if(d.host===E.host&&d.port===E.port){n.splice(p,1),c=!0,m=!1,s.push(d);break}}m&&i.push(d)}}return a&&(r=KO.isEmptyOrZeroLength(r)?null:r,ra.updateConfigValue(Ys.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=KO.isEmptyOrZeroLength(n)?null:n,ra.updateConfigValue(Ys.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:NY,deleted:s,skipped:i}}o(Mhe,"deleteRoutesNats")});var LY=v((AFe,PY)=>{"use strict";var vhe=pt(),YO=class{static{o(this,"HubConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f,m,p,h){this.port=t,a===null&&(a=void 0),this.server_name=r+vhe.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:a,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c}},this.cluster={name:d,port:f,routes:m,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l}},this.accounts={SYS:{users:p},HDB:{users:h}},this.system_account="SYS"}};PY.exports=YO});var vY=v((wFe,MY)=>{"use strict";var DY=pt(),WO=class{static{o(this,"LeafConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f){this.port=t,f===null&&(f=void 0),this.server_name=r+DY.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+DY.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:d,ca_file:f,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:f,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:f,insecure:!0},urls:a,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};MY.exports=WO});var xY=v((CFe,UY)=>{"use strict";var zO=class{static{o(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};UY.exports=zO});var FY=v((PFe,BY)=>{"use strict";var Uhe=pt(),jO=class{static{o(this,"SysUserObject")}constructor(t,r){this.user=t+Uhe.SERVER_SUFFIX.ADMIN,this.password=r}};BY.exports=jO});var ey=v((DFe,qY)=>{"use strict";var zl=require("path"),jl=require("fs-extra"),xhe=LY(),Bhe=vY(),Fhe=xY(),khe=FY(),QO=fs(),mf=oe(),Kn=Tt(),XT=(q(),M(Y)),Lh=pt(),{CONFIG_PARAMS:or}=XT,pf=Q(),Dh=ce(),kY=Zi(),JO=qt(),Hhe=_s(),ff="clustering",qhe=1e4,HY=50;qY.exports={generateNatsConfig:$he,removeNatsConfig:Vhe,getHubConfigPath:Ghe};function Ghe(){let e=Dh.get(or.ROOTPATH);return zl.join(e,ff,Lh.NATS_CONFIG_FILES.HUB_SERVER)}o(Ghe,"getHubConfigPath");async function $he(e=!1,t=void 0){console.error("Warning: NATS replication is deprecated and will be removed in version 5.0 of Harper");let r=Dh.get(or.ROOTPATH);jl.ensureDirSync(zl.join(r,"clustering","leaf")),Dh.initSync();let n=Kn.getConfigFromFile(or.CLUSTERING_TLS_CERT_AUTH),s=Kn.getConfigFromFile(or.CLUSTERING_TLS_PRIVATEKEY),i=Kn.getConfigFromFile(or.CLUSTERING_TLS_CERTIFICATE);!await jl.exists(i)&&!await jl.exists(!n)&&await Hhe.createNatsCerts();let a=zl.join(r,ff,Lh.PID_FILES.HUB),c=zl.join(r,ff,Lh.PID_FILES.LEAF),l=Kn.getConfigFromFile(or.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=zl.join(r,ff,Lh.NATS_CONFIG_FILES.HUB_SERVER),d=zl.join(r,ff,Lh.NATS_CONFIG_FILES.LEAF_SERVER),f=Kn.getConfigFromFile(or.CLUSTERING_TLS_INSECURE),m=Kn.getConfigFromFile(or.CLUSTERING_TLS_VERIFY),p=Kn.getConfigFromFile(or.CLUSTERING_NODENAME),h=Kn.getConfigFromFile(or.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await JO.checkNATSServerInstalled()||ZT("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let E=await QO.listUsers(),g=Kn.getConfigFromFile(or.CLUSTERING_USER),R=await QO.getClusterUser();(mf.isEmpty(R)||R.active!==!0)&&ZT(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await JT(or.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await JT(or.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await JT(or.CLUSTERING_HUBSERVER_NETWORK_PORT),await JT(or.CLUSTERING_LEAFSERVER_NETWORK_PORT));let S=[],y=[];for(let[X,z]of E.entries())z.role?.role===XT.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(S.push(new khe(z.username,kY.decrypt(z.hash))),y.push(new Fhe(z.username,kY.decrypt(z.hash))));let C=[],{hub_routes:I}=Kn.getClusteringRoutes();if(!mf.isEmptyOrZeroLength(I))for(let X of I)C.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${X.host}:${X.port}`);let k=new xhe(Kn.getConfigFromFile(or.CLUSTERING_HUBSERVER_NETWORK_PORT),p,a,i,s,n,f,m,h,Kn.getConfigFromFile(or.CLUSTERING_HUBSERVER_CLUSTER_NAME),Kn.getConfigFromFile(or.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),C,S,y);n==null&&(delete k.tls.ca_file,delete k.leafnodes.tls.ca_file),t=mf.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===XT.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await jl.writeJson(u,k),pf.trace(`Hub server config written to ${u}`));let J=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,G=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,H=new Bhe(Kn.getConfigFromFile(or.CLUSTERING_LEAFSERVER_NETWORK_PORT),p,c,l,[J],[G],S,y,i,s,n,f);n==null&&delete H.tls.ca_file,(t===void 0||t===XT.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await jl.writeJson(d,H),pf.trace(`Leaf server config written to ${d}`))}o($he,"generateNatsConfig");async function JT(e){let t=Dh.get(e);return mf.isEmpty(t)&&ZT(`port undefined for '${e}'`),await mf.isPortTaken(t)&&ZT(`'${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}o(JT,"isPortAvailable");function ZT(e){let t=`Error generating clustering config: ${e}`;pf.error(t),console.error(t),process.exit(1)}o(ZT,"generateNatsConfigError");async function Vhe(e){let{port:t,config_file:r}=JO.getServerConfig(e),{username:n,decrypt_hash:s}=await QO.getClusterUser(),i=0,a=2e3;for(;i<HY;){try{let d=await JO.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){pf.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=HY)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=a*(i*2);u>3e4&&pf.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await mf.asyncSetTimeout(u)}let c="0".repeat(qhe),l=zl.join(Dh.get(or.ROOTPATH),ff,r);await jl.writeFile(l,c),await jl.remove(l),pf.notify(e,"started.")}o(Vhe,"removeNatsConfig")});var WY=v((vFe,YY)=>{"use strict";var Ss=ce(),Xe=(q(),M(Y)),Mh=pt(),na=require("path"),{PACKAGE_ROOT:ry}=Ot(),GY=ce(),ty=oe(),hf="/dev/null",Khe=na.join(ry,"launchServiceScripts"),$Y=na.join(ry,"utility/scripts"),Yhe=na.join($Y,Xe.HDB_RESTART_SCRIPT),VY=na.resolve(ry,"dependencies",`${process.platform}-${process.arch}`,Mh.NATS_BINARY_NAME);function KY(){let e={[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0,...process.env};return ty.noBootFile()&&(e[Xe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=ty.getEnvCliRootPath()),{name:Xe.PROCESS_DESCRIPTORS.HDB,script:Xe.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:e,execArgv:process.execArgv,cwd:ry}}o(KY,"generateMainServerConfig");var Whe=9930;function zhe(){Ss.initSync(!0);let e=Ss.get(Xe.CONFIG_PARAMS.ROOTPATH),t=na.join(e,"clustering",Mh.NATS_CONFIG_FILES.HUB_SERVER),r=na.join(Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Xe.LOG_NAMES.HDB),n=GY.get(Xe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Mh.LOG_LEVEL_FLAGS[Ss.get(Xe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Whe?"-"+n:""),binFile:VY,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=hf,i.error_file=hf),i}o(zhe,"generateNatsHubServerConfig");var jhe=9940;function Qhe(){Ss.initSync(!0);let e=Ss.get(Xe.CONFIG_PARAMS.ROOTPATH),t=na.join(e,"clustering",Mh.NATS_CONFIG_FILES.LEAF_SERVER),r=na.join(Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Xe.LOG_NAMES.HDB),n=GY.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Mh.LOG_LEVEL_FLAGS[Ss.get(Xe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==jhe?"-"+n:""),binFile:VY,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=hf,i.error_file=hf),i}o(Qhe,"generateNatsLeafServerConfig");function Jhe(){Ss.initSync();let e=na.join(Ss.get(Xe.CONFIG_PARAMS.LOGGING_ROOT),Xe.LOG_NAMES.HDB),t={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,binFile:Xe.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:Khe,autorestart:!1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=hf,t.error_file=hf),t}o(Jhe,"generateClusteringUpgradeV4ServiceConfig");function Xhe(){let e={[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.RESTART_HDB};return ty.noBootFile()&&(e[Xe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=ty.getEnvCliRootPath()),{...{name:Xe.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:$Y},script:Yhe}}o(Xhe,"generateRestart");function Zhe(){return{apps:[KY()]}}o(Zhe,"generateAllServiceConfigs");YY.exports={generateAllServiceConfigs:Zhe,generateMainServerConfig:KY,generateRestart:Xhe,generateNatsHubServerConfig:zhe,generateNatsLeafServerConfig:Qhe,generateClusteringUpgradeV4ServiceConfig:Jhe}});var Ef=v((BFe,eW)=>{"use strict";var Or=(q(),M(Y)),xFe=oe(),ia=ey(),ny=qt(),sa=pt(),Sc=WY(),ZO=ce(),Tc=Q(),eEe=Vs(),{startWorker:zY,onMessageFromWorkers:tEe}=Ze(),jY=require("fs"),rEe=require("node:path"),nEe=(q(),M(Y)),{setTimeout:sEe}=require("node:timers/promises"),{execFile:iEe,fork:oEe}=require("node:child_process");eW.exports={start:yc,restart:cEe,kill:fEe,startAllServices:mEe,startService:JY,restartHdb:lEe,startClusteringProcesses:XY,startClusteringThreads:ZY,isHdbRestartRunning:uEe,getHdbPid:dEe,cleanupChildrenProcesses:vh,reloadClustering:hEe,expectedRestartOfChildren:QY};tEe(e=>{e.type==="restart"&&ZO.initSync(!0)});var fo=[],aEe=10,XO;function yc(e,t=!1){let r=typeof e.args=="string"?e.args.split(" "):e.args;e.silent=!0,e.detached=!0;let n=e.script?oEe(e.script,r,e):iEe(e.binFile,r,e);n.name=e.name,n.config=e,n.on("error",(a,c)=>{console.error(a,c)}),n.on("exit",async a=>{let c=fo.indexOf(n);c>-1&&fo.splice(c,1),!XO&&a!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<aEe&&(jY.existsSync(ia.getHubConfigPath())?yc(e):(await ia.generateNatsConfig(!0),yc(e),await new Promise(l=>setTimeout(l,3e3)),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let s={serviceName:e.name.replace(/ /g,"-")};function i(a){let c=ZO.get(Or.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),l=/\[\d+][^\[]+\[(\w+)]/g,u,d=0,f;for(;u=l.exec(a);){if(u.index&&sa.LOG_LEVEL_HIERARCHY[c]>=sa.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===sa.LOG_LEVELS.ERR||f===sa.LOG_LEVELS.WRN?Tc.OUTPUTS.STDERR:Tc.OUTPUTS.STDOUT;Tc.logCustomLevel(f||"info",h,s,a.slice(d,u.index).trim())}let[m,p]=u;d=u.index+m.length,f=sa.LOG_LEVELS[p]}if(sa.LOG_LEVEL_HIERARCHY[c]>=sa.LOG_LEVEL_HIERARCHY[f||"info"]){let m=f===sa.LOG_LEVELS.ERR||f===sa.LOG_LEVELS.WRN?Tc.OUTPUTS.STDERR:Tc.OUTPUTS.STDOUT;Tc.logCustomLevel(f||"info",m,s,a.toString().slice(d).trim())}}o(i,"extractMessages"),n.stdout.on("data",i),n.stderr.on("data",i),n.unref(),fo.length===0&&(t||(process.on("exit",vh),process.on("SIGINT",vh),process.on("SIGQUIT",vh),process.on("SIGTERM",vh))),fo.push(n)}o(yc,"start");function vh(e=!0){if(!XO&&(XO=!0,fo.length!==0))if(Tc.info("Killing child processes..."),fo.map(t=>t.kill()),e)process.exit(0);else return sEe(2e3)}o(vh,"cleanupChildrenProcesses");function cEe(e){QY();for(let t of fo)t.name===e&&t.kill()}o(cEe,"restart");function QY(){for(let e of fo)e.config&&(e.config.restarts=0)}o(QY,"expectedRestartOfChildren");async function lEe(){await yc(Sc.generateRestart())}o(lEe,"restartHdb");async function uEe(){let e=await list();for(let t in e)if(e[t].name===Or.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}o(uEe,"isHdbRestartRunning");function dEe(){let e=ZO.getHdbBasePath();if(!e)return;let t=rEe.join(e,nEe.HDB_PID_FILE),r=EEe(t);if(!(!r||r===process.pid)&&_Ee(r))return r}o(dEe,"getHdbPid");function fEe(){for(let e of fo)e.kill();fo=[]}o(fEe,"kill");async function mEe(){await XY(),await ZY(),await yc(Sc.generateAllServiceConfigs())}o(mEe,"startAllServices");async function JY(e,t=!1){let r;switch(e=e.toLowerCase(),e){case Or.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Sc.generateMainServerConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Sc.generateNatsIngestServiceConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Sc.generateNatsReplyServiceConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Sc.generateNatsHubServerConfig(),await yc(r,t),await ia.removeNatsConfig(e);return;case Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Sc.generateNatsLeafServerConfig(),await yc(r,t),await ia.removeNatsConfig(e);return;case Or.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Sc.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}yc(r,t)}o(JY,"startService");var pEe;async function XY(e=!1){for(let t in Or.CLUSTERING_PROCESSES){let r=Or.CLUSTERING_PROCESSES[t];await JY(r,e)}}o(XY,"startClusteringProcesses");async function ZY(){pEe=zY(Or.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:Or.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await ny.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await ny.updateLocalStreams();let e=await eEe.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===Or.PRE_4_0_0_VERSION){Tc.info("Starting clustering upgrade 4.0.0 process"),zY(Or.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}o(ZY,"startClusteringThreads");async function hEe(){await ia.generateNatsConfig(!0),await ny.reloadNATSHub(),await ny.reloadNATSLeaf(),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}o(hEe,"reloadClustering");function EEe(e){try{return Number.parseInt(jY.readFileSync(e,"utf8"),10)}catch{return null}}o(EEe,"readPidFile");function _Ee(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(_Ee,"isProcessRunning")});var rP={};Re(rP,{compactOnStart:()=>gEe,copyDb:()=>oW});async function gEe(){Rc.notify("Running compact on start"),console.log("Running compact on start");let e=(0,eP.get)(F.ROOTPATH),t=new Map,r=ct();(0,tP.updateConfigValue)(F.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,sy.join)(e,"backup",n+".mdb"),a=(0,sy.join)(e,Yc,n+"-copy.mdb"),c=0;try{c=await tW(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){Rc.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{dbPath:s,copyDest:a,backupDest:i,recordCount:c}),await oW(n,a),console.log("Backing up",n,"to",i);try{await(0,Ql.move)(s,i,{overwrite:!0})}catch(l){console.log("Error moving database",s,"to",i,l)}}try{Id()}catch(n){Rc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}for(let[n,{dbPath:s,copyDest:i}]of t)console.log("Moving copy compacted",n,"to",s),await(0,Ql.move)(i,s,{overwrite:!0}),await(0,Ql.remove)((0,sy.join)(e,Yc,`${n}-copy.mdb-lock`));try{Id()}catch(n){Rc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){Rc.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,tP.updateConfigValue)(F.STORAGE_COMPACTONSTART,!1);for(let[s,{dbPath:i,backupDest:a}]of t){console.error("Moving backup database",a,"back to",i);try{await(0,Ql.move)(a,i,{overwrite:!0})}catch(c){console.error(c)}}throw Id(),n}for(let[n,{backupDest:s,recordCount:i}]of t){let a=!0,c=await tW(n);if(console.log("Database",n,"after compact has a total record count of",c),i!==c){a=!1;let l=`There is a discrepancy between pre and post compact record count for database ${n}.
20
+ `)}function Bde(e){let t=[],r=e;for(;r?.raw;){let n={cert:r.raw};if(r.issuerCertificate&&r.issuerCertificate!==r&&r.issuerCertificate.raw&&(n.issuer=r.issuerCertificate.raw),t.push(n),r.issuerCertificate&&r.issuerCertificate!==r)r=r.issuerCertificate;else break}return t}var RT,b1,A1,Et,XC,Xo,yT,bT=se(()=>{y1();RT=require("easy-ocsp"),b1=require("node:crypto"),A1=b(Zn());we();Ga();Et=(0,A1.loggerWithTag)("cert-verification"),XC=class extends Hr{static{o(this,"CertificateVerificationSource")}async get(t){Et.debug?.("CertificateVerificationSource.get called for:",t);let r=this.getContext(),n=r?.requestContext;if(!n||!n.certPem||!n.issuerPem)throw new Error(`No certificate data provided for cache key: ${t}`);let{certPem:s,issuerPem:i,config:a}=n;Et.trace?.("Performing OCSP check with config:",a);try{let c=a?.timeout??Xo.timeout,l=await Promise.race([xde(s,i,c),new Promise((m,p)=>setTimeout(()=>p(new Error("OCSP timeout")),c))]);if(Et.debug?.("OCSP check result:",l),l.status==="unknown"&&(l.reason==="ocsp-error"||l.reason==="timeout"||l.reason==="no-ocsp-url")){let m=a?.failureMode??Xo.failureMode;if(Et.error?.("OCSP check failed:",l.reason),m==="fail-closed"){let p=a?.errorCacheTtl??Xo.errorCacheTtl,h=Date.now()+p;return r&&(r.expiresAt=h),{certificate_id:t,status:l.status,reason:l.reason,checked_at:Date.now(),expiresAt:h,method:"ocsp"}}else return Et.warn?.("OCSP check failed, allowing connection (fail-open mode)"),null}let d=a?.cacheTtl??Xo.cacheTtl,f=Date.now()+d;return r&&(r.expiresAt=f),{certificate_id:t,status:l.status,reason:l.reason,checked_at:Date.now(),expiresAt:f,method:"ocsp"}}catch(c){if(Et.error?.("OCSP verification error:",c),(a?.failureMode??Xo.failureMode)==="fail-closed"){let u=a?.errorCacheTtl??Xo.errorCacheTtl,d=Date.now()+u;return r&&(r.expiresAt=d),{certificate_id:t,status:"unknown",reason:c.message,checked_at:Date.now(),expiresAt:d,method:"ocsp"}}return Et.warn?.("OCSP check failed, allowing connection (fail-open mode)"),null}}},Xo={timeout:5e3,cacheTtl:36e5,errorCacheTtl:3e5,failureMode:"fail-open"};o(Mde,"getCertificateCacheTable");o(vde,"getCertificateVerificationConfig");o(Zd,"verifyCertificate");o(Ude,"verifyOCSP");o(xde,"performOCSPCheck");o(R1,"bufferToPem");o(Bde,"extractCertificateChain")});var Qo={};Re(Qo,{clearThisNodeName:()=>Yde,disableReplication:()=>qde,enabledDatabases:()=>dc,forEachReplicatedDatabase:()=>oc,getThisNodeId:()=>TT,getThisNodeName:()=>it,getThisNodeUrl:()=>ac,hostnameToUrl:()=>NT,lastTimeInAuditStore:()=>ih,monitorNodeCAs:()=>M1,replicateOperation:()=>zde,replicationCertificateAuthorities:()=>Jo,sendOperationToNode:()=>_h,servers:()=>kde,setReplicator:()=>U1,start:()=>Hde,startOnMainThread:()=>NC,subscribeToNode:()=>lh,unsubscribeFromNode:()=>oT,urlToNodeName:()=>Ti});function Hde(e){if(!e.port&&!e.securePort&&(e.port=$s.default.get(F.OPERATIONSAPI_NETWORK_PORT),e.securePort=$s.default.get(F.OPERATIONSAPI_NETWORK_SECUREPORT)),!it())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of ah(e))t.set(Ti(s.url),s);Gde(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=ve.ws(async(s,i,a,c)=>{if(wt.debug("Incoming WS connection received "+i.url),i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,a);s._socket.unref(),ph(s,e,a.then(()=>i?.user)),s.on("error",l=>{l.code!=="ECONNREFUSED"&&wt.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,ve.http(async(s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){wt.debug("Incoming replication WS connection received, authorized: "+s.authorized),!s.authorized&&s._nodeRequest.socket.authorizationError&&wt.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let a=Qt().primaryStore;if(s.authorized&&s.peerCertificate.subjectaltname){let c=(0,L1.getHostnamesFromCertificate)(s.peerCertificate),l;for(let u of c)if(l=u&&(a.get(u)||t.get(u)),l)break;if(l){let u=await Zd(s.peerCertificate,e);if(!u.valid){wt.warn("Certificate verification failed:",u.status,"for node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){wt.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l}else wt.warn(`No node found for certificate common name/SANs: ${c}, available nodes are ${Array.from(a.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=a.get(s.ip)||t.get(s.ip);c?s.user=c:wt.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...a.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=o(()=>{let a=new Set(s.secureContexts.values());s.defaultContext&&a.add(s.defaultContext);for(let c of a)try{let l=Array.from(Jo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=wT.createSecureContext(u)}catch(l){wt.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),$s.default.get(F.REPLICATION_ENABLEROOTCAS)!==!1&&i()}M1(()=>{for(let s of n)s()})}function M1(e){let t=0;Kd(r=>{r?.ca&&(Jo.add(r.ca),Jo.size!==t&&(t=Jo.size,e?.()))})}function qde(e=!0){D1=e}function Gde(e){D1||(ct(),dc=e.databases,oc(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||fc;for(let[s,i]of IT){let a=i.get(r);a&&(a.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];U1(r,s,e),jC.get(s)?.forEach(i=>i(s))}}))}function U1(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 v1 extends Hr{static{o(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||fc,a=i.get(e),c=a?.tableById||[];c[t.tableId]=t;let l=a?.ready;if(wt.trace("Setting up replicator subscription to database",e),!a?.auditStore)return this.subscription=a=new Xn,i.set(e,a),a.tableById=c,a.auditStore=t.auditStore,a.dbisDB=t.dbisDB,a.databaseName=e,l&&l(a),a;this.subscription=a}static subscribeOnThisThread(i,a){return!0}static async load(i){if(i){let a=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),a]);if(c){let l,u=new Set;do{let d,f="",m=1/0;for(let h of c){if(u.has(h)||h===ve.hostname)continue;let E=Vde(h,v1.subscription,e);if(E?.isConnected){let g=Vd(t.auditStore,e,h)[gT];(!d||g<m)&&(d=E,f=h,m=g)}}if(!d)throw l||new O1.ServerError(`No connection to any other nodes are available: ${c}`,502);let p={requestId:Fde++,table:t,entry:i,id:i.key};u.add(f);try{return await d.getRecord(p)}catch(h){if(d.isConnected)throw h;wt.warn("Error in load from node",$l,h),l||(l=h)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function $de(e,t,r,n,s){let i=IT.get(e);i||IT.set(e,i=new Map);let a=i.get(r);if(a)return a;if(t)return i.set(r,a=new Xd(e,t,r,n,s)),a.connect(),a.once("finished",()=>i.delete(r)),a}function Vde(e,t,r){let n=I1.get($l);n||(n=new Map,I1.set($l,n));let s=n.get(r);if(s)return s;let i=Qt().primaryStore.get(e);return i?.url&&(s=new Xd(i.url,t,r,$l,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function _h(e,t,r){r||(r={}),r.serverName=e.name;let n=await ST(e.url,r),s=ph(n,{},{});return new Promise((i,a)=>{n.on("open",()=>{wt.debug("Sending operation connection to "+e.url+" opened",t),i(s.sendOperation(t))}),n.on("error",c=>{a(c)}),n.on("close",c=>{wt.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function lh(e){try{P1.isMainThread&&wt.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=fc.get(e.database);if(!t){let n;t=new Promise(s=>{wt.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,fc.set(e.database,t)}let r=$de(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=>oh(n,e.database)),e.replicateByDefault)}catch(t){wt.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function oT({name:e,url:t,database:r}){wt.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(Qt().primaryStore.getRange({})));let n=IT.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Kde(){if(ZC!==void 0)return ZC;let e=$s.default.get(F.OPERATIONSAPI_TLS_CERTIFICATE)||$s.default.get(F.TLS_CERTIFICATE);if(e)return ZC=new N1.X509Certificate((0,C1.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function it(){return $l||($l=$s.default.get("replication_hostname")??Ti($s.default.get("replication_url"))??Kde()??w1("operationsapi_network_secureport")??w1("operationsapi_network_port")??"127.0.0.1")}function Yde(){$l=void 0}function w1(e){let t=$s.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function AT(e){let t=$s.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function TT(e){return sh(e)?.[it()]}function ac(){let e=$s.default.get("replication_url");return e||NT(it())}function NT(e){let t=AT("replication_port");if(t)return`ws://${e}:${t}`;if(t=AT("replication_secureport"),t)return`wss://${e}:${t}`;if(t=AT("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=AT("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function Ti(e){if(e)return new URL(e).hostname}function oc(e,t){for(let n of Object.getOwnPropertyNames(De))r(n);return Hp(n=>{r(n)}),Dl((n,s)=>{r(n.databaseName)});function r(n){let s=De[n];wt.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):Wde(n)&&t(s,n,!1)}o(r,"forDatabase")}function Wde(e){let t=De[e];for(let r in t)if(t[r].replicate)return!0}function ih(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function zde(e){let t={message:""};if(e.replicated){e.replicated=!1,wt.trace?.("Replicating operation",e.operation,"to nodes",ve.nodes.map(n=>n.name));let r=await Promise.allSettled(ve.nodes.map(n=>_h(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=ve.nodes[s]?.name,i})}return t}var $s,wt,N1,C1,wT,O1,P1,L1,D1,Fde,kde,Jo,dc,IT,I1,ZC,$l,hs=se(()=>{we();Ga();Ou();QC();Fr();$s=b(ce()),wt=b(Q()),N1=require("crypto");bT();C1=require("fs");uh();Yd();q();wC();wT=b(require("node:tls")),O1=b(_e()),P1=require("worker_threads"),L1=b(_s()),Fde=1,kde=[],Jo=$s.default.get(F.REPLICATION_ENABLEROOTCAS)!==!1?new Set(wT.rootCertificates):new Set;o(Hde,"start");o(M1,"monitorNodeCAs");o(qde,"disableReplication");o(Gde,"assignReplicationSource");o(U1,"setReplicator");IT=new Map;o($de,"getSubscriptionConnection");I1=new Map;o(Vde,"getRetrievalConnectionByName");o(_h,"sendOperationToNode");o(lh,"subscribeToNode");o(oT,"unsubscribeFromNode");o(Kde,"getCommonNameFromCert");o(it,"getThisNodeName");o(Yde,"clearThisNodeName");Object.defineProperty(ve,"hostname",{get(){return it()}});o(w1,"getHostFromListeningPort");o(AT,"getPortFromListeningPort");o(TT,"getThisNodeId");ve.replication={getThisNodeId:TT,exportIdMapping:sh};o(ac,"getThisNodeUrl");o(NT,"hostnameToUrl");o(Ti,"urlToNodeName");o(oc,"forEachReplicatedDatabase");o(Wde,"hasExplicitlyReplicatedTable");o(ih,"lastTimeInAuditStore");o(zde,"replicateOperation")});var Sh=v((z0e,H1)=>{"use strict";var ef=U$(),{validateBySchema:gh}=at(),{commonValidators:tf,schemaRegex:eO}=Wi(),_r=require("joi"),jde=Q(),Qde=require("uuid").v4,PT=qo(),rf=(q(),M(Y)),Jde=require("util"),mc=cs(),{handleHDBError:Zo,hdbErrors:Xde,ClientError:Vl}=_e(),{HDB_ERROR_MSGS:CT,HTTP_STATUS_CODES:ea}=Xde,{SchemaEventMsg:LT}=is(),x1=qt(),{getDatabases:Zde}=(we(),M(mt)),{transformReq:nf}=oe(),{replicateOperation:B1}=(hs(),M(Qo)),{cleanupOrphans:efe}=(es(),M(F_)),OT=_r.string().min(1).max(tf.schema_length.maximum).pattern(eO).messages({"string.pattern.base":"{:#label} "+tf.schema_format.message}),tfe=_r.string().min(1).max(tf.schema_length.maximum).pattern(eO).messages({"string.pattern.base":"{:#label} "+tf.schema_format.message}).required(),rfe=_r.string().min(1).max(tf.schema_length.maximum).pattern(eO).messages({"string.pattern.base":"{:#label} "+tf.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();H1.exports={createSchema:nfe,createSchemaStructure:F1,createTable:sfe,createTableStructure:k1,createAttribute:lfe,dropSchema:ife,dropTable:ofe,dropAttribute:afe,getBackup:ufe,cleanupOrphanBlobs:dfe};async function nfe(e){let t=await F1(e);return PT.signalSchemaChange(new LT(process.pid,e.operation,e.schema)),t}o(nfe,"createSchema");async function F1(e){let t=gh(e,_r.object({database:OT,schema:OT}));if(t)throw new Vl(t.message);if(nf(e),!await ef.checkSchemaExists(e.schema))throw Zo(new Error,CT.SCHEMA_EXISTS_ERR(e.schema),ea.BAD_REQUEST,rf.LOG_LEVELS.ERROR,CT.SCHEMA_EXISTS_ERR(e.schema),!0);return await mc.createSchema(e),`database '${e.schema}' successfully created`}o(F1,"createSchemaStructure");async function sfe(e){return nf(e),e.hash_attribute=e.primary_key??e.hash_attribute,await k1(e)}o(sfe,"createTable");async function k1(e){let t=gh(e,_r.object({database:OT,schema:OT,table:tfe,residence:_r.array().items(_r.string().min(1)).optional(),hash_attribute:rfe}));if(t)throw new Vl(t.message);if(!await ef.checkSchemaTableExists(e.schema,e.table))throw Zo(new Error,CT.TABLE_EXISTS_ERR(e.schema,e.table),ea.BAD_REQUEST,rf.LOG_LEVELS.ERROR,CT.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Qde(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await mc.createTable(n,e);else throw Zo(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",ea.BAD_REQUEST);else await mc.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}o(k1,"createTableStructure");async function ife(e){let t=gh(e,_r.object({database:_r.string(),schema:_r.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Vl(t.message);nf(e);let r=await ef.checkSchemaExists(e.schema);if(r)throw Zo(new Error,r,ea.NOT_FOUND,rf.LOG_LEVELS.ERROR,r,!0);let n=await ef.schemaDescribe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await mc.dropSchema(e),PT.signalSchemaChange(new LT(process.pid,e.operation,e.schema)),await x1.purgeSchemaTableStreams(e.schema,s);let i=await B1(e);return i.message=`successfully deleted '${e.schema}'`,i}o(ife,"dropSchema");async function ofe(e){let t=gh(e,_r.object({database:_r.string(),schema:_r.string(),table:_r.string().required()}));if(t)throw new Vl(t.message);nf(e);let r=await ef.checkSchemaTableExists(e.schema,e.table);if(r)throw Zo(new Error,r,ea.NOT_FOUND,rf.LOG_LEVELS.ERROR,r,!0);await mc.dropTable(e),await x1.purgeTableStream(e.schema,e.table);let n=await B1(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}o(ofe,"dropTable");async function afe(e){let t=gh(e,_r.object({database:_r.string(),schema:_r.string(),table:_r.string().required(),attribute:_r.string().required()}));if(t)throw new Vl(t.message);nf(e);let r=await ef.checkSchemaTableExists(e.schema,e.table);if(r)throw Zo(new Error,r,ea.NOT_FOUND,rf.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Zo(new Error,"You cannot drop a hash attribute",ea.BAD_REQUEST,void 0,void 0,!0);if(rf.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Zo(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,ea.BAD_REQUEST,void 0,void 0,!0);try{return await mc.dropAttribute(e),cfe(e),PT.signalSchemaChange(new LT(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw jde.error(`Got an error deleting attribute ${Jde.inspect(e)}.`),n}}o(afe,"dropAttribute");function cfe(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)}o(cfe,"dropAttributeFromGlobal");async function lfe(e){nf(e);let t=Zde()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Zo(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,ea.BAD_REQUEST,void 0,void 0,!0);return await mc.createAttribute(e),PT.signalSchemaChange(new LT(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}o(lfe,"createAttribute");function ufe(e){return mc.getBackup(e)}o(ufe,"getBackup");function dfe(e){if(!e.database)throw new Vl('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new Vl(`Unknown database '${e.database}'`);return efe(databases[e.database]),{message:"Orphaned blobs cleanup started, check logs for progress"}}o(dfe,"cleanupOrphanBlobs")});var G1=v((Q0e,q1)=>{"use strict";var{OPERATIONS_ENUM:ffe}=(q(),M(Y)),tO=class{static{o(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=ffe.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};q1.exports=tO});var rO=v((Z0e,W1)=>{"use strict";var mfe=cs(),X0e=G1(),DT=oe(),MT=(q(),M(Y)),pfe=ce(),{handleHDBError:$1,hdbErrors:hfe}=_e(),{HDB_ERROR_MSGS:V1,HTTP_STATUS_CODES:K1}=hfe,Efe=Object.values(MT.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),Y1="To use this operation audit log must be enabled in harperdb-config.yaml";W1.exports=_fe;async function _fe(e){if(DT.isEmpty(e.schema))throw new Error(V1.SCHEMA_REQUIRED_ERR);if(DT.isEmpty(e.table))throw new Error(V1.TABLE_REQUIRED_ERR);if(!pfe.get(MT.CONFIG_PARAMS.LOGGING_AUDITLOG))throw $1(new Error,Y1,K1.BAD_REQUEST,MT.LOG_LEVELS.ERROR,Y1,!0);let t=DT.checkSchemaTableExist(e.schema,e.table);if(t)throw $1(new Error,t,K1.NOT_FOUND,MT.LOG_LEVELS.ERROR,t,!0);if(!DT.isEmpty(e.search_type)&&Efe.indexOf(e.search_type)<0)throw new Error(`Invalid searchType '${read_audit_log_object.search_type}'`);return await mfe.readAuditLog(e)}o(_fe,"readAuditLog")});var j1=v((tBe,z1)=>{"use strict";var{OPERATIONS_ENUM:gfe}=(q(),M(Y)),nO=class{static{o(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=gfe.GET_BACKUP,this.schema=t,this.table=r}};z1.exports=nO});var X1=v((iBe,J1)=>{"use strict";var Sfe=cs(),nBe=j1(),sO=oe(),Tfe=(q(),M(Y)),sBe=ce(),{handleHDBError:yfe,hdbErrors:Rfe}=_e(),{HDB_ERROR_MSGS:Q1,HTTP_STATUS_CODES:bfe}=Rfe;J1.exports=Afe;async function Afe(e){if(sO.isEmpty(e.schema))throw new Error(Q1.SCHEMA_REQUIRED_ERR);if(sO.isEmpty(e.table))throw new Error(Q1.TABLE_REQUIRED_ERR);let t=sO.checkSchemaTableExist(e.schema,e.table);if(t)throw yfe(new Error,t,bfe.NOT_FOUND,Tfe.LOG_LEVELS.ERROR,t,!0);return await Sfe.getBackup(readAuditLogObject)}o(Afe,"getBackup")});var rK=v((aBe,tK)=>{"use strict";var Ife=ce(),pc=require("joi"),wfe=at(),Z1=require("moment"),Nfe=require("fs-extra"),iO=require("path"),Cfe=require("lodash"),Th=(q(),M(Y)),{LOG_LEVELS:Kl}=(q(),M(Y)),Ofe="YYYY-MM-DD hh:mm:ss",Pfe=iO.resolve(__dirname,"../logs");tK.exports=function(e){return wfe.validateBySchema(e,Lfe)};var Lfe=pc.object({from:pc.custom(eK),until:pc.custom(eK),level:pc.valid(Kl.NOTIFY,Kl.FATAL,Kl.ERROR,Kl.WARN,Kl.INFO,Kl.DEBUG,Kl.TRACE),order:pc.valid("asc","desc"),limit:pc.number().min(1),start:pc.number().min(0),log_name:pc.custom(Dfe)});function eK(e,t){if(Z1(e,Z1.ISO_8601).format(Ofe)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}o(eK,"validateDatetime");function Dfe(e,t){if(Cfe.invert(Th.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Ife.get(Th.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?Th.LOG_NAMES.HDB:e,i=s===Th.LOG_NAMES.INSTALL?iO.join(Pfe,Th.LOG_NAMES.INSTALL):iO.join(n,s);return Nfe.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}o(Dfe,"validateReadLogPath")});var aO=v((lBe,sK)=>{"use strict";var vT=(q(),M(Y)),Mfe=Q(),vfe=ce(),Ufe=rK(),oO=require("path"),nK=require("fs-extra"),{once:xfe}=require("events"),{handleHDBError:Bfe,hdbErrors:Ffe}=_e(),{PACKAGE_ROOT:kfe}=Ot(),{replicateOperation:Hfe}=(hs(),M(Qo)),qfe=oO.join(kfe,"logs"),Gfe=1e3,$fe=200;sK.exports=Vfe;async function Vfe(e){let t=Ufe(e);if(t)throw Bfe(t,t.message,Ffe.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=Hfe(e),n=vfe.get(vT.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e.log_name===void 0?vT.LOG_NAMES.HDB:e.log_name,i=s===vT.LOG_NAMES.INSTALL?oO.join(qfe,vT.LOG_NAMES.INSTALL):oO.join(n,s),a=e.level!==void 0,c=a?e.level:void 0,l=e.from!==void 0,u=l?new Date(e.from):void 0,d=e.until!==void 0,f=d?new Date(e.until):void 0,m=e.limit===void 0?Gfe:e.limit,p=e.order===void 0?void 0:e.order,h=e.start===void 0?0:e.start,E=h+m,g=0;p==="desc"&&!u&&!f&&(g=Math.max(nK.statSync(i).size-(E+5)*$fe,0));let R=nK.createReadStream(i,{start:g});R.on("error",G=>{Mfe.error(G)});let S=0,y=[],C="",I;R.on("data",G=>{let H=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;G=C+G;let X=0,z;for(;(z=H.exec(G))&&!R.destroyed;){I&&(I.message=G.slice(X,z.index),k(I));let[de,le,te]=z,ye=te.split("] ["),Ae=ye[0],Ye=ye[1];ye.splice(0,2),I={timestamp:le,thread:Ae,level:Ye,tags:ye,message:""},X=z.index+de.length}C=G.slice(X)}),R.on("end",G=>{R.destroyed||I&&(I.message=C.trim(),k(I))}),R.resume();function k(G){let H,X,z;switch(!0){case(a&&l&&d):H=new Date(G.timestamp),X=new Date(u),z=new Date(f),G.level===c&&H>=X&&H<=z&&S<h?S++:G.level===c&&H>=X&&H<=z&&(uo(G,p,y),S++,S===E&&R.destroy());break;case(a&&l):H=new Date(G.timestamp),X=new Date(u),G.level===c&&H>=X&&S<h?S++:G.level===c&&H>=X&&(uo(G,p,y),S++,S===E&&R.destroy());break;case(a&&d):H=new Date(G.timestamp),z=new Date(f),G.level===c&&H<=z&&S<h?S++:G.level===c&&H<=z&&(uo(G,p,y),S++,S===E&&R.destroy());break;case(l&&d):H=new Date(G.timestamp),X=new Date(u),z=new Date(f),H>=X&&H<=z&&S<h?S++:H>=X&&H<=z&&(uo(G,p,y),S++,S===E&&R.destroy());break;case a:G.level===c&&S<h?S++:G.level===c&&(uo(G,p,y),S++,S===E&&R.destroy());break;case l:H=new Date(G.timestamp),X=new Date(u),H>=X&&S<h?S++:H>=X&&S>=h&&(uo(G,p,y),S++,S===E&&R.destroy());break;case d:H=new Date(G.timestamp),z=new Date(f),H<=z&&S<h?S++:H<=z&&S>=h&&(uo(G,p,y),S++,S===E&&R.destroy());break;default:S<h?S++:(uo(G,p,y),S++,S===E&&R.destroy())}}o(k,"onLogMessage"),await xfe(R,"close");let J=await r;if(J.replicated){for(let G of y)G.node=server.hostname;for(let G of J.replicated){let H=G.node;if(G.status==="failed")uo({timestamp:new Date().toISOString(),level:"error",node:H,message:`Error retrieving logs: ${G.reason}`},p,y);else for(let X of G.results)X.node=H,uo(X,p,y)}}return y}o(Vfe,"readLog");function uo(e,t,r){t==="desc"?Kfe(e,r):t==="asc"?Yfe(e,r):r.push(e)}o(uo,"pushLineToResult");function Kfe(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)}o(Kfe,"insertDescending");function Yfe(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)}o(Yfe,"insertAscending")});var UT=v((hBe,cK)=>{"use strict";var cO=require("joi"),{string:sf,boolean:iK,date:Wfe}=cO.types(),zfe=at(),{validateSchemaExists:dBe,validateTableExists:fBe,validateSchemaName:mBe}=Wi(),jfe=(q(),M(Y)),Qfe=pt(),oK=ce();oK.initSync();var pBe=sf.invalid(oK.get(jfe.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Qfe.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),aK={operation:sf.valid("add_node","update_node","set_node_replication"),node_name:sf.optional(),subscriptions:cO.array().items({table:sf.optional(),schema:sf.optional(),database:sf.optional(),subscribe:iK.required(),publish:iK.required().custom(Xfe),start_time:Wfe.iso()})};function Jfe(e){return zfe.validateBySchema(e,cO.object(aK))}o(Jfe,"addUpdateNodeValidator");function Xfe(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`)}o(Xfe,"checkForFalsy");cK.exports={addUpdateNodeValidator:Jfe,validationSchema:aK}});var hc=v((_Be,lK)=>{"use strict";var lO=class{static{o(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},uO=class{static{o(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};lK.exports={Node:lO,NodeSubscription:uO}});var dK=v((SBe,uK)=>{"use strict";var Zfe=(q(),M(Y)).OPERATIONS_ENUM,dO=class{static{o(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Zfe.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};uK.exports=dO});var yh=v((yBe,fK)=>{"use strict";var fO=class{static{o(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},mO=class{static{o(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,a,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=a,c!==void 0&&(this.attributes=c)}};fK.exports={RemotePayloadObject:fO,RemotePayloadSubscription:mO}});var pK=v((bBe,mK)=>{"use strict";var pO=class{static{o(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,a=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=a}};mK.exports=pO});var EK=v((OBe,hK)=>{"use strict";var eme=pK(),IBe=Wt(),wBe=gt(),tme=Q(),{getSchemaPath:NBe,getTransactionAuditStorePath:CBe}=bt(),{getDatabases:rme}=(we(),M(mt));hK.exports=nme;async function nme(e){let t=new eme;try{let r=rme()[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){tme.warn(`unable to stat table dbi due to ${r}`)}return t}o(nme,"lmdbGetTableSize")});var gK=v((LBe,_K)=>{"use strict";var hO=class{static{o(this,"SystemInformationObject")}constructor(t,r,n,s,i,a,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=a,this.harperdb_processes=c}};_K.exports=hO});var bh=v((BBe,RK)=>{"use strict";var sme=require("fs-extra"),ime=require("path"),bn=require("systeminformation"),Ec=Q(),SK=qt(),MBe=pt(),of=(q(),M(Y)),ome=EK(),ame=ic(),{getThreadInfo:TK}=Ze(),Rh=ce();Rh.initSync();var cme=gK(),{openEnvironment:vBe}=gt(),{getSchemaPath:UBe}=bt(),{database:xBe,databases:EO}=(we(),M(mt)),xT;RK.exports={getHDBProcessInfo:TO,getNetworkInfo:RO,getDiskInfo:yO,getMemoryInfo:SO,getCPUInfo:gO,getTimeInfo:_O,getSystemInformation:bO,systemInformation:lme,getTableSize:AO,getMetrics:IO};function _O(){return bn.time()}o(_O,"getTimeInfo");async function gO(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:a,governor:c,socket:l,cache:u,...d}=await bn.cpu();d.cpu_speed=await bn.cpuCurrentSpeed();let{rawCurrentload:f,rawCurrentloadIdle:m,rawCurrentloadIrq:p,rawCurrentloadNice:h,rawCurrentloadSystem:E,rawCurrentloadUser:g,cpus:R,...S}=await bn.currentLoad();return S.cpus=[],R.forEach(y=>{let{rawLoad:C,rawLoadIdle:I,rawLoadIrq:k,rawLoadNice:J,rawLoadSystem:G,rawLoadUser:H,...X}=y;S.cpus.push(X)}),d.current_load=S,d}catch(e){return Ec.error(`error in getCPUInfo: ${e}`),{}}}o(gO,"getCPUInfo");async function SO(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await bn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return Ec.error(`error in getMemoryInfo: ${e}`),{}}}o(SO,"getMemoryInfo");async function TO(){let e={core:[],clustering:[]};try{let t=await bn.processes(),r;try{r=Number.parseInt(await sme.readFile(ime.join(Rh.get(of.CONFIG_PARAMS.ROOTPATH),of.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===of.NODE_ERROR_CODES.ENOENT)Ec.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 Ec.error(`error in getHDBProcessInfo: ${t}`),e}}o(TO,"getHDBProcessInfo");async function yO(){let e={};try{if(!Rh.get(of.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await bn.disksIO();e.io=i;let{rxSec:a,txSec:c,wxSec:l,...u}=await bn.fsStats();return e.read_write=u,e.size=await bn.fsSize(),e}catch(t){return Ec.error(`error in getDiskInfo: ${t}`),e}}o(yO,"getDiskInfo");async function RO(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Rh.get(of.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await bn.networkInterfaceDefault(),e.latency=await bn.inetChecksite("google.com"),(await bn.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:a,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrierChanges:f,...m}=n;e.interfaces.push(m)}),(await bn.networkStats()).forEach(n=>{let{rxSec:s,txSec:i,ms:a,...c}=n;e.stats.push(c)})),e}catch(t){return Ec.error(`error in getNetworkInfo: ${t}`),e}}o(RO,"getNetworkInfo");async function bO(){if(xT!==void 0)return xT;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:a,...c}=await bn.osInfo();e=c;let l=await bn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,xT=e,xT}catch(t){return Ec.error(`error in getSystemInformation: ${t}`),e}}o(bO,"getSystemInformation");async function AO(){let e=[],t=await ame.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await ome(n));return e}o(AO,"getTableSize");async function IO(){let e={};for(let t in EO){let r=e[t]={},n=r.tables={};for(let s in EO[t])try{let i=EO[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,f]=l.trim().split(" ");return{pid:u,thread:d,txnid:f}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}}let a=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=a[l];n[s]=c}catch(i){Ec.notify(`Error getting stats for table ${s}: ${i}`)}}return e}o(IO,"getMetrics");async function yK(){if(Rh.get(of.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await SK.getNATSReferences(),t=await SK.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 a={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(a)}return r}}o(yK,"getNatsStreamInfo");async function lme(e){let t=new cme;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await bO(),t.time=_O(),t.cpu=await gO(),t.memory=await SO(),t.disk=await yO(),t.network=await RO(),t.harperdb_processes=await TO(),t.table_size=await AO(),t.metrics=await IO(),t.threads=await TK(),t.replication=await yK(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await bO();break;case"time":t.time=_O();break;case"cpu":t.cpu=await gO();break;case"memory":t.memory=await SO();break;case"disk":t.disk=await yO();break;case"network":t.network=await RO();break;case"harperdb_processes":t.harperdb_processes=await TO();break;case"table_size":t.table_size=await AO();break;case"database_metrics":case"metrics":t.metrics=await IO();break;case"threads":t.threads=await TK();break;case"replication":t.replication=await yK();break;default:break}return t}o(lme,"systemInformation")});var Vs=v((GBe,wK)=>{"use strict";var ume=pn(),wO=oe(),dme=require("util"),Yl=(q(),M(Y)),bK=ce();bK.initSync();var fme=WN(),AK=En(),{Node:kBe,NodeSubscription:HBe}=hc(),mme=rd(),pme=dK(),{RemotePayloadObject:hme,RemotePayloadSubscription:Eme}=yh(),{handleHDBError:_me,hdbErrors:gme}=_e(),{HTTP_STATUS_CODES:Sme,HDB_ERROR_MSGS:Tme}=gme,yme=di(),Rme=bh(),{packageJson:bme}=Ot(),{getDatabases:Ame}=(we(),M(mt)),qBe=dme.promisify(fme.authorize),Ime=AK.searchByHash,wme=AK.searchByValue;wK.exports={isEmpty:Nme,getNodeRecord:Cme,upsertNodeRecord:Ome,buildNodePayloads:Pme,checkClusteringEnabled:Lme,getAllNodeRecords:Dme,getSystemInfo:Mme,reverseSubscription:IK};function Nme(e){return e==null}o(Nme,"isEmpty");async function Cme(e){let t=new mme(Yl.SYSTEM_SCHEMA_NAME,Yl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Ime(t)}o(Cme,"getNodeRecord");async function Ome(e){let t=new pme(Yl.SYSTEM_SCHEMA_NAME,Yl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return ume.upsert(t)}o(Ome,"upsertNodeRecord");function IK(e){if(wO.isEmpty(e.subscribe)||wO.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}o(IK,"reverseSubscription");function Pme(e,t,r,n){let s=[];for(let i=0,a=e.length;i<a;i++){let c=e[i],{schema:l,table:u}=c,d=wO.getTableHashAttribute(l,u),{subscribe:f,publish:m}=IK(c),p=Ame()[l]?.[u],h=new Eme(l,u,d,m,f,c.start_time,p.schemaDefined?p.attributes:void 0);s.push(h)}return new hme(r,t,s,n)}o(Pme,"buildNodePayloads");function Lme(){if(!bK.get(Yl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw _me(new Error,Tme.CLUSTERING_NOT_ENABLED,Sme.BAD_REQUEST,void 0,void 0,!0)}o(Lme,"checkClusteringEnabled");async function Dme(){let e=new yme(Yl.SYSTEM_SCHEMA_NAME,Yl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await wme(e))}o(Dme,"getAllNodeRecords");async function Mme(){let e=await Rme.getSystemInformation();return{hdb_version:bme.version,node_version:e.node_version,platform:e.platform}}o(Mme,"getSystemInfo")});var NO=v((VBe,vK)=>{"use strict";var BT=qt(),NK=oe(),CK=pt(),OK=(q(),M(Y)),FT=Q(),PK=Sh(),vme=sd(),{RemotePayloadObject:Ume}=yh(),{handleHDBError:LK,hdbErrors:xme}=_e(),{HTTP_STATUS_CODES:DK}=xme,{NodeSubscription:MK}=hc();vK.exports=Bme;async function Bme(e,t){let r;try{r=await BT.request(`${t}.${CK.REQUEST_SUFFIX}`,new Ume(OK.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),FT.trace("Response from remote describe all request:",r)}catch(a){FT.error(`addNode received error from describe all request to remote node: ${a}`);let c=BT.requestErrorHandler(a,"add_node",t);throw LK(new Error,c,DK.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===CK.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let a=`Error returned from remote node ${t}: ${r.message}`;throw LK(new Error,a,DK.INTERNAL_SERVER_ERROR,"error",a)}let n=r.message,s=[],i=[];for(let a of e){let{table:c}=a,l=a.database??a.schema??"data";if(l===OK.SYSTEM_SCHEMA_NAME){await BT.createLocalTableStream(l,c);let h=new MK(l,c,a.publish,a.subscribe);h.start_time=a.start_time,i.push(h);continue}let u=NK.doesSchemaExist(l),d=n[l]!==void 0,f=c?NK.doesTableExist(l,c):!0,m=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!f&&!m){s.push(a);continue}if(!u&&d&&(FT.trace(`addNode creating schema: ${l}`),await PK.createSchema({operation:"create_schema",schema:l})),!f&&m){FT.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let h=new vme(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(h.attributes=n[l][c].attributes),await PK.createTable(h)}await BT.createLocalTableStream(l,c);let p=new MK(l,c,a.publish,a.subscribe);p.start_time=a.start_time,i.push(p)}return{added:i,skipped:s}}o(Bme,"reviewSubscriptions")});var af={};Re(af,{addNodeBack:()=>CO,removeNodeBack:()=>OO,setNode:()=>qme});async function qme(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=Ti(t)):t=NT(r);let n=(0,xK.validateBySchema)(e,Hme);if(n)throw(0,ta.handleHDBError)(n,n.message,kme.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new ta.ClientError("url or hostname is required for remove_node operation");let p=r,h=Qt(),E=await h.get(p);if(!E)throw new ta.ClientError(p+" does not exist");try{await _h({url:E.url},{operation:V.REMOVE_NODE_BACK,name:E?.subscriptions?.length>0?it():p},void 0)}catch(g){gs.warn(`Error removing node from target node ${p}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,g)}return await h.delete(p),`Successfully removed '${p}' from cluster`}if(!t)throw new ta.ClientError("url required for this operation");let s=ac();if(s==null)throw new ta.ClientError("replication url is missing from harperdb-config.yaml");let i,a,c;if(t?.startsWith("wss:")){i=await(0,Ks.getReplicationCert)();let p=await(0,Ks.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(a=await(0,Ks.createCsr)(),gs.info("Sending CSR to target node:",t)):p&&(c=p.certificate,gs.info("Sending CA named",p.name,"to target node",t))}let l={operation:V.ADD_NODE_BACK,hostname:(0,gc.get)(F.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:a,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,gc.get)(F.REPLICATION_SHARD)!==void 0&&(l.shard=(0,gc.get)(F.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(UK):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let p=UK(e);l.subscribe=p.subscribe,l.publish=p.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 _h({url:t},l,e)}catch(p){p.message=`Error returned from ${t}: `+p.message,gs.warn("Error adding node:",t,"to cluster:",p),d=p}if(a&&(!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)}`);a&&(gs.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ks.setCertTable)({name:Fme.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ks.setCertTable)({name:it(),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 f={url:t,ca:u?.usingCA};if(e.hostname&&(f.name=e.hostname),e.subscriptions?f.subscriptions=e.subscriptions:f.replicates=!0,e.start_time&&(f.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(f.authorization=e.authorization),e.revoked_certificates&&(f.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?f.shard=u.shard:e.shard!==void 0&&(f.shard=e.shard),f.replicates){let p={url:s,ca:c,replicates:!0,subscriptions:null};(0,gc.get)(F.REPLICATION_SHARD)!==void 0&&(p.shard=(0,gc.get)(F.REPLICATION_SHARD)),e.retain_authorization&&(p.authorization=e.authorization),e.start_time&&(p.start_time=e.start_time),await zo(it(),p)}await zo(u?u.nodeName:f.name??Ti(t),f);let m;return e.operation==="update_node"?m=`Successfully updated '${t}'`:m=`Successfully added '${t}' to cluster`,d&&(m+=" but there was an error updating target node: "+d.message),m}async function CO(e){gs.trace("addNodeBack received request:",e);let t=await(0,Ks.signCertificate)(e),r;e.csr?(r=t.signingCA,gs.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,gs.info("addNodeBack received CA from node:",e.url));let n={url:e.url,ca:r};e.subscriptions?n.subscriptions=e.subscriptions:(n.replicates=!0,n.subscriptions=null),e.start_time&&(n.start_time=e.start_time),e.authorization&&(n.authorization=e.authorization),e.shard!==void 0&&(n.shard=e.shard);let s=await(0,Ks.getReplicationCertAuth)();if(n.replicates){let i={url:ac(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,gc.get)(F.REPLICATION_SHARD)!==void 0&&(i.shard=(0,gc.get)(F.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await zo(it(),i)}return await zo(e.hostname,n),t.nodeName=it(),t.usingCA=s?.certificate,gs.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function OO(e){gs.trace("removeNodeBack received request:",e),await Qt().delete(e.name)}function UK(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ks,xK,_c,gc,gs,ta,Fme,kme,Hme,cf=se(()=>{Ks=b(_s()),xK=b(at()),_c=b(require("joi")),gc=b(ce());q();uh();Yd();hs();gs=b(Q()),ta=b(_e()),{pki:Fme}=require("node-forge"),{HTTP_STATUS_CODES:kme}=ta.hdbErrors,Hme=_c.default.object({hostname:_c.default.string(),verify_tls:_c.default.boolean(),replicates:_c.default.boolean(),subscriptions:_c.default.array(),revoked_certificates:_c.default.array(),shard:_c.default.number()});o(qme,"setNode");o(CO,"addNodeBack");o(OO,"removeNodeBack");o(UK,"reverseSubscription")});var $T=v((ZBe,FK)=>{"use strict";var{handleHDBError:kT,hdbErrors:Gme}=_e(),{HTTP_STATUS_CODES:HT}=Gme,{addUpdateNodeValidator:$me}=UT(),qT=Q(),GT=(q(),M(Y)),BK=pt(),Vme=oe(),Ah=qt(),Ih=Vs(),PO=ce(),Kme=NO(),{Node:Yme,NodeSubscription:Wme}=hc(),{broadcast:zme}=Ze(),{setNode:jme}=(cf(),M(af)),JBe=ce(),XBe=(q(),M(Y)),Qme="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Jme="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Xme=PO.get(GT.CONFIG_PARAMS.CLUSTERING_NODENAME);FK.exports=Zme;async function Zme(e,t=!1){if(qT.trace("addNode called with:",e),PO.get(GT.CONFIG_PARAMS.REPLICATION_URL)||PO.get(GT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return jme(e);Ih.checkClusteringEnabled();let r=$me(e);if(r)throw kT(r,r.message,HT.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let f=await Ih.getNodeRecord(n);if(!Vme.isEmptyOrZeroLength(f))throw kT(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,HT.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Kme(e.subscriptions,n),a={message:void 0,added:s,skipped:i};if(s.length===0)return a.message=Qme,a;let c=Ih.buildNodePayloads(s,Xme,GT.OPERATIONS_ENUM.ADD_NODE,await Ih.getSystemInfo()),l=[];for(let f=0,m=s.length;f<m;f++){let p=s[f];s[f].start_time===void 0&&delete s[f].start_time,l.push(new Wme(p.schema,p.table,p.publish,p.subscribe))}qT.trace("addNode sending remote payload:",c);let u;try{u=await Ah.request(`${n}.${BK.REQUEST_SUFFIX}`,c)}catch(f){qT.error(`addNode received error from request: ${f}`);for(let p=0,h=s.length;p<h;p++){let E=s[p];E.publish=!1,E.subscribe=!1,await Ah.updateRemoteConsumer(E,n)}let m=Ah.requestErrorHandler(f,"add_node",n);throw kT(new Error,m,HT.INTERNAL_SERVER_ERROR,"error",m)}if(u.status===BK.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${n}: ${u.message}`;throw kT(new Error,f,HT.INTERNAL_SERVER_ERROR,"error",f)}qT.trace(u);for(let f=0,m=s.length;f<m;f++){let p=s[f];await Ah.updateRemoteConsumer(p,n),p.subscribe===!0&&await Ah.updateConsumerIterator(p.schema,p.table,n,"start")}let d=new Yme(n,l,u.system_info);return await Ih.upsertNodeRecord(d),zme({type:"nats_update"}),i.length>0?a.message=Jme:a.message=`Successfully added '${n}' to manifest`,a}o(Zme,"addNode")});var vO=v((rFe,HK)=>{"use strict";var{handleHDBError:LO,hdbErrors:epe}=_e(),{HTTP_STATUS_CODES:DO}=epe,{addUpdateNodeValidator:tpe}=UT(),wh=Q(),VT=(q(),M(Y)),kK=pt(),tFe=oe(),Nh=qt(),Ch=Vs(),MO=ce(),{cloneDeep:rpe}=require("lodash"),npe=NO(),{Node:spe,NodeSubscription:ipe}=hc(),{broadcast:ope}=Ze(),{setNode:ape}=(cf(),M(af)),cpe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",lpe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",upe=MO.get(VT.CONFIG_PARAMS.CLUSTERING_NODENAME);HK.exports=dpe;async function dpe(e){if(wh.trace("updateNode called with:",e),MO.get(VT.CONFIG_PARAMS.REPLICATION_URL)??MO.get(VT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return ape(e);Ch.checkClusteringEnabled();let t=tpe(e);if(t)throw LO(t,t.message,DO.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await Ch.getNodeRecord(r);s.length>0&&(n=rpe(s));let{added:i,skipped:a}=await npe(e.subscriptions,r),c={message:void 0,updated:i,skipped:a};if(i.length===0)return c.message=cpe,c;let l=Ch.buildNodePayloads(i,upe,VT.OPERATIONS_ENUM.UPDATE_NODE,await Ch.getSystemInfo());for(let d=0,f=i.length;d<f;d++){let m=i[d];wh.trace(`updateNode updating work stream for node: ${r} subscription:`,m),i[d].start_time===void 0&&delete i[d].start_time}wh.trace("updateNode sending remote payload:",l);let u;try{u=await Nh.request(`${r}.${kK.REQUEST_SUFFIX}`,l)}catch(d){wh.error(`updateNode received error from request: ${d}`);let f=Nh.requestErrorHandler(d,"update_node",r);throw LO(new Error,f,DO.INTERNAL_SERVER_ERROR,"error",f)}if(u.status===kK.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw LO(new Error,d,DO.INTERNAL_SERVER_ERROR,"error",d)}wh.trace(u);for(let d=0,f=i.length;d<f;d++){let m=i[d];await Nh.updateRemoteConsumer(m,r),m.subscribe===!0?await Nh.updateConsumerIterator(m.schema,m.table,r,"start"):await Nh.updateConsumerIterator(m.schema,m.table,r,"stop")}return n||(n=[new spe(r,[],u.system_info)]),await fpe(n[0],i,u.system_info),a.length>0?c.message=lpe:c.message=`Successfully updated '${r}'`,c}o(dpe,"updateNode");async function fpe(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let a=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let d=n.subscriptions[l];if(d.schema===a.schema&&d.table===a.table){d.publish=a.publish,d.subscribe=a.subscribe,c=!0;break}}c||n.subscriptions.push(new ipe(a.schema,a.table,a.publish,a.subscribe))}n.system_info=r,await Ch.upsertNodeRecord(n),ope({type:"nats_update"})}o(fpe,"updateNodeTable")});var KK=v((sFe,VK)=>{"use strict";var $K=require("joi"),{string:qK}=$K.types(),mpe=at(),GK=(q(),M(Y)),ppe=ce(),hpe=pt();VK.exports=Epe;function Epe(e){let t=qK.invalid(ppe.get(GK.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(hpe.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=$K.object({operation:qK.valid(GK.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return mpe.validateBySchema(e,r)}o(Epe,"removeNodeValidator")});var KT=v((oFe,QK)=>{"use strict";var{handleHDBError:YK,hdbErrors:_pe}=_e(),{HTTP_STATUS_CODES:WK}=_pe,gpe=KK(),Oh=Q(),zK=Vs(),Spe=oe(),lf=(q(),M(Y)),jK=pt(),UO=qt(),xO=ce(),{RemotePayloadObject:Tpe}=yh(),{NodeSubscription:ype}=hc(),Rpe=nd(),bpe=Qa(),{broadcast:Ape}=Ze(),{setNode:Ipe}=(cf(),M(af)),wpe=xO.get(lf.CONFIG_PARAMS.CLUSTERING_NODENAME);QK.exports=Npe;async function Npe(e){if(Oh.trace("removeNode called with:",e),xO.get(lf.CONFIG_PARAMS.REPLICATION_URL)??xO.get(lf.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Ipe(e);zK.checkClusteringEnabled();let t=gpe(e);if(t)throw YK(t,t.message,WK.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await zK.getNodeRecord(r);if(Spe.isEmptyOrZeroLength(n))throw YK(new Error,`Node '${r}' was not found.`,WK.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new Tpe(lf.OPERATIONS_ENUM.REMOVE_NODE,wpe,[]),i,a=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await UO.updateConsumerIterator(d.schema,d.table,r,"stop");try{await UO.updateRemoteConsumer(new ype(d.schema,d.table,!1,!1),r)}catch(f){Oh.error(f)}}try{i=await UO.request(`${r}.${jK.REQUEST_SUFFIX}`,s),Oh.trace("Remove node reply from remote node:",r,i)}catch(l){Oh.error("removeNode received error from request:",l),a=!0}let c=new Rpe(lf.SYSTEM_SCHEMA_NAME,lf.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await bpe.deleteRecord(c),Ape({type:"nats_update"}),i?.status===jK.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||a?(Oh.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`}o(Npe,"removeNode")});var ZK=v((cFe,XK)=>{"use strict";var JK=require("joi"),{string:Cpe,array:Ope}=JK.types(),Ppe=at(),Lpe=UT();XK.exports=Dpe;function Dpe(e){let t=JK.object({operation:Cpe.valid("configure_cluster").required(),connections:Ope.items(Lpe.validationSchema).required()});return Ppe.validateBySchema(e,t)}o(Dpe,"configureClusterValidator")});var BO=v((uFe,sY)=>{"use strict";var eY=(q(),M(Y)),YT=Q(),Mpe=oe(),vpe=ce(),Upe=KT(),xpe=$T(),Bpe=Vs(),Fpe=ZK(),{handleHDBError:tY,hdbErrors:kpe}=_e(),{HTTP_STATUS_CODES:rY}=kpe,Hpe="Configure cluster complete.",qpe="Failed to configure the cluster. Check the logs for more details.",Gpe="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";sY.exports=$pe;async function $pe(e){YT.trace("configure cluster called with:",e);let t=Fpe(e);if(t)throw tY(t,t.message,rY.BAD_REQUEST,void 0,void 0,!0);let r=await Bpe.getAllNodeRecords(),n=[];if(vpe.get(eY.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,f=r.length;d<f;d++){let m=await nY(Upe,{operation:eY.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(m)}YT.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let f=e.connections[d],m=await nY(xpe,f,f.node_name);s.push(m)}YT.trace("All results from configure_cluster add node:",s);let a=[],c=[],l=!1,u=n.concat(s);for(let d=0,f=u.length;d<f;d++){let m=u[d];m.status==="rejected"&&(YT.error(m.node_name,m?.error?.message,m?.error?.stack),a.includes(m.node_name)||a.push(m.node_name)),(m?.result?.message?.includes?.("Successfully")||m?.result?.includes?.("Successfully"))&&(l=!0),!(typeof m.result=="string"&&m.result.includes("Successfully removed")||m.status==="rejected")&&c.push({node_name:m?.node_name,response:m?.result})}if(Mpe.isEmptyOrZeroLength(a))return{message:Hpe,connections:c};if(l)return{message:Gpe,failed_nodes:a,connections:c};throw tY(new Error,qpe,rY.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}o($pe,"configureCluster");async function nY(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}o(nY,"functionWrapper")});var cY=v((fFe,aY)=>{"use strict";var Ph=require("joi"),Vpe=at(),{validateSchemaExists:iY,validateTableExists:Kpe,validateSchemaName:oY}=Wi(),Ype=Ph.object({operation:Ph.string().valid("purge_stream"),schema:Ph.string().custom(iY).custom(oY).optional(),database:Ph.string().custom(iY).custom(oY).optional(),table:Ph.string().custom(Kpe).required()});function Wpe(e){return Vpe.validateBySchema(e,Ype)}o(Wpe,"purgeStreamValidator");aY.exports=Wpe});var FO=v((pFe,lY)=>{"use strict";var{handleHDBError:zpe,hdbErrors:jpe}=_e(),{HTTP_STATUS_CODES:Qpe}=jpe,Jpe=cY(),Xpe=qt(),Zpe=Vs();lY.exports=ehe;async function ehe(e){e.schema=e.schema??e.database;let t=Jpe(e);if(t)throw zpe(t,t.message,Qpe.BAD_REQUEST,void 0,void 0,!0);Zpe.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Xpe.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}o(ehe,"purgeStream")});var qO=v((EFe,_Y)=>{"use strict";var HO=Vs(),the=qt(),zT=ce(),uf=(q(),M(Y)),Wl=pt(),rhe=oe(),kO=Q(),{RemotePayloadObject:nhe}=yh(),{ErrorCode:uY}=require("nats"),{parentPort:dY}=require("worker_threads"),{onMessageByType:she}=Ze(),{getThisNodeName:ihe}=(hs(),M(Qo)),{requestClusterStatus:ohe}=(uh(),M(AV)),{getReplicationSharedStatus:ahe,getHDBNodeTable:che}=(Yd(),M(SV)),{CONFIRMATION_STATUS_POSITION:lhe,RECEIVED_VERSION_POSITION:fY,RECEIVED_TIME_POSITION:uhe,SENDING_TIME_POSITION:dhe,RECEIVING_STATUS_POSITION:fhe,RECEIVING_STATUS_RECEIVING:mhe,BACK_PRESSURE_RATIO_POSITION:phe}=(QC(),M(E1)),mY=zT.get(uf.CONFIG_PARAMS.CLUSTERING_ENABLED),pY=zT.get(uf.CONFIG_PARAMS.CLUSTERING_NODENAME);_Y.exports={clusterStatus:hhe,buildNodeStatus:EY};var hY;she("cluster-status",async e=>{hY(e)});async function hhe(){if(zT.get(uf.CONFIG_PARAMS.REPLICATION_URL)||zT.get(uf.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;dY?(dY.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{hY=i})):n=ohe();for(let i of n.connections){let a=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let f of Object.values(databases[l]||{}))if(u=f.auditStore,u)break;if(!u)continue;let d=ahe(u,l,a);c.lastCommitConfirmed=WT(d[lhe]),c.lastReceivedRemoteTime=WT(d[fY]),c.lastReceivedLocalTime=WT(d[uhe]),c.lastReceivedVersion=d[fY],c.sendingMessage=WT(d[dhe]),c.backPressurePercent=d[phe]*100,c.lastReceivedStatus=d[fhe]===mhe?"Receiving":"Waiting"}}n.node_name=ihe();let s=che().primaryStore.get(n.node_name);return s?.shard&&(n.shard=s.shard),s?.url&&(n.url=s.url),n.is_enabled=!0,n}let e={node_name:pY,is_enabled:mY,connections:[]};if(!mY)return e;let t=await HO.getAllNodeRecords();if(rhe.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(EY(t[n],e.connections));return await Promise.allSettled(r),e}o(hhe,"clusterStatus");function WT(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}o(WT,"asDate");async function EY(e,t){let r=e.name,n=new nhe(uf.OPERATIONS_ENUM.CLUSTER_STATUS,pY,void 0,await HO.getSystemInfo()),s,i,a=Wl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await the.request(Wl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Wl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(a=Wl.CLUSTER_STATUS_STATUSES.CLOSED,kO.error(`Error getting node status from ${r} `,s))}catch(l){kO.warn(`Error getting node status from ${r}`,l),l.code===uY.NoResponders?a=Wl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===uY.Timeout?a=Wl.CLUSTER_STATUS_STATUSES.TIMEOUT:a=Wl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Ehe(r,a,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!==uf.PRE_4_0_0_VERSION&&await HO.upsertNodeRecord(l)}catch(l){kO.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}o(EY,"buildNodeStatus");function Ehe(e,t,r,n,s,i,a,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=a,this.system_info=c}o(Ehe,"NodeStatusObject")});var $O=v((gFe,gY)=>{"use strict";var{handleHDBError:_he,hdbErrors:ghe}=_e(),{HTTP_STATUS_CODES:She}=ghe,The=qt(),yhe=Vs(),GO=oe(),jT=require("joi"),Rhe=at(),bhe=2e3,Ahe=jT.object({timeout:jT.number().min(1),connected_nodes:jT.boolean(),routes:jT.boolean()});gY.exports=Ihe;async function Ihe(e){yhe.checkClusteringEnabled();let t=Rhe.validateBySchema(e,Ahe);if(t)throw _he(t,t.message,She.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||GO.autoCastBoolean(n),a=s===void 0||GO.autoCastBoolean(s),c={nodes:[]},l=await The.getServerList(r??bhe),u={};if(i)for(let d=0,f=l.length;d<f;d++){let m=l[d].statsz;m&&(u[l[d].server.name]=m.routes)}for(let d=0,f=l.length;d<f;d++){if(l[d].statsz)continue;let m=l[d].server,p=l[d].data;if(m.name.endsWith("-hub")){let h={name:m.name.slice(0,-4),response_time:l[d].response_time};i&&(h.connected_nodes=[],u[m.name]&&u[m.name].forEach(E=>{h.connected_nodes.includes(E.name.slice(0,-4))||h.connected_nodes.push(E.name.slice(0,-4))})),a&&(h.routes=p.cluster?.urls?p.cluster?.urls.map(E=>({host:E.split(":")[0],port:GO.autoCast(E.split(":")[1])})):[]),c.nodes.push(h)}}return c}o(Ihe,"clusterNetwork")});var RY=v((TFe,yY)=>{"use strict";var VO=require("joi"),SY=at(),{routeConstraints:TY}=kw();yY.exports={setRoutesValidator:whe,deleteRoutesValidator:Nhe};function whe(e){let t=VO.object({server:VO.valid("hub","leaf"),routes:TY.required()});return SY.validateBySchema(e,t)}o(whe,"setRoutesValidator");function Nhe(e){let t=VO.object({routes:TY.required()});return SY.validateBySchema(e,t)}o(Nhe,"deleteRoutesValidator")});var QT=v((RFe,OY)=>{"use strict";var ra=Tt(),KO=oe(),Ys=(q(),M(Y)),df=ce(),bY=RY(),{handleHDBError:AY,hdbErrors:Che}=_e(),{HTTP_STATUS_CODES:IY}=Che,wY="cluster routes successfully set",NY="cluster routes successfully deleted";OY.exports={setRoutes:Phe,getRoutes:Lhe,deleteRoutes:Dhe};function Ohe(e){let t=ra.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 a=0,c=e.routes.length;a<c;a++){let l=e.routes[a];l.port=KO.autoCast(l.port);let u=r.some(f=>f.host===l.host&&f.port===l.port),d=n.some(f=>f.host===l.host&&f.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?ra.updateConfigValue(Ys.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):ra.updateConfigValue(Ys.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:wY,set:i,skipped:s}}o(Ohe,"setRoutesNats");function Phe(e){let t=bY.setRoutesValidator(e);if(t)throw AY(t,t.message,IY.BAD_REQUEST,void 0,void 0,!0);if(df.get(Ys.CONFIG_PARAMS.CLUSTERING_ENABLED))return Ohe(e);let r=[],n=[],s=df.get(Ys.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{CY(s,i)?n.push(i):(s.push(i),r.push(i))}),ra.updateConfigValue(Ys.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:wY,set:r,skipped:n}}o(Phe,"setRoutes");function CY(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}o(CY,"existsInArray");function Lhe(){if(df.get(Ys.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=ra.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return df.get(Ys.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}o(Lhe,"getRoutes");function Dhe(e){let t=bY.deleteRoutesValidator(e);if(t)throw AY(t,t.message,IY.BAD_REQUEST,void 0,void 0,!0);if(df.get(Ys.CONFIG_PARAMS.CLUSTERING_ENABLED))return Mhe(e);let r=[],n=[],s=df.get(Ys.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(a=>{CY(e.routes,a)?r.push(a):(i.push(a),n.push(a))}),ra.updateConfigValue(Ys.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:NY,deleted:r,skipped:n}}o(Dhe,"deleteRoutes");function Mhe(e){let t=ra.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],a=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let d=e.routes[l],f=!1;for(let m=0,p=r.length;m<p;m++){let h=r[m];if(d.host===h.host&&d.port===h.port){r.splice(m,1),f=!0,a=!0,s.push(d);break}}if(!f){let m=!0;for(let p=0,h=n.length;p<h;p++){let E=n[p];if(d.host===E.host&&d.port===E.port){n.splice(p,1),c=!0,m=!1,s.push(d);break}}m&&i.push(d)}}return a&&(r=KO.isEmptyOrZeroLength(r)?null:r,ra.updateConfigValue(Ys.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=KO.isEmptyOrZeroLength(n)?null:n,ra.updateConfigValue(Ys.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:NY,deleted:s,skipped:i}}o(Mhe,"deleteRoutesNats")});var LY=v((AFe,PY)=>{"use strict";var vhe=pt(),YO=class{static{o(this,"HubConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f,m,p,h){this.port=t,a===null&&(a=void 0),this.server_name=r+vhe.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:a,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c}},this.cluster={name:d,port:f,routes:m,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l}},this.accounts={SYS:{users:p},HDB:{users:h}},this.system_account="SYS"}};PY.exports=YO});var vY=v((wFe,MY)=>{"use strict";var DY=pt(),WO=class{static{o(this,"LeafConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f){this.port=t,f===null&&(f=void 0),this.server_name=r+DY.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+DY.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:d,ca_file:f,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:f,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:f,insecure:!0},urls:a,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};MY.exports=WO});var xY=v((CFe,UY)=>{"use strict";var zO=class{static{o(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};UY.exports=zO});var FY=v((PFe,BY)=>{"use strict";var Uhe=pt(),jO=class{static{o(this,"SysUserObject")}constructor(t,r){this.user=t+Uhe.SERVER_SUFFIX.ADMIN,this.password=r}};BY.exports=jO});var ey=v((DFe,qY)=>{"use strict";var zl=require("path"),jl=require("fs-extra"),xhe=LY(),Bhe=vY(),Fhe=xY(),khe=FY(),QO=fs(),mf=oe(),Kn=Tt(),XT=(q(),M(Y)),Lh=pt(),{CONFIG_PARAMS:or}=XT,pf=Q(),Dh=ce(),kY=Zi(),JO=qt(),Hhe=_s(),ff="clustering",qhe=1e4,HY=50;qY.exports={generateNatsConfig:$he,removeNatsConfig:Vhe,getHubConfigPath:Ghe};function Ghe(){let e=Dh.get(or.ROOTPATH);return zl.join(e,ff,Lh.NATS_CONFIG_FILES.HUB_SERVER)}o(Ghe,"getHubConfigPath");async function $he(e=!1,t=void 0){console.error("Warning: NATS replication is deprecated and will be removed in version 5.0 of Harper");let r=Dh.get(or.ROOTPATH);jl.ensureDirSync(zl.join(r,"clustering","leaf")),Dh.initSync();let n=Kn.getConfigFromFile(or.CLUSTERING_TLS_CERT_AUTH),s=Kn.getConfigFromFile(or.CLUSTERING_TLS_PRIVATEKEY),i=Kn.getConfigFromFile(or.CLUSTERING_TLS_CERTIFICATE);!await jl.exists(i)&&!await jl.exists(!n)&&await Hhe.createNatsCerts();let a=zl.join(r,ff,Lh.PID_FILES.HUB),c=zl.join(r,ff,Lh.PID_FILES.LEAF),l=Kn.getConfigFromFile(or.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=zl.join(r,ff,Lh.NATS_CONFIG_FILES.HUB_SERVER),d=zl.join(r,ff,Lh.NATS_CONFIG_FILES.LEAF_SERVER),f=Kn.getConfigFromFile(or.CLUSTERING_TLS_INSECURE),m=Kn.getConfigFromFile(or.CLUSTERING_TLS_VERIFY),p=Kn.getConfigFromFile(or.CLUSTERING_NODENAME),h=Kn.getConfigFromFile(or.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await JO.checkNATSServerInstalled()||ZT("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let E=await QO.listUsers(),g=Kn.getConfigFromFile(or.CLUSTERING_USER),R=await QO.getClusterUser();(mf.isEmpty(R)||R.active!==!0)&&ZT(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await JT(or.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await JT(or.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await JT(or.CLUSTERING_HUBSERVER_NETWORK_PORT),await JT(or.CLUSTERING_LEAFSERVER_NETWORK_PORT));let S=[],y=[];for(let[X,z]of E.entries())z.role?.role===XT.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(S.push(new khe(z.username,kY.decrypt(z.hash))),y.push(new Fhe(z.username,kY.decrypt(z.hash))));let C=[],{hub_routes:I}=Kn.getClusteringRoutes();if(!mf.isEmptyOrZeroLength(I))for(let X of I)C.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${X.host}:${X.port}`);let k=new xhe(Kn.getConfigFromFile(or.CLUSTERING_HUBSERVER_NETWORK_PORT),p,a,i,s,n,f,m,h,Kn.getConfigFromFile(or.CLUSTERING_HUBSERVER_CLUSTER_NAME),Kn.getConfigFromFile(or.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),C,S,y);n==null&&(delete k.tls.ca_file,delete k.leafnodes.tls.ca_file),t=mf.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===XT.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await jl.writeJson(u,k),pf.trace(`Hub server config written to ${u}`));let J=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,G=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,H=new Bhe(Kn.getConfigFromFile(or.CLUSTERING_LEAFSERVER_NETWORK_PORT),p,c,l,[J],[G],S,y,i,s,n,f);n==null&&delete H.tls.ca_file,(t===void 0||t===XT.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await jl.writeJson(d,H),pf.trace(`Leaf server config written to ${d}`))}o($he,"generateNatsConfig");async function JT(e){let t=Dh.get(e);return mf.isEmpty(t)&&ZT(`port undefined for '${e}'`),await mf.isPortTaken(t)&&ZT(`'${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}o(JT,"isPortAvailable");function ZT(e){let t=`Error generating clustering config: ${e}`;pf.error(t),console.error(t),process.exit(1)}o(ZT,"generateNatsConfigError");async function Vhe(e){let{port:t,config_file:r}=JO.getServerConfig(e),{username:n,decrypt_hash:s}=await QO.getClusterUser(),i=0,a=2e3;for(;i<HY;){try{let d=await JO.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){pf.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=HY)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=a*(i*2);u>3e4&&pf.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await mf.asyncSetTimeout(u)}let c="0".repeat(qhe),l=zl.join(Dh.get(or.ROOTPATH),ff,r);await jl.writeFile(l,c),await jl.remove(l),pf.notify(e,"started.")}o(Vhe,"removeNatsConfig")});var WY=v((vFe,YY)=>{"use strict";var Ss=ce(),Xe=(q(),M(Y)),Mh=pt(),na=require("path"),{PACKAGE_ROOT:ry}=Ot(),GY=ce(),ty=oe(),hf="/dev/null",Khe=na.join(ry,"launchServiceScripts"),$Y=na.join(ry,"utility/scripts"),Yhe=na.join($Y,Xe.HDB_RESTART_SCRIPT),VY=na.resolve(ry,"dependencies",`${process.platform}-${process.arch}`,Mh.NATS_BINARY_NAME);function KY(){let e={[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0,...process.env};return ty.noBootFile()&&(e[Xe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=ty.getEnvCliRootPath()),{name:Xe.PROCESS_DESCRIPTORS.HDB,script:Xe.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:e,execArgv:process.execArgv,cwd:ry}}o(KY,"generateMainServerConfig");var Whe=9930;function zhe(){Ss.initSync(!0);let e=Ss.get(Xe.CONFIG_PARAMS.ROOTPATH),t=na.join(e,"clustering",Mh.NATS_CONFIG_FILES.HUB_SERVER),r=na.join(Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Xe.LOG_NAMES.HDB),n=GY.get(Xe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Mh.LOG_LEVEL_FLAGS[Ss.get(Xe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Whe?"-"+n:""),binFile:VY,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=hf,i.error_file=hf),i}o(zhe,"generateNatsHubServerConfig");var jhe=9940;function Qhe(){Ss.initSync(!0);let e=Ss.get(Xe.CONFIG_PARAMS.ROOTPATH),t=na.join(e,"clustering",Mh.NATS_CONFIG_FILES.LEAF_SERVER),r=na.join(Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Xe.LOG_NAMES.HDB),n=GY.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Mh.LOG_LEVEL_FLAGS[Ss.get(Xe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==jhe?"-"+n:""),binFile:VY,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=hf,i.error_file=hf),i}o(Qhe,"generateNatsLeafServerConfig");function Jhe(){Ss.initSync();let e=na.join(Ss.get(Xe.CONFIG_PARAMS.LOGGING_ROOT),Xe.LOG_NAMES.HDB),t={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,binFile:Xe.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:Khe,autorestart:!1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=hf,t.error_file=hf),t}o(Jhe,"generateClusteringUpgradeV4ServiceConfig");function Xhe(){let e={[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.RESTART_HDB};return ty.noBootFile()&&(e[Xe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=ty.getEnvCliRootPath()),{...{name:Xe.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:$Y},script:Yhe}}o(Xhe,"generateRestart");function Zhe(){return{apps:[KY()]}}o(Zhe,"generateAllServiceConfigs");YY.exports={generateAllServiceConfigs:Zhe,generateMainServerConfig:KY,generateRestart:Xhe,generateNatsHubServerConfig:zhe,generateNatsLeafServerConfig:Qhe,generateClusteringUpgradeV4ServiceConfig:Jhe}});var Ef=v((BFe,eW)=>{"use strict";var Or=(q(),M(Y)),xFe=oe(),ia=ey(),ny=qt(),sa=pt(),Sc=WY(),ZO=ce(),Tc=Q(),eEe=Vs(),{startWorker:zY,onMessageFromWorkers:tEe}=Ze(),jY=require("fs"),rEe=require("node:path"),nEe=(q(),M(Y)),{setTimeout:sEe}=require("node:timers/promises"),{execFile:iEe,fork:oEe}=require("node:child_process");eW.exports={start:yc,restart:cEe,kill:fEe,startAllServices:mEe,startService:JY,restartHdb:lEe,startClusteringProcesses:XY,startClusteringThreads:ZY,isHdbRestartRunning:uEe,getHdbPid:dEe,cleanupChildrenProcesses:vh,reloadClustering:hEe,expectedRestartOfChildren:QY};tEe(e=>{e.type==="restart"&&ZO.initSync(!0)});var fo=[],aEe=10,XO;function yc(e,t=!1){let r=typeof e.args=="string"?e.args.split(" "):e.args;e.silent=!0,e.detached=!0;let n=e.script?oEe(e.script,r,e):iEe(e.binFile,r,e);n.name=e.name,n.config=e,n.on("error",(a,c)=>{console.error(a,c)}),n.on("exit",async a=>{let c=fo.indexOf(n);c>-1&&fo.splice(c,1),!XO&&a!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<aEe&&(jY.existsSync(ia.getHubConfigPath())?yc(e):(await ia.generateNatsConfig(!0),yc(e),await new Promise(l=>setTimeout(l,3e3)),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let s={serviceName:e.name.replace(/ /g,"-")};function i(a){let c=ZO.get(Or.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),l=/\[\d+][^\[]+\[(\w+)]/g,u,d=0,f;for(;u=l.exec(a);){if(u.index&&sa.LOG_LEVEL_HIERARCHY[c]>=sa.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===sa.LOG_LEVELS.ERR||f===sa.LOG_LEVELS.WRN?Tc.OUTPUTS.STDERR:Tc.OUTPUTS.STDOUT;Tc.logCustomLevel(f||"info",h,s,a.slice(d,u.index).trim())}let[m,p]=u;d=u.index+m.length,f=sa.LOG_LEVELS[p]}if(sa.LOG_LEVEL_HIERARCHY[c]>=sa.LOG_LEVEL_HIERARCHY[f||"info"]){let m=f===sa.LOG_LEVELS.ERR||f===sa.LOG_LEVELS.WRN?Tc.OUTPUTS.STDERR:Tc.OUTPUTS.STDOUT;Tc.logCustomLevel(f||"info",m,s,a.toString().slice(d).trim())}}o(i,"extractMessages"),n.stdout.on("data",i),n.stderr.on("data",i),n.unref(),fo.length===0&&(t||(process.on("exit",vh),process.on("SIGINT",vh),process.on("SIGQUIT",vh),process.on("SIGTERM",vh))),fo.push(n)}o(yc,"start");function vh(e=!0){if(!XO&&(XO=!0,fo.length!==0))if(Tc.info("Killing child processes..."),fo.map(t=>t.kill()),e)process.exit(0);else return sEe(2e3)}o(vh,"cleanupChildrenProcesses");function cEe(e){QY();for(let t of fo)t.name===e&&t.kill()}o(cEe,"restart");function QY(){for(let e of fo)e.config&&(e.config.restarts=0)}o(QY,"expectedRestartOfChildren");async function lEe(){await yc(Sc.generateRestart())}o(lEe,"restartHdb");async function uEe(){let e=await list();for(let t in e)if(e[t].name===Or.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}o(uEe,"isHdbRestartRunning");function dEe(){let e=ZO.getHdbBasePath();if(!e)return;let t=rEe.join(e,nEe.HDB_PID_FILE),r=EEe(t);if(!(!r||r===process.pid)&&_Ee(r))return r}o(dEe,"getHdbPid");function fEe(){for(let e of fo)e.kill();fo=[]}o(fEe,"kill");async function mEe(){await XY(),await ZY(),await yc(Sc.generateAllServiceConfigs())}o(mEe,"startAllServices");async function JY(e,t=!1){let r;switch(e=e.toLowerCase(),e){case Or.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Sc.generateMainServerConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Sc.generateNatsIngestServiceConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Sc.generateNatsReplyServiceConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Sc.generateNatsHubServerConfig(),await yc(r,t),await ia.removeNatsConfig(e);return;case Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Sc.generateNatsLeafServerConfig(),await yc(r,t),await ia.removeNatsConfig(e);return;case Or.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Sc.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}yc(r,t)}o(JY,"startService");var pEe;async function XY(e=!1){for(let t in Or.CLUSTERING_PROCESSES){let r=Or.CLUSTERING_PROCESSES[t];await JY(r,e)}}o(XY,"startClusteringProcesses");async function ZY(){pEe=zY(Or.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:Or.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await ny.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await ny.updateLocalStreams();let e=await eEe.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===Or.PRE_4_0_0_VERSION){Tc.info("Starting clustering upgrade 4.0.0 process"),zY(Or.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}o(ZY,"startClusteringThreads");async function hEe(){await ia.generateNatsConfig(!0),await ny.reloadNATSHub(),await ny.reloadNATSLeaf(),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}o(hEe,"reloadClustering");function EEe(e){try{return Number.parseInt(jY.readFileSync(e,"utf8"),10)}catch{return null}}o(EEe,"readPidFile");function _Ee(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(_Ee,"isProcessRunning")});var rP={};Re(rP,{compactOnStart:()=>gEe,copyDb:()=>oW});async function gEe(){Rc.notify("Running compact on start"),console.log("Running compact on start");let e=(0,eP.get)(F.ROOTPATH),t=new Map,r=ct();(0,tP.updateConfigValue)(F.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,sy.join)(e,"backup",n+".mdb"),a=(0,sy.join)(e,Yc,n+"-copy.mdb"),c=0;try{c=await tW(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){Rc.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{dbPath:s,copyDest:a,backupDest:i,recordCount:c}),await oW(n,a),console.log("Backing up",n,"to",i);try{await(0,Ql.move)(s,i,{overwrite:!0})}catch(l){console.log("Error moving database",s,"to",i,l)}}try{Id()}catch(n){Rc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}for(let[n,{dbPath:s,copyDest:i}]of t)console.log("Moving copy compacted",n,"to",s),await(0,Ql.move)(i,s,{overwrite:!0}),await(0,Ql.remove)((0,sy.join)(e,Yc,`${n}-copy.mdb-lock`));try{Id()}catch(n){Rc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){Rc.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,tP.updateConfigValue)(F.STORAGE_COMPACTONSTART,!1);for(let[s,{dbPath:i,backupDest:a}]of t){console.error("Moving backup database",a,"back to",i);try{await(0,Ql.move)(a,i,{overwrite:!0})}catch(c){console.error(c)}}throw Id(),n}for(let[n,{backupDest:s,recordCount:i}]of t){let a=!0,c=await tW(n);if(console.log("Database",n,"after compact has a total record count of",c),i!==c){a=!1;let l=`There is a discrepancy between pre and post compact record count for database ${n}.
21
21
  Total record count before compaction: ${i}, total after: ${c}.
22
22
  Database backup has not been removed and can be found here: ${s}`;Rc.error(l),console.error(l)}(0,eP.get)(F.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||a===!1||(console.log("Removing backup",s),await(0,Ql.remove)(s))}}async function tW(e){let t=await(0,iW.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}function _f(){}async function oW(e,t){console.log(`Copying database ${e} to ${t}`);let r=ct()[e];if(!r)throw new Error(`Source database not found: ${e}`);let n;for(let f in r){let m=r[f];m.primaryStore.put=_f,m.primaryStore.remove=_f;for(let p in m.indices){let h=m.indices[p];h.put=_f,h.remove=_f}m.auditStore&&(m.auditStore.put=_f,m.auditStore.remove=_f),n=m.primaryStore.rootStore}if(!n)throw new Error(`Source database does not have any tables: ${e}`);let s=n.dbisDb,i=n.auditStore,a=(0,rW.open)(new nW.default(t)),c=a.openDB(iy.INTERNAL_DBIS_NAME),l,u=0,d=s.useReadTransaction();try{for(let{key:m,value:p}of s.getRange({transaction:d})){let h=p.is_hash_attribute||p.isPrimaryKey,E,g;if(h&&(E=p.compression,g=gS(),g?p.compression=g:delete p.compression,E?.dictionary?.toString()===g?.dictionary?.toString()&&(E=null,g=null)),c.put(m,p),!(h||p.indexed))continue;let R=new sW.OpenDBIObject(!h,h);R.encoding="binary",R.compression=E;let S=n.openDB(m,R);S.decoder=null,S.decoderCopies=!1,S.encoding="binary",R.compression=g;let y=a.openDB(m,R);y.encoder=null,console.log("copying",m,"from",e,"to",t),await f(S,y,h,d)}if(i){let m=n.openDB(iy.AUDIT_STORE_NAME,xm);console.log("copying audit log for",e,"to",t),f(i,m,!1,d)}async function f(m,p,h,E){let g=0,R=0,S=1e7,y=null;for(;S-- >0;)try{for(let C of m.getKeys({start:y,transaction:E}))try{y=C;let{value:I,version:k}=m.getEntry(C,{transaction:E});l=p.put(C,I,h?k:void 0),g++,E.openTimer&&(E.openTimer=0),R+=(C?.length||10)+I.length,u++>5e3&&(await l,console.log("copied",g,"entries",R,"bytes"),u=0)}catch(I){console.error("Error copying record",typeof C=="symbol"?"symbol":C,"from",e,"to",t,I)}console.log("finish copying, copied",g,"entries",R,"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)}}o(f,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{d.done(),a.close()}}var rW,sy,Ql,eP,nW,sW,iy,iW,tP,Rc,nP=se(()=>{we();rW=require("lmdb"),sy=require("path"),Ql=require("fs-extra"),eP=b(ce()),nW=b(jm()),sW=b(zm()),iy=b(Wt());q();Hi();iW=b(ic()),tP=b(Tt()),Rc=b(Q());o(gEe,"compactOnStart");o(tW,"getTotalDBRecordCount");o(_f,"noop");o(oW,"copyDb")});var iP=v(($Fe,aW)=>{"use strict";var Uh=ce();Uh.initSync();var gf=require("fs-extra"),sP=require("path"),Sf=(q(),M(Y)),SEe=require("crypto"),TEe=require("uuid").v4;aW.exports=yEe;function yEe(){if(Uh.getHdbBasePath()!==void 0){let e=sP.join(Uh.getHdbBasePath(),Sf.LICENSE_KEY_DIR_NAME,Sf.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=sP.join(Uh.getHdbBasePath(),Sf.LICENSE_KEY_DIR_NAME,Sf.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=sP.join(Uh.getHdbBasePath(),Sf.LICENSE_KEY_DIR_NAME,Sf.JWT_ENUM.JWT_PASSPHRASE_NAME);try{gf.accessSync(r),gf.accessSync(e),gf.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=TEe(),i=SEe.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});gf.writeFileSync(r,s),gf.writeFileSync(e,i.privateKey),gf.writeFileSync(t,i.publicKey)}else throw n}}}o(yEe,"checkJWTTokenExist")});var lW=v((KFe,cW)=>{"use strict";var oP=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};cW.exports={HdbInfoInsertObject:oP}});var fW=v((WFe,dW)=>{"use strict";var uW=(q(),M(Y)),aP=class{static{o(this,"UpgradeObject")}constructor(t,r){this[uW.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[uW.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};dW.exports={UpgradeObject:aP}});var oy=v((jFe,pW)=>{"use strict";var Ws=require("prompt"),Tf=require("chalk"),mW=Q(),bi=require("os"),cP=Wc(),lP=["yes","y"];async function REe(e){let t=`${bi.EOL}`+Tf.bold.green("Your current HarperDB version requires that we complete an update process.")+`${bi.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${bi.EOL}${bi.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${bi.EOL}`;Ws.override=cP(["CONFIRM_UPGRADE"]),Ws.start(),Ws.message=t;let r={properties:{CONFIRM_UPGRADE:{description:Tf.magenta(`${bi.EOL}[CONFIRM_UPGRADE] Do you want to upgrade your HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n;try{n=await Ws.get([r])}catch(s){return mW.error("There was an error when prompting user about an upgrade."),mW.error(s),!1}return lP.includes(n.CONFIRM_UPGRADE)}o(REe,"forceUpdatePrompt");async function bEe(e){let t=`${bi.EOL}`+Tf.bold.green(`Your installed HarperDB version is older than the version used to create your data. Downgrading is not recommended as it is not tested and guaranteed to work. However, if you need to downgrade, and a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${bi.EOL}`);Ws.override=cP(["CONFIRM_DOWNGRADE"]),Ws.start(),Ws.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:Tf.magenta(`${bi.EOL}[CONFIRM_DOWNGRADE] Do you want to proceed with using your downgraded HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n=await Ws.get([r]);return lP.includes(n.CONFIRM_DOWNGRADE)}o(bEe,"forceDowngradePrompt");async function AEe(){let e=`${bi.EOL}`+Tf.bold.green("We now require a Certifacte Authority certificate. HarperDB can generate all new certificates for you (your existing certificates will be backed up) or you can keep any existing certificates and add your own CA certificate. To add your own CA certificate set the <certificateAuthority> parameter in harperdb-config.yaml");Ws.override=cP(["GENERATE_CERTS"]),Ws.start(),Ws.message=e;let t={properties:{GENERATE_CERTS:{description:Tf.magenta(`${bi.EOL}[GENERATE_CERTS] Do you want HarperDB to generate all new certificates? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"yes",required:!0}}},r=await Ws.get([t]);return lP.includes(r.GENERATE_CERTS)}o(AEe,"upgradeCertsPrompt");pW.exports={forceUpdatePrompt:REe,forceDowngradePrompt:bEe,upgradeCertsPrompt:AEe}});var ay=v((JFe,hW)=>{"use strict";var uP=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};hW.exports=uP});var _W=v((nke,EW)=>{"use strict";var IEe=oe(),wEe=Tt(),ZFe=Q(),eke=require("path"),tke=require("fs"),rke=(q(),M(Y));EW.exports={getOldPropsValue:NEe};function NEe(e,t,r=!1){let n=t.getRaw(e);return IEe.isNotEmptyAndHasValue(n)?n:r?wEe.getDefaultConfig(e):""}o(NEe,"getOldPropsValue")});var yW=v((ike,TW)=>{"use strict";var bc=require("path"),Ac=require("fs-extra"),CEe=require("properties-reader"),OEe=ay(),gr=Q(),{getOldPropsValue:yt}=_W(),{HDB_SETTINGS_NAMES:Se,CONFIG_PARAMS:Jl}=(q(),M(Y)),Xl=Tt(),cy=ce(),gW=oe(),mo=(q(),M(Y)),dP=new OEe("3.1.0"),SW=[];function PEe(){let e=CEe(cy.get(Se.SETTINGS_PATH_KEY)),t="Updating settings file for version 3.1.0";console.log(t),gr.info(t);let r=` ;Settings for the HarperDB process.
23
23
 
@@ -130,7 +130,7 @@ Host ${s}
130
130
  `)}catch{d=". Unable to get known hosts from github.com. Set your known hosts manually using set_ssh_known_hosts."}a&&await Oe.appendFile(ha,a);let f=await Ci(e);return f.message=`Added ssh key: ${r}${d}`,f}o(gye,"addSSHKey");async function Sye(e){let t=Wn.updateSSHKeyValidator(e);if(t)throw Xt(t,t.message,Zt.BAD_REQUEST);let{name:r,key:n}=e;Jt.trace("updating ssh key",r);let s=$e.join(Uc,r+".key");if(!await Oe.pathExists(s))throw new Error("Key does not exist. Use add_ssh_key");await Oe.outputFile(s,n);let i=await Ci(e);return i.message=`Updated ssh key: ${r}`,i}o(Sye,"updateSSHKey");async function Tye(e){let t=Wn.deleteSSHKeyValidator(e);if(t)throw Xt(t,t.message,Zt.BAD_REQUEST);let{name:r}=e;Jt.trace("deleting ssh key",r);let n=$e.join(Uc,r+".key"),s=$e.join(Uc,"config");if(!await Oe.pathExists(n))throw new Error("Key does not exist");let i=await Oe.readFile(s,"utf8"),a=new RegExp(`#${r}[\\S\\s]*?IdentitiesOnly yes`,"g");i=i.replace(a,""),await Oe.outputFile(s,i),Oe.removeSync(n);let c=await Ci(e);return c.message=`Deleted ssh key: ${r}`,c}o(Tye,"deleteSSHKey");async function yye(e){let t=[];return await Oe.pathExists(Uc)&&(await Oe.readdir(Uc)).forEach(r=>{r!="known_hosts"&&r!="config"&&t.push({name:r.split(".")[0]})}),t}o(yye,"listSSHKeys");async function Rye(e){let t=Wn.setSSHKnownHostsValidator(e);if(t)throw Xt(t,t.message,Zt.BAD_REQUEST);let{known_hosts:r}=e;await Oe.outputFile(ha,r);let n=await Ci(e);return n.message="Known hosts successfully set",n}o(Rye,"setSSHKnownHosts");async function bye(e){return await Oe.pathExists(ha)?{known_hosts:await Oe.readFile(ha,"utf8")}:{known_hosts:null}}o(bye,"getSSHKnownHosts");cr.customFunctionsStatus=sye;cr.getCustomFunctions=iye;cr.getCustomFunction=oye;cr.setCustomFunction=aye;cr.dropCustomFunction=cye;cr.addComponent=lye;cr.dropCustomFunctionProject=uye;cr.packageComponent=dye;cr.deployComponent=fye;cr.getComponents=pye;cr.getComponentFile=hye;cr.setComponentFile=Eye;cr.dropComponent=_ye;cr.addSSHKey=gye;cr.updateSSHKey=Sye;cr.deleteSSHKey=Tye;cr.listSSHKeys=yye;cr.setSSHKnownHosts=Rye;cr.getSSHKnownHosts=bye});var wL=v((vHe,f4)=>{"use strict";var Js=require("joi"),d4=at();f4.exports={readTransactionLogValidator:Aye,deleteTransactionLogsBeforeValidator:Iye};function Aye(e){let t=Js.object({schema:Js.string(),database:Js.string(),table:Js.string().required(),from:Js.date().timestamp(),to:Js.date().timestamp(),limit:Js.number().min(1)});return d4.validateBySchema(e,t)}o(Aye,"readTransactionLogValidator");function Iye(e){let t=Js.object({schema:Js.string(),database:Js.string(),table:Js.string().required(),timestamp:Js.date().timestamp().required()});return d4.validateBySchema(e,t)}o(Iye,"deleteTransactionLogsBeforeValidator")});var Zy=v((xHe,g4)=>{"use strict";var NL=(q(),M(Y)),aE=qt(),m4=oe(),p4=ce(),h4=Zi(),E4=Q(),{handleHDBError:Jy,hdbErrors:wye}=_e(),{HTTP_STATUS_CODES:Xy}=wye,{readTransactionLogValidator:Nye,deleteTransactionLogsBeforeValidator:Cye}=wL(),_4=cs(),Oye="Logs successfully deleted from transaction log.",Pye="All logs successfully deleted from transaction log.";g4.exports={readTransactionLog:Lye,deleteTransactionLogsBefore:Mye};async function Lye(e){let t=Nye(e);if(t)throw Jy(t,t.message,Xy.BAD_REQUEST,void 0,void 0,!0);e.database=e.database??e.schema??"data";let r=m4.checkSchemaTableExist(e.database,e.table);if(r)throw Jy(new Error,r,Xy.NOT_FOUND,void 0,void 0,!0);return p4.get(NL.CONFIG_PARAMS.CLUSTERING_ENABLED)?await Dye(e):(E4.info("Reading HarperDB logs used by Plexus"),(e.from||e.to)&&(e.search_type="timestamp",e.search_values=[e.from??0],e.to&&(e.search_values[1]=e.to)),_4.readAuditLog(e))}o(Lye,"readTransactionLog");async function*Dye(e){let t=h4.createNatsTableStreamName(e.database,e.table),r=await aE.viewStreamIterator(t,parseInt(e.from),e.limit);for await(let n of r){let s=Math.floor(n?.nats_timestamp/1e6);if(e.to&&s>e.to)break;let i={operation:n?.entry?.operation,user:n?.entry?.__origin?.user,timestamp:s,records:n?.entry?.records,attributes:n?.entry?.attributes};n?.entry?.operation===NL.OPERATIONS_ENUM.DELETE&&(i.hash_values=n?.entry?.hash_values),yield i}}o(Dye,"readTransactionLogNats");async function Mye(e){let t=Cye(e);if(t)throw Jy(t,t.message,Xy.BAD_REQUEST,void 0,void 0,!0);if(e.database=e.database??e.schema??"data",!p4.get(NL.CONFIG_PARAMS.CLUSTERING_ENABLED))return E4.info("Delete transaction logs called for Plexus"),_4.deleteAuditLogsBefore(e);let{database:r,table:n,timestamp:s}=e,i=m4.checkSchemaTableExist(r,n);if(i)throw Jy(new Error,i,Xy.NOT_FOUND,void 0,void 0,!0);let a=h4.createNatsTableStreamName(r,n),{jsm:c}=await aE.getNATSReferences(),l=await aE.getStreamInfo(a),u=new Date(l.state.first_ts).getTime();if(s<=u)return`No transactions exist before: ${s}`;let d=Oye,f,m=new Date(l.state.last_ts).getTime();return s>m?(f=l.state.last_seq+1,d=Pye):f=(await aE.viewStream(a,parseInt(s),1))[0].nats_sequence,await aE.purgeTableStream(r,n,{seq:f}),d}o(Mye,"deleteTransactionLogsBefore")});var CL=v((FHe,T4)=>{"use strict";var eR=require("joi"),vye=require("path"),{handleHDBError:Uye,hdbErrors:xye}=_e(),{HTTP_STATUS_CODES:Bye}=xye,Fye=at(),S4=Q();T4.exports={installModules:Gye};var{CONFIG_PARAMS:kye}=(q(),M(Y)),{getConfigValue:Hye}=Tt(),{nonInteractiveSpawn:qye}=(jy(),M(zy));async function Gye(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";S4.warn(t,e.projects);let r=Vye(e);if(r)throw Uye(r,r.message,Bye.BAD_REQUEST);let{projects:n,dryRun:s}=e,i=Hye(kye.COMPONENTSROOT),a={},c=["install","--force","--omit=dev","--json"];s&&c.push("--dry-run");for(let l of n){a[l]={npm_output:null,npm_error:null};let u=vye.join(i,l);try{let{stdout:d,stderr:f}=qye(l,"npm",c,u);d=d?d.replace(`
131
131
  `,""):null,f=f?f.replace(`
132
132
  `,""):null;try{a[l].npm_output=JSON.parse(d)}catch{a[l].npm_output=d}try{a[l].npm_error=JSON.parse(f)}catch{a[l].npm_error=f}}catch(d){d.stderr?a[l].npm_error=$ye(d.stderr):a[l].npm_error=d.message;continue}}return S4.info(`finished installModules with response ${a}`),a.warning=t,a}o(Gye,"installModules");function $ye(e){let t='"error": {',r=e.indexOf('"error": {'),n=e.indexOf(`}
133
- `);return r>-1&&n>-1?JSON.parse(e.substring(r+t.length-1,n+1)):e}o($ye,"parseNPMStdErr");function Vye(e){let t=eR.object({projects:eR.array().min(1).items(eR.string()).required(),dry_run:eR.boolean().default(!1)});return Fye.validateBySchema(e,t)}o(Vye,"modulesValidator")});var DL={};Re(DL,{describeMetric:()=>w4,describeMetricOp:()=>LL,get:()=>A4,getOp:()=>OL,listMetrics:()=>I4,listMetricsOp:()=>PL});async function Yye(e){return(await j_().get(e)).hostname}function y4(e,t){return e.length===0||e.includes(t)}function OL(e){return cE.trace?.("get_analytics request:",e),A4(e.metric,e.get_attributes,e.start_time,e.end_time,e.conditions)}function b4(e){return"conditions"in e?{...e,conditions:e.conditions.map(b4)}:{attribute:e.search_attribute??e.attribute,comparator:e.search_type??e.comparator,value:e.search_value??e.value}}async function A4(e,t,r,n,s){let i=[{attribute:"metric",comparator:"equals",value:e}];s&&i.push(...s.map(b4));let a=t??[];y4(a,"id")||a.push("id"),r&&i.push({attribute:"id",comparator:"greater_than_equal",value:r}),n&&i.push({attribute:"id",comparator:"less_than",value:n});let c={conditions:i};return a.length>0&&(c.select=a),cE.trace?.("get_analytics hdb_analytics.search request:",JSON.stringify(c)),(await databases.system.hdb_analytics.search(c)).map(async u=>{let d=u.id[1];return u.id=u.id[0],y4(a,"node")&&(cE.trace?.(`get_analytics lookup hostname for nodeId: ${d}`),u.node=await Yye(d)),cE.trace?.("get_analytics result:",JSON.stringify(u)),u})}function PL(e){return I4(e.metric_types)}async function I4(e=["builtin"]){let t=[],r=Object.values(xo);if(e.includes("builtin")&&(t=r),e.includes("custom")){let n=r.map(c=>({attribute:"metric",comparator:"not_equal",value:c})),s={select:["metric"],conditions:n},i=new Set,a=await databases.system.hdb_analytics.search(s);for await(let c of a)i.add(c.metric);t.push(...Array.from(i.values()))}return t}function LL(e){return w4(e.metric)}async function w4(e){let t={conditions:[{attribute:"metric",comparator:"equals",value:e}],sort:{attribute:"id",descending:!0},limit:1},r=databases.system.hdb_analytics.search(t),n=[{name:"node",type:"string"}];for await(let s of r){for(let a in s)n.push({name:a,type:typeof s[a]});let i={attributes:n};return cE.trace?.("describe_metric result:",JSON.stringify(i)),i}return{}}var R4,Kye,cE,ML=se(()=>{R4=b(Q());bA();AA();({forComponent:Kye}=R4.default),cE=Kye("analytics").conditional;o(Yye,"lookupHostname");o(y4,"isSelected");o(OL,"getOp");o(b4,"conformCondition");o(A4,"get");o(PL,"listMetricsOp");o(I4,"listMetrics");o(LL,"describeMetricOp");o(w4,"describeMetric")});var tR,rR,lE,nR=se(()=>{tR={primary:{allowedValues:null},maintenance:{allowedValues:null},availability:{allowedValues:["Available","Unavailable"]}},rR=Object.keys(tR),lE="primary"});function C4(e){return N4.validateBySchema(e,Qye)}var uE,N4,Wye,zye,jye,Qye,O4=se(()=>{uE=b(require("joi")),N4=b(at());nR();Wye=rR,zye=Object.entries(tR).reduce((e,[t,r])=>(r.allowedValues&&(e[t]=`Status "${t}" only accepts these values: ${r.allowedValues.join(", ")}`),e),{}),jye=o(()=>{let e=uE.default.string().min(1).max(512);return Object.entries(tR).forEach(([t,r])=>{r.allowedValues&&(e=e.when("id",{is:t,then:uE.default.string().valid(...r.allowedValues).messages({"any.only":zye[t]})}))}),e.required()},"createStatusValidationSchema"),Qye=uE.default.object({id:uE.default.string().valid(...Wye).required(),status:jye()});o(C4,"validateStatus")});function P4(){vL||(vL=Ea.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),UL=new Uint8Array(vL))}function L4(){P4(),UL[0]=1}function D4(){return P4(),UL[0]===1}var vL,UL,xL=se(()=>{dE();o(P4,"ensureInitialized");o(L4,"requestRestart");o(D4,"restartNeeded")});var qL={};Re(qL,{DEFAULT_STATUS_ID:()=>lE,STATUS_IDS:()=>rR,Status:()=>Ea,clear:()=>FL,get:()=>kL,set:()=>HL});function mE(){return BL||(BL=et({database:"system",table:"hdb_status",replicate:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"status"},{name:"__createdtime__"},{name:"__updatedtime__"}]})),BL}function FL({id:e}){return fE.debug?.("clearStatus",e),mE().delete(e)}async function Xye(){fE.debug?.("getAllStatus");let e=mE().get({}),t=await Ap.query.allThreads(),r=Array.from(t.entries()).map(([s,i])=>({name:s,...i})),n=D4();return{systemStatus:e,componentStatus:r,restartRequired:n}}function kL({id:e}){return e?(fE.debug?.("getStatus",e),mE().get(e)):(fE.debug?.("getStatus","all"),Xye())}function HL({status:e,id:t=lE}){let r=C4({status:e,id:t});if(r)throw(0,sR.handleHDBError)(r,r.message,Jye.BAD_REQUEST);return fE.debug?.("setStatus",t,e),mE().put(t,{status:e})}var sR,M4,Jye,BL,Ea,fE,dE=se(()=>{we();sR=b(_e()),M4=b(Zn());O4();nR();Ip();xL();nR();({HTTP_STATUS_CODES:Jye}=sR.hdbErrors);o(mE,"getStatusTable");Ea={get primaryStore(){return mE().primaryStore}},fE=(0,M4.loggerWithTag)("status");o(FL,"clearStatus");o(Xye,"getAllStatus");o(kL,"getStatus");o(HL,"setStatus")});var KL={};Re(KL,{getFingerprint:()=>$L,getRegistrationInfo:()=>GL,setLicense:()=>VL});function GL(){return{version:v4.packageJson.version,deprecated:!0}}function $L(){return{message:"this-is-deprecated",deprecated:!0}}function VL(){return{deprecated:!0}}var v4,YL=se(()=>{v4=b(Ot());o(GL,"getRegistrationInfo");o($L,"getFingerprint");o(VL,"setLicense")});var x4=v((sqe,U4)=>{"use strict";var pE=require("alasql"),cu=require("recursive-iterator"),Oi=Q(),Zye=oe(),hE=(q(),M(Y)),WL=class{static{o(this,"sqlStatementBucket")}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,tRe(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=>hE.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=>!hE.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,a=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[a]&&t[i].tables[a][hE.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[a].attribute_permissions.length>0?c=eRe(t[i].tables[a].attribute_permissions):c=global.hdb_schema[i][a].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(a).filter(u=>!hE.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new pE.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(a,l)}}),this.ast}};function eRe(e){return e.filter(t=>t[hE.PERMS_CRUD_ENUM.READ])}o(eRe,"filterReadRestrictedAttrs");function tRe(e,t,r,n,s){rRe(e,t,r,n,s)}o(tRe,"interpretAST");function EE(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,a=e.tableid;e.as&&(a=e.as),s.set(a,i)}}o(EE,"addSchemaTableToMap");function rRe(e,t,r,n,s){if(!e){Oi.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof pE.yy.Insert?oRe(e,t,r):e instanceof pE.yy.Select?nRe(e,t,r,n,s):e instanceof pE.yy.Update?sRe(e,t,r):e instanceof pE.yy.Delete?iRe(e,t,r):Oi.error("AST in getRecordAttributesAST() is not a valid SQL type.")}o(rRe,"getRecordAttributesAST");function nRe(e,t,r,n,s){if(!e){Oi.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(Zye.isEmptyOrZeroLength(i)){Oi.error("No schema specified");return}e.from.forEach(c=>{EE(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),EE(c.table,t,r,n,s)});let a=new cu(e.columns);for(let{node:c}of a)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{Oi.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 cu(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{Oi.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 cu(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,f=s.get(d);if(!t.get(f).has(d))if(r.has(d))d=r.get(d);else{Oi.info(`table specified as ${d} not found.`);continue}t.get(f).get(d).indexOf(u.columnid)<0&&t.get(f).get(d).push(u.columnid)}}),e.order){let c=new cu(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{Oi.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)}}}o(nRe,"getSelectAttributes");function sRe(e,t,r){if(!e){Oi.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new cu(e.columns),s=e.table.databaseid;EE(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&zL(e.table.tableid,s,i.columnid,t,r)}o(sRe,"getUpdateAttributes");function iRe(e,t,r){if(!e){Oi.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new cu(e.where),s=e.table.databaseid;EE(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&zL(e.table.tableid,s,i.columnid,t,r)}o(iRe,"getDeleteAttributes");function oRe(e,t,r){if(!e){Oi.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new cu(e.columns),s=e.into.databaseid;EE(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&zL(e.into.tableid,s,i.columnid,t,r)}o(oRe,"getInsertAttributes");function zL(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)}o(zL,"pushAttribute");U4.exports=WL});var cR=v((oqe,Z4)=>{"use strict";var jL=pn(),iR=En(),Is=Sh(),SE=ic(),QL=Qa(),aRe=rO(),cRe=X1(),TE=fs(),oR=Gp(),Lr=Q(),lRe=aO(),uRe=$T(),dRe=vO(),fRe=KT(),mRe=BO(),pRe=FO(),hRe=qO(),ERe=$O(),JL=QT(),_a=oe(),k4=Uf(),Nn=(q(),M(Y)),H4=Mj(),_Re=bh(),q4=(Ud(),M(jp)),G4=(Ky(),M(rE)),$4=Tt(),yr=bL(),V4=Zy(),gRe=CL(),Bf=_s(),K4=(cf(),M(af)),XL=(ML(),M(DL)),ZL=(dE(),M(qL)),Y4=(Kh(),M(Iy)),eD=(YL(),M(KL)),W4=aC(),{handleHDBError:zn,hdbErrors:z4}=_e(),{HDB_ERROR_MSGS:ln,HTTP_STATUS_CODES:_E}=z4,ee=new Map,j4="delete",xc="insert",Xs="read",lu="update",gE="describe",B4=SE.describeSchema.name,F4=SE.describeTable.name,Q4={delete:!0,deleteRecord:!0,update:!0,updateData:!0,dropAttribute:!0,dropTable:!0,dropSchema:!0,upsert:!0,upsertData:!0},SRe={insert:!0,delete:!0,deleteRecord:!0,update:!0,updateData:!0,upsert:!0,upsertData:!0},TRe="catchup",yRe="handleGetJob",RRe="handleGetJobsByStartDate",aR={CSV_DATA_LOAD:"csvDataLoad",CSV_URL_LOAD:"csvURLLoad",CSV_FILE_LOAD:"csvFileLoad",IMPORT_FROM_S3:"importFromS3"},bRe=[Is.createTable.name,Is.createAttribute.name,Is.dropTable.name,Is.dropAttribute.name],J4={EXPORT_TO_S3:"export_to_s3",EXPORT_LOCAL:"export_local"},re=class{static{o(this,"permission")}constructor(t,r){this.requires_su=t,this.perms=r}};ee.set(jL.insert.name,new re(!1,[xc]));ee.set(jL.update.name,new re(!1,[lu]));ee.set(jL.upsert.name,new re(!1,[xc,lu]));ee.set(iR.searchByConditions.name,new re(!1,[Xs]));ee.set(iR.searchByHash.name,new re(!1,[Xs]));ee.set(iR.searchByValue.name,new re(!1,[Xs]));ee.set(iR.search.name,new re(!1,[Xs]));ee.set(Is.createSchema.name,new re(!0,[]));ee.set(Is.createTable.name,new re(!0,[]));ee.set(Is.createAttribute.name,new re(!1,[xc]));ee.set(Is.dropSchema.name,new re(!0,[]));ee.set(Is.dropTable.name,new re(!0,[]));ee.set(Is.dropAttribute.name,new re(!0,[]));ee.set(SE.describeSchema.name,new re(!1,[Xs]));ee.set(SE.describeTable.name,new re(!1,[Xs]));ee.set(QL.deleteRecord.name,new re(!1,[j4]));ee.set(TE.addUser.name,new re(!0,[]));ee.set(TE.alterUser.name,new re(!0,[]));ee.set(TE.dropUser.name,new re(!0,[]));ee.set(TE.listUsersExternal.name,new re(!0,[]));ee.set(oR.listRoles.name,new re(!0,[]));ee.set(oR.addRole.name,new re(!0,[]));ee.set(oR.alterRole.name,new re(!0,[]));ee.set(oR.dropRole.name,new re(!0,[]));ee.set(lRe.name,new re(!0,[]));ee.set(uRe.name,new re(!0,[]));ee.set(dRe.name,new re(!0,[]));ee.set(fRe.name,new re(!0,[]));ee.set(mRe.name,new re(!0,[]));ee.set(pRe.name,new re(!0,[]));ee.set(JL.setRoutes.name,new re(!0,[]));ee.set(JL.getRoutes.name,new re(!0,[]));ee.set(JL.deleteRoutes.name,new re(!0,[]));ee.set($4.setConfiguration.name,new re(!0,[]));ee.set(hRe.clusterStatus.name,new re(!0,[]));ee.set(ERe.name,new re(!0,[]));ee.set(QL.deleteFilesBefore.name,new re(!0,[]));ee.set(QL.deleteAuditLogsBefore.name,new re(!0,[]));ee.set(k4.restart.name,new re(!0,[]));ee.set(k4.restartService.name,new re(!0,[]));ee.set(aRe.name,new re(!0,[]));ee.set(cRe.name,new re(!0,[Xs]));ee.set(Is.cleanupOrphanBlobs.name,new re(!0,[]));ee.set(_Re.systemInformation.name,new re(!0,[]));ee.set($4.getConfiguration.name,new re(!0,[]));ee.set(V4.readTransactionLog.name,new re(!0,[]));ee.set(V4.deleteTransactionLogsBefore.name,new re(!0,[]));ee.set(gRe.installModules.name,new re(!0,[]));ee.set(Bf.createCsr.name,new re(!0,[]));ee.set(Bf.signCertificate.name,new re(!0,[]));ee.set(Bf.listCertificates.name,new re(!0,[]));ee.set(Bf.addCertificate.name,new re(!0,[]));ee.set(Bf.removeCertificate.name,new re(!0,[]));ee.set(Bf.getKey.name,new re(!0,[]));ee.set(K4.addNodeBack.name,new re(!0,[]));ee.set(K4.removeNodeBack.name,new re(!0,[]));ee.set(XL.getOp.name,new re(!1,[Xs]));ee.set(XL.listMetricsOp.name,new re(!1,[Xs]));ee.set(XL.describeMetricOp.name,new re(!1,[Xs]));ee.set(ZL.clear.name,new re(!0,[]));ee.set(ZL.get.name,new re(!0,[]));ee.set(ZL.set.name,new re(!0,[]));ee.set(Y4.installUsageLicenseOp.name,new re(!0,[]));ee.set(Y4.getUsageLicensesOp.name,new re(!0,[]));ee.set(eD.getFingerprint.name,new re(!0,[]));ee.set(eD.setLicense.name,new re(!0,[]));ee.set(q4.createTokens.name,new re(!1,[]));ee.set(q4.refreshOperationToken.name,new re(!1,[]));ee.set(G4.login.name,new re(!1,[]));ee.set(G4.logout.name,new re(!1,[]));ee.set(yr.customFunctionsStatus.name,new re(!0,[]));ee.set(yr.getCustomFunctions.name,new re(!0,[]));ee.set(yr.getComponents.name,new re(!0,[]));ee.set(yr.getComponentFile.name,new re(!0,[]));ee.set(yr.setComponentFile.name,new re(!0,[]));ee.set(yr.dropComponent.name,new re(!0,[]));ee.set(yr.getCustomFunction.name,new re(!0,[]));ee.set(yr.setCustomFunction.name,new re(!0,[]));ee.set(yr.dropCustomFunction.name,new re(!0,[]));ee.set(yr.addComponent.name,new re(!0,[]));ee.set(yr.dropCustomFunctionProject.name,new re(!0,[]));ee.set(yr.packageComponent.name,new re(!0,[]));ee.set(yr.deployComponent.name,new re(!0,[]));ee.set(yr.addSSHKey.name,new re(!0,[]));ee.set(yr.updateSSHKey.name,new re(!0,[]));ee.set(yr.deleteSSHKey.name,new re(!0,[]));ee.set(yr.listSSHKeys.name,new re(!0,[]));ee.set(yr.setSSHKnownHosts.name,new re(!0,[]));ee.set(yr.getSSHKnownHosts.name,new re(!0,[]));ee.set(eD.getRegistrationInfo.name,new re(!1,[]));ee.set(TE.userInfo.name,new re(!1,[]));ee.set(SE.describeAll.name,new re(!1,[]));ee.set(yRe,new re(!1,[]));ee.set(RRe,new re(!0,[]));ee.set(TRe,new re(!0,[]));ee.set(aR.CSV_DATA_LOAD,new re(!1,[xc,lu]));ee.set(aR.CSV_URL_LOAD,new re(!1,[xc,lu]));ee.set(aR.CSV_FILE_LOAD,new re(!1,[xc,lu]));ee.set(aR.IMPORT_FROM_S3,new re(!1,[xc,lu]));ee.set(J4.EXPORT_TO_S3,new re(!0,[]));ee.set(J4.EXPORT_LOCAL,new re(!0,[]));ee.set(Nn.VALID_SQL_OPS_ENUM.DELETE,new re(!1,[j4]));ee.set(Nn.VALID_SQL_OPS_ENUM.SELECT,new re(!1,[Xs]));ee.set(Nn.VALID_SQL_OPS_ENUM.INSERT,new re(!1,[xc]));ee.set(Nn.VALID_SQL_OPS_ENUM.UPDATE,new re(!1,[lu]));Z4.exports={verifyPerms:IRe,verifyPermsAst:ARe,verifyBulkLoadAttributePerms:NRe};function ARe(e,t,r){if(_a.isEmptyOrZeroLength(e))throw Lr.info("verify_perms_ast has an empty user parameter"),zn(new Error);if(_a.isEmptyOrZeroLength(t))throw Lr.info("verify_perms_ast has an empty user parameter"),zn(new Error);if(_a.isEmptyOrZeroLength(r))throw Lr.info("verify_perms_ast has a null operation parameter"),zn(new Error);try{let n=x4(),s=require("alasql"),i=new W4,a=new n(e),c=a.getSchemas(),l=new Map;if((!c||c.length===0)&&a.affected_attributes&&a.affected_attributes.size>0)throw Lr.info("No schemas defined in verifyPermsAst(), will not continue."),zn(new Error);let u=!!t.role.permission.super_user,d=c.includes("system");if(d&&Q4[r])throw zn(new Error,ln.DROP_SYSTEM,_E.FORBIDDEN);if(u&&!d)return null;let f=H4.getRolePermissions(t.role);t.role.permission=f,!u&&e instanceof s.yy.Select&&(e=a.updateAttributeWildcardsForRolePerms(f));for(let p=0;p<c.length;p++){let h=a.getTablesBySchemaName(c[p]);h&&l.set(c[p],h)}let m=X4(t,r,l,i);return m||(l.forEach((p,h)=>{for(let E=0;E<p.length;E++){let g=a.getAttributesBySchemaTableName(h,p[E]),R=rD(t.role.permission,h,p[E]);tD(g,R,r,p[E],h,i)}}),i.getPermsResponse())}catch(n){throw zn(n)}}o(ARe,"verifyPermsAst");function IRe(e,t){if(e===null||t===null||e.hdb_user===void 0||e.hdb_user===null)throw Lr.info("null required parameter in verifyPerms"),zn(new Error,ln.DEFAULT_INVALID_REQUEST,_E.BAD_REQUEST);let r;t instanceof Function?r=t.name:r=t;let n=e.action,s=e.schema??e.database,i=e.table,a=new Map;s&&i&&a.set(s,[i]);let c=new W4;if(_a.isEmptyOrZeroLength(e.hdb_user?.role)||_a.isEmptyOrZeroLength(e.hdb_user?.role?.permission))return Lr.info(`User ${e.hdb_user?.username} has no role or permissions. Please assign the user a valid role.`),c.handleUnauthorizedItem(ln.USER_HAS_NO_PERMS(e.hdb_user?.username));let l=!!e.hdb_user?.role?.permission?.super_user,u=e.hdb_user?.role?.permission?.structure_user,d=a.has(Nn.SYSTEM_SCHEMA_NAME)||s===Nn.SYSTEM_SCHEMA_NAME;if(l&&d&&SRe[e.operation]&&(i===Nn.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME||i===Nn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||i===Nn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME))return null;if(d&&Q4[r])throw zn(new Error,ln.DROP_SYSTEM,_E.FORBIDDEN);if(l&&!d||u===!0&&(r===Is.createSchema.name||r===Is.dropSchema.name))return null;if(bRe.indexOf(r)>=0&&(u===!0||Array.isArray(u)))return u===!0||u.indexOf(s)>=0?null:c.handleUnauthorizedItem(`User does not have access to perform '${e.operation}' against schema '${s}'`);let f=H4.getRolePermissions(e.hdb_user?.role);if(e.hdb_user?.role&&(e.hdb_user.role.permission=f),(r===B4||r===F4)&&!f.super_user){if(s===Nn.SYSTEM_SCHEMA_NAME)return c.handleUnauthorizedItem(ln.SCHEMA_PERM_ERROR(s));if(r===B4&&(!f[s]||!f[s][gE]))return c.handleInvalidItem(ln.SCHEMA_NOT_FOUND(s));if(r===F4&&(!f[s]||!f[s].tables[i]||!f[s].tables[i][gE]))return c.handleInvalidItem(ln.TABLE_NOT_FOUND(s,i))}let m=X4(e.hdb_user,r,a,c,n);if(m)return m;if(ee.get(r)&&ee.get(r).perms.length===0)return null;if(!l&&e.get_attributes&&Nn.SEARCH_WILDCARDS.includes(e.get_attributes[0])){let E=[],g=f[s].tables[i];g[Nn.PERMS_CRUD_ENUM.READ]&&(g.attribute_permissions.length>0?g.attribute_permissions.filter(S=>S[Nn.PERMS_CRUD_ENUM.READ]).forEach(S=>{E.push(S.attribute_name)}):E=global.hdb_schema[s][i].attributes.map(R=>R.attribute),e.get_attributes=E)}let p=wRe(e),h=rD(e.hdb_user?.role?.permission,s,i);return tD(p,h,r,i,s,c,n),c.getPermsResponse()}o(IRe,"verifyPerms");function X4(e,t,r,n,s){if(_a.arrayHasEmptyValues([e,t,r]))throw Lr.info("hasPermissions has an invalid parameter"),zn(new Error);let i=r.has("system"),a=e.role.permission;if(a.super_user&&(!i||ee.get(t).requires_su))return null;if(!ee.get(t))throw Lr.info(`operation ${t} not found.`),zn(new Error,ln.OP_NOT_FOUND(t),_E.BAD_REQUEST);if(ee.get(t)&&ee.get(t).requires_su)return Lr.info(`operation ${t} requires SU permissions.`),n.handleUnauthorizedItem(ln.OP_IS_SU_ONLY(t));let c=r.keys();for(let l of c){try{if(l&&!a[l]||a[l][gE]===!1){n.addInvalidItem(ln.SCHEMA_NOT_FOUND(l));continue}}catch{n.addInvalidItem(ln.SCHEMA_NOT_FOUND(l));continue}let u=r.get(l);for(let d of u){let f=a[l].tables[d];if(!f||f[gE]===!1)n.addInvalidItem(ln.TABLE_NOT_FOUND(l,d));else try{let m=[],p=ee.get(t).perms;!_a.isEmpty(s)&&p.includes(s)&&(p=[s]);for(let h=0;h<p.length;h++){let E=p[h],g=f[E];(g==null||g===!1)&&(Lr.info(`Required ${E} permission not found for ${t} ${s?`${s} `:""}operation in role ${e.role.id}`),m.push(E))}m.length>0&&n.addUnauthorizedTable(l,d,m)}catch(m){let p=ln.UNKNOWN_OP_AUTH_ERROR(t,l,d);throw Lr.error(p),Lr.error(m),zn(z4.CHECK_LOGS_WRAPPER(p))}}}return r.size<2?n.getPermsResponse():null}o(X4,"hasPermissions");function tD(e,t,r,n,s,i,a){if(!e||!t)throw Lr.info("no attributes specified in checkAttributePerms."),zn(new Error);let c=ee.get(r).perms;if(!c||c==="")throw Lr.info(`no permissions found for ${r} in checkAttributePerms().`),zn(new Error);if(_a.isEmptyOrZeroLength(t))return Lr.info("No role permissions set (this is OK)."),null;a&&c.includes(a)&&(c=[a]);let l={};for(let d of e){let f=t.get(d);if(f){if(f[gE]===!1){i.addInvalidItem(ln.ATTR_NOT_FOUND(s,n,d),s,n);continue}if(c)for(let m of c){if(Nn.TIME_STAMP_NAMES.includes(f.attribute_name)&&m!==Xs)throw zn(new Error,ln.SYSTEM_TIMESTAMP_PERMS_ERR,_E.FORBIDDEN);f[m]===!1&&(l[f.attribute_name]?l[f.attribute_name].push(m):l[f.attribute_name]=[m])}}else i.addInvalidItem(ln.ATTR_NOT_FOUND(s,n,d),s,n)}let u=Object.keys(l);u.length>0&&i.addUnauthorizedAttributes(u,s,n,l)}o(tD,"checkAttributePerms");function wRe(e){let t=new Set;try{if(e.action)return t;if(e.operation===Nn.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS&&e.conditions.forEach(r=>{let n=r.attribute;r.search_attribute!==void 0&&(n=r.search_attribute),t.add(n)}),e&&(e.attribute||e.search_attribute)){let r=e.attribute;e.search_attribute!==void 0&&(r=e.search_attribute),t.add(r)}if(!e.records||e.records.length===0){if(!e.get_attributes||e.get_attributes.length===0)return t;for(let r of e.get_attributes)t.add(r)}else for(let r of e.records){let n=Object.keys(r);for(let s of n)t.add(s)}}catch(r){Lr.info(r)}return t}o(wRe,"getRecordAttributes");function rD(e,t,r){let n=new Map;if(_a.isEmpty(e))return Lr.info("no hdb_user specified in getAttributePermissions"),n;if(e.super_user||!t||!r)return n;try{e[t].tables[r].attribute_permissions.forEach(s=>{n.has(s.attribute_name)||n.set(s.attribute_name,s)})}catch{Lr.info(`No attribute permissions found for schema ${t} and table ${r}.`)}return n}o(rD,"getAttributePermissions");function NRe(e,t,r,n,s,i,a){let c=new Set(i),l=rD(e,n,s);tD(c,l,t,s,n,a,r)}o(NRe,"verifyBulkLoadAttributePerms")});var sD=v((cqe,eQ)=>{"use strict";var nD=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};eQ.exports=nD});var uD=v((pqe,_Q)=>{"use strict";var lR=pn(),dR=ZN(),CRe=require("needle"),Pi=(q(),M(Y)),uqe=pt(),Ff=oe(),{handleHDBError:er,hdbErrors:lQ}=_e(),{HTTP_STATUS_CODES:un,HDB_ERROR_MSGS:Dr,CHECK_LOGS_WRAPPER:du}=lQ,kf=Q(),iD=require("papaparse");Ff.promisifyPapaParse();var Li=require("fs-extra"),ORe=require("path"),{chain:tQ}=require("stream-chain"),rQ=require("stream-json/streamers/StreamArray"),nQ=require("stream-json/utils/Batch"),sQ=require("stream-chain/utils/comp"),{finished:iQ}=require("stream"),PRe=ce(),uQ=eC(),LRe=tC(),{BulkLoadFileObject:aD,BulkLoadDataObject:DRe}=T$(),cD=aC(),{verifyBulkLoadAttributePerms:dQ}=cR(),dqe=sD(),fqe=qt(),mqe=Zi(),{databases:MRe}=(we(),M(mt)),{coerceType:vRe}=(dg(),M(Vq)),oQ="No records parsed from csv file.",uu=`${PRe.get("HDB_ROOT")}/tmp`,{schemaRegex:URe}=Wi(),aQ=1024*1024*2,cQ=5e3,xRe={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};_Q.exports={csvDataLoad:BRe,csvURLLoad:FRe,csvFileLoad:kRe,importFromS3:HRe};async function BRe(e,t){let r=dR.dataObject(e);if(r)throw er(r,r.message,un.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=pQ(e.schema,e.table),i=iD.parse(e.data,{header:!0,skipEmptyLines:!0,transform:oD.bind(null,s),dynamicTyping:!1}),a=new cD;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&dQ(e.hdb_user?.role?.permission,this.job_operation_function.name,e.action,e.schema,e.table,i.meta.fields,a);let c=a.getPermsResponse();if(c)throw er(new Error,c,un.BAD_REQUEST,void 0,void 0,!0);let l=new DRe(e.action,e.schema,e.table,i.data);return n=await uQ.callOperationFunctionAsAwait(hQ,l,null),n.message===oQ?oQ:EQ(n.records,n.number_written)}catch(s){throw fu(s)}}o(BRe,"csvDataLoad");async function FRe(e){let t=dR.urlObject(e);if(t)throw er(t,t.message,un.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${uu}/${r}`;try{await qRe(e,r)}catch(s){throw kf.error(Dr.DOWNLOAD_FILE_ERR(r)+" - "+s),er(s,du(Dr.DOWNLOAD_FILE_ERR(r)))}try{let s=new aD(this.job_operation_function.name,e.action,e.schema,e.table,n,Pi.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await lD(s);return await uR(n),i}catch(s){throw await uR(n),fu(s)}}o(FRe,"csvURLLoad");async function kRe(e){let t=dR.fileObject(e);if(t)throw er(t,t.message,un.BAD_REQUEST,void 0,void 0,!0);let r=new aD(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Pi.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await lD(r)}catch(n){throw fu(n)}}o(kRe,"csvFileLoad");async function HRe(e){let t=dR.s3FileObject(e);if(t)throw er(t,t.message,un.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=ORe.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${uu}/${s}`;let i=new aD(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await GRe(s,e);let a=await lD(i);return await uR(r),a}catch(n){throw await uR(r),fu(n)}}o(HRe,"importFromS3");async function qRe(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await CRe("get",e.csv_url,n)}catch(n){let s=`Error downloading CSV file from ${e.csv_url}, status code: ${n.statusCode}. Check the log for more information.`;throw er(n,s,n.statusCode,Pi.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}VRe(r,e.csv_url),await $Re(t,r.raw)}o(qRe,"downloadCSVFile");async function GRe(e,t){try{let r=`${uu}/${e}`;await Li.mkdirp(uu),await Li.writeFile(`${uu}/${e}`,"",{flag:"a+"});let n=await Li.createWriteStream(r),s=await LRe.getFileStreamFromS3(t);await new Promise((i,a)=>{s.on("error",function(c){a(c)}),s.pipe(n).on("error",function(c){a(c)}).on("close",function(){kf.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw kf.error(Dr.S3_DOWNLOAD_ERR+" - "+r),er(r,du(Dr.S3_DOWNLOAD_ERR))}}o(GRe,"downloadFileFromS3");async function $Re(e,t){try{await Li.mkdirp(uu),await Li.writeFile(`${uu}/${e}`,t)}catch(r){throw kf.error(Dr.WRITE_TEMP_FILE_ERR),er(r,du(Dr.DEFAULT_BULK_LOAD_ERR))}}o($Re,"writeFileToTempFolder");async function uR(e){if(e)try{await Li.access(e),await Li.unlink(e)}catch{kf.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(uR,"deleteTempFile");function VRe(e,t){if(e.statusCode!==lQ.HTTP_STATUS_CODES.OK)throw er(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,un.BAD_REQUEST);if(!xRe[e.headers["content-type"]])throw er(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,un.BAD_REQUEST);if(!e.raw)throw er(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,un.BAD_REQUEST)}o(VRe,"validateURLResponse");async function lD(e){try{let t;switch(e.file_type){case Pi.VALID_S3_FILE_TYPES.CSV:t=await KRe(e);break;case Pi.VALID_S3_FILE_TYPES.JSON:t=await YRe(e);break;default:throw er(new Error,Dr.DEFAULT_BULK_LOAD_ERR,un.BAD_REQUEST,Pi.LOG_LEVELS.ERROR,Dr.INVALID_FILE_EXT_ERR(e))}return EQ(t.records,t.number_written)}catch(t){throw fu(t)}}o(lD,"fileLoad");async function fQ(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;s&&s.pause();let a={operation:e.action,schema:e.schema,table:e.table,records:i};try{let{attributes:c}=await lR.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&dQ(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=er(c);r(l)}}o(fQ,"validateChunk");async function mQ(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;Ff.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!Ff.isEmpty(c)&&!Ff.isEmpty(c.__parsed_extra)&&delete c.__parsed_extra});else{let c=new Set;i.forEach(l=>{Object.keys(l).forEach(u=>c.add(u))}),a=[...c]}try{let c={schema:e.schema,table:e.table,action:e.action,data:i},l=await uQ.callOperationFunctionAsAwait(hQ,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=er(c,du(Dr.INSERT_CSV_ERR),un.INTERNAL_SERVER_ERROR,Pi.LOG_LEVELS.ERROR,Dr.INSERT_CSV_ERR+" - "+c);r(l)}}o(mQ,"insertChunk");async function KRe(e){let t={records:0,number_written:0},r=pQ(e.schema,e.table);try{let n=new cD,s=Li.createReadStream(e.file_path,{highWaterMark:aQ});s.setEncoding("utf8"),await iD.parsePromise(s,fQ.bind(null,e,n),oD.bind(null,r));let i=n.getPermsResponse();if(i)throw er(new Error,i,un.BAD_REQUEST);return s=Li.createReadStream(e.file_path,{highWaterMark:aQ}),s.setEncoding("utf8"),await iD.parsePromise(s,mQ.bind(null,e,t),oD.bind(null,r)),s.destroy(),t}catch(n){throw er(n,du(Dr.PAPA_PARSE_ERR),un.INTERNAL_SERVER_ERROR,Pi.LOG_LEVELS.ERROR,Dr.PAPA_PARSE_ERR+n)}}o(KRe,"callPapaParse");function pQ(e,t){let r=MRe[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>vRe(i,s));return n}o(pQ,"createTransformMap");function oD(e,t,r){let n=e.get(r);return n?n(t):Ff.autoCast(t)}o(oD,"typeFunction");async function YRe(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new cD,s=tQ([Li.createReadStream(e.file_path,{encoding:"utf-8"}),rQ.withParser(),c=>c.value,new nQ({batchSize:cQ}),sQ(async c=>{await fQ(e,n,r,c)})]);await new Promise((c,l)=>{iQ(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw er(new Error,i,un.BAD_REQUEST);let a=tQ([Li.createReadStream(e.file_path,{encoding:"utf-8"}),rQ.withParser(),c=>c.value,new nQ({batchSize:cQ}),sQ(async c=>{await mQ(e,t,r,c)})]);return await new Promise((c,l)=>{iQ(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw er(n,du(Dr.INSERT_JSON_ERR),un.INTERNAL_SERVER_ERROR,Pi.LOG_LEVELS.ERROR,Dr.INSERT_JSON_ERR+n)}}o(YRe,"insertJson");async function hQ(e){let t={};try{e.data&&e.data.length>0&&WRe(e.data[0])?t=await zRe(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",kf.info(t.message))}catch(r){throw fu(r)}return t}o(hQ,"callBulkFileLoad");function WRe(e){let t=Object.keys(e);for(let r of t)if(!URe.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(WRe,"validateColumnNames");async function zRe(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=lR.insert;break;case"update":i=lR.update;break;case"upsert":i=lR.upsert;break;default:throw er(new Error,Dr.INVALID_ACTION_PARAM_ERR(n),un.BAD_REQUEST,Pi.LOG_LEVELS.ERROR,Dr.INVALID_ACTION_PARAM_ERR(n))}try{let a=await i(s),c;switch(n){case"insert":c=a.inserted_hashes;break;case"update":c=a.update_hashes;break;case"upsert":c=a.upserted_hashes;break;default:break}if(Array.isArray(a.skipped_hashes)&&a.skipped_hashes.length>0){let d=global.hdb_schema[t][r].hash_attribute,f=e.length;for(;f--;)a.skipped_hashes.indexOf(e[f][d])>=0&&e.splice(f,1)}let l=Ff.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw fu(a)}}o(zRe,"bulkFileLoad");function EQ(e,t){return`successfully loaded ${t} of ${e} records`}o(EQ,"buildResponseMsg");function fu(e){return er(e,du(Dr.DEFAULT_BULK_LOAD_ERR),un.INTERNAL_SERVER_ERROR,Pi.LOG_LEVELS.ERROR,Dr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(fu,"buildTopLevelErrMsg")});var yQ=v((_qe,TQ)=>{"use strict";var jRe=En(),QRe=mi(),gQ=Q(),JRe=pn(),Eqe=YS(),XRe=require("clone"),fD=require("alasql"),ZRe=$g(),SQ=require("util"),ebe=SQ.promisify(QRe.getTableSchema),tbe=SQ.promisify(jRe.search),rbe=(q(),M(Y)),dD=oe();ZRe(fD);TQ.exports={update:sbe};var nbe="There was a problem performing this update. Please check the logs and try again.";async function sbe({statement:e,hdb_user:t}){let r=await ebe(e.table.databaseid,e.table.tableid),n=ibe(e.columns);dD.backtickASTSchemaItems(e);let{table:s,where:i}=e,a=XRe(s),c=dD.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=fD.parse(l).statements[0],d=await tbe(u),f=obe(n,d);return abe(a,f,t)}o(sbe,"update");function ibe(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=fD.compile(`SELECT ${r.expression.toString()} AS [${rbe.FUNC_VAL}] FROM ?`)}),t}catch(t){throw gQ.error(t),new Error(nbe)}}o(ibe,"createUpdateRecord");function obe(e,t){return dD.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}o(obe,"buildUpdateRecords");async function abe(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await JRe.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){gQ.error(`Error delete new_attributes from update response: ${i}`)}return s}o(abe,"updateRecords")});var bQ=v((yqe,RQ)=>{var cbe=require("alasql"),lbe=En(),ube=Q(),dbe=cs(),pD=require("util"),mD=oe(),fbe=(q(),M(Y)),mbe=mi(),Sqe=YS(),Tqe=pn(),pbe="record",hbe="successfully deleted",Ebe=pD.callbackify(Tbe),_be=pD.promisify(lbe.search),gbe=pD.promisify(mbe.getTableSchema);RQ.exports={convertDelete:Ebe};function Sbe(e){return`${e.deleted_hashes.length} ${pbe}${e.deleted_hashes.length===1?"":"s"} ${hbe}`}o(Sbe,"generateReturnMessage");async function Tbe({statement:e,hdb_user:t}){let r=await gbe(e.table.databaseid,e.table.tableid);mD.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=mD.isEmpty(s)?"":` WHERE ${s.toString()}`,a=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=cbe.parse(a).statements[0],l={operation:fbe.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await _be(c);let u=await dbe.deleteRecords(l);return mD.isEmptyOrZeroLength(u.message)&&(u.message=Sbe(u)),delete u.txn_time,u}catch(u){throw ube.error(u),u.hdb_code?u.message:u}}o(Tbe,"convertDelete")});var RE=v((bqe,CQ)=>{"use strict";CQ.exports={evaluateSQL:Mbe,processAST:NQ,convertSQLToAST:wQ,checkASTPermissions:IQ};var ybe=pn(),AQ=require("util"),Rbe=AQ.callbackify(ybe.insert),bbe=En().search,Abe=yQ().update,Ibe=AQ.callbackify(Abe),wbe=bQ().convertDelete,Bc=require("alasql"),Nbe=cR(),fR=Q(),Cbe=$g(),Obe=oe(),yE=(q(),M(Y)),{hdbErrors:Pbe,handleHDBError:hD}=_e(),{HTTP_STATUS_CODES:ED}=Pbe;Cbe(Bc);var Lbe=403,Dbe="There was a problem performing this insert. Please check the logs and try again.",_D=class{static{o(this,"ParsedSQLObject")}constructor(){this.ast=void 0,this.variant=void 0,this.permissions_checked=!1}};function Mbe(e,t){let r=e.parsed_sql_object;if(!r){r=wQ(e.sql);let n,s=r.ast.statements[0];if(s instanceof Bc.yy.Insert?n=s.into.databaseid:s instanceof Bc.yy.Select?n=s.from?s.from[0].databaseid:null:s instanceof Bc.yy.Update||s instanceof Bc.yy.Delete?n=s.table.databaseid:fR.error("AST in evaluateSQL is not a valid SQL type."),!(s instanceof Bc.yy.Select)&&Obe.isEmptyOrZeroLength(n))return t("No schema specified",null)}NQ(e,r,(n,s)=>{if(n)return t(n);t(null,s)})}o(Mbe,"evaluateSQL");function IQ(e,t){let r;try{r=Nbe.verifyPermsAst(t.ast.statements[0],e.hdb_user,t.variant),t.permissions_checked=!0}catch(n){throw n}return r||null}o(IQ,"checkASTPermissions");function wQ(e){let t=new _D;if(!e)throw hD(new Error,"The 'sql' parameter is missing from the request body",ED.BAD_REQUEST);try{let r=e.trim(),n=Bc.parse(r),s=r.split(" ")[0].toLowerCase();t.ast=n,t.variant=s}catch(r){let n=r.message.split(`
133
+ `);return r>-1&&n>-1?JSON.parse(e.substring(r+t.length-1,n+1)):e}o($ye,"parseNPMStdErr");function Vye(e){let t=eR.object({projects:eR.array().min(1).items(eR.string()).required(),dry_run:eR.boolean().default(!1)});return Fye.validateBySchema(e,t)}o(Vye,"modulesValidator")});var DL={};Re(DL,{describeMetric:()=>w4,describeMetricOp:()=>LL,get:()=>A4,getOp:()=>OL,listMetrics:()=>I4,listMetricsOp:()=>PL});async function Yye(e){return(await j_().get(e)).hostname}function y4(e,t){return e.length===0||e.includes(t)}function OL(e){return cE.trace?.("get_analytics request:",e),A4(e.metric,e.get_attributes,e.start_time,e.end_time,e.conditions)}function b4(e){return"conditions"in e?{...e,conditions:e.conditions.map(b4)}:{attribute:e.search_attribute??e.attribute,comparator:e.search_type??e.comparator,value:e.search_value??e.value}}async function A4(e,t,r,n,s){let i=[{attribute:"metric",comparator:"equals",value:e}];s&&i.push(...s.map(b4));let a=t??[];y4(a,"id")||a.push("id"),r&&i.push({attribute:"id",comparator:"greater_than_equal",value:r}),n&&i.push({attribute:"id",comparator:"less_than",value:n});let c={conditions:i,allowConditionsOnDynamicAttributes:!0};return a.length>0&&(c.select=a),cE.trace?.("get_analytics hdb_analytics.search request:",JSON.stringify(c)),(await databases.system.hdb_analytics.search(c)).map(async u=>{let d=u.id[1];return u.id=u.id[0],y4(a,"node")&&(cE.trace?.(`get_analytics lookup hostname for nodeId: ${d}`),u.node=await Yye(d)),cE.trace?.("get_analytics result:",JSON.stringify(u)),u})}function PL(e){return I4(e.metric_types)}async function I4(e=["builtin"]){let t=[],r=Object.values(xo);if(e.includes("builtin")&&(t=r),e.includes("custom")){let n=r.map(c=>({attribute:"metric",comparator:"not_equal",value:c})),s={select:["metric"],conditions:n},i=new Set,a=await databases.system.hdb_analytics.search(s);for await(let c of a)i.add(c.metric);t.push(...Array.from(i.values()))}return t}function LL(e){return w4(e.metric)}async function w4(e){let t={conditions:[{attribute:"metric",comparator:"equals",value:e}],sort:{attribute:"id",descending:!0},limit:1},r=databases.system.hdb_analytics.search(t),n=[{name:"node",type:"string"}];for await(let s of r){for(let a in s)n.push({name:a,type:typeof s[a]});let i={attributes:n};return cE.trace?.("describe_metric result:",JSON.stringify(i)),i}return{}}var R4,Kye,cE,ML=se(()=>{R4=b(Q());bA();AA();({forComponent:Kye}=R4.default),cE=Kye("analytics").conditional;o(Yye,"lookupHostname");o(y4,"isSelected");o(OL,"getOp");o(b4,"conformCondition");o(A4,"get");o(PL,"listMetricsOp");o(I4,"listMetrics");o(LL,"describeMetricOp");o(w4,"describeMetric")});var tR,rR,lE,nR=se(()=>{tR={primary:{allowedValues:null},maintenance:{allowedValues:null},availability:{allowedValues:["Available","Unavailable"]}},rR=Object.keys(tR),lE="primary"});function C4(e){return N4.validateBySchema(e,Qye)}var uE,N4,Wye,zye,jye,Qye,O4=se(()=>{uE=b(require("joi")),N4=b(at());nR();Wye=rR,zye=Object.entries(tR).reduce((e,[t,r])=>(r.allowedValues&&(e[t]=`Status "${t}" only accepts these values: ${r.allowedValues.join(", ")}`),e),{}),jye=o(()=>{let e=uE.default.string().min(1).max(512);return Object.entries(tR).forEach(([t,r])=>{r.allowedValues&&(e=e.when("id",{is:t,then:uE.default.string().valid(...r.allowedValues).messages({"any.only":zye[t]})}))}),e.required()},"createStatusValidationSchema"),Qye=uE.default.object({id:uE.default.string().valid(...Wye).required(),status:jye()});o(C4,"validateStatus")});function P4(){vL||(vL=Ea.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),UL=new Uint8Array(vL))}function L4(){P4(),UL[0]=1}function D4(){return P4(),UL[0]===1}var vL,UL,xL=se(()=>{dE();o(P4,"ensureInitialized");o(L4,"requestRestart");o(D4,"restartNeeded")});var qL={};Re(qL,{DEFAULT_STATUS_ID:()=>lE,STATUS_IDS:()=>rR,Status:()=>Ea,clear:()=>FL,get:()=>kL,set:()=>HL});function mE(){return BL||(BL=et({database:"system",table:"hdb_status",replicate:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"status"},{name:"__createdtime__"},{name:"__updatedtime__"}]})),BL}function FL({id:e}){return fE.debug?.("clearStatus",e),mE().delete(e)}async function Xye(){fE.debug?.("getAllStatus");let e=mE().get({}),t=await Ap.query.allThreads(),r=Array.from(t.entries()).map(([s,i])=>({name:s,...i})),n=D4();return{systemStatus:e,componentStatus:r,restartRequired:n}}function kL({id:e}){return e?(fE.debug?.("getStatus",e),mE().get(e)):(fE.debug?.("getStatus","all"),Xye())}function HL({status:e,id:t=lE}){let r=C4({status:e,id:t});if(r)throw(0,sR.handleHDBError)(r,r.message,Jye.BAD_REQUEST);return fE.debug?.("setStatus",t,e),mE().put(t,{status:e})}var sR,M4,Jye,BL,Ea,fE,dE=se(()=>{we();sR=b(_e()),M4=b(Zn());O4();nR();Ip();xL();nR();({HTTP_STATUS_CODES:Jye}=sR.hdbErrors);o(mE,"getStatusTable");Ea={get primaryStore(){return mE().primaryStore}},fE=(0,M4.loggerWithTag)("status");o(FL,"clearStatus");o(Xye,"getAllStatus");o(kL,"getStatus");o(HL,"setStatus")});var KL={};Re(KL,{getFingerprint:()=>$L,getRegistrationInfo:()=>GL,setLicense:()=>VL});function GL(){return{version:v4.packageJson.version,deprecated:!0}}function $L(){return{message:"this-is-deprecated",deprecated:!0}}function VL(){return{deprecated:!0}}var v4,YL=se(()=>{v4=b(Ot());o(GL,"getRegistrationInfo");o($L,"getFingerprint");o(VL,"setLicense")});var x4=v((sqe,U4)=>{"use strict";var pE=require("alasql"),cu=require("recursive-iterator"),Oi=Q(),Zye=oe(),hE=(q(),M(Y)),WL=class{static{o(this,"sqlStatementBucket")}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,tRe(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=>hE.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=>!hE.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,a=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[a]&&t[i].tables[a][hE.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[a].attribute_permissions.length>0?c=eRe(t[i].tables[a].attribute_permissions):c=global.hdb_schema[i][a].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(a).filter(u=>!hE.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new pE.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(a,l)}}),this.ast}};function eRe(e){return e.filter(t=>t[hE.PERMS_CRUD_ENUM.READ])}o(eRe,"filterReadRestrictedAttrs");function tRe(e,t,r,n,s){rRe(e,t,r,n,s)}o(tRe,"interpretAST");function EE(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,a=e.tableid;e.as&&(a=e.as),s.set(a,i)}}o(EE,"addSchemaTableToMap");function rRe(e,t,r,n,s){if(!e){Oi.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof pE.yy.Insert?oRe(e,t,r):e instanceof pE.yy.Select?nRe(e,t,r,n,s):e instanceof pE.yy.Update?sRe(e,t,r):e instanceof pE.yy.Delete?iRe(e,t,r):Oi.error("AST in getRecordAttributesAST() is not a valid SQL type.")}o(rRe,"getRecordAttributesAST");function nRe(e,t,r,n,s){if(!e){Oi.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(Zye.isEmptyOrZeroLength(i)){Oi.error("No schema specified");return}e.from.forEach(c=>{EE(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),EE(c.table,t,r,n,s)});let a=new cu(e.columns);for(let{node:c}of a)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{Oi.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 cu(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{Oi.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 cu(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,f=s.get(d);if(!t.get(f).has(d))if(r.has(d))d=r.get(d);else{Oi.info(`table specified as ${d} not found.`);continue}t.get(f).get(d).indexOf(u.columnid)<0&&t.get(f).get(d).push(u.columnid)}}),e.order){let c=new cu(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{Oi.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)}}}o(nRe,"getSelectAttributes");function sRe(e,t,r){if(!e){Oi.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new cu(e.columns),s=e.table.databaseid;EE(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&zL(e.table.tableid,s,i.columnid,t,r)}o(sRe,"getUpdateAttributes");function iRe(e,t,r){if(!e){Oi.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new cu(e.where),s=e.table.databaseid;EE(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&zL(e.table.tableid,s,i.columnid,t,r)}o(iRe,"getDeleteAttributes");function oRe(e,t,r){if(!e){Oi.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new cu(e.columns),s=e.into.databaseid;EE(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&zL(e.into.tableid,s,i.columnid,t,r)}o(oRe,"getInsertAttributes");function zL(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)}o(zL,"pushAttribute");U4.exports=WL});var cR=v((oqe,Z4)=>{"use strict";var jL=pn(),iR=En(),Is=Sh(),SE=ic(),QL=Qa(),aRe=rO(),cRe=X1(),TE=fs(),oR=Gp(),Lr=Q(),lRe=aO(),uRe=$T(),dRe=vO(),fRe=KT(),mRe=BO(),pRe=FO(),hRe=qO(),ERe=$O(),JL=QT(),_a=oe(),k4=Uf(),Nn=(q(),M(Y)),H4=Mj(),_Re=bh(),q4=(Ud(),M(jp)),G4=(Ky(),M(rE)),$4=Tt(),yr=bL(),V4=Zy(),gRe=CL(),Bf=_s(),K4=(cf(),M(af)),XL=(ML(),M(DL)),ZL=(dE(),M(qL)),Y4=(Kh(),M(Iy)),eD=(YL(),M(KL)),W4=aC(),{handleHDBError:zn,hdbErrors:z4}=_e(),{HDB_ERROR_MSGS:ln,HTTP_STATUS_CODES:_E}=z4,ee=new Map,j4="delete",xc="insert",Xs="read",lu="update",gE="describe",B4=SE.describeSchema.name,F4=SE.describeTable.name,Q4={delete:!0,deleteRecord:!0,update:!0,updateData:!0,dropAttribute:!0,dropTable:!0,dropSchema:!0,upsert:!0,upsertData:!0},SRe={insert:!0,delete:!0,deleteRecord:!0,update:!0,updateData:!0,upsert:!0,upsertData:!0},TRe="catchup",yRe="handleGetJob",RRe="handleGetJobsByStartDate",aR={CSV_DATA_LOAD:"csvDataLoad",CSV_URL_LOAD:"csvURLLoad",CSV_FILE_LOAD:"csvFileLoad",IMPORT_FROM_S3:"importFromS3"},bRe=[Is.createTable.name,Is.createAttribute.name,Is.dropTable.name,Is.dropAttribute.name],J4={EXPORT_TO_S3:"export_to_s3",EXPORT_LOCAL:"export_local"},re=class{static{o(this,"permission")}constructor(t,r){this.requires_su=t,this.perms=r}};ee.set(jL.insert.name,new re(!1,[xc]));ee.set(jL.update.name,new re(!1,[lu]));ee.set(jL.upsert.name,new re(!1,[xc,lu]));ee.set(iR.searchByConditions.name,new re(!1,[Xs]));ee.set(iR.searchByHash.name,new re(!1,[Xs]));ee.set(iR.searchByValue.name,new re(!1,[Xs]));ee.set(iR.search.name,new re(!1,[Xs]));ee.set(Is.createSchema.name,new re(!0,[]));ee.set(Is.createTable.name,new re(!0,[]));ee.set(Is.createAttribute.name,new re(!1,[xc]));ee.set(Is.dropSchema.name,new re(!0,[]));ee.set(Is.dropTable.name,new re(!0,[]));ee.set(Is.dropAttribute.name,new re(!0,[]));ee.set(SE.describeSchema.name,new re(!1,[Xs]));ee.set(SE.describeTable.name,new re(!1,[Xs]));ee.set(QL.deleteRecord.name,new re(!1,[j4]));ee.set(TE.addUser.name,new re(!0,[]));ee.set(TE.alterUser.name,new re(!0,[]));ee.set(TE.dropUser.name,new re(!0,[]));ee.set(TE.listUsersExternal.name,new re(!0,[]));ee.set(oR.listRoles.name,new re(!0,[]));ee.set(oR.addRole.name,new re(!0,[]));ee.set(oR.alterRole.name,new re(!0,[]));ee.set(oR.dropRole.name,new re(!0,[]));ee.set(lRe.name,new re(!0,[]));ee.set(uRe.name,new re(!0,[]));ee.set(dRe.name,new re(!0,[]));ee.set(fRe.name,new re(!0,[]));ee.set(mRe.name,new re(!0,[]));ee.set(pRe.name,new re(!0,[]));ee.set(JL.setRoutes.name,new re(!0,[]));ee.set(JL.getRoutes.name,new re(!0,[]));ee.set(JL.deleteRoutes.name,new re(!0,[]));ee.set($4.setConfiguration.name,new re(!0,[]));ee.set(hRe.clusterStatus.name,new re(!0,[]));ee.set(ERe.name,new re(!0,[]));ee.set(QL.deleteFilesBefore.name,new re(!0,[]));ee.set(QL.deleteAuditLogsBefore.name,new re(!0,[]));ee.set(k4.restart.name,new re(!0,[]));ee.set(k4.restartService.name,new re(!0,[]));ee.set(aRe.name,new re(!0,[]));ee.set(cRe.name,new re(!0,[Xs]));ee.set(Is.cleanupOrphanBlobs.name,new re(!0,[]));ee.set(_Re.systemInformation.name,new re(!0,[]));ee.set($4.getConfiguration.name,new re(!0,[]));ee.set(V4.readTransactionLog.name,new re(!0,[]));ee.set(V4.deleteTransactionLogsBefore.name,new re(!0,[]));ee.set(gRe.installModules.name,new re(!0,[]));ee.set(Bf.createCsr.name,new re(!0,[]));ee.set(Bf.signCertificate.name,new re(!0,[]));ee.set(Bf.listCertificates.name,new re(!0,[]));ee.set(Bf.addCertificate.name,new re(!0,[]));ee.set(Bf.removeCertificate.name,new re(!0,[]));ee.set(Bf.getKey.name,new re(!0,[]));ee.set(K4.addNodeBack.name,new re(!0,[]));ee.set(K4.removeNodeBack.name,new re(!0,[]));ee.set(XL.getOp.name,new re(!1,[Xs]));ee.set(XL.listMetricsOp.name,new re(!1,[Xs]));ee.set(XL.describeMetricOp.name,new re(!1,[Xs]));ee.set(ZL.clear.name,new re(!0,[]));ee.set(ZL.get.name,new re(!0,[]));ee.set(ZL.set.name,new re(!0,[]));ee.set(Y4.installUsageLicenseOp.name,new re(!0,[]));ee.set(Y4.getUsageLicensesOp.name,new re(!0,[]));ee.set(eD.getFingerprint.name,new re(!0,[]));ee.set(eD.setLicense.name,new re(!0,[]));ee.set(q4.createTokens.name,new re(!1,[]));ee.set(q4.refreshOperationToken.name,new re(!1,[]));ee.set(G4.login.name,new re(!1,[]));ee.set(G4.logout.name,new re(!1,[]));ee.set(yr.customFunctionsStatus.name,new re(!0,[]));ee.set(yr.getCustomFunctions.name,new re(!0,[]));ee.set(yr.getComponents.name,new re(!0,[]));ee.set(yr.getComponentFile.name,new re(!0,[]));ee.set(yr.setComponentFile.name,new re(!0,[]));ee.set(yr.dropComponent.name,new re(!0,[]));ee.set(yr.getCustomFunction.name,new re(!0,[]));ee.set(yr.setCustomFunction.name,new re(!0,[]));ee.set(yr.dropCustomFunction.name,new re(!0,[]));ee.set(yr.addComponent.name,new re(!0,[]));ee.set(yr.dropCustomFunctionProject.name,new re(!0,[]));ee.set(yr.packageComponent.name,new re(!0,[]));ee.set(yr.deployComponent.name,new re(!0,[]));ee.set(yr.addSSHKey.name,new re(!0,[]));ee.set(yr.updateSSHKey.name,new re(!0,[]));ee.set(yr.deleteSSHKey.name,new re(!0,[]));ee.set(yr.listSSHKeys.name,new re(!0,[]));ee.set(yr.setSSHKnownHosts.name,new re(!0,[]));ee.set(yr.getSSHKnownHosts.name,new re(!0,[]));ee.set(eD.getRegistrationInfo.name,new re(!1,[]));ee.set(TE.userInfo.name,new re(!1,[]));ee.set(SE.describeAll.name,new re(!1,[]));ee.set(yRe,new re(!1,[]));ee.set(RRe,new re(!0,[]));ee.set(TRe,new re(!0,[]));ee.set(aR.CSV_DATA_LOAD,new re(!1,[xc,lu]));ee.set(aR.CSV_URL_LOAD,new re(!1,[xc,lu]));ee.set(aR.CSV_FILE_LOAD,new re(!1,[xc,lu]));ee.set(aR.IMPORT_FROM_S3,new re(!1,[xc,lu]));ee.set(J4.EXPORT_TO_S3,new re(!0,[]));ee.set(J4.EXPORT_LOCAL,new re(!0,[]));ee.set(Nn.VALID_SQL_OPS_ENUM.DELETE,new re(!1,[j4]));ee.set(Nn.VALID_SQL_OPS_ENUM.SELECT,new re(!1,[Xs]));ee.set(Nn.VALID_SQL_OPS_ENUM.INSERT,new re(!1,[xc]));ee.set(Nn.VALID_SQL_OPS_ENUM.UPDATE,new re(!1,[lu]));Z4.exports={verifyPerms:IRe,verifyPermsAst:ARe,verifyBulkLoadAttributePerms:NRe};function ARe(e,t,r){if(_a.isEmptyOrZeroLength(e))throw Lr.info("verify_perms_ast has an empty user parameter"),zn(new Error);if(_a.isEmptyOrZeroLength(t))throw Lr.info("verify_perms_ast has an empty user parameter"),zn(new Error);if(_a.isEmptyOrZeroLength(r))throw Lr.info("verify_perms_ast has a null operation parameter"),zn(new Error);try{let n=x4(),s=require("alasql"),i=new W4,a=new n(e),c=a.getSchemas(),l=new Map;if((!c||c.length===0)&&a.affected_attributes&&a.affected_attributes.size>0)throw Lr.info("No schemas defined in verifyPermsAst(), will not continue."),zn(new Error);let u=!!t.role.permission.super_user,d=c.includes("system");if(d&&Q4[r])throw zn(new Error,ln.DROP_SYSTEM,_E.FORBIDDEN);if(u&&!d)return null;let f=H4.getRolePermissions(t.role);t.role.permission=f,!u&&e instanceof s.yy.Select&&(e=a.updateAttributeWildcardsForRolePerms(f));for(let p=0;p<c.length;p++){let h=a.getTablesBySchemaName(c[p]);h&&l.set(c[p],h)}let m=X4(t,r,l,i);return m||(l.forEach((p,h)=>{for(let E=0;E<p.length;E++){let g=a.getAttributesBySchemaTableName(h,p[E]),R=rD(t.role.permission,h,p[E]);tD(g,R,r,p[E],h,i)}}),i.getPermsResponse())}catch(n){throw zn(n)}}o(ARe,"verifyPermsAst");function IRe(e,t){if(e===null||t===null||e.hdb_user===void 0||e.hdb_user===null)throw Lr.info("null required parameter in verifyPerms"),zn(new Error,ln.DEFAULT_INVALID_REQUEST,_E.BAD_REQUEST);let r;t instanceof Function?r=t.name:r=t;let n=e.action,s=e.schema??e.database,i=e.table,a=new Map;s&&i&&a.set(s,[i]);let c=new W4;if(_a.isEmptyOrZeroLength(e.hdb_user?.role)||_a.isEmptyOrZeroLength(e.hdb_user?.role?.permission))return Lr.info(`User ${e.hdb_user?.username} has no role or permissions. Please assign the user a valid role.`),c.handleUnauthorizedItem(ln.USER_HAS_NO_PERMS(e.hdb_user?.username));let l=!!e.hdb_user?.role?.permission?.super_user,u=e.hdb_user?.role?.permission?.structure_user,d=a.has(Nn.SYSTEM_SCHEMA_NAME)||s===Nn.SYSTEM_SCHEMA_NAME;if(l&&d&&SRe[e.operation]&&(i===Nn.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME||i===Nn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||i===Nn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME))return null;if(d&&Q4[r])throw zn(new Error,ln.DROP_SYSTEM,_E.FORBIDDEN);if(l&&!d||u===!0&&(r===Is.createSchema.name||r===Is.dropSchema.name))return null;if(bRe.indexOf(r)>=0&&(u===!0||Array.isArray(u)))return u===!0||u.indexOf(s)>=0?null:c.handleUnauthorizedItem(`User does not have access to perform '${e.operation}' against schema '${s}'`);let f=H4.getRolePermissions(e.hdb_user?.role);if(e.hdb_user?.role&&(e.hdb_user.role.permission=f),(r===B4||r===F4)&&!f.super_user){if(s===Nn.SYSTEM_SCHEMA_NAME)return c.handleUnauthorizedItem(ln.SCHEMA_PERM_ERROR(s));if(r===B4&&(!f[s]||!f[s][gE]))return c.handleInvalidItem(ln.SCHEMA_NOT_FOUND(s));if(r===F4&&(!f[s]||!f[s].tables[i]||!f[s].tables[i][gE]))return c.handleInvalidItem(ln.TABLE_NOT_FOUND(s,i))}let m=X4(e.hdb_user,r,a,c,n);if(m)return m;if(ee.get(r)&&ee.get(r).perms.length===0)return null;if(!l&&e.get_attributes&&Nn.SEARCH_WILDCARDS.includes(e.get_attributes[0])){let E=[],g=f[s].tables[i];g[Nn.PERMS_CRUD_ENUM.READ]&&(g.attribute_permissions.length>0?g.attribute_permissions.filter(S=>S[Nn.PERMS_CRUD_ENUM.READ]).forEach(S=>{E.push(S.attribute_name)}):E=global.hdb_schema[s][i].attributes.map(R=>R.attribute),e.get_attributes=E)}let p=wRe(e),h=rD(e.hdb_user?.role?.permission,s,i);return tD(p,h,r,i,s,c,n),c.getPermsResponse()}o(IRe,"verifyPerms");function X4(e,t,r,n,s){if(_a.arrayHasEmptyValues([e,t,r]))throw Lr.info("hasPermissions has an invalid parameter"),zn(new Error);let i=r.has("system"),a=e.role.permission;if(a.super_user&&(!i||ee.get(t).requires_su))return null;if(!ee.get(t))throw Lr.info(`operation ${t} not found.`),zn(new Error,ln.OP_NOT_FOUND(t),_E.BAD_REQUEST);if(ee.get(t)&&ee.get(t).requires_su)return Lr.info(`operation ${t} requires SU permissions.`),n.handleUnauthorizedItem(ln.OP_IS_SU_ONLY(t));let c=r.keys();for(let l of c){try{if(l&&!a[l]||a[l][gE]===!1){n.addInvalidItem(ln.SCHEMA_NOT_FOUND(l));continue}}catch{n.addInvalidItem(ln.SCHEMA_NOT_FOUND(l));continue}let u=r.get(l);for(let d of u){let f=a[l].tables[d];if(!f||f[gE]===!1)n.addInvalidItem(ln.TABLE_NOT_FOUND(l,d));else try{let m=[],p=ee.get(t).perms;!_a.isEmpty(s)&&p.includes(s)&&(p=[s]);for(let h=0;h<p.length;h++){let E=p[h],g=f[E];(g==null||g===!1)&&(Lr.info(`Required ${E} permission not found for ${t} ${s?`${s} `:""}operation in role ${e.role.id}`),m.push(E))}m.length>0&&n.addUnauthorizedTable(l,d,m)}catch(m){let p=ln.UNKNOWN_OP_AUTH_ERROR(t,l,d);throw Lr.error(p),Lr.error(m),zn(z4.CHECK_LOGS_WRAPPER(p))}}}return r.size<2?n.getPermsResponse():null}o(X4,"hasPermissions");function tD(e,t,r,n,s,i,a){if(!e||!t)throw Lr.info("no attributes specified in checkAttributePerms."),zn(new Error);let c=ee.get(r).perms;if(!c||c==="")throw Lr.info(`no permissions found for ${r} in checkAttributePerms().`),zn(new Error);if(_a.isEmptyOrZeroLength(t))return Lr.info("No role permissions set (this is OK)."),null;a&&c.includes(a)&&(c=[a]);let l={};for(let d of e){let f=t.get(d);if(f){if(f[gE]===!1){i.addInvalidItem(ln.ATTR_NOT_FOUND(s,n,d),s,n);continue}if(c)for(let m of c){if(Nn.TIME_STAMP_NAMES.includes(f.attribute_name)&&m!==Xs)throw zn(new Error,ln.SYSTEM_TIMESTAMP_PERMS_ERR,_E.FORBIDDEN);f[m]===!1&&(l[f.attribute_name]?l[f.attribute_name].push(m):l[f.attribute_name]=[m])}}else i.addInvalidItem(ln.ATTR_NOT_FOUND(s,n,d),s,n)}let u=Object.keys(l);u.length>0&&i.addUnauthorizedAttributes(u,s,n,l)}o(tD,"checkAttributePerms");function wRe(e){let t=new Set;try{if(e.action)return t;if(e.operation===Nn.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS&&e.conditions.forEach(r=>{let n=r.attribute;r.search_attribute!==void 0&&(n=r.search_attribute),t.add(n)}),e&&(e.attribute||e.search_attribute)){let r=e.attribute;e.search_attribute!==void 0&&(r=e.search_attribute),t.add(r)}if(!e.records||e.records.length===0){if(!e.get_attributes||e.get_attributes.length===0)return t;for(let r of e.get_attributes)t.add(r)}else for(let r of e.records){let n=Object.keys(r);for(let s of n)t.add(s)}}catch(r){Lr.info(r)}return t}o(wRe,"getRecordAttributes");function rD(e,t,r){let n=new Map;if(_a.isEmpty(e))return Lr.info("no hdb_user specified in getAttributePermissions"),n;if(e.super_user||!t||!r)return n;try{e[t].tables[r].attribute_permissions.forEach(s=>{n.has(s.attribute_name)||n.set(s.attribute_name,s)})}catch{Lr.info(`No attribute permissions found for schema ${t} and table ${r}.`)}return n}o(rD,"getAttributePermissions");function NRe(e,t,r,n,s,i,a){let c=new Set(i),l=rD(e,n,s);tD(c,l,t,s,n,a,r)}o(NRe,"verifyBulkLoadAttributePerms")});var sD=v((cqe,eQ)=>{"use strict";var nD=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};eQ.exports=nD});var uD=v((pqe,_Q)=>{"use strict";var lR=pn(),dR=ZN(),CRe=require("needle"),Pi=(q(),M(Y)),uqe=pt(),Ff=oe(),{handleHDBError:er,hdbErrors:lQ}=_e(),{HTTP_STATUS_CODES:un,HDB_ERROR_MSGS:Dr,CHECK_LOGS_WRAPPER:du}=lQ,kf=Q(),iD=require("papaparse");Ff.promisifyPapaParse();var Li=require("fs-extra"),ORe=require("path"),{chain:tQ}=require("stream-chain"),rQ=require("stream-json/streamers/StreamArray"),nQ=require("stream-json/utils/Batch"),sQ=require("stream-chain/utils/comp"),{finished:iQ}=require("stream"),PRe=ce(),uQ=eC(),LRe=tC(),{BulkLoadFileObject:aD,BulkLoadDataObject:DRe}=T$(),cD=aC(),{verifyBulkLoadAttributePerms:dQ}=cR(),dqe=sD(),fqe=qt(),mqe=Zi(),{databases:MRe}=(we(),M(mt)),{coerceType:vRe}=(dg(),M(Vq)),oQ="No records parsed from csv file.",uu=`${PRe.get("HDB_ROOT")}/tmp`,{schemaRegex:URe}=Wi(),aQ=1024*1024*2,cQ=5e3,xRe={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};_Q.exports={csvDataLoad:BRe,csvURLLoad:FRe,csvFileLoad:kRe,importFromS3:HRe};async function BRe(e,t){let r=dR.dataObject(e);if(r)throw er(r,r.message,un.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=pQ(e.schema,e.table),i=iD.parse(e.data,{header:!0,skipEmptyLines:!0,transform:oD.bind(null,s),dynamicTyping:!1}),a=new cD;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&dQ(e.hdb_user?.role?.permission,this.job_operation_function.name,e.action,e.schema,e.table,i.meta.fields,a);let c=a.getPermsResponse();if(c)throw er(new Error,c,un.BAD_REQUEST,void 0,void 0,!0);let l=new DRe(e.action,e.schema,e.table,i.data);return n=await uQ.callOperationFunctionAsAwait(hQ,l,null),n.message===oQ?oQ:EQ(n.records,n.number_written)}catch(s){throw fu(s)}}o(BRe,"csvDataLoad");async function FRe(e){let t=dR.urlObject(e);if(t)throw er(t,t.message,un.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${uu}/${r}`;try{await qRe(e,r)}catch(s){throw kf.error(Dr.DOWNLOAD_FILE_ERR(r)+" - "+s),er(s,du(Dr.DOWNLOAD_FILE_ERR(r)))}try{let s=new aD(this.job_operation_function.name,e.action,e.schema,e.table,n,Pi.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await lD(s);return await uR(n),i}catch(s){throw await uR(n),fu(s)}}o(FRe,"csvURLLoad");async function kRe(e){let t=dR.fileObject(e);if(t)throw er(t,t.message,un.BAD_REQUEST,void 0,void 0,!0);let r=new aD(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Pi.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await lD(r)}catch(n){throw fu(n)}}o(kRe,"csvFileLoad");async function HRe(e){let t=dR.s3FileObject(e);if(t)throw er(t,t.message,un.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=ORe.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${uu}/${s}`;let i=new aD(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await GRe(s,e);let a=await lD(i);return await uR(r),a}catch(n){throw await uR(r),fu(n)}}o(HRe,"importFromS3");async function qRe(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await CRe("get",e.csv_url,n)}catch(n){let s=`Error downloading CSV file from ${e.csv_url}, status code: ${n.statusCode}. Check the log for more information.`;throw er(n,s,n.statusCode,Pi.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}VRe(r,e.csv_url),await $Re(t,r.raw)}o(qRe,"downloadCSVFile");async function GRe(e,t){try{let r=`${uu}/${e}`;await Li.mkdirp(uu),await Li.writeFile(`${uu}/${e}`,"",{flag:"a+"});let n=await Li.createWriteStream(r),s=await LRe.getFileStreamFromS3(t);await new Promise((i,a)=>{s.on("error",function(c){a(c)}),s.pipe(n).on("error",function(c){a(c)}).on("close",function(){kf.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw kf.error(Dr.S3_DOWNLOAD_ERR+" - "+r),er(r,du(Dr.S3_DOWNLOAD_ERR))}}o(GRe,"downloadFileFromS3");async function $Re(e,t){try{await Li.mkdirp(uu),await Li.writeFile(`${uu}/${e}`,t)}catch(r){throw kf.error(Dr.WRITE_TEMP_FILE_ERR),er(r,du(Dr.DEFAULT_BULK_LOAD_ERR))}}o($Re,"writeFileToTempFolder");async function uR(e){if(e)try{await Li.access(e),await Li.unlink(e)}catch{kf.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(uR,"deleteTempFile");function VRe(e,t){if(e.statusCode!==lQ.HTTP_STATUS_CODES.OK)throw er(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,un.BAD_REQUEST);if(!xRe[e.headers["content-type"]])throw er(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,un.BAD_REQUEST);if(!e.raw)throw er(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,un.BAD_REQUEST)}o(VRe,"validateURLResponse");async function lD(e){try{let t;switch(e.file_type){case Pi.VALID_S3_FILE_TYPES.CSV:t=await KRe(e);break;case Pi.VALID_S3_FILE_TYPES.JSON:t=await YRe(e);break;default:throw er(new Error,Dr.DEFAULT_BULK_LOAD_ERR,un.BAD_REQUEST,Pi.LOG_LEVELS.ERROR,Dr.INVALID_FILE_EXT_ERR(e))}return EQ(t.records,t.number_written)}catch(t){throw fu(t)}}o(lD,"fileLoad");async function fQ(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;s&&s.pause();let a={operation:e.action,schema:e.schema,table:e.table,records:i};try{let{attributes:c}=await lR.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&dQ(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=er(c);r(l)}}o(fQ,"validateChunk");async function mQ(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;Ff.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!Ff.isEmpty(c)&&!Ff.isEmpty(c.__parsed_extra)&&delete c.__parsed_extra});else{let c=new Set;i.forEach(l=>{Object.keys(l).forEach(u=>c.add(u))}),a=[...c]}try{let c={schema:e.schema,table:e.table,action:e.action,data:i},l=await uQ.callOperationFunctionAsAwait(hQ,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=er(c,du(Dr.INSERT_CSV_ERR),un.INTERNAL_SERVER_ERROR,Pi.LOG_LEVELS.ERROR,Dr.INSERT_CSV_ERR+" - "+c);r(l)}}o(mQ,"insertChunk");async function KRe(e){let t={records:0,number_written:0},r=pQ(e.schema,e.table);try{let n=new cD,s=Li.createReadStream(e.file_path,{highWaterMark:aQ});s.setEncoding("utf8"),await iD.parsePromise(s,fQ.bind(null,e,n),oD.bind(null,r));let i=n.getPermsResponse();if(i)throw er(new Error,i,un.BAD_REQUEST);return s=Li.createReadStream(e.file_path,{highWaterMark:aQ}),s.setEncoding("utf8"),await iD.parsePromise(s,mQ.bind(null,e,t),oD.bind(null,r)),s.destroy(),t}catch(n){throw er(n,du(Dr.PAPA_PARSE_ERR),un.INTERNAL_SERVER_ERROR,Pi.LOG_LEVELS.ERROR,Dr.PAPA_PARSE_ERR+n)}}o(KRe,"callPapaParse");function pQ(e,t){let r=MRe[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>vRe(i,s));return n}o(pQ,"createTransformMap");function oD(e,t,r){let n=e.get(r);return n?n(t):Ff.autoCast(t)}o(oD,"typeFunction");async function YRe(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new cD,s=tQ([Li.createReadStream(e.file_path,{encoding:"utf-8"}),rQ.withParser(),c=>c.value,new nQ({batchSize:cQ}),sQ(async c=>{await fQ(e,n,r,c)})]);await new Promise((c,l)=>{iQ(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw er(new Error,i,un.BAD_REQUEST);let a=tQ([Li.createReadStream(e.file_path,{encoding:"utf-8"}),rQ.withParser(),c=>c.value,new nQ({batchSize:cQ}),sQ(async c=>{await mQ(e,t,r,c)})]);return await new Promise((c,l)=>{iQ(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw er(n,du(Dr.INSERT_JSON_ERR),un.INTERNAL_SERVER_ERROR,Pi.LOG_LEVELS.ERROR,Dr.INSERT_JSON_ERR+n)}}o(YRe,"insertJson");async function hQ(e){let t={};try{e.data&&e.data.length>0&&WRe(e.data[0])?t=await zRe(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",kf.info(t.message))}catch(r){throw fu(r)}return t}o(hQ,"callBulkFileLoad");function WRe(e){let t=Object.keys(e);for(let r of t)if(!URe.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(WRe,"validateColumnNames");async function zRe(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=lR.insert;break;case"update":i=lR.update;break;case"upsert":i=lR.upsert;break;default:throw er(new Error,Dr.INVALID_ACTION_PARAM_ERR(n),un.BAD_REQUEST,Pi.LOG_LEVELS.ERROR,Dr.INVALID_ACTION_PARAM_ERR(n))}try{let a=await i(s),c;switch(n){case"insert":c=a.inserted_hashes;break;case"update":c=a.update_hashes;break;case"upsert":c=a.upserted_hashes;break;default:break}if(Array.isArray(a.skipped_hashes)&&a.skipped_hashes.length>0){let d=global.hdb_schema[t][r].hash_attribute,f=e.length;for(;f--;)a.skipped_hashes.indexOf(e[f][d])>=0&&e.splice(f,1)}let l=Ff.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw fu(a)}}o(zRe,"bulkFileLoad");function EQ(e,t){return`successfully loaded ${t} of ${e} records`}o(EQ,"buildResponseMsg");function fu(e){return er(e,du(Dr.DEFAULT_BULK_LOAD_ERR),un.INTERNAL_SERVER_ERROR,Pi.LOG_LEVELS.ERROR,Dr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(fu,"buildTopLevelErrMsg")});var yQ=v((_qe,TQ)=>{"use strict";var jRe=En(),QRe=mi(),gQ=Q(),JRe=pn(),Eqe=YS(),XRe=require("clone"),fD=require("alasql"),ZRe=$g(),SQ=require("util"),ebe=SQ.promisify(QRe.getTableSchema),tbe=SQ.promisify(jRe.search),rbe=(q(),M(Y)),dD=oe();ZRe(fD);TQ.exports={update:sbe};var nbe="There was a problem performing this update. Please check the logs and try again.";async function sbe({statement:e,hdb_user:t}){let r=await ebe(e.table.databaseid,e.table.tableid),n=ibe(e.columns);dD.backtickASTSchemaItems(e);let{table:s,where:i}=e,a=XRe(s),c=dD.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=fD.parse(l).statements[0],d=await tbe(u),f=obe(n,d);return abe(a,f,t)}o(sbe,"update");function ibe(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=fD.compile(`SELECT ${r.expression.toString()} AS [${rbe.FUNC_VAL}] FROM ?`)}),t}catch(t){throw gQ.error(t),new Error(nbe)}}o(ibe,"createUpdateRecord");function obe(e,t){return dD.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}o(obe,"buildUpdateRecords");async function abe(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await JRe.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){gQ.error(`Error delete new_attributes from update response: ${i}`)}return s}o(abe,"updateRecords")});var bQ=v((yqe,RQ)=>{var cbe=require("alasql"),lbe=En(),ube=Q(),dbe=cs(),pD=require("util"),mD=oe(),fbe=(q(),M(Y)),mbe=mi(),Sqe=YS(),Tqe=pn(),pbe="record",hbe="successfully deleted",Ebe=pD.callbackify(Tbe),_be=pD.promisify(lbe.search),gbe=pD.promisify(mbe.getTableSchema);RQ.exports={convertDelete:Ebe};function Sbe(e){return`${e.deleted_hashes.length} ${pbe}${e.deleted_hashes.length===1?"":"s"} ${hbe}`}o(Sbe,"generateReturnMessage");async function Tbe({statement:e,hdb_user:t}){let r=await gbe(e.table.databaseid,e.table.tableid);mD.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=mD.isEmpty(s)?"":` WHERE ${s.toString()}`,a=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=cbe.parse(a).statements[0],l={operation:fbe.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await _be(c);let u=await dbe.deleteRecords(l);return mD.isEmptyOrZeroLength(u.message)&&(u.message=Sbe(u)),delete u.txn_time,u}catch(u){throw ube.error(u),u.hdb_code?u.message:u}}o(Tbe,"convertDelete")});var RE=v((bqe,CQ)=>{"use strict";CQ.exports={evaluateSQL:Mbe,processAST:NQ,convertSQLToAST:wQ,checkASTPermissions:IQ};var ybe=pn(),AQ=require("util"),Rbe=AQ.callbackify(ybe.insert),bbe=En().search,Abe=yQ().update,Ibe=AQ.callbackify(Abe),wbe=bQ().convertDelete,Bc=require("alasql"),Nbe=cR(),fR=Q(),Cbe=$g(),Obe=oe(),yE=(q(),M(Y)),{hdbErrors:Pbe,handleHDBError:hD}=_e(),{HTTP_STATUS_CODES:ED}=Pbe;Cbe(Bc);var Lbe=403,Dbe="There was a problem performing this insert. Please check the logs and try again.",_D=class{static{o(this,"ParsedSQLObject")}constructor(){this.ast=void 0,this.variant=void 0,this.permissions_checked=!1}};function Mbe(e,t){let r=e.parsed_sql_object;if(!r){r=wQ(e.sql);let n,s=r.ast.statements[0];if(s instanceof Bc.yy.Insert?n=s.into.databaseid:s instanceof Bc.yy.Select?n=s.from?s.from[0].databaseid:null:s instanceof Bc.yy.Update||s instanceof Bc.yy.Delete?n=s.table.databaseid:fR.error("AST in evaluateSQL is not a valid SQL type."),!(s instanceof Bc.yy.Select)&&Obe.isEmptyOrZeroLength(n))return t("No schema specified",null)}NQ(e,r,(n,s)=>{if(n)return t(n);t(null,s)})}o(Mbe,"evaluateSQL");function IQ(e,t){let r;try{r=Nbe.verifyPermsAst(t.ast.statements[0],e.hdb_user,t.variant),t.permissions_checked=!0}catch(n){throw n}return r||null}o(IQ,"checkASTPermissions");function wQ(e){let t=new _D;if(!e)throw hD(new Error,"The 'sql' parameter is missing from the request body",ED.BAD_REQUEST);try{let r=e.trim(),n=Bc.parse(r),s=r.split(" ")[0].toLowerCase();t.ast=n,t.variant=s}catch(r){let n=r.message.split(`
134
134
  `);throw n[1]?hD(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,ED.BAD_REQUEST):hD(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",ED.BAD_REQUEST)}return t}o(wQ,"convertSQLToAST");function NQ(e,t,r){try{let n=vbe;if(!e.bypass_auth&&!t.permissions_checked){let i=IQ(e,t);if(i&&i.length>0)return r(Lbe,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case yE.VALID_SQL_OPS_ENUM.SELECT:n=bbe,s=t.ast.statements[0];break;case yE.VALID_SQL_OPS_ENUM.INSERT:n=Ube;break;case yE.VALID_SQL_OPS_ENUM.UPDATE:n=Ibe;break;case yE.VALID_SQL_OPS_ENUM.DELETE:n=wbe;break;default:throw new Error(`unsupported SQL type ${t.variant} in SQL: ${e}`)}n(s,(i,a)=>{if(i){r(i);return}r(null,a)})}catch(n){return r(n)}}o(NQ,"processAST");function vbe(e,t){fR.info(e),t("unknown sql statement")}o(vbe,"nullFunction");function Ube({statement:e,hdb_user:t},r){let n=e.into,s={schema:n.databaseid,table:n.tableid,operation:"insert",hdb_user:t},i=e.columns.map(a=>a.columnid);try{s.records=xbe(i,e.values)}catch(a){return r(a)}Rbe(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){fR.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(Ube,"convertInsert");function xbe(e,t){try{return t.map(r=>{if(e.length!==r.length)throw"number of values do not match number of columns in insert";let n={};return r.forEach((s,i)=>{if(s.columnid)throw"cannot use a column in insert value";"value"in s?n[e[i]]=s.value:n[e[i]]=Bc.compile(`SELECT ${s.toString()} AS [${yE.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw fR.error(r),new Error(Dbe)}}o(xbe,"createDataObjects")});var TD=v((Iqe,xQ)=>{"use strict";var SD=En(),Bbe=tC(),{AsyncParser:Fbe}=require("json2csv"),mR=require("stream"),ws=oe(),gD=require("fs-extra"),kbe=require("path"),Zs=Q(),{promisify:LQ}=require("util"),bE=oe(),{handleHDBError:Rr,hdbErrors:Hbe}=_e(),{HDB_ERROR_MSGS:jn,HTTP_STATUS_CODES:br}=Hbe,{streamAsJSON:qbe}=(Jb(),M(UU)),{Upload:Gbe}=require("@aws-sdk/lib-storage"),{toCsvStream:$be}=(Mo(),M(KU)),OQ=["search_by_value","search_by_hash","sql","search_by_conditions"],PQ=["json","csv"],DQ="json",MQ="csv",Vbe="Successfully exported JSON locally.",Kbe="Successfully exported CSV locally.",Ybe=1e3,Wbe=SD.searchByHash,zbe=SD.searchByValue,jbe=LQ(mR.finished);xQ.exports={export_to_s3:Zbe,export_local:Qbe};async function Qbe(e){Zs.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=vQ(e);if(!ws.isEmpty(t))throw Zs.error(t),Rr(new Error,t,br.BAD_REQUEST,void 0,void 0,!0);if(ws.isEmpty(e.path))throw Zs.error(jn.MISSING_VALUE("path")),Rr(new Error,jn.MISSING_VALUE("path"),br.BAD_REQUEST,void 0,void 0,!0);let r=(ws.isEmpty(e.filename)?new Date().getTime():e.filename)+"."+e.format;e.path.endsWith(kbe.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=ws.buildFolderPath(e.path,r);await Jbe(e.path);let s=await UQ(e);return await Xbe(n,e.format,s)}o(Qbe,"export_local");async function Jbe(e){if(Zs.trace("in confirmPath"),ws.isEmptyOrZeroLength(e))throw Rr(new Error,`Invalid path: ${e}`,br.BAD_REQUEST,void 0,void 0,!0);let t;try{t=await gD.stat(e)}catch(r){let n;throw r.code==="ENOENT"?n=`path '${directory_path}' does not exist`:r.code==="EACCES"?n=`access to path '${directory_path}' is denied`:n=r.message,Zs.error(n),Rr(new Error,n,br.BAD_REQUEST,void 0,void 0,!0)}if(!t.isDirectory()){let r=`path '${directory_path}' is not a directory, please supply a valid folder path`;throw Zs.error(r),Rr(new Error,r,br.BAD_REQUEST,void 0,void 0,!0)}return!0}o(Jbe,"confirmPath");async function Xbe(e,t,r){if(Zs.trace("in saveToLocal"),bE.isEmptyOrZeroLength(e))throw Rr(new Error,jn.INVALID_VALUE("file_path"),br.BAD_REQUEST,void 0,void 0,!0);if(bE.isEmptyOrZeroLength(t))throw Rr(new Error,jn.INVALID_VALUE("Source format"),br.BAD_REQUEST,void 0,void 0,!0);if(bE.isEmpty(r))throw Rr(new Error,jn.NOT_FOUND("Data"),br.BAD_REQUEST,void 0,void 0,!0);if(t===DQ){let n=gD.createWriteStream(e);return qbe(r).pipe(n),await jbe(n),{message:Vbe,path:e}}else if(t===MQ){let n=gD.createWriteStream(e),s=mR.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new Fbe(i,c).fromInput(s).toOutput(n).promise(!1),{message:Kbe,path:e}}throw Rr(new Error,jn.INVALID_VALUE("format"),br.BAD_REQUEST)}o(Xbe,"saveToLocal");async function Zbe(e){if(!e.s3||Object.keys(e.s3).length===0)throw Rr(new Error,jn.MISSING_VALUE("S3 object"),br.BAD_REQUEST);if(ws.isEmptyOrZeroLength(e.s3.aws_access_key_id))throw Rr(new Error,jn.MISSING_VALUE("aws_access_key_id"),br.BAD_REQUEST);if(ws.isEmptyOrZeroLength(e.s3.aws_secret_access_key))throw Rr(new Error,jn.MISSING_VALUE("aws_secret_access_key"),br.BAD_REQUEST);if(ws.isEmptyOrZeroLength(e.s3.bucket))throw Rr(new Error,jn.MISSING_VALUE("bucket"),br.BAD_REQUEST);if(ws.isEmptyOrZeroLength(e.s3.key))throw Rr(new Error,jn.MISSING_VALUE("key"),br.BAD_REQUEST);if(ws.isEmptyOrZeroLength(e.s3.region))throw Rr(new Error,jn.MISSING_VALUE("region"),br.BAD_REQUEST);let t=vQ(e);if(!ws.isEmpty(t))throw Rr(new Error,t,br.BAD_REQUEST);Zs.trace(`called export_to_s3 to bucket: ${e.s3.bucket} and query ${e.search_operation.sql}`);let r;try{r=await UQ(e)}catch(l){throw Zs.error(l),l}let n,s=await Bbe.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new mR.PassThrough;if(e.format===MQ){i=e.s3.key+".csv";let l=$be(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===DQ){i=e.s3.key+".json";let l=new mR.Readable;l.pipe(a),l.on("error",f=>{throw f}),l.push("[");let u=r.length,d="";for(let[f,m]of r.entries()){let p=f===u-1?JSON.stringify(m):JSON.stringify(m)+",";d+=p,f!==0&&f%Ybe===0&&(l.push(d),d="")}d.length!==0&&l.push(d),l.push("]"),l.push(null)}else throw Rr(new Error,jn.INVALID_VALUE("format"),br.BAD_REQUEST);return new Gbe({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(Zbe,"export_to_s3");function vQ(e){if(Zs.trace("in exportCoreValidation"),ws.isEmpty(e.format))return"format missing";if(PQ.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${PQ.join(", ")}`;let t=e.search_operation.operation;if(ws.isEmpty(t))return"search_operation.operation missing";if(OQ.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${OQ.join(", ")}`}o(vQ,"exportCoreValidation");async function UQ(e){Zs.trace("in getRecords");let t,r;if(bE.isEmpty(e.search_operation)||bE.isEmptyOrZeroLength(e.search_operation.operation))throw Rr(new Error,jn.INVALID_VALUE("Search operation"),br.BAD_REQUEST);switch(e.search_operation.operation){case"search_by_value":t=zbe;break;case"search_by_hash":t=Wbe;break;case"search_by_conditions":t=SD.searchByConditions;break;case"sql":{let n=RE();t=LQ(n.evaluateSQL);break}default:throw r=`Operation ${e.search_operation.operation} is not support by export.`,Zs.error(r),Rr(new Error,r,br.BAD_REQUEST)}return e.search_operation.hdb_user=e.hdb_user,t(e.search_operation)}o(UQ,"getRecords")});var FQ=v((Nqe,BQ)=>{"use strict";var yD=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};BQ.exports=yD});var qQ=v((Oqe,HQ)=>{"use strict";var eAe=(q(),M(Y)),kQ=require("moment"),tAe=require("uuid").v4,RD=class{static{o(this,"JobObject")}constructor(){this.id=tAe(),this.type=void 0,this.start_datetime=kQ().valueOf(),this.created_datetime=kQ().valueOf(),this.end_datetime=void 0,this.status=eAe.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};HQ.exports=RD});var AD=v((Lqe,jQ)=>{"use strict";var rAe=require("uuid").v4,YQ=pn(),WQ=En(),nAe=di(),sAe=rd(),iAe=FQ(),Mt=(q(),M(Y)),oAe=qQ(),aAe=Yp(),Di=Q(),cAe=Sm(),Hf=oe(),{promisify:lAe}=require("util"),mu=require("moment"),pR=ZN(),GQ=dw(),{deleteTransactionLogsBeforeValidator:uAe}=wL(),{handleHDBError:$Q,hdbErrors:dAe,ClientError:fAe}=_e(),{HTTP_STATUS_CODES:VQ}=dAe,KQ=WQ.searchByValue,mAe=WQ.searchByHash,pAe=YQ.insert,hAe=YQ.update,bD;jQ.exports={addJob:gAe,updateJob:TAe,handleGetJob:EAe,handleGetJobsByStartDate:_Ae,getJobById:zQ};async function EAe(e){if(e.id===void 0)throw new fAe("'id' is required");let t=await zQ(e.id);return Hf.isEmptyOrZeroLength(t)||(t[0]={...t[0]},t[0].request!==void 0&&delete t[0].request,delete t[0].__createdtime__,delete t[0].__updatedtime__),t}o(EAe,"handleGetJob");async function _Ae(e){try{let t=await SAe(e);if(Di.trace(`Searching for jobs from ${e.from_date} to ${e.to_date}`),t&&t.length>0)for(let r of t)r.start_datetime&&(r.start_datetime_converted=mu(r.start_datetime)),r.end_datetime&&(r.end_datetime_converted=mu(r.end_datetime)),r.request!==void 0&&delete r.request,delete r.__createdtime__,delete r.__updatedtime__;return t}catch(t){let r=`There was an error searching jobs by date: ${t}`;throw Di.error(r),new Error(r)}}o(_Ae,"handleGetJobsByStartDate");async function gAe(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||Hf.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return Di.info(d),t.error=d,t}if(!Mt.JOB_TYPE_ENUM[e.operation])return Di.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Mt.OPERATIONS_ENUM.CSV_FILE_LOAD:n=pR.fileObject(e);break;case Mt.OPERATIONS_ENUM.CSV_URL_LOAD:n=pR.urlObject(e);break;case Mt.OPERATIONS_ENUM.CSV_DATA_LOAD:n=pR.dataObject(e);break;case Mt.OPERATIONS_ENUM.IMPORT_FROM_S3:n=pR.s3FileObject(e);break;case Mt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Mt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=GQ(e,"date");break;case Mt.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=GQ(e,"timestamp");break;case Mt.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=uAe(e);break;case Mt.OPERATIONS_ENUM.RESTART_SERVICE:if(Mt.HDB_PROCESS_SERVICES[e.service]===void 0)throw $Q(new Error,"Invalid service",VQ.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw $Q(n,n.message,VQ.BAD_REQUEST,void 0,void 0,!0);let s=new oAe;s.type=e.operation===Mt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE?Mt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:e.operation,s.type=e.operation,s.user=e.hdb_user?.username;let i=new nAe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await KQ(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return Di.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=rAe();try{a=await KQ(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return Di.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return Di.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new cAe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await pAe(l)}catch(d){return Di.error(`There was an error inserting a job for job type: ${e.operation} -- ${d}`),t.success=!1,t}if(u.inserted_hashes.length===0)t.message=`Had a problem creating a job with type ${s.operation} and id ${s.id}`;else{let d=`Created a job with type ${s.type} and id ${s.id}`;t.message=d,t.createdJob=s,t.success=!0,Di.trace(d)}return t}o(gAe,"addJob");async function SAe(e){let t=mu(e.from_date,mu.ISO_8601),r=mu(e.to_date,mu.ISO_8601);if(!t.isValid())throw new Error("Invalid 'from' date, must be in ISO-8601 format (YYYY-MM-DD).");if(!r.isValid())throw new Error("Invalid 'to' date, must be in ISO-8601 format (YYYY-MM-DD)");let n=`select * from system.hdb_job where start_datetime > '${t.valueOf()}' and start_datetime < '${r.valueOf()}'`,s=new iAe(n,e.hdb_user);try{if(!bD){let i=RE();bD=lAe(i.evaluateSQL)}return await bD(s)}catch(i){throw Di.error(`there was a problem searching for jobs from date ${e.from_date} to date ${e.to_date} ${i}`),new Error("there was an error searching for jobs. Please check the log for details.")}}o(SAe,"getJobsInDateRange");async function zQ(e){if(Hf.isEmptyOrZeroLength(e))return Hf.errorizeMessage("Invalid job ID specified.");let t=new sAe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await mAe(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return Di.error(n),Hf.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(zQ,"getJobById");async function TAe(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(Hf.isEmptyOrZeroLength(e.id))throw new Error("invalid ID passed to updateJob");(e.status===Mt.JOB_STATUS_ENUM.COMPLETE||e.status===Mt.JOB_STATUS_ENUM.ERROR)&&(e.end_datetime=mu().valueOf());let t=new aAe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await hAe(t),r}o(TAe,"updateJob")});var n2=v((Mqe,r2)=>{"use strict";var QQ=oe(),Mr=(q(),M(Y)),yAe=require("moment"),hR=uD(),AE=Q(),JQ=AD(),XQ=TD(),ZQ=Qa(),e2=Ze(),RAe=Zy(),bAe=Uf(),{parentPort:AAe,isMainThread:t2}=require("worker_threads"),{onMessageByType:IAe}=Ze(),ID=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function wAe(e){if(!e||Object.keys(e).length===0)throw new Error("Empty runner passed to parseMessage");if(!e.json||Object.keys(e.json).length===0)throw new Error("Empty JSON passed to parseMessage");if(!e.job||Object.keys(e.job).length===0)throw new Error("Empty job passed to parseMessage");if(QQ.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(QQ.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case Mr.JOB_TYPE_ENUM.csv_file_load:await So(e,hR.csvFileLoad);break;case Mr.JOB_TYPE_ENUM.csv_url_load:await So(e,hR.csvURLLoad);break;case Mr.JOB_TYPE_ENUM.csv_data_load:await So(e,hR.csvDataLoad);break;case Mr.JOB_TYPE_ENUM.import_from_s3:await So(e,hR.importFromS3);break;case Mr.JOB_TYPE_ENUM.empty_trash:break;case Mr.JOB_TYPE_ENUM.export_local:await So(e,XQ.export_local);break;case Mr.JOB_TYPE_ENUM.export_to_s3:await So(e,XQ.export_to_s3);break;case Mr.JOB_TYPE_ENUM.delete_files_before:case Mr.JOB_TYPE_ENUM.delete_records_before:await So(e,ZQ.deleteFilesBefore);break;case Mr.JOB_TYPE_ENUM.delete_audit_logs_before:await So(e,ZQ.deleteAuditLogsBefore);break;case Mr.JOB_TYPE_ENUM.delete_transaction_logs_before:await So(e,RAe.deleteTransactionLogsBefore);break;case Mr.JOB_TYPE_ENUM.restart_service:return await So(e,bAe.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(wAe,"parseMessage");async function So(e,t){try{e.job.status=Mr.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=yAe().valueOf(),await JQ.updateJob(e.job),await NAe(e.job.id)}catch(r){let n=r.message!==void 0?r.message:r;typeof n=="string"?(n=`There was an error running ${t.name} job with id ${e.job.id} - ${n}`,r.message=n):AE.error(`There was an error running ${t.name} job with id ${e.job.id}`),AE.error(n),e.job.message=n,e.job.status=Mr.JOB_STATUS_ENUM.ERROR;try{await JQ.updateJob(e.job)}catch(s){throw AE.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(So,"runJob");async function NAe(e){AE.trace("launching job thread:",e),t2?e2.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Mr.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):AAe.postMessage({type:Mr.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(NAe,"launchJobThread");t2&&IAe(Mr.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{e2.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Mr.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){AE.error(r)}});r2.exports={parseMessage:wAe,RunnerMessage:ID}});var i2=v((Uqe,s2)=>{"use strict";var CAe=oe(),wD=ce(),Fc=(q(),M(Y)),OAe=pt(),PAe=qt(),To=Q(),LAe=sD(),DAe=Zi();wD.initSync();s2.exports={postOperationHandler:vAe,sendOperationTransaction:IE};async function IE(e,t,r,n){if(e.schema===Fc.SYSTEM_SCHEMA_NAME)return;let s=MAe(e,t,r);s&&(To.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await PAe.publishToStream(`${OAe.SUBJECT_PREFIXES.TXN}.${e.schema}`,DAe.createNatsTableStreamName(e.schema,e.table),n,s))}o(IE,"sendOperationTransaction");function MAe(e,t,r){if(CAe.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===Fc.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(MAe,"convertCRUDOperationToTransaction");async function vAe(e,t,r){if(!wD.get(Fc.CONFIG_PARAMS.CLUSTERING_ENABLED))return;To.trace(`postOperationHandler called for operation ${e.operation} on schema.table: ${e.schema}.${e.table}`);let n=e.hdb_user?.username,s=wD.get(Fc.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new LAe(t.txn_time,n,s);switch(e.operation){case Fc.OPERATIONS_ENUM.INSERT:try{await IE(e,t.inserted_hashes,i,r)}catch(a){To.error("There was an error calling clustering postOperationHandler for insert."),To.error(a)}break;case Fc.OPERATIONS_ENUM.DELETE:try{await IE(e,t.deleted_hashes,i,r)}catch(a){To.error("There was an error calling clustering postOperationHandler for delete."),To.error(a)}break;case Fc.OPERATIONS_ENUM.UPDATE:try{await IE(e,t.update_hashes,i,r)}catch(a){To.error("There was an error calling clustering postOperationHandler for update."),To.error(a)}break;case Fc.OPERATIONS_ENUM.UPSERT:try{await IE(e,t.upserted_hashes,i,r)}catch(a){To.error("There was an error calling clustering postOperationHandler for upsert."),To.error(a)}break;default:break}return t}o(vAe,"postOperationHandler")});var Z,o2=se(()=>{Z=class{static{o(this,"OperationFunctionObject")}operation_function;job_operation_function;constructor(t,r=void 0){this.operation_function=t,this.job_operation_function=r}}});var AL={};Re(AL,{chooseOperation:()=>w2,executeJob:()=>ei,getOperationFunction:()=>N2,operation:()=>UD,processLocalTransaction:()=>I2});function BAe(e){if(!ND){let t=RE();ND=vD.promisify(t.evaluateSQL)}return ND(e)}async function I2(e,t){try{if(e.body.operation!=="read_log"&&(OE.default.log_level===cm.INFO||OE.default.log_level===cm.DEBUG||OE.default.log_level===cm.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;Cn.info(c)}}catch(n){Cn.error(n)}let r=await b2.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return FAe[e.body.operation]&&g2.default.setSchemaDataToGlobal(n=>{n&&Cn.error(n)}),r}function w2(e){let t;try{t=N2(e)}catch(s){throw Cn.error(`Error when selecting operation function - ${s}`),s}let{operation_function:r,job_operation_function:n}=t;try{if(e.operation==="sql"||e.search_operation&&e.search_operation.operation==="sql"){let s=RE(),i=e.operation==="sql"?e.sql:e.search_operation.sql,a=s.convertSQLToAST(i);if(e.parsed_sql_object=a,!e.bypass_auth){let c=s.checkASTPermissions(e,a);if(c)throw Cn.error(`${a2.FORBIDDEN} from operation ${e.operation}`),Cn.warn(`User '${e.hdb_user?.username}' is not permitted to ${e.operation}`),(0,ti.handleHDBError)(new Error,c,ti.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,void 0,!0)}}else if(!e.bypass_auth&&e.operation!==V.CREATE_AUTHENTICATION_TOKENS&&e.operation!==V.LOGIN&&e.operation!==V.LOGOUT){let s=n===void 0?r:n,i=e.search_operation?e.search_operation:e;i.hdb_user||(i.hdb_user=e.hdb_user);let a=_2.default.verifyPerms(i,s);if(a)throw Cn.error(`${a2.FORBIDDEN} from operation ${e.operation}`),Cn.warn(`User '${i.hdb_user?.username}' is not permitted to ${i.operation}`),(0,ti.handleHDBError)(new Error,a,ti.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,!1,!0)}}catch(s){throw(0,ti.handleHDBError)(s,"There was an error when trying to choose an operation path")}return r}function N2(e){if(Cn.trace(`getOperationFunction with operation: ${e.operation}`),c2.has(e.operation))return c2.get(e.operation);throw(0,ti.handleHDBError)(new Error,ti.hdbErrors.HDB_ERROR_MSGS.OP_NOT_FOUND(e.operation),ti.hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}function UD(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=w2(e);return I2({body:e},n)}async function kAe(e){Cn.trace("In serverUtils.catchup");let t=e.transaction,r=t.channel.split(":"),n=r[0],s=r[1];for(let i of t.transactions)try{i.schema=n,i.table=s,i[Pb]=!0;let a;switch(i.operation){case V.INSERT:a=await hu.default.insert(i);break;case V.UPDATE:a=await hu.default.update(i);break;case V.UPSERT:a=await hu.default.upsert(i);break;case V.DELETE:a=await $f.default.deleteRecord(i);break;default:Cn.warn("invalid operation in catchup");break}await UAe.postOperationHandler(i,a,e)}catch(a){Cn.info("Invalid operation in transaction"),Cn.error(a)}}async function ei(e){(0,R2.transformReq)(e);let t,r;try{if(r=await _R.default.addJob(e),r){t=r.createdJob,Cn.info("addJob result",r);let n=new LD.default.RunnerMessage(t,e);return{message:await LD.default.parseMessage(n)??`Starting job with id ${t.id}`,job_id:t.id}}}catch(n){let s=n instanceof Error?n:null,i=`There was an error executing job: ${s&&"http_resp_msg"in s?s.http_resp_msg:n}`;throw Cn.error(i),(0,ti.handleHDBError)(n,i)}}function HAe(){let e=new Map;return e.set(V.INSERT,new Z(hu.default.insert)),e.set(V.UPDATE,new Z(hu.default.update)),e.set(V.UPSERT,new Z(hu.default.upsert)),e.set(V.SEARCH_BY_CONDITIONS,new Z(Gf.default.searchByConditions)),e.set(V.SEARCH_BY_HASH,new Z(Gf.default.searchByHash)),e.set(V.SEARCH_BY_ID,new Z(Gf.default.searchByHash)),e.set(V.SEARCH_BY_VALUE,new Z(Gf.default.searchByValue)),e.set(V.SEARCH,new Z(xAe)),e.set(V.SQL,new Z(BAe)),e.set(V.CSV_DATA_LOAD,new Z(ei,wE.default.csvDataLoad)),e.set(V.CSV_FILE_LOAD,new Z(ei,wE.default.csvFileLoad)),e.set(V.CSV_URL_LOAD,new Z(ei,wE.default.csvURLLoad)),e.set(V.IMPORT_FROM_S3,new Z(ei,wE.default.importFromS3)),e.set(V.CREATE_SCHEMA,new Z(Mi.default.createSchema)),e.set(V.CREATE_DATABASE,new Z(Mi.default.createSchema)),e.set(V.CREATE_TABLE,new Z(Mi.default.createTable)),e.set(V.CREATE_ATTRIBUTE,new Z(Mi.default.createAttribute)),e.set(V.DROP_SCHEMA,new Z(Mi.default.dropSchema)),e.set(V.DROP_DATABASE,new Z(Mi.default.dropSchema)),e.set(V.DROP_TABLE,new Z(Mi.default.dropTable)),e.set(V.DROP_ATTRIBUTE,new Z(Mi.default.dropAttribute)),e.set(V.DESCRIBE_SCHEMA,new Z(NE.default.describeSchema)),e.set(V.DESCRIBE_DATABASE,new Z(NE.default.describeSchema)),e.set(V.DESCRIBE_TABLE,new Z(NE.default.describeTable)),e.set(V.DESCRIBE_ALL,new Z(NE.default.describeAll)),e.set(V.DELETE,new Z($f.default.deleteRecord)),e.set(V.ADD_USER,new Z(qf.default.addUser)),e.set(V.ALTER_USER,new Z(qf.default.alterUser)),e.set(V.DROP_USER,new Z(qf.default.dropUser)),e.set(V.LIST_USERS,new Z(qf.default.listUsersExternal)),e.set(V.LIST_ROLES,new Z(CE.default.listRoles)),e.set(V.ADD_ROLE,new Z(CE.default.addRole)),e.set(V.ALTER_ROLE,new Z(CE.default.alterRole)),e.set(V.DROP_ROLE,new Z(CE.default.dropRole)),e.set(V.USER_INFO,new Z(qf.default.userInfo)),e.set(V.READ_LOG,new Z(u2.default)),e.set(V.ADD_NODE,new Z(d2.default)),e.set(V.UPDATE_NODE,new Z(CD.default)),e.set(V.SET_NODE_REPLICATION,new Z(CD.default)),e.set(V.REMOVE_NODE,new Z(f2.default)),e.set(V.CONFIGURE_CLUSTER,new Z(m2.default)),e.set(V.PURGE_STREAM,new Z(p2.default)),e.set(V.SET_CONFIGURATION,new Z(DD.default.setConfiguration)),e.set(V.CLUSTER_STATUS,new Z(h2.default.clusterStatus)),e.set(V.CLUSTER_NETWORK,new Z(E2.default)),e.set(V.CLUSTER_SET_ROUTES,new Z(ER.default.setRoutes)),e.set(V.CLUSTER_GET_ROUTES,new Z(ER.default.getRoutes)),e.set(V.CLUSTER_DELETE_ROUTES,new Z(ER.default.deleteRoutes)),e.set(V.EXPORT_TO_S3,new Z(ei,OD.default.export_to_s3)),e.set(V.CREATE_CSR,new Z(pu.default.createCsr)),e.set(V.SIGN_CERTIFICATE,new Z(pu.default.signCertificate)),e.set(V.LIST_CERTIFICATES,new Z(pu.default.listCertificates)),e.set(V.ADD_CERTIFICATES,new Z(pu.default.addCertificate)),e.set(V.REMOVE_CERTIFICATE,new Z(pu.default.removeCertificate)),e.set(V.GET_KEY,new Z(pu.default.getKey)),e.set(V.ADD_NODE_BACK,new Z(CO)),e.set(V.REMOVE_NODE_BACK,new Z(OO)),e.set(V.DELETE_FILES_BEFORE,new Z(ei,$f.default.deleteFilesBefore)),e.set(V.DELETE_RECORDS_BEFORE,new Z(ei,$f.default.deleteFilesBefore)),e.set(V.EXPORT_LOCAL,new Z(ei,OD.default.export_local)),e.set(V.SEARCH_JOBS_BY_START_DATE,new Z(_R.default.handleGetJobsByStartDate)),e.set(V.GET_JOB,new Z(_R.default.handleGetJob)),e.set(V.GET_REGISTRATION_INFO,new Z(GL)),e.set(V.GET_FINGERPRINT,new Z($L)),e.set(V.SET_LICENSE,new Z(VL)),e.set(V.RESTART,new Z(PD.default.restart)),e.set(V.RESTART_SERVICE,new Z(ei,PD.default.restartService)),e.set(V.CATCHUP,new Z(kAe)),e.set(V.SYSTEM_INFORMATION,new Z(S2.default.systemInformation)),e.set(V.DELETE_AUDIT_LOGS_BEFORE,new Z(ei,$f.default.deleteAuditLogsBefore)),e.set(V.READ_AUDIT_LOG,new Z(l2.default)),e.set(V.CREATE_AUTHENTICATION_TOKENS,new Z(VN)),e.set(V.REFRESH_OPERATION_TOKEN,new Z(KN)),e.set(V.LOGIN,new Z(SL)),e.set(V.LOGOUT,new Z(TL)),e.set(V.GET_CONFIGURATION,new Z(DD.default.getConfiguration)),e.set(V.CUSTOM_FUNCTIONS_STATUS,new Z(vt.default.customFunctionsStatus)),e.set(V.GET_CUSTOM_FUNCTIONS,new Z(vt.default.getCustomFunctions)),e.set(V.GET_COMPONENT_FILE,new Z(vt.default.getComponentFile)),e.set(V.GET_COMPONENTS,new Z(vt.default.getComponents)),e.set(V.SET_COMPONENT_FILE,new Z(vt.default.setComponentFile)),e.set(V.DROP_COMPONENT,new Z(vt.default.dropComponent)),e.set(V.GET_CUSTOM_FUNCTION,new Z(vt.default.getCustomFunction)),e.set(V.SET_CUSTOM_FUNCTION,new Z(vt.default.setCustomFunction)),e.set(V.DROP_CUSTOM_FUNCTION,new Z(vt.default.dropCustomFunction)),e.set(V.ADD_CUSTOM_FUNCTION_PROJECT,new Z(vt.default.addComponent)),e.set(V.ADD_COMPONENT,new Z(vt.default.addComponent)),e.set(V.DROP_CUSTOM_FUNCTION_PROJECT,new Z(vt.default.dropCustomFunctionProject)),e.set(V.PACKAGE_CUSTOM_FUNCTION_PROJECT,new Z(vt.default.packageComponent)),e.set(V.PACKAGE_COMPONENT,new Z(vt.default.packageComponent)),e.set(V.DEPLOY_CUSTOM_FUNCTION_PROJECT,new Z(vt.default.deployComponent)),e.set(V.DEPLOY_COMPONENT,new Z(vt.default.deployComponent)),e.set(V.READ_TRANSACTION_LOG,new Z(MD.default.readTransactionLog)),e.set(V.DELETE_TRANSACTION_LOGS_BEFORE,new Z(ei,MD.default.deleteTransactionLogsBefore)),e.set(V.INSTALL_NODE_MODULES,new Z(T2.default.installModules)),e.set(V.GET_BACKUP,new Z(Mi.default.getBackup)),e.set(V.CLEANUP_ORPHAN_BLOBS,new Z(Mi.default.cleanupOrphanBlobs)),e.set(V.ADD_SSH_KEY,new Z(vt.default.addSSHKey)),e.set(V.UPDATE_SSH_KEY,new Z(vt.default.updateSSHKey)),e.set(V.DELETE_SSH_KEY,new Z(vt.default.deleteSSHKey)),e.set(V.LIST_SSH_KEYS,new Z(vt.default.listSSHKeys)),e.set(V.SET_SSH_KNOWN_HOSTS,new Z(vt.default.setSSHKnownHosts)),e.set(V.GET_SSH_KNOWN_HOSTS,new Z(vt.default.getSSHKnownHosts)),e.set(V.GET_ANALYTICS,new Z(OL)),e.set(V.LIST_METRICS,new Z(PL)),e.set(V.DESCRIBE_METRIC,new Z(LL)),e.set(V.GET_STATUS,new Z(kL)),e.set(V.SET_STATUS,new Z(HL)),e.set(V.CLEAR_STATUS,new Z(FL)),e.set(V.INSTALL_USAGE_LICENSE,new Z(kP)),e.set(V.GET_USAGE_LICENSES,new Z($P)),e}var Gf,wE,Mi,NE,$f,l2,qf,CE,vt,OE,u2,d2,CD,f2,m2,p2,h2,E2,ER,OD,_2,_R,ti,PD,vD,hu,g2,S2,LD,DD,MD,T2,y2,R2,pu,b2,A2,a2,Cn,UAe,xAe,ND,FAe,c2,IL=se(()=>{Gf=b(En()),wE=b(uD()),Mi=b(Sh()),NE=b(ic()),$f=b(Qa()),l2=b(rO()),qf=b(fs()),CE=b(Gp()),vt=b(bL()),OE=b(Q()),u2=b(aO()),d2=b($T()),CD=b(vO()),f2=b(KT()),m2=b(BO()),p2=b(FO()),h2=b(qO()),E2=b($O()),ER=b(QT()),OD=b(TD()),_2=b(cR()),_R=b(AD());q();ti=b(_e()),PD=b(Uf()),vD=b(require("util")),hu=b(pn()),g2=b(mi()),S2=b(bh()),LD=b(n2());Ud();Ky();DD=b(Tt()),MD=b(Zy()),T2=b(CL()),y2=b(oi()),R2=b(oe());Fr();pu=b(_s());cf();ML();b2=b(eC()),A2=b(i2());dE();Kh();YL();o2();({HTTP_STATUS_CODES:a2}=ti.hdbErrors),Cn=OE.default.loggerWithTag("operation"),{transactToClusteringUtils:UAe}=A2.default,xAe=vD.promisify(Gf.default.search);o(BAe,"evaluateSQL");FAe={[V.CREATE_ATTRIBUTE]:!0,[V.CREATE_TABLE]:!0,[V.CREATE_SCHEMA]:!0,[V.DROP_ATTRIBUTE]:!0,[V.DROP_TABLE]:!0,[V.DROP_SCHEMA]:!0};o(I2,"processLocalTransaction");c2=HAe();ve.operation=UD;o(w2,"chooseOperation");o(N2,"getOperationFunction");(0,y2._assignPackageExport)("operation",UD);o(UD,"operation");o(kAe,"catchup");o(ei,"executeJob");o(HAe,"initializeOperationFunctionMap")});var TR=v((Gqe,P2)=>{"use strict";var gR=(q(),M(Y)),qAe=oe(),PE=Q(),{handleHDBError:xD,hdbErrors:SR}=_e(),{isMainThread:GAe}=require("worker_threads"),{Readable:$Ae}=require("stream"),C2=require("os"),VAe=require("util"),KAe=WN(),YAe=VAe.promisify(KAe.authorize),O2=(IL(),M(AL)),{createGzip:WAe,constants:zAe}=require("zlib"),jAe=[gR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,gR.OPERATIONS_ENUM.LOGIN,gR.OPERATIONS_ENUM.LOGOUT];function QAe(e){let t=`Found an uncaught exception with message: ${e.message}. ${C2.EOL}Stack: ${e.stack} ${C2.EOL}Terminating ${GAe?"HDB":"thread"}.`;console.error(t),PE.fatal(t),process.exit(1)}o(QAe,"handleServerUncaughtException");function JAe(e,t,r){if(PE[e.logLevel||"error"](e),e.statusCode)return typeof e.http_resp_msg!="object"?r.code(e.statusCode).send({error:e.http_resp_msg||e.message}):r.code(e.statusCode).send(e.http_resp_msg);let n=e.statusCode?e.statusCode:SR.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR;return typeof e=="string"?r.code(n).send({error:e}):r.code(n).send(e.message?{error:e.message}:e)}o(JAe,"serverErrorHandler");function XAe(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=xD(new Error,"Invalid JSON.",SR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(qAe.isEmpty(e.body.operation)){let n=xD(new Error,"Request body must include an 'operation' property.",SR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(XAe,"reqBodyValidationHandler");function ZAe(e,t,r){let n;!jAe.includes(e.body.operation)||e.body.operation===gR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?YAe(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{PE.warn(i),PE.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(xD(i,a,SR.HTTP_STATUS_CODES.UNAUTHORIZED),null)}):(e.body.hdb_user=null,e.body.baseRequest=e.raw?.baseRequest,e.body.baseResponse=t.raw?.baseResponse,e.body.fastifyResponse=t,r())}o(ZAe,"authHandler");async function eIe(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=O2.chooseOperation(e.body);let s=await O2.processLocalTransaction(e,n);if(s instanceof $Ae&&s.headers){for(let[i,a]of s.headers)t.header(i,a);e.headers["accept-encoding"]?.includes("gzip")&&(t.header("content-encoding","gzip"),s=s.pipe(WAe({level:zAe.Z_BEST_SPEED})))}return s}catch(s){throw PE.error(s),s}}o(eIe,"handlePostRequest");P2.exports={authHandler:ZAe,handlePostRequest:eIe,handleServerUncaughtException:QAe,serverErrorHandler:JAe,reqBodyValidationHandler:XAe}});var v2=v((Vqe,M2)=>{"use strict";var tIe=require("fastify-plugin"),{handlePostRequest:L2,authHandler:rIe,reqBodyValidationHandler:nIe}=TR();async function sIe(e){e.decorate("hdbCore",{preValidation:[nIe,rIe],request:o(t=>D2(L2(t,response)),"request"),requestWithoutAuthentication:o((t,r)=>D2(L2(t,r,!0)),"requestWithoutAuthentication")})}o(sIe,"hdbCore");async function D2(e){if(e=await e,e?.[Symbol.asyncIterator]&&!e[Symbol.iterator]){let t=[];for await(let r of e)t.push(r);return t}return e}o(D2,"convertAsyncIterators");M2.exports=tIe(sIe)});var x2=v((Wqe,U2)=>{"use strict";var Yqe=require("fs"),yR=ce();yR.initSync();var{CONFIG_PARAMS:BD}=(q(),M(Y)),iIe=1024*1024*1024;function oIe(e){let t=yR.get(BD.HTTP_TIMEOUT),r=yR.get(BD.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:iIe,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:yR.get(BD.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(oIe,"getServerOptions");U2.exports=oIe});var k2=v((jqe,F2)=>{"use strict";var FD=ce();FD.initSync();var{CONFIG_PARAMS:B2}=(q(),M(Y));function aIe(){let e=FD.get(B2.HTTP_CORSACCESSLIST),t=FD.get(B2.HTTP_CORS),r;return t&&(r={origin:!0,allowedHeaders:["Content-Type","Authorization","Accept"],credentials:!1},e&&e.length>0&&e[0]!==null&&e[0]!=="*"&&(r.origin=(n,s)=>s(null,e.indexOf(n)!==-1))),r}o(aIe,"getCORSOptions");F2.exports=aIe});var G2=v((Jqe,q2)=>{"use strict";var H2=ce();H2.initSync();var cIe=(q(),M(Y));function lIe(){return H2.get(cIe.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(lIe,"getHeaderTimeoutConfig");q2.exports=lIe});var HD={};Re(HD,{customFunctionsServer:()=>fIe,ready:()=>rJ,start:()=>dIe});function dIe(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){ga||(ga=tJ(t),ve.http((await ga).server));let a=await ga,c=(0,kD.dirname)(s),l=(0,kD.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!$2.has(c)){$2.add(c);try{a.register(pIe(c,l))}catch(u){if(u.message==="Root plugin has already booted")Rt.warn(`Could not load root fastify route for ${s}, this may require a restart to install properly`);else throw u}}},ready:rJ}}async function fIe(){try{Rt.info("In Custom Functions Fastify server"+process.cwd()),Rt.info(`Custom Functions Running with NODE_ENV set as: ${process.env.NODE_ENV}`),Rt.debug(`Custom Functions server process ${process.pid} starting up.`),await mIe();let e=j2.get(F.HTTP_SECUREPORT)>0,t;try{t=ga=await tJ(e)}catch(r){throw Rt.error(`Custom Functions buildServer error: ${r}`),r}try{await t.ready()}catch(r){throw Rt.error(`Custom Functions server.ready() error: ${r}`),r}t.server.cantCleanupProperly=!0}catch(e){Rt.error(`Custom Functions ${process.pid} Error: ${e}`),Rt.error(e),process.exit(1)}}async function mIe(){try{Rt.info("Custom Functions starting configuration."),await Q2.setUsersWithRolesCache(),Rt.info("Custom Functions completed configuration.")}catch(e){Rt.error(e)}}function pIe(e,t){return async function(r){try{Rt.info("Custom Functions starting buildRoutes"),Rt.trace("Loading fastify routes folder "+e),(0,V2.existsSync)(e)&&r.register(z2.default,s=>({dir:e,dirNameRoutePrefix:!1,options:{hdbCore:s.hdbCore,logger:Rt.loggerWithTag("custom-function"),prefix:`/${t}`}})).after((s,i,a)=>{s?.message?Rt.error(s.message):s&&Rt.error(s),a()})}catch(n){Rt.error(`Custom Functions errored buildRoutes: ${n}`)}}}async function tJ(e){Rt.info("Custom Functions starting buildServer.");let t=(0,J2.default)(e),r=(0,K2.default)(t);r.server.headersTimeout=(0,Z2.default)(),r.setErrorHandler(eJ.serverErrorHandler);let n=(0,X2.default)();return n&&r.register(Y2.default,n),r.register(function(s,i,a){s.setNotFoundHandler(function(c,l){r.server.emit("unhandled",c.raw,l.raw)}),a()}),r.register(W2.default),await r.register(uIe),await r.after(),Nm(r),Rt.info("Custom Functions completed buildServer."),r}function rJ(){if(ga)return ga.then?ga.then(e=>e.ready()):ga.ready()}var kD,V2,K2,Y2,W2,z2,j2,Rt,uIe,Q2,J2,X2,Z2,eJ,ga,$2,nJ=se(()=>{kD=require("path"),V2=require("fs"),K2=b(require("fastify")),Y2=b(require("@fastify/cors")),W2=b(HN()),z2=b(require("@fastify/autoload")),j2=b(ce());q();Rt=b(Q()),uIe=b(v2()),Q2=b(fs()),J2=b(x2()),X2=b(k2()),Z2=b(G2()),eJ=b(TR());Mo();Fr();$2=new Set;o(dIe,"start");o(fIe,"customFunctionsServer");o(mIe,"setUp");o(pIe,"buildRouteFolder");o(tJ,"buildServer");o(rJ,"ready")});var GD={};Re(GD,{handleApplication:()=>hIe,suppressHandleApplicationWarning:()=>EIe});function hIe(e){let t=new Map,r=new Map;e.options.on("change",(n,s)=>{if(n[0]==="files"||n[0]==="urlPath"){t.clear(),r.clear(),e.logger.info(`Static files reinitialized due to change in ${n.join(".")}`);return}}),e.handleEntry(n=>{switch(n.eventType){case"addDir":case"unlinkDir":let s=(0,Kf.join)(n.absolutePath,"index.html");(0,Vf.existsSync)(s)&&r[n.eventType==="addDir"?"set":"delete"](n.urlPath,s);break;case"add":t.set(n.urlPath,n.absolutePath),n.urlPath.endsWith("index.html")&&r.set((0,Kf.dirname)(n.urlPath),n.absolutePath);break;case"unlink":t.delete(n.urlPath),n.urlPath.endsWith("index.html")&&r.delete((0,Kf.dirname)(n.urlPath));break}}),e.server.http((n,s)=>{if(n.method!=="GET"||n.isWebSocket)return s(n);let i=e.options.get(["fallthrough"])??!0;if(typeof i!="boolean")throw new Error(`Invalid fallthrough option: ${i}. Must be a boolean.`);let a=t.get(n.pathname);if(!a){let d=e.options.get(["index"])??!1;if(typeof d!="boolean")throw new Error(`Invalid index option: ${d}. Must be a boolean.`);d&&(a=r.get(n.pathname))}if(!a){let d=e.options.get(["extensions"])??[];if(!Array.isArray(d)||d.some(f=>typeof f!="string"))throw new Error(`Invalid extensions option: ${d}. Must be an array of strings.`);for(let f of d)if(a=t.get(`${n.pathname}.${f}`),a)break}if(a)return{handlesHeaders:!0,body:(0,qD.default)(n,(0,Vf.realpathSync)(a))};if(i)return s(n);let c=e.options.get(["notFound"]);if(_Ie(c),!c)return{status:404,body:"File not found"};let l=(0,Kf.join)(e.directory,typeof c=="string"?c:c.file),u=typeof c=="object"?c.statusCode:404;if(!(0,Vf.existsSync)(l))throw new Error(`Not found file does not exist: ${l}`);return{status:u,handlesHeaders:!0,body:(0,qD.default)(n,(0,Vf.realpathSync)(l))}},{runFirst:!0})}function _Ie(e){if(!(e===void 0||typeof e=="string")){if(typeof e=="object"&&e!==null&&!Array.isArray(e)){if(!("file"in e)||typeof e.file!="string")throw new Error(`Invalid \`notFound.file\` option: ${e.file}. Must be a string.`);if(!("statusCode"in e)||typeof e.statusCode!="number")throw new Error(`Invalid \`notFound.statusCode\` option: ${e.statusCode}. Must be a number.`);return}throw new Error(`Invalid notFound option: ${e}. Must be a string or an object with file and statusCode properties.`)}}var Vf,Kf,qD,EIe,sJ=se(()=>{Vf=require("node:fs"),Kf=require("node:path"),qD=b(require("send"));o(hIe,"handleApplication");EIe=!0;o(_Ie,"validateNotFoundOption")});var $D={};Re($D,{start:()=>gIe});function gIe({override:e}){return{handleFile:o((t,r,n)=>{RR.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,iJ.parse)(t))){if(process.env[s]!==void 0)if(RR.default.warn(`Environment variable conflict: ${s} from ${n} is already set on process.env`),e)RR.default.debug(`override option enabled. overriding environment variable: ${s}`);else continue;process.env[s]=i}},"handleFile")}}var iJ,RR,oJ=se(()=>{iJ=require("dotenv"),RR=b(Q());o(gIe,"start")});var VD={};Re(VD,{DataLoaderError:()=>Ns,DataLoaderResult:()=>Yf,EmptyFileError:()=>IR,FileParseError:()=>AR,InvalidPropertyTypeError:()=>wR,MissingRequiredPropertyError:()=>LE,RecordProcessingError:()=>DE,SystemDatabaseError:()=>NR,UnsupportedFileExtensionError:()=>bR,handleApplication:()=>TIe,loadDataFile:()=>dJ,suppressHandleApplicationWarning:()=>SIe});function TIe(e){if((0,cJ.getWorkerIndex)()!==0){yo.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||dJ(t,Tn,De).then(r=>{yo.debug?.("Data loader processed file: %s: %s",(0,Sa.basename)(t.absolutePath),r.message)})})}async function dJ({contents:e,absolutePath:t,stats:r},n,s){let i=(0,Sa.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,aJ.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new bR(t,i);a.mtime=r.mtimeMs}catch(f){throw f instanceof Ns?f:new AR(t,f)}if(!a)throw new IR(t);let{database:c,table:l,records:u}=a;if(!l)throw new LE(t,"table");if(!u)throw new LE(t,"records");if(!Array.isArray(u))throw new wR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new NR(c,l);try{let f;if(c&&s[c]&&s[c][l])yo.debug?.(`Using existing table ${d} from database tables`),f=s[c][l];else if(n&&n[l])yo.debug?.(`Using existing table ${d} from global tables`),f=n[l];else{yo.debug?.(`Table ${d} not found, creating new table`);let R=[];if(u.length>0){let S=u[0];Object.keys(S).map(y=>{let C={name:y,type:typeof S[y]};return y==="id"&&(C.isPrimaryKey=!0),C}).forEach(y=>{R.push(y)})}f=await et({database:c,table:l,attributes:R})}let m=u.length,p=0,h=0,E=0,g=100;for(let R=0;R<u.length;R+=g){let S=u.slice(R,R+g),y=[];for(let C of S)y.push(async()=>{try{let I=null,k=C.id;if(k!==void 0&&(I=await f.get(k)),!I)return p++,f.put(C);let J=I.getUpdatedTime();return a.mtime>J?(h++,f.put(C)):(E++,Promise.resolve({inserted:0,updated:0}))}catch(I){if(I instanceof Ns)yo.error?.(`Record processing error: ${I.message}`);else{let k=new DE(d,I);yo.error?.(`Record processing error: ${k.message}`)}return Promise.resolve({inserted:0,updated:0,error:I.message})}});await Promise.all(y.map(C=>C()))}if(p>0||h>0){let R=`Loaded ${p} new and updated ${h} records in ${d}`;return E>0&&(R+=` (${E} records skipped)`),yo.info?.(R),new Yf(t,c,l,"success",p+h,R)}else if(E>0){let R=`All ${E} records in ${d} already up-to-date`;return yo.info?.(R),new Yf(t,c,l,"skipped",m,R)}else{let R=`No records to process in ${d}`;return yo.info?.(R),new Yf(t,c,l,"success",0,R)}}catch(f){throw f instanceof Ns?f:new DE(d,f)}}var Sa,aJ,cJ,Ta,lJ,uJ,yo,SIe,Ns,bR,AR,IR,LE,wR,NR,DE,Yf,fJ=se(()=>{Sa=require("node:path"),aJ=require("yaml");we();cJ=b(Ze()),Ta=b(zr()),lJ=b(_e()),uJ=b(Q()),yo=uJ.default.forComponent("dataLoader"),SIe=!0;o(TIe,"handleApplication");o(dJ,"loadDataFile");Ns=class extends lJ.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=Ta.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},bR=class extends Ns{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,Sa.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,Ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="UnsupportedFileExtensionError"}},AR=class extends Ns{static{o(this,"FileParseError")}constructor(t,r){super(`Failed to parse data file ${(0,Sa.basename)(t)}: ${r.message}`,Ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},IR=class extends Ns{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,Sa.basename)(t)} is empty or invalid`,Ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},LE=class extends Ns{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,Sa.basename)(t)} is missing required "${r}" property`,Ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},wR=class extends Ns{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,Sa.basename)(t)} has invalid "${r}" property, expected ${n}`,Ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},NR=class extends Ns{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,Ta.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},DE=class extends Ns{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,Ta.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},Yf=class{static{o(this,"DataLoaderResult")}#e;#t;#r;#n;#s;#i;constructor(t,r,n,s,i,a){this.#e=t,this.#t=r||"unknown",this.#r=n||"unknown",this.#n=s,this.#s=i,this.#i=a}get filePath(){return this.#e}get database(){return this.#t}get table(){return this.#r}get status(){return this.#n}get count(){return this.#s}get message(){return this.#i}toJSON(){return{filePath:this.#e,database:this.#t,table:this.#r,status:this.#n,count:this.#s,message:this.#i}}}});var KD={};Re(KD,{hdbServer:()=>AIe,start:()=>AIe});async function AIe(e){try{Ro.default.debug("In Fastify server"+process.cwd()),Ro.default.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),Ro.default.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=mJ.default.isMaster,await IIe();let t=e.securePort>0;Wf=wIe(t),await Wf.ready(),e||(e={}),e.isOperationsServer=!0;try{ve.http(Wf.server,e),Wf.server.closeIdleConnections||await Wf.listen({port:0,host:"::"})}catch(r){throw Wf.close(),Ro.default.error(r),Ro.default.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),Ro.default.fatal(t),process.exit(1)}}async function IIe(){return Ro.default.trace("Configuring HarperDB process."),yJ.default.setSchemaDataToGlobal(),bJ.default.setUsersWithRolesCache()}function wIe(e){Ro.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=NIe(e),r=(0,pJ.default)(t);r.server.headersTimeout=OIe(),r.setErrorHandler(kc.serverErrorHandler);let n=CIe();n&&r.register(hJ.default,n),r.register(function(i,a,c){i.setNotFoundHandler(function(l,u){r.server.emit("unhandled",l.raw,u.raw)}),c()}),r.register(gJ.default),r.register(EJ.default),r.register(_J.default,{root:SJ.default.join(TJ.PACKAGE_ROOT,"studio/web")}),Nm(r);let s=ya.default.get(um.LOCAL_STUDIO_ON);return r.get("/",function(i,a){return!RJ.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?a.sendFile("index.html"):a.sendFile("running.html")}),r.post("/",{preValidation:[kc.reqBodyValidationHandler,kc.authHandler],config:{isOperation:!0}},async function(i,a){return i.body?.operation?.startsWith("restart")&&a.header("Connection","close"),(0,kc.handlePostRequest)(i,a)}),r.get("/health",()=>"HarperDB is running."),Ro.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}function NIe(e){let t=ya.default.get(zf.OPERATIONSAPI_NETWORK_TIMEOUT),r=ya.default.get(zf.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:RIe,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,http2:ya.default.get(zf.OPERATIONSAPI_NETWORK_HTTP2),https:e}}function CIe(){let e=ya.default.get(zf.OPERATIONSAPI_NETWORK_CORS),t=ya.default.get(zf.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===bIe)&&(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}function OIe(){return ya.default.get(zf.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??yIe}var mJ,ya,Ro,pJ,hJ,EJ,_J,gJ,SJ,TJ,yJ,RJ,bJ,kc,yIe,RIe,bIe,zf,Wf,AJ=se(()=>{mJ=b(require("cluster")),ya=b(ce());q();Ro=b(Q()),pJ=b(require("fastify")),hJ=b(require("@fastify/cors")),EJ=b(require("@fastify/compress")),_J=b(require("@fastify/static")),gJ=b(HN()),SJ=b(require("path")),TJ=b(Ot()),yJ=b(mi()),RJ=b(oe()),bJ=b(fs());Fr();kc=b(TR());Mo();ya.default.initSync();yIe=6e4,RIe=1024*1024*1024,bIe="TRUE",{CONFIG_PARAMS:zf}=Y;o(AIe,"operationsServer");o(IIe,"setUp");o(wIe,"buildServer");o(NIe,"getServerOptions");o(CIe,"getCORSOpts");o(OIe,"getHeaderTimeoutConfig")});var JD={};Re(JD,{disableNATS:()=>LIe,publishToStream:()=>PR,setNATSReplicator:()=>YD,setPublishToStream:()=>DIe,setSubscription:()=>QD,start:()=>PIe});function PIe(){ME.default.get(F.CLUSTERING_ENABLED)&&vIe()}function LIe(e=!0){OJ=e}function DIe(e,t){PR=e,QD=t}function vIe(){if(OJ||process.env._DISABLE_NATS)return;let e=ct(),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];YD(s,r,i)}}Dl((r,n)=>{YD(r.tableName,r.databaseName,r),n&&LJ(r)}),!IJ&&(IJ=!0)}function YD(e,t,r){if(t==="system"&&UIe.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 Hr{static{o(this,"NATSReplicator")}put(i){return n(this.getContext()).addWrite(t,{operation:"put",table:e,id:this.getId(),record:i})}delete(){return n(this.getContext()).addWrite(t,{operation:"delete",table:e,id:this.getId()})}publish(i){return n(this.getContext()).addWrite(t,{operation:"publish",table:e,id:this.getId(),record:i})}patch(i){return n(this.getContext()).addWrite(t,{operation:"patch",table:e,id:this.getId(),record:i})}invalidate(){n(this.getContext()).addWrite(t,{operation:"invalidate",table:e,id:this.getId()})}static defineSchema(i){LJ(i)}static subscribe(){let i=new Xn;return QD(t,e,i),i}static subscribeOnThisThread(i){return i<(ME.default.get(F.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??MIe)}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 CR(s.transaction,s);let a=s.transaction;for(;a.next;)a=a.next;a.next=s.transaction.nats,i.user=s.user,i.context=s}else i=PJ;return i}o(n,"getNATSTransaction")}function LJ(e){let t=ME.default.get(F.CLUSTERING_NODENAME);PR(`${zD.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,jD.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 wJ,zD,jD,NJ,CJ,ME,OR,OJ,PR,QD,MIe,PJ,IJ,UIe,CR,WD,DJ=se(()=>{we();Ga();wJ=b(qt()),zD=b(pt()),jD=b(Zi());Ou();NJ=b(pC()),CJ=b(Mn()),ME=b(ce());q();OR=b(Q());o(PIe,"start");o(LIe,"disableNATS");PR=wJ.publishToStream,QD=NJ.setSubscription;o(DIe,"setPublishToStream");MIe=2;o(vIe,"assignReplicationSource");UIe=["hdb_job","hdb_raw_analytics","hdb_info"];o(YD,"setNATSReplicator");o(LJ,"publishSchema");CR=class{constructor(t,r){this.transaction=t;this.options=r}static{o(this,"NATSTransaction")}user;writesByDb=new Map;addWrite(t,r){r.expiresAt=this.context?.expiresAt;let n=this.writesByDb.get(t);n||this.writesByDb.set(t,n=[]),n.push(r)}commit({timestamp:t}){let r=ME.default.get(F.CLUSTERING_NODENAME),n=[];for(let[s,i]of this.writesByDb){let a=[],c=[],l,u;for(let d of i){let f=d.table,m=d.operation=="put"?"upsert":d.operation;l||(OR.trace(`Sending transaction event ${m}`),u=l={operation:m,schema:s,table:f,__origin:{user:this.user?.username,timestamp:t,node_name:r}},l.hash_values=c,m!=="delete"&&m!=="invalidate"&&(l.records=a)),l.table===f&&l.operation===m?(a.push(d.record),c.push(d.id)):u=u.next={operation:m,table:f,id:d.id,record:d.record},d.expiresAt&&(u.expiresAt=d.expiresAt)}l&&n.push(PR(`${zD.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,jD.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw OR.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},WD=class extends CR{static{o(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,CJ.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};PJ=new WD});async function BJ({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let a=await XD.get(e,{returnNonexistent:!0});i=new tM(e,t,a),a&&(i.sessionWasPresent=!0)}else{if(e){let a=await XD.get(e);a&&a.delete()}i=new DR(e,t)}return n&&(n.id=e,n.user={username:t?.username},vE.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function ZD(){return LR++,LR>65500&&(LR=1),LR}function eM(e,t,r){let{topic:n,retain:s}=e;e.data=t,e.async=!0,r.authorize=!0;let i=vs.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 a=new ci(i.relativeURL);a.checkPermission=r.user?.role?.permission??{};let c=i.Resource;return At(r,()=>s?t===void 0?c.delete(a,r):c.put(a,e.data,r):c.publish(a,e.data,r))}var vJ,Hc,UJ,xJ,MJ,XD,vE,LR,DR,tM,FJ=se(()=>{we();$a();vJ=b(Mn()),Hc=b(Q());Ua();UJ=b(Ze()),xJ=b(eL());Fr();fg();MJ=100,XD=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"}]}}]}),vE=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,UJ.getWorkerIndex)()===0&&(async()=>{await xJ.whenComponentsLoaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of vE.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await ve.getUser(r.user.username));try{await eM(r,t,r)}catch{(0,Hc.warn)("Failed to publish will",t)}vE.delete(e.id)}})();o(BJ,"getSession");LR=1;o(ZD,"getNextMessageId");DR=class{static{o(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:a}=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(S=>S.topic===s),f;d?(f=i>0,d.end(),this.subscriptions.splice(this.subscriptions.indexOf(d),1)):f=i===2;let m={search:l,async:!0,user:this.user,startTime:a,omitCurrent:f,target:"",checkPermission:this.user?.role?.permission??{}};a&&(0,Hc.trace)("Resuming subscription from",s,"from",a);let p=vs.getMatch(u,"mqtt");if(!p){let S=new Error(`The topic ${s} does not exist, no resource has been defined to handle this topic`);throw S.statusCode=404,S}m.url=p.relativeURL;let h;if(m.url.indexOf("+")>-1||(h=m.url.indexOf("#"))>-1){let S=m.url.slice(1);if(h--,h>-1&&h!==S.length-1)throw new Error("Multi-level wildcards can only be used at the end of a topic");if(m.isCollection=!0,S.indexOf("+")===S.length-1)m.onlyChildren=!0,m.url="/"+S.slice(0,S.length-1);else{let y=S.split("/"),C;for(let J=0;J<y.length;J++)if(y[J].indexOf("+")>-1)if(y[J]==="+")C=!0;else throw new Error("Single-level wildcards can only be used as a topic level (between or after slashes)");if(n&&C)throw new Error("Filters can not be combined");let I=!0;y[y.length-1]==="#"&&(y.length--,I=!1),C&&(n=o(J=>{let G=J.id;if(!Array.isArray(G))if(G?.indexOf?.("/")>-1)G=G.split("/");else return!1;if(I&&G.length!==y.length)return!1;for(let H=0;H<y.length;H++)if(y[H]!=="+"&&y[H]!==G[H])return!1;return!0},"filter"));let k=y.indexOf("+");m.url="/"+(k>-1?y.slice(0,k):y).concat("").join("/")}}else m.isCollection=!1;let E=p.path,g=p.Resource,R=await At(m,async()=>{let S=this.createContext();S.topic=s,S.retainHandling=i,S.isCollection=m.isCollection;let y=await g.subscribe(m,S);if(!y)return;if(!y[Symbol.asyncIterator])throw new Error(`Subscription is not (async) iterable for topic ${s}`);let C=(async()=>{for await(let I of y)try{let k;if(I.type&&I.type!=="put"&&I.type!=="delete"&&I.type!=="message"&&I.type!=="patch"||n&&!n(I))continue;r?(I.topic=s,k=this.needsAcknowledge(I)):(I.acknowledge?.(),k=ZD());let J=I.id;if(Array.isArray(J)&&(J=ju(J)),J==null&&(J=""),await this.listener(E+"/"+J,I.value,k,t)===!1)break;this.awaitingAcks?.size>MJ?await new Promise(H=>setTimeout(H,this.awaitingAcks.size-MJ)):await new Promise(setImmediate)}catch(k){(0,Hc.warn)(k)}})();return y});if(R)return R.topic=s,R.qos=t.qos,this.subscriptions.push(R),R}resume(){}needsAcknowledge(t){let r=ZD();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 eM(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();At(r,async()=>{try{if(!t){let n=await vE.get(this.sessionId);n?.doesExist()&&await eM(n,n.data,r)}}finally{await vE.delete(this.sessionId)}}).catch(n=>{(0,Hc.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))}};o(eM,"publish");tM=class extends DR{static{o(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=ZD(),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,Hc.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,vJ.getNextMonotonicTime)()),(0,Hc.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),XD.put(this.sessionRecord)}}});var rM={};Re(rM,{bypassAuth:()=>xIe,start:()=>FIe});function xIe(){KJ=!0}function FIe({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new VJ.EventEmitter},e.mqtt.events.on("error",()=>{}));let a=e.mqtt,c=[],l=r?.mtls;return n&&(c=e.ws((u,d,f,m)=>{if(d.headers.get("sec-websocket-protocol")!=="mqtt")return m(u,d,f);a.events.emit("connection",u),tr.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:p,onClose:h}=HJ(u,E=>{u.send(E)},d,Promise.resolve(f).then(()=>d?.user),a);u.on("message",p),u.on("close",h),u.on("error",E=>{tr.info?.("WebSocket error",E)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(a.events.emit("connection",u),tr.debug?.(`Received ${u.getCertificate?"SSL":"TCP"} connection for MQTT from ${u.remoteAddress}`),l){if(u.authorized)try{let p=u.getPeerCertificate(!0);if(p?.subject){let E=await Zd(p,l);if(!E.valid)throw tr.error?.("Certificate verification failed:",E.status,"for",p.subject.CN),new Error("Certificate revoked or verification failed")}let h=l.user;if(h!==null){(h===void 0||h==="Common Name"||h==="CN")&&(h=u.getPeerCertificate().subject.CN);try{d=await e.getUser(h,null,null),(0,jf.get)(F.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&vR.notify?.({username:d?.username,status:ii.SUCCESS,type:Da.AUTHENTICATION,authStrategy:"MQTT mTLS",remoteAddress:u.remoteAddress})}catch(E){throw(0,jf.get)(F.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&vR.error?.({username:h,status:ii.FAILURE,type:Da.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:u.remoteAddress}),E}}else tr.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(p){a.events.emit("error",p,u),tr.error?.(p)}else if(l.required)return tr.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&BIe(u.remoteAddress)&&(d=await(0,qJ.getSuperUser)(),tr.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:f,onClose:m}=HJ(u,p=>u.write(p),null,d,a);u.on("data",f),u.on("close",m),u.on("error",p=>{tr.info?.("Socket error",p)})},{port:t,securePort:s,mtls:l})),c}function HJ(e,t,r,n,s){kJ||(kJ=!0,$m(f=>{MR>0&&f.push({metric:"mqtt-connections",connections:MR,byThread:!0})}));let i;MR++;let a,c={protocolVersion:4},l=(0,UR.parser)({protocolVersion:5});function u(f){l.parse(f)}o(u,"onMessage");function d(){MR--,i||(i=!0,a?.disconnect?.(),s.events.emit("disconnected",a,e),s.sessions.delete(a),Zr(!1,"connection","mqtt","disconnect"),tr.debug?.("MQTT connection was closed",e.remoteAddress))}return o(d,"onClose"),l.on("packet",async f=>{try{n?.then&&(n=await n)}catch(y){e.close?.(1008,"Unauthorized"),tr.info?.(y);return}let m=f.cmd;if(a)a.then&&await a;else if(m!=="connect"){tr.info?.("Received packet before connection was established, closing connection"),e?.destroy?e.destroy():e?.terminate();return}let p=f.topic,h=p?.indexOf("/",1),E=h>0?p.slice(0,h):p;Ve(f.length,"bytes-received",E,R(f),"mqtt");try{switch(a?.receivedPacket?.(),m){case"connect":if(c.protocolVersion=f.protocolVersion,f.username)try{n=await ve.getUser(f.username,f.password.toString(),r),(0,jf.get)(F.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&vR.notify?.({username:n?.username,status:ii.SUCCESS,type:Da.AUTHENTICATION,authStrategy:"MQTT",remoteAddress:e.remoteAddress})}catch(X){return(0,jf.get)(F.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&vR.error?.({username:f.username,status:ii.FAILURE,type:Da.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:e.remoteAddress}),s.events.emit("auth-failed",f,e,X),Zr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:4,returnCode:134})}if(!n&&s.requireAuthentication)return s.events.emit("auth-failed",f,e),Zr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:4,returnCode:134});try{if(s.authorizeClient?.(f,n),f.will){let X=e.deserialize||(e.deserialize=Do(r?.headers.get?.("content-type")));f.will.data=f.will.payload?.length>0?X(f.will.payload):void 0,delete f.will.payload}a=BJ({user:n,...f}),a=await a,a.socket=e,r&&(a.request=r),s.sessions.add(a)}catch(X){return tr.error?.(X),s.events.emit("auth-failed",f,e,X),Zr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:X.code||5,returnCode:X.code||128})}s.events.emit("connected",a,e),Zr(!0,"connection","mqtt","connect"),g({cmd:"connack",sessionPresent:a.sessionWasPresent,reasonCode:0,returnCode:0});let y=o(async(X,z,de,le)=>{try{if(i)throw new Error("Session disconnected while trying to send message to",X);let te=X.indexOf("/",1),ye=te>0?X.slice(0,te):X;g({cmd:"publish",topic:X,payload:await S(z),messageId:de||Math.floor(Math.random()*1e8),qos:le.qos},ye);let Ae=e._socket??e;return Ae.writableNeedDrain?new Promise(Ye=>Ae.once("drain",Ye)):!Ae.closed}catch(te){return tr.error?.(te),a?.disconnect(),s.sessions.delete(a),!1}},"listener");a.setListener(y),a.sessionWasPresent&&await a.resume();break;case"subscribe":let C=[];for(let X of f.subscriptions){let z;try{let de=await a.addSubscription(X,X.qos>=1);z=de?de.qos||0:c.protocolVersion<5?128:143}catch(de){s.events.emit("error",de,e,X,a),de.statusCode?de.statusCode===500?tr.warn?.(de):tr.info?.(de):tr.error?.(de),z=c.protocolVersion<5?128:de.statusCode===403?135:de.statusCode===404?143:128}C.push(z)}await a.committed,g({cmd:"suback",granted:C,messageId:f.messageId});break;case"unsubscribe":{let X=[];for(let z of f.unsubscriptions)X.push(a.removeSubscription(z)?0:17);g({cmd:"unsuback",granted:X,messageId:f.messageId});break}case"pubrel":g({cmd:"pubcomp",messageId:f.messageId,reasonCode:0});return;case"publish":let I=f.qos===2?"pubrec":"puback",k=e.deserialize||(e.deserialize=Do(r?.headers.get?.("content-type"))),G=(f.payload?.length||0)>0?k(f.payload):void 0,H;try{H=await a.publish(f,G)}catch(X){s.events.emit("error",X,e,f,a),tr.warn?.(X),f.qos>0&&g({cmd:I,messageId:f.messageId,reasonCode:128},f.topic);break}f.qos>0&&g({cmd:I,messageId:f.messageId,reasonCode:H===!1?144:0},f.topic);break;case"pubrec":g({cmd:"pubrel",messageId:f.messageId,reasonCode:0});break;case"pubcomp":case"puback":a.acknowledge(f.messageId);break;case"pingreq":g({cmd:"pingresp"});break;case"disconnect":i=!0,a?.disconnect(!0),s.events.emit("disconnected",a,e),s.sessions.delete(a),Zr(!0,"connection","mqtt","disconnect"),tr.debug?.("Received disconnect command, closing MQTT session",e.remoteAddress),e.close?e.close():e.end();break}}catch(y){s.events.emit("error",y,e,f,a),tr.error?.(y),g({cmd:"disconnect"})}function g(y,C){let I=(0,UR.generate)(y,c);t(I),Ve(I.length,"bytes-sent",C,R(y),"mqtt")}o(g,"sendPacket");function R(y){return y.qos>0?y.cmd+",qos="+y.qos:y.cmd}o(R,"packetMethodName");function S(y){return Lo(y,r)}o(S,"serialize")}),l.on("error",f=>{tr.warn("MQTT parsing error, closing connection:",f.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var UR,qJ,jf,GJ,$J,VJ,vR,tr,KJ,BIe,kJ,MR,YJ=se(()=>{UR=require("mqtt-packet");FJ();qJ=b(fs());Mo();ts();Fr();jf=b(ce());q();GJ=b(Zn()),$J=b(Q()),VJ=require("events");bT();vR=(0,GJ.loggerWithTag)("auth-event"),tr=(0,$J.forComponent)("mqtt"),KJ=(0,jf.get)(F.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;o(xIe,"bypassAuth");BIe=o(e=>KJ&&(e.includes("127.0.0.")||e==="::1"),"authorizeLocal");o(FIe,"start");MR=0;o(HJ,"onSocket")});function xR(e,t){if(t?.includes(".."))throw new nM(t);let r=t||"/";return(r==="."||r.startsWith("./"))&&(r=`/${e}${r.slice(1)}`),r.startsWith("/")||(r=`/${r}`),r.endsWith("/")||(r=`${r}/`),r}var nM,sM=se(()=>{nM=class extends Error{static{o(this,"InvalidBaseURLPathError")}constructor(t){super(`urlPath must not contain '..'. Received: '${t}'`)}};o(xR,"resolveBaseURLPath")});function WJ(e){if(e.length===0)return".";if(e.length===1)return e[0];let t=e.map(s=>s.split("/")),r=Math.min(...t.map(s=>s.length)),n=[];for(let s=0;s<r;s++){let i=t[0][s];if(t.every(a=>a[s]===i))n.push(i);else break}return n.length===0?".":n.join("/")}var zJ=se(()=>{o(WJ,"deriveCommonPatternBase")});function BR(e){let t={source:[],onlyFiles:!1,onlyDirectories:!1,ignore:[]},r=o((n,s)=>{typeof s=="string"?n.push(s):Array.isArray(s)&&n.push(...s)},"addToArray");return typeof e=="string"||Array.isArray(e)?r(t.source,e):(r(t.source,e.source),r(t.ignore,e.ignore),t.onlyFiles=e.only==="files",t.onlyDirectories=e.only==="directories"),t}var iM=se(()=>{o(BR,"deriveGlobOptions")});var jJ,oM,UE,QJ=se(()=>{sM();zJ();iM();jJ=require("micromatch"),oM=class extends Error{static{o(this,"ComponentInvalidPatternError")}constructor(t){super(`Config 'files' option glob pattern must not contain '..' or start with '/'. Received: '${t}'`),this.name="ComponentInvalidPatternError"}},UE=class{static{o(this,"Component")}globOptions;baseURLPath;patternBases;directory;name;config;commonPatternBase;constructor(t,r,n){this.name=t,this.directory=r,this.config=n,this.baseURLPath=xR(this.name,this.config.urlPath),this.globOptions=BR(this.config.files),this.globOptions.source=this.globOptions.source.map(s=>{if(s.includes("..")||s.startsWith("/"))throw new oM(s);return s==="."||s==="./"?"**/*":s}),this.patternBases=this.globOptions.source.map(s=>(0,jJ.scan)(s).base),this.commonPatternBase=WJ(this.patternBases)}}});function JJ(e,t){return new RegExp(`^${e}(/|$)`).test(t)}function Eu(e,t,r){t.startsWith("./")&&(t=t.slice(2));for(let n of e.patternBases)if(n.startsWith("./")&&(n=n.slice(2)),n!==""){if(r==="file"){if(t===n){let s=t.split("/");t=s[s.length-1];break}else if(JJ(n,t)){t=t.slice(n.length+1);break}}if(r==="directory"){if(t===n){t="";break}else if(JJ(n,t)){t=t.slice(n.length+1);break}}}return(0,XJ.join)(e.baseURLPath,t)}var XJ,aM=se(()=>{XJ=require("node:path");o(JJ,"pathStartsWithBase");o(Eu,"deriveURLPath")});function ZJ(e){return typeof e=="string"||Array.isArray(e)||!("files"in e)?{files:e}:e}var kR,e3,t3,cM,r3,n3,FR,s3=se(()=>{kR=require("node:events");QJ();e3=b(Q()),t3=b(require("chokidar")),cM=require("node:path"),r3=require("node:fs/promises");aM();n3=require("micromatch"),FR=class extends kR.EventEmitter{static{o(this,"EntryHandler")}#e;#t;#r;ready;constructor(t,r,n,s){super(),this.#e=new UE(t,r,ZJ(n)),this.#r=s||e3.default.loggerWithTag(t),this.ready=(0,kR.once)(this,"ready"),this.#a()}get name(){return this.#e.name}get directory(){return this.#e.directory}#n(...[t,r,n]){if(r===""&&(r="/"),!(0,n3.isMatch)(r,this.#e.globOptions.source,{ignore:this.#e.globOptions.ignore}))return;let s=(0,cM.join)(this.directory,r);switch(t){case"add":case"change":{let i=Eu(this.#e,r,"file");(0,r3.readFile)(s).then(a=>{let c={eventType:t,entryType:"file",contents:a,stats:n,absolutePath:s,urlPath:i};this.emit("all",c),this.emit(t,c)});break}case"unlink":{let i=Eu(this.#e,r,"file"),a={eventType:t,entryType:"file",stats:n,absolutePath:s,urlPath:i};this.emit("all",a),this.emit(t,a);break}case"addDir":case"unlinkDir":{let i=Eu(this.#e,r,"directory"),a={eventType:t,entryType:"directory",stats:n,absolutePath:s,urlPath:i};this.emit("all",a),this.emit(t,a);break}}}#s(t){this.emit("error",t)}#i(){this.emit("ready")}async#a(){await this.#t?.close(),this.#t=void 0;let t=this.#e.patternBases.map(r=>(0,cM.join)(this.#e.directory,r));return this.#t=t3.default.watch(this.#e.commonPatternBase,{cwd:this.#e.directory,persistent:!1,ignored:o(r=>r!==this.#e.directory&&t.every(n=>!r.startsWith(n)),"ignored")}).on("all",this.#n.bind(this)).on("error",this.#s.bind(this)).on("ready",this.#i.bind(this)),this.ready}close(){return this.#t?.close(),this.#t=void 0,this.emit("close"),this.removeAllListeners(),this}update(t){return this.#e=new UE(this.name,this.directory,ZJ(t)),this.#a()}};o(ZJ,"castConfig")});var HR,lM=se(()=>{HR={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js"},static:{files:"web/**"}}});var GR,i3,o3,a3,c3,l3,uM,dM,fM,mM,pM,qR,u3=se(()=>{GR=require("events"),i3=b(require("yaml")),o3=b(require("chokidar")),a3=require("node:fs/promises"),c3=require("util"),l3=b(Q());lM();uM=class extends Error{static{o(this,"OptionsWatcherConfigFileError")}constructor(t,r){super(`Error watching config file ${t}: ${typeof r=="object"&&r!==null&&"message"in r?r.message:r}`),this.name="OptionsWatcherConfigFileError"}},dM=class extends Error{static{o(this,"InvariantUninitializedOptionsWatcherError")}constructor(){super("Invariant: OptionsWatcher has not been initialized yet. This should never happen."),this.name="InvariantUninitializedOptionsWatcherError"}},fM=class extends Error{static{o(this,"InvalidValueTypeError")}constructor(t,r){super(`Invalid value type for key ${t.join(".")}. Expected object, string, array, number, boolean, or undefined. Received ${typeof r}.`),this.name="InvalidValueTypeError"}},mM=class extends Error{static{o(this,"KeyDoesNotExistError")}constructor(t,r){super(`Cannot set property ${t.join(".")} as ${r} does not exist.`),this.name="KeyDoesNotExistError"}},pM=class extends Error{static{o(this,"CannotSetPropertyError")}constructor(t){super(`Cannot set property ${t.join(".")} as parent is not an object.`),this.name="CannotSetPropertyError"}},qR=class extends GR.EventEmitter{static{o(this,"OptionsWatcher")}#e;#t;#r;#n;#s;#i;ready;constructor(t,r,n){super(),this.#s=t,this.#e=r,this.#i=n||l3.default.loggerWithTag(t),this.ready=(0,GR.once)(this,"ready"),this.#t=o3.default.watch(r,{persistent:!1}).on("add",this.#a.bind(this)).on("change",this.#a.bind(this)).on("error",this.#d.bind(this)).on("unlink",this.#c.bind(this)).on("ready",this.#a.bind(this))}#a(){(0,a3.readFile)(this.#e,"utf-8").then(t=>{this.#n=i3.default.parse(t),this.#n&&this.#s in this.#n?this.#r?this.#f(this.#n[this.#s],this.#r):(this.#r=this.#n[this.#s],this.emit("ready",this.#r)):this.#r&&(this.#r=void 0,this.emit("remove"))}).catch(t=>{if(t instanceof Error&&"code"in t&&t.code==="ENOENT"){this.#n?(this.#o(),this.emit("remove")):(this.#o(),this.emit("ready"));return}this.emit("error",t)})}#d(t){this.emit("error",new uM(this.#e,t))}#c(t){this.#i.warn(`Configuration file ${t} was deleted. Reverting to default configuration. Recreate it to restore the options watcher.`),this.#o(),this.emit("remove")}#o(){this.#n=HR,this.#r=this.#n[this.#s]}#f(t,r,n=[]){if(!this.#l(r)||!this.#l(t)){this.#u(n,t);return}for(let s of Object.keys(r))s in t||this.#u(n.concat(s),void 0);for(let[s,i]of Object.entries(t)){let a=n.concat(s),c=this.#m(a);if(typeof i!=typeof c||Array.isArray(i)&&!Array.isArray(c)||!Array.isArray(i)&&Array.isArray(c)){this.#u(a,i);continue}if(!Array.isArray(i)&&typeof i=="object"&&i!==null){this.#l(c)?this.#f(i,c,a):this.#u(a,i);continue}(0,c3.isDeepStrictEqual)(i,c)||this.#u(a,i)}}#l(t){return typeof t=="object"&&t!==null&&t!==void 0&&!Array.isArray(t)}#m(t){let r=this.#r;for(let n of t){if(r==null||typeof r!="object"||!(n in r))return;r=r[n]}return structuredClone(r)}#u(t,r){if(!this.#r)throw new dM;if(!["object","string","array","number","boolean","undefined"].includes(typeof r))throw new fM(t,r);let n=this.#r;for(let s of t.slice(0,-1)){if(n==null||typeof n!="object"||!(s in n))throw new mM(t,s);n=n[s]}if(n==null||typeof n!="object")throw new pM(t);n[t[t.length-1]]=r,this.emit("change",t,r,this.#r)}close(){return this.#t.close(),this.emit("close"),this.removeAllListeners(),this}get(t){return this.#r?this.#m(t):void 0}getAll(){return structuredClone(this.#r)}getRoot(){return this.#n}}});var KR,d3,$R,VR,f3=se(()=>{KR=require("node:events");s3();u3();d3=b(Q());xL();$R=class extends Error{static{o(this,"MissingDefaultFilesOptionError")}constructor(){super("No default files option exists. Ensure `files` is specified in config.yaml"),this.name="MissingDefaultFilesOptionError"}},VR=class extends KR.EventEmitter{static{o(this,"Scope")}#e;#t;#r;#n;#s;#i;options;resources;server;ready;constructor(t,r,n,s,i){super(),this.#r=t,this.#t=r,this.#e=n,this.#i=(0,d3.loggerWithTag)(this.#r),this.resources=s,this.server=i,this.#s=[],this.ready=(0,KR.once)(this,"ready"),this.options=new qR(t,n,this.#i).on("error",this.#d.bind(this)).on("change",this.#f.bind(this)()).on("ready",this.#a.bind(this))}get logger(){return this.#i}get name(){return this.#r}get directory(){return this.#t}#a(){this.emit("ready")}#d(t){this.emit("error",t)}close(){for(let t of this.#s)t.close();return this.options.close(),this.emit("close"),this.removeAllListeners(),this}#c(t){let r=new FR(this.#r,this.#t,t,this.#i).on("error",this.#d.bind(this)).on("add",this.#o("add")).on("change",this.#o("change")).on("unlink",this.#o("unlink")).on("addDir",this.#o("addDir")).on("unlinkDir",this.#o("unlinkDir"));return this.#s.push(r),r}#o(t){let r=this;return function(){this.listenerCount("all")>0||this.listenerCount(t)>1||r.requestRestart()}}#f(){let t=this;return o(function(...[n,s,i]){if(n[0]==="files"||n[0]==="urlPath"){if(!t.#n){t.#n=t.#c(i);return}t.#n.update(i);return}this.listenerCount("change")>1||(t.#i.debug(`Options changed: ${n.join(".")}, requesting restart`),t.requestRestart())},"handleOptionsWatcherChange")}#l(){let t=this.options.getAll();if(t&&typeof t=="object"&&t!==null&&!Array.isArray(t)&&"files"in t)return t.files}handleEntry(t,r){if(t===void 0){if(this.#n)return this.#n;let s=this.#l();if(s)return this.#n=this.#c(s),this.#n;this.emit("error",new $R);return}if(typeof t=="function"){if(this.#n)return this.#n.on("all",t);let s=this.#l();if(s)return this.#n=this.#c(s),this.#n.on("all",t);this.emit("error",new $R);return}let n=this.#c(t);return r?n.on("all",r):n}requestRestart(){this.#i.debug(`Restart requested from ${this.name} scope for ${this.directory}`),L4()}}});function _u(e){return typeof e=="string"&&e.trim()!==""}function hM(e){return Array.isArray(e)&&e.length!==0&&e.every(t=>_u(t))}function E3(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function kIe(e){e.config.root&&xE.default.warn("Resource extension 'root' option is deprecated. Due to backwards compatibility reasons it does not act as assumed. The glob pattern will always be evaluated from the component directory root. The option is only used for the initial root directory handling. Please remove and modify the 'files' glob pattern instead.");let t=[];if(e.config.root&&typeof e.config.files!="string")throw new RM(e);let r=e.config.root;r&&(r.startsWith("/")&&(r=r.slice(1)),r.endsWith("/")||(r+="/"));let n=e.config.files;if(typeof n=="string"&&!n.includes("**/*")&&(n.indexOf("/*")>-1?r=n.slice(0,n.indexOf("/*")+1):n.indexOf("/")>-1&&(r=n.slice(0,n.lastIndexOf("/")+1))),r&&t.push(r),t.length===0){if(E3(e.config.files)&&e.config.files.only==="files")return!1;t=e.patternBases}let s=!1;for(let i of t){let a=(0,BE.join)(e.directory,i);YR.isMainThread&&e.module.setupDirectory&&(s=await e.module.setupDirectory(e.baseURLPath,a,e.resources)),e.resources.isWorker&&e.module.handleDirectory&&(s=await e.module.handleDirectory(e.baseURLPath,a,e.resources))}return s}async function _3(e){let t=!1;if(t=await kIe(e),t)return t;let r=await(0,m3.default)(e.globOptions.source,{cwd:e.directory,objectMode:!0,onlyFiles:e.globOptions.onlyFiles,onlyDirectories:e.globOptions.onlyDirectories,ignore:e.globOptions.ignore});for(let n of r){let s=(0,BE.join)(e.directory,n.path);if(n.dirent.isDirectory()){let i=Eu(e,n.path,"directory");YR.isMainThread&&e.module.setupDirectory&&(await e.module.setupDirectory(i,s,e.resources),t=!0),e.resources.isWorker&&e.module.handleDirectory&&(await e.module.handleDirectory(i,s,e.resources),t=!0)}else if(n.dirent.isFile()){let i=Eu(e,n.path,"file"),a=await(0,p3.readFile)(s);YR.isMainThread&&e.module.setupFile?(await e.module.setupFile(a,i,s,e.resources),t=!0):e.resources.isWorker&&e.module.handleFile&&(await e.module.handleFile(a,i,s,e.resources),t=!0)}else xE.default.error(`Entry received from glob pattern match for component ${e.name} is neither a file nor a directory:`,n)}return t}var YR,m3,xE,BE,p3,h3,WR,vi,EM,_M,gM,SM,TM,yM,RM,bM,AM,g3=se(()=>{YR=require("node:worker_threads"),m3=b(require("fast-glob")),xE=b(Q());sM();iM();BE=require("node:path"),p3=require("node:fs/promises");aM();h3=require("micromatch"),WR=class{static{o(this,"ComponentV1")}config;name;directory;module;resources;globOptions;patternBases;baseURLPath;constructor(t){if(this.config=t.config,this.name=t.name,this.directory=t.directory,this.module=t.module,this.resources=t.resources,!_u(this.config.files)&&!hM(this.config.files)&&!E3(this.config.files))throw new EM(this);if(typeof this.config.files=="object"&&!Array.isArray(this.config.files)){if(this.config.files.source===void 0||!hM(this.config.files.source)&&!_u(this.config.files.source))throw new _M(this);if(this.config.files.only!==void 0&&(typeof this.config.files.only!="string"||!["all","files","directories"].includes(this.config.files.only)))throw new gM(this);if(this.config.files.ignore!==void 0&&!hM(this.config.files.ignore)&&!_u(this.config.files.ignore))throw new SM(this)}if(this.config.root!==void 0&&!_u(this.config.root))throw new yM(this);if(this.config.path!==void 0&&!_u(this.config.path))throw new bM(this);if(this.config.path&&(xE.default.warn("Resource extension 'path' option is deprecated. Please replace with 'urlPath'."),this.config.urlPath=this.config.path),this.config.urlPath!==void 0&&(!_u(this.config.urlPath)||typeof this.config.urlPath=="string"&&this.config.urlPath.includes("..")))throw new AM(this);this.globOptions=BR(this.config.files),this.globOptions.source=this.globOptions.source.map(r=>{if(r.includes(".."))throw new TM(this,r);return r.startsWith("/")&&(xE.default.warn("Leading '/' in 'files' glob pattern is deprecated. For backwards compatibility purposes, it is currently transformed to the relative path of the component, but in the future will result in an error. Paths are automatically derived from the root of the component directory. Please remove (e.g. '/web/*' -> 'web/*')."),r=r==="/"?".":r.slice(1)),r}),this.patternBases=this.globOptions.source.map(r=>(0,h3.scan)(r).base),this.baseURLPath=xR(this.name,this.config.urlPath)}},vi=class extends Error{static{o(this,"ComponentV1ProcessingError")}constructor(t,r){super(`Component ${r.name} (from ${(0,BE.basename)(r.directory)}) ${t}`)}},EM=class extends vi{static{o(this,"InvalidFilesOptionError")}constructor(t){super("'files' option must be a non-empty string, an array of non-empty strings, or an object.",t)}},_M=class extends vi{static{o(this,"InvalidFilesSourceOptionError")}constructor(t){super("'files' object must have a non-empty 'source' property.",t)}},gM=class extends vi{static{o(this,"InvalidFilesOnlyOptionError")}constructor(t){super("'files.only' option must be one of 'all', 'files', or 'directories'.",t)}},SM=class extends vi{static{o(this,"InvalidFileIgnoreOptionError")}constructor(t){super("'files.ignore' option must be a non-empty string or an array of non-empty strings.",t)}},TM=class extends vi{static{o(this,"InvalidGlobPattern")}constructor(t,r){super(`'files' glob pattern must not contain '..'. Received: '${r}'`,t)}},yM=class extends vi{static{o(this,"InvalidRootOptionError")}constructor(t){super("deprecated 'root' option must be a non-empty string. Consider removing and updating 'files' glob pattern instead.",t)}},RM=class extends vi{static{o(this,"InvalidRootOptionUseError")}constructor(t){super("the 'root' option is deprecated and only supported if 'files' is a singular, non-empty string. Please remove the 'root' option and modify the 'files' glob pattern instead.",t)}},bM=class extends vi{static{o(this,"InvalidPathOptionError")}constructor(t){super("deprecated 'path' option must be a non-empty string. Consider replacing with 'urlPath'.",t)}},AM=class extends vi{static{o(this,"InvalidURLPathOptionError")}constructor(t){super("'urlPath' option must be a non-empty string that must not contain '..'.",t)}};o(_u,"isNonEmptyString");o(hM,"isArrayOfNonEmptyStrings");o(E3,"isObject");o(kIe,"handleRoots");o(_3,"processResourceExtensionComponent")});var Uy={};Re(Uy,{getComponentName:()=>Dy,loadComponent:()=>JR,loadComponentDirectories:()=>R3,setErrorReporter:()=>qIe});function R3(e,t){t&&(wM=t),e&&(PM=e);let r=[];if((0,Kt.existsSync)(IM)){let s=(0,Kt.readdirSync)(IM,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let a=i.name,c=(0,Kr.join)(IM,a);r.push(JR(c,wM,Ib,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(JR(n,wM,n,!1,void 0,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{y3=!0})}function qIe(e){jR=e}function GIe(e){return new Promise((t,r)=>{let n=setTimeout(()=>{Ea.primaryStore.unlock(e,0),r(new Error("symlinking harperdb module timed out"))},1e4);if(Ea.primaryStore.attemptLock(e,0,()=>{clearTimeout(n),t()}))try{let s=(0,Kr.join)(e,"node_modules");(0,Kt.existsSync)(s)||(0,Kt.mkdirSync)(s);let i=(0,Kr.join)(s,"harperdb");if((0,Kt.existsSync)(i)){if((0,Kt.realpathSync)(i)===(0,Kt.realpathSync)(OM.PACKAGE_ROOT))return t();(0,Kt.rmSync)(i,{recursive:!0,force:!0})}(0,Kt.symlinkSync)(OM.PACKAGE_ROOT,i,"dir"),t()}finally{Ea.primaryStore.unlock(e,0)}})}function b3(e,t){return e.ready.then(()=>{let r=e.options.get(["timeout"])||t.defaultTimeout||3e4;if(typeof r!="number")throw new Error(`Invalid timeout value for ${e.name}. Expected a number, received: ${typeof r}`);let n,s;return Ea.primaryStore.attemptLock(e.name,0,()=>{clearTimeout(s),n(b3(e,t))})?Promise.race([t.handleApplication(e),new Promise((i,a)=>setTimeout(()=>a(new Error(`handleApplication timed out after ${r}ms for ${e.name}`)),r))]).finally(()=>{Ea.primaryStore.unlock(e.name,0)}):new Promise((i,a)=>{n=i,s=setTimeout(()=>{a(new Error(`Timeout waiting for lock on ${e.name}`))},r+5e3)})})}async function JR(e,t,r,n,s,i){let a=(0,Kt.realpathSync)(e);if(zR.has(a))return zR.get(a);zR.set(a,!0),s&&(PM=s);try{let c,l=(0,Kr.join)(e,"harperdb-config.yaml");if((0,Kt.existsSync)(l)?c=n?(0,XR.getConfigObj)():(0,CM.parseDocument)((0,Kt.readFileSync)(l,"utf8")).toJSON():!n&&(0,Kt.existsSync)(l=(0,Kr.join)(e,"config.yaml"))?c=(0,CM.parseDocument)((0,Kt.readFileSync)(l,"utf8")).toJSON():c=HR,!n)try{await GIe(e)}catch(m){Ra.default.error("Error symlinking harperdb module",m),m.code=="EPERM"&&process.platform==="win32"&&Ra.default.error('You may need to enable developer mode in "Settings" / "System" (or "Update & Security") / "For developers", in order to enable symlinks so components can use `import from "harperdb"`')}let u=QR,d={};for(let m in c){let p=n?m:`${(0,Kr.basename)(e)}.${m}`;QR=m;let h=c[m];if(!h)continue;no.loading(p);let E,g=h.package;try{if(g){let I=null;if(n)I=(0,Kr.join)(e,"components",m);else{let k=e;for(I=(0,Kr.join)(k,"node_modules",m);!(0,Kt.existsSync)(I);){if(k=(0,Kr.dirname)(k),k.length<(0,T3.getHdbBasePath)().length){I=null;break}I=(0,Kr.join)(k,"node_modules",m)}}if(I)E=await JR(I,t,r,!1),d[m]=!0;else throw new Error(`Unable to find package ${m}:${g}`)}else E=HIe[m];if(!E){no.loaded(p,`Application component '${p}' processed`);continue}let R=o(I=>(I.origin=r,et(I)),"ensureTable"),S=h.network||(h.port||h.securePort)&&h,y=S?.securePort||S?.https&&S.port,C=!S?.https&&S?.port;if("handleApplication"in E&&("start"in E||"startOnMainThread"in E||"handleFile"in E||"handleDirectory"in E||"setupFile"in E||"setupDirectory"in E)){let I=new Error(`Plugin ${m} is exporting old extension APIs. Remove them.`);throw no.failed(p,I,`Component '${p}' failed to load`),I}if(t.isWorker&&E.handleApplication){E.suppressHandleApplicationWarning!==!0&&Ra.default.warn(`Plugin ${m} is using the experimental handleApplication API`);let I=new VR(m,e,l,t,ve);await b3(I,E),no.loaded(p,`Component '${p}' loaded successfully`);continue}if(NM.isMainThread&&(E=await E.startOnMainThread?.({server:ve,ensureTable:R,port:C,securePort:y,resources:t,...h})||E,n&&S))for(let I of[C,y])try{if(+I&&!S3.includes(I)){let k=LM.get(F.HTTP_SESSIONAFFINITY);k&&Ra.default.warn("Session affinity is not recommended and may cause memory leaks"),(k||!IS)&&(S3.push(I),sL(I,k))}}catch(k){console.error("Error listening on socket",I,k,m)}if(t.isWorker&&(E=await E.start?.({server:ve,ensureTable:R,port:C,securePort:y,resources:t,...h})||E),PM.set(E,!0),(E.handleFile||E.handleDirectory||E.setupFile||E.setupDirectory)&&h.files!=null){let I=new WR({config:h,name:m,directory:e,module:E,resources:t});d[m]=await _3(I)}no.loaded(p,`Component '${p}' loaded successfully`)}catch(R){R.message=`Could not load component '${m}' for application '${(0,Kr.basename)(e)}' due to: ${R.message}`,jR?.(R),((0,FE.getWorkerIndex)()===0?console:Ra.default).error(R),t.set(h.path||"/",new ll(R),null,!0),no.failed(p,R,`Could not load component '${p}'`)}}if(QR=u,NM.isMainThread&&!y3&&i&&(0,FE.watchDir)(e,async()=>R3()),c.extensionModule||c.pluginModule){let m=await RS((0,Kr.join)(e,c.extensionModule||c.pluginModule));return zR.set(a,m),m}let f=Object.values(d);if(f.length>0&&f.every(m=>!m)&&t.isWorker){let m=`${e} did not load any modules, resources, or files, is this a valid component?`;jR?.(new Error(m)),((0,FE.getWorkerIndex)()===0?console:Ra.default).error(m),no.failed((0,Kr.basename)(e),m)}for(let[m,p]of Object.entries(d))p||Ra.default.warn(`Component ${m} from (${(0,Kr.basename)(e)}) did not load any functionality.`)}catch(c){console.error(`Could not load application directory ${e}`,c),c.message=`Could not load application due to ${c.message}`,jR?.(c),t.set("",new ll(c))}}var Kt,Kr,NM,CM,LM,OM,Ra,FE,T3,XR,IM,PM,y3,wM,HIe,S3,zR,jR,QR,Dy,Qh=se(()=>{Kt=require("node:fs"),Kr=require("node:path"),NM=require("node:worker_threads"),CM=require("yaml"),LM=b(ce()),OM=b(Ot());q();iG();hG();OG();UG();xG();JG();nJ();sJ();oJ();Ra=b(Q());fJ();FE=b(Ze());ON();Fr();we();oL();T3=b(ce());AJ();Ky();DJ();hs();YJ();XR=b(Tt());Vp();KA();f3();g3();XP();dE();Ip();lM();IM=(0,XR.resolvePath)(LM.get(F.COMPONENTSROOT)),PM=new Map;o(R3,"loadComponentDirectories");HIe={REST:NS,rest:NS,graphql:yN,graphqlSchema:SN,roles:CN,jsResource:PN,fastifyRoutes:HD,login:DN,static:GD,operationsApi:KD,customFunctions:{},http:Ly,clustering:JD,replication:Qo,authentication:rE,mqtt:rM,loadEnv:$D,logging:Ra.default,dataLoader:VD},S3=[],zR=new Map;o(qIe,"setErrorReporter");Dy=o(()=>QR,"getComponentName");o(GIe,"symlinkHarperModule");o(b3,"sequentiallyHandleApplication");o(JR,"loadComponent")});var xy=v((L$e,A3)=>{var{isMainThread:DM}=require("worker_threads"),{getTables:$Ie}=(we(),M(mt)),{loadComponentDirectories:VIe,loadComponent:KIe}=(Qh(),M(Uy)),{resetResources:YIe}=($a(),M(YA)),WIe=Tt(),{dirname:zIe}=require("path"),{getConnection:jIe}=qt(),QIe=ce(),{CONFIG_PARAMS:JIe}=(q(),M(Y)),{loadCertificates:XIe}=_s(),{installApplications:ZIe}=(jy(),M(zy)),{loadAndWatchLicensesDir:ewe}=(Kh(),M(Iy)),MM=new Map;async function twe(e=!1){!DM&&QIe.get(JIe.CLUSTERING_ENABLED)&&jIe();try{DM&&await ZIe()}catch(n){console.error(n)}let t=YIe();$Ie(),t.isWorker=e,DM&&ewe(),await XIe(),await KIe(zIe(WIe.getConfigFilePath()),t,"hdb",!0,MM),await VIe(MM,t);let r=[];for(let[n]of MM)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}o(twe,"loadRootComponents");A3.exports.loadRootComponents=twe});var Ze=v((M$e,xi)=>{"use strict";s_();var{Worker:rwe,MessageChannel:nwe,parentPort:bo,isMainThread:FM,threadId:swe,workerData:Ao}=require("worker_threads"),{PACKAGE_ROOT:iwe}=Ot(),{join:C3,isAbsolute:owe,extname:awe}=require("path"),{server:O3}=(Fr(),M(fm)),{watch:cwe,readdir:lwe}=require("fs/promises"),{totalmem:I3}=require("os"),Qf=(q(),M(Y)),P3=ce(),Ui=Q(),{randomBytes:uwe}=require("crypto"),{_assignPackageExport:dwe}=oi(),w3=1024*1024,ba=[],ri=[],fwe=50,kM=1e4,mwe="restart",L3="request_thread_info",D3="resource_report",M3="thread_info",v3="added-port",pwe="ack",vM;dwe("threads",ri);xi.exports={startWorker:UM,restartWorkers:qM,shutdownWorkers:H3,shutdownWorkersNow:Swe,workers:ba,setMonitorListener:Nwe,onMessageFromWorkers:Twe,onMessageByType:G3,broadcast:Rwe,broadcastWithAcknowledgement:Awe,setChildListenerByType:gwe,getWorkerIndex:U3,getWorkerCount:x3,getTicketKeys:F3,setMainIsWorker:Ewe,setTerminateTimeout:hwe,restartNumber:Ao?.restartNumber||1};ri.onMessageByType=G3;ri.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=ri.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};xi.exports.whenThreadsStarted=new Promise(e=>{xi.exports.threadsHaveStarted=e});var HM;function hwe(e){kM=e}o(hwe,"setTerminateTimeout");function U3(){return Ao?Ao.workerIndex:HM?0:void 0}o(U3,"getWorkerIndex");function x3(){return Ao?Ao.workerCount:HM?1:void 0}o(x3,"getWorkerCount");function Ewe(e){HM=e,xi.exports.threadsHaveStarted()}o(Ewe,"setMainIsWorker");var B3=1,ZR;function F3(){return ZR||(ZR=FM?uwe(48):Ao.ticketKeys,ZR)}o(F3,"getTicketKeys");Object.defineProperty(O3,"workerIndex",{get(){return U3()}});Object.defineProperty(O3,"workerCount",{get(){return x3()}});var k3={[L3](e,t){Iwe(t)},[D3](e,t){wwe(t,e)}};function UM(e,t={}){let r=process.constrainedMemory?.()||I3();r=Math.min(r,I3(),2e4*w3);let n=P3.get(Qf.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/w3/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],a=[];for(let l of ri){let u=new nwe;u.existingPort=l,i.push(u),a.push(u.port2)}awe(e)||(e+=".js");let c=new rwe(owe(e)?e:C3(iwe,e),{resourceLimits:{maxOldGenerationSizeMb:n,maxYoungGenerationSizeMb:s},execArgv:["--enable-source-maps","--expose-internals"],argv:process.argv.slice(2),workerData:{addPorts:a,addThreadIds:i.map(l=>l.existingPort.threadId),workerIndex:t.workerIndex,workerCount:B3=t.threadCount,name:t.name,restartNumber:xi.exports.restartNumber,ticketKeys:F3()},transferList:a,...t});for(let{port1:l,existingPort:u}of i)u.postMessage({type:v3,port:l,threadId:c.threadId},[l]);return tb(c,!0),c.unexpectedRestarts=t.unexpectedRestarts||0,c.startCopy=()=>UM(e,t),c.on("error",l=>{Ui.error(`Worker index ${t.workerIndex} error:`,l)}),c.on("exit",l=>{ba.splice(ba.indexOf(c),1),!c.wasShutdown&&t.autoRestart!==!1&&(c.unexpectedRestarts<fwe?(t.unexpectedRestarts=c.unexpectedRestarts+1,UM(e,t)):Ui.error(`Thread has been restarted ${c.restarts} times and will not be restarted`))}),c.on("message",l=>{k3[l.type]?.(l,c)}),ba.push(c),Owe(),t.onStarted&&t.onStarted(c),c.name=t.name,c}o(UM,"startWorker");var _we=[Qf.THREAD_TYPES.HTTP];async function qM(e=null,t=Math.max(B3>3,1),r=!0){if(FM){try{process.chdir(process.cwd())}catch(a){Ui.error("Unable to reestablish current working directory",a)}if(r){let{loadRootComponents:a}=xy();await a()}xi.exports.restartNumber++,t<1&&(t=t*ba.length);let n=[],s=[];for(let a of ba.slice(0)){if(e&&a.name!==e||a.wasShutdown)continue;Ui.trace("sending shutdown request to ",a.threadId),a.postMessage({restartNumber:xi.exports.restartNumber,type:Qf.ITC_EVENT_TYPES.SHUTDOWN}),a.wasShutdown=!0,a.emit("shutdown",{});let c=_we.indexOf(a.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{Ui.warn("Thread did not voluntarily terminate, terminating from the outside",a.threadId),a.terminate()},kM*2).unref();a.on("exit",()=>{clearTimeout(d),n.splice(n.indexOf(l)),!c&&r&&a.startCopy(),u()})});if(n.push(l),c&&r){let u=a.startCopy(),d=new Promise(f=>{let m=o(p=>{p.type===Qf.ITC_EVENT_TYPES.CHILD_STARTED&&(Ui.trace("Worker has started",u.threadId),f(),s.splice(s.indexOf(d)),u.off("message",m))},"startListener");Ui.trace("Waiting for worker to start",u.threadId),u.on("message",m)});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}=Uf();r&&(e==="http"||!e)&&P3.get(Qf.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else bo.postMessage({type:mwe,workerType:e})}o(qM,"restartWorkers");function gwe(e,t){k3[e]=t}o(gwe,"setChildListenerByType");function H3(e){return qM(e,1/0,!1)}o(H3,"shutdownWorkers");function Swe(e){return H3(e),Promise.all(ba.map(t=>t.terminate()))}o(Swe,"shutdownWorkersNow");var q3=[];function Twe(e){q3.push(e)}o(Twe,"onMessageFromWorkers");var xM=new Map;function G3(e,t){let r=xM.get(e);r||xM.set(e,r=[]),r.push(t)}o(G3,"onMessageByType");var ywe=10;async function Rwe(e,t){let r=0;for(let n of ri)try{n.postMessage(e),r++>ywe&&(r=0,await new Promise(setImmediate))}catch(s){Ui.error("Unable to send message to worker",s)}t&&V3(e,null)}o(Rwe,"broadcast");var eb=new Map,bwe=1;function Awe(e){return new Promise(t=>{let r=0;for(let n of ri)try{let s=bwe++,i=o(()=>{eb.delete(s),--r===0&&t(),n!==bo&&--n.refCount===0&&n.unref()},"ackHandler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,eb.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,a]of eb)a.port===n&&a()})),n.postMessage(e),r++}catch(s){Ui.error("Unable to send message to worker",s)}r===0&&t()})}o(Awe,"broadcastWithAcknowledgement");function Iwe(e){e.postMessage({type:M3,workers:$3()})}o(Iwe,"sendThreadInfo");function $3(){let e=Date.now();return ba.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}))}o($3,"getChildWorkerInfo");function wwe(e,t){e.resources=t,e.resources.updated=Date.now()}o(wwe,"recordResourceReport");var BM;function Nwe(e){BM=e}o(Nwe,"setMonitorListener");var Cwe=1e3,N3=!1;function Owe(){N3||(N3=!0,setInterval(()=>{for(let e of ba){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}BM&&BM()},Cwe).unref())}o(Owe,"startMonitoring");var Pwe=1e3;if(bo&&Ao?.addPorts){tb(bo);for(let e=0,t=Ao.addPorts.length;e<t;e++){let r=Ao.addPorts[e];r.threadId=Ao.addThreadIds[e],tb(r)}setInterval(()=>{let e=process.memoryUsage();bo.postMessage({type:D3,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},Pwe).unref(),vM=o(()=>new Promise((e,t)=>{bo.on("message",r),bo.postMessage({type:L3});function r(n){n.type===M3&&(bo.off("message",r),e(n.workers))}o(r,"receiveThreadInfo")}),"getThreadInfo")}else vM=$3;xi.exports.getThreadInfo=vM;function tb(e,t){ri.push(e),e.on("message",r=>{if(r.type===v3)r.port.threadId=r.threadId,tb(r.port);else if(r.type===pwe){let n=eb.get(r.id);n&&n()}else V3(r,e)}).on("close",()=>{ri.splice(ri.indexOf(e),1)}).on("exit",()=>{ri.splice(ri.indexOf(e),1)}),t?e.refCount=100:e.unref()}o(tb,"addPort");function V3(e,t){for(let n of q3)n(e,t);let r=xM.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){Ui.error(s)}}o(V3,"notifyMessageListeners");if(FM){let e,t,r=new Set,n=o(async(s,i)=>{i&&(e=i);for(let a of await lwe(s,{withFileTypes:!0}))a.isDirectory()&&a.name!=="node_modules"&&n(C3(s,a.name));try{for await(let{filename:a}of cwe(s,{persistent:!1}))r.add(a),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await qM(),console.log("Reloaded HarperDB components, changed files:",Array.from(r)),r.clear()},100)}catch(a){console.warn("Error trying to watch component directory",s,a)}},"watchDir");xi.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else bo.on("message",async e=>{let{type:t}=e;t===Qf.ITC_EVENT_TYPES.SHUTDOWN&&(xi.exports.restartNumber=e.restartNumber,bo.unref(),setTimeout(()=>{Ui.warn("Thread did not voluntarily terminate",swe),process.exit(0)},kM).unref())})});var Q3=v((B$e,j3)=>{"use strict";var{promises:Jf,createReadStream:Lwe,createWriteStream:Dwe}=require("fs"),{createGzip:Mwe}=require("zlib"),{promisify:vwe}=require("util"),{pipeline:Uwe}=require("stream"),xwe=vwe(Uwe),$M=require("path"),z3=ce();z3.initSync();var rb=Q(),{CONFIG_PARAMS:Bwe,ITC_EVENT_TYPES:U$e}=(q(),M(Y)),{onMessageFromWorkers:x$e}=Ze(),{convertToMS:K3}=oe(),{onStorageReclamation:Fwe}=(G_(),M(ax)),kwe=6e4,Hwe="'interval' and 'maxSize' are both undefined, to enable logging rotation at least one of these values must be defined in harperdb-config.yaml",qwe="'logging.rotation.path' is undefined, to enable logging rotation set this value in harperdb-config.yaml",GM,Y3;j3.exports=Gwe;function Gwe({logger:e,maxSize:t,interval:r,retention:n,enabled:s,path:i,auditInterval:a}){if(s===!1)return;let c=0;if(Fwe(e.path,f=>{c=f},!0),!t&&!r)throw new Error(Hwe);if(!i)throw new Error(qwe);let l;if(t){let f=t.slice(-1),m=t.slice(0,-1);f==="G"?l=m*1e9:f==="M"?l=m*1e6:l=m*1e3}let u;r&&(u=K3(r));let d;return GM=Date.now(),rb.trace("Log rotate enabled, maxSize:",t,"interval:",r),Y3=setInterval(async()=>{if(l){let f;f=await Jf.stat(e.path),f.size>=l&&(d=await W3(e.path,i))}if(u&&Date.now()-GM>=u&&(d=await W3(e.path,i),GM=Date.now()),n||c){let f=K3(n??"1M")/(1+c);c=0;let m=await Jf.readdir(i);for(let p of m)try{let h=await Jf.stat($M.join(i,p));Date.now()-h.mtimeMs>f&&await Jf.unlink($M.join(i,p))}catch(h){rb.error("Error trying to remove log",p,h)}}},a??kwe).unref(),{end(){clearInterval(Y3)},getLastRotatedLogPath(){return d}}}o(Gwe,"logRotator");async function W3(e,t){let r=z3.get(Bwe.LOGGING_ROTATION_COMPRESS),n=$M.join(t,`HDB-${new Date(Date.now()).toISOString().replaceAll(":","-")}.log`);return await Jf.rename(e,n),r&&(e=n,n+=".gz",await xwe(Lwe(e),Mwe(),Dwe(n)),await Jf.unlink(e)),rb.closeLogFile(),rb.notify(`hdb.log rotated, old log moved to ${n}`),n}o(W3,"moveLogFile")});var tX={};Re(tX,{RootConfigWatcher:()=>VM});var J3,X3,Z3,nb,eX,VM,rX=se(()=>{J3=b(require("chokidar")),X3=require("node:fs/promises"),Z3=b(Tt()),nb=require("node:stream"),eX=require("yaml"),VM=class extends nb.EventEmitter{static{o(this,"RootConfigWatcher")}#e;#t;#r;ready;constructor(){super(),this.#e=(0,Z3.getConfigFilePath)(),this.ready=(0,nb.once)(this,"ready"),this.#t=J3.default.watch(this.#e,{persistent:!1}).on("add",this.handleChange.bind(this)).on("change",this.handleChange.bind(this)).on("error",this.handleError.bind(this))}handleError(t){this.emit("error",t)}handleChange(){(0,X3.readFile)(this.#e,"utf-8").then(t=>{if(!t)return;let r=(0,eX.parse)(t);if(!this.#r){this.#r=r,this.emit("ready",this.#r);return}this.emit("change",this.#r=r)}).catch(t=>{})}close(){return this.#t.close(),this.#r=void 0,this.emit("close"),this.removeAllListeners(),this}get config(){return this.#r}}});var Q=v((G$e,db)=>{"use strict";var Aa=require("fs-extra"),{workerData:$we,threadId:Vwe,isMainThread:cX}=require("worker_threads"),qE=require("path"),lX=require("yaml"),uX=require("properties-reader"),Yr=(q(),M(Y)),nX=Wc(),Kwe=require("os"),{PACKAGE_ROOT:XM}=Ot(),{_assignPackageExport:Ywe}=oi(),{Console:Wwe}=require("console"),YM=process.env.IS_SCRIPTED_SERVICE?function(){}:process.stdout.nativeWrite||(process.stdout.nativeWrite=process.stdout.write),sX=new Map,{join:Ia}=qE,iX=1e4,lr={notify:7,fatal:6,error:5,warn:4,info:3,debug:2,trace:1},zwe={STDOUT:"stdOut",STDERR:"stdErr"},q$e=Ia(XM,"logs"),jwe=Ia(XM,"config/yaml/",Yr.HDB_DEFAULT_CONFIG_FILE),Qwe=1e4,GE,$E,sb,Io,WM,KM,ob,Ut,Cs,ab,cb,Xf,HE,kE;function ib(e,t,r){e.rotation=t.rotation;let n=t.path;n?t.root||(t.root=qE.dirname(n)):t.root?n=Ia(t.root,WM):(n=Ut.path,t.root||(t.root=qE.dirname(n))),n?e.path=n:console.error("No path for logger",t),e.level=lr[t.level]??Ut?.level??lr.info,dX(e),e.logToStdstreams=t.stdStreams??!1,e.tag=t.tag??(Ut.path===e.path&&r)}o(ib,"updateLogger");function dX(e){let t=e.conditional??(e.conditional={});t.notify=lr.notify>=e.level?e.notify.bind(e):void 0,t.fatal=lr.fatal>=e.level?e.fatal.bind(e):void 0,t.error=lr.error>=e.level?e.error.bind(e):void 0,t.warn=lr.warn>=e.level?e.warn.bind(e):void 0,t.info=lr.info>=e.level?e.info.bind(e):void 0,t.debug=lr.debug>=e.level?e.debug.bind(e):void 0,t.trace=lr.trace>=e.level?e.trace.bind(e):void 0}o(dX,"updateConditional");async function zM(){kE||(kE=new ENe,await kE.ready,kE.on("change",zM));let e=kE.config,t=e.logging??{};ib(Ut,t),ob=Ut.path,GE=t.console??!1,t.external&&ib(Cs,t.external);for(let r in e){let n=e[r];n.logging?ib(Ut.forComponent(r),n.logging,r):Ut.hasComponent(r)&&ib(Ut.forComponent(r),t,r)}}o(zM,"updateLogSettings");var jM=class extends Wwe{static{o(this,"HarperLogger")}constructor(t,r){t.stdout.removeListener=()=>{},t.stderr.removeListener=()=>{},t.stdout.listenerCount=()=>{},t.stderr.listenerCount=()=>{},super(t),this.level=r}trace(...t){On="trace",this.level<=lr.trace&&super.info(...t),On="info"}debug(...t){On="debug",this.level<=lr.debug&&super.info(...t),On="info"}info(...t){On="info",this.level<=lr.info&&super.info(...t),On="info"}warn(...t){On="warn",this.level<=lr.warn&&super.warn(...t),On="info"}error(...t){On="error",this.level<=lr.error&&super.error(...t),On="info"}fatal(...t){Xf=!0;try{On="fatal",this.level<=lr.fatal&&super.error(...t),On="info"}finally{Xf=!1}}notify(...t){Xf=!0;try{On="notify",this.level<=lr.notify&&super.info(...t),On="info"}finally{Xf=!1}}withTag(t){return mX(t,!0,this)}forComponent(t){return this}hasComponent(t){return!1}};HE===void 0&&fX();db.exports={notify:iNe,fatal:oNe,error:JM,warn:aNe,info:rNe,debug:sNe,trace:nNe,logLevel:Io,loggerWithTag:mX,suppressLogging:eNe,initLogSettings:fX,logCustomLevel:cNe,closeLogFile:pX,createLogger:ub,logsAtLevel:Xwe,getLogFilePath:o(()=>ob,"getLogFilePath"),forComponent:o(e=>Ut.forComponent(e),"forComponent"),setMainLogger:pNe,setLogLevel:uNe,OUTPUTS:zwe,AuthAuditLog:hNe,start:zM,startOnMainThread:zM,errorToString:mNe,disableStdio:Jwe};function Jwe(){YM=o(function(){},"nativeStdWrite")}o(Jwe,"disableStdio");db.exports.externalLogger={notify(...e){Cs.notify(...e)},fatal(...e){Cs.fatal(...e)},error(...e){Cs.error(...e)},warn(...e){Cs.warn(...e)},info(...e){Cs.info(...e)},debug(...e){Cs.debug(...e)},trace(...e){Cs.trace(...e)},withTag(e){return Cs.withTag(e)}};Ywe("logger",db.exports.externalLogger);function Xwe(e){return lr[Io]<=lr[e]}o(Xwe,"logsAtLevel");function fX(e=!1){try{if(HE===void 0||e){pX();let t=lNe(),r=nX(["ROOTPATH"]);try{HE=uX(t)}catch(s){if(!r.ROOTPATH||r.ROOTPATH&&!Aa.pathExistsSync(Ia(r.ROOTPATH,Yr.HDB_CONFIG_FILE)))throw s}let n;if({level:Io,configLogPath:KM,toFile:$E,logConsole:GE,rotation:n,toStream:sb}=dNe(r.ROOTPATH?Ia(r.ROOTPATH,Yr.HDB_CONFIG_FILE):HE.get("settings_path")),WM=Yr.LOG_NAMES.HDB,ob=Ia(KM,WM),Ut=ub({path:ob,level:Io,stdStreams:sb,rotation:n}),Cs=Ut.forComponent("external"),Cs.tag=null,cX)try{require("segfault-handler").registerHandler(Ia(KM,"crash.log"))}catch{}}}catch(t){if(HE=void 0,t.code===Yr.NODE_ERROR_CODES.ENOENT||t.code===Yr.NODE_ERROR_CODES.ERR_INVALID_ARG_TYPE){let r=nX(Object.keys(Yr.CONFIG_PARAM_MAP),!0);for(let s in r){let i=Yr.CONFIG_PARAM_MAP[s];i&&i.toLowerCase();let a=r[s];if(i===Yr.CONFIG_PARAMS.LOGGING_LEVEL){Io=a;continue}i===Yr.CONFIG_PARAMS.LOGGING_CONSOLE&&(GE=i)}let{defaultLevel:n}=fNe();$E=!1,sb=!0,Io=Io===void 0?n:Io,Ut=ub({level:Io}),Cs=Ut.forComponent("external"),Cs.tag=null;return}throw JM("Error initializing log settings"),JM(t),t}process.env.DEV_MODE&&(sb=!0),Zwe()}o(fX,"initLogSettings");var qc=!0;function Zwe(){$E&&(process.stdout.write=function(e){return typeof e=="string"&&qc&&GE&&(e=e.toString(),e[e.length-1]===`
135
135
  `&&(e=e.slice(0,-1)),cb(e)),YM.apply(process.stdout,arguments)},process.stderr.write=function(e){return typeof e=="string"&&qc&&GE&&(e[e.length-1]===`
136
136
  `&&(e=e.slice(0,-1)),cb(e)),YM.apply(process.stderr,arguments)})}o(Zwe,"stdioLogging");function mX(e,t,r=Ut){return e=e.replace(/ /g,"-"),{notify:n(r.notify,"notify"),fatal:n(r.fatal,"fatal"),error:n(r.error,"error"),warn:n(r.warn,"warn"),info:n(r.info,"info"),debug:n(r.debug,"debug"),trace:n(r.trace,"trace")};function n(s,i){return!t||r.level<=lr[i]?function(...a){lb=e;try{return s.call(r,...a)}finally{lb=void 0}}:null}o(n,"logWithTag")}o(mX,"loggerWithTag");function eNe(e){try{qc=!1,e()}finally{qc=!0}}o(eNe,"suppressLogging");var tNe=$we?.name?.replace(/ /g,"-")||"main",On="info",QM,lb;function ub({path:e,level:t,stdStreams:r,rotation:n,isExternalInstance:s,writeToLog:i,component:a}){t||(t="info");let c=lr[t],l;function u(p){if($E)if(l.logToStdstreams){f(p.replace(/\x1b\[[0-9;]*m/g,"")),qc=!1;try{process.stdout.write(p)}finally{qc=!0}}else f(p);else r&&process.stdout.write(p)}o(u,"logStdOut");function d(p){if($E){if(f(p),r){qc=!1;try{process.stderr.write(p)}finally{qc=!0}}}else r&&process.stderr.write(p)}o(d,"logStdErr");let f=e&&aX(e,n,s);function m(p){return{write(h){let E=[On];E.unshift(QM||tNe+"/"+Vwe),lb&&E.push(lb),l.tag&&E.push(l.tag),p(`[${E.join("] [")}]: ${h}`)}}}if(o(m,"logPrepend"),s&&(cb=f),l=new jM({stdout:m(i??u),stderr:m(i??d),colorMode:r??!1},c),dX(l),l.path=e,Object.defineProperty(l,"path",{get(){return e},set(p){e=p,f=aX(e,l.rotation,s),s&&(cb=f)},enumerable:!0}),l.closeLogFile=f?.closeLogFile,l.logToStdstreams=r,!a){let p=new Map;l.forComponent=function(h){let E=p.get(h);return E||(E=ub({path:e,level:t,stdStreams:r,isExternalInstance:h==="external",rotation:n,writeToLog:i,component:!0}),p.set(h,E)),E},l.hasComponent=function(h){return p.has(h)}}return l}o(ub,"createLogger");var oX=100;function aX(e,t,r){let n=sX.get(e),s,i,a,c,l=0;n||(n=d,n.closeLogFile=m,n.path=e,sX.set(e,n)),cX&&JSON.stringify(t)!==JSON.stringify(n.rotation)&&(n.rotation=t,setTimeout(()=>{if(n.rotator?.end(),!t)return;let h=Q3();try{n.rotator=h({logger:n,...t})}catch(E){n("Error initializing log rotator",E)}},100));let u=0;return n;function d(h){u++;let E=`${new Date().toISOString()} ${h}${h.endsWith(`