harperdb 4.6.10 → 4.6.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/harperdb.js +2 -2
- package/bin/lite.js +2 -2
- package/launchServiceScripts/launchNatsIngestService.js +2 -2
- package/launchServiceScripts/launchNatsReplyService.js +2 -2
- package/launchServiceScripts/launchUpdateNodes4-0-0.js +2 -2
- package/npm-shrinkwrap.json +51 -73
- package/package.json +1 -1
- package/resources/RequestTarget.d.ts +2 -0
- package/resources/analytics/hostnames.d.ts +5 -477
- package/resources/databases.d.ts +1 -478
- package/server/jobs/jobProcess.js +2 -2
- package/server/threads/threadServer.js +2 -2
- package/studio/build-local/asset-manifest.json +2 -2
- package/studio/build-local/index.html +1 -1
- package/studio/build-local/static/js/{main.53a67ceb.js → main.5c459d01.js} +2 -2
- package/utility/scripts/restartHdb.js +2 -2
- /package/studio/build-local/static/js/{main.53a67ceb.js.LICENSE.txt → main.5c459d01.js.LICENSE.txt} +0 -0
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
`),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
|
|
13
13
|
`)},wne="certificate.pem",One="privateKey.pem",Cne="caCertificate.pem",Pne="natsCertificate.pem",Lne="natsCaCertificate.pem",Nt={DEFAULT:"default","DEFAULT-CA":"default-ca",SERVER:"server",CA:"ca","OPERATIONS-API":"operations-api","OPERATIONS-CA":"operations-ca"},Dne={tls_certificate:Nt.SERVER,tlsCertificateAuthority:Nt.CA,customFunctions_tls_certificate:Nt.SERVER,customFunctionsTlsCertificateAuthority:Nt.CA,operationsApi_tls_certificate:Nt["OPERATIONS-API"],operationsApiTlsCertificateAuthority:Nt["OPERATIONS-CA"]},Mne={[Nt.SERVER]:2,[Nt.DEFAULT]:1},vne={[Nt["OPERATIONS-API"]]:3,[Nt.SERVER]:2,[Nt.DEFAULT]:1},Une={[Nt["OPERATIONS-API"]]:3,[Nt.SERVER]:2,[Nt.DEFAULT]:1},xne={[Nt["OPERATIONS-CA"]]:3,[Nt.CA]:2,[Nt["DEFAULT-CA"]]:1},Bne={[Nt["OPERATIONS-CA"]]:3,[Nt.CA]:2,[Nt["DEFAULT-CA"]]:1},Fne={[Nt.CA]:2,[Nt["DEFAULT-CA"]]:1};cn.CERTIFICATE_PEM_NAME=wne;cn.PRIVATEKEY_PEM_NAME=One;cn.CA_PEM_NAME=Cne;cn.CERT_NAME=Nt;cn.CERT_CONFIG_NAME_MAP=Dne;cn.CERT_PREFERENCE_APP=Mne;cn.CERT_PREFERENCE_OPS=vne;cn.CERT_PREFERENCE_REP=Une;cn.CA_CERT_PREFERENCE_REP=xne;cn.CA_CERT_PREFERENCE_OPS=Bne;cn.CA_CERT_PREFERENCE_APP=Fne;cn.CERTIFICATE_VALUES=Nne;cn.NATS_CERTIFICATE_PEM_NAME=Pne;cn.NATS_CA_PEM_NAME=Lne});var GI=M((kPe,XF)=>{"use strict";var QF=require("fs-extra"),Re=require("joi"),Hne=require("os"),{boolean:Ge,string:gt,number:lr,array:Ha}=Re.types(),{totalmem:WF}=require("os"),fl=require("path"),kne=Q(),kI=ie(),HPe=HI(),zF=(H(),v(W)),Gne=dt(),jF="log",qne="components",$ne="Invalid logging.rotation.maxSize unit. Available units are G, M or K",Vne="Invalid logging.rotation.interval unit. Available units are D, H or M (minutes)",Kne="Invalid logging.rotation.maxSize value. Value should be a number followed by unit e.g. '10M'",Yne="Invalid logging.rotation.interval value. Value should be a number followed by unit e.g. '10D'",Wne="rootPath config parameter is undefined",Un=Re.alternatives([lr.min(0),gt]).optional().empty(null),hg=Re.alternatives([Ha.items(gt,{host:gt.required(),port:Un},{hostname:gt.required(),port:Un}).empty(null),Ha.items(gt)]),Vi,JF=!1;XF.exports={configValidator:zne,routesValidator:ese,routeConstraints:hg};function zne(e,t=!1){if(JF=t,Vi=e.rootPath,kI.isEmpty(Vi))throw Wne;let r=Ge.optional(),n=lr.min(0).max(1e3).empty(null).default(Zne),s=gt.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").empty(null).default(Xm),i=gt.optional().empty(null),a=gt.pattern(/^[^\s.,*>]+$/).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >"}).empty(null).required(),c=Re.string().empty(null).default(Xm),l=Re.custom(Qne).empty(null).default(Xm),u=e.clustering?.enabled,d=Re.object({certificate:i,certificateAuthority:i,privateKey:i}),f;return u===!0?f=Re.object({enabled:r,hubServer:Re.object({cluster:Re.object({name:Re.required().empty(null),network:Re.object({port:Un,routes:hg}).required()}).required(),leafNodes:Re.object({network:Re.object({port:Un}).required()}).required(),network:Re.object({port:Un}).required()}).required(),leafServer:Re.object({network:Re.object({port:Un,routes:hg}).required(),streams:Re.object({maxAge:lr.min(120).allow(null).optional(),maxBytes:lr.min(1).allow(null).optional(),maxMsgs:lr.min(1).allow(null).optional(),path:c}).required()}).required(),logLevel:Re.valid("error","warn","info","debug","trace"),nodeName:a,republishMessages:Ge.optional(),databaseLevel:Ge.optional(),tls:Re.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:Ge.required(),verify:Ge.optional()}),user:gt.optional().empty(null)}).optional():f=Re.object({enabled:r,tls:Re.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:Ge.optional()})}).optional(),Re.object({authentication:Re.alternatives(Re.object({authorizeLocal:Ge,cacheTTL:lr.required(),cookie:Re.object({domains:Ha.items(gt).optional(),expires:gt.optional()}),enableSessions:Ge,hashFunction:gt.valid("md5","sha256","argon2id").optional().empty(null)}),Ge).optional(),analytics:Re.object({aggregatePeriod:lr,replicate:Ge.optional()}),replication:Re.object({hostname:Re.alternatives(gt,lr).optional().empty(null),url:gt.optional().empty(null),port:Un,securePort:Un,routes:Ha.optional().empty(null),databases:Re.alternatives(gt,Ha),enableRootCAs:Ge.optional(),copyTablesToCatchUp:Ge.optional()}).optional(),componentsRoot:s.optional(),clustering:f,localStudio:Re.object({enabled:r}).required(),logging:Re.object({auditAuthEvents:Re.object({logFailed:Ge,logSuccessful:Ge}),file:Ge.required(),level:Re.valid("notify","fatal","error","warn","info","debug","trace"),rotation:Re.object({enabled:Ge.optional(),compress:Ge.optional(),interval:gt.custom(Xne).optional().empty(null),maxSize:gt.custom(Jne).optional().empty(null),path:gt.optional().empty(null).default(Xm)}).required(),root:s,stdStreams:Ge.required(),auditLog:Ge.required()}).required(),operationsApi:Re.object({network:Re.object({cors:Ge.optional(),corsAccessList:Ha.optional(),headersTimeout:lr.min(1).optional(),keepAliveTimeout:lr.min(1).optional(),port:Un,domainSocket:Re.optional().empty("hdb/operations-server").default(Xm),securePort:Un,timeout:lr.min(1).optional()}).optional(),tls:Re.alternatives([Re.array().items(d),d])}).required(),rootPath:gt.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").required(),mqtt:Re.object({network:Re.object({port:Un,securePort:Un,mtls:Re.alternatives([Ge.optional(),Re.object({user:gt.optional(),certificateAuthority:i,required:Ge.optional()})])}).required(),webSocket:Ge.optional(),requireAuthentication:Ge.optional()}),http:Re.object({compressionThreshold:lr.optional(),cors:Ge.optional(),corsAccessList:Ha.optional(),headersTimeout:lr.min(1).optional(),port:Un,securePort:Un,maxHeaderSize:lr.optional(),mtls:Re.alternatives([Ge.optional(),Re.object({user:gt.optional(),certificateAuthority:i,required:Ge.optional()})]),threadRange:Re.alternatives([Ha.optional(),gt.optional()])}).required(),threads:Re.alternatives(n.optional(),Re.object({count:n.optional(),debug:Re.alternatives(Ge.optional(),Re.object({startingPort:lr.min(1).optional(),host:gt.optional(),waitForDebugger:Ge.optional()})),maxHeapMemory:lr.min(0).optional()})),storage:Re.object({writeAsync:Ge.required(),overlappingSync:Ge.optional(),caching:Ge.optional(),compression:Re.alternatives([Ge.optional(),Re.object({dictionary:gt.optional(),threshold:lr.optional()})]),compactOnStart:Ge.optional(),compactOnStartKeepBackup:Ge.optional(),noReadAhead:Ge.optional(),path:l,prefetchWrites:Ge.optional(),maxFreeSpaceToLoad:lr.optional(),maxFreeSpaceToRetain:lr.optional()}).required(),ignoreScripts:Ge.optional(),tls:Re.alternatives([Re.array().items(d),d])}).validate(e,{allowUnknown:!0,abortEarly:!1,errors:{wrap:{label:"'"}}})}o(zne,"configValidator");function jne(e){return JF||QF.existsSync(e)?null:`Specified path ${e} does not exist.`}o(jne,"doesPathExist");function Qne(e,t){Re.assert(e,gt.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path"));let r=jne(e);if(r)return t.message(r)}o(Qne,"validatePath");function Jne(e,t){let r=e.slice(-1);if(r!=="G"&&r!=="M"&&r!=="K")return t.message($ne);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(Kne):e}o(Jne,"validateRotationMaxSize");function Xne(e,t){let r=e.slice(-1);if(r!=="D"&&r!=="H"&&r!=="M")return t.message(Vne);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(Yne):e}o(Xne,"validateRotationInterval");function Zne(e,t){let r=t.state.path.join("."),n=Hne.cpus().length,s=n-1;s<=2&&(s=2);let i=process.constrainedMemory?.()||WF();return i=Math.round(Math.min(i,WF())/1e6),s=Math.max(Math.min(s,Math.round((i-750)/300)),1),kne.info(`Detected ${n} cores and ${i}MB on this machine, defaulting ${r} to ${s}`),s}o(Zne,"setDefaultThreads");function Xm(e,t){let r=t.state.path.join(".");if(!kI.isEmpty(t.original)&&r!=="operationsApi.network.domainSocket")return t.original;if(kI.isEmpty(Vi))throw new Error(`Error setting default root for: ${r}. HDB root is not defined`);switch(r){case"componentsRoot":return fl.join(Vi,qne);case"logging.root":return fl.join(Vi,jF);case"clustering.leafServer.streams.path":return fl.join(Vi,"clustering","leaf");case"storage.path":let n=fl.join(Vi,zF.LEGACY_DATABASES_DIR_NAME);return QF.existsSync(n)?n:fl.join(Vi,zF.DATABASES_DIR_NAME);case"logging.rotation.path":return fl.join(Vi,jF);case"operationsApi.network.domainSocket":return r==null?null:fl.join(Vi,"operations-server");default:throw new Error(`Error setting default root for config parameter: ${r}. Unrecognized config parameter`)}}o(Xm,"setDefaultRoot");function ese(e){let t=Re.object({routes:hg});return Gne.validateBySchema({routes:e},t)}o(ese,"routesValidator")});var bt=M(Zt=>{"use strict";var ws=(H(),v(W)),Ir=ie(),ur=Q(),{configValidator:tse,routesValidator:ZF}=GI(),ln=require("fs-extra"),tH=require("yaml"),es=require("path"),rse=require("is-number"),rH=require("properties-reader"),nse=require("lodash"),{handleHDBError:sse}=ge(),{HTTP_STATUS_CODES:ise,HDB_ERROR_MSGS:Wu}=rn(),{server:ose}=(Mr(),v(Kf)),{PACKAGE_ROOT:nH}=Rt(),{DATABASES_PARAM_CONFIG:Zm,CONFIG_PARAMS:Zn,CONFIG_PARAM_MAP:li}=ws,ase="Unable to get config value because config is uninitialized",cse="Config successfully initialized",lse="Error backing up config file",use="Empty parameter sent to getConfigValue",sH=es.join(nH,"config","yaml",ws.HDB_DEFAULT_CONFIG_FILE),dse=es.join(nH,"config","yaml","defaultNatsConfig.yaml"),fse="Configuration successfully set. You must restart HarperDB for new config settings to take effect.",eH={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"},pg,xt,Eg;Zt.createConfigFile=mse;Zt.getDefaultConfig=hse;Zt.getConfigValue=oH;Zt.initConfig=_g;Zt.flattenConfig=zu;Zt.updateConfigValue=aH;Zt.updateConfigObject=Ese;Zt.getConfiguration=Sse;Zt.setConfiguration=Tse;Zt.readConfigFile=KI;Zt.getClusteringRoutes=Rse;Zt.initOldConfig=cH;Zt.getConfigFromFile=yse;Zt.getConfigFilePath=ml;Zt.addConfig=Ase;Zt.deleteConfigFromFile=bse;Zt.getConfigObj=Ise;Zt.resolvePath=qI;Zt.getFlatConfigObj=Nse;function qI(e){if(e?.startsWith("~/"))return es.join(Ir.getHomeDir(),e.slice(1));let t=oe();try{return es.resolve(t.getHdbBasePath(),e)}catch(r){return console.error("Unable to resolve path",e,r),e}}o(qI,"resolvePath");function mse(e,t=!1){let r=ka(sH);if(e.clustering_enabled||e.CLUSTERING_ENABLED||e.clustering){let c=tH.parseDocument(ln.readFileSync(dse,"utf8"),{simpleKeys:!0});r.addIn(["clustering"],c.toJSON().clustering)}pg=zu(r.toJSON());let n;for(let c in e){let l=li[c.toLowerCase()];if(l===Zn.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=$I(l,e[c]);l==="rootPath"&&d?.endsWith("/")&&(d=d.slice(0,-1));try{r.setIn([...u],d)}catch(f){ur.error(f)}}}n&&iH(r,n),VI(r,t);let s=r.toJSON();xt=zu(s);let i=r.getIn(["rootPath"]),a=es.join(i,ws.HDB_CONFIG_FILE);if(ln.createFileSync(a),r.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${r.errors}`);ln.writeFileSync(a,String(r)),ur.trace(`Config file written to ${a}`)}o(mse,"createConfigFile");function iH(e,t){let r;try{try{r=JSON.parse(t)}catch(n){if(!Ir.isObject(t))throw n;r=t}for(let n of r){let s=Object.keys(n)[0];if(n[s].hasOwnProperty(Zm.TABLES))for(let i in n[s][Zm.TABLES])for(let a in n[s][Zm.TABLES][i]){let c=n[s][Zm.TABLES][i][a],l=[Zn.DATABASES,s,Zm.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=[Zn.DATABASES,s,i];e.hasIn(c)?e.setIn(c,a):e.addIn(c,a)}}}catch(n){ur.error("Error parsing schemas CLI/env config arguments",n)}}o(iH,"setSchemasConfig");function hse(e){if(pg===void 0){let r=ka(sH);pg=zu(r.toJSON())}let t=li[e.toLowerCase()];if(t!==void 0)return pg[t.toLowerCase()]}o(hse,"getDefaultConfig");function oH(e){if(e==null){ur.info(use);return}if(xt===void 0){ur.trace(ase);return}let t=li[e.toLowerCase()];if(t!==void 0)return xt[t.toLowerCase()]}o(oH,"getConfigValue");function ml(e=Ir.getPropsFilePath()){let t=Ir.getEnvCliRootPath();if(t)return qI(es.join(t,ws.HDB_CONFIG_FILE));let r=rH(e);return qI(r.get(ws.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY))}o(ml,"getConfigFilePath");function _g(e=!1){if(xt===void 0||e){let t;if(!Ir.noBootFile()){t=Ir.getPropsFilePath();try{ln.accessSync(t,ln.constants.F_OK|ln.constants.R_OK)}catch(i){throw ur.error(i),new Error(`HarperDB properties file at path ${t} does not exist`)}}let r=ml(t),n;if(r.includes("config/settings.js"))try{cH(r);return}catch(i){if(i.code!==ws.NODE_ERROR_CODES.ENOENT)throw i}try{n=ka(r)}catch(i){if(i.code===ws.NODE_ERROR_CODES.ENOENT){ur.trace(`HarperDB config file not found at ${r}.
|
|
14
14
|
This can occur during early stages of install where the config file has not yet been created`);return}else throw ur.error(i),new Error(`Error reading HarperDB config file at ${r}`)}pse(n,r),VI(n);let s=n.toJSON();if(ose.config=s,xt=zu(s),xt.logging_rotation_rotate)for(let i in eH)xt[i]&&ur.error(`Config ${eH[i]} has been deprecated. Please check https://docs.harperdb.io/docs/ for further details.`);ur.trace(cse)}}o(_g,"initConfig");function pse(e,t){let r=e.getIn(["rootPath"]),n=!1;if(e.hasIn(["storage","path"])||(e.setIn(["storage","path"],es.join(r,"database")),n=!0),e.hasIn(["logging","rotation","path"])||(e.setIn(["logging","rotation","path"],es.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(ur.trace("Updating config file with missing config params"),e.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${e.errors}`);ln.writeFileSync(t,String(e))}}o(pse,"checkForUpdatedConfig");function VI(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 Wu.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 Wu.CONFIG_VALIDATION("operationsApi.network.port and operationsApi.network.securePort cannot be the same value");let n=tse(r,t);if(n.error)throw Wu.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(VI,"validateConfig");function Ese(e,t){xt===void 0&&(xt={});let r=li[e.toLowerCase()];if(r===void 0){ur.trace(`Unable to update config object because config param '${e}' does not exist`);return}xt[r.toLowerCase()]=t}o(Ese,"updateConfigObject");function aH(e,t,r=void 0,n=!1,s=!1,i=!1){xt===void 0&&_g();let a=oH(li.hdb_root),c=es.join(a,ws.HDB_CONFIG_FILE),l=ka(c),u;if(r&&xt){let m=!1;for(let h in r)if(r[h]!=xt[h.toLowerCase()]){m=!0;break}if(!m){ur.trace("No changes detected in config parameters, skipping update");return}}if(r===void 0&&e.toLowerCase()===Zn.DATABASES)u=t;else if(r===void 0){let m;if(i)m=e;else if(m=li[e.toLowerCase()],m===void 0)throw new Error(`Unable to update config, unrecognized config parameter: ${e}`);let h=m.split("_"),p=$I(m,t);l.setIn([...h],p)}else for(let m in r){let h=li[m.toLowerCase()];if(h===Zn.HTTP_SECUREPORT&&r[m]===xt[Zn.HTTP_PORT]?.toString()&&l.setIn(["http","port"],null),h===Zn.OPERATIONSAPI_NETWORK_SECUREPORT&&r[m]===xt[Zn.OPERATIONSAPI_NETWORK_PORT.toLowerCase()]?.toString()&&l.setIn(["operationsApi","network","port"],null),h===Zn.DATABASES){u=r[m];continue}if(h?.startsWith("threads_")){let p=l.getIn(["threads"]);p>=0&&(l.deleteIn(["threads"]),l.setIn(["threads","count"],p))}if(!h&&(m.endsWith("_package")||m.endsWith("_port"))&&(h=m),h!==void 0){let p=h.split("_"),_=ws.LEGACY_CONFIG_PARAMS[m.toUpperCase()];_&&_.startsWith("customFunctions")&&l.hasIn(_.split("_"))&&(h=_,p=_.split("_"));let g=$I(h,r[m]);h==="rootPath"&&g?.endsWith("/")&&(g=g.slice(0,-1));try{p.length>1&&typeof l.getIn(p.slice(0,-1))=="boolean"&&l.deleteIn(p.slice(0,-1)),l.setIn([...p],g)}catch(y){ur.error(y)}}}u&&iH(l,u),VI(l);let d=l.getIn(["rootPath"]),f=es.join(d,ws.HDB_CONFIG_FILE);if(n===!0&&_se(c,d),l.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${l.errors}`);ln.writeFileSync(f,String(l)),s&&(xt=zu(l.toJSON())),ur.trace(`Config parameter: ${e} updated with value: ${t}`)}o(aH,"updateConfigValue");function _se(e,t){try{let r=es.join(t,"backup",`${new Date(Date.now()).toISOString().replaceAll(":","-")}-${ws.HDB_CONFIG_FILE}.bak`);ln.copySync(e,r),ur.trace(`Config file: ${e} backed up to: ${r}`)}catch(r){ur.error(lse),ur.error(r)}}o(_se,"backupConfigFile");var gse=["databases"];function zu(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}),Eg=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])&&!gse.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;!Zn[l.toUpperCase()]&&li[l]&&(s[li[l].toLowerCase()]=a[c]),s[l]=a[c]}}n[i]!==void 0&&(s[i.toLowerCase()]=n[i])}return s}o(r,"squashObj")}o(zu,"flattenConfig");function $I(e,t){if(e===Zn.CLUSTERING_NODENAME||e===Zn.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(rse(t))return parseFloat(t);if(t===!0||t===!1||Array.isArray(t)||Ir.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 Ir.autoCast(t)}o($I,"castConfigValue");function Sse(){let e=Ir.getPropsFilePath(),t=ml(e);return ka(t).toJSON()}o(Sse,"getConfiguration");async function Tse(e){let{operation:t,hdb_user:r,hdbAuthHeader:n,...s}=e;try{return aH(void 0,void 0,s,!0),fse}catch(i){throw typeof i=="string"||i instanceof String?sse(i,i,ise.BAD_REQUEST,void 0,void 0,!0):i}}o(Tse,"setConfiguration");function KI(){let e=Ir.getPropsFilePath();try{ln.accessSync(e,ln.constants.F_OK|ln.constants.R_OK)}catch(n){if(!Ir.noBootFile())throw ur.error(n),new Error(`HarperDB properties file at path ${e} does not exist`)}let t=ml(e);return ka(t).toJSON()}o(KI,"readConfigFile");function ka(e){return tH.parseDocument(ln.readFileSync(e,"utf8"),{simpleKeys:!0})}o(ka,"parseYamlDoc");function Rse(){let e=KI(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=Ir.isEmptyOrZeroLength(t)?[]:t;let r=ZF(t);if(r)throw Wu.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=Ir.isEmptyOrZeroLength(n)?[]:n;let s=ZF(n);if(s)throw Wu.CONFIG_VALIDATION(s.message);if(!Ir.isEmptyOrZeroLength(n)&&!Ir.isEmptyOrZeroLength(t)){let i=t.filter(a=>n.some(c=>c.host===a.host&&c.port===a.port));if(!Ir.isEmptyOrZeroLength(i)){let a=`Duplicate hub and leaf routes found ${JSON.stringify(i)}`;throw Wu.CONFIG_VALIDATION(a)}}return{hub_routes:t,leaf_routes:n}}o(Rse,"getClusteringRoutes");function cH(e){let t=rH(e);xt={};for(let r in li){let n=t.get(r.toUpperCase());if(Ir.isEmpty(n)||typeof n=="string"&&n.trim().length===0)continue;let s=li[r].toLowerCase();s===Zn.LOGGING_ROOT?xt[s]=es.dirname(n):xt[s]=n}return xt}o(cH,"initOldConfig");function yse(e){let t=KI();return nse.get(t,e.replaceAll("_","."))}o(yse,"getConfigFromFile");async function Ase(e,t){let r=ka(ml());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 ln.writeFile(ml(),String(r))}o(Ase,"addConfig");function bse(e){let t=ml(Ir.getPropsFilePath()),r=ka(t);r.deleteIn(e);let n=r.getIn(["rootPath"]),s=es.join(n,ws.HDB_CONFIG_FILE);ln.writeFileSync(s,String(r))}o(bse,"deleteConfigFromFile");function Ise(){return Eg||(_g(),Eg)}o(Ise,"getConfigObj");function Nse(){return xt||_g(),xt}o(Nse,"getFlatConfigObj")});var ts=M((VPe,Br)=>{"use strict";var dH="username is required",fH="nothing to update, must supply active, role or password to update",mH="password cannot be an empty string",hH="If role is specified, it cannot be empty.",pH="active must be true or false";Br.exports.addUser=Use;Br.exports.alterUser=xse;Br.exports.dropUser=Fse;Br.exports.getSuperUser=$se;Br.exports.userInfo=Hse;Br.exports.listUsers=Sg;Br.exports.listUsersExternal=kse;Br.exports.setUsersWithRolesCache=hl;Br.exports.findAndValidateUser=eN;Br.exports.getClusterUser=Vse;Br.exports.getUsersWithRolesCache=qse;Br.exports.USERNAME_REQUIRED=dH;Br.exports.ALTERUSER_NOTHING_TO_UPDATE=fH;Br.exports.EMPTY_PASSWORD=mH;Br.exports.EMPTY_ROLE=hH;Br.exports.ACTIVE_BOOLEAN=pH;var EH=vn(),wse=dl(),eh=(mg(),v(fg)),_H=VF(),th=on(),QI=Oo(),Ki=ie(),gH=require("validate.js"),JI=Q(),{promisify:Ose}=require("util"),XI=$i(),WI=(H(),v(W)),lH=It(),Cse=bt(),Pse=oe(),Lse=Io(),{hdbErrors:Dse,ClientError:ui}=ge(),{HTTP_STATUS_CODES:Do,AUTHENTICATION_ERROR_MSGS:YI,HDB_ERROR_MSGS:ju}=Dse,{UserEventMsg:ZI}=ii(),zI=require("lodash"),{server:gg}=(Mr(),v(Kf)),Mse=Q();gg.getUser=(e,t)=>eN(e,t,t!=null);gg.authenticateUser=(e,t)=>eN(e,t);var SH={username:!0,active:!0,role:!0,password:!0},uH=new Map,vse=Ose(wse.delete),jI=Pse.get(WI.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??eh.HASH_FUNCTION.SHA256,Yi;async function Use(e){let t=gH.cleanAttributes(e,SH),r=_H.addUserValidation(t);if(r)throw new ui(r.message);let n=await th.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["id","permission","role"]});if(!n||n.length<1)throw new ui(ju.ROLE_NAME_NOT_FOUND(t.role),Do.NOT_FOUND);if(n.length>1)throw new ui(ju.DUP_ROLES_FOUND(t.role),Do.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=XI.encrypt(t.password)),t.password=await eh.hash(t.password,jI),t.hash_function=jI,t.role=n[0].id;let s=await EH.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(JI.debug(s),await hl(),s.skipped_hashes.length===1)throw new ui(ju.USER_ALREADY_EXISTS(t.username),Do.CONFLICT);return QI.signalUserChange(new ZI(process.pid)),`${t.username} successfully added`}o(Use,"addUser");async function xse(e){let t=gH.cleanAttributes(e,SH);if(Ki.isEmptyOrZeroLength(t.username))throw new Error(dH);if(Ki.isEmptyOrZeroLength(t.password)&&Ki.isEmptyOrZeroLength(t.role)&&Ki.isEmptyOrZeroLength(t.active))throw new Error(fH);if(!Ki.isEmpty(t.password)&&Ki.isEmptyOrZeroLength(t.password.trim()))throw new Error(mH);if(!Ki.isEmpty(t.active)&&!Ki.isBoolean(t.active))throw new Error(pH);if(!Ki.isEmpty(t.password)&&!Ki.isEmptyOrZeroLength(t.password.trim())&&(Bse(t.username)&&(t.hash=XI.encrypt(t.password)),t.password=await eh.hash(t.password,jI)),t.role==="")throw new Error(hH);if(t.role){let n=await th.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["*"]});if(!n||n.length===0)throw new ui(ju.ALTER_USER_ROLE_NOT_FOUND(t.role),Do.NOT_FOUND);if(n.length>1)throw new ui(ju.DUP_ROLES_FOUND(t.role),Do.CONFLICT);t.role=n[0].id}let r=await EH.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await hl(),QI.signalUserChange(new ZI(process.pid)),r}o(xse,"alterUser");function Bse(e){let t=!1,r=Yi.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}o(Bse,"isClusterUser");async function Fse(e){let t=_H.dropUserValidation(e);if(t)throw new ui(t.message);if(Yi.get(e.username)===void 0)throw new ui(ju.USER_NOT_EXIST(e.username),Do.NOT_FOUND);let r=await vse({table:"hdb_user",schema:"system",hash_values:[e.username]});return JI.debug(r),await hl(),QI.signalUserChange(new ZI(process.pid)),`${e.username} successfully deleted`}o(Fse,"dropUser");async function Hse(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=zI.cloneDeep(e.hdb_user);let r=await th.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(Hse,"userInfo");async function kse(){let e=await Sg();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}o(kse,"listUsersExternal");async function Sg(){let e=await th.searchByValue({schema:"system",table:"hdb_role",search_value:"*",search_attribute:"role",get_attributes:["*"]}),t={};for(let s of e)t[s.id]=zI.cloneDeep(s);if(Object.keys(t).length===0)return null;let r=await th.searchByValue({schema:"system",table:"hdb_user",search_value:"*",search_attribute:"username",get_attributes:["*"]}),n=new Map;for(let s of r)s=zI.cloneDeep(s),s.role=t[s.role],Gse(s.role),n.set(s.username,s);return n}o(Sg,"listUsers");function Gse(e){if(!e){JI.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(Lse)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}o(Gse,"appendSystemTablesToRole");async function hl(e=void 0){e?Yi=e:Yi=await Sg()}o(hl,"setUsersWithRolesCache");async function qse(){return Yi||await hl(),Yi}o(qse,"getUsersWithRolesCache");async function eN(e,t,r=!0){Yi||await hl();let n=Yi.get(e);if(!n){if(!r)return{username:e};throw new ui(YI.GENERIC_AUTH_FAIL,Do.UNAUTHORIZED)}if(n&&!n.active)throw new ui(YI.USER_INACTIVE,Do.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(uH.get(t)===n.password)return s;{let i=eh.validate(n.password,t,n.hash_function||eh.HASH_FUNCTION.MD5);if(i?.then&&(i=await i),i===!0)uH.set(t,n.password);else throw new ui(YI.GENERIC_AUTH_FAIL,Do.UNAUTHORIZED)}}return s}o(eN,"findAndValidateUser");async function $se(){Yi||await hl();for(let[,e]of Yi)if(e.role.role==="super_user")return e}o($se,"getSuperUser");async function Vse(){let e=await Sg(),t=Cse.getConfigFromFile(WI.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==WI.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=XI.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+lH.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+lH.SERVER_SUFFIX.ADMIN,r}o(Vse,"getClusterUser");var TH=[];gg.invalidateUser=function(e){for(let t of TH)try{t(e)}catch(r){Mse.error("Error invalidating user",r)}};gg.onInvalidatedUser=function(e){TH.push(e)}});var nh=M((zPe,bH)=>{"use strict";var pl=Q(),rs=(H(),v(W)),Kse=YU(),YPe=si(),WPe=xa(),Yse=ts(),{validateEvent:RH}=ii(),rh=Jn(),Wse=require("process"),{resetDatabases:zse}=(De(),v(ht)),jse={[rs.ITC_EVENT_TYPES.SCHEMA]:Qse,[rs.ITC_EVENT_TYPES.USER]:AH};async function Qse(e){let t=RH(e);if(t){pl.error(t);return}pl.trace("ITC schemaHandler received schema event:",e),await Kse(e.message),await Jse(e.message)}o(Qse,"schemaHandler");async function Jse(e){try{rh.resetReadTxn(rs.SYSTEM_SCHEMA_NAME,rs.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),rh.resetReadTxn(rs.SYSTEM_SCHEMA_NAME,rs.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),rh.resetReadTxn(rs.SYSTEM_SCHEMA_NAME,rs.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=zse();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){pl.error(t)}}o(Jse,"syncSchemaMetadata");var yH=[];async function AH(e){try{try{rh.resetReadTxn(rs.SYSTEM_SCHEMA_NAME,rs.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),rh.resetReadTxn(rs.SYSTEM_SCHEMA_NAME,rs.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){pl.warn(r)}let t=RH(e);if(t){pl.error(t);return}pl.trace(`ITC userHandler ${rs.HDB_ITC_CLIENT_PREFIX}${Wse.pid} received user event:`,e),await Yse.setUsersWithRolesCache();for(let r of yH)r()}catch(t){pl.error(t)}}o(AH,"userHandler");AH.addListener=function(e){yH.push(e)};bH.exports=jse});var ii=M((eLe,NH)=>{"use strict";var QPe=Q(),tN=ie(),Xse=(H(),v(W)),{ITC_ERRORS:sh}=rn(),{parentPort:JPe,threadId:Zse,isMainThread:eie,workerData:XPe}=require("worker_threads"),{onMessageFromWorkers:tie,broadcast:ZPe,broadcastWithAcknowledgement:rie}=st();NH.exports={sendItcEvent:nie,validateEvent:IH,SchemaEventMsg:sie,UserEventMsg:iie};var Tg;tie(async(e,t)=>{Tg=Tg||nh(),IH(e),Tg[e.type]&&await Tg[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function nie(e){return!eie&&e.message&&(e.message.originator=Zse),rie(e)}o(nie,"sendItcEvent");function IH(e){if(typeof e!="object")return sh.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||tN.isEmpty(e.type))return sh.MISSING_TYPE;if(!e.hasOwnProperty("message")||tN.isEmpty(e.message))return sh.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||tN.isEmpty(e.message.originator))return sh.MISSING_ORIGIN;if(Xse.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return sh.INVALID_EVENT(e.type)}o(IH,"validateEvent");function sie(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(sie,"SchemaEventMsg");function iie(e){this.originator=e}o(iie,"UserEventMsg")});var Oo=M((nLe,PH)=>{"use strict";var wH=(H(),v(W)),rLe=ie(),Rg=Q(),OH=OU(),Qu,{sendItcEvent:CH}=ii();function oie(e){try{Rg.info("signalSchemaChange called with message:",e),Qu=Qu||nh();let t=new OH(wH.ITC_EVENT_TYPES.SCHEMA,e);return Qu.schema(t),CH(t)}catch(t){Rg.error(t)}}o(oie,"signalSchemaChange");function aie(e){try{Rg.trace("signalUserChange called with message:",e),Qu=Qu||nh();let t=new OH(wH.ITC_EVENT_TYPES.USER,e);return Qu.user(t),CH(t)}catch(t){Rg.error(t)}}o(aie,"signalUserChange");PH.exports={signalSchemaChange:oie,signalUserChange:aie}});function yg(){return rN||(rN=Qe({table:"hdb_analytics_hostname",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"hostname"}]})),rN}function lie(e){return e=e.replace(cie,t=>{let[r,n,s,i]=t.split(".").map(a=>parseInt(a));return(r<<8|n).toString(16)+":"+(s<<8|i).toString(16)}),e=e.replace("::",":".repeat(10-e.split(":").length)),e.toLowerCase().split(":").map(t=>t.padStart(4,"0")).join(":")}function uie(e){if(e.length!==4)throw new Error(`nodeHash must be exactly 4 bytes (32 bits); got ${e.length} bytes`);return e[0]<<24|e[1]<<16|e[2]<<8|e[3]}function sN(e){let t=LH.default.createHash("shake128",{outputLength:4}),r;return(0,DH.isIPv6)(e)?r=lie(e):r=e.toLowerCase(),uie(Uint8Array.from(t.update(r).digest()))}var LH,DH,nN,rN,cie,iN=ue(()=>{De();LH=w(require("crypto")),DH=require("node:net"),nN=new Map;o(yg,"getAnalyticsHostnameTable");cie=/(\d{1,3}\.){3}\d{1,3}$/;o(lie,"normalizeIPv6");o(uie,"nodeHashToNumber");o(sN,"stableNodeId")});var Mo,oN=ue(()=>{Mo={TABLE_SIZE:"table-size",DATABASE_SIZE:"database-size",STORAGE_VOLUME:"storage-volume",MAIN_THREAD_UTILIZATION:"main-thread-utilization",RESOURCE_USAGE:"resource-usage",UTILIZATION:"utilization"}});var wg={};Oe(wg,{addAnalyticsListener:()=>ah,calculateCPUUtilization:()=>jH,diffResourceUsage:()=>QH,recordAction:()=>ot,recordActionBinary:()=>zr,recordHostname:()=>lN,setAnalyticsEnabled:()=>die});function die(e){VH=e}function fie(e,t){if(typeof e=="number"){let r=t.values,n=r.index++;if(n>=r.length){let s=r;t.values=r=new Float32Array(n*2),r.set(s),r.index=n+1}r[n]=e,t.total+=e}else if(typeof e=="boolean")e&&t.total++,t.count++;else if(typeof e=="function")t.count++;else throw new TypeError("Invalid metric value type "+typeof e)}function mie(e,t,r,n,s,i){let a={};if(typeof t=="number")a.total=t,a.values=new Float32Array(4),a.values.index=1,a.values[0]=t,a.total=t;else if(typeof t=="boolean")a.total=t?1:0,a.count=1;else if(typeof t=="function")a.count=1,a.callback=t;else throw new TypeError("Invalid metric value type "+typeof t);a.description={metric:r,path:n,method:s,type:i},Ig.set(e,a)}function ot(e,t,r,n,s){if(!VH)return;let i=t+(r?"-"+r:"");n!==void 0&&(i+="-"+n),s!==void 0&&(i+="-"+s);let a=Ig.get(i);a?fie(e,a):mie(i,e,t,r,n,s),bg||hie()}function zr(e,t,r,n,s){ot(!!e,t,r,n,s)}function ah(e){WH.push(e)}function hie(){bg=performance.now(),setTimeout(async()=>{let e=performance.now()-bg;bg=0;let t=[],r={time:Date.now(),period:e,threadId:El.threadId,metrics:t};for(let[s,i]of Ig){if(i.values){let a=i.values.subarray(0,i.values.index);a.sort();let c=a.length,l=0,u=[],d;for(let f of zH){let m=Math.floor(c*f),h=a[m-1];if(m>l){let p=m-l;if(h===d){let _=u[u.length-1];typeof _=="number"?u[u.length-1]={value:_,count:1+p}:_.count+=p}else u.push(p>1?{value:h,count:p}:h),d=h;l=m}}t.push(Object.assign(i.description,{mean:i.total/c,distribution:u,count:c}))}else i.callback?t.push(Object.assign(i.description,i.callback(i))):t.push(Object.assign(i.description,{total:i.total,count:i.count}));await JH()}let n=process.memoryUsage();t.push({metric:"memory",threadId:El.threadId,byThread:!0,...n});for(let s of WH)s(t);Ig=new Map,El.parentPort?El.parentPort.postMessage({type:YH,report:r}):ek({report:r})},KH).unref()}async function lN(){let e=Le.hostname;Wr.trace?.("recordHostname server.hostname:",e);let t=sN(e);Wr.trace?.("recordHostname nodeId:",t);let r=yg();if(!await r.get(t)){let s={id:t,hostname:e};Wr.trace?.(`recordHostname storing hostname: ${JSON.stringify(s)}`),r.put(s.id,s)}}function Ju(e,t){let r=Le.hostname,n=nN.get(r);n?Wr.trace?.("storeMetric cached nodeId:",n):(n=sN(r),Wr.trace?.("storeMetric new nodeId:",n),nN.set(r,n));let s={id:[(0,cN.getNextMonotonicTime)(),n],...t};Wr.trace?.(`storing metric ${JSON.stringify(s)}`),e.put(s.id,s)}function jH(e,t){let r=e.userCPUTime+e.systemCPUTime;return Wr.trace?.(`calculateCPUUtilization cpuTime: ${r} period: ${t}`),Math.round(r/t*100)/100}function QH(e,t){return{userCPUTime:t.userCPUTime-(e?.userCPUTime??0),systemCPUTime:t.systemCPUTime-(e?.systemCPUTime??0),minorPageFault:t.minorPageFault-(e?.minorPageFault??0),majorPageFault:t.majorPageFault-(e?.majorPageFault??0),fsRead:t.fsRead-(e?.fsRead??0),fsWrite:t.fsWrite-(e?.fsWrite??0),voluntaryContextSwitches:t.voluntaryContextSwitches-(e?.voluntaryContextSwitches??0),involuntaryContextSwitches:t.involuntaryContextSwitches-(e?.involuntaryContextSwitches??0)}}function pie(e,t,r){let n=0;for(let[s,i]of Object.entries(r)){let a=`${t}.${s}`,c=i.getSize(),l={metric:Mo.TABLE_SIZE,database:t,table:s,size:c};Wr.trace?.(`table ${a} size metric: ${JSON.stringify(l)}`),Ju(e,l),n+=c}return n}function MH(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getAuditSize();if(!i)return;let a=$H.statSync(s.primaryStore.env.path).size,c=pie(e,r,n),l=a-c,u={metric:Mo.DATABASE_SIZE,database:r,size:a,used:c,free:l,audit:i};Ju(e,u),Wr.trace?.(`database ${r} size metric: ${JSON.stringify(u)}`)}catch(s){Wr.warn?.("Error getting DB size metrics",s)}}function vH(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getStorageStats();if(!i)return;let a={metric:Mo.STORAGE_VOLUME,database:r,...i};Ju(e,a),Wr.trace?.(`db ${r} storage volume metrics: ${JSON.stringify(a)}`)}catch(s){Wr.warn?.("Error getting DB volume metrics",s)}}async function Eie(e,t=6e4){let r=uN(),n=XH(),s=new Promise(R=>{let N=performance.now();setImmediate(()=>{let C=performance.now();C-N>5e3&&Wr.warn?.("Unusually high event queue latency on the main thread of "+Math.round(C-N)+"ms"),N=performance.now()}),n.primaryStore.prefetch([1],()=>{let C=performance.now();C-N>5e3&&Wr.warn?.("Unusually high task queue latency on the main thread of "+Math.round(C-N)+"ms"),R(C-N)})}),i;for(let R of n.primaryStore.getRange({start:1/0,end:!1,reverse:!0}))if(R.value?.time){i=R.value.time;break}if(Date.now()-t<i)return;let a,c=new Map,l=new Map,u=[],d;for(let{key:R,value:N}of r.primaryStore.getRange({start:i||!1,exclusiveStart:!0,end:1/0})){if(!N)continue;if(a){if(R>a+t)break}else a=R;d=R;let{metrics:C,threadId:k}=N;for(let te of C||[]){let{path:G,method:K,type:$,metric:Y,count:ce,total:le,distribution:se,threads:he,...Ne}=te;ce||(ce=1);let Ue=Y+(G?"-"+G:"");K!==void 0&&(Ue+="-"+K),$!==void 0&&(Ue+="-"+$);let xe=c.get(Ue);if(xe){if(xe.threads){let Qt=xe.threads[k];if(Qt)xe=Qt;else{xe.threads[k]={...Ne};continue}}xe.count||(xe.count=1);let Tr=xe.count;for(let Qt in Ne){let Ht=Ne[Qt];typeof Ht=="number"&&(xe[Qt]=(xe[Qt]*Tr+Ht*ce)/(Tr+ce))}xe.count+=ce,le>=0&&(xe.total+=le,xe.ratio=xe.total/xe.count)}else xe={period:t,...te},delete xe.distribution,c.set(Ue,xe),xe.byThread&&(xe.threads=[],xe.threads[k]={...Ne},u.push(xe));if(se){se=se.map(Qt=>typeof Qt=="number"?{value:Qt,count:1}:Qt);let Tr=l.get(Ue);Tr?Tr.push(...se):l.set(Ue,se)}}await JH()}for(let R of u){let{path:N,method:C,type:k,metric:te,count:G,total:K,distribution:$,threads:Y,...ce}=R;Y=Y.filter(le=>le);for(let le in ce){if(typeof R[le]!="number")continue;let se=0;for(let he of Y){let Ne=he[le];typeof Ne=="number"&&(se+=Ne)}R[le]=se}R.count=Y.length,delete R.threads,delete R.byThread}for(let[R,N]of l){let C=c.get(R);N.sort((Qt,Ht)=>Qt.value>Ht.value?1:-1);let k=C.count-1,te=[],G=0,K=0,$;for(let Qt of zH){let Ht=k*Qt;for(;G<Ht;)$=N[K++],G+=$.count,K===1&&G--;let Jt=N[K>1?K-2:0];$||($=N[0]),te.push($.value-($.value-Jt.value)*(G-Ht)/$.count)}let[Y,ce,le,se,he,Ne,Ue,xe,Tr]=te;Object.assign(C,{p1:Y,p10:ce,p25:le,median:se,p75:he,p90:Ne,p95:Ue,p99:xe,p999:Tr})}let f;for(let[,R]of c)R.time=d,Ju(n,R),f=!0;let m=Date.now(),{idle:h,active:p}=performance.eventLoopUtilization();if(f||p*10>h){let R={metric:Mo.MAIN_THREAD_UTILIZATION,idle:h-UH,active:p-xH,taskQueueLatency:await s,time:m,...process.memoryUsage()};Ju(n,R)}UH=h,xH=p;let _=process.resourceUsage();_.time=m,_.userCPUTime=_.userCPUTime/1e3,_.systemCPUTime=_.systemCPUTime/1e3,Wr.trace?.(`process.resourceUsage: ${JSON.stringify(_)}`);let g=QH(Ag,_);Wr.trace?.(`diffed resourceUsage: ${JSON.stringify(g)}`),g.time=m,g.period=Ag.time?m-Ag.time:t,g.cpuUtilization=jH(g,g.period);let y={metric:Mo.RESOURCE_USAGE,...g};Ju(n,y),Ag=_;let T=it();MH(n,T),MH(n,{system:T.system}),vH(n,T),vH(n,{system:T.system})}async function BH(e,t){let r=Date.now()-t;for(let n of e.primaryStore.getKeys({start:!1,end:r}))e.primaryStore.remove(n)}function uN(){return FH||(FH=Qe({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function XH(){return HH||(HH=Qe({table:"hdb_analytics",database:"system",audit:!0,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]}))}function Sie(){ZH=!0;let e=(0,oh.get)(U.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await Eie(KH,e),await BH(uN(),_ie),await BH(XH(),gie)},Math.min(e/2,2147483647)).unref()}function ek(e,t){let r=e.report;r.threadId=t?.threadId||El.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(kH+=n.mean*n.count);r.totalBytesProcessed=kH,t&&(r.metrics.push({metric:Mo.UTILIZATION,...t.performance.eventLoopUtilization(GH.get(t))}),GH.set(t,t.performance.eventLoopUtilization())),r.id=(0,cN.getNextMonotonicTime)(),uN().primaryStore.put(r.id,r),ZH||Sie(),Tie&&(tk=yie(r))}async function yie(e){if(await tk,!Ga){let r=(0,ih.dirname)((0,Ng.getLogFilePath)());try{Ga=await(0,aN.open)((0,ih.join)(r,"analytics.log"),"r+")}catch{Ga=await(0,aN.open)((0,ih.join)(r,"analytics.log"),"w+")}}let t=(await Ga.stat()).size;if(t>Rie){let r=Buffer.alloc(t);await Ga.read(r,{position:0}),r=r.subarray(r.indexOf(10,r.length/2)+1),await Ga.write(r,{position:0}),await Ga.truncate(r.length),t=r.length}await Ga.write(JSON.stringify(e)+`
|
|
15
|
-
`,t)}var El,qH,Ng,ih,aN,cN,oh,$H,Wr,Ig,VH,bg,KH,YH,WH,zH,UH,xH,Ag,JH,_ie,gie,FH,HH,ZH,kH,GH,Tie,tk,Ga,Rie,Wi=ue(()=>{El=require("worker_threads"),qH=w(st());De();Ng=w(Q()),ih=require("path"),aN=require("fs/promises"),cN=w(bn()),oh=w(oe());H();Mr();$H=w(require("node:fs"));iN();oN();Wr=(0,Ng.forComponent)("analytics").conditional;(0,oh.initSync)();Ig=new Map,VH=(0,oh.get)(U.ANALYTICS_AGGREGATEPERIOD)>-1;o(die,"setAnalyticsEnabled");o(fie,"recordExistingAction");o(mie,"recordNewAction");o(ot,"recordAction");Le.recordAnalytics=ot;o(zr,"recordActionBinary");bg=0,KH=1e3,YH="analytics-report",WH=[];o(ah,"addAnalyticsListener");zH=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];o(hie,"sendAnalytics");o(lN,"recordHostname");o(Ju,"storeMetric");o(jH,"calculateCPUUtilization");o(QH,"diffResourceUsage");o(pie,"storeTableSizeMetrics");o(MH,"storeDBSizeMetrics");o(vH,"storeVolumeMetrics");o(Eie,"aggregation");UH=0,xH=0,Ag={userCPUTime:0,systemCPUTime:0},JH=o(()=>new Promise(setImmediate),"rest");o(BH,"cleanup");_ie=36e5,gie=31536e6;o(uN,"getRawAnalyticsTable");o(XH,"getAnalyticsTable");(0,qH.setChildListenerByType)(YH,ek);o(Sie,"startScheduledTasks");kH=0,GH=new Map,Tie=!1;o(ek,"recordAnalytics");Rie=1e6;o(yie,"logAnalytics")});function ch(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 rk(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new Os(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 Os,lh=ue(()=>{Os=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(ch,"appendHeader");o(rk,"mergeHeaders")});function Og(e,t,r=bie){let n;return function(...i){return n?n.length*dN>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();dN=(dN*4+c-i)/5;let l=n.shift();if(l){let{args:u,fn:d}=l;d(),s(c,u)}else n=null})}}var ik,Aie,bie,nk,Iie,fN,sk,dN,mN=ue(()=>{ik=w(Zs()),Aie=3e3,bie=2e4,nk=0,Iie=3e4,fN=3e3,sk=performance.now()+fN,dN=0;o(Og,"throttle");setInterval(()=>{let e=performance.now();e-sk-fN>Aie&&nk+Iie<e&&(ik.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"),nk=e),sk=e},fN).unref()});var pk={};Oe(pk,{EVICTED:()=>Pa,INVALIDATED:()=>wn,coerceType:()=>Pg,makeTable:()=>Dg});function Dg(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:h}=e,{expirationMS:p,evictionMS:_,audit:g,trackDeletes:y}=e;_??=0;let{attributes:T}=e;T||(T=[]);let R=qA(i,n,l),N,C,k={},te=Promise.resolve(),G,K,$;for(let V of T)(V.assignCreatedTime||V.name==="__createdtime__")&&(G=V),(V.assignUpdatedTime||V.name==="__updatedtime__")&&(K=V),V.expiresAt&&($=V),V.isPrimaryKey&&(k=V);let Y,ce=[],le=[],se=1,he=2,Ne={},Ue={},xe=864e5,Tr=0,Qt,Ht,Jt,Df=!1,wc,kt,Mf,vf=gl.get(U.REPLICATION_DATABASES);if(Array.isArray(vf)){for(let V of vf)if(V.name===c&&V.replicateTo>=0){Mf=V.replicateTo;break}}let AE=i.getRange({start:!1,end:!1}).constructor,bE=10,Py=6;g&&Ff(),fm(i.env.path,V=>{if(C)return Ta(V)});class Uf extends nl{static{o(this,"Updatable")}getUpdatedTime(){return Oa.get(this.getRecord())?.version}getExpiresAt(){return Oa.get(this.getRecord())?.expiresAt}addTo(E,S){if(typeof S=="number"||typeof S=="bigint")this.set(E,new $m(S));else throw new Error("Can not add or subtract a non-numeric value")}subtractFrom(E,S){return this.addTo(E,-S)}}class Pe extends Ur{#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=T;static replicate=h;static sealed=f;static splitSegments=m??!0;static createdTimeProperty=G;static updatedTimeProperty=K;static propertyResolvers;static userResolvers={};static sources=[];static getResidencyById;static get expirationMS(){return p}static dbisDB=d;static schemaDefined=u;static sourcedFrom(E,S){if(S&&(this.sourceOptions=S,(S.expiration||S.eviction||S.scanInterval)&&this.setTTLExpiration(S)),S?.intermediateSource)E.intermediateSource=!0,this.sources.unshift(E);else{if(this.sources.some(O=>!O.intermediateSource)){if(this.sources.some(O=>O.name===E.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(E)}C=C||E.get&&(!E.get.reliesOnPrototype||E.prototype.get),N=N||E.load;let A=o(O=>{let D=this.sources;if(D=D.filter(F=>F.intermediateSource&&F[O]&&(!F[O].reliesOnPrototype||F.prototype[O])),D.length>0)if(D.length===1){let F=D[0];return(L,x,z)=>{if(L?.source!==F)return F[O](x,z,L)}}else return(F,L,x)=>{let z=[];for(let ne of D){if(F?.source===ne)break;z.push(ne[O](L,x,F))}return Promise.all(z)}},"getApplyToIntermediateSource"),b=this.sources[this.sources.length-1];b.intermediateSource&&(b={});let I=o(O=>{if(b[O]&&(!b[O].reliesOnPrototype||b.prototype[O]))return(D,F,L)=>{if(!D?.source)return b[O](F,L,D)}},"getApplyToCanonicalSource");Ne={put:I("put"),patch:I("patch"),delete:I("delete"),publish:I("publish")},Ue={put:A("put"),patch:A("patch"),delete:A("delete"),publish:A("publish"),invalidate:A("invalidate")};let P=b.shouldRevalidateEvents;return(async()=>{let O=!1,D,F=o(async(L,x)=>{let z=L.value,ne=L.table?ke[c][L.table]:Pe;if(c===$f&&(L.table===hu.ROLE_TABLE_NAME||L.table===hu.USER_TABLE_NAME)&&(O=!0),L.id===void 0&&(L.id=z[ne.primaryKey],L.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(L));L.source=E;let re={residencyId:Pc(L.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:L.nodeId,async:!0},B=L.id,de=await ne.getResource(B,x,re);switch(L.finished&&await L.finished,L.type){case"put":return P?de._writeInvalidate(B,z,re):de._writeUpdate(B,z,!0,re);case"patch":return P?de._writeInvalidate(B,z,re):de._writeUpdate(B,z,!1,re);case"delete":return de._writeDelete(B,re);case"publish":case"message":return de._writePublish(B,z,re);case"invalidate":return de._writeInvalidate(B,z,re);case"relocate":return de._writeRelocate(B,re);default:Me.default.error?.("Unknown operation",L.type,L.id)}},"writeUpdate");try{let L=E.subscribe;L&&y==null&&(y=!0);let x={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},z=E.subscribeOnThisThread?E.subscribeOnThisThread((0,_l.getWorkerIndex)(),x):(0,_l.getWorkerIndex)()===0,ne=L&&z&&await E.subscribe?.(x);if(ne){let re;for await(let B of ne)try{if(!(B.type==="transaction"?B.writes[0]:B)){Me.default.error?.("Bad subscription event",B);continue}if(B.source=E,B.type==="end_txn"){if(re?.resolve(),B.localTime&&D!==B.localTime){if(B.remoteNodeIds?.length>0){let me=[Symbol.for("seq"),B.remoteNodeIds[0]],Z=d.get(me),j=Z?.nodes;j||(j=[]);for(let _e of B.remoteNodeIds.slice(1)){let pe=j.find(ft=>ft.id===_e);j=j.filter(ft=>ft.id!==_e||ft===pe),pe||(pe={id:_e,seqId:0},j.push(pe)),pe.seqId=Math.max(Z?.seqId??1,B.localTime),_e===re?.nodeId&&(pe.lastTxnTime=B.timestamp)}let Te=Math.max(Z?.seqId??1,B.localTime);Me.default.trace?.("Received txn",c,Te,new Date(Te),B.localTime,new Date(B.localTime),B.remoteNodeIds),d.put(me,{seqId:Te,nodes:j})}D=B.localTime}B.onCommit&&re?.committed.then(B.onCommit);continue}if(re)if(B.beginTxn)re.resolve();else{re.write_promises.push(F(B,re));continue}!B.timestamp&&B.version&&(B.timestamp=B.version);let fe=Ut(B,()=>{if(B.type==="transaction"){let me=[];for(let Z of B.writes)try{me.push(F(Z,B))}catch(j){throw j.message+=" writing "+JSON.stringify(Z)+" of event "+JSON.stringify(B),j}return Promise.all(me)}else if(B.type==="define_schema"){let me=this.attributes.slice(0),Z=!1;for(let j of B.attributes)me.find(Te=>Te.name===j.name)||(me.push(j),Z=!0);Z&&(Qe({table:s,database:c,attributes:me,origin:"cluster"}),dh.signalSchemaChange(new fh.SchemaEventMsg(process.pid,q.CREATE_TABLE,c,s)))}else return B.beginTxn?(re=B,re.write_promises=[F(B,B)],new Promise(me=>{re.resolve=()=>me(Promise.all(re.write_promises))})):F(B,B)});re&&(re.committed=fe),O&&fe&&!fe?.waitingForUserChange&&(fe.then(()=>dh.signalUserChange(new fh.UserEventMsg(process.pid))),fe.waitingForUserChange=!0),B.onCommit&&(fe?fe.then(B.onCommit):B.onCommit())}catch(de){Me.default.error?.("error in subscription handler",de)}}}catch(L){Me.default.error?.(L)}})(),this}static get isCaching(){return C}static get shouldRevalidateEvents(){return this.prototype.get!==Pe.prototype.get}static getResource(E,S,A){let b=super.getResource(E,S,A);if(this.loadAsInstance===!1&&(S._freezeRecords=!0),E!=null&&this.loadAsInstance!==!1){Lr(E);try{if(b.getRecord?.())return b;if(typeof E=="object"&&E&&!Array.isArray(E))throw new Error(`Invalid id ${JSON.stringify(E)}`);let I=!A?.async||i.cache?.get?.(E),P=Dr(S),O=P.getReadTxn();if(O?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return Ea(E,S,{transaction:O,ensureLoaded:A?.ensureLoaded},I,D=>{if(D?Pe._updateResource(b,D):b.#e=null,S.onlyIfCached){if(!b.doesExist())throw new at.ServerError("Entry is not cached",504)}else if(A?.ensureLoaded){let F=Oc(E,D,S,b);if(F)return P?.disregardReadTxn(),b.#i=!0,S.loadedFromSource=!0,Cs(F,L=>(Pe._updateResource(b,L),b))}return b})}catch(I){throw I.message.includes("Unable to serialize object")&&(I.message+=": "+JSON.stringify(E)),I}}return b}static _updateResource(E,S){E.#n=S,E.#e=S?.value??null,E.#r=S?.version}ensureLoaded(){let E=Oc(this.getId(),this.#n,this.getContext());if(E)return this.#i=!0,this.getContext().loadedFromSource=!0,Cs(E,S=>{this.#n=S,this.#e=S.value,this.#r=S.version})}static getNewId(){let E=k?.type;if(E==="String"||E==="ID")return super.getNewId();if(!kt){let I=i.getEntry(Symbol.for("id_allocation")),P=I?.value,O;if(P&&P.nodeName===server.hostname&&(!xie(i)||P.pid===process.pid)){let D=P.start,F=P.end;O=D;for(let L of i.getKeys({start:F,end:D,limit:1,reverse:!0}))O=L}else P=b(I?.version??null),O=P.start;kt=new BigInt64Array([BigInt(O)+1n]),kt=new BigInt64Array(i.getUserSharedBuffer("id",kt.buffer)),kt.maxSafeId=P.end}let S=Number(Atomics.add(kt,0,1n)),A=E==="Int"?512:1048576;if(S+A>=kt.maxSafeId){let I=o(P=>{kt.maxSafeId=S+(E==="Int"?1023:4194303);let O=(E==="Int"?Math.pow(2,31):Math.pow(2,49))-1,D=P?void 0:i.useReadTransaction(),F=Number(kt[0]);for(let z of i.getKeys({start:F+1,end:O,limit:1,transaction:D}))O=z;D?.done();let{value:L,version:x}=i.getEntry(Symbol.for("id_allocation"));if(kt.maxSafeId<O){if(L.end>kt.maxSafeId-100)return;Me.default.info?.("New id allocation",S,kt.maxSafeId,x),i.put(Symbol.for("id_allocation"),{start:L.start,end:kt.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),x)}else{Me.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${kt.maxSafeId}, but id of ${O} detected`);let z=b(x);z.alreadyUpdated||Atomics.store(kt,0,BigInt(z.start+1)),kt.maxSafeId=z.end}},"updateEnd");S+A===kt.maxSafeId?setImmediate(I):S+100>=kt.maxSafeId&&(Me.default.warn?.(`Synchronous id allocation required on table ${s}${E=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>I(!0)))}return S;function b(I){let P=(E==="Int"?Math.pow(2,31):Math.pow(2,49))-1,O=P/4,D,F,L=!1,x,z;do{x=Math.floor(Math.random()*P),z={start:x,end:x+(E==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},D=0;for(let ne of i.getKeys({start:x,limit:1,reverse:!0}))D=ne;F=P;for(let ne of i.getKeys({start:x+1,end:P,limit:1}))F=ne;O*=.875,O<1e3&&!L&&(L=!0,Me.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${E==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,x,D,F,O))}while(!(O<F-x&&(O<x-D||D===0)));return i.transactionSync(()=>{let ne=i.getEntry(Symbol.for("id_allocation"));return(ne?.version??null)==I?(Me.default.info?.("Allocated new id range",z),i.put(Symbol.for("id_allocation"),z,Date.now()),z):(Me.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...ne.value})})}}static setTTLExpiration(E){if(typeof E=="number")p=E*1e3,_||(_=0);else if(E&&typeof E=="object")p=E.expiration*1e3,_=(E.eviction||0)*1e3,xe=E.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(p<0)throw new Error("Expiration can not be negative");xe=xe||(p+_)/4,Ta()}static getResidencyRecord(E){return d.get([Symbol.for("residency_by_id"),E])}static setResidency(E){Pe.getResidency=E&&((S,A)=>{try{return E(S,A)}catch(b){throw b.message+=` in residency function for table ${s}`,b}})}static setResidencyById(E){Pe.getResidencyById=E&&(S=>{try{return E(S)}catch(A){throw A.message+=` in residency function for table ${s}`,A}})}static getResidency(E,S){if(Pe.getResidencyById)return Pe.getResidencyById(E[t]);let A=Mf;if(S.replicateTo!=null){if(Array.isArray(S.replicateTo))return S.replicateTo.includes(server.hostname)?S.replicateTo:[server.hostname,...S.replicateTo];S.replicateTo>=0&&(A=S.replicateTo)}if(A>=0&&server.nodes){let b=[server.hostname];if(S.previousResidency)b.push(...S.previousResidency.slice(0,A));else{let I=server.nodes.map(D=>D.name),P=Math.floor(I.length*Math.random());b.push(...I.slice(P,P+A));let O=P+A-I.length;O>0&&b.push(...I.slice(0,O))}return b}}static enableAuditing(E=!0){g=E,E&&Ff(),Pe.audit=E}static coerceId(E){return E===""?null:Pg(E,k)}static async dropTable(){delete ke[c][s];for(let E of i.getRange({versions:!0,snapshot:!1,lazy:!0}))E.metadataFlags&Vr&&E.value&&Na(E.value);if(c===a){for(let E of T)d.remove(Pe.tableName+"/"+E.name),r[E.name]?.drop();d.remove(Pe.tableName+"/"),i.drop(),await d.committed}else console.log("legacy dropTable"),await i.close(),pN.default.unlinkSync(i.env.path);dh.signalSchemaChange(new fh.SchemaEventMsg(process.pid,q.DROP_TABLE,c,s))}get(E){let S=this.constructor;if(typeof E=="string"&&S.loadAsInstance!==!1)return this.getProperty(E);if(Bf(E))return this.search(E);if(E&&E.id===void 0&&!E.toString()){let A={records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:T,recordCount:void 0,estimatedRecordRange:void 0};return this.getContext()?.includeExpensiveRecordCountEstimates?Pe.getRecordCount().then(b=>(A.recordCount=b.recordCount,A.estimatedRecordRange=b.estimatedRange,A)):A}if(E!==void 0&&S.loadAsInstance===!1){let A=this.getContext(),b=Dr(A),I=b.getReadTxn();if(I?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");let P=Rr(E);Lr(P);let O=!0;return E.checkPermission&&(O=this.allowRead(A.user,E)),Cs(Cs(O,D=>{if(!D)throw new at.AccessViolation(A.user);let F=!0;return Ea(P,A,{transaction:I,ensureLoaded:F},!1,L=>{if(A.onlyIfCached){if(!L?.value)throw new at.ServerError("Entry is not cached",504)}else if(F){let x=Oc(P,L,A);if(x)return b?.disregardReadTxn(),A.loadedFromSource=!0,x.then(z=>z?.value)}return L?.value})}),D=>{let F=E?.select;return F&&D!=null?Du(F,this.constructor)(D):D})}if(E?.property)return this.getProperty(E.property);if(this.doesExist()||E?.ensureLoaded===!1||this.getContext()?.returnNonexistent)return this}allowRead(E,S){let A=_a(E,S);if(A?.read){if(A.isSuperUser)return!0;let b=A.attribute_permissions,I=S?.select;if(b?.length>0||Df&&I){if(S||(S={}),I){let P=b?.length>0&&hN(b,"read");S.select=I.map(O=>{let D=O.name||O;if(!P||P[D]){let F=Jt[D]?.definition?.tableClass;if(F){if(O.name||(O={name:O}),!O.checkPermission&&S.checkPermission&&(O.checkPermission=S.checkPermission),!F.prototype.allowRead.call(null,E,O))return!1;if(!O.select)return O.name}return O}}).filter(Boolean)}else S.select=b.filter(P=>P.read&&!Jt[P.attribute_name]).map(P=>P.attribute_name);return S}else return!0}}allowUpdate(E,S,A){let b=_a(E,A);if(b?.update){let I=b.attribute_permissions;if(I?.length>0){let P=hN(I,"update");for(let O in S)if(!P[O])return!1;for(let O of I){let D=O.attribute_name;!O.update&&!(D in S)&&(S[D]=this.getProperty(D))}}return Sa(this.getContext())}}allowCreate(E,S,A){if(this.isCollection){let b=_a(E,A);if(b?.insert){let I=b.attribute_permissions;if(I?.length>0){let P=hN(I,"insert");for(let O in S)if(!P[O])return!1;return Sa(this.getContext())}else return Sa(this.getContext())}}else return this.allowUpdate(E,{})}allowDelete(E,S){return _a(E,S)?.delete&&Sa(this.getContext())}update(E,S){let A,b=typeof S=="boolean"||S===void 0&&(E==null||typeof E=="object"&&!(E instanceof URLSearchParams)),I=!1;b?(I=S,S=E,A=this.getId()):A=Rr(E);let P=this.getContext();if(!Dr(P))throw new Error("Can not update a table resource outside of a transaction");if(S===!1)return this;if(typeof S=="object"&&S)if(I)Object.isFrozen(S)&&(S={...S}),this.#e={},this.#t=S;else if(b){let D=this.#t;D&&(S=Object.assign(D,S)),this.#t=S}else{let D=!0;if(E==null)throw new TypeError("Can not put a record without a target");return E.checkPermission&&(D=this.allowUpdate(P.user,S,E)),Cs(D,F=>{if(!F)throw new at.AccessViolation(P.user);return Cs(i.get(Rr(E)),L=>{let x=new Uf(L);return x._setChanges(S),this._writeUpdate(A,x.getChanges(),!1),x})})}return this._writeUpdate(A,this.#t,I),this}addTo(E,S){if(typeof S=="number"||typeof S=="bigint")this.#s===ak?this.set(E,(+this.getProperty(E)||0)+S):(this.#s||this.update(),this.set(E,new $m(S)));else throw new Error("Can not add a non-numeric value")}subtractFrom(E,S){if(typeof S=="number")return this.addTo(E,-S);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this.#n}getRecord(){return this.#e}getChanges(){return this.#t}_setChanges(E){this.#t=E}setRecord(E){this.#e=E}invalidate(E){let S=!0,A=this.getContext();return E?.checkPermission&&(S=this.allowDelete(A.user,E,A)),Cs(S,b=>{if(!b)throw new at.AccessViolation(A.user);this._writeInvalidate(E?Rr(E):this.getId())})}_writeInvalidate(E,S,A){let b=this.getContext();Lr(E),Dr(this.getContext()).addWrite({key:E,store:i,invalidated:!0,entry:this.#n,before:Ne.invalidate?.bind(this,b,E),beforeIntermediate:Ra(S,Ue.invalidate?.bind(this,b,E)),commit:o((P,O)=>{if(!(ga(P,O,A?.nodeId)<=0)){S??=null;for(let D in r)S||(S={}),S[D]===void 0&&(S[D]=this.getProperty(D));Me.default.trace?.(`Invalidating entry in ${s} id: ${E}, timestamp: ${new Date(P).toISOString()}`),R(E,S,O,P,wn,g,{user:b?.user,residencyId:A?.residencyId,nodeId:A?.nodeId},"invalidate")}},"commit")})}_writeRelocate(E,S){let A=this.getContext();Lr(E),Dr(this.getContext()).addWrite({key:E,store:i,invalidated:!0,entry:this.#n,before:Ne.relocate?.bind(this,A,E),beforeIntermediate:Ue.relocate?.bind(this,A,E),commit:o((I,P)=>{if(ga(I,P,S?.nodeId)<=0)return;let O=Pe.getResidencyRecord(S.residencyId),D=0,F=null,L=P?.value;if(O&&!O.includes(server.hostname)){for(let x in r)F||(F={}),F[x]=L[x];D=wn}else F=L;Me.default.trace?.(`Relocating entry id: ${E}, timestamp: ${new Date(I).toISOString()}`),R(E,F,P,I,D,g,{user:A.user,residencyId:S.residencyId,nodeId:S.nodeId,expiresAt:S.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(E,S){let A={previousResidency:this.getResidencyRecord(E.residencyId),isRelocation:!0},b=Cc(this.getResidency(S.value,A)),I;if(b){if(!b.includes(server.hostname))return!1;I=Pc(b)}let P=0;Me.default.debug?.("Performing a relocate of an entry",existing_entry.key,S.value,b);let O=R(E.key,S.value,E,E.version,P,!0,{residencyId:I,expiresAt:S.expiresAt},"relocate",!1,null);return!0}static evict(E,S,A){let b=this.Source,I;if(!((C||g)&&(!S||(I=i.getEntry(E),!I||!S)||I.version!==A))){if(C){if(i.hasLock(E,I.version))return;let P;for(let O in r)P||(P={}),P[O]=S[O];if(P)return R(E,P,I,A,Pa,null,null,null,!0)}if(i.ifVersion(E,A,()=>{ho(E,S,null)}),g)return R(E,null,I,A,Pa,null,null,null,!0);Wc(i,I??i.getEntry(E),A)}}lock(){throw new Error("Not yet implemented")}static operation(E,S){return E.table||=s,E.schema||=c,global.operation(E,S)}put(E,S){if(S===void 0||S instanceof URLSearchParams)this.update(E,!0);else{let A=!0;if(E==null)throw new TypeError("Can not put a record without a target");let b=this.getContext();return E.checkPermission&&(A=this.allowUpdate(b.user,S,E)),Cs(A,I=>{if(!I)throw new at.AccessViolation(b.user);if(Array.isArray(S))for(let P of S){let O=P[t];this._writeUpdate(O,P,!0)}else{let P=Rr(E);this._writeUpdate(P,S,!0)}})}}create(E,S){let A=!0,b=this.getContext();if(!S&&!(E instanceof URLSearchParams)&&(S=E,E=void 0),!S||typeof S!="object"||Array.isArray(S))throw new TypeError("Can not create a record without an object");return E?.checkPermission&&(A=this.allowCreate(b.user,S,E)),Cs(A,I=>{if(!I)throw new at.AccessViolation(b.user);let P=Rr(E)??S[t];if(P===void 0)P=this.constructor.getNewId();else if(i.get(P))throw new at.ClientError("Record already exists",409);return this._writeUpdate(P,S,!0),S})}patch(E,S){if(S===void 0||S instanceof URLSearchParams)this.update(E,!1);else{let A=this.update(E,S);if(A?.then)return A.then(()=>{})}}_writeUpdate(E,S,A,b){let I=this.getContext(),P=Dr(I);Lr(E);let O=this.#n??i.getEntry(E);this.#s=A?ak:Die;let D=o(L=>A?L.put?()=>L.put(I,E,S):null:L.patch?()=>L.patch(I,E,S):L.put?()=>L.put(I,E,sl(this)):null,"writeToSources"),F={key:E,store:i,entry:O,nodeName:I?.nodeName,validate:o(L=>{S||(S=this.#t),A||S&&J_(this.#t===S?this:S)?I?.source||(P.checkOverloaded(),this.validate(S,!A),K&&(S[K.name]=K.type==="Date"?new Date(L):K.type==="String"?new Date(L).toISOString():L),A&&(t&&S[t]!==E&&(S[t]=E),G&&(O?.value?S[G.name]=O?.value[G.name]:S[G.name]=G.type==="Date"?new Date(L):G.type==="String"?new Date(L).toISOString():L),S=sl(S))):P.removeWrite(F)},"validate"),before:D(Ne),beforeIntermediate:Ra(S,D(Ue)),commit:o((L,x,z)=>{if(z){if(I&&x?.version>(I.lastModified||0)&&(I.lastModified=x.version),this.#n=x,x?.value&&x.value.getRecord)throw new Error("Can not assign a record to a record, check for circular references");A||(this.#e=x?.value??null)}this.#t=void 0,this.#r=L;let ne=x?.value,re=S;this.#s=0;let B=!1,de=ga(L,x,b?.nodeId),fe;if(de<=0){if(g){let _e=x.localTime,pe=x.version;Me.default.trace?.("Applying CRDT update to record with id: ",E,"txn time",new Date(L),"applying later update from:",new Date(pe),"local recorded time",new Date(_e));let ft=[];for(;_e>L||pe>=L&&_e>0;){let et=l.get(_e);if(!et)break;let tt=At(et);if(pe=tt.version,pe>=L){if(pe===L){if(de=ga(L,{version:pe,localTime:_e},b?.nodeId),de===0)return;if(de>0)continue}if(tt.type==="patch")ft.push(tt),fe=S;else if(tt.type==="put"||tt.type==="delete")return}_e=tt.previousLocalTime}_e||Me.default.debug?.("No further audit history, applying incremental updates based on available history",E,"existing version preserved",x),ft.sort((et,tt)=>et.version-tt.version);for(let et of ft){let tt=et.getValue(i);if(Me.default.debug?.("Rebuilding update with future patch:",new Date(et.version),tt,et),re=WE(re,tt,A),!re)return}}else{if(A)return;re=WE(re,ne,A),Me.default.debug?.("Rebuilding update without audit:",re)}Me.default.trace?.("Rebuilt record to save:",re," is full update:",A)}let me;if(A?me=re:this.constructor.loadAsInstance===!1?me=sl(ne,re):(this.#e=ne,me=sl(this,re)),this.#e=me,me&&me.getRecord)throw new Error("Can not assign a record to a record, check for circular references");let Z;if(b?.residencyId!=null)Z=b.residencyId;else{O?.residencyId&&(I.previousResidency=Pe.getResidencyRecord(O.residencyId));let _e=Cc(Pe.getResidency(me,I));if(_e&&!_e.includes(server.hostname))if(fe??=me,B=!0,Pe.getResidencyById)me=void 0;else{me=null;for(let pe in r)me||(me={}),me[pe]=fe[pe]}Z=Pc(_e)}A||(fe=S);let j=I?.expiresAt??(p?p+Date.now():-1);Me.default.trace?.(`Saving record with id: ${E}, timestamp: ${new Date(L).toISOString()}${j?", expires at: "+new Date(j).toISOString():""}${x?", replaces entry from: "+new Date(x.version).toISOString():", new entry"}`,(()=>{try{return JSON.stringify(me).slice(0,100)}catch{return""}})()),ho(E,ne,me);let Te=A?"put":"patch";R(E,me,x,L,B?wn:0,g,{omitLocalRecord:B,user:I?.user,residencyId:Z,expiresAt:j,nodeId:b?.nodeId,originatingOperation:I?.originatingOperation},Te,!1,fe),I.expiresAt&&Ta()},"commit")};P.addWrite(F)}async delete(E){if(Bf(E)){E.select=["$id"];for await(let S of this.search(E))this._writeDelete(S.$id);return!0}if(E){let S=!0,A=this.getContext();return E.checkPermission&&(S=this.allowDelete(A.user,E,A)),Cs(S,b=>{if(!b)throw new at.AccessViolation(A.user);let I=Rr(E);return this._writeDelete(I),!0})}return this._writeDelete(this.getId()),!!this.#e}_writeDelete(E,S){let A=Dr(this.getContext());Lr(E);let b=this.getContext();return A.addWrite({key:E,store:i,entry:this.#n,nodeName:b?.nodeName,before:Ne.delete?.bind(this,b,E),beforeIntermediate:Ue.delete?.bind(this,b,E),commit:o((I,P,O)=>{let D=P?.value;O&&(b&&P?.version>(b.lastModified||0)&&(b.lastModified=P.version),Pe._updateResource(this,P)),!(ga(I,P,S?.nodeId)<=0)&&(ho(this.getId(),D),Me.default.trace?.(`Deleting record with id: ${E}, txn timestamp: ${new Date(I).toISOString()}`),g||y?(R(E,null,P,I,0,g,{user:b?.user,nodeId:S?.nodeId},"delete"),g||Ta()):Wc(i,P))},"commit")}),!0}search(E){let S=this.getContext(),A=Dr(S);if(!E)throw new Error("No query provided");if(E.parseError)throw E.parseError;if(E.checkPermission&&!this.allowRead(S.user,E))throw new at.AccessViolation(S.user);let b=E.conditions;b?b.length===void 0&&(b=b[Symbol.iterator]?Array.from(b):[b]):b=Array.isArray(E)?E:E[Symbol.iterator]?Array.from(E):[];let I=E.id??this.getId();I&&(b=[{attribute:null,comparator:Array.isArray(I)?"prefix":"starts_with",value:I}].concat(b));let P,O={};function D(j,Te){let _e;switch(Te){case"and":case void 0:if(j.length<1)throw new Error('An "and" operator requires at least one condition');_e=!0;break;case"or":if(j.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+Te)}for(let pe of j){if(pe.conditions){pe.conditions=D(pe.conditions,pe.operator);continue}let ft=pe[0]??pe.attribute,et=ft==null?k:xi(T,ft);if(et)(et.type||VA[pe.comparator])&&(pe[1]===void 0?pe.value=L(pe.value,et):pe[1]=L(pe[1],et));else if(ft!=null)throw(0,at.handleHDBError)(new Error,`${ft} is not a defined attribute`,404);if(pe.chainedConditions)if(pe.chainedConditions.length===1&&(!pe.operator||pe.operator=="and")){let tt=pe.chainedConditions[0],Se,rt;if(tt.comparator==="gt"||tt.comparator==="greater_than"||tt.comparator==="ge"||tt.comparator==="greater_than_equal"?(Se=pe,rt=tt):(Se=tt,rt=pe),Se.comparator!=="lt"&&Se.comparator!=="less_than"&&Se.comparator!=="le"&&Se.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let nt=rt.comparator==="ge"||rt.comparator==="greater_than_equal",ar=Se.comparator==="le"||Se.comparator==="less_than_equal";pe.comparator=(nt?"ge":"gt")+(ar?"le":"lt"),pe.value=[rt.value,Se.value]}else throw new Error("Multiple chained conditions are not currently supported")}return j}o(D,"prepareConditions");function F(j,Te){if(E.enforceExecutionOrder)return j;for(let _e of j)_e.conditions&&(_e.conditions=F(_e.conditions,_e.operator));return j.length>1&&Te!=="or"?Nie(j,b_(Pe)):j}o(F,"orderConditions");function L(j,Te){return Array.isArray(j)?j.map(_e=>Pg(_e,Te)):Pg(j,Te)}o(L,"coerceTypedValues");let x=E.operator;(b.length>0||x)&&(b=D(b,x));let z=typeof E.sort=="object"&&E.sort,ne;if(z&&x!=="or"){let j=z.attribute;if(j==null)throw new at.ClientError("Sort requires an attribute");if(P=b.find(Te=>Cu(Te.attribute)===Cu(j)),!P){let Te=xi(T,j);if(!Te)throw(0,at.handleHDBError)(new Error,`${Array.isArray(j)?j.join("."):j} is not a defined attribute`,404);if(Te.indexed)P={...z,comparator:"sort"},b.push(P);else if(b.length===0&&!E.allowFullScan)throw(0,at.handleHDBError)(new Error,`${Array.isArray(j)?j.join("."):j} is not indexed and not combined with any other conditions`,404)}P&&(P.descending=!!z.descending)}b=F(b,x),z&&(P&&b[0]===P?z.next&&(ne={dbOrderedAttribute:z.attribute,attribute:z.next.attribute,descending:z.next.descending,next:z.next.next}):(P&&b.splice(b.indexOf(P),1),ne=z));let re=E.select;if(b.length===0&&(b=[{attribute:t,comparator:"greater_than",value:!0}]),E.explain)return{conditions:b,operator:x,postOrdering:ne,selectApplied:!!re};let B=A.useReadTxn(),de=KA(b,x,Pe,B,E,S,(j,Te)=>du(j,re,S,B,Te),O),fe=E.ensureLoaded!==!1,me=Pe.transformEntryForSelect(re,S,B,O,fe,!0),Z=Pe.transformToOrderedSelect(de,re,ne,S,B,me);return(E.offset||E.limit!==void 0)&&(Z=Z.slice(E.offset,E.limit!==void 0?(E.offset||0)+E.limit:void 0)),Z.onDone=()=>{Z.onDone=null,A.doneReadTxn()},Z.selectApplied=!0,Z.getColumns=()=>{if(re){let j=[];for(let Te of re)Te==="*"?j.push(...T.map(_e=>_e.name)):j.push(Te.name||Te);return j}return T.filter(j=>!j.computed&&!j.relationship).map(j=>j.name)},Z}static transformToOrderedSelect(E,S,A,b,I,P){let O=new AE;if(A){E=du(E,S,b,I,null);let D;O.iterate=function(){let L,x=E[Symbol.asyncIterator]?E[Symbol.asyncIterator]():E[Symbol.iterator](),z,ne=A.dbOrderedAttribute,re,B,de=!0;function fe(Z){let j=Z.next&&fe(Z.next),Te=Z.descending;return b.sort=Z,(_e,pe)=>{let ft=uu(_e,Z.attribute,b),et=uu(pe,Z.attribute,b),tt=Te?(0,Sl.compareKeys)(et,ft):(0,Sl.compareKeys)(ft,et);return tt===0?j?.(_e,pe)||0:tt}}o(fe,"createComparator");let me=fe(A);return{async next(){let Z;if(L)if(Z=L.next(),Z.done){if(z)return O.onDone&&O.onDone(),Z}else return{value:await P.call(this,Z.value)};D=[],re&&D.push(re);do if(Z=await x.next(),Z.done){if(z=!0,D.length)break;return O.onDone&&O.onDone(),Z}else{let j=Z.value;if(j?.then&&(j=await j),ne){let Te=uu(j,ne,b);if(de)de=!1,B=Te;else if(Te!==B){B=Te,re=j;break}}D.push(j)}while(!0);return A.isGrouped,D.sort(me),L=D[Symbol.iterator](),Z=L.next(),Z.done?(O.onDone&&O.onDone(),Z):{value:await P.call(this,Z.value)}},return(){O.onDone&&O.onDone(),x.return()},throw(){O.onDone&&O.onDone(),x.throw()}}};let F=o(L=>{if(typeof S=="object"&&Array.isArray(L.attribute))for(let x=0;x<S.length;x++){let z=S[x],ne;if(z.name===L.attribute[0]){for(ne=z.sort||(z.sort={});ne.next;)ne=ne.next;ne.attribute=L.attribute.slice(1),ne.descending=L.descending}else z===L.attribute[0]&&(S[x]=ne={name:z,sort:{attribute:L.attribute.slice(1),descending:L.descending}})}L.next&&F(L.next)},"applySortingOnSelect");F(A)}else O.iterate=(E[Symbol.asyncIterator]||E[Symbol.iterator]).bind(E),O=O.map(function(D){try{let F=P.call(this,D);return typeof F?.catch=="function"?F.catch(L=>{throw L.partialObject={[t]:D.key},L}):F}catch(F){throw F.partialObject={[t]:D.key},F}});return O}static transformEntryForSelect(E,S,A,b,I,P){let O;I&&C&&!(typeof E=="string"?[E]:E)?.every(L=>{let x;return typeof L=="object"?x=L.name:x=L,r[x]||x===t})&&(O=!0);let D,F=o(function(L){let x;if(S?.transaction?.stale&&(S.transaction.stale=!1),L!=null){if(x=L.deref?L.deref():L.value,!x&&(L.key===void 0||L.deref)||L.metadataFlags&wn){if(L.metadataFlags&wn&&S.replicateFrom===!1&&P&&L.residencyId)return $a.SKIP;if(L=Ea(L.key??L,S,{transaction:A,lazy:E?.length<4,ensureLoaded:I},this?.isSync,z=>z),L?.then)return L.then(F.bind(this));x=L?.value}if(O&&L?.metadataFlags&(wn|Pa)||L?.expiresAt!=null&&L?.expiresAt<Date.now()){if(S.onlyIfCached)return{[t]:L.key,message:"This entry has expired"};let z=Oc(L.key??L,L,S);if(z?.then)return z.then(F)}}if(x==null)return P?$a.SKIP:x;if(E&&!(E[0]==="*"&&E.length===1)){let z,ne=o((B,de)=>{let fe;typeof B=="object"?fe=B.name:fe=B;let me=Jt?.[fe],Z;if(me){let j=b?.[fe];if(j)if(j.hasMappings){let _e=me.from?x[me.from]:Cu(L.key);Z=j.get(_e),Z||(Z=[])}else Z=j.fromRecord?.(x);else Z=me(x,S,L,!0);let Te=o(_e=>{if(me.directReturn)return de(_e,fe);if(_e&&typeof _e=="object"){let pe=me.definition?.tableClass||Pe;D||(D={});let ft=D[fe]||(D[fe]=pe.transformEntryForSelect(fe===B?null:B.select||(Array.isArray(B)?B:null),S,A,j,I));if(Array.isArray(_e)){let et=[],tt=pe.transformToOrderedSelect(_e,B.select,typeof B.sort=="object"&&B.sort,S,A,ft)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),Se=o(nt=>{for(;!nt.done;){if(nt?.then)return nt.then(Se);et.push(nt.value),nt=tt.next()}de(et,fe)},"nextValue"),rt=Se(tt.next());rt&&(z||(z=[]),z.push(rt));return}else if(_e=ft.call(this,_e),_e?.then){z||(z=[]),z.push(_e.then(et=>de(et,fe)));return}}de(_e,fe)},"handleResolvedValue");Z?.then?(z||(z=[]),z.push(Z.then(Te))):Te(Z);return}else Z=x[fe],Z&&typeof Z=="object"&&fe!==B&&(Z=Pe.transformEntryForSelect(B.select||B,S,A,null)({value:Z}));de(Z,fe)},"selectAttribute"),re;if(typeof E=="string")ne(E,B=>{re=B});else if(Array.isArray(E))if(E.asArray)re=[],E.forEach((B,de)=>{B==="*"?E[de]=x:ne(B,fe=>re[de]=fe)});else{re={};let B=E.forceNulls;for(let de of E)if(de==="*")for(let fe in x)re[fe]=x[fe];else ne(de,(fe,me)=>{fe===void 0&&B&&(fe=null),re[me]=fe})}else throw new at.ClientError("Invalid select"+E);return z?Promise.all(z).then(()=>re):re}return x},"transform");return F}async subscribe(E){if(!l)throw new Error("Can not subscribe to a table without an audit log");g||Qe({table:s,database:c,schemaDefined:u,attributes:T,audit:!0}),E||(E={});let S=!E.rawEvents,A=[],b=this,I=JA(Pe,this.getId()??null,function(O,D,F,L){try{let x=D.getValue?.(i,S),z=D.type;if(!x&&z==="patch"&&S){let re=i.getEntry(O);re?.version===D.version?x=re.value:x=D.getValue?.(i,!0,F),z="put"}let ne={id:O,localTime:F,value:x,version:D.version,type:z,beginTxn:L};A?A.push(ne):this.send(ne)}catch(x){Me.default.error?.(x)}},E.startTime||0,E),P=(async()=>{this.isCollection&&(I.includeDescendants=!0,E.onlyChildren&&(I.onlyChildren=!0)),E.supportsTransactions&&(I.supportsTransactions=!0);let O=this.getId(),D=E.previousCount;D>1e3&&(D=1e3);let F=E.startTime;if(this.isCollection){if(F){if(D)throw new at.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:L,value:x}of l.getRange({start:F,exclusiveStart:!0,snapshot:!1})){let z=At(x);if(z.tableId!==n)continue;let ne=z.recordId;if(O==null||dk(O,ne)){let re=z.getValue(i,S,L);if(I.send({id:ne,localTime:L,value:re,version:z.version,type:z.type}),I.queue?.length>lk&&await I.waitForDrain()===!1)return}I.startTime=L}}else if(D){let L=[];for(let{key:x,value:z}of l.getRange({start:"z",end:!1,reverse:!0}))try{let ne=At(z);if(ne.tableId!==n)continue;let re=ne.recordId;if(O==null||dk(O,re)){let B=ne.getValue(i,S,x);if(L.push({id:re,localTime:x,value:B,version:ne.version,type:ne.type}),--D<=0)break}}catch(ne){Me.default.error("Error getting history entry",x,ne)}for(let x=L.length;x>0;)I.send(L[--x]);L[0]&&(I.startTime=L[0].localTime)}else if(!E.omitCurrent){for(let{key:L,value:x,version:z,localTime:ne}of i.getRange({start:O??!1,end:O==null?void 0:[O,Sl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(x&&(I.send({id:L,localTime:ne,value:x,version:z,type:"put"}),I.queue?.length>lk&&await I.waitForDrain()===!1))return}}else{D&&!F&&(F=0);let L=this.#n?.localTime;if(L===GA&&(i.cache?.delete(O),this.#n=i.getEntry(O),Me.default.trace?.("re-retrieved record",L,this.#n?.localTime),L=this.#n?.localTime),Me.default.trace?.("Subscription from",F,"from",O,L),F<L){let x=[],z=L;do{let ne=l.get(z);if(ne){E.omitCurrent=!0;let re=At(ne),B=re.getValue(i,S,z);S&&(re.type="put"),x.push({id:O,value:B,localTime:z,...re}),z=re.previousLocalTime}else break;D&&D--}while(z>F&&D!==0);for(let ne=x.length;ne>0;)I.send(x[--ne]);I.startTime=L}!E.omitCurrent&&this.doesExist()&&I.send({id:O,localTime:L,value:this.#e,version:this.#r,type:"put"})}for(let L of A)I.send(L);A=null})();return E.listener&&I.on("data",E.listener),I}static subscribeOnThisThread(E,S){return E===0||S?.crossThreads===!1}doesExist(){return!!(this.#e||this.#s)}publish(E,S,A){if(S===void 0||S instanceof URLSearchParams)this._writePublish(this.getId(),E,S);else{let b=!0,I=this.getContext();return E.checkPermission&&(b=this.allowCreate(I.user,E,I)),Cs(b,P=>{if(!P)throw new at.AccessViolation(I.user);let O=Rr(E);this._writePublish(O,S,A)})}}_writePublish(E,S,A){let b=Dr(this.getContext());E??=null,E!==null&&Lr(E);let I=this.getContext();b.addWrite({key:E,store:i,entry:this.#n,nodeName:I?.nodeName,validate:o(()=>{I?.source||(b.checkOverloaded(),this.validate(S))},"validate"),before:Ne.publish?.bind(this,I,E,S),beforeIntermediate:Ra(S,Ue.publish?.bind(this,I,E,S)),commit:o((P,O,D)=>{O===void 0&&y&&!g&&Ta(),Me.default.trace?.(`Publishing message to id: ${E}, timestamp: ${new Date(P).toISOString()}`),R(E,O?.value??null,O,O?.version||P,0,!0,{user:I?.user,residencyId:A?.residencyId,expiresAt:I?.expiresAt,nodeId:A?.nodeId},"message",!1,S)},"commit")})}validate(E,S){let A,b=o((I,P,O)=>{if(P.type&&I!=null)if(S&&I.__op__&&(I=I.value),P.properties){typeof I!="object"&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be an object${P.type?" ("+P.type+")":""}`);let D=P.properties;for(let F=0,L=D.length;F<L;F++){let x=D[F];if(x.relationship||x.computed){E.hasOwnProperty(x.name)&&(A||(A=[])).push(`Computed property ${O}.${x.name} may not be directly assigned a value`);continue}let z=b(I[x.name],x,O+"."+x.name);z&&(I[x.name]=z)}if(P.sealed&&I!=null&&typeof I=="object")for(let F in I)D.find(L=>L.name===F)||(A||(A=[])).push(`Property ${F} is not allowed within object in property ${O}`)}else switch(P.type){case"Int":(typeof I!="number"||I>>0!==I)&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof I!="number"||!(Math.floor(I)===I&&Math.abs(I)<=9007199254740992))&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof I!="number"&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a number`);break;case"ID":typeof I=="string"||I?.length>0&&I.every?.(D=>typeof D=="string")||(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a string, or an array of strings`);break;case"String":typeof I!="string"&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a string`);break;case"Boolean":typeof I!="boolean"&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a boolean`);break;case"Date":if(!(I instanceof Date)){if(typeof I=="string"||typeof I=="number")return new Date(I);(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a Date`)}break;case"BigInt":if(typeof I!="bigint"){if(typeof I=="string"||typeof I=="number")return BigInt(I);(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a bigint`)}break;case"Bytes":if(!(I instanceof Uint8Array)){if(typeof I=="string")return Buffer.from(I);(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a Buffer or Uint8Array`)}break;case"Blob":if(!(I instanceof Rs)){if(typeof I=="string"&&(I=Buffer.from(I)),I instanceof Buffer)return createBlob(I,{type:"text/plain"});(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a Blob`)}break;case"array":if(Array.isArray(I)){if(P.elements)for(let D=0,F=I.length;D<F;D++){let L=I[D],x=b(L,P.elements,O+"[*]");x&&(I[D]=x)}}else(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be an Array`);break}P.nullable===!1&&I==null&&(A||(A=[])).push(`Property ${O} is required (and not does not allow null values)`)},"validateValue");for(let I=0,P=T.length;I<P;I++){let O=T[I];if(O.relationship||O.computed){Object.hasOwn(E,O.name)&&(A||(A=[])).push(`Computed property ${O.name} may not be directly assigned a value`);continue}if(!S||O.name in E){let D=b(E[O.name],O,O.name);D!==void 0&&(E[O.name]=D)}}if(f)for(let I in E)T.find(P=>P.name===I)||(A||(A=[])).push(`Property ${I} is not allowed`);if(A)throw new at.ClientError(A.join(". "))}getUpdatedTime(){return this.#r}wasLoadedFromSource(){return C?!!this.#i:void 0}static async addAttributes(E){let S=T.slice(0);for(let A of E){if(!A.name)throw new at.ClientError("Attribute name is required");if(A.name.match(/[`/]/))throw new at.ClientError("Attribute names cannot include backticks or forward slashes");wie(A.name),S.push(A)}return Qe({table:s,database:c,schemaDefined:u,attributes:S}),Pe.indexingOperation}static async removeAttributes(E){let S=T.filter(A=>!E.includes(A.name));return Qe({table:s,database:c,schemaDefined:u,attributes:S}),Pe.indexingOperation}static getSize(){let E=i.getStats();return(E.treeBranchPageCount+E.treeLeafPageCount+E.overflowPages)*E.pageSize}static getAuditSize(){let E=l?.getStats();return E&&(E.treeBranchPageCount+E.treeLeafPageCount+E.overflowPages)*E.pageSize}static getStorageStats(){let E=i.env.path,S=pN.default.statfsSync?.(E)??{};return{available:S.bavail*S.bsize,free:S.bfree*S.bsize,size:S.blocks*S.bsize}}static async getRecordCount(E){let S=i.getStats().entryCount,A=1e3/2,b=performance.now(),I=Math.floor(S/2),P=E?.exactCount,O=0,D=0,F;for(let{value:L}of i.getRange({start:!0,lazy:!0,snapshot:!1}))if(L!=null&&O++,D++,await qa(),!P&&D<I&&performance.now()-b>A){F=D;break}if(F){let L=O;O=0;for(let{value:Z}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:F,snapshot:!1}))Z!=null&&O++,await qa();let x=F*2,z=(O+L)/x,ne=Math.pow((O-L+1)/F/2,2)+z*(1-z)/x,re=Math.max(Math.sqrt(ne)*S,1),B=Math.round(z*S),de=Math.max(B-1.96*re,O+L),fe=Math.min(B+1.96*re,S),me=Math.pow(10,Math.round(Math.log10(re)));return me>B&&(me=me/10),O=Math.round(B/me)*me,{recordCount:O,estimatedRange:[Math.round(de),Math.round(fe)]}}return{recordCount:O}}static updatedAttributes(){Jt=this.propertyResolvers={$id:o((E,S,A)=>({value:A.key}),"$id"),$updatedtime:o((E,S,A)=>A.version,"$updatedtime"),$updatedTime:o((E,S,A)=>A.version,"$updatedTime"),$expiresAt:o((E,S,A)=>A.expiresAt,"$expiresAt"),$record:o((E,S,A)=>A?{value:E}:E,"$record"),$distance:o((E,S,A)=>A&&(A.distance??S?.vectorDistances?.get(A)),"$distance")};for(let E of this.attributes){E.isPrimaryKey&&(k=E),E.resolve=null;let S=E.relationship,A=E.computed;if(S)if(E.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),A&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),Df=!0,S.to)E.elements?.definition?(Jt[E.name]=E.resolve=(b,I,P,O)=>{let D=b[S.from?S.from:t],F=E.elements.definition.tableClass;return O?Ou({attribute:S.to,value:D},Dr(I).getReadTxn(),!1,F,!1).map(L=>L&&L.key!==void 0?L:F.primaryStore.getEntry(L,{transaction:Dr(I).getReadTxn()})).asArray:F.search([{attribute:S.to,value:D}],I).asArray},E.set=()=>{},E.resolve.definition=E.elements.definition,E.resolve.to=S.to,S.from&&(E.resolve.from=S.from)):console.error(`The one-to-many/many-to-many relationship property "${E.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(S.from){let b=E.definition||E.elements?.definition;b?(Jt[E.name]=E.resolve=(I,P,O,D)=>{let F=I[S.from];if(F===void 0)return;if(E.elements){let x,z=F?.map(ne=>{let re=b.tableClass.primaryStore[D?"getEntry":"get"](ne,{transaction:Dr(P).getReadTxn()});return re?.then&&(x=!0),Pe.loadAsInstance===!1&&Object.freeze(D?re?.value:re),re});return S.filterMissing?x?Promise.all(z).then(ne=>ne.filter(fk)):z.filter(fk):x?Promise.all(z):z}let L=b.tableClass.primaryStore[D?"getEntry":"get"](F,{transaction:Dr(P).getReadTxn()});return Pe.loadAsInstance===!1&&Object.freeze(D?L?.value:L),L},E.set=(I,P)=>{if(Array.isArray(P)){let O=P.map(D=>D.getId?.()||D[b.tableClass.primaryKey]);I[S.from]=O}else{let O=P.getId?.()||P[b.tableClass.primaryKey];I[S.from]=O}},E.resolve.definition=E.definition||E.elements?.definition,E.resolve.from=S.from):console.error(`The relationship property "${E.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${E.name}" in table "${s}" must use either "from" or "to" arguments`);else if(A)typeof A.from=="function"&&this.setComputedAttribute(E.name,A.from),Jt[E.name]=E.resolve=(b,I,P)=>{let O=typeof A.from=="string"?b[A.from]:b,D=this.userResolvers[E.name];if(D)return D(O,I,P);Me.default.warn(`Computed attribute "${E.name}" does not have a function assigned to it. Please use setComputedAttribute('${E.name}', resolver) to assign a resolver function.`),this.userResolvers[E.name]=()=>{}},E.resolve.directReturn=!0;else if(r[E.name]?.customIndex?.propertyResolver){let b=r[E.name].customIndex;Jt[E.name]=(I,P,O)=>{let D=I[E.name];return b.propertyResolver(D,P,O)},Jt[E.name].directReturn=!0}}Vm(this,this),Vm(Uf,this,!0);for(let E of T){let S=E.name;E.resolve&&Object.defineProperty(i.encoder.structPrototype,S,{get(){return E.resolve(this,Lu.getStore())},set(A){return E.set(this,A)},configurable:!0})}}static setComputedAttribute(E,S){let A=xi(T,E);if(!A){console.error(`The attribute "${E}" does not exist in the table "${s}"`);return}if(!A.computed){console.error(`The attribute "${E}" is not defined as computed in the table "${s}"`);return}this.userResolvers[E]=S}static async deleteHistory(E=0,S=!1){let A;for(let{key:b,value:I}of l.getRange({start:0,end:E}))await qa(),At(I).tableId===n&&(A=p_(l,b,I));if(S)for(let b of i.getRange({start:0,versions:!0})){let{key:I,value:P,localTime:O}=b;await qa(),P===null&&O<E&&(A=Wc(i,b))}await A}static async*getHistory(E=0,S=1/0){for(let{key:A,value:b}of l.getRange({start:E||1,end:S})){await qa();let I=At(b);I.tableId===n&&(yield{id:I.recordId,localTime:A,version:I.version,type:I.type,value:I.getValue(i,!0,A),user:I.user,operation:I.originatingOperation})}}static async getHistoryOfRecord(E){let S=[];if(E==null)throw new Error("An id is required");let A=i.getEntry(E);if(!A)return S;let b=A.localTime;if(!b)throw new Error("The entry does not have a local audit time");let I=0;do{await qa();let P=l.get(b);if(P){let O=At(P);S.push({id:O.recordId,localTime:b,version:O.version,type:O.type,value:O.getValue(i,!0,b),user:O.user}),b=O.previousLocalTime}else break}while(I<1e3&&b);return S.reverse()}static cleanup(){Y?.remove()}}let IE=Og(async(V,E,S)=>{for(let A of Pe.sources)if(A.get&&(!A.get.reliesOnPrototype||A.prototype.get)){if(A.available?.(S)===!1)continue;E.source=A;let b=await A.get(V,E);if(b)return b}},()=>{throw new at.ServerError("Service unavailable, exceeded request queue limit for resolving cache record",503)});Pe.updatedAttributes();let xf=Pe.prototype;return p&&Pe.setTTLExpiration(p/1e3),$&&fu(),Pe;function ho(V,E,S){let A;for(let b in r){let I=r[b],P=I.isIndexing,O=Jt[b],D=S&&(O?O(S):S[b]),F=E&&(O?O(E):E[b]);if(D===F&&!P)continue;if(I.customIndex){I.customIndex.index(V,D,F);continue}A=!0;let L=I.indexNulls,x=(0,uh.getIndexedValues)(D,L),z=(0,uh.getIndexedValues)(F,L);if(s==="OrganizationRole"&&Me.default.error?.({tableName:s,id:V,key:b,valuesToAdd:x,valuesToRemove:z}),z?.length>0){let ne=new Set(z);if(x=x?x.filter(re=>{if(ne.has(re))ne.delete(re);else return!0}):[],z=Array.from(ne),(z.length>0||x.length>0)&&ok){let re=z.concat(x).map(B=>({key:B,value:V}));I.prefetch(re,uk)}for(let re=0,B=z.length;re<B;re++)I.remove(z[re],V)}else x?.length>0&&ok&&I.prefetch(x.map(ne=>({key:ne,value:V})),uk);if(x)for(let ne=0,re=x.length;ne<re;ne++)I.put(x[ne],V)}return A}o(ho,"updateIndices");function Lr(V){switch(typeof V){case"number":return!0;case"string":if(V.length<659)return!0;if(V.length>ck)throw new Error("Primary key size is too large: "+V.length);break;case"object":if(V===null)throw new Error("Invalid primary key of null");break;case"bigint":if(V<2n**64n&&V>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof V)}if((0,Sl.writeKey)(V,Mie,0)>ck)throw new Error("Primary key size is too large: "+V.length);return!0}o(Lr,"checkValidId");function Rr(V){return typeof V=="object"&&V?V.id:V}o(Rr,"requestTargetToId");function Bf(V){return typeof V=="object"&&V&&V.isCollection}o(Bf,"isSearchTarget");function Ss(V){}o(Ss,"isRequestTarget");function Ea(V,E,S,A,b){if(Pe.getResidencyById&&S.ensureLoaded&&E?.replicateFrom!==!1){let P=Cc(Pe.getResidencyById(V));if(P&&!P.includes(server.hostname)&&N)return N({key:V,residency:P}).then(b)}let I=o(()=>{if(E?.transaction?.stale&&(E.transaction.stale=!1),S.transaction?.isDone)return b(null,V);let P=i.getEntry(V,S);return E?._freezeRecords&&Object.freeze(P?.value),P?.residencyId&&P.metadataFlags&wn&&N&&S.ensureLoaded&&E?.replicateFrom!==!1?N(P).then(O=>b(O,V),O=>(Me.default.error?.("Error loading remote record",V,P,S,O),b(null,V))):(P&&E&&(P?.version>(E.lastModified||0)&&(E.lastModified=P.version),P?.localTime&&!E.lastRefreshed&&(E.lastRefreshed=P.localTime)),b(P,V))},"whenPrefetched");return A?I():se>0?(se--,I()):new Promise((P,O)=>{se===0?(se--,i.prefetch([V],()=>{D(),F()})):(ce.push(V),le.push(F),ce.length>Py&&(se--,D()));function D(){if(ce.length>0){let L=le;i.prefetch(ce,()=>{se===-1?D():se++;for(let x of L)x()}),ce=[],le=[],he>2&&he--}else se=he,he<bE&&he++}o(D,"prefetch");function F(){try{P(I())}catch(L){O(L)}}o(F,"load")})}o(Ea,"loadLocalRecord");function _a(V,E){let S=E?.checkPermission;if(typeof S!="object"){if(!V?.role)return;S=V.role.permission}if(S.super_user)return vie;let A=S[c],b,I=A?.tables;if(I)return I[s];if(c==="data"&&(b=S[s])&&!b.tables)return b}o(_a,"getTablePermissions");function Oc(V,E,S,A){if(C){let b=!1;if(S.noCache?b=!0:(E?(!E.value||E.metadataFlags&(wn|Pa)||E.expiresAt!=null&&E.expiresAt<Date.now())&&(b=!0):b=!0,zr(!b,"cache-hit",s)),b){let I=NE(V,E,S).then(P=>(P?.value&&P?.value.getRecord?.()&&Me.default.error?.("Can not assign a record that is already a resource"),S&&(P?.version>(S.lastModified||0)&&(S.lastModified=P.version),S.lastRefreshed=Date.now()),P));if(S?.onlyIfCached||E?.value&&A?.allowStaleWhileRevalidate?.(E,V)){if(I.catch(P=>Me.default.warn?.(P)),S?.onlyIfCached&&!A.doesExist())throw new at.ServerError("Entry is not cached",504);return}else return I}}else if(E?.value&&E.expiresAt!=null&&E.expiresAt<Date.now())return Pe.evict(E.key,E.value,E.version),E.value=null,{then(b){return b(E)}}}o(Oc,"ensureLoadedFromSource");function Dr(V){let E=V?.transaction;if(E){if(!E.lmdbDb)return E.lmdbDb=i,E;do{if(E.lmdbDb?.path===i.path)return E;let S=E.next;if(!S)return E=E.next=new Eo,E.lmdbDb=i,E;E=S}while(!0)}else return new KE}o(Dr,"txnForContext");function uu(V,E,S){if(!V)return;let A=(V.deref?V.deref():V.value)??i.getEntry(V.key)?.value;if(typeof E=="object"){let I=Jt,P=A;for(let O=0,D=E.length;O<D;O++){let F=E[O],L=I?.[F];P=L&&P?L(P,S,V):P?.[F],V=null,I=L?.definition?.tableClass?.propertyResolvers}return P}let b=Jt[E];return b?b(A,S,V):A[E]}o(uu,"getAttributeValue");function du(V,E,S,A,b){let I=b?.length,P={transaction:A,lazy:I>0||typeof E=="string"||E?.length<4,alwaysPrefetch:!0},O;function D(F,L){let x=F?.value;if(!x)return $a.SKIP;for(let z=0;z<I;z++)if(!O?.includes(z)&&!b[z](x,F))return $a.SKIP;return L!==void 0&&(F.key=L),F}if(o(D,"processEntry"),I>0||!V.hasEntries){let F=V.map(L=>{if(O=null,typeof L=="object"&&L?.key!==void 0)return I>0?D(L):L;if(L==null)return $a.SKIP;for(let x=0;x<I;x++){let ne=b[x].idFilter;if(ne){if(!ne(L))return $a.SKIP;O||(O=[]),O.push(x)}}return Ea(L,S,P,!1,D)});return Array.isArray(V)&&(F=F.filter(L=>L!==$a.SKIP)),F.hasEntries=!0,F}return V}o(du,"transformToEntries");function ga(V,E,S=server.replication?.getThisNodeId(l)){if(V<=E?.version){if(E?.version===V&&S!==void 0){let A=server.replication?.exportIdMapping(l),b=E.localTime,I=b&&l.get(b);if(I){let P,O,D=At(I);for(let F in A)A[F]===S&&(P=F),A[F]===D.nodeId&&(O=F);if(P>O)return 1;if(P===O)return 0}}return-1}return 1}o(ga,"precedesExistingVersion");async function NE(V,E,S){let A=E?.metadataFlags,b=E?.version,I,P;if(!i.attemptLock(V,b,()=>{clearTimeout(P);let L=i.getEntry(V);!L||!L.value||L.metadataFlags&(wn|Pa)?I(NE(V,i.getEntry(V),S)):I(L)}))return new Promise(L=>{I=L,P=setTimeout(()=>{i.unlock(V,b)},Lie)});let O=E?.value,D={requestContext:S,replacingRecord:O,replacingEntry:E,replacingVersion:b,noCacheStore:!1,source:null,resourceCache:S?.resourceCache,transaction:void 0,expiresAt:void 0,lastModified:void 0},F=S?.responseHeaders;return new Promise((L,x)=>{let z;Cs(Ut(D,async ne=>{let re=performance.now(),B,de,fe;try{B=await IE(V,D,E),fe=A&wn;let Z=D.lastModified||fe&&b;de=fe||Z>b||!O,Z||(Z=(0,uh.getNextMonotonicTime)());let j=performance.now()-re;if(ot(j,"cache-resolution",s,null,"success"),F&&ch(F,"Server-Timing",`cache-resolve;dur=${j.toFixed(2)}`,!0),ne.timestamp=Z,p&&D.expiresAt==null&&(D.expiresAt=Date.now()+p),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=O,Z=b;else throw new at.ServerError(B.body||"Error from source",B.status);else B=B.body;typeof B.toJSON=="function"&&(B=B.toJSON()),t&&B[t]!==V&&(B[t]=V)}z=!0,L({key:V,version:Z,value:B})}catch(Z){Z.message+=` while resolving record ${V} for ${s}`,O&&((Z.code==="ECONNRESET"||Z.code==="ECONNREFUSED"||Z.code==="EAI_AGAIN")&&!S?.mustRevalidate||S?.staleIfError&&(Z.statusCode===500||Z.statusCode===502||Z.statusCode===503||Z.statusCode===504))?(L({key:V,version:b,value:O}),Me.default.trace?.(Z.message,"(returned stale record)")):x(Z);let j=performance.now()-re;ot(j,"cache-resolution",s,null,"fail"),F&&ch(F,"Server-Timing",`cache-resolve;dur=${j.toFixed(2)}`,!0),D.transaction.abort();return}if(S?.noCacheStore||D.noCacheStore){D.transaction.abort();return}Dr(D).addWrite({key:V,store:i,entry:E,nodeName:"source",before:Ra(B),commit:o((Z,j)=>{if(j?.version!==b)return;let Te=ho(V,O,B);if(B){Ue.put?.(D,V,B),j&&(S.previousResidency=Pe.getResidencyRecord(j.residencyId));let _e,pe=!1,ft,et=Cc(Pe.getResidency(B,S));if(et){if(!et.includes(server.hostname))if(_e=B,pe=!0,Pe.getResidencyById)B=void 0;else{B=null;for(let tt in r)B||(B={}),B[tt]=_e[tt]}ft=Pc(et)}Me.default.trace?.(`Writing resolved record from source with id: ${V}, timestamp: ${new Date(Z).toISOString()}`),R(V,B,j,Z,pe?wn:0,g&&(de||pe)||null,{user:D?.user,expiresAt:D.expiresAt,residencyId:ft},"put",!!fe,_e)}else j&&(Ue.delete?.(D,V),Me.default.trace?.(`Deleting resolved record from source with id: ${V}, timestamp: ${new Date(Z).toISOString()}`),g||y?R(V,null,j,Z,0,g&&de||null,{user:D?.user},"delete",!!fe):Wc(i,j,b))},"commit")})}),()=>{i.unlock(V,b)},ne=>{i.unlock(V,b),z&&Me.default.error?.("Error committing cache update",ne)})})}o(NE,"getFromSource");function Sa(V){if(!V||V.user?.role?.permission?.super_user)return!0;if(V.replicateTo)throw new at.ClientError("Can not specify replication parameters without super user permissions",403);if(V.replicatedConfirmation)throw new at.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}o(Sa,"checkContextPermissions");function Ta(V){let E=!1;if(V&&(V-Tr>1&&(E=!0),Tr=V),!(xe===Qt&&!E)&&(Qt=xe,(0,_l.getWorkerIndex)()===(0,_l.getWorkerCount)()-1))return Ht&&clearTimeout(Ht),xe?new Promise(S=>{let A=new Date;A.setMonth(0),A.setDate(1),A.setHours(0),A.setMinutes(0),A.setSeconds(0);let b=xe/(1+Tr),I=E?Date.now():Math.ceil((Date.now()-A.getTime())/b)*b+A.getTime(),P=o(O=>{Me.default.trace?.(`Scheduled next cleanup scan at ${new Date(O)}`),Ht=setTimeout(()=>te=te.then(async()=>{if(P(Math.max(O+xe,Date.now())),i.rootStore.status!=="open"){clearTimeout(Ht);return}let D=50,F=new Array(D),L=0,x=Math.pow(Tr,8)*(gl.get(U.STORAGE_RECLAMATION_EVICTIONFACTOR)??1e5),z=_/Math.pow(Math.max(Tr,1),4);Me.default.info?.(`Starting cleanup scan for ${s}, evict threshold ${x}, adjusted eviction ${z}ms`);function ne(re,B,de,fe){let me=re+z-Date.now();if(me<0)return!0;if(Tr){let Z=i.lastSize;return de&Vr&&Fc(fe,j=>{j.size&&(Z+=j.size)}),Me.default.trace?.(`shouldEvict adjusted ${me} ${Z}, ${me*(re-B)/Z} < ${x}`),me*(re-B)/Z<x}return!1}o(ne,"shouldEvict");try{let re=0;for(let B of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let{key:de,value:fe,version:me,expiresAt:Z,metadataFlags:j}=B,Te;fe===null&&!g&&me+Pie<Date.now()?Te=Wc(i,B,me):Z!=null&&ne(Z,me,j,fe)&&(Te=Pe.evict(de,fe,me),re++),Te&&(await F[L],F[L]=Te.catch(_e=>{Me.default.error?.("Cleanup error",_e)}),++L>=D&&(L=0)),await qa()}Me.default.info?.(`Finished cleanup scan for ${s}, evicted ${re} entries`)}catch(re){Me.default.warn?.(`Error in cleanup scan for ${s}:`,re)}S(void 0),Tr=0}),Math.min(O-Date.now(),2147483647)).unref()},"startNextTimer");P(I)}):void 0}o(Ta,"scheduleCleanup");function Ff(){Y=l?.addDeleteRemovalCallback(n,i,(V,E)=>{i.remove(V,E)})}o(Ff,"addDeleteRemoval");function fu(){(0,_l.getWorkerIndex)()===0&&setInterval(async()=>{if(!wc){wc=!0;try{let V=$.name,E=r[V];if(!E)throw new Error(`expiresAt attribute ${$} must be indexed`);for(let S of E.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let A of E.getValues(S)){let b=i.getEntry(A);b?.value?b.value[V]<Date.now()&&Pe.evict(A,b.value,b.version):i.ifVersion(A,b?.version,()=>E.remove(S,A))}await qa()}}catch(V){Me.default.error?.("Error in evicting old records",V)}finally{wc=!1}}},Cie).unref()}o(fu,"runRecordExpirationEviction");function Cc(V){if(V!=null){if(Array.isArray(V))return V;if(typeof V=="number"){if(V>=65536)throw new Error(`Shard id ${V} must be below 65536`);let E=server.shards?.get?.(V);if(E)return Me.default.trace?.(`Shard ${V} mapped to ${E.map(S=>S.name).join(", ")}`),E.map(S=>S.name);throw new Error(`Shard ${V} is not defined`)}throw new Error(`Shard or residency list ${V} is not a valid type, must be a shard number or residency list of node hostnames`)}}o(Cc,"residencyFromFunction");function Pc(V){if(V){let E=V.join(","),S=d.get([Symbol.for("residency_by_set"),E]);return S||(d.put([Symbol.for("residency_by_set"),E],S=Math.floor(Math.random()*2147418112)+65535),d.put([Symbol.for("residency_by_id"),S],V),S)}}o(Pc,"getResidencyId");function Ra(V,E){let S=bA(V,i.rootStore);if(S){let A=E;return A?async()=>{await A(),await S}:()=>S}return E}o(Ra,"preCommitBlobsForRecordBefore")}function hN(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 uk(){}function Pg(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 Cg(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return Cg(+e);case"Float":return e==="null"?null:Cg(+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;Uie.test(e)||(e+="Z");let n=new Date(e);return Cg(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,Lg.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function Cg(e){if(isNaN(e))throw new SyntaxError;return e}function dk(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 Cs(e,t,r){return e?.then?e.then(t,r):t(e)}function fk(e){return e!=null}function Ps(e){try{return JSON.stringify(e)}catch{return e}}function xie(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var $a,uh,mk,hk,gl,at,dh,fh,Me,Sl,_l,Lg,pN,Nie,wie,Oie,Cie,Pie,ok,Lie,ak,Die,wn,Pa,Mie,ck,lk,vie,xLe,Uie,qa,w_=ue(()=>{H();$a=require("lmdb"),uh=w(bn()),mk=w(require("lodash")),hk=w(Zf());La();tm();gl=w(oe());XA();at=w(ge()),dh=w(Oo()),fh=w(ii());De();N_();Me=w(Zs());dI();vc();Sl=require("ordered-binary"),_l=w(st());Li();Lg=w(ie());Kc();Wi();zE();lh();pN=w(require("node:fs"));Kn();d_();mN();({sortBy:Nie}=mk.default),{validateAttribute:wie}=hk.default,Oie=new Uint8Array(9);Oie[8]=192;Cie=6e4,Pie=864e5;gl.initSync();ok=gl.get(U.STORAGE_PREFETCHWRITES),Lie=1e4,ak=1,Die=2,wn=1,Pa=8,Mie=Buffer.allocUnsafeSlow(8192),ck=1978,lk=100,vie={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},xLe=(0,Lg.convertToMS)(gl.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;o(Dg,"makeTable");o(hN,"attributesAsObject");o(uk,"noop");Uie=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;o(Pg,"coerceType");o(Cg,"rejectNaN");o(dk,"isDescendantId");qa=o(()=>new Promise(setImmediate),"rest");o(Cs,"when");o(fk,"exists");o(Ps,"stringify");o(xie,"hasOtherProcesses")});function Mg(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 vg(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 Ek=ue(()=>{o(Mg,"euclideanDistance");o(vg,"cosineDistance")});var _k,gk,Zu,zi,Xu,Bie,Fie,Ug,Sk=ue(()=>{Ek();_k=require("msgpackr"),gk=w(Zs()),Zu=w(ge()),zi=(0,gk.loggerWithTag)("HNSW"),Xu=Symbol.for("entryPoint"),Bie=Symbol.for("key"),Fie=10,Ug=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=_k.FLOAT32_OPTIONS.ALWAYS),this.distance=r?.distance==="euclidean"?Mg:vg,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"?[Bie,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(Xu);if(n?c={...this.indexStore.get(i)}:c={},r){let f=l&&this.indexStore.get(l);if(f===void 0){let _=Math.floor(-Math.log(Math.random())*this.mL),g={vector:r,level:_,primaryKey:t};for(let y=0;y<=_;y++)g[y]=[];if(this.indexStore.put(i,g),typeof i!="number")throw new Error("Invalid nodeId: "+i);zi.debug?.("setting entry point to",i),this.indexStore.put(Xu,i);return}let m=c.level??Math.min(Math.floor(-Math.log(Math.random())*this.mL),Fie),h=f.level;if(m>=h){if(typeof i!="number")throw new Error("Invalid nodeId: "+i);zi.debug?.("setting entry point to",i),this.indexStore.put(Xu,i)}for(;h>m;){let _=this.searchLayer(r,l,f,this.efConstruction,h);_.length>0&&(l=_[0].id,f=_[0].node),h--}let p=new Array(m+1);for(let _=0;_<=m;_++)p[_]=[];for(let _=Math.min(m,h);_>=0;_--){let g=this.searchLayer(r,l,f,this.efConstruction,_);g=g.slice(0,this.M<<1),g.length===0&&_===0&&zi.info?.("should not have zero connections for",l);let y=p[_];for(let T=0;T<g.length;T++){let{id:R,distance:N,node:C}=g[T];if(R===i)continue;let k=[];if(this.optimizeRouting){let K=!1,$=C[_],Y=1+this.optimizeRouting*(1+.5*T/this.M);for(let ce=0;ce<$.length;ce++){let{id:le,distance:se}=$[ce],he=1+this.optimizeRouting*(1+.5*ce/this.M);for(let Ne=0;Ne<y.length;Ne++){let{id:Ue,distance:xe}=y[Ne];if(Ue===le){N*Y>xe+se?K=!0:se*he>N+xe&&(k.push({fromId:Ue,toId:R}),k.push({fromId:R,toId:Ue}));break}}if(K)break}if(K)continue}else if(T>=(_>0?this.M:this.M<<1))continue;y.push({id:R,distance:N});for(let{fromId:K,toId:$}of k){let Y=d(K);Y||(Y=d(K,this.indexStore.get(K)));for(let ce=0;ce<Y[_].length;ce++)if(Y[_][ce].id===$){Object.isFrozen(Y[_])&&(Y[_]=Y[_].slice()),Y[_].splice(ce,1);break}}let te=c[_],G=te?.find(({id:K})=>K===R);if(G){let K=te?.indexOf(G);te.copied||(te=[...te],te.copied=!0,c[_]=te),te.splice(K,1)}else this.addConnection(R,d(R,C),i,_,N,d)}}this.indexStore.put(i,{vector:r,level:m,primaryKey:t,...p})}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:h,value:p}of this.indexStore.getRange({start:0,end:1/0}))if(p.level>m){if(l=h,p.level===f)break;m=p.level}}if(l===void 0)this.indexStore.remove(Xu);else{if(typeof l!="number")throw new Error("Invalid nodeId: "+l);zi.debug?.("setting entry point to",l),this.indexStore.put(Xu,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:h}of m){let p=d(h,this.indexStore.get(h));for(let _=0;_<=f;_++)p[_]=p[_]?.filter(({id:g})=>g!==i),p[_].length===0&&(zi.info?.("node was left orphaned, will reindex",h),u.set(p.primaryKey,p.vector))}}function d(f,m){let h=a.get(f);return!h&&m&&(h={...m},a.set(f,h)),h}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(Xu);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((h,p)=>h.distance-p.distance);let d=l.shift(),f=u[u.length-1].distance;if(d.distance>f)break;let m=d.node;for(let{id:h}of m[i]||[]){if(c.has(h)||h===void 0)continue;c.add(h);let p=this.indexStore.get(h);if(!p)continue;this.nodesVisitedCount++;let _=a(t,p.vector);if(_<f||u.length<s){let g={id:h,distance:_,node:p};l.push(g),u.push(g)}}u.sort((h,p)=>h.distance-p.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 Zu.ClientError(`Can not use "${i}" comparator with HNSW`)}if(n)throw new Zu.ClientError("Can not use descending sort order with HNSW");let c;if(s==="cosine")c=vg;else if(s==="euclidean")c=Mg;else{if(s)throw new Zu.ClientError("Unknown distance function");c=this.distance}if(!t)throw new Zu.ClientError("A target vector must be provided for an HNSW query");if(!Array.isArray(t))throw new Zu.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){zi.info?.("could not find neighbor node",a);continue}a[n]?.find(({id:l})=>l==t)||zi.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)){zi.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:h})=>h!==t),s===0&&m[s].length===0&&zi.info?.("should not remove last connection",t,n))}}r[s].find(({id:l})=>l===n)?zi.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"?Mg:vg);let c=a(s.target,t);return i.set(n,c),c}return t}}});var EN,Tk=ue(()=>{Sk();EN={HNSW:Ug}});var ht={};Oe(ht,{database:()=>$u,databaseEnvs:()=>vo,databases:()=>ke,dropDatabase:()=>EI,dropTableMeta:()=>$ie,getDatabases:()=>it,getDefaultCompression:()=>Gg,getTables:()=>Hie,onRemovedDB:()=>gh,onUpdatedTable:()=>Tl,readMetaDb:()=>mh,resetDatabases:()=>id,table:()=>Qe,tables:()=>un});function Hie(){return Hg||it(),un||{}}function it(){if(Hg)return ke;Hg=!0,rd=new Map;let e=(0,$t.getHdbBasePath)()&&(0,Bt.join)((0,$t.getHdbBasePath)(),Dc),t=(0,$t.get)(U.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,$t.get)(U.STORAGE_PATH)||e&&((0,ns.existsSync)(e)?e:(0,Bt.join)((0,$t.getHdbBasePath)(),LE)),!e)return;if((0,ns.existsSync)(e))for(let n of(0,ns.readdirSync)(e,{withFileTypes:!0})){let s=(0,Bt.basename)(n.name,".mdb");n.isFile()&&(0,Bt.extname)(n.name).toLowerCase()===".mdb"&&!t[s]?.path&&mh((0,Bt.join)(e,n.name),null,s)}if((0,ns.existsSync)((0,td.getBaseSchemaPath)())){for(let n of(0,ns.readdirSync)((0,td.getBaseSchemaPath)(),{withFileTypes:!0}))if(!n.isFile()){let s=(0,Bt.join)((0,td.getBaseSchemaPath)(),n.name),i=(0,Bt.join)((0,td.getTransactionAuditStoreBasePath)(),n.name);for(let a of(0,ns.readdirSync)(s,{withFileTypes:!0}))if(a.isFile()&&(0,Bt.extname)(a.name).toLowerCase()===".mdb"){let c=(0,Bt.join)(i,a.name);mh((0,Bt.join)(s,a.name),(0,Bt.basename)(a.name,".mdb"),n.name,c,!0)}}}if(t)for(let n in t){let s=t[n],i=s.path;if((0,ns.existsSync)(i))for(let c of(0,ns.readdirSync)(i,{withFileTypes:!0}))c.isFile()&&(0,Bt.extname)(c.name).toLowerCase()===".mdb"&&mh((0,Bt.join)(i,c.name),(0,Bt.basename)(c.name,".mdb"),n);let a=s.tables;if(a)for(let c in a){let l=a[c],u=(0,Bt.join)(l.path,(0,Bt.basename)(c+".mdb"));(0,ns.existsSync)(u)&&mh(u,c,n,null,!0)}}for(let n in ke){let s=rd.get(n);if(s){let i=ke[n];n.includes("delete")&&Nr.trace(`defined tables ${Array.from(s.keys())}`);for(let a in i)s.has(a)||(Nr.trace(`delete table class ${a}`),delete i[a])}else if(delete ke[n],n==="data"){for(let i in un)delete un[i];delete un[kg]}}let r=["hdb_temp","hdb_certificate","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_license","hdb_info"];if((0,$t.get)(U.ANALYTICS_REPLICATE)===!1?r.push("hdb_analytics"):(ke.system?.hdb_analytics?.enableAuditing(),ke.system?.hdb_analytics_hostname?.enableAuditing()),ke.system)for(let n of r)ke.system[n]&&(ke.system[n].replicate=!1);return rd=null,ke}function id(){Hg=!1;for(let[,e]of vo)e.needsDeletion=!0;it();for(let[e,t]of vo)if(t.needsDeletion&&!e.endsWith("system.mdb")){t.close(),vo.delete(e);let r=ke[t.databaseName];for(let n in r)if(r[n].primaryStore.path===e){delete ke[t.databaseName],ph.forEach(i=>i(t.databaseName));break}}return ke}function mh(e,t,r=SN,n,s){let i=new _N.default(e,!1);try{let a=vo.get(e);a?a.needsDeletion=!1:(a=(0,nd.open)(i),vo.set(e,a));let c=new sd.default(!1),l=a.dbisDb||(a.dbisDb=a.openDB(xg.INTERNAL_DBIS_NAME,c)),u=a.auditStore;u||(n?(0,ns.existsSync)(n)&&(i.path=n,u=(0,nd.open)(i),u.isLegacy=!0):u=h_(a));let d=Ik(r),f=d[kg],m=new Map;for(let{key:h,value:p}of l.getRange({start:!1})){let[_,g]=h.toString().split("/");g===""?g=p.name:g||(g=_,_=t,p.name||(p.name=g,p.indexed=!p.is_hash_attribute)),f?.add(_);let y=m.get(_);y||m.set(_,y={attributes:[]}),(g==null||p.is_hash_attribute)&&(y.primary=p),g!=null&&y.attributes.push(p),Object.defineProperty(p,"key",{value:h,configurable:!0})}for(let[h,p]of m){let{attributes:_,primary:g}=p;if(!g){for(let se of _)if(se.is_hash_attribute||se.isPrimaryKey){g=se;break}if(!g){Nr.warn(`Unable to find a primary key attribute on table ${h}, with attributes: ${JSON.stringify(_)}`);continue}}let y=d[h],T={},R=[],N,C,k=typeof g.audit=="boolean"?g.audit:(0,$t.get)(U.LOGGING_AUDITLOG),te=g.trackDeletes,G=g.expiration,K=g.eviction,$=g.sealed,Y=g.splitSegments,ce=g.replicate;if(y)T=y.indices,R=y.attributes,y.schemaVersion++;else{N=g.tableId,N?N>=(l.get(ed)||0)&&(l.putSync(ed,N+1),Nr.info(`Updating next table id (it was out of sync) to ${N+1} for ${h}`)):(g.tableId=N=l.get(ed),N||(N=1),Nr.debug("Table {tableName} missing an id, assigning {tableId}"),l.putSync(ed,N+1),l.putSync(g.key,g));let se=new sd.default(!g.is_hash_attribute,g.is_hash_attribute);if(se.compression=g.compression,se.compression){let he=(0,$t.get)(U.STORAGE_COMPRESSION_THRESHOLD)||bk;se.compression.threshold=he}C=y_(a.openDB(g.key,se),a),a.databaseName=r,C.tableId=N}let le;for(let se of _){se.attribute=se.name;try{if(!se.is_hash_attribute&&(se.indexed||se.attribute&&!se.name)){if(!T[se.name]){let Ne=wk(se.key,a,se);T[se.name]=Ne,T[se.name].indexNulls=se.indexNulls}let he=R.find(Ne=>Ne.name===se.name);he?R.splice(R.indexOf(he),1,se):R.push(se),le=!0}}catch(he){Nr.error("Error trying to update attribute",se,R,T,he)}}for(let se of R)if(!_.find(Ne=>Ne.name===se.name)){if(se.is_hash_attribute){Nr.error("Unable to remove existing primary key attribute",se);continue}se.indexed&&(R.splice(R.indexOf(se),1),le=!0)}if(y)le&&(y.schemaVersion++,y.updatedAttributes());else{y=Nk(d,h,Dg({primaryStore:C,auditStore:u,audit:k,sealed:$,splitSegments:Y,replicate:ce,expirationMS:G&&G*1e3,evictionMS:K&&K*1e3,trackDeletes:te,tableName:h,tableId:N,primaryKey:g.name,databasePath:s?r+"/"+h:r,databaseName:r,indices:T,attributes:_,schemaDefined:g.schemaDefined,dbisDB:l})),y.schemaVersion=1;for(let se of hh)se(y)}}return a}catch(a){throw a.message+=` opening database ${e}`,a}}function Ik(e){let t=ke[e];if(t||(e==="data"?t=ke[e]=un:e==="system"?Object.defineProperty(ke,"system",{value:t=Object.create(null),configurable:!0}):t=ke[e]=Object.create(null)),rd&&!rd.has(e)){let r=new Set;t[kg]=r,rd.set(e,r)}return t}function Nk(e,t,r){return e[t]=r,r}function $u({database:e,table:t}){e||(e=SN),it();let r=Ik(e),n=(0,Bt.join)((0,$t.getHdbBasePath)(),Dc),s=(0,$t.get)(U.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,$t.get)(U.STORAGE_PATH)||((0,ns.existsSync)(n)?n:(0,Bt.join)((0,$t.getHdbBasePath)(),LE));let a=(0,Bt.join)(n,(i?t:e)+".mdb"),c=vo.get(a);if(!c||c.status==="closed"){let l=new _N.default(a,!1);c=(0,nd.open)(l),vo.set(a,c)}return c.auditStore||(c.auditStore=h_(c)),c}async function EI(e){if(!ke[e])throw new Error("Schema does not exist");let t=ke[e],r;for(let n in t)r=t[n].primaryStore.rootStore,vo.delete(r.path),r.status==="open"&&(await r.close(),await Eh.remove(r.path));if(r||(r=$u({database:e,table:null}),r.status==="open"&&(await r.close(),await Eh.remove(r.path))),e==="data"){for(let n in un)delete un[n];delete un[kg]}delete ke[e],ph.forEach(n=>n(e)),await AA(r)}function wk(e,t,r){let n=r.is_hash_attribute||r.indexed.type&&EN[r.indexed.type]?.useObjectStore,s=new sd.default(!n,n),i=t.openDB(e,s);if(r.indexed.type){let a=EN[r.indexed.type];a?i.customIndex=new a(i,r.indexed):Nr.error(`The indexing type '${r.indexed.type}' is unknown`)}return i}function Qe(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:h}=e;r||(r=SN);let p=$u({database:r,table:t}),_=ke[r];Nr.trace(`Defining ${t} in ${r}`);let g=_?.[t];if(p.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let y,T,R;m==null&&(m=!0);let N=new sd.default(!1);for(let Y of a)Y.attribute&&!Y.name?(Y.name=Y.attribute,Y.indexed=!0):Y.attribute=Y.name,Y.expiresAt&&(Y.indexed=!0);let C,k;if(g){if(y=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 Y=p.auditStore;T=a.find(he=>he.isPrimaryKey)||{},y=T.name,T.is_hash_attribute=T.isPrimaryKey=!0,T.schemaDefined=m,T.compression=Gg(),f&&(T.trackDeletes=!0),c=T.audit=typeof c=="boolean"?c:(0,$t.get)(U.LOGGING_AUDITLOG),n&&(T.expiration=n),s&&(T.eviction=s),u??=!1,T.splitSegments=u,typeof l=="boolean"&&(T.sealed=l),typeof d=="boolean"&&(T.replicate=d),h&&(T.origins?T.origins.includes(h)||T.origins.push(h):T.origins=[h]),Nr.trace(`${t} table loading, opening primary store`);let ce=new sd.default(!1,!0);ce.compression=T.compression;let le=t+"/";if(R=p.dbisDb=p.openDB(xg.INTERNAL_DBIS_NAME,N),$(),R.get(le))return k&&k(),id(),Qe(e);let se=y_(p.openDB(le,ce),p);p.databaseName=r,se.tableId=R.get(ed),Nr.trace(`Assigning new table id ${se.tableId} for ${t}`),se.tableId||(se.tableId=1),R.put(ed,se.tableId+1),T.tableId=se.tableId,g=Nk(_,t,Dg({primaryStore:se,auditStore:Y,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:y,tableName:t,tableId:se.tableId,databasePath:r,databaseName:r,indices:{},attributes:a,schemaDefined:m,dbisDB:R})),g.schemaVersion=1,C=!0,R.put(le,T)}let te=g.indices;R=R||(p.dbisDb=p.openDB(xg.INTERNAL_DBIS_NAME,N)),g.dbisDB=R;let G=[];for(let{key:Y,value:ce}of R.getRange({start:!0})){let[le,se]=Y.toString().split("/");if(se===""&&(se=ce.name),se){if(le!==t)continue}else continue;let he=a.find(Ue=>Ue.name===se),Ne=!he?.indexed&&ce.indexed&&!ce.isPrimaryKey;if((!he||Ne)&&($(),C=!0,he||R.remove(Y),Ne)){let Ue=g.indices[le];Ue&&G.push(Ue)}}let K=[];try{for(let Y of a||[]){if((Y.relationship||Y.computed)&&(C=!0,Y.relationship))continue;let ce=t+"/"+(Y.name||"");Object.defineProperty(Y,"key",{value:ce,configurable:!0});let le=R.get(ce);if(Y.isPrimaryKey){if(le=le||R.get(ce=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)||Y.type!==le.type){let he={...le};typeof c=="boolean"&&(c&&g.enableAuditing(c),he.audit=c),n&&(he.expiration=+n),s&&(he.eviction=+s),l!==void 0&&(he.sealed=l),d!==void 0&&(he.replicate=d),Y.type&&(he.type=Y.type),C=!0,$(),R.put(ce,he)}continue}le?.attribute&&!le.name&&(le.indexed=!0);let se=!le||le.type!==Y.type||JSON.stringify(le.indexed)!==JSON.stringify(Y.indexed)||le.nullable!==Y.nullable||le.version!==Y.version||JSON.stringify(le.properties)!==JSON.stringify(Y.properties)||JSON.stringify(le.elements)!==JSON.stringify(Y.elements);if(Y.indexed){let he=wk(ce,p,Y);(se||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<_h.workerData?.restartNumber)&&(C=!0,$(),le=R.get(ce),(se||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<_h.workerData?.restartNumber)&&(C=!0,Y.indexNulls===void 0&&(Y.indexNulls=!0),g.primaryStore.getStats().entryCount>0&&(Y.lastIndexedKey=le?.lastIndexedKey??void 0,Y.indexingPID=process.pid,he.isIndexing=!0,Object.defineProperty(Y,"dbi",{value:he}),K.push(Y))),R.put(ce,Y)),le?.indexNulls&&Y.indexNulls===void 0&&(Y.indexNulls=!0),he.indexNulls=Y.indexNulls,te[Y.name]=he}else se&&(C=!0,$(),R.put(ce,Y))}}finally{k&&k()}if(C&&(g.schemaVersion++,g.updatedAttributes()),Nr.trace(`${t} table loading, running index`),K.length>0||G.length>0?g.indexingOperation=qie(g,K,G):C&&Bg.signalSchemaChange(new Fg.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=h,C)for(let Y of hh)Y(g,h!=="cluster");return(n||s||i)&&g.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),Nr.trace(`${t} table loaded`),g;function $(){k||p.transactionSync(()=>({then(Y){k=Y}}))}o($,"startTxn")}async function qie(e,t,r){try{Nr.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await Bg.signalSchemaChange(new Fg.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,nd.compareKeys)(f.lastIndexedKey,u)<0&&(u=f.lastIndexedKey),f.lastIndexedKey==null&&f.dbi.clearAsync();let d=0;for(let{key:f,value:m,version:h}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(m){if(d++,s=e.primaryStore.ifVersion(f,h,()=>{for(let p=0;p<l;p++){let _=t[p],g=_.name,y=_.dbi;try{let T=_.resolve,R=m&&(T?T(m):m[g]);if(y.customIndex){y.customIndex.index(f,R);continue}let N=(0,Rk.getIndexedValues)(R);if(N)for(let C=0,k=N.length;C<k;C++)y.put(N[C],f)}catch(T){a[g]||(a[g]=!0,Nr.error(`Error indexing attribute ${g}`,T))}}}),s.then(()=>d--,p=>{d--,Nr.error(p)}),_h.workerData&&_h.workerData.restartNumber!==Ak.restartNumber&&(i=!0),++c%100===0||i){for(let p of t)p.lastIndexedKey=f,e.dbisDB.put(p.key,p);if(i)return}d>kie?await s:d>Gie&&await new Promise(p=>setImmediate(p))}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 Bg.signalSchemaChange(new Fg.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),Nr.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){Nr.error("Error in indexing",n)}}function $ie({table:e,database:t}){let r=$u({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 Tl(e){return hh.push(e),{remove(){let t=hh.indexOf(e);t>-1&&hh.splice(t,1)}}}function gh(e){return ph.push(e),{remove(){let t=ph.indexOf(e);t>-1&&ph.splice(t,1)}}}function Gg(){let e=(0,$t.get)(U.STORAGE_COMPRESSION),t=(0,$t.get)(U.STORAGE_COMPRESSION_DICTIONARY),r=(0,$t.get)(U.STORAGE_COMPRESSION_THRESHOLD)||bk,n={startingOffset:32};return t&&(n.dictionary=Eh.readFileSync(t)),r&&(n.threshold=r),e&&n}var $t,xg,nd,Bt,ns,td,sd,_N,Eh,gN,Rk,Bg,Fg,_h,yk,Ak,Nr,SN,kg,bk,un,ke,ed,hh,ph,Hg,vo,rd,kie,Gie,De=ue(()=>{$t=w(oe()),xg=w(Gt()),nd=require("lmdb"),Bt=require("path"),ns=require("fs"),td=w(yt());w_();sd=w(bm()),_N=w(Im());H();Eh=w(require("fs-extra")),gN=w(Xs()),Rk=w(bn()),Bg=w(Oo()),Fg=w(ii()),_h=require("worker_threads"),yk=w(Q()),Ak=w(st());Li();Kc();Kn();Tk();Nr=(0,yk.forComponent)("storage"),SN="data",kg=Symbol("defined-tables"),bk=((0,$t.get)(U.STORAGE_PAGESIZE)||4096)-60;(0,$t.initSync)();un=Object.create(null),ke=Object.create(null);(0,gN._assignPackageExport)("databases",ke);(0,gN._assignPackageExport)("tables",un);ed=Symbol.for("next-table-id"),hh=[],ph=[],vo=new Map;o(Hie,"getTables");o(it,"getDatabases");o(id,"resetDatabases");o(mh,"readMetaDb");o(Ik,"ensureDB");o(Nk,"setTable");o($u,"database");o(EI,"dropDatabase");o(wk,"openIndex");o(Qe,"table");kie=1e3,Gie=10;o(qie,"runIndexing");o($ie,"dropTableMeta");o(Tl,"onUpdatedTable");o(gh,"onRemovedDB");o(Gg,"getDefaultCompression")});var yN={};Oe(yN,{loadGQLSchema:()=>Yie,start:()=>RN,startOnMainThread:()=>Kie});function RN({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,h=[],p;for(let y of f.definitions)switch(y.kind){case l.OBJECT_TYPE_DEFINITION:let k=function(G){if(G.kind==="NonNullType"){let Y=k(G.type);return Y.nullable=!1,Y}if(G.kind==="ListType")return{type:"array",elements:k(G.type)};let $={type:G.name?.value};return Object.defineProperty($,"location",{value:G.loc.startToken}),$};o(k,"getProperty");let T=y.name.value,R=[],N={table:null,database:null,properties:R};m.set(T,N);for(let G of y.directives){if(G.name.value==="table"){for(let $ of G.arguments)N[$.name.value]=$.value.value;N.schema&&(N.database=N.schema),N.table||(N.table=T),N.audit&&(N.audit=N.audit!=="false"),N.attributes=N.properties,h.push(N)}if(G.name.value==="sealed"&&(N.sealed=!0),G.name.value==="splitSegments"&&(N.splitSegments=!0),G.name.value==="replicate"&&(N.replicate=!0),G.name.value==="export"){N.export=!0;for(let $ of G.arguments)typeof N.export!="object"&&(N.export={}),N.export[$.name.value]=$.value.value}}let C=!1,te={};for(let G of y.fields){let K=k(G.type);K.name=G.name.value,R.push(K),te[K.name]=void 0;for(let $ of G.directives){let Y=$.name.value;if(Y==="primaryKey")C?console.warn("Can not define two attributes as a primary key at",$.loc):(K.isPrimaryKey=!0,C=!0);else if(Y==="indexed"){let ce={};for(let le of $.arguments||[])ce[le.name.value]=le.value.value;K.indexed=ce}else if(Y==="computed"){for(let ce of $.arguments||[])if(ce.name.value==="from"){let le=ce.value.value;K.computed={from:g(le,ce,te)},K.version==null&&(K.version=le)}else ce.name.value==="version"&&(K.version=ce.value.value);K.computed=K.computed||!0}else if(Y==="relationship"){let ce={};for(let le of $.arguments)ce[le.name.value]=le.value.value;K.relationship=ce}else if(Y==="createdTime")K.assignCreatedTime=!0;else if(Y==="updatedTime")K.assignUpdatedTime=!0;else if(Y==="expiresAt")K.expiresAt=!0;else if(Y==="allow"){let ce=K.authorizedRoles=[];for(let le of $.arguments)le.name.value==="role"&&ce.push(le.value.value)}else server.knownGraphQLDirectives.includes(Y)&&console.warn(`@${Y} is an unknown directive, at`,$.loc)}}N.type=T,T==="Query"&&(p=N)}function _(y){let T=m.get(y.type);T?(Object.defineProperty(y,"properties",{value:T.properties}),Object.defineProperty(y,"definition",{value:T})):y.type==="array"?_(y.elements):Vie.includes(y.type)||(0,Ck.getWorkerIndex)()===0&&console.error(`The type ${y.type} is unknown at line ${y.location.line}, column ${y.location.column}, in ${s}`)}o(_,"connectPropertyType");for(let y of m.values())for(let T of y.properties)_(T);for(let y of h)y.tableClass=e(y),y.export&&(y.export.name===""?i.set((0,TN.dirname)(n),y.tableClass):i.set((0,TN.dirname)(n)+"/"+(y.export.name||y.type),y.tableClass,y.export));function g(y,T,R){return new Ok.Script(`function computed(attributes) { return function(record) { with(attributes) { with (record) { return ${y}; } } } } computed;`,{filename:s,lineOffset:T.loc.startToken.line-1,columnOffset:T.loc.startToken.column}).runInThisContext()(R)}o(g,"createComputedFrom")}}var TN,Ok,Ck,Vie,Kie,Yie,Pk=ue(()=>{TN=require("path"),Ok=require("node:vm");De();Ck=w(st()),Vie=["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(RN,"start");Kie=RN,Yie=RN({ensureTable:Qe}).handleFile});var bN={};Oe(bN,{start:()=>toe});function Wie(e){if(e.kind!==Be.Kind.OPERATION_DEFINITION&&e.kind!==Be.Kind.FRAGMENT_DEFINITION)throw new Fr(`Unexpected non-executable definition type ${e.kind}.`)}function Lk(e){if(typeof e!="object"||e===null)throw new ji("Request body must be an object.");if(!("query"in e))throw new ji("Request body must contain a `query` field.");if(typeof e.query!="string")throw new ji("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new ji("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new ji("Request body `operationName` field must be a string.")}function AN(e){return parseInt(e.value,10)}function Mk(e){return parseFloat(e.value)}function vk(e,t,r){let n=r.get(e.name.value);return Uk(n)?xk(n,t):{attribute:t,value:n}}function Uk(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function xk(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],Uk(n)?xk(n,t):{attribute:t,value:n}))}function zie(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case Be.Kind.NULL:return{attribute:t,value:null};case Be.Kind.INT:return{attribute:t,value:AN(e.value)};case Be.Kind.FLOAT:return{attribute:t,value:Mk(e.value)};case Be.Kind.BOOLEAN:case Be.Kind.STRING:return{attribute:t,value:e.value.value};case Be.Kind.VARIABLE:return vk(e.value,t,r);case Be.Kind.OBJECT:return Bk(e.value,t,r);case Be.Kind.LIST:case Be.Kind.ENUM:default:throw new Fr(`Value type, ${e.value.kind}, is not supported.`)}}function Bk(e,t,r){return e.fields.flatMap(n=>zie(n,t,r))}function jie(e,t){switch(e.value.kind){case Be.Kind.NULL:return{attribute:e.name.value,value:null};case Be.Kind.INT:return{attribute:e.name.value,value:AN(e.value)};case Be.Kind.FLOAT:return{attribute:e.name.value,value:Mk(e.value)};case Be.Kind.BOOLEAN:case Be.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case Be.Kind.VARIABLE:return vk(e.value,e.name.value,t);case Be.Kind.OBJECT:return Bk(e.value,[e.name.value],t);case Be.Kind.LIST:case Be.Kind.ENUM:default:throw new Fr(`Argument type, ${e.value.kind}, is not supported.`)}}function Qie(e,t){return e.flatMap(r=>jie(r,t))}function qg(e,t){return e.selections.flatMap(r=>{switch(r.kind){case Be.Kind.FIELD:return r;case Be.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new Fr(`Fragment \`${n}\` not found.`);return qg(s.selectionSet,t)}case Be.Kind.INLINE_FRAGMENT:return qg(r.selectionSet,t)}})}function Fk(e,t){return qg(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:Fk(r.selectionSet,t)}:r.name.value)}async function Jie(e,t,r,n){let s=bs.getMatch(e.name.value,"graphql");if(s===void 0)throw new Fr(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,a={select:Fk(e.selectionSet,r),conditions:Qie(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 Hk(e){switch(e.kind){case Be.Kind.NULL:return null;case Be.Kind.INT:return AN(e);case Be.Kind.FLOAT:return parseFloat(e.value);case Be.Kind.STRING:case Be.Kind.BOOLEAN:return e.value;case Be.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:Hk(r.value),...t}),{});case Be.Kind.LIST:case Be.Kind.ENUM:default:throw new Fr(`Value type, ${e.kind}, is not supported.`)}}function Xie(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=Hk(n.defaultValue)),n.type.kind===Be.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new Fr(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function Zie(e,t,r,n){if(e.operation===Be.OperationTypeNode.SUBSCRIPTION)throw new Fr("Subscriptions are not supported.");if(e.operation===Be.OperationTypeNode.MUTATION)throw new Fr("Mutations are not supported yet.");let s=Xie(e.variableDefinitions,t),i=await Promise.all(qg(e.selectionSet,r).map(c=>Jie(c,s,r,n))),a={data:{}};for(let[c,l]of i)a.data[c]=l;return a}async function Dk({query:e,variables:t={},operationName:r},n){let s=Be.parse(e),i=new Map,a=new Map;for(let u of s.definitions)if(Wie(u),u.kind===Be.Kind.FRAGMENT_DEFINITION)a.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new Fr("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 Fr(`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 Fr("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new Fr(`Operation \`${r}\` not found.`);let l=await Zie(c,t,a,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function eoe(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 Lk(r),Dk(r,e)}case"POST":{let r=await So(e.headers.get("content-type"),!0)(e._nodeRequest);return Lk(r),Dk(r,e)}default:throw new ji("Method Not Allowed",405,{Allow:"GET, POST"})}}function toe(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await eoe(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof ji)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof Be.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof Fr)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 ji)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof Be.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof Fr)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 Be,Fr,ji,kk=ue(()=>{Be=w(require("graphql"));To();vu();o(Wie,"assertExecutableDefinitionNode");o(Lk,"assertRequestParams");o(AN,"processIntValueNode");o(Mk,"processFloatValueNode");o(vk,"processVariableNode");o(Uk,"isObject");o(xk,"transformObjectIntoQueryCondition");o(zie,"processObjectFieldNode");o(Bk,"processObjectValueNode");o(jie,"processArgumentNode");o(Qie,"buildConditionsQuery");o(qg,"fillInFragments");o(Fk,"buildSelectQuery");o(Jie,"processFieldNode");o(Hk,"processConstValueNode");o(Xie,"resolveVariables");o(Zie,"executeOperation");o(Dk,"resolver");Fr=class extends Error{static{o(this,"GraphQLQueryingError")}},ji=class extends Error{static{o(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};o(eoe,"graphqlQueryingHandler");o(toe,"start")});var Yk=M((iDe,Kk)=>{var od=require("validate.js"),qk=dt(),ad=(H(),v(W)),{handleHDBError:roe,hdbErrors:noe}=ge(),{HDB_ERROR_MSGS:er,HTTP_STATUS_CODES:soe}=noe,IN=o(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),ioe={STRUCTURE_USER:"structure_user"},Gk=Object.values(ad.ROLE_TYPES_ENUM),ooe="attribute_permissions",aoe="attribute_name",{PERMS_CRUD_ENUM:cd}=ad,coe=[ooe,...Object.values(cd)],$k=[cd.READ,cd.INSERT,cd.UPDATE],loe=[aoe,...$k];function uoe(e){let t=IN();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,Vk(e,t)}o(uoe,"addRoleValidation");function doe(e){let t=IN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,Vk(e,t)}o(doe,"alterRoleValidation");function foe(e){let t=IN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,qk.validateObject(e,t)}o(foe,"dropRoleValidation");var moe=["operation","role","id","permission","hdb_user","access"];function Vk(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let a=0,c=n.length;a<c;a++)moe.includes(n[a])||s.push(n[a]);s.length>0&&dr(er.INVALID_ROLE_JSON_KEYS(s),r);let i=qk.validateObject(e,t);if(i&&i.message.split(",").forEach(a=>{dr(a,r)}),e.permission){let a=hoe(e);a&&dr(a,r),Gk.forEach(c=>{e.permission[c]&&!od.isBoolean(e.permission[c])&&dr(er.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let a in e.permission)if(Gk.indexOf(a)<0){if(a===ioe.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]||dr(er.SCHEMA_NOT_FOUND(f),r)}continue}dr(er.STRUCTURE_USER_ROLE_TYPE_ERROR(a),r);continue}let c=e.permission[a];if(!a||!global.hdb_schema[a]){dr(er.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]){dr(er.TABLE_NOT_FOUND(a,l),r);continue}if(Object.keys(u).forEach(d=>{coe.includes(d)||dr(er.INVALID_PERM_KEY(d),r,a,l)}),Object.values(cd).forEach(d=>{od.isDefined(u[d])?od.isBoolean(u[d])||dr(er.TABLE_PERM_NOT_BOOLEAN(d),r,a,l):dr(er.TABLE_PERM_MISSING(d),r,a,l)}),u.attribute_permissions===void 0){dr(er.ATTR_PERMS_ARRAY_MISSING,r,a,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){dr(er.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 h=u.attribute_permissions[m];if(Object.keys(h).forEach(_=>{!loe.includes(_)&&_!==cd.DELETE&&dr(er.INVALID_ATTR_PERM_KEY(_),r,a,l)}),!od.isDefined(h.attribute_name)){dr(er.ATTR_PERM_MISSING_NAME,r,a,l);continue}let p=h.attribute_name;if(!d.includes(p)){dr(er.INVALID_ATTRIBUTE_IN_PERMS(p),r,a,l);continue}$k.forEach(_=>{od.isDefined(h[_])?od.isBoolean(h[_])||dr(er.ATTR_PERM_NOT_BOOLEAN(_,p),r,a,l):dr(er.ATTR_PERM_MISSING(_,p),r,a,l)}),!f.read&&h.read===!0&&(f.read=!0),!f.insert&&h.insert===!0&&(f.insert=!0),!f.update&&h.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}`;dr(er.MISMATCHED_TABLE_ATTR_PERMS(m),r,a,l)}}}}return poe(r)}o(Vk,"customValidate");Kk.exports={addRoleValidation:uoe,alterRoleValidation:doe,dropRoleValidation:foe};function hoe(e){let{operation:t,permission:r}=e;if(t===ad.OPERATIONS_ENUM.ADD_ROLE||t===ad.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 er.SU_CU_ROLE_COMBINED_ERROR;{let a=r.super_user?ad.ROLE_TYPES_ENUM.SUPER_USER:ad.ROLE_TYPES_ENUM.CLUSTER_USER;return er.SU_CU_ROLE_NO_PERMS_ALLOWED(a)}}}return null}o(hoe,"validateNoSUPerms");function poe(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:er.ROLE_PERMS_ERROR,...e};return roe(new Error,n,soe.BAD_REQUEST)}else return null}o(poe,"generateRolePermResponse");function dr(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(dr,"addPermError")});var Th=M((cDe,Qk)=>{"use strict";var Wk=vn(),zk=on(),Eoe=dl(),wN=Yk(),ON=Oo(),aDe=require("uuid").v4,_oe=require("util"),$g=(H(),v(W)),goe=ie(),CN=zk.searchByValue,Soe=zk.searchByHash,Toe=_oe.promisify(Eoe.delete),Roe=oi(),yoe=Gu(),{hdbErrors:Aoe,handleHDBError:Rl}=ge(),{HDB_ERROR_MSGS:jk,HTTP_STATUS_CODES:Sh}=Aoe,{UserEventMsg:PN}=ii();Qk.exports={addRole:boe,alterRole:Ioe,dropRole:Noe,listRoles:woe};function NN(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(NN,"scrubRoleDetails");async function boe(e){let t=wN.addRoleValidation(e);if(t)throw t;e=NN(e);let r={schema:"system",table:"hdb_role",search_attribute:"role",search_value:e.role,hash_attribute:"id",get_attributes:["*"]},n;try{n=Array.from(await CN(r)||[])}catch(i){throw Rl(i)}if(n&&n.length>0)throw Rl(new Error,jk.ROLE_ALREADY_EXISTS(e.role),Sh.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 Wk.insert(s),ON.signalUserChange(new PN(process.pid)),e=NN(e),e}o(boe,"addRole");async function Ioe(e){let t=wN.alterRoleValidation(e);if(t)throw t;e=NN(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await Wk.update(r)}catch(s){throw Rl(s)}if(n&&n?.message==="updated 0 of 1 records")throw Rl(new Error,"Invalid role id",Sh.BAD_REQUEST,void 0,void 0,!0);return await ON.signalUserChange(new PN(process.pid)),e}o(Ioe,"alterRole");async function Noe(e){let t=wN.dropRoleValidation(e);if(t)throw Rl(new Error,t,Sh.BAD_REQUEST,void 0,void 0,!0);let r=new yoe($g.SYSTEM_SCHEMA_NAME,$g.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Soe(r));if(n.length===0)throw Rl(new Error,jk.ROLE_NOT_FOUND,Sh.NOT_FOUND,void 0,void 0,!0);let s=new Roe($g.SYSTEM_SCHEMA_NAME,$g.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await CN(s)),a=!1;if(goe.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){a=!0;break}}if(a===!0)throw Rl(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,Sh.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Toe(c),ON.signalUserChange(new PN(process.pid)),`${n[0].role} successfully deleted`}o(Noe,"dropRole");async function woe(){return CN({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}o(woe,"listRoles")});var LN={};Oe(LN,{start:()=>Zk,startOnMainThread:()=>Poe});function Zk({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,Jk.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(Ooe.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 Coe(i)}}}async function Coe(e){let t=it().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,Xk.isEqual)(i,e)?void 0:(e.id=r.id,(0,Vg.alterRole)(e))}return(0,Vg.addRole)(e)}var Vg,Jk,Xk,Ooe,Poe,eG=ue(()=>{De();Vg=w(Th()),Jk=require("yaml"),Xk=require("lodash"),Ooe=["super_user","cluster_user","structure_user"];o(Zk,"start");o(Coe,"ensureRole");Poe=Zk});async function Kg(e){let t=(0,nG.pathToFileURL)(e).toString();if(Loe)return Rh||(Rh=Doe(voe)),(await(await Rh).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function Doe(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),Rh=new Compartment({console,Math,Date,fetch:Moe,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,rG.extname)(r)||(r+=".js"),r)},importHook:o(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){s.Resource=Ur,s.tables=un,s.databases=ke}};let n=await(0,tG.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),Rh}function Moe(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 voe(){return{Resource:Ur,tables:un}}var tG,rG,nG,Loe,Rh,DN=ue(()=>{La();De();tG=require("fs/promises"),rG=require("path"),nG=require("url"),Loe=!1;o(Kg,"secureImport");o(Doe,"getCompartment");o(Moe,"secureOnlyFetch");o(voe,"getGlobalVars")});var MN={};Oe(MN,{handleApplication:()=>Uoe,suppressHandleApplicationWarning:()=>xoe});function sG(e){return typeof e=="function"&&("get"in e||"put"in e||"post"in e||"delete"in e)}async function Uoe(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}Kg(t.absolutePath).then(r=>{let n=(0,Yg.dirname)(t.urlPath);sG(r.default)&&(e.resources.set(n,r.default),e.logger.debug(`Registered root resource: ${n}`)),iG(e,r,n)}).catch(r=>{e.logger.error(`Failed to load resource module ${t.absolutePath}: ${r}`),e.requestRestart()})})}function iG(e,t,r){for(let n in t){let s=t[n],i=(0,Yg.join)(r,n);sG(s)?(e.resources.set(i,s),e.logger.debug(`Registered resource: ${i}`)):typeof s=="object"&&iG(e,s,i)}}var Yg,xoe,oG=ue(()=>{DN();Yg=require("path");o(sG,"isResource");o(Uoe,"handleApplication");o(iG,"recurseForResources");xoe=!0});var UN={};Oe(UN,{start:()=>Boe});function Boe({resources:e}){e.set("login",vN),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var vN,aG=ue(()=>{La();o(Boe,"start");vN=class extends Ur{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 fG(e){let t={openapi:Foe,info:{title:"HarperDB HTTP REST interface",version:dG.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}];for(let[,n]of e){if(!n.path||n.Resource.isError)continue;let{path:s}=n,i=s.split("/").slice(-1),{attributes:a,primaryKey:c,prototype:l}=n.Resource;if(c=c??"id",!c)continue;let u={},d=[];if(a)for(let{type:R,name:N,elements:C,relationship:k,definition:te}of a){if(k)R==="array"?u[N]={type:"array",items:{$ref:Va+C.type}}:u[N]={$ref:Va+R};else{let G=te??C?.definition;if(G){if(!t.components.schemas[G.type]){let K={};G.properties.forEach($=>{K[$.name]=new HN(xN[$.type],$.type)}),t.components.schemas[G.type]=new uG(K)}R==="array"?u[N]={type:"array",items:{$ref:Va+G.type}}:u[N]={$ref:Va+G.type}}else R==="array"?C.type==="Any"||C.type=="ID"?u[N]={type:"array",items:{format:C.type}}:u[N]={type:"array",items:new HN(xN[C.type],C.type)}:R==="Any"||R=="ID"?u[N]={format:R}:u[N]=new HN(xN[R],R)}d.push(new kN(N,"query",u[N]))}let f=Object.keys(u),m=new kN(c,"path",{format:"ID"});m.required=!0,m.description="primary key of record";let h=new kN("property","path",{enum:f});h.required=!0,t.components.schemas[i]=new uG(u);let p=l.post!==Resource.prototype.post||l.update,_=typeof l.put=="function",g=typeof l.get=="function",y=typeof l.delete=="function",T="/"+s+"/";p&&(t.paths[T]={},t.paths[T].post=new Hoe(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[T]||(t.paths[T]={}),t.paths[T].get=new BN(d,r,{200:new FN({$ref:Va+i})},"search for records by the specified property name and value pairs")),y&&(t.paths[T]||(t.paths[T]={}),t.paths[T].delete=new lG(d,r,"delete all the records that match the provided query",{204:new cG})),T="/"+s+"/{"+c+"}",g&&(t.paths[T]={},t.paths[T].get=new BN([m],r,{200:new FN({$ref:Va+i})},"retrieve a record by its primary key")),_&&(t.paths[T]||(t.paths[T]={}),t.paths[T].put=new koe([m],r,i,"create or update the record with the URL path that maps to the record's primary key")),y&&(t.paths[T]||(t.paths[T]={}),t.paths[T].delete=new lG([m],r,"delete a record with the given primary key",{204:new cG})),g&&h.schema.enum.length>0&&(T="/"+s+"/{"+c+"}.{property}",t.paths[T]={},t.paths[T].get=new BN([m,h],r,{200:new FN({enum:f})},"used to retrieve the specified property of the specified record"))}return t}function Hoe(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:Va+e}}}},this.security=t,this.responses={200:{description:GN,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function BN(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function FN(e){this.description=GN,this.content={"application/json":{schema:e}}}function cG(){this.description="successfully processed request, no content returned to client"}function koe(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Va+r}}}},this.responses={200:{description:GN}}}function lG(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function uG(e){this.type="object",this.properties=e}function HN(e,t){this.type=e,this.format=t}function kN(e,t,r){this.name=e,this.in=t,this.schema=r}var dG,Foe,xN,Va,GN,mG=ue(()=>{dG=w(Rt()),Foe="3.0.3",xN={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},Va="#/components/schemas/",GN="successful operation";o(fG,"generateJsonApi");o(Hoe,"Post");o(BN,"Get");o(FN,"Response200");o(cG,"Response204");o(koe,"Put");o(lG,"Delete");o(uG,"ResourceSchema");o(HN,"Type");o(kN,"Parameter")});var pG={};Oe(pG,{Request:()=>Ka,createReuseportFd:()=>Wg});var hG,Ka,qN,$N,Wg,yh=ue(()=>{hG=require("os"),Ka=class{static{o(this,"Request")}#e;constructor(t,r){this.method=t.method;let n=t.url;this._nodeRequest=t,this._nodeResponse=r,this.url=n,this.headers=new $N(t.headers)}get absoluteURL(){return this.protocol+"://"+this.host+this.url}get pathname(){let t=this.url.indexOf("?");return t>-1?this.url.slice(0,t):this.url}set pathname(t){let r=this.url.indexOf("?");r>-1?this.url=t+this.url.slice(r):this.url=t}get protocol(){return this._nodeRequest.socket.encrypted?"https":"http"}get ip(){return this._nodeRequest.socket.remoteAddress}get authorized(){return this._nodeRequest.socket.authorized}get peerCertificate(){return this._nodeRequest.socket.getPeerCertificate()}get mtlsConfig(){return this._nodeRequest.socket.server.mtlsConfig}get body(){return this.#e||(this.#e=new qN(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get httpVersion(){return this._nodeRequest.httpVersion}get isAborted(){return!1}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},qN=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)}},$N=class{constructor(t){this.asObject=t}static{o(this,"Headers")}set(t,r){this.asObject[t.toLowerCase()]=r}get(t){return this.asObject[t.toLowerCase()]}has(t){return this.asObject.hasOwnProperty(t.toLowerCase())}[Symbol.iterator](){return Object.entries(this.asObject)[Symbol.iterator]()}keys(){return Object.keys(this.asObject)}values(){return Object.values(this.asObject)}delete(t){delete this.asObject[t.toLowerCase()]}forEach(t){for(let[r,n]of this)t(n,r,this)}};(0,hG.platform)()!="win32"&&(Wg=require("node-unix-socket").createReuseportFd)});var jg={};Oe(jg,{parseHeaderValue:()=>KN,start:()=>$oe});async function qoe(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&I_(e);let i=new Os;try{e.responseHeaders=i;let a=e.url.slice(1),c,l;if(a!==EG){let g=zg.getMatch(a,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new ti(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let y=KN(g);for(let T of y)switch(T.name){case"max-age":e.expiresAt=T.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(y=>(y.next?.name==="confirm"&&y.next.value>=0&&(e.replicatedConfirmation=+y.next.value),y.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 Ut(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=So(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new ld.ClientError(g,400)}if(e.authorize=!0,a===EG&&s==="GET"){if(e?.user?.role?.permission?.super_user)return fG(zg);throw new ld.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 ld.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new ld.ServerError(`Method ${s} is not recognized`,501)}}),m=200,h;if(f==null)m=s==="GET"||s==="HEAD"?404:204,VN.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(f.status>0&&f.headers){let g=rk(f.headers,i);return f.headers!==g&&(f.headers=g),f.data!==void 0&&(f.body=am(f.data,e,f)),f}else if(h=e.lastModified){Goe[0]=h;let g=String.fromCharCode(34,(jr[0]&63)+62,(jr[0]>>6)+(jr[1]<<2&63)+62,(jr[1]>>4)+(jr[2]<<4&63)+62,(jr[2]>>2)+62,(jr[3]&63)+62,(jr[3]>>6)+(jr[4]<<2&63)+62,(jr[4]>>4)+(jr[5]<<4&63)+62,(jr[5]>>2)+62,(jr[6]&63)+62,(jr[6]>>6)+(jr[7]<<2&63)+62,34),y=r["if-none-match"];y&&g==y?(f?.onDone&&f.onDone(),m=304,f=void 0):i.setIfNone("ETag",g),VN.lastModified&&i.setIfNone("Last-Modified",new Date(h).toUTCString())}e.createdResource&&(m=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let p={status:m,headers:i,body:void 0},_=e.loadedFromSource??f?.wasLoadedFromSource?.();return _!==void 0&&(p.wasCacheMiss=_,!_&&h&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||h))/1e3))),f!==void 0&&(p.body=am(f,e,p),s==="HEAD"&&(p.body=void 0)),p}catch(a){a.statusCode?a.statusCode===500?di.warn(a):di.info(a):di.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=am(a.contentType?a:SG(a),e,c),c}}function $oe(e){VN=e,e.includeExpensiveRecordCountEstimates&&(Ka.prototype.includeExpensiveRecordCountEstimates=!0),!_G&&(_G=!0,zg=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return qoe(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{Ah++;let s=new Vn;gG||(gG=!0,ah(l=>{Ah>0&&l.push({metric:"ws-connections",connections:Ah,byThread:!0})}));let i;t.on("error",l=>{i=!0,di.warn(l)});let a;t.on("message",o(function(u){a||(a=So(r.requestedContentType??r.headers.asObject["content-type"],!1));let d=a(u);ot(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(d)},"message"));let c;t.on("close",()=>{Ah--,zr(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=zg.getMatch(l,"ws");if(zr(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,ot(p=>({count:p.count,total:Ah}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let d=new ti(u.relativeURL);d.checkPermission=r.user?.role?.permission??{};let f=u.Resource;c=(await Ut(r,()=>f.connect(d,s,r)))[Symbol.asyncIterator]();let h;for(;!(h=await c.next()).done;){let p=await Ia(h.value,r);t.send(p),ot(p.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(_=>t._socket.once("drain",_))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?di.warn(l):di.info(l):di.error(l),t.close(Voe[l.statusCode]||1011,SG(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 di,ld,SG,jr,Goe,VN,EG,_G,zg,gG,Ah,Voe,TG=ue(()=>{To();Wi();di=w(Q()),ld=w(ge());N_();_u();vc();lh();mG();yh();O_();({errorToString:SG}=di),jr=new Uint8Array(8),Goe=new Float64Array(jr.buffer,0,1),VN={},EG="openapi";o(qoe,"http");Ah=0;o($oe,"start");Voe={401:3e3,403:3003};o(KN,"parseHeaderValue")});var YN=M((vDe,yG)=>{var{recordAction:Qg,recordActionBinary:RG}=(Wi(),v(wg)),Koe=require("fastify-plugin"),Yoe=200;yG.exports=Koe(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),Qg(a,"duration",u,f,d),RG(s.raw.statusCode<400,"success",u,f,d),RG(1,"response_"+s.raw.statusCode,u,f,d);let m=Yoe;i?.pipe?(i.on("data",g=>{m+=g.length}),i.on("end",()=>{Qg(performance.now()-c,"transfer",u,f,d),Qg(m,"bytes-sent",u,f,d)})):(m+=i?.length||0,Qg(m,"bytes-sent",u,f,d));let h=a.toFixed(3),p=s.getHeader("Server-Timing"),_=`db;dur=${h}`;s.header("Server-Timing",p?`${p}, ${_}`:_)}),r()},{name:"hdb-request-time"})});var bG=M((UDe,AG)=>{var Woe=dt(),zoe={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};AG.exports=function(e){return Woe.validateObject(e,zoe)}});var Jg=M((xDe,IG)=>{"use strict";var joe=(H(),v(W)).OPERATIONS_ENUM,WN=class{static{o(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=joe.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};IG.exports=WN});var Nh={};Oe(Nh,{createTokens:()=>QN,getJWTRSAKeys:()=>rS,refreshOperationToken:()=>JN,validateOperationToken:()=>XN,validateRefreshToken:()=>nS});async function rS(){if(Xg)return Xg;try{let e=bh.default.join(Ih.default.getHdbBasePath(),ky),t=await Zg.default.readFile(bh.default.join(e,Vf.JWT_PASSPHRASE_NAME),"utf8"),r=await Zg.default.readFile(bh.default.join(e,Vf.JWT_PRIVATE_KEY_NAME),"utf8");return Xg={publicKey:await Zg.default.readFile(bh.default.join(e,Vf.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},Xg}catch(e){throw tS.default.error(e),new fi.ClientError(dd.NO_ENCRYPTION_KEYS,ud.INTERNAL_SERVER_ERROR)}}async function QN(e){let t=(0,zN.validateBySchema)(e,Qi.default.object({username:Qi.default.string().optional(),password:Qi.default.string().optional(),role:Qi.default.string().optional(),expires_in:Qi.default.alternatives(Qi.default.string(),Qi.default.number()).optional()}));if(t)throw new fi.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,jN.findAndValidateUser)(e.username,e.password,f)}catch(f){throw tS.default.error(f),new fi.ClientError(dd.INVALID_CREDENTIALS,ud.UNAUTHORIZED)}if(!r)throw new fi.ClientError(dd.INVALID_CREDENTIALS,ud.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 rS(),c=await fd.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:e.expires_in??PG,algorithm:eS,subject:md.OPERATION}),l=await fd.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:Qoe,algorithm:eS,subject:md.REFRESH}),u=UI(l,xr.SHA256);if((await(0,NG.update)(new wG.default($f,hu.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new fi.ClientError(dd.REFRESH_TOKEN_SAVE_FAILED,ud.INTERNAL_SERVER_ERROR);return OG.default.signalUserChange(new CG.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function JN(e){let t=(0,zN.validateBySchema)(e,Qi.default.object({refresh_token:Qi.default.string().required()}).required());if(t)throw new fi.ClientError(t.message);let{refresh_token:r}=e;await nS(r);let n=await rS(),s=await fd.default.decode(r);return{operation_token:await fd.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:PG,algorithm:eS,subject:md.OPERATION})}}async function XN(e){return LG(e,md.OPERATION)}async function nS(e){return LG(e,md.REFRESH)}async function LG(e,t){try{let r=await rS(),n=await fd.default.verify(e,r.publicKey,{algorithms:eS,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,jN.findAndValidateUser)(n.username,void 0,!1);if(t===md.REFRESH&&!xI(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw tS.default.warn(r),r?.name==="TokenExpiredError"?new fi.ClientError(dd.TOKEN_EXPIRED,ud.FORBIDDEN):new fi.ClientError(dd.INVALID_TOKEN,ud.UNAUTHORIZED)}}var fd,Zg,bh,Qi,zN,fi,tS,jN,NG,wG,OG,CG,Ih,ud,dd,PG,Qoe,eS,md,Xg,hd=ue(()=>{fd=w(require("jsonwebtoken")),Zg=w(require("fs-extra")),bh=w(require("node:path")),Qi=w(require("joi")),zN=w(dt());H();fi=w(ge()),tS=w(Q());mg();jN=w(ts()),NG=w(vn()),wG=w(Jg()),OG=w(Oo()),CG=w(ii()),Ih=w(oe()),{HTTP_STATUS_CODES:ud,AUTHENTICATION_ERROR_MSGS:dd}=fi.hdbErrors;Ih.default.initSync();PG=Ih.default.get(U.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",Qoe=Ih.default.get(U.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",eS="RS256",md={OPERATION:"operation",REFRESH:"refresh"};o(rS,"getJWTRSAKeys");o(QN,"createTokens");o(JN,"refreshOperationToken");o(XN,"validateOperationToken");o(nS,"validateRefreshToken");o(LG,"validateToken")});var ZN=M((GDe,vG)=>{"use strict";var Joe=bG(),pd=require("passport"),Xoe=require("passport-local").Strategy,Zoe=require("passport-http").BasicStrategy,eae=require("util"),tae=ts(),MG=eae.callbackify(tae.findAndValidateUser),kDe=rn(),rae=(H(),v(W)),DG=(hd(),v(Nh));pd.use(new Xoe(function(e,t,r){MG(e,t,r)}));pd.use(new Zoe(function(e,t,r){MG(e,t,r)}));pd.serializeUser(function(e,t){t(null,e)});pd.deserializeUser(function(e,t){t(null,e)});function nae(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":pd.authenticate("basic",{session:!1},(a,c)=>{i(a,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===rae.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?DG.validateRefreshToken(s).then(a=>{e.body.refresh_token=s,r(null,a)}).catch(a=>{r(a)}):DG.validateOperationToken(s).then(a=>{r(null,a)}).catch(a=>{r(a)});break;default:pd.authenticate("local",{session:!1},function(a,c){i(a,c)})(e,t,r);break}}o(nae,"authorize");function sae(e,t){let r=Joe(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(sae,"checkPermissions");vG.exports={authorize:nae,checkPermissions:sae}});var sS=M(($De,UG)=>{"use strict";var iae=Jn();UG.exports={writeTransaction:oae};function oae(e,t,r){return iae.writeTransaction(e,t,r)}o(oae,"writeTransaction")});var HG=M((YDe,FG)=>{"use strict";var aae=on(),cae=si(),xG=Q(),lae=vn(),KDe=sS(),uae=require("clone"),tw=require("alasql"),dae=rg(),BG=require("util"),fae=BG.promisify(cae.getTableSchema),mae=BG.promisify(aae.search),hae=(H(),v(W)),ew=ie();dae(tw);FG.exports={update:Eae};var pae="There was a problem performing this update. Please check the logs and try again.";async function Eae({statement:e,hdb_user:t}){let r=await fae(e.table.databaseid,e.table.tableid),n=_ae(e.columns);ew.backtickASTSchemaItems(e);let{table:s,where:i}=e,a=uae(s),c=ew.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=tw.parse(l).statements[0],d=await mae(u),f=gae(n,d);return Sae(a,f,t)}o(Eae,"update");function _ae(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=tw.compile(`SELECT ${r.expression.toString()} AS [${hae.FUNC_VAL}] FROM ?`)}),t}catch(t){throw xG.error(t),new Error(pae)}}o(_ae,"createUpdateRecord");function gae(e,t){return ew.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}o(gae,"buildUpdateRecords");async function Sae(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await lae.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){xG.error(`Error delete new_attributes from update response: ${i}`)}return s}o(Sae,"updateRecords")});var GG=M((QDe,kG)=>{var Tae=require("alasql"),Rae=on(),yae=Q(),Aae=Jn(),nw=require("util"),rw=ie(),bae=(H(),v(W)),Iae=si(),zDe=sS(),jDe=vn(),Nae="record",wae="successfully deleted",Oae=nw.callbackify(Dae),Cae=nw.promisify(Rae.search),Pae=nw.promisify(Iae.getTableSchema);kG.exports={convertDelete:Oae};function Lae(e){return`${e.deleted_hashes.length} ${Nae}${e.deleted_hashes.length===1?"":"s"} ${wae}`}o(Lae,"generateReturnMessage");async function Dae({statement:e,hdb_user:t}){let r=await Pae(e.table.databaseid,e.table.tableid);rw.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=rw.isEmpty(s)?"":` WHERE ${s.toString()}`,a=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=Tae.parse(a).statements[0],l={operation:bae.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await Cae(c);let u=await Aae.deleteRecords(l);return rw.isEmptyOrZeroLength(u.message)&&(u.message=Lae(u)),delete u.txn_time,u}catch(u){throw yae.error(u),u.hdb_code?u.message:u}}o(Dae,"convertDelete")});var YG=M((XDe,KG)=>{"use strict";var Mae=xa(),{hdbErrors:qG}=ge(),{getDatabases:$G}=(De(),v(ht));KG.exports={checkSchemaExists:VG,checkSchemaTableExists:vae,schemaDescribe:Mae};async function VG(e){if(!$G()[e])return qG.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}o(VG,"checkSchemaExists");async function vae(e,t){let r=await VG(e);if(r)return r;if(!$G()[e][t])return qG.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}o(vae,"checkSchemaTableExists")});function sw(e){let t=e.get(iS),r=t?(0,Ed.unpack)(t):null;r||(r={remoteNameToId:{}});let n=Xe(),s=!1;r.nodeName=Xe();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:Oh(e)??1,nodes:[]})})}i[n]=0,e.putSync(iS,(0,Ed.pack)(r))}return r}function wh(e){return sw(e).remoteNameToId}function zG(e,t){let r=sw(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(iS,(0,Ed.pack)(r)),s}function oS(e,t){let r=sw(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(iS,(0,Ed.pack)(r))}return WG.trace?.("The remote node name map",e,n,s),s}var WG,Ed,iS,iw=ue(()=>{WG=w(Zs());ss();Ed=require("msgpackr"),iS=Symbol.for("remote-ids");o(sw,"getIdMappingRecord");o(wh,"exportIdMapping");o(zG,"remoteToLocalNodeId");o(oS,"getIdOfRemoteNode")});var ow={};Oe(ow,{commitsAwaitingReplication:()=>gd,getHDBNodeTable:()=>Vt,getReplicationSharedStatus:()=>Sd,iterateRoutes:()=>Ph,shouldReplicateToNode:()=>Ch,subscribeToNodeUpdates:()=>Td});function Vt(){return jG||(jG=Qe({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 Sd(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Td(e){Vt().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;ZG.debug?.("adding node",n,"on node",Xe()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==Xe()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of Vt().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 Ch(e,t){return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&Vt().primaryStore.get(Xe())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function Uae(){Td(e=>{Ya({},(t,r)=>{let n=e.name,s=QG.get(n);if(s||QG.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=Sd(i,r,n,()=>{let c=a[0],l=a.lastTime;for(let{txnTime:u,onConfirm:d}of gd.get(r)||[])u>l&&u<=c&&d();a.lastTime=c});a.lastTime=0,s.set(r,a)}})})}function*Ph(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=_d.default.get(U.REPLICATION_SECUREPORT)??(!_d.default.get(U.REPLICATION_PORT)&&_d.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||_d.default.get(U.REPLICATION_PORT)||_d.default.get(U.OPERATIONSAPI_NETWORK_PORT);let a=i?.lastIndexOf?.(":");a>0&&(i=+i.slice(a+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){JG.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 JG,XG,_d,ZG,jG,QG,gd,yl=ue(()=>{De();ss();tm();JG=require("worker_threads"),XG=w(ge()),_d=w(oe());H();ZG=w(Zs());server.nodes=[];o(Vt,"getHDBNodeTable");o(Sd,"getReplicationSharedStatus");o(Td,"subscribeToNodeUpdates");o(Ch,"shouldReplicateToNode");QG=new Map;cv((e,t,r)=>{if(r>server.nodes.length)throw new XG.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);gd||(gd=new Map,Uae());let n=gd.get(e);return n||(n=[],gd.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:o(()=>{++i===r&&s()},"onConfirm")})})});o(Uae,"startSubscriptionToReplications");o(Ph,"iterateRoutes")});var rq={};Oe(rq,{connectedToNode:()=>Al,disconnectedFromNode:()=>yd,ensureNode:()=>Uo,requestClusterStatus:()=>tq,startOnMainThread:()=>lw});async function lw(e){let t=0,r=it();for(let i of Object.getOwnPropertyNames(r)){let a=r[i];for(let c in a){let l=a[c];if(l.auditStore){aS.set(i,Oh(l.auditStore));break}}}Xi.whenThreadsStarted.then(async()=>{let i=[];for await(let l of r.system.hdb_nodes?.search([])||[])i.push(l);let a=Xe();function c(){let l=Vt().primaryStore.get(a);if(l!==null){let u=e.url??Wa();if(l===void 0||l.url!==u||l.shard!==e.shard)return Uo(a,{name:a,url:u,shard:e.shard,replicates:!0})}}o(c,"ensureThisNode"),Vt().primaryStore.get(a)&&c();for(let l of Ph(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)}Td(s)});let n;function s(i,a=i?.name){let c=Xe()&&a===Xe()||Wa()&&i?.url===Wa();if(c){let f=!!i?.replicates;if(n!==void 0&&n!==f)for(let m of Vt().search([]))m.replicates&&m.name!==a&&s(m,m.name);n=f}if(ct.trace("Setting up node replication for",i),!i){for(let[f,m]of Ji){let h;for(let[p,{worker:_,nodes:g}]of m){let y=g[0];if(y&&y.name==a){h=!0;for(let[T,{worker:R}]of m)m.delete(T),ct.warn("Node was deleted, unsubscribing from node",a,T,f),R?.postMessage({type:"unsubscribe-from-node",node:a,database:T,url:f});break}}if(h){Ji.get(f).iterator.remove(),Ji.delete(f);return}}return}if(c)return;if(!i.url){ct.info(`Node ${i.name} is missing url`);return}let l=Ji.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(ct.info(`Added node ${i.name} at ${i.url} for process ${Xe()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[f,m]of Rd)if(i.url===m.url){Rd.delete(f);break}Rd.set(i.name,i)}let u=it();if(l||(l=new Map,Ji.set(i.url,l)),l.iterator=Ya(e,(f,m,h)=>{h?d(m,!0):d(m,!1)}),i.subscriptions)for(let f of i.subscriptions){let m=f.database||f.schema;u[m]||(ct.warn(`Database ${m} not found for node ${i.name}, making a subscription anyway`),d(m,!1))}function d(f,m){ct.trace("Setting up replication for database",f,"on node",i.name);let h=l.get(f),p,_=[{replicateByDefault:m,...i}];aS.has(f)&&(_.push({replicateByDefault:m,name:Xe(),startTime:aS.get(f),endTime:Date.now(),replicates:!0}),aS.delete(f));let g=Ch(i,f),y=Xi.workers.filter(T=>T.name==="http");if(h?(p=h.worker,h.nodes=_):g&&(t=t%y.length,p=y[t++],l.set(f,{worker:p,nodes:_,url:i.url}),p?.on("exit",()=>{l.get(f)?.worker===p&&(l.delete(f),d(f,m))})),g)setTimeout(()=>{let T={type:"subscribe-to-node",database:f,nodes:_};p?p.postMessage(T):Lh(T)},xae);else{ct.info("Node no longer should be used, unsubscribing from node",{replicates:i.replicates,databaseName:f,node:i,subscriptions:i.subscriptions,hasDatabase:!!u[f],thisReplicates:Vt().primaryStore.get(Xe())?.replicates}),Vt().primaryStore.get(Xe())?.replicates||(n=!1,ct.info("Disabling replication, this node name",Xe(),Vt().primaryStore.get(Xe()),f));let T={type:"unsubscribe-from-node",database:f,url:i.url,name:i.name};p?p.postMessage(T):lS(T)}}o(d,"onDatabase")}o(s,"onNodeUpdate"),yd=o(function(i){try{ct.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let a=Array.from(Rd.keys()),c=a.sort(),l=c.indexOf(i.name||mi(i.url));if(l===-1){ct.warn("Disconnected node not found in node map",i.name,a);return}let u=Ji.get(i.url),d=u?.get(i.database);if(!d){ct.warn("Disconnected node not found in replication map",i.database,u);return}if(d.connected=!1,i.finished||!cw.default.get(U.REPLICATION_FAILOVER))return;let f=d.nodes[0];if(!(f.replicates===!0||f.replicates?.sends||f.subscriptions?.length))return;let m=f.shard,h=(l+1)%c.length;for(;l!==h;){let p=c[h],_=Rd.get(p);u=Ji.get(_.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==m){h=(h+1)%c.length;continue}let{worker:y,nodes:T}=g,R=!1;for(let N of d.nodes){if(T.some(C=>C.name===N.name)){ct.info(`Disconnected node is already failing over to ${p} for ${i.database}`);continue}N.endTime<Date.now()||(T.push(N),R=!0)}if(d.nodes=[d.nodes[0]],!R){ct.info(`Disconnected node ${i.name} has no nodes to fail over to ${p}`);return}ct.info(`Failing over ${i.database} from ${i.name} to ${p}`),y?y.postMessage({type:"subscribe-to-node",database:i.database,nodes:T}):Lh({database:i.database,nodes:T});return}ct.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(a){ct.error("Error failing over node",a)}},"disconnectedFromNode"),Al=o(function(i){let a=Ji.get(i.url),c=a?.get(i.database);if(!c){ct.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){ct.warn("Newly connected node has no node subscriptions",i.database,c);return}if(!l.name){ct.debug("Connected node is not named yet",i.database,c);return}c.nodes=[l];let u=!1;for(let d of Ji.values()){let f=d.get(i.database);if(!f||f==c)continue;let{worker:m,nodes:h,connected:p}=f;if(h)if(p===!1&&h[0].shard===l.shard)u=!0,c.nodes.push(h[0]);else{let _=h.filter(g=>g&&g.name!==l.name);_.length<h.length&&(f.nodes=_,m.postMessage({type:"subscribe-to-node",database:i.database,nodes:h}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,Xi.onMessageByType)("disconnected-from-node",yd),(0,Xi.onMessageByType)("connected-to-node",Al),(0,Xi.onMessageByType)("request-cluster-status",tq)}function tq(e,t){let r=[];for(let[n,s]of Rd)try{let i=Ji.get(s.url);ct.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(h=>!(h.endTime<Date.now())).map(h=>h.name)});let c=(0,aw.cloneDeep)(s);c.database_sockets=a,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){ct.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Uo(e,t){let r=Vt();e=e??mi(t.url),t.name=e;try{if(t.ca){let s=new eq.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){ct.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(ct.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!cw.default.get(U.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],a=(0,aw.cloneDeep)(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])]}ct.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var Xi,cS,ct,aw,cw,eq,xae,Ji,yd,Al,Rd,aS,Dh=ue(()=>{De();Xi=w(st());ss();cS=require("worker_threads");yl();ct=w(Q()),aw=require("lodash"),cw=w(oe());H();eq=require("crypto"),xae=200,Ji=new Map,Rd=new Map,aS=new Map;o(lw,"startOnMainThread");o(tq,"requestClusterStatus");cS.parentPort&&(yd=o(e=>{cS.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Al=o(e=>{cS.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Xi.onMessageByType)("subscribe-to-node",e=>{Lh(e)}),(0,Xi.onMessageByType)("unsubscribe-from-node",e=>{lS(e)}));o(Uo,"ensureNode")});var os=M(Kt=>{"use strict";var fr=require("path"),{watch:Bae}=require("chokidar"),xn=require("fs-extra"),Ad=require("node-forge"),cq=require("net"),{generateKeyPair:uw,X509Certificate:xo,createPrivateKey:lq}=require("crypto"),Fae=require("util");uw=Fae.promisify(uw);var wt=Ad.pki,hi=require("joi"),{v4:uq}=require("uuid"),{validateBySchema:hw}=dt(),{forComponent:Hae}=Q(),is=oe(),Ls=(H(),v(W)),{CONFIG_PARAMS:Il}=Ls,pi=HI(),{ClientError:ja}=ge(),dS=require("node:tls"),{relative:dq,join:kae}=require("node:path"),{CERT_PREFERENCE_APP:pMe,CERTIFICATE_VALUES:nq}=pi,Gae=Mc(),dw=bt(),{table:qae,getDatabases:$ae,databases:uS}=(De(),v(ht)),{getJWTRSAKeys:sq}=(hd(),v(Nh)),pt=Hae("tls");Kt.generateKeys=_w;Kt.updateConfigCert=Sq;Kt.createCsr=Qae;Kt.signCertificate=Jae;Kt.setCertTable=bd;Kt.loadCertificates=Eq;Kt.reviewSelfSignedCert=Sw;Kt.createTLSSelector=Rq;Kt.listCertificates=Aq;Kt.addCertificate=nce;Kt.removeCertificate=ice;Kt.createNatsCerts=ece;Kt.generateCertsKeys=Zae;Kt.getReplicationCert=vh;Kt.getReplicationCertAuth=jae;Kt.renewSelfSigned=tce;Kt.hostnamesFromCert=Rw;Kt.getKey=oce;Kt.getHostnamesFromCertificate=ace;Kt.getPrimaryHostName=Tw;var{urlToNodeName:fq,getThisNodeUrl:Vae,getThisNodeName:mS,clearThisNodeName:Kae}=(ss(),v(Bo)),{readFileSync:Yae,statSync:mq}=require("node:fs"),EMe=oe(),{getTicketKeys:Wae,onMessageFromWorkers:zae}=st(),za=Q(),{isMainThread:hq}=require("worker_threads"),{TLSSocket:pq,createSecureContext:_Me}=require("node:tls"),pw=3650,Mh=["127.0.0.1","localhost","::1"],Ew=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];zae(async e=>{e.type===Ls.ITC_EVENT_TYPES.RESTART&&(is.initSync(!0),await Sw())});var Qr;function Ja(){return Qr||(Qr=$ae().system.hdb_certificate,Qr||(Qr=qae({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__"}]}))),Qr}o(Ja,"getCertTable");async function vh(){let e=Rq("operations-api"),t={secureContexts:null,setSecureContext:o(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(mS());if(!r)return;let n=new xo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}o(vh,"getReplicationCert");async function jae(){Ja();let e=(await vh()).options.cert,r=new xo(e).issuer.match(/CN=(.*)/)?.[1];return Qr.get(r)}o(jae,"getReplicationCertAuth");var iq,Qa=new Map;function Eq(){if(iq)return;iq=!0;let e=[{configKey:Il.TLS},{configKey:Il.OPERATIONSAPI_TLS}];Ja();let t=fr.dirname(dw.getConfigFilePath()),r;for(let{configKey:n}of e){let s=dw.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let a=i.privateKey,c=a&&dq(kae(t,"keys"),a);c&&oq(a,l=>{Qa.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&hq){let d;oq(u,f=>{if(nq.cert===f)return;let m=i.hostname??i.hostnames??i.host??i.hosts;m&&!Array.isArray(m)&&(m=[m]);let h=Tq(u),p=new xo(h),_;try{_=Tw(p)}catch(R){pt.error("error extracting host name from certificate",R);return}if(_==null){pt.error("No host name found on certificate");return}if(p.checkIssued(new xo(nq.cert)))return;let g=Qr.primaryStore.get(_),y=mq(u).mtimeMs,T=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&y<=T){y<T&&pt.info(`Certificate ${_} at ${u} is older (${new Date(y)}) than the certificate in the database (${T>1?new Date(T):"only self signed certificate available"})`);return}r=Qr.put({name:_,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:m,fileTimestamp:y,details:{issuer:p.issuer.replace(/\n/g," "),subject:p.subject?.replace(/\n/g," "),subject_alt_name:p.subjectAltName,serial_number:p.serialNumber,valid_from:p.validFrom,valid_to:p.validTo}})},l?"certificate authority":"certificate")}}}}}return r}o(Eq,"loadCertificates");function oq(e,t,r){let n,s=o((i,a)=>{try{let c=a.mtimeMs;c&&c!==n&&(n&&hq&&pt.warn(`Reloading ${r}:`,i),n=c,t(Tq(i)))}catch(c){pt.error(`Error loading ${r}:`,i,c)}},"loadFile");xn.existsSync(e)?s(e,mq(e)):pt.error(`${r} file not found:`,e),Bae(e,{persistent:!1}).on("change",s)}o(oq,"loadAndWatch");function fw(){let e=Vae();if(e==null){let t=Mh[0];return pt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return fq(e)}o(fw,"getHost");function fS(){let e=mS();if(e==null){let t=Mh[0];return pt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}o(fS,"getCommonName");async function Qae(){let e=await vh(),t=wt.certificateFromPem(e.options.cert),r=wt.privateKeyFromPem(e.options.key);pt.info("Creating CSR with cert named:",e.name);let n=wt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:fS()},...Ew];pt.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:_q()}];return pt.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Ad.pki.certificationRequestToPem(n)}o(Qae,"createCsr");function _q(){let e=Mh.includes(fS())?Mh:[...Mh,fS()];return e.includes(fw())||e.push(fw()),[{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=>cq.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}o(_q,"certExtensions");async function Jae(e){let t={},r=fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Ja();for await(let d of Qr.search([]))if(d.is_authority&&!d.details.issuer.includes("HarperDB-Certificate-Authority")){if(Qa.has(d.private_key_name)){n=Qa.get(d.private_key_name),s=d;break}else if(d.private_key_name&&await xn.exists(fr.join(r,d.private_key_name))){n=xn.readFile(fr.join(r,d.private_key_name)),s=d;break}}if(!n){let d=await mw();s=d.ca,n=d.private_key}n=wt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=wt.certificateFromPem(s.certificate);pt.info("Signing CSR with cert named",s.name);let a=wt.certificationRequestFromPem(e.csr);try{a.verify()}catch(d){return pt.error(d),new Error("Error verifying CSR: "+d.message)}let c=Ad.pki.createCertificate();c.serialNumber="0"+Math.random().toString().slice(2,9),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+pw),pt.info("sign cert setting validity:",c.validity),pt.info("sign cert setting subject from CSR:",a.subject.attributes),c.setSubject(a.subject.attributes),pt.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=a.getAttribute({name:"extensionRequest"}).extensions;pt.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=a.publicKey,c.sign(n,Ad.md.sha256.create()),t.certificate=wt.certificateToPem(c)}else pt.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}o(Jae,"signCertificate");async function Xae(e,t){await bd({name:mS(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await bd({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:wt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}o(Xae,"createCertificateTable");async function bd(e){let t=new xo(e.certificate);e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},Ja(),await Qr.patch(e)}o(bd,"setCertTable");async function _w(){let e=await uw("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{publicKey:wt.publicKeyFromPem(e.publicKey),privateKey:wt.privateKeyFromPem(e.privateKey)}}o(_w,"generateKeys");async function gw(e,t,r){let n=wt.createCertificate();if(!t){let a=await vh();t=wt.certificateFromPem(a.options.cert).publicKey}n.publicKey=t,n.serialNumber="0"+Math.random().toString().slice(2,9),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+pw);let i=[{name:"commonName",value:fS()},...Ew];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(_q()),n.sign(e,Ad.md.sha256.create()),wt.certificateToPem(n)}o(gw,"generateCertificates");async function mw(){let e=await Aq(),t;for(let r of e){if(!r.is_authority)continue;let n=await yq(r.private_key_name);if(r.private_key_name&&n&&new xo(r.certificate).checkPrivateKey(lq(n))){pt.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;pt.trace("No CA found with matching private key")}o(mw,"getCertAuthority");async function gq(e,t,r=!0){let n=wt.createCertificate();n.publicKey=t,n.serialNumber="0"+Math.random().toString().slice(2,9),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+pw);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${is.get(Il.REPLICATION_HOSTNAME)??fq(is.get(Il.REPLICATION_URL))??uq().split("-")[0]}`},...Ew];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Ad.md.sha256.create());let a=fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),c=fr.join(a,pi.PRIVATEKEY_PEM_NAME);return r&&await xn.writeFile(c,wt.privateKeyToPem(e)),n}o(gq,"generateCertAuthority");async function Zae(){let{privateKey:e,publicKey:t}=await _w(),r=await gq(e,t),n=await gw(e,t,r);await Xae(n,r),Sq()}o(Zae,"generateCertsKeys");async function ece(){let e=await gw(wt.privateKeyFromPem(pi.CERTIFICATE_VALUES.key),void 0,wt.certificateFromPem(pi.CERTIFICATE_VALUES.cert)),t=fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),r=fr.join(t,pi.NATS_CERTIFICATE_PEM_NAME);await xn.exists(r)||await xn.writeFile(r,e);let n=fr.join(t,pi.NATS_CA_PEM_NAME);await xn.exists(n)||await xn.writeFile(n,pi.CERTIFICATE_VALUES.cert)}o(ece,"createNatsCerts");async function tce(){Ja();for await(let e of Qr.search([{attribute:"is_self_signed",value:!0}]))await Qr.delete(e.name);await Sw()}o(tce,"renewSelfSigned");async function Sw(){Kae(),await Eq(),Ja();let e=await mw();if(!e){pt.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=o(u=>{try{return{key:wt.privateKeyFromPem(xn.readFileSync(u)),keyPath:u}}catch(d){return pt.warn(`Failed to parse private key from ${u}:`,d.message),{key:null,keyPath:u}}},"tryToParseKey"),n=is.get(Il.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=is.get(Il.TLS_PRIVATEKEY),d=r(u);s=d.key,i=d.keyPath}let a=fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),c=dq(a,i);s||(pt.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{privateKey:s}=await _w(),xn.existsSync(fr.join(a,pi.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${uq().split("-")[0]}.pem`),await xn.writeFile(fr.join(a,c),wt.privateKeyToPem(s)));let l=await gq(s,wt.setRsaPublicKey(s.n,s.e),!1);await bd({name:l.subject.getField("CN").value,uses:["https"],certificate:wt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await vh()){let r=mS();pt.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await mw();let n=wt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await gw(wt.privateKeyFromPem(e.private_key),s,n);await bd({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}o(Sw,"reviewSelfSignedCert");function Sq(){let e=Gae(Object.keys(Ls.CONFIG_PARAM_MAP),!0),t=fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),r=fr.join(t,pi.PRIVATEKEY_PEM_NAME),n=fr.join(t,pi.NATS_CERTIFICATE_PEM_NAME),s=fr.join(t,pi.NATS_CA_PEM_NAME),i=Ls.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),dw.updateConfigValue(void 0,void 0,a,!1,!0)}o(Sq,"updateConfigCert");function Tq(e){return e.startsWith("-----BEGIN")?e:Yae(e,"utf8")}o(Tq,"readPEM");var aq=dS.createSecureContext;dS.createSecureContext=function(e){if(!e.cert||!e.key)return aq(e);let t={...e};delete t.key,delete t.cert;let r=aq(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var rce=pq.prototype._init;pq.prototype._init=function(e,t){rce.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 bl=new Map;function Rq(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(),bl.clear();let d=0;if(uS===void 0){c();return}for await(let f of uS.system.hdb_certificate.search([])){let m=f.certificate,h=new xo(m);f.is_authority&&(h.asString=m,bl.set(h.subject,m))}for await(let f of uS.system.hdb_certificate.search([]))try{if(f.is_authority)continue;let m=e==="operations-api",h=f.is_self_signed?1:2;m&&f.uses?.includes?.("operations")&&(h+=1);let p=await yq(f.private_key_name),_=f.certificate,g=new xo(_);if(bl.has(g.issuer)&&(_+=`
|
|
15
|
+
`,t)}var El,qH,Ng,ih,aN,cN,oh,$H,Wr,Ig,VH,bg,KH,YH,WH,zH,UH,xH,Ag,JH,_ie,gie,FH,HH,ZH,kH,GH,Tie,tk,Ga,Rie,Wi=ue(()=>{El=require("worker_threads"),qH=w(st());De();Ng=w(Q()),ih=require("path"),aN=require("fs/promises"),cN=w(bn()),oh=w(oe());H();Mr();$H=w(require("node:fs"));iN();oN();Wr=(0,Ng.forComponent)("analytics").conditional;(0,oh.initSync)();Ig=new Map,VH=(0,oh.get)(U.ANALYTICS_AGGREGATEPERIOD)>-1;o(die,"setAnalyticsEnabled");o(fie,"recordExistingAction");o(mie,"recordNewAction");o(ot,"recordAction");Le.recordAnalytics=ot;o(zr,"recordActionBinary");bg=0,KH=1e3,YH="analytics-report",WH=[];o(ah,"addAnalyticsListener");zH=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];o(hie,"sendAnalytics");o(lN,"recordHostname");o(Ju,"storeMetric");o(jH,"calculateCPUUtilization");o(QH,"diffResourceUsage");o(pie,"storeTableSizeMetrics");o(MH,"storeDBSizeMetrics");o(vH,"storeVolumeMetrics");o(Eie,"aggregation");UH=0,xH=0,Ag={userCPUTime:0,systemCPUTime:0},JH=o(()=>new Promise(setImmediate),"rest");o(BH,"cleanup");_ie=36e5,gie=31536e6;o(uN,"getRawAnalyticsTable");o(XH,"getAnalyticsTable");(0,qH.setChildListenerByType)(YH,ek);o(Sie,"startScheduledTasks");kH=0,GH=new Map,Tie=!1;o(ek,"recordAnalytics");Rie=1e6;o(yie,"logAnalytics")});function ch(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 rk(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new Os(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 Os,lh=ue(()=>{Os=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(ch,"appendHeader");o(rk,"mergeHeaders")});function Og(e,t,r=bie){let n;return function(...i){return n?n.length*dN>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();dN=(dN*4+c-i)/5;let l=n.shift();if(l){let{args:u,fn:d}=l;d(),s(c,u)}else n=null})}}var ik,Aie,bie,nk,Iie,fN,sk,dN,mN=ue(()=>{ik=w(Zs()),Aie=3e3,bie=2e4,nk=0,Iie=3e4,fN=3e3,sk=performance.now()+fN,dN=0;o(Og,"throttle");setInterval(()=>{let e=performance.now();e-sk-fN>Aie&&nk+Iie<e&&(ik.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"),nk=e),sk=e},fN).unref()});var pk={};Oe(pk,{EVICTED:()=>Pa,INVALIDATED:()=>wn,coerceType:()=>Pg,makeTable:()=>Dg});function Dg(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:h}=e,{expirationMS:p,evictionMS:_,audit:g,trackDeletes:y}=e;_??=0;let{attributes:T}=e;T||(T=[]);let R=qA(i,n,l),N,C,k={},te=Promise.resolve(),G,K,$;for(let V of T)(V.assignCreatedTime||V.name==="__createdtime__")&&(G=V),(V.assignUpdatedTime||V.name==="__updatedtime__")&&(K=V),V.expiresAt&&($=V),V.isPrimaryKey&&(k=V);let Y,ce=[],le=[],se=1,he=2,Ne={},Ue={},xe=864e5,Tr=0,Qt,Ht,Jt,Df=!1,wc,kt,Mf,vf=gl.get(U.REPLICATION_DATABASES);if(Array.isArray(vf)){for(let V of vf)if(V.name===c&&V.replicateTo>=0){Mf=V.replicateTo;break}}let AE=i.getRange({start:!1,end:!1}).constructor,bE=10,Py=6;g&&Ff(),fm(i.env.path,V=>{if(C)return Ta(V)});class Uf extends nl{static{o(this,"Updatable")}getUpdatedTime(){return Oa.get(this.getRecord())?.version}getExpiresAt(){return Oa.get(this.getRecord())?.expiresAt}addTo(E,S){if(typeof S=="number"||typeof S=="bigint")this.set(E,new $m(S));else throw new Error("Can not add or subtract a non-numeric value")}subtractFrom(E,S){return this.addTo(E,-S)}}class Pe extends Ur{#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=T;static replicate=h;static sealed=f;static splitSegments=m??!0;static createdTimeProperty=G;static updatedTimeProperty=K;static propertyResolvers;static userResolvers={};static sources=[];static getResidencyById;static get expirationMS(){return p}static dbisDB=d;static schemaDefined=u;static sourcedFrom(E,S){if(S&&(this.sourceOptions=S,(S.expiration||S.eviction||S.scanInterval)&&this.setTTLExpiration(S)),S?.intermediateSource)E.intermediateSource=!0,this.sources.unshift(E);else{if(this.sources.some(O=>!O.intermediateSource)){if(this.sources.some(O=>O.name===E.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(E)}C=C||E.get&&(!E.get.reliesOnPrototype||E.prototype.get),N=N||E.load;let A=o(O=>{let D=this.sources;if(D=D.filter(F=>F.intermediateSource&&F[O]&&(!F[O].reliesOnPrototype||F.prototype[O])),D.length>0)if(D.length===1){let F=D[0];return(L,x,z)=>{if(L?.source!==F)return F[O](x,z,L)}}else return(F,L,x)=>{let z=[];for(let ne of D){if(F?.source===ne)break;z.push(ne[O](L,x,F))}return Promise.all(z)}},"getApplyToIntermediateSource"),b=this.sources[this.sources.length-1];b.intermediateSource&&(b={});let I=o(O=>{if(b[O]&&(!b[O].reliesOnPrototype||b.prototype[O]))return(D,F,L)=>{if(!D?.source)return b[O](F,L,D)}},"getApplyToCanonicalSource");Ne={put:I("put"),patch:I("patch"),delete:I("delete"),publish:I("publish")},Ue={put:A("put"),patch:A("patch"),delete:A("delete"),publish:A("publish"),invalidate:A("invalidate")};let P=b.shouldRevalidateEvents;return(async()=>{let O=!1,D,F=o(async(L,x)=>{let z=L.value,ne=L.table?ke[c][L.table]:Pe;if(c===$f&&(L.table===hu.ROLE_TABLE_NAME||L.table===hu.USER_TABLE_NAME)&&(O=!0),L.id===void 0&&(L.id=z[ne.primaryKey],L.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(L));L.source=E;let re={residencyId:Pc(L.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:L.nodeId,async:!0},B=L.id,de=await ne.getResource(B,x,re);switch(L.finished&&await L.finished,L.type){case"put":return P?de._writeInvalidate(B,z,re):de._writeUpdate(B,z,!0,re);case"patch":return P?de._writeInvalidate(B,z,re):de._writeUpdate(B,z,!1,re);case"delete":return de._writeDelete(B,re);case"publish":case"message":return de._writePublish(B,z,re);case"invalidate":return de._writeInvalidate(B,z,re);case"relocate":return de._writeRelocate(B,re);default:Me.default.error?.("Unknown operation",L.type,L.id)}},"writeUpdate");try{let L=E.subscribe;L&&y==null&&(y=!0);let x={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},z=E.subscribeOnThisThread?E.subscribeOnThisThread((0,_l.getWorkerIndex)(),x):(0,_l.getWorkerIndex)()===0,ne=L&&z&&await E.subscribe?.(x);if(ne){let re;for await(let B of ne)try{if(!(B.type==="transaction"?B.writes[0]:B)){Me.default.error?.("Bad subscription event",B);continue}if(B.source=E,B.type==="end_txn"){if(re?.resolve(),B.localTime&&D!==B.localTime){if(B.remoteNodeIds?.length>0){let me=[Symbol.for("seq"),B.remoteNodeIds[0]],Z=d.get(me),j=Z?.nodes;j||(j=[]);for(let _e of B.remoteNodeIds.slice(1)){let pe=j.find(ft=>ft.id===_e);j=j.filter(ft=>ft.id!==_e||ft===pe),pe||(pe={id:_e,seqId:0},j.push(pe)),pe.seqId=Math.max(Z?.seqId??1,B.localTime),_e===re?.nodeId&&(pe.lastTxnTime=B.timestamp)}let Te=Math.max(Z?.seqId??1,B.localTime);Me.default.trace?.("Received txn",c,Te,new Date(Te),B.localTime,new Date(B.localTime),B.remoteNodeIds),d.put(me,{seqId:Te,nodes:j})}D=B.localTime}B.onCommit&&re?.committed.then(B.onCommit);continue}if(re)if(B.beginTxn)re.resolve();else{re.write_promises.push(F(B,re));continue}!B.timestamp&&B.version&&(B.timestamp=B.version);let fe=Ut(B,()=>{if(B.type==="transaction"){let me=[];for(let Z of B.writes)try{me.push(F(Z,B))}catch(j){throw j.message+=" writing "+JSON.stringify(Z)+" of event "+JSON.stringify(B),j}return Promise.all(me)}else if(B.type==="define_schema"){let me=this.attributes.slice(0),Z=!1;for(let j of B.attributes)me.find(Te=>Te.name===j.name)||(me.push(j),Z=!0);Z&&(Qe({table:s,database:c,attributes:me,origin:"cluster"}),dh.signalSchemaChange(new fh.SchemaEventMsg(process.pid,q.CREATE_TABLE,c,s)))}else return B.beginTxn?(re=B,re.write_promises=[F(B,B)],new Promise(me=>{re.resolve=()=>me(Promise.all(re.write_promises))})):F(B,B)});re&&(re.committed=fe),O&&fe&&!fe?.waitingForUserChange&&(fe.then(()=>dh.signalUserChange(new fh.UserEventMsg(process.pid))),fe.waitingForUserChange=!0),B.onCommit&&(fe?fe.then(B.onCommit):B.onCommit())}catch(de){Me.default.error?.("error in subscription handler",de)}}}catch(L){Me.default.error?.(L)}})(),this}static get isCaching(){return C}static get shouldRevalidateEvents(){return this.prototype.get!==Pe.prototype.get}static getResource(E,S,A){let b=super.getResource(E,S,A);if(this.loadAsInstance===!1&&(S._freezeRecords=!0),E!=null&&this.loadAsInstance!==!1){Lr(E);try{if(b.getRecord?.())return b;if(typeof E=="object"&&E&&!Array.isArray(E))throw new Error(`Invalid id ${JSON.stringify(E)}`);let I=!A?.async||i.cache?.get?.(E),P=Dr(S),O=P.getReadTxn();if(O?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return Ea(E,S,{transaction:O,ensureLoaded:A?.ensureLoaded},I,D=>{if(D?Pe._updateResource(b,D):b.#e=null,S.onlyIfCached){if(!b.doesExist())throw new at.ServerError("Entry is not cached",504)}else if(A?.ensureLoaded){let F=Oc(E,D,S,b);if(F)return P?.disregardReadTxn(),b.#i=!0,S.loadedFromSource=!0,Cs(F,L=>(Pe._updateResource(b,L),b))}return b})}catch(I){throw I.message.includes("Unable to serialize object")&&(I.message+=": "+JSON.stringify(E)),I}}return b}static _updateResource(E,S){E.#n=S,E.#e=S?.value??null,E.#r=S?.version}ensureLoaded(){let E=Oc(this.getId(),this.#n,this.getContext());if(E)return this.#i=!0,this.getContext().loadedFromSource=!0,Cs(E,S=>{this.#n=S,this.#e=S.value,this.#r=S.version})}static getNewId(){let E=k?.type;if(E==="String"||E==="ID")return super.getNewId();if(!kt){let I=i.getEntry(Symbol.for("id_allocation")),P=I?.value,O;if(P&&P.nodeName===server.hostname&&(!xie(i)||P.pid===process.pid)){let D=P.start,F=P.end;O=D;for(let L of i.getKeys({start:F,end:D,limit:1,reverse:!0}))O=L}else P=b(I?.version??null),O=P.start;kt=new BigInt64Array([BigInt(O)+1n]),kt=new BigInt64Array(i.getUserSharedBuffer("id",kt.buffer)),kt.maxSafeId=P.end}let S=Number(Atomics.add(kt,0,1n)),A=E==="Int"?512:1048576;if(S+A>=kt.maxSafeId){let I=o(P=>{kt.maxSafeId=S+(E==="Int"?1023:4194303);let O=(E==="Int"?Math.pow(2,31):Math.pow(2,49))-1,D=P?void 0:i.useReadTransaction(),F=Number(kt[0]);for(let z of i.getKeys({start:F+1,end:O,limit:1,transaction:D}))O=z;D?.done();let{value:L,version:x}=i.getEntry(Symbol.for("id_allocation"));if(kt.maxSafeId<O){if(L.end>kt.maxSafeId-100)return;Me.default.info?.("New id allocation",S,kt.maxSafeId,x),i.put(Symbol.for("id_allocation"),{start:L.start,end:kt.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),x)}else{Me.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${kt.maxSafeId}, but id of ${O} detected`);let z=b(x);z.alreadyUpdated||Atomics.store(kt,0,BigInt(z.start+1)),kt.maxSafeId=z.end}},"updateEnd");S+A===kt.maxSafeId?setImmediate(I):S+100>=kt.maxSafeId&&(Me.default.warn?.(`Synchronous id allocation required on table ${s}${E=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>I(!0)))}return S;function b(I){let P=(E==="Int"?Math.pow(2,31):Math.pow(2,49))-1,O=P/4,D,F,L=!1,x,z;do{x=Math.floor(Math.random()*P),z={start:x,end:x+(E==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},D=0;for(let ne of i.getKeys({start:x,limit:1,reverse:!0}))D=ne;F=P;for(let ne of i.getKeys({start:x+1,end:P,limit:1}))F=ne;O*=.875,O<1e3&&!L&&(L=!0,Me.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${E==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,x,D,F,O))}while(!(O<F-x&&(O<x-D||D===0)));return i.transactionSync(()=>{let ne=i.getEntry(Symbol.for("id_allocation"));return(ne?.version??null)==I?(Me.default.info?.("Allocated new id range",z),i.put(Symbol.for("id_allocation"),z,Date.now()),z):(Me.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...ne.value})})}}static setTTLExpiration(E){if(typeof E=="number")p=E*1e3,_||(_=0);else if(E&&typeof E=="object")p=E.expiration*1e3,_=(E.eviction||0)*1e3,xe=E.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(p<0)throw new Error("Expiration can not be negative");xe=xe||(p+_)/4,Ta()}static getResidencyRecord(E){return d.get([Symbol.for("residency_by_id"),E])}static setResidency(E){Pe.getResidency=E&&((S,A)=>{try{return E(S,A)}catch(b){throw b.message+=` in residency function for table ${s}`,b}})}static setResidencyById(E){Pe.getResidencyById=E&&(S=>{try{return E(S)}catch(A){throw A.message+=` in residency function for table ${s}`,A}})}static getResidency(E,S){if(Pe.getResidencyById)return Pe.getResidencyById(E[t]);let A=Mf;if(S.replicateTo!=null){if(Array.isArray(S.replicateTo))return S.replicateTo.includes(server.hostname)?S.replicateTo:[server.hostname,...S.replicateTo];S.replicateTo>=0&&(A=S.replicateTo)}if(A>=0&&server.nodes){let b=[server.hostname];if(S.previousResidency)b.push(...S.previousResidency.slice(0,A));else{let I=server.nodes.map(D=>D.name),P=Math.floor(I.length*Math.random());b.push(...I.slice(P,P+A));let O=P+A-I.length;O>0&&b.push(...I.slice(0,O))}return b}}static enableAuditing(E=!0){g=E,E&&Ff(),Pe.audit=E}static coerceId(E){return E===""?null:Pg(E,k)}static async dropTable(){delete ke[c][s];for(let E of i.getRange({versions:!0,snapshot:!1,lazy:!0}))E.metadataFlags&Vr&&E.value&&Na(E.value);if(c===a){for(let E of T)d.remove(Pe.tableName+"/"+E.name),r[E.name]?.drop();d.remove(Pe.tableName+"/"),i.drop(),await d.committed}else console.log("legacy dropTable"),await i.close(),pN.default.unlinkSync(i.env.path);dh.signalSchemaChange(new fh.SchemaEventMsg(process.pid,q.DROP_TABLE,c,s))}get(E){let S=this.constructor;if(typeof E=="string"&&S.loadAsInstance!==!1)return this.getProperty(E);if(Bf(E))return this.search(E);if(E&&E.id===void 0&&!E.toString()){let A={records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:T,recordCount:void 0,estimatedRecordRange:void 0};return this.getContext()?.includeExpensiveRecordCountEstimates?Pe.getRecordCount().then(b=>(A.recordCount=b.recordCount,A.estimatedRecordRange=b.estimatedRange,A)):A}if(E!==void 0&&S.loadAsInstance===!1){let A=this.getContext(),b=Dr(A),I=b.getReadTxn();if(I?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");let P=Rr(E);Lr(P);let O=!0;return E.checkPermission&&(O=this.allowRead(A.user,E)),Cs(Cs(O,D=>{if(!D)throw new at.AccessViolation(A.user);let F=!0;return Ea(P,A,{transaction:I,ensureLoaded:F},!1,L=>{if(A.onlyIfCached){if(!L?.value)throw new at.ServerError("Entry is not cached",504)}else if(F){let x=Oc(P,L,A);if(x)return b?.disregardReadTxn(),A.loadedFromSource=!0,x.then(z=>z?.value)}return L?.value})}),D=>{let F=E?.select;return F&&D!=null?Du(F,this.constructor)(D):D})}if(E?.property)return this.getProperty(E.property);if(this.doesExist()||E?.ensureLoaded===!1||this.getContext()?.returnNonexistent)return this}allowRead(E,S){let A=_a(E,S);if(A?.read){if(A.isSuperUser)return!0;let b=A.attribute_permissions,I=S?.select;if(b?.length>0||Df&&I){if(S||(S={}),I){let P=b?.length>0&&hN(b,"read");S.select=I.map(O=>{let D=O.name||O;if(!P||P[D]){let F=Jt[D]?.definition?.tableClass;if(F){if(O.name||(O={name:O}),!O.checkPermission&&S.checkPermission&&(O.checkPermission=S.checkPermission),!F.prototype.allowRead.call(null,E,O))return!1;if(!O.select)return O.name}return O}}).filter(Boolean)}else S.select=b.filter(P=>P.read&&!Jt[P.attribute_name]).map(P=>P.attribute_name);return S}else return!0}}allowUpdate(E,S,A){let b=_a(E,A);if(b?.update){let I=b.attribute_permissions;if(I?.length>0){let P=hN(I,"update");for(let O in S)if(!P[O])return!1;for(let O of I){let D=O.attribute_name;!O.update&&!(D in S)&&(S[D]=this.getProperty(D))}}return Sa(this.getContext())}}allowCreate(E,S,A){if(this.isCollection){let b=_a(E,A);if(b?.insert){let I=b.attribute_permissions;if(I?.length>0){let P=hN(I,"insert");for(let O in S)if(!P[O])return!1;return Sa(this.getContext())}else return Sa(this.getContext())}}else return this.allowUpdate(E,{})}allowDelete(E,S){return _a(E,S)?.delete&&Sa(this.getContext())}update(E,S){let A,b=typeof S=="boolean"||S===void 0&&(E==null||typeof E=="object"&&!(E instanceof URLSearchParams)),I=!1;b?(I=S,S=E,A=this.getId()):A=Rr(E);let P=this.getContext();if(!Dr(P))throw new Error("Can not update a table resource outside of a transaction");if(S===!1)return this;if(typeof S=="object"&&S)if(I)Object.isFrozen(S)&&(S={...S}),this.#e={},this.#t=S;else if(b){let D=this.#t;D&&(S=Object.assign(D,S)),this.#t=S}else{let D=!0;if(E==null)throw new TypeError("Can not put a record without a target");return E.checkPermission&&(D=this.allowUpdate(P.user,S,E)),Cs(D,F=>{if(!F)throw new at.AccessViolation(P.user);return Cs(i.get(Rr(E)),L=>{let x=new Uf(L);return x._setChanges(S),this._writeUpdate(A,x.getChanges(),!1),x})})}return this._writeUpdate(A,this.#t,I),this}addTo(E,S){if(typeof S=="number"||typeof S=="bigint")this.#s===ak?this.set(E,(+this.getProperty(E)||0)+S):(this.#s||this.update(),this.set(E,new $m(S)));else throw new Error("Can not add a non-numeric value")}subtractFrom(E,S){if(typeof S=="number")return this.addTo(E,-S);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this.#n}getRecord(){return this.#e}getChanges(){return this.#t}_setChanges(E){this.#t=E}setRecord(E){this.#e=E}invalidate(E){let S=!0,A=this.getContext();return E?.checkPermission&&(S=this.allowDelete(A.user,E,A)),Cs(S,b=>{if(!b)throw new at.AccessViolation(A.user);this._writeInvalidate(E?Rr(E):this.getId())})}_writeInvalidate(E,S,A){let b=this.getContext();Lr(E),Dr(this.getContext()).addWrite({key:E,store:i,invalidated:!0,entry:this.#n,before:Ne.invalidate?.bind(this,b,E),beforeIntermediate:Ra(S,Ue.invalidate?.bind(this,b,E)),commit:o((P,O)=>{if(!(ga(P,O,A?.nodeId)<=0)){S??=null;for(let D in r)S||(S={}),S[D]===void 0&&(S[D]=this.getProperty(D));Me.default.trace?.(`Invalidating entry in ${s} id: ${E}, timestamp: ${new Date(P).toISOString()}`),R(E,S,O,P,wn,g,{user:b?.user,residencyId:A?.residencyId,nodeId:A?.nodeId},"invalidate")}},"commit")})}_writeRelocate(E,S){let A=this.getContext();Lr(E),Dr(this.getContext()).addWrite({key:E,store:i,invalidated:!0,entry:this.#n,before:Ne.relocate?.bind(this,A,E),beforeIntermediate:Ue.relocate?.bind(this,A,E),commit:o((I,P)=>{if(ga(I,P,S?.nodeId)<=0)return;let O=Pe.getResidencyRecord(S.residencyId),D=0,F=null,L=P?.value;if(O&&!O.includes(server.hostname)){for(let x in r)F||(F={}),F[x]=L[x];D=wn}else F=L;Me.default.trace?.(`Relocating entry id: ${E}, timestamp: ${new Date(I).toISOString()}`),R(E,F,P,I,D,g,{user:A.user,residencyId:S.residencyId,nodeId:S.nodeId,expiresAt:S.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(E,S){let A={previousResidency:this.getResidencyRecord(E.residencyId),isRelocation:!0},b=Cc(this.getResidency(S.value,A)),I;if(b){if(!b.includes(server.hostname))return!1;I=Pc(b)}let P=0;Me.default.debug?.("Performing a relocate of an entry",existing_entry.key,S.value,b);let O=R(E.key,S.value,E,E.version,P,!0,{residencyId:I,expiresAt:S.expiresAt},"relocate",!1,null);return!0}static evict(E,S,A){let b=this.Source,I;if(!((C||g)&&(!S||(I=i.getEntry(E),!I||!S)||I.version!==A))){if(C){if(i.hasLock(E,I.version))return;let P;for(let O in r)P||(P={}),P[O]=S[O];if(P)return R(E,P,I,A,Pa,null,null,null,!0)}if(i.ifVersion(E,A,()=>{ho(E,S,null)}),g)return R(E,null,I,A,Pa,null,null,null,!0);Wc(i,I??i.getEntry(E),A)}}lock(){throw new Error("Not yet implemented")}static operation(E,S){return E.table||=s,E.schema||=c,global.operation(E,S)}put(E,S){if(S===void 0||S instanceof URLSearchParams)this.update(E,!0);else{let A=!0;if(E==null)throw new TypeError("Can not put a record without a target");let b=this.getContext();return E.checkPermission&&(A=this.allowUpdate(b.user,S,E)),Cs(A,I=>{if(!I)throw new at.AccessViolation(b.user);if(Array.isArray(S))for(let P of S){let O=P[t];this._writeUpdate(O,P,!0)}else{let P=Rr(E);this._writeUpdate(P,S,!0)}})}}create(E,S){let A=!0,b=this.getContext();if(!S&&!(E instanceof URLSearchParams)&&(S=E,E=void 0),!S||typeof S!="object"||Array.isArray(S))throw new TypeError("Can not create a record without an object");return E?.checkPermission&&(A=this.allowCreate(b.user,S,E)),Cs(A,I=>{if(!I)throw new at.AccessViolation(b.user);let P=Rr(E)??S[t];if(P===void 0)P=this.constructor.getNewId();else if(i.get(P))throw new at.ClientError("Record already exists",409);return this._writeUpdate(P,S,!0),S})}patch(E,S){if(S===void 0||S instanceof URLSearchParams)this.update(E,!1);else{let A=this.update(E,S);if(A?.then)return A.then(()=>{})}}_writeUpdate(E,S,A,b){let I=this.getContext(),P=Dr(I);Lr(E);let O=this.#n??i.getEntry(E);this.#s=A?ak:Die;let D=o(L=>A?L.put?()=>L.put(I,E,S):null:L.patch?()=>L.patch(I,E,S):L.put?()=>L.put(I,E,sl(this)):null,"writeToSources"),F={key:E,store:i,entry:O,nodeName:I?.nodeName,validate:o(L=>{S||(S=this.#t),A||S&&J_(this.#t===S?this:S)?I?.source||(P.checkOverloaded(),this.validate(S,!A),K&&(S[K.name]=K.type==="Date"?new Date(L):K.type==="String"?new Date(L).toISOString():L),A&&(t&&S[t]!==E&&(S[t]=E),G&&(O?.value?S[G.name]=O?.value[G.name]:S[G.name]=G.type==="Date"?new Date(L):G.type==="String"?new Date(L).toISOString():L),S=sl(S))):P.removeWrite(F)},"validate"),before:D(Ne),beforeIntermediate:Ra(S,D(Ue)),commit:o((L,x,z)=>{if(z){if(I&&x?.version>(I.lastModified||0)&&(I.lastModified=x.version),this.#n=x,x?.value&&x.value.getRecord)throw new Error("Can not assign a record to a record, check for circular references");A||(this.#e=x?.value??null)}this.#t=void 0,this.#r=L;let ne=x?.value,re=S;this.#s=0;let B=!1,de=ga(L,x,b?.nodeId),fe;if(de<=0){if(g){let _e=x.localTime,pe=x.version;Me.default.trace?.("Applying CRDT update to record with id: ",E,"txn time",new Date(L),"applying later update from:",new Date(pe),"local recorded time",new Date(_e));let ft=[];for(;_e>L||pe>=L&&_e>0;){let et=l.get(_e);if(!et)break;let tt=At(et);if(pe=tt.version,pe>=L){if(pe===L){if(de=ga(L,{version:pe,localTime:_e},b?.nodeId),de===0)return;if(de>0)continue}if(tt.type==="patch")ft.push(tt),fe=S;else if(tt.type==="put"||tt.type==="delete")return}_e=tt.previousLocalTime}_e||Me.default.debug?.("No further audit history, applying incremental updates based on available history",E,"existing version preserved",x),ft.sort((et,tt)=>et.version-tt.version);for(let et of ft){let tt=et.getValue(i);if(Me.default.debug?.("Rebuilding update with future patch:",new Date(et.version),tt,et),re=WE(re,tt,A),!re)return}}else{if(A)return;re=WE(re,ne,A),Me.default.debug?.("Rebuilding update without audit:",re)}Me.default.trace?.("Rebuilt record to save:",re," is full update:",A)}let me;if(A?me=re:this.constructor.loadAsInstance===!1?me=sl(ne,re):(this.#e=ne,me=sl(this,re)),this.#e=me,me&&me.getRecord)throw new Error("Can not assign a record to a record, check for circular references");let Z;if(b?.residencyId!=null)Z=b.residencyId;else{O?.residencyId&&(I.previousResidency=Pe.getResidencyRecord(O.residencyId));let _e=Cc(Pe.getResidency(me,I));if(_e&&!_e.includes(server.hostname))if(fe??=me,B=!0,Pe.getResidencyById)me=void 0;else{me=null;for(let pe in r)me||(me={}),me[pe]=fe[pe]}Z=Pc(_e)}A||(fe=S);let j=I?.expiresAt??(p?p+Date.now():-1);Me.default.trace?.(`Saving record with id: ${E}, timestamp: ${new Date(L).toISOString()}${j?", expires at: "+new Date(j).toISOString():""}${x?", replaces entry from: "+new Date(x.version).toISOString():", new entry"}`,(()=>{try{return JSON.stringify(me).slice(0,100)}catch{return""}})()),ho(E,ne,me);let Te=A?"put":"patch";R(E,me,x,L,B?wn:0,g,{omitLocalRecord:B,user:I?.user,residencyId:Z,expiresAt:j,nodeId:b?.nodeId,originatingOperation:I?.originatingOperation},Te,!1,fe),I.expiresAt&&Ta()},"commit")};P.addWrite(F)}async delete(E){if(Bf(E)){E.select=["$id"];for await(let S of this.search(E))this._writeDelete(S.$id);return!0}if(E){let S=!0,A=this.getContext();return E.checkPermission&&(S=this.allowDelete(A.user,E,A)),Cs(S,b=>{if(!b)throw new at.AccessViolation(A.user);let I=Rr(E);return this._writeDelete(I),!0})}return this._writeDelete(this.getId()),!!this.#e}_writeDelete(E,S){let A=Dr(this.getContext());Lr(E);let b=this.getContext();return A.addWrite({key:E,store:i,entry:this.#n,nodeName:b?.nodeName,before:Ne.delete?.bind(this,b,E),beforeIntermediate:Ue.delete?.bind(this,b,E),commit:o((I,P,O)=>{let D=P?.value;O&&(b&&P?.version>(b.lastModified||0)&&(b.lastModified=P.version),Pe._updateResource(this,P)),!(ga(I,P,S?.nodeId)<=0)&&(ho(this.getId(),D),Me.default.trace?.(`Deleting record with id: ${E}, txn timestamp: ${new Date(I).toISOString()}`),g||y?(R(E,null,P,I,0,g,{user:b?.user,nodeId:S?.nodeId},"delete"),g||Ta()):Wc(i,P))},"commit")}),!0}search(E){let S=this.getContext(),A=Dr(S);if(!E)throw new Error("No query provided");if(E.parseError)throw E.parseError;if(E.checkPermission&&!this.allowRead(S.user,E))throw new at.AccessViolation(S.user);let b=E.conditions;b?b.length===void 0&&(b=b[Symbol.iterator]?Array.from(b):[b]):b=Array.isArray(E)?E:E[Symbol.iterator]?Array.from(E):[];let I=E.id??this.getId();I&&(b=[{attribute:null,comparator:Array.isArray(I)?"prefix":"starts_with",value:I}].concat(b));let P,O={};function D(j,Te){let _e;switch(Te){case"and":case void 0:if(j.length<1)throw new Error('An "and" operator requires at least one condition');_e=!0;break;case"or":if(j.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+Te)}for(let pe of j){if(pe.conditions){pe.conditions=D(pe.conditions,pe.operator);continue}let ft=pe[0]??pe.attribute,et=ft==null?k:xi(T,ft);if(et)(et.type||VA[pe.comparator])&&(pe[1]===void 0?pe.value=L(pe.value,et):pe[1]=L(pe[1],et));else if(ft!=null&&!E.allowConditionsOnDynamicAttributes)throw(0,at.handleHDBError)(new Error,`${ft} is not a defined attribute`,404);if(pe.chainedConditions)if(pe.chainedConditions.length===1&&(!pe.operator||pe.operator=="and")){let tt=pe.chainedConditions[0],Se,rt;if(tt.comparator==="gt"||tt.comparator==="greater_than"||tt.comparator==="ge"||tt.comparator==="greater_than_equal"?(Se=pe,rt=tt):(Se=tt,rt=pe),Se.comparator!=="lt"&&Se.comparator!=="less_than"&&Se.comparator!=="le"&&Se.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let nt=rt.comparator==="ge"||rt.comparator==="greater_than_equal",ar=Se.comparator==="le"||Se.comparator==="less_than_equal";pe.comparator=(nt?"ge":"gt")+(ar?"le":"lt"),pe.value=[rt.value,Se.value]}else throw new Error("Multiple chained conditions are not currently supported")}return j}o(D,"prepareConditions");function F(j,Te){if(E.enforceExecutionOrder)return j;for(let _e of j)_e.conditions&&(_e.conditions=F(_e.conditions,_e.operator));return j.length>1&&Te!=="or"?Nie(j,b_(Pe)):j}o(F,"orderConditions");function L(j,Te){return Array.isArray(j)?j.map(_e=>Pg(_e,Te)):Pg(j,Te)}o(L,"coerceTypedValues");let x=E.operator;(b.length>0||x)&&(b=D(b,x));let z=typeof E.sort=="object"&&E.sort,ne;if(z&&x!=="or"){let j=z.attribute;if(j==null)throw new at.ClientError("Sort requires an attribute");if(P=b.find(Te=>Cu(Te.attribute)===Cu(j)),!P){let Te=xi(T,j);if(!Te)throw(0,at.handleHDBError)(new Error,`${Array.isArray(j)?j.join("."):j} is not a defined attribute`,404);if(Te.indexed)P={...z,comparator:"sort"},b.push(P);else if(b.length===0&&!E.allowFullScan)throw(0,at.handleHDBError)(new Error,`${Array.isArray(j)?j.join("."):j} is not indexed and not combined with any other conditions`,404)}P&&(P.descending=!!z.descending)}b=F(b,x),z&&(P&&b[0]===P?z.next&&(ne={dbOrderedAttribute:z.attribute,attribute:z.next.attribute,descending:z.next.descending,next:z.next.next}):(P&&b.splice(b.indexOf(P),1),ne=z));let re=E.select;if(b.length===0&&(b=[{attribute:t,comparator:"greater_than",value:!0}]),E.explain)return{conditions:b,operator:x,postOrdering:ne,selectApplied:!!re};let B=A.useReadTxn(),de=KA(b,x,Pe,B,E,S,(j,Te)=>du(j,re,S,B,Te),O),fe=E.ensureLoaded!==!1,me=Pe.transformEntryForSelect(re,S,B,O,fe,!0),Z=Pe.transformToOrderedSelect(de,re,ne,S,B,me);return(E.offset||E.limit!==void 0)&&(Z=Z.slice(E.offset,E.limit!==void 0?(E.offset||0)+E.limit:void 0)),Z.onDone=()=>{Z.onDone=null,A.doneReadTxn()},Z.selectApplied=!0,Z.getColumns=()=>{if(re){let j=[];for(let Te of re)Te==="*"?j.push(...T.map(_e=>_e.name)):j.push(Te.name||Te);return j}return T.filter(j=>!j.computed&&!j.relationship).map(j=>j.name)},Z}static transformToOrderedSelect(E,S,A,b,I,P){let O=new AE;if(A){E=du(E,S,b,I,null);let D;O.iterate=function(){let L,x=E[Symbol.asyncIterator]?E[Symbol.asyncIterator]():E[Symbol.iterator](),z,ne=A.dbOrderedAttribute,re,B,de=!0;function fe(Z){let j=Z.next&&fe(Z.next),Te=Z.descending;return b.sort=Z,(_e,pe)=>{let ft=uu(_e,Z.attribute,b),et=uu(pe,Z.attribute,b),tt=Te?(0,Sl.compareKeys)(et,ft):(0,Sl.compareKeys)(ft,et);return tt===0?j?.(_e,pe)||0:tt}}o(fe,"createComparator");let me=fe(A);return{async next(){let Z;if(L)if(Z=L.next(),Z.done){if(z)return O.onDone&&O.onDone(),Z}else return{value:await P.call(this,Z.value)};D=[],re&&D.push(re);do if(Z=await x.next(),Z.done){if(z=!0,D.length)break;return O.onDone&&O.onDone(),Z}else{let j=Z.value;if(j?.then&&(j=await j),ne){let Te=uu(j,ne,b);if(de)de=!1,B=Te;else if(Te!==B){B=Te,re=j;break}}D.push(j)}while(!0);return A.isGrouped,D.sort(me),L=D[Symbol.iterator](),Z=L.next(),Z.done?(O.onDone&&O.onDone(),Z):{value:await P.call(this,Z.value)}},return(){O.onDone&&O.onDone(),x.return()},throw(){O.onDone&&O.onDone(),x.throw()}}};let F=o(L=>{if(typeof S=="object"&&Array.isArray(L.attribute))for(let x=0;x<S.length;x++){let z=S[x],ne;if(z.name===L.attribute[0]){for(ne=z.sort||(z.sort={});ne.next;)ne=ne.next;ne.attribute=L.attribute.slice(1),ne.descending=L.descending}else z===L.attribute[0]&&(S[x]=ne={name:z,sort:{attribute:L.attribute.slice(1),descending:L.descending}})}L.next&&F(L.next)},"applySortingOnSelect");F(A)}else O.iterate=(E[Symbol.asyncIterator]||E[Symbol.iterator]).bind(E),O=O.map(function(D){try{let F=P.call(this,D);return typeof F?.catch=="function"?F.catch(L=>{throw L.partialObject={[t]:D.key},L}):F}catch(F){throw F.partialObject={[t]:D.key},F}});return O}static transformEntryForSelect(E,S,A,b,I,P){let O;I&&C&&!(typeof E=="string"?[E]:E)?.every(L=>{let x;return typeof L=="object"?x=L.name:x=L,r[x]||x===t})&&(O=!0);let D,F=o(function(L){let x;if(S?.transaction?.stale&&(S.transaction.stale=!1),L!=null){if(x=L.deref?L.deref():L.value,!x&&(L.key===void 0||L.deref)||L.metadataFlags&wn){if(L.metadataFlags&wn&&S.replicateFrom===!1&&P&&L.residencyId)return $a.SKIP;if(L=Ea(L.key??L,S,{transaction:A,lazy:E?.length<4,ensureLoaded:I},this?.isSync,z=>z),L?.then)return L.then(F.bind(this));x=L?.value}if(O&&L?.metadataFlags&(wn|Pa)||L?.expiresAt!=null&&L?.expiresAt<Date.now()){if(S.onlyIfCached)return{[t]:L.key,message:"This entry has expired"};let z=Oc(L.key??L,L,S);if(z?.then)return z.then(F)}}if(x==null)return P?$a.SKIP:x;if(E&&!(E[0]==="*"&&E.length===1)){let z,ne=o((B,de)=>{let fe;typeof B=="object"?fe=B.name:fe=B;let me=Jt?.[fe],Z;if(me){let j=b?.[fe];if(j)if(j.hasMappings){let _e=me.from?x[me.from]:Cu(L.key);Z=j.get(_e),Z||(Z=[])}else Z=j.fromRecord?.(x);else Z=me(x,S,L,!0);let Te=o(_e=>{if(me.directReturn)return de(_e,fe);if(_e&&typeof _e=="object"){let pe=me.definition?.tableClass||Pe;D||(D={});let ft=D[fe]||(D[fe]=pe.transformEntryForSelect(fe===B?null:B.select||(Array.isArray(B)?B:null),S,A,j,I));if(Array.isArray(_e)){let et=[],tt=pe.transformToOrderedSelect(_e,B.select,typeof B.sort=="object"&&B.sort,S,A,ft)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),Se=o(nt=>{for(;!nt.done;){if(nt?.then)return nt.then(Se);et.push(nt.value),nt=tt.next()}de(et,fe)},"nextValue"),rt=Se(tt.next());rt&&(z||(z=[]),z.push(rt));return}else if(_e=ft.call(this,_e),_e?.then){z||(z=[]),z.push(_e.then(et=>de(et,fe)));return}}de(_e,fe)},"handleResolvedValue");Z?.then?(z||(z=[]),z.push(Z.then(Te))):Te(Z);return}else Z=x[fe],Z&&typeof Z=="object"&&fe!==B&&(Z=Pe.transformEntryForSelect(B.select||B,S,A,null)({value:Z}));de(Z,fe)},"selectAttribute"),re;if(typeof E=="string")ne(E,B=>{re=B});else if(Array.isArray(E))if(E.asArray)re=[],E.forEach((B,de)=>{B==="*"?E[de]=x:ne(B,fe=>re[de]=fe)});else{re={};let B=E.forceNulls;for(let de of E)if(de==="*")for(let fe in x)re[fe]=x[fe];else ne(de,(fe,me)=>{fe===void 0&&B&&(fe=null),re[me]=fe})}else throw new at.ClientError("Invalid select"+E);return z?Promise.all(z).then(()=>re):re}return x},"transform");return F}async subscribe(E){if(!l)throw new Error("Can not subscribe to a table without an audit log");g||Qe({table:s,database:c,schemaDefined:u,attributes:T,audit:!0}),E||(E={});let S=!E.rawEvents,A=[],b=this,I=JA(Pe,this.getId()??null,function(O,D,F,L){try{let x=D.getValue?.(i,S),z=D.type;if(!x&&z==="patch"&&S){let re=i.getEntry(O);re?.version===D.version?x=re.value:x=D.getValue?.(i,!0,F),z="put"}let ne={id:O,localTime:F,value:x,version:D.version,type:z,beginTxn:L};A?A.push(ne):this.send(ne)}catch(x){Me.default.error?.(x)}},E.startTime||0,E),P=(async()=>{this.isCollection&&(I.includeDescendants=!0,E.onlyChildren&&(I.onlyChildren=!0)),E.supportsTransactions&&(I.supportsTransactions=!0);let O=this.getId(),D=E.previousCount;D>1e3&&(D=1e3);let F=E.startTime;if(this.isCollection){if(F){if(D)throw new at.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:L,value:x}of l.getRange({start:F,exclusiveStart:!0,snapshot:!1})){let z=At(x);if(z.tableId!==n)continue;let ne=z.recordId;if(O==null||dk(O,ne)){let re=z.getValue(i,S,L);if(I.send({id:ne,localTime:L,value:re,version:z.version,type:z.type}),I.queue?.length>lk&&await I.waitForDrain()===!1)return}I.startTime=L}}else if(D){let L=[];for(let{key:x,value:z}of l.getRange({start:"z",end:!1,reverse:!0}))try{let ne=At(z);if(ne.tableId!==n)continue;let re=ne.recordId;if(O==null||dk(O,re)){let B=ne.getValue(i,S,x);if(L.push({id:re,localTime:x,value:B,version:ne.version,type:ne.type}),--D<=0)break}}catch(ne){Me.default.error("Error getting history entry",x,ne)}for(let x=L.length;x>0;)I.send(L[--x]);L[0]&&(I.startTime=L[0].localTime)}else if(!E.omitCurrent){for(let{key:L,value:x,version:z,localTime:ne}of i.getRange({start:O??!1,end:O==null?void 0:[O,Sl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(x&&(I.send({id:L,localTime:ne,value:x,version:z,type:"put"}),I.queue?.length>lk&&await I.waitForDrain()===!1))return}}else{D&&!F&&(F=0);let L=this.#n?.localTime;if(L===GA&&(i.cache?.delete(O),this.#n=i.getEntry(O),Me.default.trace?.("re-retrieved record",L,this.#n?.localTime),L=this.#n?.localTime),Me.default.trace?.("Subscription from",F,"from",O,L),F<L){let x=[],z=L;do{let ne=l.get(z);if(ne){E.omitCurrent=!0;let re=At(ne),B=re.getValue(i,S,z);S&&(re.type="put"),x.push({id:O,value:B,localTime:z,...re}),z=re.previousLocalTime}else break;D&&D--}while(z>F&&D!==0);for(let ne=x.length;ne>0;)I.send(x[--ne]);I.startTime=L}!E.omitCurrent&&this.doesExist()&&I.send({id:O,localTime:L,value:this.#e,version:this.#r,type:"put"})}for(let L of A)I.send(L);A=null})();return E.listener&&I.on("data",E.listener),I}static subscribeOnThisThread(E,S){return E===0||S?.crossThreads===!1}doesExist(){return!!(this.#e||this.#s)}publish(E,S,A){if(S===void 0||S instanceof URLSearchParams)this._writePublish(this.getId(),E,S);else{let b=!0,I=this.getContext();return E.checkPermission&&(b=this.allowCreate(I.user,E,I)),Cs(b,P=>{if(!P)throw new at.AccessViolation(I.user);let O=Rr(E);this._writePublish(O,S,A)})}}_writePublish(E,S,A){let b=Dr(this.getContext());E??=null,E!==null&&Lr(E);let I=this.getContext();b.addWrite({key:E,store:i,entry:this.#n,nodeName:I?.nodeName,validate:o(()=>{I?.source||(b.checkOverloaded(),this.validate(S))},"validate"),before:Ne.publish?.bind(this,I,E,S),beforeIntermediate:Ra(S,Ue.publish?.bind(this,I,E,S)),commit:o((P,O,D)=>{O===void 0&&y&&!g&&Ta(),Me.default.trace?.(`Publishing message to id: ${E}, timestamp: ${new Date(P).toISOString()}`),R(E,O?.value??null,O,O?.version||P,0,!0,{user:I?.user,residencyId:A?.residencyId,expiresAt:I?.expiresAt,nodeId:A?.nodeId},"message",!1,S)},"commit")})}validate(E,S){let A,b=o((I,P,O)=>{if(P.type&&I!=null)if(S&&I.__op__&&(I=I.value),P.properties){typeof I!="object"&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be an object${P.type?" ("+P.type+")":""}`);let D=P.properties;for(let F=0,L=D.length;F<L;F++){let x=D[F];if(x.relationship||x.computed){E.hasOwnProperty(x.name)&&(A||(A=[])).push(`Computed property ${O}.${x.name} may not be directly assigned a value`);continue}let z=b(I[x.name],x,O+"."+x.name);z&&(I[x.name]=z)}if(P.sealed&&I!=null&&typeof I=="object")for(let F in I)D.find(L=>L.name===F)||(A||(A=[])).push(`Property ${F} is not allowed within object in property ${O}`)}else switch(P.type){case"Int":(typeof I!="number"||I>>0!==I)&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof I!="number"||!(Math.floor(I)===I&&Math.abs(I)<=9007199254740992))&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof I!="number"&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a number`);break;case"ID":typeof I=="string"||I?.length>0&&I.every?.(D=>typeof D=="string")||(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a string, or an array of strings`);break;case"String":typeof I!="string"&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a string`);break;case"Boolean":typeof I!="boolean"&&(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a boolean`);break;case"Date":if(!(I instanceof Date)){if(typeof I=="string"||typeof I=="number")return new Date(I);(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a Date`)}break;case"BigInt":if(typeof I!="bigint"){if(typeof I=="string"||typeof I=="number")return BigInt(I);(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a bigint`)}break;case"Bytes":if(!(I instanceof Uint8Array)){if(typeof I=="string")return Buffer.from(I);(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a Buffer or Uint8Array`)}break;case"Blob":if(!(I instanceof Rs)){if(typeof I=="string"&&(I=Buffer.from(I)),I instanceof Buffer)return createBlob(I,{type:"text/plain"});(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be a Blob`)}break;case"array":if(Array.isArray(I)){if(P.elements)for(let D=0,F=I.length;D<F;D++){let L=I[D],x=b(L,P.elements,O+"[*]");x&&(I[D]=x)}}else(A||(A=[])).push(`Value ${Ps(I)} in property ${O} must be an Array`);break}P.nullable===!1&&I==null&&(A||(A=[])).push(`Property ${O} is required (and not does not allow null values)`)},"validateValue");for(let I=0,P=T.length;I<P;I++){let O=T[I];if(O.relationship||O.computed){Object.hasOwn(E,O.name)&&(A||(A=[])).push(`Computed property ${O.name} may not be directly assigned a value`);continue}if(!S||O.name in E){let D=b(E[O.name],O,O.name);D!==void 0&&(E[O.name]=D)}}if(f)for(let I in E)T.find(P=>P.name===I)||(A||(A=[])).push(`Property ${I} is not allowed`);if(A)throw new at.ClientError(A.join(". "))}getUpdatedTime(){return this.#r}wasLoadedFromSource(){return C?!!this.#i:void 0}static async addAttributes(E){let S=T.slice(0);for(let A of E){if(!A.name)throw new at.ClientError("Attribute name is required");if(A.name.match(/[`/]/))throw new at.ClientError("Attribute names cannot include backticks or forward slashes");wie(A.name),S.push(A)}return Qe({table:s,database:c,schemaDefined:u,attributes:S}),Pe.indexingOperation}static async removeAttributes(E){let S=T.filter(A=>!E.includes(A.name));return Qe({table:s,database:c,schemaDefined:u,attributes:S}),Pe.indexingOperation}static getSize(){let E=i.getStats();return(E.treeBranchPageCount+E.treeLeafPageCount+E.overflowPages)*E.pageSize}static getAuditSize(){let E=l?.getStats();return E&&(E.treeBranchPageCount+E.treeLeafPageCount+E.overflowPages)*E.pageSize}static getStorageStats(){let E=i.env.path,S=pN.default.statfsSync?.(E)??{};return{available:S.bavail*S.bsize,free:S.bfree*S.bsize,size:S.blocks*S.bsize}}static async getRecordCount(E){let S=i.getStats().entryCount,A=1e3/2,b=performance.now(),I=Math.floor(S/2),P=E?.exactCount,O=0,D=0,F;for(let{value:L}of i.getRange({start:!0,lazy:!0,snapshot:!1}))if(L!=null&&O++,D++,await qa(),!P&&D<I&&performance.now()-b>A){F=D;break}if(F){let L=O;O=0;for(let{value:Z}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:F,snapshot:!1}))Z!=null&&O++,await qa();let x=F*2,z=(O+L)/x,ne=Math.pow((O-L+1)/F/2,2)+z*(1-z)/x,re=Math.max(Math.sqrt(ne)*S,1),B=Math.round(z*S),de=Math.max(B-1.96*re,O+L),fe=Math.min(B+1.96*re,S),me=Math.pow(10,Math.round(Math.log10(re)));return me>B&&(me=me/10),O=Math.round(B/me)*me,{recordCount:O,estimatedRange:[Math.round(de),Math.round(fe)]}}return{recordCount:O}}static updatedAttributes(){Jt=this.propertyResolvers={$id:o((E,S,A)=>({value:A.key}),"$id"),$updatedtime:o((E,S,A)=>A.version,"$updatedtime"),$updatedTime:o((E,S,A)=>A.version,"$updatedTime"),$expiresAt:o((E,S,A)=>A.expiresAt,"$expiresAt"),$record:o((E,S,A)=>A?{value:E}:E,"$record"),$distance:o((E,S,A)=>A&&(A.distance??S?.vectorDistances?.get(A)),"$distance")};for(let E of this.attributes){E.isPrimaryKey&&(k=E),E.resolve=null;let S=E.relationship,A=E.computed;if(S)if(E.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),A&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),Df=!0,S.to)E.elements?.definition?(Jt[E.name]=E.resolve=(b,I,P,O)=>{let D=b[S.from?S.from:t],F=E.elements.definition.tableClass;return O?Ou({attribute:S.to,value:D},Dr(I).getReadTxn(),!1,F,!1).map(L=>L&&L.key!==void 0?L:F.primaryStore.getEntry(L,{transaction:Dr(I).getReadTxn()})).asArray:F.search([{attribute:S.to,value:D}],I).asArray},E.set=()=>{},E.resolve.definition=E.elements.definition,E.resolve.to=S.to,S.from&&(E.resolve.from=S.from)):console.error(`The one-to-many/many-to-many relationship property "${E.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(S.from){let b=E.definition||E.elements?.definition;b?(Jt[E.name]=E.resolve=(I,P,O,D)=>{let F=I[S.from];if(F===void 0)return;if(E.elements){let x,z=F?.map(ne=>{let re=b.tableClass.primaryStore[D?"getEntry":"get"](ne,{transaction:Dr(P).getReadTxn()});return re?.then&&(x=!0),Pe.loadAsInstance===!1&&Object.freeze(D?re?.value:re),re});return S.filterMissing?x?Promise.all(z).then(ne=>ne.filter(fk)):z.filter(fk):x?Promise.all(z):z}let L=b.tableClass.primaryStore[D?"getEntry":"get"](F,{transaction:Dr(P).getReadTxn()});return Pe.loadAsInstance===!1&&Object.freeze(D?L?.value:L),L},E.set=(I,P)=>{if(Array.isArray(P)){let O=P.map(D=>D.getId?.()||D[b.tableClass.primaryKey]);I[S.from]=O}else{let O=P.getId?.()||P[b.tableClass.primaryKey];I[S.from]=O}},E.resolve.definition=E.definition||E.elements?.definition,E.resolve.from=S.from):console.error(`The relationship property "${E.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${E.name}" in table "${s}" must use either "from" or "to" arguments`);else if(A)typeof A.from=="function"&&this.setComputedAttribute(E.name,A.from),Jt[E.name]=E.resolve=(b,I,P)=>{let O=typeof A.from=="string"?b[A.from]:b,D=this.userResolvers[E.name];if(D)return D(O,I,P);Me.default.warn(`Computed attribute "${E.name}" does not have a function assigned to it. Please use setComputedAttribute('${E.name}', resolver) to assign a resolver function.`),this.userResolvers[E.name]=()=>{}},E.resolve.directReturn=!0;else if(r[E.name]?.customIndex?.propertyResolver){let b=r[E.name].customIndex;Jt[E.name]=(I,P,O)=>{let D=I[E.name];return b.propertyResolver(D,P,O)},Jt[E.name].directReturn=!0}}Vm(this,this),Vm(Uf,this,!0);for(let E of T){let S=E.name;E.resolve&&Object.defineProperty(i.encoder.structPrototype,S,{get(){return E.resolve(this,Lu.getStore())},set(A){return E.set(this,A)},configurable:!0})}}static setComputedAttribute(E,S){let A=xi(T,E);if(!A){console.error(`The attribute "${E}" does not exist in the table "${s}"`);return}if(!A.computed){console.error(`The attribute "${E}" is not defined as computed in the table "${s}"`);return}this.userResolvers[E]=S}static async deleteHistory(E=0,S=!1){let A;for(let{key:b,value:I}of l.getRange({start:0,end:E}))await qa(),At(I).tableId===n&&(A=p_(l,b,I));if(S)for(let b of i.getRange({start:0,versions:!0})){let{key:I,value:P,localTime:O}=b;await qa(),P===null&&O<E&&(A=Wc(i,b))}await A}static async*getHistory(E=0,S=1/0){for(let{key:A,value:b}of l.getRange({start:E||1,end:S})){await qa();let I=At(b);I.tableId===n&&(yield{id:I.recordId,localTime:A,version:I.version,type:I.type,value:I.getValue(i,!0,A),user:I.user,operation:I.originatingOperation})}}static async getHistoryOfRecord(E){let S=[];if(E==null)throw new Error("An id is required");let A=i.getEntry(E);if(!A)return S;let b=A.localTime;if(!b)throw new Error("The entry does not have a local audit time");let I=0;do{await qa();let P=l.get(b);if(P){let O=At(P);S.push({id:O.recordId,localTime:b,version:O.version,type:O.type,value:O.getValue(i,!0,b),user:O.user}),b=O.previousLocalTime}else break}while(I<1e3&&b);return S.reverse()}static cleanup(){Y?.remove()}}let IE=Og(async(V,E,S)=>{for(let A of Pe.sources)if(A.get&&(!A.get.reliesOnPrototype||A.prototype.get)){if(A.available?.(S)===!1)continue;E.source=A;let b=await A.get(V,E);if(b)return b}},()=>{throw new at.ServerError("Service unavailable, exceeded request queue limit for resolving cache record",503)});Pe.updatedAttributes();let xf=Pe.prototype;return p&&Pe.setTTLExpiration(p/1e3),$&&fu(),Pe;function ho(V,E,S){let A;for(let b in r){let I=r[b],P=I.isIndexing,O=Jt[b],D=S&&(O?O(S):S[b]),F=E&&(O?O(E):E[b]);if(D===F&&!P)continue;if(I.customIndex){I.customIndex.index(V,D,F);continue}A=!0;let L=I.indexNulls,x=(0,uh.getIndexedValues)(D,L),z=(0,uh.getIndexedValues)(F,L);if(s==="OrganizationRole"&&Me.default.error?.({tableName:s,id:V,key:b,valuesToAdd:x,valuesToRemove:z}),z?.length>0){let ne=new Set(z);if(x=x?x.filter(re=>{if(ne.has(re))ne.delete(re);else return!0}):[],z=Array.from(ne),(z.length>0||x.length>0)&&ok){let re=z.concat(x).map(B=>({key:B,value:V}));I.prefetch(re,uk)}for(let re=0,B=z.length;re<B;re++)I.remove(z[re],V)}else x?.length>0&&ok&&I.prefetch(x.map(ne=>({key:ne,value:V})),uk);if(x)for(let ne=0,re=x.length;ne<re;ne++)I.put(x[ne],V)}return A}o(ho,"updateIndices");function Lr(V){switch(typeof V){case"number":return!0;case"string":if(V.length<659)return!0;if(V.length>ck)throw new Error("Primary key size is too large: "+V.length);break;case"object":if(V===null)throw new Error("Invalid primary key of null");break;case"bigint":if(V<2n**64n&&V>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof V)}if((0,Sl.writeKey)(V,Mie,0)>ck)throw new Error("Primary key size is too large: "+V.length);return!0}o(Lr,"checkValidId");function Rr(V){return typeof V=="object"&&V?V.id:V}o(Rr,"requestTargetToId");function Bf(V){return typeof V=="object"&&V&&V.isCollection}o(Bf,"isSearchTarget");function Ss(V){}o(Ss,"isRequestTarget");function Ea(V,E,S,A,b){if(Pe.getResidencyById&&S.ensureLoaded&&E?.replicateFrom!==!1){let P=Cc(Pe.getResidencyById(V));if(P&&!P.includes(server.hostname)&&N)return N({key:V,residency:P}).then(b)}let I=o(()=>{if(E?.transaction?.stale&&(E.transaction.stale=!1),S.transaction?.isDone)return b(null,V);let P=i.getEntry(V,S);return E?._freezeRecords&&Object.freeze(P?.value),P?.residencyId&&P.metadataFlags&wn&&N&&S.ensureLoaded&&E?.replicateFrom!==!1?N(P).then(O=>b(O,V),O=>(Me.default.error?.("Error loading remote record",V,P,S,O),b(null,V))):(P&&E&&(P?.version>(E.lastModified||0)&&(E.lastModified=P.version),P?.localTime&&!E.lastRefreshed&&(E.lastRefreshed=P.localTime)),b(P,V))},"whenPrefetched");return A?I():se>0?(se--,I()):new Promise((P,O)=>{se===0?(se--,i.prefetch([V],()=>{D(),F()})):(ce.push(V),le.push(F),ce.length>Py&&(se--,D()));function D(){if(ce.length>0){let L=le;i.prefetch(ce,()=>{se===-1?D():se++;for(let x of L)x()}),ce=[],le=[],he>2&&he--}else se=he,he<bE&&he++}o(D,"prefetch");function F(){try{P(I())}catch(L){O(L)}}o(F,"load")})}o(Ea,"loadLocalRecord");function _a(V,E){let S=E?.checkPermission;if(typeof S!="object"){if(!V?.role)return;S=V.role.permission}if(S.super_user)return vie;let A=S[c],b,I=A?.tables;if(I)return I[s];if(c==="data"&&(b=S[s])&&!b.tables)return b}o(_a,"getTablePermissions");function Oc(V,E,S,A){if(C){let b=!1;if(S.noCache?b=!0:(E?(!E.value||E.metadataFlags&(wn|Pa)||E.expiresAt!=null&&E.expiresAt<Date.now())&&(b=!0):b=!0,zr(!b,"cache-hit",s)),b){let I=NE(V,E,S).then(P=>(P?.value&&P?.value.getRecord?.()&&Me.default.error?.("Can not assign a record that is already a resource"),S&&(P?.version>(S.lastModified||0)&&(S.lastModified=P.version),S.lastRefreshed=Date.now()),P));if(S?.onlyIfCached||E?.value&&A?.allowStaleWhileRevalidate?.(E,V)){if(I.catch(P=>Me.default.warn?.(P)),S?.onlyIfCached&&!A.doesExist())throw new at.ServerError("Entry is not cached",504);return}else return I}}else if(E?.value&&E.expiresAt!=null&&E.expiresAt<Date.now())return Pe.evict(E.key,E.value,E.version),E.value=null,{then(b){return b(E)}}}o(Oc,"ensureLoadedFromSource");function Dr(V){let E=V?.transaction;if(E){if(!E.lmdbDb)return E.lmdbDb=i,E;do{if(E.lmdbDb?.path===i.path)return E;let S=E.next;if(!S)return E=E.next=new Eo,E.lmdbDb=i,E;E=S}while(!0)}else return new KE}o(Dr,"txnForContext");function uu(V,E,S){if(!V)return;let A=(V.deref?V.deref():V.value)??i.getEntry(V.key)?.value;if(typeof E=="object"){let I=Jt,P=A;for(let O=0,D=E.length;O<D;O++){let F=E[O],L=I?.[F];P=L&&P?L(P,S,V):P?.[F],V=null,I=L?.definition?.tableClass?.propertyResolvers}return P}let b=Jt[E];return b?b(A,S,V):A[E]}o(uu,"getAttributeValue");function du(V,E,S,A,b){let I=b?.length,P={transaction:A,lazy:I>0||typeof E=="string"||E?.length<4,alwaysPrefetch:!0},O;function D(F,L){let x=F?.value;if(!x)return $a.SKIP;for(let z=0;z<I;z++)if(!O?.includes(z)&&!b[z](x,F))return $a.SKIP;return L!==void 0&&(F.key=L),F}if(o(D,"processEntry"),I>0||!V.hasEntries){let F=V.map(L=>{if(O=null,typeof L=="object"&&L?.key!==void 0)return I>0?D(L):L;if(L==null)return $a.SKIP;for(let x=0;x<I;x++){let ne=b[x].idFilter;if(ne){if(!ne(L))return $a.SKIP;O||(O=[]),O.push(x)}}return Ea(L,S,P,!1,D)});return Array.isArray(V)&&(F=F.filter(L=>L!==$a.SKIP)),F.hasEntries=!0,F}return V}o(du,"transformToEntries");function ga(V,E,S=server.replication?.getThisNodeId(l)){if(V<=E?.version){if(E?.version===V&&S!==void 0){let A=server.replication?.exportIdMapping(l),b=E.localTime,I=b&&l.get(b);if(I){let P,O,D=At(I);for(let F in A)A[F]===S&&(P=F),A[F]===D.nodeId&&(O=F);if(P>O)return 1;if(P===O)return 0}}return-1}return 1}o(ga,"precedesExistingVersion");async function NE(V,E,S){let A=E?.metadataFlags,b=E?.version,I,P;if(!i.attemptLock(V,b,()=>{clearTimeout(P);let L=i.getEntry(V);!L||!L.value||L.metadataFlags&(wn|Pa)?I(NE(V,i.getEntry(V),S)):I(L)}))return new Promise(L=>{I=L,P=setTimeout(()=>{i.unlock(V,b)},Lie)});let O=E?.value,D={requestContext:S,replacingRecord:O,replacingEntry:E,replacingVersion:b,noCacheStore:!1,source:null,resourceCache:S?.resourceCache,transaction:void 0,expiresAt:void 0,lastModified:void 0},F=S?.responseHeaders;return new Promise((L,x)=>{let z;Cs(Ut(D,async ne=>{let re=performance.now(),B,de,fe;try{B=await IE(V,D,E),fe=A&wn;let Z=D.lastModified||fe&&b;de=fe||Z>b||!O,Z||(Z=(0,uh.getNextMonotonicTime)());let j=performance.now()-re;if(ot(j,"cache-resolution",s,null,"success"),F&&ch(F,"Server-Timing",`cache-resolve;dur=${j.toFixed(2)}`,!0),ne.timestamp=Z,p&&D.expiresAt==null&&(D.expiresAt=Date.now()+p),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=O,Z=b;else throw new at.ServerError(B.body||"Error from source",B.status);else B=B.body;typeof B.toJSON=="function"&&(B=B.toJSON()),t&&B[t]!==V&&(B[t]=V)}z=!0,L({key:V,version:Z,value:B})}catch(Z){Z.message+=` while resolving record ${V} for ${s}`,O&&((Z.code==="ECONNRESET"||Z.code==="ECONNREFUSED"||Z.code==="EAI_AGAIN")&&!S?.mustRevalidate||S?.staleIfError&&(Z.statusCode===500||Z.statusCode===502||Z.statusCode===503||Z.statusCode===504))?(L({key:V,version:b,value:O}),Me.default.trace?.(Z.message,"(returned stale record)")):x(Z);let j=performance.now()-re;ot(j,"cache-resolution",s,null,"fail"),F&&ch(F,"Server-Timing",`cache-resolve;dur=${j.toFixed(2)}`,!0),D.transaction.abort();return}if(S?.noCacheStore||D.noCacheStore){D.transaction.abort();return}Dr(D).addWrite({key:V,store:i,entry:E,nodeName:"source",before:Ra(B),commit:o((Z,j)=>{if(j?.version!==b)return;let Te=ho(V,O,B);if(B){Ue.put?.(D,V,B),j&&(S.previousResidency=Pe.getResidencyRecord(j.residencyId));let _e,pe=!1,ft,et=Cc(Pe.getResidency(B,S));if(et){if(!et.includes(server.hostname))if(_e=B,pe=!0,Pe.getResidencyById)B=void 0;else{B=null;for(let tt in r)B||(B={}),B[tt]=_e[tt]}ft=Pc(et)}Me.default.trace?.(`Writing resolved record from source with id: ${V}, timestamp: ${new Date(Z).toISOString()}`),R(V,B,j,Z,pe?wn:0,g&&(de||pe)||null,{user:D?.user,expiresAt:D.expiresAt,residencyId:ft},"put",!!fe,_e)}else j&&(Ue.delete?.(D,V),Me.default.trace?.(`Deleting resolved record from source with id: ${V}, timestamp: ${new Date(Z).toISOString()}`),g||y?R(V,null,j,Z,0,g&&de||null,{user:D?.user},"delete",!!fe):Wc(i,j,b))},"commit")})}),()=>{i.unlock(V,b)},ne=>{i.unlock(V,b),z&&Me.default.error?.("Error committing cache update",ne)})})}o(NE,"getFromSource");function Sa(V){if(!V||V.user?.role?.permission?.super_user)return!0;if(V.replicateTo)throw new at.ClientError("Can not specify replication parameters without super user permissions",403);if(V.replicatedConfirmation)throw new at.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}o(Sa,"checkContextPermissions");function Ta(V){let E=!1;if(V&&(V-Tr>1&&(E=!0),Tr=V),!(xe===Qt&&!E)&&(Qt=xe,(0,_l.getWorkerIndex)()===(0,_l.getWorkerCount)()-1))return Ht&&clearTimeout(Ht),xe?new Promise(S=>{let A=new Date;A.setMonth(0),A.setDate(1),A.setHours(0),A.setMinutes(0),A.setSeconds(0);let b=xe/(1+Tr),I=E?Date.now():Math.ceil((Date.now()-A.getTime())/b)*b+A.getTime(),P=o(O=>{Me.default.trace?.(`Scheduled next cleanup scan at ${new Date(O)}`),Ht=setTimeout(()=>te=te.then(async()=>{if(P(Math.max(O+xe,Date.now())),i.rootStore.status!=="open"){clearTimeout(Ht);return}let D=50,F=new Array(D),L=0,x=Math.pow(Tr,8)*(gl.get(U.STORAGE_RECLAMATION_EVICTIONFACTOR)??1e5),z=_/Math.pow(Math.max(Tr,1),4);Me.default.info?.(`Starting cleanup scan for ${s}, evict threshold ${x}, adjusted eviction ${z}ms`);function ne(re,B,de,fe){let me=re+z-Date.now();if(me<0)return!0;if(Tr){let Z=i.lastSize;return de&Vr&&Fc(fe,j=>{j.size&&(Z+=j.size)}),Me.default.trace?.(`shouldEvict adjusted ${me} ${Z}, ${me*(re-B)/Z} < ${x}`),me*(re-B)/Z<x}return!1}o(ne,"shouldEvict");try{let re=0;for(let B of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let{key:de,value:fe,version:me,expiresAt:Z,metadataFlags:j}=B,Te;fe===null&&!g&&me+Pie<Date.now()?Te=Wc(i,B,me):Z!=null&&ne(Z,me,j,fe)&&(Te=Pe.evict(de,fe,me),re++),Te&&(await F[L],F[L]=Te.catch(_e=>{Me.default.error?.("Cleanup error",_e)}),++L>=D&&(L=0)),await qa()}Me.default.info?.(`Finished cleanup scan for ${s}, evicted ${re} entries`)}catch(re){Me.default.warn?.(`Error in cleanup scan for ${s}:`,re)}S(void 0),Tr=0}),Math.min(O-Date.now(),2147483647)).unref()},"startNextTimer");P(I)}):void 0}o(Ta,"scheduleCleanup");function Ff(){Y=l?.addDeleteRemovalCallback(n,i,(V,E)=>{i.remove(V,E)})}o(Ff,"addDeleteRemoval");function fu(){(0,_l.getWorkerIndex)()===0&&setInterval(async()=>{if(!wc){wc=!0;try{let V=$.name,E=r[V];if(!E)throw new Error(`expiresAt attribute ${$} must be indexed`);for(let S of E.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let A of E.getValues(S)){let b=i.getEntry(A);b?.value?b.value[V]<Date.now()&&Pe.evict(A,b.value,b.version):i.ifVersion(A,b?.version,()=>E.remove(S,A))}await qa()}}catch(V){Me.default.error?.("Error in evicting old records",V)}finally{wc=!1}}},Cie).unref()}o(fu,"runRecordExpirationEviction");function Cc(V){if(V!=null){if(Array.isArray(V))return V;if(typeof V=="number"){if(V>=65536)throw new Error(`Shard id ${V} must be below 65536`);let E=server.shards?.get?.(V);if(E)return Me.default.trace?.(`Shard ${V} mapped to ${E.map(S=>S.name).join(", ")}`),E.map(S=>S.name);throw new Error(`Shard ${V} is not defined`)}throw new Error(`Shard or residency list ${V} is not a valid type, must be a shard number or residency list of node hostnames`)}}o(Cc,"residencyFromFunction");function Pc(V){if(V){let E=V.join(","),S=d.get([Symbol.for("residency_by_set"),E]);return S||(d.put([Symbol.for("residency_by_set"),E],S=Math.floor(Math.random()*2147418112)+65535),d.put([Symbol.for("residency_by_id"),S],V),S)}}o(Pc,"getResidencyId");function Ra(V,E){let S=bA(V,i.rootStore);if(S){let A=E;return A?async()=>{await A(),await S}:()=>S}return E}o(Ra,"preCommitBlobsForRecordBefore")}function hN(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 uk(){}function Pg(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 Cg(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return Cg(+e);case"Float":return e==="null"?null:Cg(+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;Uie.test(e)||(e+="Z");let n=new Date(e);return Cg(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,Lg.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function Cg(e){if(isNaN(e))throw new SyntaxError;return e}function dk(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 Cs(e,t,r){return e?.then?e.then(t,r):t(e)}function fk(e){return e!=null}function Ps(e){try{return JSON.stringify(e)}catch{return e}}function xie(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var $a,uh,mk,hk,gl,at,dh,fh,Me,Sl,_l,Lg,pN,Nie,wie,Oie,Cie,Pie,ok,Lie,ak,Die,wn,Pa,Mie,ck,lk,vie,xLe,Uie,qa,w_=ue(()=>{H();$a=require("lmdb"),uh=w(bn()),mk=w(require("lodash")),hk=w(Zf());La();tm();gl=w(oe());XA();at=w(ge()),dh=w(Oo()),fh=w(ii());De();N_();Me=w(Zs());dI();vc();Sl=require("ordered-binary"),_l=w(st());Li();Lg=w(ie());Kc();Wi();zE();lh();pN=w(require("node:fs"));Kn();d_();mN();({sortBy:Nie}=mk.default),{validateAttribute:wie}=hk.default,Oie=new Uint8Array(9);Oie[8]=192;Cie=6e4,Pie=864e5;gl.initSync();ok=gl.get(U.STORAGE_PREFETCHWRITES),Lie=1e4,ak=1,Die=2,wn=1,Pa=8,Mie=Buffer.allocUnsafeSlow(8192),ck=1978,lk=100,vie={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},xLe=(0,Lg.convertToMS)(gl.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;o(Dg,"makeTable");o(hN,"attributesAsObject");o(uk,"noop");Uie=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;o(Pg,"coerceType");o(Cg,"rejectNaN");o(dk,"isDescendantId");qa=o(()=>new Promise(setImmediate),"rest");o(Cs,"when");o(fk,"exists");o(Ps,"stringify");o(xie,"hasOtherProcesses")});function Mg(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 vg(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 Ek=ue(()=>{o(Mg,"euclideanDistance");o(vg,"cosineDistance")});var _k,gk,Zu,zi,Xu,Bie,Fie,Ug,Sk=ue(()=>{Ek();_k=require("msgpackr"),gk=w(Zs()),Zu=w(ge()),zi=(0,gk.loggerWithTag)("HNSW"),Xu=Symbol.for("entryPoint"),Bie=Symbol.for("key"),Fie=10,Ug=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=_k.FLOAT32_OPTIONS.ALWAYS),this.distance=r?.distance==="euclidean"?Mg:vg,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"?[Bie,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(Xu);if(n?c={...this.indexStore.get(i)}:c={},r){let f=l&&this.indexStore.get(l);if(f===void 0){let _=Math.floor(-Math.log(Math.random())*this.mL),g={vector:r,level:_,primaryKey:t};for(let y=0;y<=_;y++)g[y]=[];if(this.indexStore.put(i,g),typeof i!="number")throw new Error("Invalid nodeId: "+i);zi.debug?.("setting entry point to",i),this.indexStore.put(Xu,i);return}let m=c.level??Math.min(Math.floor(-Math.log(Math.random())*this.mL),Fie),h=f.level;if(m>=h){if(typeof i!="number")throw new Error("Invalid nodeId: "+i);zi.debug?.("setting entry point to",i),this.indexStore.put(Xu,i)}for(;h>m;){let _=this.searchLayer(r,l,f,this.efConstruction,h);_.length>0&&(l=_[0].id,f=_[0].node),h--}let p=new Array(m+1);for(let _=0;_<=m;_++)p[_]=[];for(let _=Math.min(m,h);_>=0;_--){let g=this.searchLayer(r,l,f,this.efConstruction,_);g=g.slice(0,this.M<<1),g.length===0&&_===0&&zi.info?.("should not have zero connections for",l);let y=p[_];for(let T=0;T<g.length;T++){let{id:R,distance:N,node:C}=g[T];if(R===i)continue;let k=[];if(this.optimizeRouting){let K=!1,$=C[_],Y=1+this.optimizeRouting*(1+.5*T/this.M);for(let ce=0;ce<$.length;ce++){let{id:le,distance:se}=$[ce],he=1+this.optimizeRouting*(1+.5*ce/this.M);for(let Ne=0;Ne<y.length;Ne++){let{id:Ue,distance:xe}=y[Ne];if(Ue===le){N*Y>xe+se?K=!0:se*he>N+xe&&(k.push({fromId:Ue,toId:R}),k.push({fromId:R,toId:Ue}));break}}if(K)break}if(K)continue}else if(T>=(_>0?this.M:this.M<<1))continue;y.push({id:R,distance:N});for(let{fromId:K,toId:$}of k){let Y=d(K);Y||(Y=d(K,this.indexStore.get(K)));for(let ce=0;ce<Y[_].length;ce++)if(Y[_][ce].id===$){Object.isFrozen(Y[_])&&(Y[_]=Y[_].slice()),Y[_].splice(ce,1);break}}let te=c[_],G=te?.find(({id:K})=>K===R);if(G){let K=te?.indexOf(G);te.copied||(te=[...te],te.copied=!0,c[_]=te),te.splice(K,1)}else this.addConnection(R,d(R,C),i,_,N,d)}}this.indexStore.put(i,{vector:r,level:m,primaryKey:t,...p})}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:h,value:p}of this.indexStore.getRange({start:0,end:1/0}))if(p.level>m){if(l=h,p.level===f)break;m=p.level}}if(l===void 0)this.indexStore.remove(Xu);else{if(typeof l!="number")throw new Error("Invalid nodeId: "+l);zi.debug?.("setting entry point to",l),this.indexStore.put(Xu,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:h}of m){let p=d(h,this.indexStore.get(h));for(let _=0;_<=f;_++)p[_]=p[_]?.filter(({id:g})=>g!==i),p[_].length===0&&(zi.info?.("node was left orphaned, will reindex",h),u.set(p.primaryKey,p.vector))}}function d(f,m){let h=a.get(f);return!h&&m&&(h={...m},a.set(f,h)),h}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(Xu);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((h,p)=>h.distance-p.distance);let d=l.shift(),f=u[u.length-1].distance;if(d.distance>f)break;let m=d.node;for(let{id:h}of m[i]||[]){if(c.has(h)||h===void 0)continue;c.add(h);let p=this.indexStore.get(h);if(!p)continue;this.nodesVisitedCount++;let _=a(t,p.vector);if(_<f||u.length<s){let g={id:h,distance:_,node:p};l.push(g),u.push(g)}}u.sort((h,p)=>h.distance-p.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 Zu.ClientError(`Can not use "${i}" comparator with HNSW`)}if(n)throw new Zu.ClientError("Can not use descending sort order with HNSW");let c;if(s==="cosine")c=vg;else if(s==="euclidean")c=Mg;else{if(s)throw new Zu.ClientError("Unknown distance function");c=this.distance}if(!t)throw new Zu.ClientError("A target vector must be provided for an HNSW query");if(!Array.isArray(t))throw new Zu.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){zi.info?.("could not find neighbor node",a);continue}a[n]?.find(({id:l})=>l==t)||zi.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)){zi.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:h})=>h!==t),s===0&&m[s].length===0&&zi.info?.("should not remove last connection",t,n))}}r[s].find(({id:l})=>l===n)?zi.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"?Mg:vg);let c=a(s.target,t);return i.set(n,c),c}return t}}});var EN,Tk=ue(()=>{Sk();EN={HNSW:Ug}});var ht={};Oe(ht,{database:()=>$u,databaseEnvs:()=>vo,databases:()=>ke,dropDatabase:()=>EI,dropTableMeta:()=>$ie,getDatabases:()=>it,getDefaultCompression:()=>Gg,getTables:()=>Hie,onRemovedDB:()=>gh,onUpdatedTable:()=>Tl,readMetaDb:()=>mh,resetDatabases:()=>id,table:()=>Qe,tables:()=>un});function Hie(){return Hg||it(),un||{}}function it(){if(Hg)return ke;Hg=!0,rd=new Map;let e=(0,$t.getHdbBasePath)()&&(0,Bt.join)((0,$t.getHdbBasePath)(),Dc),t=(0,$t.get)(U.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,$t.get)(U.STORAGE_PATH)||e&&((0,ns.existsSync)(e)?e:(0,Bt.join)((0,$t.getHdbBasePath)(),LE)),!e)return;if((0,ns.existsSync)(e))for(let n of(0,ns.readdirSync)(e,{withFileTypes:!0})){let s=(0,Bt.basename)(n.name,".mdb");n.isFile()&&(0,Bt.extname)(n.name).toLowerCase()===".mdb"&&!t[s]?.path&&mh((0,Bt.join)(e,n.name),null,s)}if((0,ns.existsSync)((0,td.getBaseSchemaPath)())){for(let n of(0,ns.readdirSync)((0,td.getBaseSchemaPath)(),{withFileTypes:!0}))if(!n.isFile()){let s=(0,Bt.join)((0,td.getBaseSchemaPath)(),n.name),i=(0,Bt.join)((0,td.getTransactionAuditStoreBasePath)(),n.name);for(let a of(0,ns.readdirSync)(s,{withFileTypes:!0}))if(a.isFile()&&(0,Bt.extname)(a.name).toLowerCase()===".mdb"){let c=(0,Bt.join)(i,a.name);mh((0,Bt.join)(s,a.name),(0,Bt.basename)(a.name,".mdb"),n.name,c,!0)}}}if(t)for(let n in t){let s=t[n],i=s.path;if((0,ns.existsSync)(i))for(let c of(0,ns.readdirSync)(i,{withFileTypes:!0}))c.isFile()&&(0,Bt.extname)(c.name).toLowerCase()===".mdb"&&mh((0,Bt.join)(i,c.name),(0,Bt.basename)(c.name,".mdb"),n);let a=s.tables;if(a)for(let c in a){let l=a[c],u=(0,Bt.join)(l.path,(0,Bt.basename)(c+".mdb"));(0,ns.existsSync)(u)&&mh(u,c,n,null,!0)}}for(let n in ke){let s=rd.get(n);if(s){let i=ke[n];n.includes("delete")&&Nr.trace(`defined tables ${Array.from(s.keys())}`);for(let a in i)s.has(a)||(Nr.trace(`delete table class ${a}`),delete i[a])}else if(delete ke[n],n==="data"){for(let i in un)delete un[i];delete un[kg]}}let r=["hdb_temp","hdb_certificate","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_license","hdb_info"];if((0,$t.get)(U.ANALYTICS_REPLICATE)===!1?r.push("hdb_analytics"):(ke.system?.hdb_analytics?.enableAuditing(),ke.system?.hdb_analytics_hostname?.enableAuditing()),ke.system)for(let n of r)ke.system[n]&&(ke.system[n].replicate=!1);return rd=null,ke}function id(){Hg=!1;for(let[,e]of vo)e.needsDeletion=!0;it();for(let[e,t]of vo)if(t.needsDeletion&&!e.endsWith("system.mdb")){t.close(),vo.delete(e);let r=ke[t.databaseName];for(let n in r)if(r[n].primaryStore.path===e){delete ke[t.databaseName],ph.forEach(i=>i(t.databaseName));break}}return ke}function mh(e,t,r=SN,n,s){let i=new _N.default(e,!1);try{let a=vo.get(e);a?a.needsDeletion=!1:(a=(0,nd.open)(i),vo.set(e,a));let c=new sd.default(!1),l=a.dbisDb||(a.dbisDb=a.openDB(xg.INTERNAL_DBIS_NAME,c)),u=a.auditStore;u||(n?(0,ns.existsSync)(n)&&(i.path=n,u=(0,nd.open)(i),u.isLegacy=!0):u=h_(a));let d=Ik(r),f=d[kg],m=new Map;for(let{key:h,value:p}of l.getRange({start:!1})){let[_,g]=h.toString().split("/");g===""?g=p.name:g||(g=_,_=t,p.name||(p.name=g,p.indexed=!p.is_hash_attribute)),f?.add(_);let y=m.get(_);y||m.set(_,y={attributes:[]}),(g==null||p.is_hash_attribute)&&(y.primary=p),g!=null&&y.attributes.push(p),Object.defineProperty(p,"key",{value:h,configurable:!0})}for(let[h,p]of m){let{attributes:_,primary:g}=p;if(!g){for(let se of _)if(se.is_hash_attribute||se.isPrimaryKey){g=se;break}if(!g){Nr.warn(`Unable to find a primary key attribute on table ${h}, with attributes: ${JSON.stringify(_)}`);continue}}let y=d[h],T={},R=[],N,C,k=typeof g.audit=="boolean"?g.audit:(0,$t.get)(U.LOGGING_AUDITLOG),te=g.trackDeletes,G=g.expiration,K=g.eviction,$=g.sealed,Y=g.splitSegments,ce=g.replicate;if(y)T=y.indices,R=y.attributes,y.schemaVersion++;else{N=g.tableId,N?N>=(l.get(ed)||0)&&(l.putSync(ed,N+1),Nr.info(`Updating next table id (it was out of sync) to ${N+1} for ${h}`)):(g.tableId=N=l.get(ed),N||(N=1),Nr.debug("Table {tableName} missing an id, assigning {tableId}"),l.putSync(ed,N+1),l.putSync(g.key,g));let se=new sd.default(!g.is_hash_attribute,g.is_hash_attribute);if(se.compression=g.compression,se.compression){let he=(0,$t.get)(U.STORAGE_COMPRESSION_THRESHOLD)||bk;se.compression.threshold=he}C=y_(a.openDB(g.key,se),a),a.databaseName=r,C.tableId=N}let le;for(let se of _){se.attribute=se.name;try{if(!se.is_hash_attribute&&(se.indexed||se.attribute&&!se.name)){if(!T[se.name]){let Ne=wk(se.key,a,se);T[se.name]=Ne,T[se.name].indexNulls=se.indexNulls}let he=R.find(Ne=>Ne.name===se.name);he?R.splice(R.indexOf(he),1,se):R.push(se),le=!0}}catch(he){Nr.error("Error trying to update attribute",se,R,T,he)}}for(let se of R)if(!_.find(Ne=>Ne.name===se.name)){if(se.is_hash_attribute){Nr.error("Unable to remove existing primary key attribute",se);continue}se.indexed&&(R.splice(R.indexOf(se),1),le=!0)}if(y)le&&(y.schemaVersion++,y.updatedAttributes());else{y=Nk(d,h,Dg({primaryStore:C,auditStore:u,audit:k,sealed:$,splitSegments:Y,replicate:ce,expirationMS:G&&G*1e3,evictionMS:K&&K*1e3,trackDeletes:te,tableName:h,tableId:N,primaryKey:g.name,databasePath:s?r+"/"+h:r,databaseName:r,indices:T,attributes:_,schemaDefined:g.schemaDefined,dbisDB:l})),y.schemaVersion=1;for(let se of hh)se(y)}}return a}catch(a){throw a.message+=` opening database ${e}`,a}}function Ik(e){let t=ke[e];if(t||(e==="data"?t=ke[e]=un:e==="system"?Object.defineProperty(ke,"system",{value:t=Object.create(null),configurable:!0}):t=ke[e]=Object.create(null)),rd&&!rd.has(e)){let r=new Set;t[kg]=r,rd.set(e,r)}return t}function Nk(e,t,r){return e[t]=r,r}function $u({database:e,table:t}){e||(e=SN),it();let r=Ik(e),n=(0,Bt.join)((0,$t.getHdbBasePath)(),Dc),s=(0,$t.get)(U.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,$t.get)(U.STORAGE_PATH)||((0,ns.existsSync)(n)?n:(0,Bt.join)((0,$t.getHdbBasePath)(),LE));let a=(0,Bt.join)(n,(i?t:e)+".mdb"),c=vo.get(a);if(!c||c.status==="closed"){let l=new _N.default(a,!1);c=(0,nd.open)(l),vo.set(a,c)}return c.auditStore||(c.auditStore=h_(c)),c}async function EI(e){if(!ke[e])throw new Error("Schema does not exist");let t=ke[e],r;for(let n in t)r=t[n].primaryStore.rootStore,vo.delete(r.path),r.status==="open"&&(await r.close(),await Eh.remove(r.path));if(r||(r=$u({database:e,table:null}),r.status==="open"&&(await r.close(),await Eh.remove(r.path))),e==="data"){for(let n in un)delete un[n];delete un[kg]}delete ke[e],ph.forEach(n=>n(e)),await AA(r)}function wk(e,t,r){let n=r.is_hash_attribute||r.indexed.type&&EN[r.indexed.type]?.useObjectStore,s=new sd.default(!n,n),i=t.openDB(e,s);if(r.indexed.type){let a=EN[r.indexed.type];a?i.customIndex=new a(i,r.indexed):Nr.error(`The indexing type '${r.indexed.type}' is unknown`)}return i}function Qe(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:h}=e;r||(r=SN);let p=$u({database:r,table:t}),_=ke[r];Nr.trace(`Defining ${t} in ${r}`);let g=_?.[t];if(p.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let y,T,R;m==null&&(m=!0);let N=new sd.default(!1);for(let Y of a)Y.attribute&&!Y.name?(Y.name=Y.attribute,Y.indexed=!0):Y.attribute=Y.name,Y.expiresAt&&(Y.indexed=!0);let C,k;if(g){if(y=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 Y=p.auditStore;T=a.find(he=>he.isPrimaryKey)||{},y=T.name,T.is_hash_attribute=T.isPrimaryKey=!0,T.schemaDefined=m,T.compression=Gg(),f&&(T.trackDeletes=!0),c=T.audit=typeof c=="boolean"?c:(0,$t.get)(U.LOGGING_AUDITLOG),n&&(T.expiration=n),s&&(T.eviction=s),u??=!1,T.splitSegments=u,typeof l=="boolean"&&(T.sealed=l),typeof d=="boolean"&&(T.replicate=d),h&&(T.origins?T.origins.includes(h)||T.origins.push(h):T.origins=[h]),Nr.trace(`${t} table loading, opening primary store`);let ce=new sd.default(!1,!0);ce.compression=T.compression;let le=t+"/";if(R=p.dbisDb=p.openDB(xg.INTERNAL_DBIS_NAME,N),$(),R.get(le))return k&&k(),id(),Qe(e);let se=y_(p.openDB(le,ce),p);p.databaseName=r,se.tableId=R.get(ed),Nr.trace(`Assigning new table id ${se.tableId} for ${t}`),se.tableId||(se.tableId=1),R.put(ed,se.tableId+1),T.tableId=se.tableId,g=Nk(_,t,Dg({primaryStore:se,auditStore:Y,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:y,tableName:t,tableId:se.tableId,databasePath:r,databaseName:r,indices:{},attributes:a,schemaDefined:m,dbisDB:R})),g.schemaVersion=1,C=!0,R.put(le,T)}let te=g.indices;R=R||(p.dbisDb=p.openDB(xg.INTERNAL_DBIS_NAME,N)),g.dbisDB=R;let G=[];for(let{key:Y,value:ce}of R.getRange({start:!0})){let[le,se]=Y.toString().split("/");if(se===""&&(se=ce.name),se){if(le!==t)continue}else continue;let he=a.find(Ue=>Ue.name===se),Ne=!he?.indexed&&ce.indexed&&!ce.isPrimaryKey;if((!he||Ne)&&($(),C=!0,he||R.remove(Y),Ne)){let Ue=g.indices[le];Ue&&G.push(Ue)}}let K=[];try{for(let Y of a||[]){if((Y.relationship||Y.computed)&&(C=!0,Y.relationship))continue;let ce=t+"/"+(Y.name||"");Object.defineProperty(Y,"key",{value:ce,configurable:!0});let le=R.get(ce);if(Y.isPrimaryKey){if(le=le||R.get(ce=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)||Y.type!==le.type){let he={...le};typeof c=="boolean"&&(c&&g.enableAuditing(c),he.audit=c),n&&(he.expiration=+n),s&&(he.eviction=+s),l!==void 0&&(he.sealed=l),d!==void 0&&(he.replicate=d),Y.type&&(he.type=Y.type),C=!0,$(),R.put(ce,he)}continue}le?.attribute&&!le.name&&(le.indexed=!0);let se=!le||le.type!==Y.type||JSON.stringify(le.indexed)!==JSON.stringify(Y.indexed)||le.nullable!==Y.nullable||le.version!==Y.version||JSON.stringify(le.properties)!==JSON.stringify(Y.properties)||JSON.stringify(le.elements)!==JSON.stringify(Y.elements);if(Y.indexed){let he=wk(ce,p,Y);(se||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<_h.workerData?.restartNumber)&&(C=!0,$(),le=R.get(ce),(se||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<_h.workerData?.restartNumber)&&(C=!0,Y.indexNulls===void 0&&(Y.indexNulls=!0),g.primaryStore.getStats().entryCount>0&&(Y.lastIndexedKey=le?.lastIndexedKey??void 0,Y.indexingPID=process.pid,he.isIndexing=!0,Object.defineProperty(Y,"dbi",{value:he}),K.push(Y))),R.put(ce,Y)),le?.indexNulls&&Y.indexNulls===void 0&&(Y.indexNulls=!0),he.indexNulls=Y.indexNulls,te[Y.name]=he}else se&&(C=!0,$(),R.put(ce,Y))}}finally{k&&k()}if(C&&(g.schemaVersion++,g.updatedAttributes()),Nr.trace(`${t} table loading, running index`),K.length>0||G.length>0?g.indexingOperation=qie(g,K,G):C&&Bg.signalSchemaChange(new Fg.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=h,C)for(let Y of hh)Y(g,h!=="cluster");return(n||s||i)&&g.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),Nr.trace(`${t} table loaded`),g;function $(){k||p.transactionSync(()=>({then(Y){k=Y}}))}o($,"startTxn")}async function qie(e,t,r){try{Nr.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await Bg.signalSchemaChange(new Fg.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,nd.compareKeys)(f.lastIndexedKey,u)<0&&(u=f.lastIndexedKey),f.lastIndexedKey==null&&f.dbi.clearAsync();let d=0;for(let{key:f,value:m,version:h}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(m){if(d++,s=e.primaryStore.ifVersion(f,h,()=>{for(let p=0;p<l;p++){let _=t[p],g=_.name,y=_.dbi;try{let T=_.resolve,R=m&&(T?T(m):m[g]);if(y.customIndex){y.customIndex.index(f,R);continue}let N=(0,Rk.getIndexedValues)(R);if(N)for(let C=0,k=N.length;C<k;C++)y.put(N[C],f)}catch(T){a[g]||(a[g]=!0,Nr.error(`Error indexing attribute ${g}`,T))}}}),s.then(()=>d--,p=>{d--,Nr.error(p)}),_h.workerData&&_h.workerData.restartNumber!==Ak.restartNumber&&(i=!0),++c%100===0||i){for(let p of t)p.lastIndexedKey=f,e.dbisDB.put(p.key,p);if(i)return}d>kie?await s:d>Gie&&await new Promise(p=>setImmediate(p))}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 Bg.signalSchemaChange(new Fg.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),Nr.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){Nr.error("Error in indexing",n)}}function $ie({table:e,database:t}){let r=$u({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 Tl(e){return hh.push(e),{remove(){let t=hh.indexOf(e);t>-1&&hh.splice(t,1)}}}function gh(e){return ph.push(e),{remove(){let t=ph.indexOf(e);t>-1&&ph.splice(t,1)}}}function Gg(){let e=(0,$t.get)(U.STORAGE_COMPRESSION),t=(0,$t.get)(U.STORAGE_COMPRESSION_DICTIONARY),r=(0,$t.get)(U.STORAGE_COMPRESSION_THRESHOLD)||bk,n={startingOffset:32};return t&&(n.dictionary=Eh.readFileSync(t)),r&&(n.threshold=r),e&&n}var $t,xg,nd,Bt,ns,td,sd,_N,Eh,gN,Rk,Bg,Fg,_h,yk,Ak,Nr,SN,kg,bk,un,ke,ed,hh,ph,Hg,vo,rd,kie,Gie,De=ue(()=>{$t=w(oe()),xg=w(Gt()),nd=require("lmdb"),Bt=require("path"),ns=require("fs"),td=w(yt());w_();sd=w(bm()),_N=w(Im());H();Eh=w(require("fs-extra")),gN=w(Xs()),Rk=w(bn()),Bg=w(Oo()),Fg=w(ii()),_h=require("worker_threads"),yk=w(Q()),Ak=w(st());Li();Kc();Kn();Tk();Nr=(0,yk.forComponent)("storage"),SN="data",kg=Symbol("defined-tables"),bk=((0,$t.get)(U.STORAGE_PAGESIZE)||4096)-60;(0,$t.initSync)();un=Object.create(null),ke=Object.create(null);(0,gN._assignPackageExport)("databases",ke);(0,gN._assignPackageExport)("tables",un);ed=Symbol.for("next-table-id"),hh=[],ph=[],vo=new Map;o(Hie,"getTables");o(it,"getDatabases");o(id,"resetDatabases");o(mh,"readMetaDb");o(Ik,"ensureDB");o(Nk,"setTable");o($u,"database");o(EI,"dropDatabase");o(wk,"openIndex");o(Qe,"table");kie=1e3,Gie=10;o(qie,"runIndexing");o($ie,"dropTableMeta");o(Tl,"onUpdatedTable");o(gh,"onRemovedDB");o(Gg,"getDefaultCompression")});var yN={};Oe(yN,{loadGQLSchema:()=>Yie,start:()=>RN,startOnMainThread:()=>Kie});function RN({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,h=[],p;for(let y of f.definitions)switch(y.kind){case l.OBJECT_TYPE_DEFINITION:let k=function(G){if(G.kind==="NonNullType"){let Y=k(G.type);return Y.nullable=!1,Y}if(G.kind==="ListType")return{type:"array",elements:k(G.type)};let $={type:G.name?.value};return Object.defineProperty($,"location",{value:G.loc.startToken}),$};o(k,"getProperty");let T=y.name.value,R=[],N={table:null,database:null,properties:R};m.set(T,N);for(let G of y.directives){if(G.name.value==="table"){for(let $ of G.arguments)N[$.name.value]=$.value.value;N.schema&&(N.database=N.schema),N.table||(N.table=T),N.audit&&(N.audit=N.audit!=="false"),N.attributes=N.properties,h.push(N)}if(G.name.value==="sealed"&&(N.sealed=!0),G.name.value==="splitSegments"&&(N.splitSegments=!0),G.name.value==="replicate"&&(N.replicate=!0),G.name.value==="export"){N.export=!0;for(let $ of G.arguments)typeof N.export!="object"&&(N.export={}),N.export[$.name.value]=$.value.value}}let C=!1,te={};for(let G of y.fields){let K=k(G.type);K.name=G.name.value,R.push(K),te[K.name]=void 0;for(let $ of G.directives){let Y=$.name.value;if(Y==="primaryKey")C?console.warn("Can not define two attributes as a primary key at",$.loc):(K.isPrimaryKey=!0,C=!0);else if(Y==="indexed"){let ce={};for(let le of $.arguments||[])ce[le.name.value]=le.value.value;K.indexed=ce}else if(Y==="computed"){for(let ce of $.arguments||[])if(ce.name.value==="from"){let le=ce.value.value;K.computed={from:g(le,ce,te)},K.version==null&&(K.version=le)}else ce.name.value==="version"&&(K.version=ce.value.value);K.computed=K.computed||!0}else if(Y==="relationship"){let ce={};for(let le of $.arguments)ce[le.name.value]=le.value.value;K.relationship=ce}else if(Y==="createdTime")K.assignCreatedTime=!0;else if(Y==="updatedTime")K.assignUpdatedTime=!0;else if(Y==="expiresAt")K.expiresAt=!0;else if(Y==="allow"){let ce=K.authorizedRoles=[];for(let le of $.arguments)le.name.value==="role"&&ce.push(le.value.value)}else server.knownGraphQLDirectives.includes(Y)&&console.warn(`@${Y} is an unknown directive, at`,$.loc)}}N.type=T,T==="Query"&&(p=N)}function _(y){let T=m.get(y.type);T?(Object.defineProperty(y,"properties",{value:T.properties}),Object.defineProperty(y,"definition",{value:T})):y.type==="array"?_(y.elements):Vie.includes(y.type)||(0,Ck.getWorkerIndex)()===0&&console.error(`The type ${y.type} is unknown at line ${y.location.line}, column ${y.location.column}, in ${s}`)}o(_,"connectPropertyType");for(let y of m.values())for(let T of y.properties)_(T);for(let y of h)y.tableClass=e(y),y.export&&(y.export.name===""?i.set((0,TN.dirname)(n),y.tableClass):i.set((0,TN.dirname)(n)+"/"+(y.export.name||y.type),y.tableClass,y.export));function g(y,T,R){return new Ok.Script(`function computed(attributes) { return function(record) { with(attributes) { with (record) { return ${y}; } } } } computed;`,{filename:s,lineOffset:T.loc.startToken.line-1,columnOffset:T.loc.startToken.column}).runInThisContext()(R)}o(g,"createComputedFrom")}}var TN,Ok,Ck,Vie,Kie,Yie,Pk=ue(()=>{TN=require("path"),Ok=require("node:vm");De();Ck=w(st()),Vie=["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(RN,"start");Kie=RN,Yie=RN({ensureTable:Qe}).handleFile});var bN={};Oe(bN,{start:()=>toe});function Wie(e){if(e.kind!==Be.Kind.OPERATION_DEFINITION&&e.kind!==Be.Kind.FRAGMENT_DEFINITION)throw new Fr(`Unexpected non-executable definition type ${e.kind}.`)}function Lk(e){if(typeof e!="object"||e===null)throw new ji("Request body must be an object.");if(!("query"in e))throw new ji("Request body must contain a `query` field.");if(typeof e.query!="string")throw new ji("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new ji("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new ji("Request body `operationName` field must be a string.")}function AN(e){return parseInt(e.value,10)}function Mk(e){return parseFloat(e.value)}function vk(e,t,r){let n=r.get(e.name.value);return Uk(n)?xk(n,t):{attribute:t,value:n}}function Uk(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function xk(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],Uk(n)?xk(n,t):{attribute:t,value:n}))}function zie(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case Be.Kind.NULL:return{attribute:t,value:null};case Be.Kind.INT:return{attribute:t,value:AN(e.value)};case Be.Kind.FLOAT:return{attribute:t,value:Mk(e.value)};case Be.Kind.BOOLEAN:case Be.Kind.STRING:return{attribute:t,value:e.value.value};case Be.Kind.VARIABLE:return vk(e.value,t,r);case Be.Kind.OBJECT:return Bk(e.value,t,r);case Be.Kind.LIST:case Be.Kind.ENUM:default:throw new Fr(`Value type, ${e.value.kind}, is not supported.`)}}function Bk(e,t,r){return e.fields.flatMap(n=>zie(n,t,r))}function jie(e,t){switch(e.value.kind){case Be.Kind.NULL:return{attribute:e.name.value,value:null};case Be.Kind.INT:return{attribute:e.name.value,value:AN(e.value)};case Be.Kind.FLOAT:return{attribute:e.name.value,value:Mk(e.value)};case Be.Kind.BOOLEAN:case Be.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case Be.Kind.VARIABLE:return vk(e.value,e.name.value,t);case Be.Kind.OBJECT:return Bk(e.value,[e.name.value],t);case Be.Kind.LIST:case Be.Kind.ENUM:default:throw new Fr(`Argument type, ${e.value.kind}, is not supported.`)}}function Qie(e,t){return e.flatMap(r=>jie(r,t))}function qg(e,t){return e.selections.flatMap(r=>{switch(r.kind){case Be.Kind.FIELD:return r;case Be.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new Fr(`Fragment \`${n}\` not found.`);return qg(s.selectionSet,t)}case Be.Kind.INLINE_FRAGMENT:return qg(r.selectionSet,t)}})}function Fk(e,t){return qg(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:Fk(r.selectionSet,t)}:r.name.value)}async function Jie(e,t,r,n){let s=bs.getMatch(e.name.value,"graphql");if(s===void 0)throw new Fr(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,a={select:Fk(e.selectionSet,r),conditions:Qie(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 Hk(e){switch(e.kind){case Be.Kind.NULL:return null;case Be.Kind.INT:return AN(e);case Be.Kind.FLOAT:return parseFloat(e.value);case Be.Kind.STRING:case Be.Kind.BOOLEAN:return e.value;case Be.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:Hk(r.value),...t}),{});case Be.Kind.LIST:case Be.Kind.ENUM:default:throw new Fr(`Value type, ${e.kind}, is not supported.`)}}function Xie(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=Hk(n.defaultValue)),n.type.kind===Be.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new Fr(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function Zie(e,t,r,n){if(e.operation===Be.OperationTypeNode.SUBSCRIPTION)throw new Fr("Subscriptions are not supported.");if(e.operation===Be.OperationTypeNode.MUTATION)throw new Fr("Mutations are not supported yet.");let s=Xie(e.variableDefinitions,t),i=await Promise.all(qg(e.selectionSet,r).map(c=>Jie(c,s,r,n))),a={data:{}};for(let[c,l]of i)a.data[c]=l;return a}async function Dk({query:e,variables:t={},operationName:r},n){let s=Be.parse(e),i=new Map,a=new Map;for(let u of s.definitions)if(Wie(u),u.kind===Be.Kind.FRAGMENT_DEFINITION)a.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new Fr("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 Fr(`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 Fr("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new Fr(`Operation \`${r}\` not found.`);let l=await Zie(c,t,a,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function eoe(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 Lk(r),Dk(r,e)}case"POST":{let r=await So(e.headers.get("content-type"),!0)(e._nodeRequest);return Lk(r),Dk(r,e)}default:throw new ji("Method Not Allowed",405,{Allow:"GET, POST"})}}function toe(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await eoe(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof ji)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof Be.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof Fr)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 ji)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof Be.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof Fr)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 Be,Fr,ji,kk=ue(()=>{Be=w(require("graphql"));To();vu();o(Wie,"assertExecutableDefinitionNode");o(Lk,"assertRequestParams");o(AN,"processIntValueNode");o(Mk,"processFloatValueNode");o(vk,"processVariableNode");o(Uk,"isObject");o(xk,"transformObjectIntoQueryCondition");o(zie,"processObjectFieldNode");o(Bk,"processObjectValueNode");o(jie,"processArgumentNode");o(Qie,"buildConditionsQuery");o(qg,"fillInFragments");o(Fk,"buildSelectQuery");o(Jie,"processFieldNode");o(Hk,"processConstValueNode");o(Xie,"resolveVariables");o(Zie,"executeOperation");o(Dk,"resolver");Fr=class extends Error{static{o(this,"GraphQLQueryingError")}},ji=class extends Error{static{o(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};o(eoe,"graphqlQueryingHandler");o(toe,"start")});var Yk=M((iDe,Kk)=>{var od=require("validate.js"),qk=dt(),ad=(H(),v(W)),{handleHDBError:roe,hdbErrors:noe}=ge(),{HDB_ERROR_MSGS:er,HTTP_STATUS_CODES:soe}=noe,IN=o(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),ioe={STRUCTURE_USER:"structure_user"},Gk=Object.values(ad.ROLE_TYPES_ENUM),ooe="attribute_permissions",aoe="attribute_name",{PERMS_CRUD_ENUM:cd}=ad,coe=[ooe,...Object.values(cd)],$k=[cd.READ,cd.INSERT,cd.UPDATE],loe=[aoe,...$k];function uoe(e){let t=IN();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,Vk(e,t)}o(uoe,"addRoleValidation");function doe(e){let t=IN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,Vk(e,t)}o(doe,"alterRoleValidation");function foe(e){let t=IN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,qk.validateObject(e,t)}o(foe,"dropRoleValidation");var moe=["operation","role","id","permission","hdb_user","access"];function Vk(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let a=0,c=n.length;a<c;a++)moe.includes(n[a])||s.push(n[a]);s.length>0&&dr(er.INVALID_ROLE_JSON_KEYS(s),r);let i=qk.validateObject(e,t);if(i&&i.message.split(",").forEach(a=>{dr(a,r)}),e.permission){let a=hoe(e);a&&dr(a,r),Gk.forEach(c=>{e.permission[c]&&!od.isBoolean(e.permission[c])&&dr(er.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let a in e.permission)if(Gk.indexOf(a)<0){if(a===ioe.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]||dr(er.SCHEMA_NOT_FOUND(f),r)}continue}dr(er.STRUCTURE_USER_ROLE_TYPE_ERROR(a),r);continue}let c=e.permission[a];if(!a||!global.hdb_schema[a]){dr(er.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]){dr(er.TABLE_NOT_FOUND(a,l),r);continue}if(Object.keys(u).forEach(d=>{coe.includes(d)||dr(er.INVALID_PERM_KEY(d),r,a,l)}),Object.values(cd).forEach(d=>{od.isDefined(u[d])?od.isBoolean(u[d])||dr(er.TABLE_PERM_NOT_BOOLEAN(d),r,a,l):dr(er.TABLE_PERM_MISSING(d),r,a,l)}),u.attribute_permissions===void 0){dr(er.ATTR_PERMS_ARRAY_MISSING,r,a,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){dr(er.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 h=u.attribute_permissions[m];if(Object.keys(h).forEach(_=>{!loe.includes(_)&&_!==cd.DELETE&&dr(er.INVALID_ATTR_PERM_KEY(_),r,a,l)}),!od.isDefined(h.attribute_name)){dr(er.ATTR_PERM_MISSING_NAME,r,a,l);continue}let p=h.attribute_name;if(!d.includes(p)){dr(er.INVALID_ATTRIBUTE_IN_PERMS(p),r,a,l);continue}$k.forEach(_=>{od.isDefined(h[_])?od.isBoolean(h[_])||dr(er.ATTR_PERM_NOT_BOOLEAN(_,p),r,a,l):dr(er.ATTR_PERM_MISSING(_,p),r,a,l)}),!f.read&&h.read===!0&&(f.read=!0),!f.insert&&h.insert===!0&&(f.insert=!0),!f.update&&h.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}`;dr(er.MISMATCHED_TABLE_ATTR_PERMS(m),r,a,l)}}}}return poe(r)}o(Vk,"customValidate");Kk.exports={addRoleValidation:uoe,alterRoleValidation:doe,dropRoleValidation:foe};function hoe(e){let{operation:t,permission:r}=e;if(t===ad.OPERATIONS_ENUM.ADD_ROLE||t===ad.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 er.SU_CU_ROLE_COMBINED_ERROR;{let a=r.super_user?ad.ROLE_TYPES_ENUM.SUPER_USER:ad.ROLE_TYPES_ENUM.CLUSTER_USER;return er.SU_CU_ROLE_NO_PERMS_ALLOWED(a)}}}return null}o(hoe,"validateNoSUPerms");function poe(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:er.ROLE_PERMS_ERROR,...e};return roe(new Error,n,soe.BAD_REQUEST)}else return null}o(poe,"generateRolePermResponse");function dr(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(dr,"addPermError")});var Th=M((cDe,Qk)=>{"use strict";var Wk=vn(),zk=on(),Eoe=dl(),wN=Yk(),ON=Oo(),aDe=require("uuid").v4,_oe=require("util"),$g=(H(),v(W)),goe=ie(),CN=zk.searchByValue,Soe=zk.searchByHash,Toe=_oe.promisify(Eoe.delete),Roe=oi(),yoe=Gu(),{hdbErrors:Aoe,handleHDBError:Rl}=ge(),{HDB_ERROR_MSGS:jk,HTTP_STATUS_CODES:Sh}=Aoe,{UserEventMsg:PN}=ii();Qk.exports={addRole:boe,alterRole:Ioe,dropRole:Noe,listRoles:woe};function NN(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(NN,"scrubRoleDetails");async function boe(e){let t=wN.addRoleValidation(e);if(t)throw t;e=NN(e);let r={schema:"system",table:"hdb_role",search_attribute:"role",search_value:e.role,hash_attribute:"id",get_attributes:["*"]},n;try{n=Array.from(await CN(r)||[])}catch(i){throw Rl(i)}if(n&&n.length>0)throw Rl(new Error,jk.ROLE_ALREADY_EXISTS(e.role),Sh.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 Wk.insert(s),ON.signalUserChange(new PN(process.pid)),e=NN(e),e}o(boe,"addRole");async function Ioe(e){let t=wN.alterRoleValidation(e);if(t)throw t;e=NN(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await Wk.update(r)}catch(s){throw Rl(s)}if(n&&n?.message==="updated 0 of 1 records")throw Rl(new Error,"Invalid role id",Sh.BAD_REQUEST,void 0,void 0,!0);return await ON.signalUserChange(new PN(process.pid)),e}o(Ioe,"alterRole");async function Noe(e){let t=wN.dropRoleValidation(e);if(t)throw Rl(new Error,t,Sh.BAD_REQUEST,void 0,void 0,!0);let r=new yoe($g.SYSTEM_SCHEMA_NAME,$g.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Soe(r));if(n.length===0)throw Rl(new Error,jk.ROLE_NOT_FOUND,Sh.NOT_FOUND,void 0,void 0,!0);let s=new Roe($g.SYSTEM_SCHEMA_NAME,$g.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await CN(s)),a=!1;if(goe.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){a=!0;break}}if(a===!0)throw Rl(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,Sh.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Toe(c),ON.signalUserChange(new PN(process.pid)),`${n[0].role} successfully deleted`}o(Noe,"dropRole");async function woe(){return CN({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}o(woe,"listRoles")});var LN={};Oe(LN,{start:()=>Zk,startOnMainThread:()=>Poe});function Zk({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,Jk.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(Ooe.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 Coe(i)}}}async function Coe(e){let t=it().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,Xk.isEqual)(i,e)?void 0:(e.id=r.id,(0,Vg.alterRole)(e))}return(0,Vg.addRole)(e)}var Vg,Jk,Xk,Ooe,Poe,eG=ue(()=>{De();Vg=w(Th()),Jk=require("yaml"),Xk=require("lodash"),Ooe=["super_user","cluster_user","structure_user"];o(Zk,"start");o(Coe,"ensureRole");Poe=Zk});async function Kg(e){let t=(0,nG.pathToFileURL)(e).toString();if(Loe)return Rh||(Rh=Doe(voe)),(await(await Rh).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function Doe(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),Rh=new Compartment({console,Math,Date,fetch:Moe,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,rG.extname)(r)||(r+=".js"),r)},importHook:o(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){s.Resource=Ur,s.tables=un,s.databases=ke}};let n=await(0,tG.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),Rh}function Moe(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 voe(){return{Resource:Ur,tables:un}}var tG,rG,nG,Loe,Rh,DN=ue(()=>{La();De();tG=require("fs/promises"),rG=require("path"),nG=require("url"),Loe=!1;o(Kg,"secureImport");o(Doe,"getCompartment");o(Moe,"secureOnlyFetch");o(voe,"getGlobalVars")});var MN={};Oe(MN,{handleApplication:()=>Uoe,suppressHandleApplicationWarning:()=>xoe});function sG(e){return typeof e=="function"&&("get"in e||"put"in e||"post"in e||"delete"in e)}async function Uoe(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}Kg(t.absolutePath).then(r=>{let n=(0,Yg.dirname)(t.urlPath);sG(r.default)&&(e.resources.set(n,r.default),e.logger.debug(`Registered root resource: ${n}`)),iG(e,r,n)}).catch(r=>{e.logger.error(`Failed to load resource module ${t.absolutePath}: ${r}`),e.requestRestart()})})}function iG(e,t,r){for(let n in t){let s=t[n],i=(0,Yg.join)(r,n);sG(s)?(e.resources.set(i,s),e.logger.debug(`Registered resource: ${i}`)):typeof s=="object"&&iG(e,s,i)}}var Yg,xoe,oG=ue(()=>{DN();Yg=require("path");o(sG,"isResource");o(Uoe,"handleApplication");o(iG,"recurseForResources");xoe=!0});var UN={};Oe(UN,{start:()=>Boe});function Boe({resources:e}){e.set("login",vN),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var vN,aG=ue(()=>{La();o(Boe,"start");vN=class extends Ur{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 fG(e){let t={openapi:Foe,info:{title:"HarperDB HTTP REST interface",version:dG.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}];for(let[,n]of e){if(!n.path||n.Resource.isError)continue;let{path:s}=n,i=s.split("/").slice(-1),{attributes:a,primaryKey:c,prototype:l}=n.Resource;if(c=c??"id",!c)continue;let u={},d=[];if(a)for(let{type:R,name:N,elements:C,relationship:k,definition:te}of a){if(k)R==="array"?u[N]={type:"array",items:{$ref:Va+C.type}}:u[N]={$ref:Va+R};else{let G=te??C?.definition;if(G){if(!t.components.schemas[G.type]){let K={};G.properties.forEach($=>{K[$.name]=new HN(xN[$.type],$.type)}),t.components.schemas[G.type]=new uG(K)}R==="array"?u[N]={type:"array",items:{$ref:Va+G.type}}:u[N]={$ref:Va+G.type}}else R==="array"?C.type==="Any"||C.type=="ID"?u[N]={type:"array",items:{format:C.type}}:u[N]={type:"array",items:new HN(xN[C.type],C.type)}:R==="Any"||R=="ID"?u[N]={format:R}:u[N]=new HN(xN[R],R)}d.push(new kN(N,"query",u[N]))}let f=Object.keys(u),m=new kN(c,"path",{format:"ID"});m.required=!0,m.description="primary key of record";let h=new kN("property","path",{enum:f});h.required=!0,t.components.schemas[i]=new uG(u);let p=l.post!==Resource.prototype.post||l.update,_=typeof l.put=="function",g=typeof l.get=="function",y=typeof l.delete=="function",T="/"+s+"/";p&&(t.paths[T]={},t.paths[T].post=new Hoe(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[T]||(t.paths[T]={}),t.paths[T].get=new BN(d,r,{200:new FN({$ref:Va+i})},"search for records by the specified property name and value pairs")),y&&(t.paths[T]||(t.paths[T]={}),t.paths[T].delete=new lG(d,r,"delete all the records that match the provided query",{204:new cG})),T="/"+s+"/{"+c+"}",g&&(t.paths[T]={},t.paths[T].get=new BN([m],r,{200:new FN({$ref:Va+i})},"retrieve a record by its primary key")),_&&(t.paths[T]||(t.paths[T]={}),t.paths[T].put=new koe([m],r,i,"create or update the record with the URL path that maps to the record's primary key")),y&&(t.paths[T]||(t.paths[T]={}),t.paths[T].delete=new lG([m],r,"delete a record with the given primary key",{204:new cG})),g&&h.schema.enum.length>0&&(T="/"+s+"/{"+c+"}.{property}",t.paths[T]={},t.paths[T].get=new BN([m,h],r,{200:new FN({enum:f})},"used to retrieve the specified property of the specified record"))}return t}function Hoe(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:Va+e}}}},this.security=t,this.responses={200:{description:GN,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function BN(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function FN(e){this.description=GN,this.content={"application/json":{schema:e}}}function cG(){this.description="successfully processed request, no content returned to client"}function koe(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Va+r}}}},this.responses={200:{description:GN}}}function lG(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function uG(e){this.type="object",this.properties=e}function HN(e,t){this.type=e,this.format=t}function kN(e,t,r){this.name=e,this.in=t,this.schema=r}var dG,Foe,xN,Va,GN,mG=ue(()=>{dG=w(Rt()),Foe="3.0.3",xN={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},Va="#/components/schemas/",GN="successful operation";o(fG,"generateJsonApi");o(Hoe,"Post");o(BN,"Get");o(FN,"Response200");o(cG,"Response204");o(koe,"Put");o(lG,"Delete");o(uG,"ResourceSchema");o(HN,"Type");o(kN,"Parameter")});var pG={};Oe(pG,{Request:()=>Ka,createReuseportFd:()=>Wg});var hG,Ka,qN,$N,Wg,yh=ue(()=>{hG=require("os"),Ka=class{static{o(this,"Request")}#e;constructor(t,r){this.method=t.method;let n=t.url;this._nodeRequest=t,this._nodeResponse=r,this.url=n,this.headers=new $N(t.headers)}get absoluteURL(){return this.protocol+"://"+this.host+this.url}get pathname(){let t=this.url.indexOf("?");return t>-1?this.url.slice(0,t):this.url}set pathname(t){let r=this.url.indexOf("?");r>-1?this.url=t+this.url.slice(r):this.url=t}get protocol(){return this._nodeRequest.socket.encrypted?"https":"http"}get ip(){return this._nodeRequest.socket.remoteAddress}get authorized(){return this._nodeRequest.socket.authorized}get peerCertificate(){return this._nodeRequest.socket.getPeerCertificate()}get mtlsConfig(){return this._nodeRequest.socket.server.mtlsConfig}get body(){return this.#e||(this.#e=new qN(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get httpVersion(){return this._nodeRequest.httpVersion}get isAborted(){return!1}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},qN=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)}},$N=class{constructor(t){this.asObject=t}static{o(this,"Headers")}set(t,r){this.asObject[t.toLowerCase()]=r}get(t){return this.asObject[t.toLowerCase()]}has(t){return this.asObject.hasOwnProperty(t.toLowerCase())}[Symbol.iterator](){return Object.entries(this.asObject)[Symbol.iterator]()}keys(){return Object.keys(this.asObject)}values(){return Object.values(this.asObject)}delete(t){delete this.asObject[t.toLowerCase()]}forEach(t){for(let[r,n]of this)t(n,r,this)}};(0,hG.platform)()!="win32"&&(Wg=require("node-unix-socket").createReuseportFd)});var jg={};Oe(jg,{parseHeaderValue:()=>KN,start:()=>$oe});async function qoe(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&I_(e);let i=new Os;try{e.responseHeaders=i;let a=e.url.slice(1),c,l;if(a!==EG){let g=zg.getMatch(a,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new ti(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let y=KN(g);for(let T of y)switch(T.name){case"max-age":e.expiresAt=T.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(y=>(y.next?.name==="confirm"&&y.next.value>=0&&(e.replicatedConfirmation=+y.next.value),y.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 Ut(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=So(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new ld.ClientError(g,400)}if(e.authorize=!0,a===EG&&s==="GET"){if(e?.user?.role?.permission?.super_user)return fG(zg);throw new ld.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 ld.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new ld.ServerError(`Method ${s} is not recognized`,501)}}),m=200,h;if(f==null)m=s==="GET"||s==="HEAD"?404:204,VN.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(f.status>0&&f.headers){let g=rk(f.headers,i);return f.headers!==g&&(f.headers=g),f.data!==void 0&&(f.body=am(f.data,e,f)),f}else if(h=e.lastModified){Goe[0]=h;let g=String.fromCharCode(34,(jr[0]&63)+62,(jr[0]>>6)+(jr[1]<<2&63)+62,(jr[1]>>4)+(jr[2]<<4&63)+62,(jr[2]>>2)+62,(jr[3]&63)+62,(jr[3]>>6)+(jr[4]<<2&63)+62,(jr[4]>>4)+(jr[5]<<4&63)+62,(jr[5]>>2)+62,(jr[6]&63)+62,(jr[6]>>6)+(jr[7]<<2&63)+62,34),y=r["if-none-match"];y&&g==y?(f?.onDone&&f.onDone(),m=304,f=void 0):i.setIfNone("ETag",g),VN.lastModified&&i.setIfNone("Last-Modified",new Date(h).toUTCString())}e.createdResource&&(m=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let p={status:m,headers:i,body:void 0},_=e.loadedFromSource??f?.wasLoadedFromSource?.();return _!==void 0&&(p.wasCacheMiss=_,!_&&h&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||h))/1e3))),f!==void 0&&(p.body=am(f,e,p),s==="HEAD"&&(p.body=void 0)),p}catch(a){a.statusCode?a.statusCode===500?di.warn(a):di.info(a):di.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=am(a.contentType?a:SG(a),e,c),c}}function $oe(e){VN=e,e.includeExpensiveRecordCountEstimates&&(Ka.prototype.includeExpensiveRecordCountEstimates=!0),!_G&&(_G=!0,zg=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return qoe(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{Ah++;let s=new Vn;gG||(gG=!0,ah(l=>{Ah>0&&l.push({metric:"ws-connections",connections:Ah,byThread:!0})}));let i;t.on("error",l=>{i=!0,di.warn(l)});let a;t.on("message",o(function(u){a||(a=So(r.requestedContentType??r.headers.asObject["content-type"],!1));let d=a(u);ot(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(d)},"message"));let c;t.on("close",()=>{Ah--,zr(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=zg.getMatch(l,"ws");if(zr(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,ot(p=>({count:p.count,total:Ah}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let d=new ti(u.relativeURL);d.checkPermission=r.user?.role?.permission??{};let f=u.Resource;c=(await Ut(r,()=>f.connect(d,s,r)))[Symbol.asyncIterator]();let h;for(;!(h=await c.next()).done;){let p=await Ia(h.value,r);t.send(p),ot(p.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(_=>t._socket.once("drain",_))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?di.warn(l):di.info(l):di.error(l),t.close(Voe[l.statusCode]||1011,SG(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 di,ld,SG,jr,Goe,VN,EG,_G,zg,gG,Ah,Voe,TG=ue(()=>{To();Wi();di=w(Q()),ld=w(ge());N_();_u();vc();lh();mG();yh();O_();({errorToString:SG}=di),jr=new Uint8Array(8),Goe=new Float64Array(jr.buffer,0,1),VN={},EG="openapi";o(qoe,"http");Ah=0;o($oe,"start");Voe={401:3e3,403:3003};o(KN,"parseHeaderValue")});var YN=M((vDe,yG)=>{var{recordAction:Qg,recordActionBinary:RG}=(Wi(),v(wg)),Koe=require("fastify-plugin"),Yoe=200;yG.exports=Koe(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),Qg(a,"duration",u,f,d),RG(s.raw.statusCode<400,"success",u,f,d),RG(1,"response_"+s.raw.statusCode,u,f,d);let m=Yoe;i?.pipe?(i.on("data",g=>{m+=g.length}),i.on("end",()=>{Qg(performance.now()-c,"transfer",u,f,d),Qg(m,"bytes-sent",u,f,d)})):(m+=i?.length||0,Qg(m,"bytes-sent",u,f,d));let h=a.toFixed(3),p=s.getHeader("Server-Timing"),_=`db;dur=${h}`;s.header("Server-Timing",p?`${p}, ${_}`:_)}),r()},{name:"hdb-request-time"})});var bG=M((UDe,AG)=>{var Woe=dt(),zoe={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};AG.exports=function(e){return Woe.validateObject(e,zoe)}});var Jg=M((xDe,IG)=>{"use strict";var joe=(H(),v(W)).OPERATIONS_ENUM,WN=class{static{o(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=joe.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};IG.exports=WN});var Nh={};Oe(Nh,{createTokens:()=>QN,getJWTRSAKeys:()=>rS,refreshOperationToken:()=>JN,validateOperationToken:()=>XN,validateRefreshToken:()=>nS});async function rS(){if(Xg)return Xg;try{let e=bh.default.join(Ih.default.getHdbBasePath(),ky),t=await Zg.default.readFile(bh.default.join(e,Vf.JWT_PASSPHRASE_NAME),"utf8"),r=await Zg.default.readFile(bh.default.join(e,Vf.JWT_PRIVATE_KEY_NAME),"utf8");return Xg={publicKey:await Zg.default.readFile(bh.default.join(e,Vf.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},Xg}catch(e){throw tS.default.error(e),new fi.ClientError(dd.NO_ENCRYPTION_KEYS,ud.INTERNAL_SERVER_ERROR)}}async function QN(e){let t=(0,zN.validateBySchema)(e,Qi.default.object({username:Qi.default.string().optional(),password:Qi.default.string().optional(),role:Qi.default.string().optional(),expires_in:Qi.default.alternatives(Qi.default.string(),Qi.default.number()).optional()}));if(t)throw new fi.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,jN.findAndValidateUser)(e.username,e.password,f)}catch(f){throw tS.default.error(f),new fi.ClientError(dd.INVALID_CREDENTIALS,ud.UNAUTHORIZED)}if(!r)throw new fi.ClientError(dd.INVALID_CREDENTIALS,ud.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 rS(),c=await fd.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:e.expires_in??PG,algorithm:eS,subject:md.OPERATION}),l=await fd.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:Qoe,algorithm:eS,subject:md.REFRESH}),u=UI(l,xr.SHA256);if((await(0,NG.update)(new wG.default($f,hu.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new fi.ClientError(dd.REFRESH_TOKEN_SAVE_FAILED,ud.INTERNAL_SERVER_ERROR);return OG.default.signalUserChange(new CG.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function JN(e){let t=(0,zN.validateBySchema)(e,Qi.default.object({refresh_token:Qi.default.string().required()}).required());if(t)throw new fi.ClientError(t.message);let{refresh_token:r}=e;await nS(r);let n=await rS(),s=await fd.default.decode(r);return{operation_token:await fd.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:PG,algorithm:eS,subject:md.OPERATION})}}async function XN(e){return LG(e,md.OPERATION)}async function nS(e){return LG(e,md.REFRESH)}async function LG(e,t){try{let r=await rS(),n=await fd.default.verify(e,r.publicKey,{algorithms:eS,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,jN.findAndValidateUser)(n.username,void 0,!1);if(t===md.REFRESH&&!xI(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw tS.default.warn(r),r?.name==="TokenExpiredError"?new fi.ClientError(dd.TOKEN_EXPIRED,ud.FORBIDDEN):new fi.ClientError(dd.INVALID_TOKEN,ud.UNAUTHORIZED)}}var fd,Zg,bh,Qi,zN,fi,tS,jN,NG,wG,OG,CG,Ih,ud,dd,PG,Qoe,eS,md,Xg,hd=ue(()=>{fd=w(require("jsonwebtoken")),Zg=w(require("fs-extra")),bh=w(require("node:path")),Qi=w(require("joi")),zN=w(dt());H();fi=w(ge()),tS=w(Q());mg();jN=w(ts()),NG=w(vn()),wG=w(Jg()),OG=w(Oo()),CG=w(ii()),Ih=w(oe()),{HTTP_STATUS_CODES:ud,AUTHENTICATION_ERROR_MSGS:dd}=fi.hdbErrors;Ih.default.initSync();PG=Ih.default.get(U.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",Qoe=Ih.default.get(U.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",eS="RS256",md={OPERATION:"operation",REFRESH:"refresh"};o(rS,"getJWTRSAKeys");o(QN,"createTokens");o(JN,"refreshOperationToken");o(XN,"validateOperationToken");o(nS,"validateRefreshToken");o(LG,"validateToken")});var ZN=M((GDe,vG)=>{"use strict";var Joe=bG(),pd=require("passport"),Xoe=require("passport-local").Strategy,Zoe=require("passport-http").BasicStrategy,eae=require("util"),tae=ts(),MG=eae.callbackify(tae.findAndValidateUser),kDe=rn(),rae=(H(),v(W)),DG=(hd(),v(Nh));pd.use(new Xoe(function(e,t,r){MG(e,t,r)}));pd.use(new Zoe(function(e,t,r){MG(e,t,r)}));pd.serializeUser(function(e,t){t(null,e)});pd.deserializeUser(function(e,t){t(null,e)});function nae(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":pd.authenticate("basic",{session:!1},(a,c)=>{i(a,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===rae.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?DG.validateRefreshToken(s).then(a=>{e.body.refresh_token=s,r(null,a)}).catch(a=>{r(a)}):DG.validateOperationToken(s).then(a=>{r(null,a)}).catch(a=>{r(a)});break;default:pd.authenticate("local",{session:!1},function(a,c){i(a,c)})(e,t,r);break}}o(nae,"authorize");function sae(e,t){let r=Joe(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(sae,"checkPermissions");vG.exports={authorize:nae,checkPermissions:sae}});var sS=M(($De,UG)=>{"use strict";var iae=Jn();UG.exports={writeTransaction:oae};function oae(e,t,r){return iae.writeTransaction(e,t,r)}o(oae,"writeTransaction")});var HG=M((YDe,FG)=>{"use strict";var aae=on(),cae=si(),xG=Q(),lae=vn(),KDe=sS(),uae=require("clone"),tw=require("alasql"),dae=rg(),BG=require("util"),fae=BG.promisify(cae.getTableSchema),mae=BG.promisify(aae.search),hae=(H(),v(W)),ew=ie();dae(tw);FG.exports={update:Eae};var pae="There was a problem performing this update. Please check the logs and try again.";async function Eae({statement:e,hdb_user:t}){let r=await fae(e.table.databaseid,e.table.tableid),n=_ae(e.columns);ew.backtickASTSchemaItems(e);let{table:s,where:i}=e,a=uae(s),c=ew.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=tw.parse(l).statements[0],d=await mae(u),f=gae(n,d);return Sae(a,f,t)}o(Eae,"update");function _ae(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=tw.compile(`SELECT ${r.expression.toString()} AS [${hae.FUNC_VAL}] FROM ?`)}),t}catch(t){throw xG.error(t),new Error(pae)}}o(_ae,"createUpdateRecord");function gae(e,t){return ew.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}o(gae,"buildUpdateRecords");async function Sae(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await lae.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){xG.error(`Error delete new_attributes from update response: ${i}`)}return s}o(Sae,"updateRecords")});var GG=M((QDe,kG)=>{var Tae=require("alasql"),Rae=on(),yae=Q(),Aae=Jn(),nw=require("util"),rw=ie(),bae=(H(),v(W)),Iae=si(),zDe=sS(),jDe=vn(),Nae="record",wae="successfully deleted",Oae=nw.callbackify(Dae),Cae=nw.promisify(Rae.search),Pae=nw.promisify(Iae.getTableSchema);kG.exports={convertDelete:Oae};function Lae(e){return`${e.deleted_hashes.length} ${Nae}${e.deleted_hashes.length===1?"":"s"} ${wae}`}o(Lae,"generateReturnMessage");async function Dae({statement:e,hdb_user:t}){let r=await Pae(e.table.databaseid,e.table.tableid);rw.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=rw.isEmpty(s)?"":` WHERE ${s.toString()}`,a=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=Tae.parse(a).statements[0],l={operation:bae.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await Cae(c);let u=await Aae.deleteRecords(l);return rw.isEmptyOrZeroLength(u.message)&&(u.message=Lae(u)),delete u.txn_time,u}catch(u){throw yae.error(u),u.hdb_code?u.message:u}}o(Dae,"convertDelete")});var YG=M((XDe,KG)=>{"use strict";var Mae=xa(),{hdbErrors:qG}=ge(),{getDatabases:$G}=(De(),v(ht));KG.exports={checkSchemaExists:VG,checkSchemaTableExists:vae,schemaDescribe:Mae};async function VG(e){if(!$G()[e])return qG.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}o(VG,"checkSchemaExists");async function vae(e,t){let r=await VG(e);if(r)return r;if(!$G()[e][t])return qG.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}o(vae,"checkSchemaTableExists")});function sw(e){let t=e.get(iS),r=t?(0,Ed.unpack)(t):null;r||(r={remoteNameToId:{}});let n=Xe(),s=!1;r.nodeName=Xe();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:Oh(e)??1,nodes:[]})})}i[n]=0,e.putSync(iS,(0,Ed.pack)(r))}return r}function wh(e){return sw(e).remoteNameToId}function zG(e,t){let r=sw(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(iS,(0,Ed.pack)(r)),s}function oS(e,t){let r=sw(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(iS,(0,Ed.pack)(r))}return WG.trace?.("The remote node name map",e,n,s),s}var WG,Ed,iS,iw=ue(()=>{WG=w(Zs());ss();Ed=require("msgpackr"),iS=Symbol.for("remote-ids");o(sw,"getIdMappingRecord");o(wh,"exportIdMapping");o(zG,"remoteToLocalNodeId");o(oS,"getIdOfRemoteNode")});var ow={};Oe(ow,{commitsAwaitingReplication:()=>gd,getHDBNodeTable:()=>Vt,getReplicationSharedStatus:()=>Sd,iterateRoutes:()=>Ph,shouldReplicateToNode:()=>Ch,subscribeToNodeUpdates:()=>Td});function Vt(){return jG||(jG=Qe({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 Sd(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Td(e){Vt().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;ZG.debug?.("adding node",n,"on node",Xe()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==Xe()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of Vt().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 Ch(e,t){return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&Vt().primaryStore.get(Xe())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function Uae(){Td(e=>{Ya({},(t,r)=>{let n=e.name,s=QG.get(n);if(s||QG.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=Sd(i,r,n,()=>{let c=a[0],l=a.lastTime;for(let{txnTime:u,onConfirm:d}of gd.get(r)||[])u>l&&u<=c&&d();a.lastTime=c});a.lastTime=0,s.set(r,a)}})})}function*Ph(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=_d.default.get(U.REPLICATION_SECUREPORT)??(!_d.default.get(U.REPLICATION_PORT)&&_d.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||_d.default.get(U.REPLICATION_PORT)||_d.default.get(U.OPERATIONSAPI_NETWORK_PORT);let a=i?.lastIndexOf?.(":");a>0&&(i=+i.slice(a+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){JG.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 JG,XG,_d,ZG,jG,QG,gd,yl=ue(()=>{De();ss();tm();JG=require("worker_threads"),XG=w(ge()),_d=w(oe());H();ZG=w(Zs());server.nodes=[];o(Vt,"getHDBNodeTable");o(Sd,"getReplicationSharedStatus");o(Td,"subscribeToNodeUpdates");o(Ch,"shouldReplicateToNode");QG=new Map;cv((e,t,r)=>{if(r>server.nodes.length)throw new XG.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);gd||(gd=new Map,Uae());let n=gd.get(e);return n||(n=[],gd.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:o(()=>{++i===r&&s()},"onConfirm")})})});o(Uae,"startSubscriptionToReplications");o(Ph,"iterateRoutes")});var rq={};Oe(rq,{connectedToNode:()=>Al,disconnectedFromNode:()=>yd,ensureNode:()=>Uo,requestClusterStatus:()=>tq,startOnMainThread:()=>lw});async function lw(e){let t=0,r=it();for(let i of Object.getOwnPropertyNames(r)){let a=r[i];for(let c in a){let l=a[c];if(l.auditStore){aS.set(i,Oh(l.auditStore));break}}}Xi.whenThreadsStarted.then(async()=>{let i=[];for await(let l of r.system.hdb_nodes?.search([])||[])i.push(l);let a=Xe();function c(){let l=Vt().primaryStore.get(a);if(l!==null){let u=e.url??Wa();if(l===void 0||l.url!==u||l.shard!==e.shard)return Uo(a,{name:a,url:u,shard:e.shard,replicates:!0})}}o(c,"ensureThisNode"),Vt().primaryStore.get(a)&&c();for(let l of Ph(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)}Td(s)});let n;function s(i,a=i?.name){let c=Xe()&&a===Xe()||Wa()&&i?.url===Wa();if(c){let f=!!i?.replicates;if(n!==void 0&&n!==f)for(let m of Vt().search([]))m.replicates&&m.name!==a&&s(m,m.name);n=f}if(ct.trace("Setting up node replication for",i),!i){for(let[f,m]of Ji){let h;for(let[p,{worker:_,nodes:g}]of m){let y=g[0];if(y&&y.name==a){h=!0;for(let[T,{worker:R}]of m)m.delete(T),ct.warn("Node was deleted, unsubscribing from node",a,T,f),R?.postMessage({type:"unsubscribe-from-node",node:a,database:T,url:f});break}}if(h){Ji.get(f).iterator.remove(),Ji.delete(f);return}}return}if(c)return;if(!i.url){ct.info(`Node ${i.name} is missing url`);return}let l=Ji.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(ct.info(`Added node ${i.name} at ${i.url} for process ${Xe()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[f,m]of Rd)if(i.url===m.url){Rd.delete(f);break}Rd.set(i.name,i)}let u=it();if(l||(l=new Map,Ji.set(i.url,l)),l.iterator=Ya(e,(f,m,h)=>{h?d(m,!0):d(m,!1)}),i.subscriptions)for(let f of i.subscriptions){let m=f.database||f.schema;u[m]||(ct.warn(`Database ${m} not found for node ${i.name}, making a subscription anyway`),d(m,!1))}function d(f,m){ct.trace("Setting up replication for database",f,"on node",i.name);let h=l.get(f),p,_=[{replicateByDefault:m,...i}];aS.has(f)&&(_.push({replicateByDefault:m,name:Xe(),startTime:aS.get(f),endTime:Date.now(),replicates:!0}),aS.delete(f));let g=Ch(i,f),y=Xi.workers.filter(T=>T.name==="http");if(h?(p=h.worker,h.nodes=_):g&&(t=t%y.length,p=y[t++],l.set(f,{worker:p,nodes:_,url:i.url}),p?.on("exit",()=>{l.get(f)?.worker===p&&(l.delete(f),d(f,m))})),g)setTimeout(()=>{let T={type:"subscribe-to-node",database:f,nodes:_};p?p.postMessage(T):Lh(T)},xae);else{ct.info("Node no longer should be used, unsubscribing from node",{replicates:i.replicates,databaseName:f,node:i,subscriptions:i.subscriptions,hasDatabase:!!u[f],thisReplicates:Vt().primaryStore.get(Xe())?.replicates}),Vt().primaryStore.get(Xe())?.replicates||(n=!1,ct.info("Disabling replication, this node name",Xe(),Vt().primaryStore.get(Xe()),f));let T={type:"unsubscribe-from-node",database:f,url:i.url,name:i.name};p?p.postMessage(T):lS(T)}}o(d,"onDatabase")}o(s,"onNodeUpdate"),yd=o(function(i){try{ct.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let a=Array.from(Rd.keys()),c=a.sort(),l=c.indexOf(i.name||mi(i.url));if(l===-1){ct.warn("Disconnected node not found in node map",i.name,a);return}let u=Ji.get(i.url),d=u?.get(i.database);if(!d){ct.warn("Disconnected node not found in replication map",i.database,u);return}if(d.connected=!1,i.finished||!cw.default.get(U.REPLICATION_FAILOVER))return;let f=d.nodes[0];if(!(f.replicates===!0||f.replicates?.sends||f.subscriptions?.length))return;let m=f.shard,h=(l+1)%c.length;for(;l!==h;){let p=c[h],_=Rd.get(p);u=Ji.get(_.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==m){h=(h+1)%c.length;continue}let{worker:y,nodes:T}=g,R=!1;for(let N of d.nodes){if(T.some(C=>C.name===N.name)){ct.info(`Disconnected node is already failing over to ${p} for ${i.database}`);continue}N.endTime<Date.now()||(T.push(N),R=!0)}if(d.nodes=[d.nodes[0]],!R){ct.info(`Disconnected node ${i.name} has no nodes to fail over to ${p}`);return}ct.info(`Failing over ${i.database} from ${i.name} to ${p}`),y?y.postMessage({type:"subscribe-to-node",database:i.database,nodes:T}):Lh({database:i.database,nodes:T});return}ct.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(a){ct.error("Error failing over node",a)}},"disconnectedFromNode"),Al=o(function(i){let a=Ji.get(i.url),c=a?.get(i.database);if(!c){ct.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){ct.warn("Newly connected node has no node subscriptions",i.database,c);return}if(!l.name){ct.debug("Connected node is not named yet",i.database,c);return}c.nodes=[l];let u=!1;for(let d of Ji.values()){let f=d.get(i.database);if(!f||f==c)continue;let{worker:m,nodes:h,connected:p}=f;if(h)if(p===!1&&h[0].shard===l.shard)u=!0,c.nodes.push(h[0]);else{let _=h.filter(g=>g&&g.name!==l.name);_.length<h.length&&(f.nodes=_,m.postMessage({type:"subscribe-to-node",database:i.database,nodes:h}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,Xi.onMessageByType)("disconnected-from-node",yd),(0,Xi.onMessageByType)("connected-to-node",Al),(0,Xi.onMessageByType)("request-cluster-status",tq)}function tq(e,t){let r=[];for(let[n,s]of Rd)try{let i=Ji.get(s.url);ct.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(h=>!(h.endTime<Date.now())).map(h=>h.name)});let c=(0,aw.cloneDeep)(s);c.database_sockets=a,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){ct.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Uo(e,t){let r=Vt();e=e??mi(t.url),t.name=e;try{if(t.ca){let s=new eq.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){ct.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(ct.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!cw.default.get(U.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],a=(0,aw.cloneDeep)(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])]}ct.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var Xi,cS,ct,aw,cw,eq,xae,Ji,yd,Al,Rd,aS,Dh=ue(()=>{De();Xi=w(st());ss();cS=require("worker_threads");yl();ct=w(Q()),aw=require("lodash"),cw=w(oe());H();eq=require("crypto"),xae=200,Ji=new Map,Rd=new Map,aS=new Map;o(lw,"startOnMainThread");o(tq,"requestClusterStatus");cS.parentPort&&(yd=o(e=>{cS.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Al=o(e=>{cS.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Xi.onMessageByType)("subscribe-to-node",e=>{Lh(e)}),(0,Xi.onMessageByType)("unsubscribe-from-node",e=>{lS(e)}));o(Uo,"ensureNode")});var os=M(Kt=>{"use strict";var fr=require("path"),{watch:Bae}=require("chokidar"),xn=require("fs-extra"),Ad=require("node-forge"),cq=require("net"),{generateKeyPair:uw,X509Certificate:xo,createPrivateKey:lq}=require("crypto"),Fae=require("util");uw=Fae.promisify(uw);var wt=Ad.pki,hi=require("joi"),{v4:uq}=require("uuid"),{validateBySchema:hw}=dt(),{forComponent:Hae}=Q(),is=oe(),Ls=(H(),v(W)),{CONFIG_PARAMS:Il}=Ls,pi=HI(),{ClientError:ja}=ge(),dS=require("node:tls"),{relative:dq,join:kae}=require("node:path"),{CERT_PREFERENCE_APP:pMe,CERTIFICATE_VALUES:nq}=pi,Gae=Mc(),dw=bt(),{table:qae,getDatabases:$ae,databases:uS}=(De(),v(ht)),{getJWTRSAKeys:sq}=(hd(),v(Nh)),pt=Hae("tls");Kt.generateKeys=_w;Kt.updateConfigCert=Sq;Kt.createCsr=Qae;Kt.signCertificate=Jae;Kt.setCertTable=bd;Kt.loadCertificates=Eq;Kt.reviewSelfSignedCert=Sw;Kt.createTLSSelector=Rq;Kt.listCertificates=Aq;Kt.addCertificate=nce;Kt.removeCertificate=ice;Kt.createNatsCerts=ece;Kt.generateCertsKeys=Zae;Kt.getReplicationCert=vh;Kt.getReplicationCertAuth=jae;Kt.renewSelfSigned=tce;Kt.hostnamesFromCert=Rw;Kt.getKey=oce;Kt.getHostnamesFromCertificate=ace;Kt.getPrimaryHostName=Tw;var{urlToNodeName:fq,getThisNodeUrl:Vae,getThisNodeName:mS,clearThisNodeName:Kae}=(ss(),v(Bo)),{readFileSync:Yae,statSync:mq}=require("node:fs"),EMe=oe(),{getTicketKeys:Wae,onMessageFromWorkers:zae}=st(),za=Q(),{isMainThread:hq}=require("worker_threads"),{TLSSocket:pq,createSecureContext:_Me}=require("node:tls"),pw=3650,Mh=["127.0.0.1","localhost","::1"],Ew=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];zae(async e=>{e.type===Ls.ITC_EVENT_TYPES.RESTART&&(is.initSync(!0),await Sw())});var Qr;function Ja(){return Qr||(Qr=$ae().system.hdb_certificate,Qr||(Qr=qae({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__"}]}))),Qr}o(Ja,"getCertTable");async function vh(){let e=Rq("operations-api"),t={secureContexts:null,setSecureContext:o(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(mS());if(!r)return;let n=new xo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}o(vh,"getReplicationCert");async function jae(){Ja();let e=(await vh()).options.cert,r=new xo(e).issuer.match(/CN=(.*)/)?.[1];return Qr.get(r)}o(jae,"getReplicationCertAuth");var iq,Qa=new Map;function Eq(){if(iq)return;iq=!0;let e=[{configKey:Il.TLS},{configKey:Il.OPERATIONSAPI_TLS}];Ja();let t=fr.dirname(dw.getConfigFilePath()),r;for(let{configKey:n}of e){let s=dw.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let a=i.privateKey,c=a&&dq(kae(t,"keys"),a);c&&oq(a,l=>{Qa.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&hq){let d;oq(u,f=>{if(nq.cert===f)return;let m=i.hostname??i.hostnames??i.host??i.hosts;m&&!Array.isArray(m)&&(m=[m]);let h=Tq(u),p=new xo(h),_;try{_=Tw(p)}catch(R){pt.error("error extracting host name from certificate",R);return}if(_==null){pt.error("No host name found on certificate");return}if(p.checkIssued(new xo(nq.cert)))return;let g=Qr.primaryStore.get(_),y=mq(u).mtimeMs,T=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&y<=T){y<T&&pt.info(`Certificate ${_} at ${u} is older (${new Date(y)}) than the certificate in the database (${T>1?new Date(T):"only self signed certificate available"})`);return}r=Qr.put({name:_,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:m,fileTimestamp:y,details:{issuer:p.issuer.replace(/\n/g," "),subject:p.subject?.replace(/\n/g," "),subject_alt_name:p.subjectAltName,serial_number:p.serialNumber,valid_from:p.validFrom,valid_to:p.validTo}})},l?"certificate authority":"certificate")}}}}}return r}o(Eq,"loadCertificates");function oq(e,t,r){let n,s=o((i,a)=>{try{let c=a.mtimeMs;c&&c!==n&&(n&&hq&&pt.warn(`Reloading ${r}:`,i),n=c,t(Tq(i)))}catch(c){pt.error(`Error loading ${r}:`,i,c)}},"loadFile");xn.existsSync(e)?s(e,mq(e)):pt.error(`${r} file not found:`,e),Bae(e,{persistent:!1}).on("change",s)}o(oq,"loadAndWatch");function fw(){let e=Vae();if(e==null){let t=Mh[0];return pt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return fq(e)}o(fw,"getHost");function fS(){let e=mS();if(e==null){let t=Mh[0];return pt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}o(fS,"getCommonName");async function Qae(){let e=await vh(),t=wt.certificateFromPem(e.options.cert),r=wt.privateKeyFromPem(e.options.key);pt.info("Creating CSR with cert named:",e.name);let n=wt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:fS()},...Ew];pt.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:_q()}];return pt.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Ad.pki.certificationRequestToPem(n)}o(Qae,"createCsr");function _q(){let e=Mh.includes(fS())?Mh:[...Mh,fS()];return e.includes(fw())||e.push(fw()),[{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=>cq.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}o(_q,"certExtensions");async function Jae(e){let t={},r=fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Ja();for await(let d of Qr.search([]))if(d.is_authority&&!d.details.issuer.includes("HarperDB-Certificate-Authority")){if(Qa.has(d.private_key_name)){n=Qa.get(d.private_key_name),s=d;break}else if(d.private_key_name&&await xn.exists(fr.join(r,d.private_key_name))){n=xn.readFile(fr.join(r,d.private_key_name)),s=d;break}}if(!n){let d=await mw();s=d.ca,n=d.private_key}n=wt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=wt.certificateFromPem(s.certificate);pt.info("Signing CSR with cert named",s.name);let a=wt.certificationRequestFromPem(e.csr);try{a.verify()}catch(d){return pt.error(d),new Error("Error verifying CSR: "+d.message)}let c=Ad.pki.createCertificate();c.serialNumber="0"+Math.random().toString().slice(2,9),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+pw),pt.info("sign cert setting validity:",c.validity),pt.info("sign cert setting subject from CSR:",a.subject.attributes),c.setSubject(a.subject.attributes),pt.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=a.getAttribute({name:"extensionRequest"}).extensions;pt.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=a.publicKey,c.sign(n,Ad.md.sha256.create()),t.certificate=wt.certificateToPem(c)}else pt.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}o(Jae,"signCertificate");async function Xae(e,t){await bd({name:mS(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await bd({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:wt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}o(Xae,"createCertificateTable");async function bd(e){let t=new xo(e.certificate);e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},Ja(),await Qr.patch(e)}o(bd,"setCertTable");async function _w(){let e=await uw("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{publicKey:wt.publicKeyFromPem(e.publicKey),privateKey:wt.privateKeyFromPem(e.privateKey)}}o(_w,"generateKeys");async function gw(e,t,r){let n=wt.createCertificate();if(!t){let a=await vh();t=wt.certificateFromPem(a.options.cert).publicKey}n.publicKey=t,n.serialNumber="0"+Math.random().toString().slice(2,9),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+pw);let i=[{name:"commonName",value:fS()},...Ew];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(_q()),n.sign(e,Ad.md.sha256.create()),wt.certificateToPem(n)}o(gw,"generateCertificates");async function mw(){let e=await Aq(),t;for(let r of e){if(!r.is_authority)continue;let n=await yq(r.private_key_name);if(r.private_key_name&&n&&new xo(r.certificate).checkPrivateKey(lq(n))){pt.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;pt.trace("No CA found with matching private key")}o(mw,"getCertAuthority");async function gq(e,t,r=!0){let n=wt.createCertificate();n.publicKey=t,n.serialNumber="0"+Math.random().toString().slice(2,9),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+pw);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${is.get(Il.REPLICATION_HOSTNAME)??fq(is.get(Il.REPLICATION_URL))??uq().split("-")[0]}`},...Ew];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Ad.md.sha256.create());let a=fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),c=fr.join(a,pi.PRIVATEKEY_PEM_NAME);return r&&await xn.writeFile(c,wt.privateKeyToPem(e)),n}o(gq,"generateCertAuthority");async function Zae(){let{privateKey:e,publicKey:t}=await _w(),r=await gq(e,t),n=await gw(e,t,r);await Xae(n,r),Sq()}o(Zae,"generateCertsKeys");async function ece(){let e=await gw(wt.privateKeyFromPem(pi.CERTIFICATE_VALUES.key),void 0,wt.certificateFromPem(pi.CERTIFICATE_VALUES.cert)),t=fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),r=fr.join(t,pi.NATS_CERTIFICATE_PEM_NAME);await xn.exists(r)||await xn.writeFile(r,e);let n=fr.join(t,pi.NATS_CA_PEM_NAME);await xn.exists(n)||await xn.writeFile(n,pi.CERTIFICATE_VALUES.cert)}o(ece,"createNatsCerts");async function tce(){Ja();for await(let e of Qr.search([{attribute:"is_self_signed",value:!0}]))await Qr.delete(e.name);await Sw()}o(tce,"renewSelfSigned");async function Sw(){Kae(),await Eq(),Ja();let e=await mw();if(!e){pt.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=o(u=>{try{return{key:wt.privateKeyFromPem(xn.readFileSync(u)),keyPath:u}}catch(d){return pt.warn(`Failed to parse private key from ${u}:`,d.message),{key:null,keyPath:u}}},"tryToParseKey"),n=is.get(Il.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=is.get(Il.TLS_PRIVATEKEY),d=r(u);s=d.key,i=d.keyPath}let a=fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),c=dq(a,i);s||(pt.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{privateKey:s}=await _w(),xn.existsSync(fr.join(a,pi.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${uq().split("-")[0]}.pem`),await xn.writeFile(fr.join(a,c),wt.privateKeyToPem(s)));let l=await gq(s,wt.setRsaPublicKey(s.n,s.e),!1);await bd({name:l.subject.getField("CN").value,uses:["https"],certificate:wt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await vh()){let r=mS();pt.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await mw();let n=wt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await gw(wt.privateKeyFromPem(e.private_key),s,n);await bd({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}o(Sw,"reviewSelfSignedCert");function Sq(){let e=Gae(Object.keys(Ls.CONFIG_PARAM_MAP),!0),t=fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),r=fr.join(t,pi.PRIVATEKEY_PEM_NAME),n=fr.join(t,pi.NATS_CERTIFICATE_PEM_NAME),s=fr.join(t,pi.NATS_CA_PEM_NAME),i=Ls.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),dw.updateConfigValue(void 0,void 0,a,!1,!0)}o(Sq,"updateConfigCert");function Tq(e){return e.startsWith("-----BEGIN")?e:Yae(e,"utf8")}o(Tq,"readPEM");var aq=dS.createSecureContext;dS.createSecureContext=function(e){if(!e.cert||!e.key)return aq(e);let t={...e};delete t.key,delete t.cert;let r=aq(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var rce=pq.prototype._init;pq.prototype._init=function(e,t){rce.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 bl=new Map;function Rq(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(),bl.clear();let d=0;if(uS===void 0){c();return}for await(let f of uS.system.hdb_certificate.search([])){let m=f.certificate,h=new xo(m);f.is_authority&&(h.asString=m,bl.set(h.subject,m))}for await(let f of uS.system.hdb_certificate.search([]))try{if(f.is_authority)continue;let m=e==="operations-api",h=f.is_self_signed?1:2;m&&f.uses?.includes?.("operations")&&(h+=1);let p=await yq(f.private_key_name),_=f.certificate,g=new xo(_);if(bl.has(g.issuer)&&(_+=`
|
|
16
16
|
`+bl.get(g.issuer)),!p||!_)throw new Error("Missing private key or certificate for secure server");let y={ciphers:f.ciphers,ticketKeys:Wae(),availableCAs:bl,ca:t&&Array.from(bl.values()),cert:_,key:p,key_file:f.private_key_name,is_self_signed:f.is_self_signed};a&&(y.sessionIdContext=a.sessionIdContext);let T=dS.createSecureContext(y);T.name=f.name,T.options=y,T.quality=h,T.certificateAuthorities=Array.from(bl),T.certStart=_.toString().slice(0,100);let R=f.hostnames??Rw(g);Array.isArray(R)||(R=[R]);let N;for(let C of R)if(C){C[0]==="*"&&(s=!0,C=C.slice(1)),C===fw()&&(h+=2),cq.isIP(C)&&(N=!0);let k=r.get(C)?.quality??0;h>k&&r.set(C,T)}else za.error("No hostname found for certificate at",dS.certificate);za.trace("Adding TLS",T.name,"for",a.ports||"client","cert named",f.name,"hostnames",R,"quality",h,"best quality",d),h>d&&(i.defaultContext=n=T,d=h,a&&(a.defaultContext=T))}catch(m){za.error("Error applying TLS for",f.name,m)}a?.secureContextsListeners.forEach(f=>f()),c(n)}catch(d){l(d)}}o(u,"updateTLS"),uS?.system.hdb_certificate.subscribe({listener:o(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(a,c){za.info("TLS requested for",a||"(no SNI)");let l=a;for(;;){let d=r.get(l);if(d)return za.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?za.debug("No certificate found to match",a,"using the default certificate"):za.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):za.info("No default certificate found"),c(null,u)}o(i,"SNICallback")}o(Rq,"createTLSSelector");async function yq(e){let t=Qa.get(e);return!t&&e?await xn.readFile(fr.join(is.get(Il.ROOTPATH),Ls.LICENSE_KEY_DIR_NAME,e),"utf8"):t}o(yq,"getPrivateKeyByName");async function Aq(){Ja();let e=[];for await(let t of Qr.search([]))e.push(t);return e}o(Aq,"listCertificates");async function nce(e){let t=hw(e,hi.object({name:hi.string().required(),certificate:hi.string().required(),is_authority:hi.boolean().required(),private_key:hi.string(),hosts:hi.array(),uses:hi.array()}));if(t)throw new ja(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,a=new xo(n),c=!1,l=!1,u;for(let[h,p]of Qa)!s&&!c&&a.checkPrivateKey(lq(p))&&(c=!0,u=h),s&&s===p&&(l=!0,u=h);if(!i&&!s&&!c)throw new ja("A suitable private key was not found for this certificate");let d;if(!r){try{d=Tw(a)}catch(h){pt.error(h)}if(d==null)throw new ja("Error extracting certificate host name, please provide a name parameter")}let f=sce(r??d);s&&!c&&!l&&(await xn.writeFile(fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME,f+".pem"),s),Qa.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 bd(m),"Successfully added certificate: "+f}o(nce,"addCertificate");function sce(e){return e.replace(/[^a-z0-9\.]/gi,"-")}o(sce,"sanitizeName");async function ice(e){let t=hw(e,hi.object({name:hi.string().required()}));if(t)throw new ja(t.message);let{name:r}=e;Ja();let n=await Qr.get(r);if(!n)throw new ja(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Qr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(pt.info("Removing private key named",s),await xn.remove(fr.join(is.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME,s)))}return await Qr.delete(r),"Successfully removed "+r}o(ice,"removeCertificate");function Tw(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||Rw(e)[0]}o(Tw,"getPrimaryHostName");function Rw(e){if(e.subjectAltName)return e.subjectAltName.split(",").map(r=>{let n=r.indexOf(":");if(r=r.slice(n+1),r=r.trim(),r[0]==='"')try{r=JSON.parse(r)}catch{}return r.indexOf("=")>-1?r.match(/CN=([^,]*)/)?.[1]:r}).filter(r=>r);let t=certObj.subject?.match(/CN=(.*)/)?.[1];return t?[t]:[]}o(Rw,"hostnamesFromCert");async function oce(e){if(e.bypass_auth!==!0)throw new ja("Unauthorized","401");let t=hw(e,hi.object({name:hi.string().required()}));if(t)throw new ja(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await sq()).privateKey;if(r===".jwtPublic")return(await sq()).publicKey;if(Qa.get(r))return Qa.get(e.name);throw new ja("Key not found")}o(oce,"getKey");function ace(e){return[e.subject?.CN,...e.subjectaltname.split(",").filter(t=>t.trim().startsWith("DNS:")).map(t=>t.trim().substring(4))]}o(ace,"getHostnamesFromCertificate")});var Yq={};Oe(Yq,{CONFIRMATION_STATUS_POSITION:()=>$q,LATENCY_POSITION:()=>TS,NodeReplicationConnection:()=>wd,OPERATION_REQUEST:()=>Iw,RECEIVED_TIME_POSITION:()=>ww,RECEIVED_VERSION_POSITION:()=>Nw,RECEIVING_STATUS_POSITION:()=>Ow,RECEIVING_STATUS_RECEIVING:()=>Kq,RECEIVING_STATUS_WAITING:()=>Vq,SENDING_TIME_POSITION:()=>Uh,createWebSocket:()=>RS,databaseSubscriptions:()=>Za,replicateOverWS:()=>xh,tableUpdateListeners:()=>Pw});async function RS(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=Xe(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!Aw){let l=(0,Fq.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),Aw=u.secureContexts}if(i=Aw.get(s),i&&ae.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let a={};r&&(a.Authorization=r);let c={headers:a,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,kq.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(SS?.caCount!==Fo.size&&(SS=Hq.createSecureContext({...i.options,ca:[...Fo,...i.options.availableCAs.values()]}),SS.caCount=Fo.size),c.secureContext=SS),new xq.WebSocket(e,"harperdb-replication-v1",c)}function xh(e,t,r){let n=t.port||t.securePort,s=Nl.pid%1e3+"-"+Bq.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3);ae.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||Za,f,m,h=!1,p=t.subscription;p?.then&&p.then(E=>{p=E,p.auditStore&&(f=p.auditStore)});let _=t.tables||u&&it()[u],g;if(!r){ae.error?.(s,"No authorization provided"),Ss(1008,"Unauthorized");return}let y=new Map,T=[];g=r.name,g&&t.connection&&(t.connection.nodeName=g);let R,N,C,k,te,G,K,$=6e4,Y,ce=0,le=0,se=0,he=Uq.default.get(U.REPLICATION_BLOBTIMEOUT)??12e4,Ne=new Map,Ue=[],xe=0,Tr;if(t.url){let E=o(()=>{te&&le===e._socket?.bytesRead&&se===e._socket?.bytesWritten?e.terminate():(te=performance.now(),e.ping(),le=e._socket?.bytesRead,se=e._socket?.bytesWritten)},"sendPing");C=setInterval(E,Mq).unref(),E()}else Qt();e._socket?.setMaxListeners(200);function Qt(){clearTimeout(k),le=e._socket?.bytesRead,se=e._socket?.bytesWritten,k=setTimeout(()=>{le===e._socket?.bytesRead&&se===e._socket?.bytesWritten&&(ae.warn?.(`Timeout waiting for ping from ${g}, terminating connection and reconnecting`),e.terminate())},Mq*2).unref()}o(Qt,"resetPingTimer");function Ht(){if(!(!g||!u))return m||(m=Sd(f,u,g)),m}o(Ht,"getSharedStatus"),u&&ga(u);let Jt,Df,wc=[],kt=[],Mf,vf=[],AE=[],bE=[],Py=150,Uf=25,Pe=0,IE=0,xf=!1,ho,Lr,Rr,Bf;e.on("message",E=>{ce=performance.now();try{let S=E.dataView=new Gc(E.buffer,E.byteOffset,E.byteLength);if(E[0]>127){let P=(0,Ze.decode)(E),[O,D,F]=P;switch(O){case Iq:{if(D){if(g){if(g!==D){ae.error?.(s,`Node name mismatch, expecting to connect to ${g}, but peer reported name as ${D}, disconnecting`),e.send((0,Ze.encode)([Id])),Ss(1008,"Node name mismatch");return}}else if(g=D,t.connection?.tentativeNode){let B=t.connection.tentativeNode;B.name=g,t.connection.tentativeNode=null,Uo(g,B)}if(t.connection&&(t.connection.nodeName=g),ae.debug?.(s,"received node name:",g,"db:",u??P[2]),!u)try{ga(u=P[2]),u==="system"&&(Jt=Ya(t,(B,de)=>{du(de)&&Sa(de)}),e.on("close",()=>{Jt?.remove()}))}catch(B){ae.warn?.(s,"Error setting database",B),e.send((0,Ze.encode)([Id])),Ss(1008,B.message);return}Dr()}break}case Lq:{ae.debug?.(s,"Received table definitions for",D.map(B=>B.table));for(let B of D){let de=P[2];B.database=de;let fe;du(de)&&(de==="system"?ke[de]?.[B.table]||(fe=V(B,ke[de]?.[B.table])):fe=V(B,ke[de]?.[B.table]),f||(f=fe?.auditStore),_||(_=it()?.[de]))}break}case Id:Ss();break;case Iw:try{let B=r?.replicates||r?.subscribers||r?.name;ae.debug?.("Received operation request",D,"from",g),server.operation(D,{user:r},!B).then(de=>{Array.isArray(de)&&(de={results:de}),de.requestId=D.requestId,e.send((0,Ze.encode)([pS,de]))},de=>{e.send((0,Ze.encode)([pS,{requestId:D.requestId,error:(0,Nd.errorToString)(de)}]))})}catch(B){e.send((0,Ze.encode)([pS,{requestId:D.requestId,error:(0,Nd.errorToString)(B)}]))}break;case pS:let{resolve:L,reject:x}=y.get(D.requestId);D.error?x(new Error(D.error)):L(D),y.delete(D.requestId);break;case yw:let z=P[3];if(!_){u?ae.error?.(s,"No database found for",u):ae.error?.(s,"Database name never received"),Ss();return}let ne=_[z];ne=V({table:z,database:u,attributes:D.attributes,schemaDefined:D.schemaDefined},ne),wc[F]={name:z,decoder:new Ze.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:D.typedStructs,structures:D.structures}),getEntry(B){return ne.primaryStore.getEntry(B)},rootStore:ne.primaryStore.rootStore};break;case Nq:Bf=f?zG(D,f):new Map,Mf=P[2],ae.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${Mf}`);break;case wq:let re=F;bE[re]=D;break;case Pq:Ht()[$q]=D,ae.trace?.(s,"received and broadcasting committed update",D),Ht().buffer.notify();break;case Cq:R=D,p.send({type:"end_txn",localTime:R,remoteNodeIds:T});break;case ES:{let B=P[1],{fileId:de,size:fe,finished:me,error:Z}=B,j=Ne.get(de);ae.debug?.("Received blob",de,"has stream",!!j,"connectedToBlob",!!j?.connectedToBlob,"length",P[2].length,"finished",me),j||(j=new bw.PassThrough,j.expectedSize=fe,Ne.set(de,j)),j.lastChunk=Date.now();let Te=P[2];ot(Te.byteLength,"bytes-received",`${g}.${u}`,"replication","blob");try{me?(Z?(j.on("error",()=>{}),j.destroy(new Error("Blob error: "+Z+" for record "+(j.recordId??"unknown")+" from "+remote_node_name))):j.end(Te),j.connectedToBlob&&Ne.delete(de)):j.write(Te)}catch(_e){ae.error?.(`Error receiving blob for ${j.recordId} from ${g} and streaming to storage`,_e),Ne.delete(de)}break}case Oq:{let B=D,de;try{let fe=P[3],me=kt[F]||(kt[F]=_[P[4]]);if(!me)return ae.warn?.("Unknown table id trying to handle record request",F);let Z=me.primaryStore.getBinaryFast(Symbol.for("structures")),j=Z?.length??0;if(j>0&&j!==IE){IE=j;let _e=(0,Ze.decode)(Z);e.send((0,Ze.encode)([yw,{typedStructs:_e.typed,structures:_e.named},F,me.tableName]))}let Te=me.primaryStore.getBinaryFast(fe);if(Te){let _e=me.primaryStore.decoder.decode(Te,{valueAsBuffer:!0}),pe=ut||{};pe.version=(0,Gq.getLastVersion)(),ut&&ut[bu]&Vr&&(_e=Buffer.from(_e),dm(()=>me.primaryStore.decoder.decode(Te),ft=>_a(ft,fe),me.primaryStore.rootStore)),de=(0,Ze.encode)([hS,B,{value:_e,expiresAt:pe.expiresAt,version:pe.version,residencyId:pe.residencyId,nodeId:pe.nodeId,user:pe.user}])}else de=(0,Ze.encode)([hS,B])}catch(fe){de=(0,Ze.encode)([hS,B,{error:fe.message}])}e.send(de);break}case hS:{let{resolve:B,reject:de,tableId:fe,key:me}=y.get(P[1]),Z=P[2];if(Z?.error)de(new Error(Z.error));else if(Z){let j;o_(()=>{let Te=wc[fe].decoder.decode(Z.value);Z.value=Te,Z.key=me,B(Z)||j&&setTimeout(()=>j.forEach(n_),6e4).unref()},f?.rootStore,Te=>{let _e=Oc(Te,me);return j||(j=[]),j.push(_e),_e})}else B();y.delete(P[1]);break}case bq:{Rr=D;let B,de,fe=!1;if(p){if(u!==p.databaseName&&!p.then){ae.error?.("Subscription request for wrong database",u,p.databaseName);return}}else p=d.get(u);if(ae.debug?.(s,"received subscription request for",u,"at",Rr),!p){let Se;p=new Promise(rt=>{ae.debug?.("Waiting for subscription to database "+u),Se=rt}),p.ready=Se,Za.set(u,p)}if(r.name)de=Vt().subscribe(r.name),de.then(async Se=>{B=Se;for await(let rt of B){let nt=rt.value;if(!(nt?.replicates===!0||nt?.replicates?.receives||nt?.subscriptions?.some(ar=>(ar.database||ar.schema)===u&&ar.publish!==!1))){fe=!0,e.send((0,Ze.encode)([Id])),Ss(1008,`Unauthorized database subscription to ${u}`);return}}},Se=>{ae.error?.(s,"Error subscribing to HDB nodes",Se)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,Ze.encode)([Id])),Ss(1008,`Unauthorized database subscription to ${u}`);return}if(Lr&&(ae.debug?.(s,"stopping previous subscription",u),Lr.emit("close")),Rr.length===0)return;let me=Rr[0],Z=o(Se=>{if(Se&&(me.replicateByDefault?!me.tables.includes(Se.tableName):me.tables.includes(Se.tableName)))return{table:Se}},"tableToTableEntry"),j={txnTime:0},Te,_e,pe=1/0,ft,et=o((Se,rt)=>{if(Se.type==="end_txn"){j.txnTime&&(a[i]!==66&&ae.error?.("Invalid encoding of message"),fu(9),fu(__),Pc(ft=rt),tt()),i=c,j.txnTime=0;return}let nt=Se.nodeId,ar=Se.tableId,Mt=_e[ar];if(!Mt&&(Mt=_e[ar]=Z(p.tableById[ar]),!Mt))return ae.debug?.("Not subscribed to table",ar);let Ts=Mt.table,vt=Ts.primaryStore,js=vt.encoder;(Se.extendedType&R_||!js.typedStructs)&&(js._mergeStructures(js.getStructures()),js.typedStructs&&(js.lastTypedStructuresLength=js.typedStructs.length));let mu=Te[nt];if(!(mu&&mu.startTime<rt&&(!mu.endTime||mu.endTime>rt)))return gS&&ae.trace?.(s,"skipping replication update",Se.recordId,"to:",g,"from:",nt,"subscribed:",Te),zD();gS&&ae.trace?.(s,"sending replication update",Se.recordId,"to:",g,"from:",nt,"subscribed:",Te);let Ly=Se.version;j.txnTime!==Ly&&(j.txnTime&&(gS&&ae.trace?.(s,"new txn time, sending queued txn",j.txnTime),a[i]!==66&&ae.error?.("Invalid encoding of message"),tt()),j.txnTime=Ly,i=c,Pc(Ly));let Lc=Se.residencyId,Dy=uu(Lc,Ts),wE;if(Dy&&!Dy.includes(g)){let Qs=uu(Se.previousResidencyId,Ts);if(Qs&&!Qs.includes(g)&&(Se.type==="put"||Se.type==="patch")||Ts.getResidencyById)return zD();let Hf=Se.recordId;ae.trace?.(s,"sending invalidation",Hf,g,"from",nt);let kf=0;Lc&&(kf|=qc),Se.previousResidencyId&&(kf|=$c);let Uy,OE=null;for(let jD in Ts.indices){if(!OE){if(Uy=Se.getValue(vt,!0),!Uy)break;OE={}}OE[jD]=Uy[jD]}wE=Vc(Se.version,ar,Hf,null,nt,Se.user,Se.type==="put"||Se.type==="patch"?"invalidate":Se.type,js.encode(OE),kf,Lc,Se.previousResidencyId,Se.expiresAt)}function zD(){return ae.trace?.(s,"skipping audit record",Se.recordId),G||(G=setTimeout(()=>{G=null,(ft||0)+Dq/2<pe&&(gS&&ae.trace?.(s,"sending skipped sequence update",pe),e.send((0,Ze.encode)([Cq,pe])))},Dq).unref()),new Promise(setImmediate)}o(zD,"skipAuditRecord");let My=js.typedStructs,vy=js.structures;if((My?.length!=Mt.typed_length||vy?.length!=Mt.structure_length)&&(Mt.typed_length=My?.length,Mt.structure_length=vy.length,ae.debug?.(s,"send table struct",Mt.typed_length,Mt.structure_length),Mt.sentName||(Mt.sentName=!0),e.send((0,Ze.encode)([yw,{typedStructs:My,structures:vy,attributes:Ts.attributes,schemaDefined:Ts.schemaDefined},ar,Mt.table.tableName]))),Lc&&!AE[Lc]&&(e.send((0,Ze.encode)([wq,Dy,Lc])),AE[Lc]=!0),wE)fu(wE.length),Cc(wE);else{let Qs=Se.encoded;Se.extendedType&Vr&&dm(()=>Se.getValue(vt),kf=>_a(kf,Se.recordId),vt.rootStore);let Hf=Qs[0]===66?8:0;fu(Qs.length-Hf),Cc(Qs,Hf),ae.trace?.("wrote record",Se.recordId,"length:",Qs.length)}return e._socket.writableNeedDrain?new Promise(Qs=>{ae.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",Qs)}):xe>Uf?new Promise(Qs=>{Tr=Qs}):new Promise(setImmediate)},"sendAuditRecord"),tt=o(()=>{c-i>8?(e.send(a.subarray(i,c)),ae.debug?.(s,"Sent message, size:",c-i),ot(c-i,"bytes-sent",`${g}.${u}`,"replication","egress")):ae.debug?.(s,"skipping empty transaction")},"sendQueuedData");Lr=new Cw.EventEmitter,Lr.once("close",()=>{fe=!0,B?.end()});for(let{startTime:Se}of Rr)Se<pe&&(pe=Se);(de||Promise.resolve()).then(async()=>{p=await p,f=p.auditStore,_e=p.tableById.map(Z),Te=[];for(let{name:rt,startTime:nt,endTime:ar}of Rr){let Mt=oS(rt,f);ae.debug?.("subscription to",rt,"using local id",Mt,"starting",nt),Te[Mt]={startTime:nt,endTime:ar}}Sa(u),Jt||(Jt=Tl(rt=>{rt.databaseName===u&&Sa(u)}),Df=gh(rt=>{rt===u&&(e.send((0,Ze.encode)([Id])),Ss())}),e.on("close",()=>{Jt?.remove(),Df?.remove()})),e.send((0,Ze.encode)([Nq,wh(p.auditStore),Rr.map(({name:rt})=>rt)]));let Se=!0;do{isFinite(pe)||(ae.warn?.("Invalid sequence id "+pe),Ss(1008,"Invalid sequence id"+pe));let rt;if(Se&&!fe&&(Se=!1,pe===0)){ae.info?.("Replicating all tables to",g);let nt=pe,ar=yS(f);for(let Mt in _){if(!Z(Mt))continue;let Ts=_[Mt];for(let vt of Ts.primaryStore.getRange({snapshot:!1,versions:!0})){if(fe)return;if(vt.localTime>=pe){ae.trace?.(s,"Copying record from",u,Mt,vt.key,vt.localTime),nt=Math.max(vt.localTime,nt),rt=!0,Ht()[Uh]=1;let js=Vc(vt.version,Ts.tableId,vt.key,null,ar,null,"put",dm(()=>Ts.primaryStore.encoder.encode(vt.value),mu=>_a(mu,vt.key)),vt.metadataFlags&-256,vt.residencyId,null,vt.expiresAt);await et({recordId:vt.key,tableId:Ts.tableId,type:"put",getValue(){return vt.value},encoded:js,version:vt.version,residencyId:vt.residencyId,nodeId:ar,extendedType:vt.metadataFlags},vt.localTime)}}}rt&&et({type:"end_txn"},pe),Ht()[Uh]=0,pe=nt}for(let{key:nt,value:ar}of f.getRange({start:pe||1,exclusiveStart:!0,snapshot:!1})){if(fe)return;let Mt=At(ar);ae.debug?.("sending audit record",new Date(nt)),Ht()[Uh]=nt,pe=nt,await et(Mt,nt),Lr.startTime=nt,rt=!0}rt&&et({type:"end_txn"},pe),Ht()[Uh]=0,await NU(f)}while(!fe)}).catch(Se=>{ae.error?.(s,"Error handling subscription to node",Se),Ss(1008,"Error handling subscription to node")});break}}return}S.position=8;let A=!0,b,I;do{Ht();let P=S.readInt();if(P===9&&S.getUint8(S.position)==__){S.position++,R=I=S.readFloat64(),m[Nw]=R,m[ww]=Date.now(),m[Ow]=Vq,ae.trace?.("received remote sequence update",R,u);break}let O=S.position,D=At(E,O,O+P),F=wc[D.tableId];F||ae.error?.(`No table found with an id of ${D.tableId}`);let L;D.residencyId&&(L=bE[D.residencyId],ae.trace?.(s,"received residency list",L,D.type,D.recordId));try{let x=D.recordId;o_(()=>{b={table:F.name,id:D.recordId,type:D.type,nodeId:Bf.get(D.nodeId),residencyList:L,timestamp:D.version,value:D.getValue(F),user:D.user,beginTxn:A,expiresAt:D.expiresAt}},f?.rootStore,z=>Oc(z,x))}catch(x){throw x.message+="typed structures for current decoder"+JSON.stringify(F.decoder.typedStructs),x}A=!1,ae.trace?.(s,"received replication message",D.type,"id",b.id,"version",new Date(D.version),"nodeId",b.nodeId),m[Nw]=D.version,m[ww]=Date.now(),m[Ow]=Kq,p.send(b),S.position=O+P}while(S.position<E.byteLength);Pe++,ot(E.byteLength,"bytes-received",`${g}.${u}.${b?.table||"unknown_table"}`,"replication","ingest"),Pe>Py&&!xf&&(xf=!0,e.pause(),ae.debug?.(`Commit backlog causing replication back-pressure, requesting that ${g} pause replication`)),p.send({type:"end_txn",localTime:R,remoteNodeIds:T,async onCommit(){if(b){let P=Date.now()-b.timestamp;ot(P,"replication-latency",g+"."+u+"."+b.table,b.type,"ingest")}Pe--,xf&&(xf=!1,e.resume(),ae.debug?.(`Replication resuming ${g}`)),Ue.length>0&&await Promise.all(Ue),ae.trace?.("All blobs finished"),!N&&I&&(ae.trace?.(s,"queuing confirmation of a commit at",I),setTimeout(()=>{e.send((0,Ze.encode)([Pq,N])),ae.trace?.(s,"sent confirmation of a commit at",N),N=null},lce)),N=I,ae.debug?.("last sequence committed",new Date(I),u)}})}catch(S){ae.error?.(s,"Error handling incoming replication message",S)}}),e.on("ping",Qt),e.on("pong",()=>{if(t.connection){let E=performance.now()-te;t.connection.latency=E,Ht()&&(m[TS]=E),t.isSubscriptionConnection&&Al({name:g,database:u,url:t.url,latency:E})}te=null}),e.on("close",(E,S)=>{clearInterval(C),clearTimeout(k),clearInterval(K),Lr&&Lr.emit("close"),ho&&ho.end();for(let[A,{reject:b}]of y)b(new Error(`Connection closed ${S?.toString()} ${E}`));ae.debug?.(s,"closed",E,S?.toString())});function Ss(E,S){try{e.isFinished=!0,ae.debug?.(s,"closing",g,u,E,S),e.close(E,S),t.connection?.emit("finished")}catch(A){ae.error?.(s,"Error closing connection",A)}}o(Ss,"close");let Ea=new Set;async function _a(E,S){let A=s_(E);if(Ea.has(A)){ae.debug?.("Blob already being sent",A);return}Ea.add(A);try{let b;xe++;for await(let I of E.stream())b&&(ae.debug?.("Sending blob chunk",A,"length",b.length),e.send((0,Ze.encode)([ES,{fileId:A,size:E.size},b]))),b=I,e._socket.writableNeedDrain&&(ae.debug?.("draining",A),await new Promise(P=>e._socket.once("drain",P)),ae.debug?.("drained",A)),ot(I.length,"bytes-sent",`${g}.${u}`,"replication","blob");ae.debug?.("Sending final blob chunk",A,"length",b.length),e.send((0,Ze.encode)([ES,{fileId:A,size:E.size,finished:!0},b]))}catch(b){ae.warn?.("Error sending blob",b,"blob id",A,"for record",S),e.send((0,Ze.encode)([ES,{fileId:A,finished:!0,error:(0,Nd.errorToString)(b)},Buffer.alloc(0)]))}finally{Ea.delete(A),xe--,xe<Uf&&Tr?.()}}o(_a,"sendBlobs");function Oc(E,S){let A=s_(E),b=Ne.get(A);ae.debug?.("Received transaction with blob",A,"has stream",!!b,"ended",!!b?.writableEnded),b?b.writableEnded&&Ne.delete(A):(b=new bw.PassThrough,Ne.set(A,b)),b.connectedToBlob=!0,b.lastChunk=Date.now(),b.recordId=S,E.size===void 0&&b.expectedSize&&(E.size=b.expectedSize);let I=b.blob??createBlob(b,E);b.blob=I;let P=yo(()=>um(I).saving,p.auditStore?.rootStore);return P&&(P.blobId=A,Ue.push(P),P.finally(()=>{ae.debug?.(`Finished receiving blob stream ${A}`),Ue.splice(Ue.indexOf(P),1)})),I}o(Oc,"receiveBlobs");function Dr(){if(h||(h=!0,t.connection?.on("subscriptions-updated",Dr)),!f&&p&&(f=p.auditStore),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let E=new Map;f||(f=p?.auditStore);try{for(let b of p?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let I of b.value.nodes||[])I.lastTxnTime>(E.get(I.id)??0)&&E.set(I.id,I.lastTxnTime)}catch(b){if(!b.message.includes("Can not re"))throw b}let S=t.connection?.nodeSubscriptions?.[0];T=[];let A=t.connection?.nodeSubscriptions.map((b,I)=>{let P=[],{replicateByDefault:O}=b;if(b.subscriptions){for(let x of b.subscriptions)if(x.subscribe&&(x.schema||x.database)===u){let z=x.table;_?.[z]?.replicate!==!1&&P.push(z)}O=!1}else for(let x in _)(O?_[x].replicate===!1:_[x].replicate)&&P.push(x);let D=f&&oS(b.name,f),F=p?.dbisDB?.get([Symbol.for("seq"),D])??1,L=Math.max(F?.seqId??1,(typeof b.startTime=="string"?new Date(b.startTime).getTime():b.startTime)??1);if(ae.debug?.("Starting time recorded in db",b.name,D,u,F?.seqId,"start time:",L,new Date(L)),S!==b){let x=f&&oS(S.name,f),z=p?.dbisDB?.get([Symbol.for("seq"),x])??1;for(let ne of z?.nodes||[])ne.name===b.name&&(L=ne.seqId,ae.debug?.("Using sequence id from proxy node",S.name,L))}if(D===void 0?ae.warn("Starting subscription request from node",b,"but no node id found"):T.push(D),E.get(D)>L&&(L=E.get(D),ae.debug?.("Updating start time from more recent txn recorded",S.name,L)),L===1&&_S)try{new URL(_S).hostname===b.name?(ae.warn?.(`Requesting full copy of database ${u} from ${_S}`),L=0):L=Date.now()-6e4}catch(x){ae.error?.("Error parsing leader URL",_S,x)}return ae.trace?.(s,"defining subscription request",b.name,u,new Date(L)),{name:b.name,replicateByDefault:O,tables:P,startTime:L,endTime:b.endTime}});if(A)if(ae.debug?.(s,"sending subscription request",A,p?.dbisDB?.path),clearTimeout(Y),A.length>0)e.send((0,Ze.encode)([bq,A]));else{let b=o(()=>{let I=performance.now();Y=setTimeout(()=>{ce<=I?Ss(1008,"Connection has no subscriptions and is no longer used"):b()},$).unref()},"scheduleClose");b()}}o(Dr,"sendSubscriptionRequestUpdate");function uu(E,S){if(!E)return;let A=vf[E];return A||(A=S.getResidencyRecord(E),vf[E]=A),A}o(uu,"getResidence");function du(E){return!(Xa&&Xa!="*"&&!Xa[E]&&!Xa.includes?.(E)&&!Xa.some?.(S=>S.name===E))}o(du,"checkDatabaseAccess");function ga(E){if(p=p||d.get(E),!du(E))throw new Error(`Access to database "${E}" is not permitted`);p||ae.warn?.(`No database named "${E}" was declared and registered`),f=p?.auditStore,_||(_=it()?.[E]);let S=Xe();if(S===g)throw S?new Error("Should not connect to self",S):new Error("Node name not defined");return NE(S,E),!0}o(ga,"setDatabase");function NE(E,S){let A=it()?.[S],b=[];for(let I in A){let P=A[I];b.push({table:I,schemaDefined:P.schemaDefined,attributes:P.attributes.map(O=>({name:O.name,type:O.type,isPrimaryKey:O.isPrimaryKey}))})}ae.trace?.("Sending database info for node",E,"database name",S),e.send((0,Ze.encode)([Iq,E,S,b]))}o(NE,"sendNodeDBName");function Sa(E){let S=it()?.[E],A=[];for(let b in S){if(Rr&&!Rr.some(P=>P.replicateByDefault?!P.tables.includes(b):P.tables.includes(b)))continue;let I=S[b];A.push({table:b,schemaDefined:I.schemaDefined,attributes:I.attributes.map(P=>({name:P.name,type:P.type,isPrimaryKey:P.isPrimaryKey}))})}e.send((0,Ze.encode)([Lq,A,E]))}o(Sa,"sendDBSchema"),K=setInterval(()=>{for(let[E,S]of Ne)S.lastChunk+he<Date.now()&&(ae.warn?.(`Timeout waiting for blob stream to finish ${E} for record ${S.recordId??"unknown"} from ${g}`),Ne.delete(E),S.end())},he).unref();let Ta=1,Ff=[];return{end(){ho&&ho.end(),Lr&&Lr.emit("close")},getRecord(E){let S=Ta++;return new Promise((A,b)=>{let I=[Oq,S,E.table.tableId,E.id];Ff[E.table.tableId]||(I.push(E.table.tableName),Ff[E.table.tableId]=!0),e.send((0,Ze.encode)(I)),ce=performance.now(),y.set(S,{tableId:E.table.tableId,key:E.id,resolve(P){let{table:O,entry:D}=E;if(A(P),P)return O._recordRelocate(D,P)},reject:b})})},sendOperation(E){let S=Ta++;return E.requestId=S,e.send((0,Ze.encode)([Iw,E])),new Promise((A,b)=>{y.set(S,{resolve:A,reject:b})})}};function fu(E){Ra(5),E<128?a[c++]=E:E<16384?(l.setUint16(c,E|32768),c+=2):E<1056964608?(l.setUint32(c,E|3221225472),c+=4):(a[c]=255,l.setUint32(c+1,E),c+=5)}function Cc(E,S=0,A=E.length){let b=A-S;Ra(b),E.copy(a,c,S,A),c+=b}function Pc(E){Ra(8),l.setFloat64(c,E),c+=8}function Ra(E){if(E+16>a.length-c){let S=Buffer.allocUnsafeSlow(c+E-i+65536>>10<<11);a.copy(S,0,i,c),c=c-i,i=0,a=S,l=new DataView(a.buffer,0,a.length)}}function V(E,S){let A=E.database??"data";if(A!=="data"&&!ke[A]){ae.warn?.("Database not found",E.database);return}S||(S={});let b=S.schemaDefined,I=!1,P=E.schemaDefined,O=S.attributes||[];for(let D=0;D<E.attributes?.length;D++){let F=E.attributes[D],L=O.find(x=>x.name===F.name);(!L||L.type!==F.type)&&(b?ae.error?.(`Schema for '${u}.${E.table}' is defined locally, but attribute '${F.name}: ${F.type}' from '${g}' does not match local attribute ${L?"'"+L.name+": "+L.type+"'":"which does not exist"}`):(I=!0,P||(F.indexed=!0),L?O[O.indexOf(L)]=F:O.push(F)))}return I?(ae.debug?.("(Re)creating",E),Qe({table:E.table,database:E.database,schemaDefined:E.schemaDefined,attributes:O,...S})):S}}var Uq,Ze,xq,Bq,Nd,Cw,Fq,Hq,Nl,kq,bw,Gq,qq,ae,bq,Iq,Nq,Id,wq,yw,Oq,hS,Iw,pS,Cq,Pq,Lq,ES,$q,Nw,ww,Uh,TS,Ow,Vq,Kq,cce,_S,Pw,Za,gS,Dq,lce,Mq,Aw,SS,vq,wd,Lw=ue(()=>{De();Li();iw();XA();ss();Uq=w(oe());H();Kc();Ze=require("msgpackr"),xq=require("ws"),Bq=require("worker_threads"),Nd=w(Q());Dh();Cw=require("events"),Fq=w(os()),Hq=w(require("node:tls"));yl();Nl=w(require("node:process")),kq=require("node:net");Wi();Kn();bw=require("node:stream"),Gq=require("lmdb"),qq=w(require("minimist")),ae=(0,Nd.forComponent)("replication").conditional,bq=129,Iq=140,Nq=141,Id=142,wq=130,yw=132,Oq=133,hS=134,Iw=136,pS=137,Cq=143,Pq=144,Lq=145,ES=146,$q=0,Nw=1,ww=2,Uh=3,TS=4,Ow=5,Vq=0,Kq=1,cce=(0,qq.default)(Nl.argv),_S=cce.HDB_LEADER_URL??Nl.env.HDB_LEADER_URL,Pw=new Map,Za=new Map,gS=!0,Dq=300,lce=2,Mq=3e4;o(RS,"createWebSocket");vq=500,wd=class extends Cw.EventEmitter{static{o(this,"NodeReplicationConnection")}socket;startTime;retryTime=vq;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??mi(t)}async connect(){this.session||this.resetSession();let t=[];this.socket=await RS(this.url,{serverName:this.nodeName,authorization:this.authorization});let r;ae.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${Nl.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ae[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=vq,this.nodeSubscriptions&&Al({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,r=xh(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"?(ae.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"?ae.error?.(`Can not connect to ${this.url}, the certificate provided by ${this.url} is not trusted, this node needs to be added to the cluster, or a certificate authority needs to be added`):ae.error?.(`Error in connection to ${this.url} due to ${n.message}`)),this.sessionReject(n)}),this.socket.on("close",(n,s)=>{if(this.isConnected&&(this.nodeSubscriptions&&yd({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();ae.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(xh,"replicateOverWS")});var Bo={};Oe(Bo,{clearThisNodeName:()=>gce,disableReplication:()=>mce,enabledDatabases:()=>Xa,forEachReplicatedDatabase:()=>Ya,getThisNodeId:()=>yS,getThisNodeName:()=>Xe,getThisNodeUrl:()=>Wa,hostnameToUrl:()=>NS,lastTimeInAuditStore:()=>Oh,monitorNodeCAs:()=>t$,replicateOperation:()=>Tce,replicationCertificateAuthorities:()=>Fo,sendOperationToNode:()=>Bh,servers:()=>dce,setReplicator:()=>n$,start:()=>fce,startOnMainThread:()=>lw,subscribeToNode:()=>Lh,unsubscribeFromNode:()=>lS,urlToNodeName:()=>mi});function fce(e){if(!e.port&&!e.securePort&&(e.port=Ds.default.get(U.OPERATIONSAPI_NETWORK_PORT),e.securePort=Ds.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),!Xe())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of Ph(e))t.set(mi(s.url),s);hce(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=Le.ws(async(s,i,a,c)=>{if(Ot.debug("Incoming WS connection received "+i.url),i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,a);await a,s._socket.unref(),xh(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&Ot.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Le.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){Ot.debug("Incoming replication WS connection received, authorized: "+s.authorized),!s.authorized&&s._nodeRequest.socket.authorizationError&&Ot.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=Vt().primaryStore;if(s.authorized&&s.peerCertificate.subjectaltname){let c=(0,Zq.getHostnamesFromCertificate)(s.peerCertificate),l;for(let u of c)if(l=u&&(a.get(u)||t.get(u)),l)break;if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){Ot.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else Ot.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:Ot.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(Fo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=IS.createSecureContext(u)}catch(l){Ot.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Ds.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1&&i()}t$(()=>{for(let s of n)s()})}function t$(e){let t=0;Td(r=>{r?.ca&&(Fo.add(r.ca),Fo.size!==t&&(t=Fo.size,e?.()))})}function mce(e=!0){e$=e}function hce(e){e$||(it(),Xa=e.databases,Ya(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||Za;for(let[s,i]of bS){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];n$(r,s,e),Pw.get(s)?.forEach(i=>i(s))}}))}function n$(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 r$ extends Ur{static{o(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||Za,a=i.get(e),c=a?.tableById||[];c[t.tableId]=t;let l=a?.ready;if(Ot.trace("Setting up replicator subscription to database",e),!a?.auditStore)return this.subscription=a=new Vn,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 p of c){if(u.has(p)||p===Le.hostname)continue;let _=Ece(p,r$.subscription,e);if(_?.isConnected){let g=Sd(t.auditStore,e,p)[TS];(!d||g<m)&&(d=_,f=p,m=g)}}if(!d)throw l||new Jq.ServerError(`No connection to any other nodes are available: ${c}`,502);let h={requestId:uce++,table:t,entry:i,id:i.key};u.add(f);try{return await d.getRecord(h)}catch(p){if(d.isConnected)throw p;Ot.warn("Error in load from node",wl,p),l||(l=p)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function pce(e,t,r,n,s){let i=bS.get(e);i||bS.set(e,i=new Map);let a=i.get(r);if(a)return a;if(t)return i.set(r,a=new wd(e,t,r,n,s)),a.connect(),a.once("finished",()=>i.delete(r)),a}function Ece(e,t,r){let n=Wq.get(wl);n||(n=new Map,Wq.set(wl,n));let s=n.get(r);if(s)return s;let i=Vt().primaryStore.get(e);return i?.url&&(s=new wd(i.url,t,r,wl,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function Bh(e,t,r){r||(r={}),r.serverName=e.name;let n=await RS(e.url,r),s=xh(n,{},{});return new Promise((i,a)=>{n.on("open",()=>{Ot.debug("Sending operation connection to "+e.url+" opened",t),i(s.sendOperation(t))}),n.on("error",c=>{a(c)}),n.on("close",c=>{Ot.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function Lh(e){try{Xq.isMainThread&&Ot.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=Za.get(e.database);if(!t){let n;t=new Promise(s=>{Ot.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,Za.set(e.database,t)}let r=pce(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=>Ch(n,e.database)),e.replicateByDefault)}catch(t){Ot.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function lS({name:e,url:t,database:r}){Ot.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(Vt().primaryStore.getRange({})));let n=bS.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function _ce(){if(Dw!==void 0)return Dw;let e=Ds.default.get(U.OPERATIONSAPI_TLS_CERTIFICATE)||Ds.default.get(U.TLS_CERTIFICATE);if(e)return Dw=new jq.X509Certificate((0,Qq.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function Xe(){return wl||(wl=Ds.default.get("replication_hostname")??mi(Ds.default.get("replication_url"))??_ce()??zq("operationsapi_network_secureport")??zq("operationsapi_network_port")??"127.0.0.1")}function gce(){wl=void 0}function zq(e){let t=Ds.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function AS(e){let t=Ds.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function yS(e){return wh(e)?.[Xe()]}function Wa(){let e=Ds.default.get("replication_url");return e||NS(Xe())}function NS(e){let t=AS("replication_port");if(t)return`ws://${e}:${t}`;if(t=AS("replication_secureport"),t)return`wss://${e}:${t}`;if(t=AS("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=AS("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function mi(e){if(e)return new URL(e).hostname}function Ya(e,t){for(let n of Object.getOwnPropertyNames(ke))r(n);return gh(n=>{r(n)}),Tl((n,s)=>{r(n.databaseName)});function r(n){let s=ke[n];Ot.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):Sce(n)&&t(s,n,!1)}o(r,"forDatabase")}function Sce(e){let t=ke[e];for(let r in t)if(t[r].replicate)return!0}function Oh(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function Tce(e){let t={message:""};if(e.replicated){e.replicated=!1,Ot.trace?.("Replicating operation",e.operation,"to nodes",Le.nodes.map(n=>n.name));let r=await Promise.allSettled(Le.nodes.map(n=>Bh(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Le.nodes[s]?.name,i})}return t}var Ds,Ot,jq,Qq,IS,Jq,Xq,Zq,e$,uce,dce,Fo,Xa,bS,Wq,Dw,wl,ss=ue(()=>{De();La();_u();Lw();Mr();Ds=w(oe()),Ot=w(Q()),jq=require("crypto"),Qq=require("fs");Dh();yl();H();iw();IS=w(require("node:tls")),Jq=w(ge()),Xq=require("worker_threads"),Zq=w(os()),uce=1,dce=[],Fo=Ds.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1?new Set(IS.rootCertificates):new Set;o(fce,"start");o(t$,"monitorNodeCAs");o(mce,"disableReplication");o(hce,"assignReplicationSource");o(n$,"setReplicator");bS=new Map;o(pce,"getSubscriptionConnection");Wq=new Map;o(Ece,"getRetrievalConnectionByName");o(Bh,"sendOperationToNode");o(Lh,"subscribeToNode");o(lS,"unsubscribeFromNode");o(_ce,"getCommonNameFromCert");o(Xe,"getThisNodeName");o(gce,"clearThisNodeName");Object.defineProperty(Le,"hostname",{get(){return Xe()}});o(zq,"getHostFromListeningPort");o(AS,"getPortFromListeningPort");o(yS,"getThisNodeId");Le.replication={getThisNodeId:yS,exportIdMapping:wh};o(Wa,"getThisNodeUrl");o(NS,"hostnameToUrl");o(mi,"urlToNodeName");o(Ya,"forEachReplicatedDatabase");o(Sce,"hasExplicitlyReplicatedTable");o(Oh,"lastTimeInAuditStore");o(Tce,"replicateOperation")});var Hh=M(($Me,c$)=>{"use strict";var Od=YG(),{validateBySchema:Fh}=dt(),{commonValidators:Cd,schemaRegex:Mw}=Hi(),mr=require("joi"),Rce=Q(),yce=require("uuid").v4,CS=Oo(),Pd=(H(),v(W)),Ace=require("util"),ec=Jn(),{handleHDBError:Ho,hdbErrors:bce,ClientError:Ol}=ge(),{HDB_ERROR_MSGS:wS,HTTP_STATUS_CODES:ko}=bce,{SchemaEventMsg:PS}=ii(),s$=hr(),{getDatabases:Ice}=(De(),v(ht)),{transformReq:Ld}=ie(),{replicateOperation:i$}=(ss(),v(Bo)),{cleanupOrphans:Nce}=(Kn(),v(a_)),OS=mr.string().min(1).max(Cd.schema_length.maximum).pattern(Mw).messages({"string.pattern.base":"{:#label} "+Cd.schema_format.message}),wce=mr.string().min(1).max(Cd.schema_length.maximum).pattern(Mw).messages({"string.pattern.base":"{:#label} "+Cd.schema_format.message}).required(),Oce=mr.string().min(1).max(Cd.schema_length.maximum).pattern(Mw).messages({"string.pattern.base":"{:#label} "+Cd.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();c$.exports={createSchema:Cce,createSchemaStructure:o$,createTable:Pce,createTableStructure:a$,createAttribute:Uce,dropSchema:Lce,dropTable:Dce,dropAttribute:Mce,getBackup:xce,cleanupOrphanBlobs:Bce};async function Cce(e){let t=await o$(e);return CS.signalSchemaChange(new PS(process.pid,e.operation,e.schema)),t}o(Cce,"createSchema");async function o$(e){let t=Fh(e,mr.object({database:OS,schema:OS}));if(t)throw new Ol(t.message);if(Ld(e),!await Od.checkSchemaExists(e.schema))throw Ho(new Error,wS.SCHEMA_EXISTS_ERR(e.schema),ko.BAD_REQUEST,Pd.LOG_LEVELS.ERROR,wS.SCHEMA_EXISTS_ERR(e.schema),!0);return await ec.createSchema(e),`database '${e.schema}' successfully created`}o(o$,"createSchemaStructure");async function Pce(e){return Ld(e),e.hash_attribute=e.primary_key??e.hash_attribute,await a$(e)}o(Pce,"createTable");async function a$(e){let t=Fh(e,mr.object({database:OS,schema:OS,table:wce,residence:mr.array().items(mr.string().min(1)).optional(),hash_attribute:Oce}));if(t)throw new Ol(t.message);if(!await Od.checkSchemaTableExists(e.schema,e.table))throw Ho(new Error,wS.TABLE_EXISTS_ERR(e.schema,e.table),ko.BAD_REQUEST,Pd.LOG_LEVELS.ERROR,wS.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:yce(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await ec.createTable(n,e);else throw Ho(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",ko.BAD_REQUEST);else await ec.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}o(a$,"createTableStructure");async function Lce(e){let t=Fh(e,mr.object({database:mr.string(),schema:mr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Ol(t.message);Ld(e);let r=await Od.checkSchemaExists(e.schema);if(r)throw Ho(new Error,r,ko.NOT_FOUND,Pd.LOG_LEVELS.ERROR,r,!0);let n=await Od.schemaDescribe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await ec.dropSchema(e),CS.signalSchemaChange(new PS(process.pid,e.operation,e.schema)),await s$.purgeSchemaTableStreams(e.schema,s);let i=await i$(e);return i.message=`successfully deleted '${e.schema}'`,i}o(Lce,"dropSchema");async function Dce(e){let t=Fh(e,mr.object({database:mr.string(),schema:mr.string(),table:mr.string().required()}));if(t)throw new Ol(t.message);Ld(e);let r=await Od.checkSchemaTableExists(e.schema,e.table);if(r)throw Ho(new Error,r,ko.NOT_FOUND,Pd.LOG_LEVELS.ERROR,r,!0);await ec.dropTable(e),await s$.purgeTableStream(e.schema,e.table);let n=await i$(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}o(Dce,"dropTable");async function Mce(e){let t=Fh(e,mr.object({database:mr.string(),schema:mr.string(),table:mr.string().required(),attribute:mr.string().required()}));if(t)throw new Ol(t.message);Ld(e);let r=await Od.checkSchemaTableExists(e.schema,e.table);if(r)throw Ho(new Error,r,ko.NOT_FOUND,Pd.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Ho(new Error,"You cannot drop a hash attribute",ko.BAD_REQUEST,void 0,void 0,!0);if(Pd.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Ho(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,ko.BAD_REQUEST,void 0,void 0,!0);try{return await ec.dropAttribute(e),vce(e),CS.signalSchemaChange(new PS(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw Rce.error(`Got an error deleting attribute ${Ace.inspect(e)}.`),n}}o(Mce,"dropAttribute");function vce(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(vce,"dropAttributeFromGlobal");async function Uce(e){Ld(e);let t=Ice()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Ho(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,ko.BAD_REQUEST,void 0,void 0,!0);return await ec.createAttribute(e),CS.signalSchemaChange(new PS(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}o(Uce,"createAttribute");function xce(e){return ec.getBackup(e)}o(xce,"getBackup");function Bce(e){if(!e.database)throw new Ol('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new Ol(`Unknown database '${e.database}'`);return Nce(databases[e.database]),{message:"Orphaned blobs cleanup started, check logs for progress"}}o(Bce,"cleanupOrphanBlobs")});var u$=M((KMe,l$)=>{"use strict";var{OPERATIONS_ENUM:Fce}=(H(),v(W)),vw=class{static{o(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Fce.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};l$.exports=vw});var Uw=M((zMe,p$)=>{"use strict";var Hce=Jn(),WMe=u$(),LS=ie(),DS=(H(),v(W)),kce=oe(),{handleHDBError:d$,hdbErrors:Gce}=ge(),{HDB_ERROR_MSGS:f$,HTTP_STATUS_CODES:m$}=Gce,qce=Object.values(DS.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),h$="To use this operation audit log must be enabled in harperdb-config.yaml";p$.exports=$ce;async function $ce(e){if(LS.isEmpty(e.schema))throw new Error(f$.SCHEMA_REQUIRED_ERR);if(LS.isEmpty(e.table))throw new Error(f$.TABLE_REQUIRED_ERR);if(!kce.get(DS.CONFIG_PARAMS.LOGGING_AUDITLOG))throw d$(new Error,h$,m$.BAD_REQUEST,DS.LOG_LEVELS.ERROR,h$,!0);let t=LS.checkSchemaTableExist(e.schema,e.table);if(t)throw d$(new Error,t,m$.NOT_FOUND,DS.LOG_LEVELS.ERROR,t,!0);if(!LS.isEmpty(e.search_type)&&qce.indexOf(e.search_type)<0)throw new Error(`Invalid searchType '${read_audit_log_object.search_type}'`);return await Hce.readAuditLog(e)}o($ce,"readAuditLog")});var _$=M((QMe,E$)=>{"use strict";var{OPERATIONS_ENUM:Vce}=(H(),v(W)),xw=class{static{o(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Vce.GET_BACKUP,this.schema=t,this.table=r}};E$.exports=xw});var T$=M((eve,S$)=>{"use strict";var Kce=Jn(),XMe=_$(),Bw=ie(),Yce=(H(),v(W)),ZMe=oe(),{handleHDBError:Wce,hdbErrors:zce}=ge(),{HDB_ERROR_MSGS:g$,HTTP_STATUS_CODES:jce}=zce;S$.exports=Qce;async function Qce(e){if(Bw.isEmpty(e.schema))throw new Error(g$.SCHEMA_REQUIRED_ERR);if(Bw.isEmpty(e.table))throw new Error(g$.TABLE_REQUIRED_ERR);let t=Bw.checkSchemaTableExist(e.schema,e.table);if(t)throw Wce(new Error,t,jce.NOT_FOUND,Yce.LOG_LEVELS.ERROR,t,!0);return await Kce.getBackup(readAuditLogObject)}o(Qce,"getBackup")});var b$=M((rve,A$)=>{"use strict";var Jce=oe(),tc=require("joi"),Xce=dt(),R$=require("moment"),Zce=require("fs-extra"),Fw=require("path"),ele=require("lodash"),kh=(H(),v(W)),{LOG_LEVELS:Cl}=(H(),v(W)),tle="YYYY-MM-DD hh:mm:ss",rle=Fw.resolve(__dirname,"../logs");A$.exports=function(e){return Xce.validateBySchema(e,nle)};var nle=tc.object({from:tc.custom(y$),until:tc.custom(y$),level:tc.valid(Cl.NOTIFY,Cl.FATAL,Cl.ERROR,Cl.WARN,Cl.INFO,Cl.DEBUG,Cl.TRACE),order:tc.valid("asc","desc"),limit:tc.number().min(1),start:tc.number().min(0),log_name:tc.custom(sle)});function y$(e,t){if(R$(e,R$.ISO_8601).format(tle)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}o(y$,"validateDatetime");function sle(e,t){if(ele.invert(kh.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Jce.get(kh.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?kh.LOG_NAMES.HDB:e,i=s===kh.LOG_NAMES.INSTALL?Fw.join(rle,kh.LOG_NAMES.INSTALL):Fw.join(n,s);return Zce.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}o(sle,"validateReadLogPath")});var kw=M((sve,N$)=>{"use strict";var MS=(H(),v(W)),ile=Q(),ole=oe(),ale=b$(),Hw=require("path"),I$=require("fs-extra"),{once:cle}=require("events"),{handleHDBError:lle,hdbErrors:ule}=ge(),{PACKAGE_ROOT:dle}=Rt(),{replicateOperation:fle}=(ss(),v(Bo)),mle=Hw.join(dle,"logs"),hle=1e3,ple=200;N$.exports=Ele;async function Ele(e){let t=ale(e);if(t)throw lle(t,t.message,ule.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=fle(e),n=ole.get(MS.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e.log_name===void 0?MS.LOG_NAMES.HDB:e.log_name,i=s===MS.LOG_NAMES.INSTALL?Hw.join(mle,MS.LOG_NAMES.INSTALL):Hw.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?hle:e.limit,h=e.order===void 0?void 0:e.order,p=e.start===void 0?0:e.start,_=p+m,g=0;h==="desc"&&!u&&!f&&(g=Math.max(I$.statSync(i).size-(_+5)*ple,0));let y=I$.createReadStream(i,{start:g});y.on("error",G=>{ile.error(G)});let T=0,R=[],N="",C;y.on("data",G=>{let K=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;G=N+G;let $=0,Y;for(;(Y=K.exec(G))&&!y.destroyed;){C&&(C.message=G.slice($,Y.index),k(C));let[ce,le,se]=Y,he=se.split("] ["),Ne=he[0],Ue=he[1];he.splice(0,2),C={timestamp:le,thread:Ne,level:Ue,tags:he,message:""},$=Y.index+ce.length}N=G.slice($)}),y.on("end",G=>{y.destroyed||C&&(C.message=N.trim(),k(C))}),y.resume();function k(G){let K,$,Y;switch(!0){case(a&&l&&d):K=new Date(G.timestamp),$=new Date(u),Y=new Date(f),G.level===c&&K>=$&&K<=Y&&T<p?T++:G.level===c&&K>=$&&K<=Y&&(Zi(G,h,R),T++,T===_&&y.destroy());break;case(a&&l):K=new Date(G.timestamp),$=new Date(u),G.level===c&&K>=$&&T<p?T++:G.level===c&&K>=$&&(Zi(G,h,R),T++,T===_&&y.destroy());break;case(a&&d):K=new Date(G.timestamp),Y=new Date(f),G.level===c&&K<=Y&&T<p?T++:G.level===c&&K<=Y&&(Zi(G,h,R),T++,T===_&&y.destroy());break;case(l&&d):K=new Date(G.timestamp),$=new Date(u),Y=new Date(f),K>=$&&K<=Y&&T<p?T++:K>=$&&K<=Y&&(Zi(G,h,R),T++,T===_&&y.destroy());break;case a:G.level===c&&T<p?T++:G.level===c&&(Zi(G,h,R),T++,T===_&&y.destroy());break;case l:K=new Date(G.timestamp),$=new Date(u),K>=$&&T<p?T++:K>=$&&T>=p&&(Zi(G,h,R),T++,T===_&&y.destroy());break;case d:K=new Date(G.timestamp),Y=new Date(f),K<=Y&&T<p?T++:K<=Y&&T>=p&&(Zi(G,h,R),T++,T===_&&y.destroy());break;default:T<p?T++:(Zi(G,h,R),T++,T===_&&y.destroy())}}o(k,"onLogMessage"),await cle(y,"close");let te=await r;if(te.replicated){for(let G of R)G.node=server.hostname;for(let G of te.replicated){let K=G.node;if(G.status==="failed")Zi({timestamp:new Date().toISOString(),level:"error",node:K,message:`Error retrieving logs: ${G.reason}`},h,R);else for(let $ of G.results)$.node=K,Zi($,h,R)}}return R}o(Ele,"readLog");function Zi(e,t,r){t==="desc"?_le(e,r):t==="asc"?gle(e,r):r.push(e)}o(Zi,"pushLineToResult");function _le(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(_le,"insertDescending");function gle(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(gle,"insertAscending")});var vS=M((uve,P$)=>{"use strict";var Gw=require("joi"),{string:Dd,boolean:w$,date:Sle}=Gw.types(),Tle=dt(),{validateSchemaExists:ove,validateTableExists:ave,validateSchemaName:cve}=Hi(),Rle=(H(),v(W)),yle=It(),O$=oe();O$.initSync();var lve=Dd.invalid(O$.get(Rle.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(yle.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),C$={operation:Dd.valid("add_node","update_node","set_node_replication"),node_name:Dd.optional(),subscriptions:Gw.array().items({table:Dd.optional(),schema:Dd.optional(),database:Dd.optional(),subscribe:w$.required(),publish:w$.required().custom(ble),start_time:Sle.iso()})};function Ale(e){return Tle.validateBySchema(e,Gw.object(C$))}o(Ale,"addUpdateNodeValidator");function ble(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(ble,"checkForFalsy");P$.exports={addUpdateNodeValidator:Ale,validationSchema:C$}});var Md=M((fve,L$)=>{"use strict";var qw=class{static{o(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},$w=class{static{o(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};L$.exports={Node:qw,NodeSubscription:$w}});var M$=M((hve,D$)=>{"use strict";var Ile=(H(),v(W)).OPERATIONS_ENUM,Vw=class{static{o(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Ile.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};D$.exports=Vw});var Gh=M((Eve,v$)=>{"use strict";var Kw=class{static{o(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},Yw=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)}};v$.exports={RemotePayloadObject:Kw,RemotePayloadSubscription:Yw}});var x$=M((gve,U$)=>{"use strict";var Ww=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}};U$.exports=Ww});var F$=M((bve,B$)=>{"use strict";var Nle=x$(),Tve=Gt(),Rve=_t(),wle=Q(),{getSchemaPath:yve,getTransactionAuditStorePath:Ave}=yt(),{getDatabases:Ole}=(De(),v(ht));B$.exports=Cle;async function Cle(e){let t=new Nle;try{let r=Ole()[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){wle.warn(`unable to stat table dbi due to ${r}`)}return t}o(Cle,"lmdbGetTableSize")});var k$=M((Nve,H$)=>{"use strict";var zw=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}};H$.exports=zw});var Ud=M((Dve,V$)=>{"use strict";var Ple=require("fs-extra"),Lle=require("path"),dn=require("systeminformation"),rc=Q(),G$=hr(),Ove=It(),vd=(H(),v(W)),Dle=F$(),Mle=xa(),{getThreadInfo:q$}=st(),qh=oe();qh.initSync();var vle=k$(),{openEnvironment:Cve}=_t(),{getSchemaPath:Pve}=yt(),{database:Lve,databases:jw}=(De(),v(ht)),US;V$.exports={getHDBProcessInfo:Zw,getNetworkInfo:tO,getDiskInfo:eO,getMemoryInfo:Xw,getCPUInfo:Jw,getTimeInfo:Qw,getSystemInformation:rO,systemInformation:Ule,getTableSize:nO,getMetrics:sO};function Qw(){return dn.time()}o(Qw,"getTimeInfo");async function Jw(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:a,governor:c,socket:l,cache:u,...d}=await dn.cpu();d.cpu_speed=await dn.cpuCurrentSpeed();let{rawCurrentload:f,rawCurrentloadIdle:m,rawCurrentloadIrq:h,rawCurrentloadNice:p,rawCurrentloadSystem:_,rawCurrentloadUser:g,cpus:y,...T}=await dn.currentLoad();return T.cpus=[],y.forEach(R=>{let{rawLoad:N,rawLoadIdle:C,rawLoadIrq:k,rawLoadNice:te,rawLoadSystem:G,rawLoadUser:K,...$}=R;T.cpus.push($)}),d.current_load=T,d}catch(e){return rc.error(`error in getCPUInfo: ${e}`),{}}}o(Jw,"getCPUInfo");async function Xw(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await dn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return rc.error(`error in getMemoryInfo: ${e}`),{}}}o(Xw,"getMemoryInfo");async function Zw(){let e={core:[],clustering:[]};try{let t=await dn.processes(),r;try{r=Number.parseInt(await Ple.readFile(Lle.join(qh.get(vd.CONFIG_PARAMS.ROOTPATH),vd.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===vd.NODE_ERROR_CODES.ENOENT)rc.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 rc.error(`error in getHDBProcessInfo: ${t}`),e}}o(Zw,"getHDBProcessInfo");async function eO(){let e={};try{if(!qh.get(vd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await dn.disksIO();e.io=i;let{rxSec:a,txSec:c,wxSec:l,...u}=await dn.fsStats();return e.read_write=u,e.size=await dn.fsSize(),e}catch(t){return rc.error(`error in getDiskInfo: ${t}`),e}}o(eO,"getDiskInfo");async function tO(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return qh.get(vd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await dn.networkInterfaceDefault(),e.latency=await dn.inetChecksite("google.com"),(await dn.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 dn.networkStats()).forEach(n=>{let{rxSec:s,txSec:i,ms:a,...c}=n;e.stats.push(c)})),e}catch(t){return rc.error(`error in getNetworkInfo: ${t}`),e}}o(tO,"getNetworkInfo");async function rO(){if(US!==void 0)return US;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:a,...c}=await dn.osInfo();e=c;let l=await dn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,US=e,US}catch(t){return rc.error(`error in getSystemInformation: ${t}`),e}}o(rO,"getSystemInformation");async function nO(){let e=[],t=await Mle.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await Dle(n));return e}o(nO,"getTableSize");async function sO(){let e={};for(let t in jw){let r=e[t]={},n=r.tables={};for(let s in jw[t])try{let i=jw[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){rc.notify(`Error getting stats for table ${s}: ${i}`)}}return e}o(sO,"getMetrics");async function $$(){if(qh.get(vd.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await G$.getNATSReferences(),t=await G$.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($$,"getNatsStreamInfo");async function Ule(e){let t=new vle;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await rO(),t.time=Qw(),t.cpu=await Jw(),t.memory=await Xw(),t.disk=await eO(),t.network=await tO(),t.harperdb_processes=await Zw(),t.table_size=await nO(),t.metrics=await sO(),t.threads=await q$(),t.replication=await $$(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await rO();break;case"time":t.time=Qw();break;case"cpu":t.cpu=await Jw();break;case"memory":t.memory=await Xw();break;case"disk":t.disk=await eO();break;case"network":t.network=await tO();break;case"harperdb_processes":t.harperdb_processes=await Zw();break;case"table_size":t.table_size=await nO();break;case"database_metrics":case"metrics":t.metrics=await sO();break;case"threads":t.threads=await q$();break;case"replication":t.replication=await $$();break;default:break}return t}o(Ule,"systemInformation")});var Go=M((Bve,z$)=>{"use strict";var xle=vn(),iO=ie(),Ble=require("util"),Pl=(H(),v(W)),K$=oe();K$.initSync();var Fle=ZN(),Y$=on(),{Node:vve,NodeSubscription:Uve}=Md(),Hle=Gu(),kle=M$(),{RemotePayloadObject:Gle,RemotePayloadSubscription:qle}=Gh(),{handleHDBError:$le,hdbErrors:Vle}=ge(),{HTTP_STATUS_CODES:Kle,HDB_ERROR_MSGS:Yle}=Vle,Wle=oi(),zle=Ud(),{packageJson:jle}=Rt(),{getDatabases:Qle}=(De(),v(ht)),xve=Ble.promisify(Fle.authorize),Jle=Y$.searchByHash,Xle=Y$.searchByValue;z$.exports={isEmpty:Zle,getNodeRecord:eue,upsertNodeRecord:tue,buildNodePayloads:rue,checkClusteringEnabled:nue,getAllNodeRecords:sue,getSystemInfo:iue,reverseSubscription:W$};function Zle(e){return e==null}o(Zle,"isEmpty");async function eue(e){let t=new Hle(Pl.SYSTEM_SCHEMA_NAME,Pl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Jle(t)}o(eue,"getNodeRecord");async function tue(e){let t=new kle(Pl.SYSTEM_SCHEMA_NAME,Pl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return xle.upsert(t)}o(tue,"upsertNodeRecord");function W$(e){if(iO.isEmpty(e.subscribe)||iO.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(W$,"reverseSubscription");function rue(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=iO.getTableHashAttribute(l,u),{subscribe:f,publish:m}=W$(c),h=Qle()[l]?.[u],p=new qle(l,u,d,m,f,c.start_time,h.schemaDefined?h.attributes:void 0);s.push(p)}return new Gle(r,t,s,n)}o(rue,"buildNodePayloads");function nue(){if(!K$.get(Pl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw $le(new Error,Yle.CLUSTERING_NOT_ENABLED,Kle.BAD_REQUEST,void 0,void 0,!0)}o(nue,"checkClusteringEnabled");async function sue(){let e=new Wle(Pl.SYSTEM_SCHEMA_NAME,Pl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await Xle(e))}o(sue,"getAllNodeRecords");async function iue(){let e=await zle.getSystemInformation();return{hdb_version:jle.version,node_version:e.node_version,platform:e.platform}}o(iue,"getSystemInfo")});var oO=M((Hve,rV)=>{"use strict";var xS=hr(),j$=ie(),Q$=It(),J$=(H(),v(W)),BS=Q(),X$=Hh(),oue=Hm(),{RemotePayloadObject:aue}=Gh(),{handleHDBError:Z$,hdbErrors:cue}=ge(),{HTTP_STATUS_CODES:eV}=cue,{NodeSubscription:tV}=Md();rV.exports=lue;async function lue(e,t){let r;try{r=await xS.request(`${t}.${Q$.REQUEST_SUFFIX}`,new aue(J$.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),BS.trace("Response from remote describe all request:",r)}catch(a){BS.error(`addNode received error from describe all request to remote node: ${a}`);let c=xS.requestErrorHandler(a,"add_node",t);throw Z$(new Error,c,eV.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===Q$.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let a=`Error returned from remote node ${t}: ${r.message}`;throw Z$(new Error,a,eV.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===J$.SYSTEM_SCHEMA_NAME){await xS.createLocalTableStream(l,c);let p=new tV(l,c,a.publish,a.subscribe);p.start_time=a.start_time,i.push(p);continue}let u=j$.doesSchemaExist(l),d=n[l]!==void 0,f=c?j$.doesTableExist(l,c):!0,m=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!f&&!m){s.push(a);continue}if(!u&&d&&(BS.trace(`addNode creating schema: ${l}`),await X$.createSchema({operation:"create_schema",schema:l})),!f&&m){BS.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let p=new oue(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(p.attributes=n[l][c].attributes),await X$.createTable(p)}await xS.createLocalTableStream(l,c);let h=new tV(l,c,a.publish,a.subscribe);h.start_time=a.start_time,i.push(h)}return{added:i,skipped:s}}o(lue,"reviewSubscriptions")});var xd={};Oe(xd,{addNodeBack:()=>aO,removeNodeBack:()=>cO,setNode:()=>mue});async function mue(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=mi(t)):t=NS(r);let n=(0,sV.validateBySchema)(e,fue);if(n)throw(0,qo.handleHDBError)(n,n.message,due.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new qo.ClientError("url or hostname is required for remove_node operation");let h=r,p=Vt(),_=await p.get(h);if(!_)throw new qo.ClientError(h+" does not exist");try{await Bh({url:_.url},{operation:q.REMOVE_NODE_BACK,name:_?.subscriptions?.length>0?Xe():h},void 0)}catch(g){as.warn(`Error removing node from target node ${h}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,g)}return await p.delete(h),`Successfully removed '${h}' from cluster`}if(!t)throw new qo.ClientError("url required for this operation");let s=Wa();if(s==null)throw new qo.ClientError("replication url is missing from harperdb-config.yaml");let i,a,c;if(t?.startsWith("wss:")){i=await(0,Ms.getReplicationCert)();let h=await(0,Ms.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(a=await(0,Ms.createCsr)(),as.info("Sending CSR to target node:",t)):h&&(c=h.certificate,as.info("Sending CA named",h.name,"to target node",t))}let l={operation:q.ADD_NODE_BACK,hostname:(0,sc.get)(U.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:a,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,sc.get)(U.REPLICATION_SHARD)!==void 0&&(l.shard=(0,sc.get)(U.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(nV):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let h=nV(e);l.subscribe=h.subscribe,l.publish=h.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 Bh({url:t},l,e)}catch(h){h.message=`Error returned from ${t}: `+h.message,as.warn("Error adding node:",t,"to cluster:",h),d=h}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&&(as.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ms.setCertTable)({name:uue.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ms.setCertTable)({name:Xe(),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 h={url:s,ca:c,replicates:!0,subscriptions:null};(0,sc.get)(U.REPLICATION_SHARD)!==void 0&&(h.shard=(0,sc.get)(U.REPLICATION_SHARD)),e.retain_authorization&&(h.authorization=e.authorization),e.start_time&&(h.start_time=e.start_time),await Uo(Xe(),h)}await Uo(u?u.nodeName:f.name??mi(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 aO(e){as.trace("addNodeBack received request:",e);let t=await(0,Ms.signCertificate)(e),r;e.csr?(r=t.signingCA,as.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,as.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,Ms.getReplicationCertAuth)();if(n.replicates){let i={url:Wa(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,sc.get)(U.REPLICATION_SHARD)!==void 0&&(i.shard=(0,sc.get)(U.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Uo(Xe(),i)}return await Uo(e.hostname,n),t.nodeName=Xe(),t.usingCA=s?.certificate,as.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function cO(e){as.trace("removeNodeBack received request:",e),await Vt().delete(e.name)}function nV(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ms,sV,nc,sc,as,qo,uue,due,fue,Bd=ue(()=>{Ms=w(os()),sV=w(dt()),nc=w(require("joi")),sc=w(oe());H();Dh();yl();ss();as=w(Q()),qo=w(ge()),{pki:uue}=require("node-forge"),{HTTP_STATUS_CODES:due}=qo.hdbErrors,fue=nc.default.object({hostname:nc.default.string(),verify_tls:nc.default.boolean(),replicates:nc.default.boolean(),subscriptions:nc.default.array(),revoked_certificates:nc.default.array(),shard:nc.default.number()});o(mue,"setNode");o(aO,"addNodeBack");o(cO,"removeNodeBack");o(nV,"reverseSubscription")});var qS=M((zve,oV)=>{"use strict";var{handleHDBError:FS,hdbErrors:hue}=ge(),{HTTP_STATUS_CODES:HS}=hue,{addUpdateNodeValidator:pue}=vS(),kS=Q(),GS=(H(),v(W)),iV=It(),Eue=ie(),$h=hr(),Vh=Go(),lO=oe(),_ue=oO(),{Node:gue,NodeSubscription:Sue}=Md(),{broadcast:Tue}=st(),{setNode:Rue}=(Bd(),v(xd)),Yve=oe(),Wve=(H(),v(W)),yue="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Aue="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",bue=lO.get(GS.CONFIG_PARAMS.CLUSTERING_NODENAME);oV.exports=Iue;async function Iue(e,t=!1){if(kS.trace("addNode called with:",e),lO.get(GS.CONFIG_PARAMS.REPLICATION_URL)||lO.get(GS.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Rue(e);Vh.checkClusteringEnabled();let r=pue(e);if(r)throw FS(r,r.message,HS.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let f=await Vh.getNodeRecord(n);if(!Eue.isEmptyOrZeroLength(f))throw FS(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,HS.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await _ue(e.subscriptions,n),a={message:void 0,added:s,skipped:i};if(s.length===0)return a.message=yue,a;let c=Vh.buildNodePayloads(s,bue,GS.OPERATIONS_ENUM.ADD_NODE,await Vh.getSystemInfo()),l=[];for(let f=0,m=s.length;f<m;f++){let h=s[f];s[f].start_time===void 0&&delete s[f].start_time,l.push(new Sue(h.schema,h.table,h.publish,h.subscribe))}kS.trace("addNode sending remote payload:",c);let u;try{u=await $h.request(`${n}.${iV.REQUEST_SUFFIX}`,c)}catch(f){kS.error(`addNode received error from request: ${f}`);for(let h=0,p=s.length;h<p;h++){let _=s[h];_.publish=!1,_.subscribe=!1,await $h.updateRemoteConsumer(_,n)}let m=$h.requestErrorHandler(f,"add_node",n);throw FS(new Error,m,HS.INTERNAL_SERVER_ERROR,"error",m)}if(u.status===iV.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${n}: ${u.message}`;throw FS(new Error,f,HS.INTERNAL_SERVER_ERROR,"error",f)}kS.trace(u);for(let f=0,m=s.length;f<m;f++){let h=s[f];await $h.updateRemoteConsumer(h,n),h.subscribe===!0&&await $h.updateConsumerIterator(h.schema,h.table,n,"start")}let d=new gue(n,l,u.system_info);return await Vh.upsertNodeRecord(d),Tue({type:"nats_update"}),i.length>0?a.message=Aue:a.message=`Successfully added '${n}' to manifest`,a}o(Iue,"addNode")});var mO=M((Jve,cV)=>{"use strict";var{handleHDBError:uO,hdbErrors:Nue}=ge(),{HTTP_STATUS_CODES:dO}=Nue,{addUpdateNodeValidator:wue}=vS(),Kh=Q(),$S=(H(),v(W)),aV=It(),Qve=ie(),Yh=hr(),Wh=Go(),fO=oe(),{cloneDeep:Oue}=require("lodash"),Cue=oO(),{Node:Pue,NodeSubscription:Lue}=Md(),{broadcast:Due}=st(),{setNode:Mue}=(Bd(),v(xd)),vue="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",Uue="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",xue=fO.get($S.CONFIG_PARAMS.CLUSTERING_NODENAME);cV.exports=Bue;async function Bue(e){if(Kh.trace("updateNode called with:",e),fO.get($S.CONFIG_PARAMS.REPLICATION_URL)??fO.get($S.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Mue(e);Wh.checkClusteringEnabled();let t=wue(e);if(t)throw uO(t,t.message,dO.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await Wh.getNodeRecord(r);s.length>0&&(n=Oue(s));let{added:i,skipped:a}=await Cue(e.subscriptions,r),c={message:void 0,updated:i,skipped:a};if(i.length===0)return c.message=vue,c;let l=Wh.buildNodePayloads(i,xue,$S.OPERATIONS_ENUM.UPDATE_NODE,await Wh.getSystemInfo());for(let d=0,f=i.length;d<f;d++){let m=i[d];Kh.trace(`updateNode updating work stream for node: ${r} subscription:`,m),i[d].start_time===void 0&&delete i[d].start_time}Kh.trace("updateNode sending remote payload:",l);let u;try{u=await Yh.request(`${r}.${aV.REQUEST_SUFFIX}`,l)}catch(d){Kh.error(`updateNode received error from request: ${d}`);let f=Yh.requestErrorHandler(d,"update_node",r);throw uO(new Error,f,dO.INTERNAL_SERVER_ERROR,"error",f)}if(u.status===aV.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw uO(new Error,d,dO.INTERNAL_SERVER_ERROR,"error",d)}Kh.trace(u);for(let d=0,f=i.length;d<f;d++){let m=i[d];await Yh.updateRemoteConsumer(m,r),m.subscribe===!0?await Yh.updateConsumerIterator(m.schema,m.table,r,"start"):await Yh.updateConsumerIterator(m.schema,m.table,r,"stop")}return n||(n=[new Pue(r,[],u.system_info)]),await Fue(n[0],i,u.system_info),a.length>0?c.message=Uue:c.message=`Successfully updated '${r}'`,c}o(Bue,"updateNode");async function Fue(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 Lue(a.schema,a.table,a.publish,a.subscribe))}n.system_info=r,await Wh.upsertNodeRecord(n),Due({type:"nats_update"})}o(Fue,"updateNodeTable")});var mV=M((Zve,fV)=>{"use strict";var dV=require("joi"),{string:lV}=dV.types(),Hue=dt(),uV=(H(),v(W)),kue=oe(),Gue=It();fV.exports=que;function que(e){let t=lV.invalid(kue.get(uV.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(Gue.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=dV.object({operation:lV.valid(uV.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return Hue.validateBySchema(e,r)}o(que,"removeNodeValidator")});var VS=M((tUe,gV)=>{"use strict";var{handleHDBError:hV,hdbErrors:$ue}=ge(),{HTTP_STATUS_CODES:pV}=$ue,Vue=mV(),zh=Q(),EV=Go(),Kue=ie(),Fd=(H(),v(W)),_V=It(),hO=hr(),pO=oe(),{RemotePayloadObject:Yue}=Gh(),{NodeSubscription:Wue}=Md(),zue=Fm(),jue=dl(),{broadcast:Que}=st(),{setNode:Jue}=(Bd(),v(xd)),Xue=pO.get(Fd.CONFIG_PARAMS.CLUSTERING_NODENAME);gV.exports=Zue;async function Zue(e){if(zh.trace("removeNode called with:",e),pO.get(Fd.CONFIG_PARAMS.REPLICATION_URL)??pO.get(Fd.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Jue(e);EV.checkClusteringEnabled();let t=Vue(e);if(t)throw hV(t,t.message,pV.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await EV.getNodeRecord(r);if(Kue.isEmptyOrZeroLength(n))throw hV(new Error,`Node '${r}' was not found.`,pV.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new Yue(Fd.OPERATIONS_ENUM.REMOVE_NODE,Xue,[]),i,a=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await hO.updateConsumerIterator(d.schema,d.table,r,"stop");try{await hO.updateRemoteConsumer(new Wue(d.schema,d.table,!1,!1),r)}catch(f){zh.error(f)}}try{i=await hO.request(`${r}.${_V.REQUEST_SUFFIX}`,s),zh.trace("Remove node reply from remote node:",r,i)}catch(l){zh.error("removeNode received error from request:",l),a=!0}let c=new zue(Fd.SYSTEM_SCHEMA_NAME,Fd.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await jue.deleteRecord(c),Que({type:"nats_update"}),i?.status===_V.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||a?(zh.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(Zue,"removeNode")});var RV=M((nUe,TV)=>{"use strict";var SV=require("joi"),{string:ede,array:tde}=SV.types(),rde=dt(),nde=vS();TV.exports=sde;function sde(e){let t=SV.object({operation:ede.valid("configure_cluster").required(),connections:tde.items(nde.validationSchema).required()});return rde.validateBySchema(e,t)}o(sde,"configureClusterValidator")});var EO=M((iUe,NV)=>{"use strict";var yV=(H(),v(W)),KS=Q(),ide=ie(),ode=oe(),ade=VS(),cde=qS(),lde=Go(),ude=RV(),{handleHDBError:AV,hdbErrors:dde}=ge(),{HTTP_STATUS_CODES:bV}=dde,fde="Configure cluster complete.",mde="Failed to configure the cluster. Check the logs for more details.",hde="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";NV.exports=pde;async function pde(e){KS.trace("configure cluster called with:",e);let t=ude(e);if(t)throw AV(t,t.message,bV.BAD_REQUEST,void 0,void 0,!0);let r=await lde.getAllNodeRecords(),n=[];if(ode.get(yV.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,f=r.length;d<f;d++){let m=await IV(ade,{operation:yV.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(m)}KS.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 IV(cde,f,f.node_name);s.push(m)}KS.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"&&(KS.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(ide.isEmptyOrZeroLength(a))return{message:fde,connections:c};if(l)return{message:hde,failed_nodes:a,connections:c};throw AV(new Error,mde,bV.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}o(pde,"configureCluster");async function IV(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}o(IV,"functionWrapper")});var PV=M((aUe,CV)=>{"use strict";var jh=require("joi"),Ede=dt(),{validateSchemaExists:wV,validateTableExists:_de,validateSchemaName:OV}=Hi(),gde=jh.object({operation:jh.string().valid("purge_stream"),schema:jh.string().custom(wV).custom(OV).optional(),database:jh.string().custom(wV).custom(OV).optional(),table:jh.string().custom(_de).required()});function Sde(e){return Ede.validateBySchema(e,gde)}o(Sde,"purgeStreamValidator");CV.exports=Sde});var _O=M((lUe,LV)=>{"use strict";var{handleHDBError:Tde,hdbErrors:Rde}=ge(),{HTTP_STATUS_CODES:yde}=Rde,Ade=PV(),bde=hr(),Ide=Go();LV.exports=Nde;async function Nde(e){e.schema=e.schema??e.database;let t=Ade(e);if(t)throw Tde(t,t.message,yde.BAD_REQUEST,void 0,void 0,!0);Ide.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await bde.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}o(Nde,"purgeStream")});var TO=M((dUe,FV)=>{"use strict";var SO=Go(),wde=hr(),WS=oe(),Hd=(H(),v(W)),Ll=It(),Ode=ie(),gO=Q(),{RemotePayloadObject:Cde}=Gh(),{ErrorCode:DV}=require("nats"),{parentPort:MV}=require("worker_threads"),{onMessageByType:Pde}=st(),{getThisNodeName:Lde}=(ss(),v(Bo)),{requestClusterStatus:Dde}=(Dh(),v(rq)),{getReplicationSharedStatus:Mde,getHDBNodeTable:vde}=(yl(),v(ow)),{CONFIRMATION_STATUS_POSITION:Ude,RECEIVED_VERSION_POSITION:xde,RECEIVED_TIME_POSITION:Bde,SENDING_TIME_POSITION:Fde,RECEIVING_STATUS_POSITION:Hde,RECEIVING_STATUS_RECEIVING:kde}=(Lw(),v(Yq)),vV=WS.get(Hd.CONFIG_PARAMS.CLUSTERING_ENABLED),UV=WS.get(Hd.CONFIG_PARAMS.CLUSTERING_NODENAME);FV.exports={clusterStatus:Gde,buildNodeStatus:BV};var xV;Pde("cluster-status",async e=>{xV(e)});async function Gde(){if(WS.get(Hd.CONFIG_PARAMS.REPLICATION_URL)||WS.get(Hd.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(MV){MV.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{xV=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=Mde(u,l,a);c.lastCommitConfirmed=YS(d[Ude]),c.lastReceivedRemoteTime=YS(d[xde]),c.lastReceivedLocalTime=YS(d[Bde]),c.sendingMessage=YS(d[Fde]),c.lastReceivedStatus=d[Hde]===kde?"Receiving":"Waiting"}}}else n=Dde();n.node_name=Lde();let s=vde().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:UV,is_enabled:vV,connections:[]};if(!vV)return e;let t=await SO.getAllNodeRecords();if(Ode.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(BV(t[n],e.connections));return await Promise.allSettled(r),e}o(Gde,"clusterStatus");function YS(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}o(YS,"asDate");async function BV(e,t){let r=e.name,n=new Cde(Hd.OPERATIONS_ENUM.CLUSTER_STATUS,UV,void 0,await SO.getSystemInfo()),s,i,a=Ll.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await wde.request(Ll.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Ll.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(a=Ll.CLUSTER_STATUS_STATUSES.CLOSED,gO.error(`Error getting node status from ${r} `,s))}catch(l){gO.warn(`Error getting node status from ${r}`,l),l.code===DV.NoResponders?a=Ll.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===DV.Timeout?a=Ll.CLUSTER_STATUS_STATUSES.TIMEOUT:a=Ll.CLUSTER_STATUS_STATUSES.CLOSED}let c=new qde(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!==Hd.PRE_4_0_0_VERSION&&await SO.upsertNodeRecord(l)}catch(l){gO.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}o(BV,"buildNodeStatus");function qde(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(qde,"NodeStatusObject")});var yO=M((mUe,HV)=>{"use strict";var{handleHDBError:$de,hdbErrors:Vde}=ge(),{HTTP_STATUS_CODES:Kde}=Vde,Yde=hr(),Wde=Go(),RO=ie(),zS=require("joi"),zde=dt(),jde=2e3,Qde=zS.object({timeout:zS.number().min(1),connected_nodes:zS.boolean(),routes:zS.boolean()});HV.exports=Jde;async function Jde(e){Wde.checkClusteringEnabled();let t=zde.validateBySchema(e,Qde);if(t)throw $de(t,t.message,Kde.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||RO.autoCastBoolean(n),a=s===void 0||RO.autoCastBoolean(s),c={nodes:[]},l=await Yde.getServerList(r??jde),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,h=l[d].data;if(m.name.endsWith("-hub")){let p={name:m.name.slice(0,-4),response_time:l[d].response_time};i&&(p.connected_nodes=[],u[m.name]&&u[m.name].forEach(_=>{p.connected_nodes.includes(_.name.slice(0,-4))||p.connected_nodes.push(_.name.slice(0,-4))})),a&&(p.routes=h.cluster?.urls?h.cluster?.urls.map(_=>({host:_.split(":")[0],port:RO.autoCast(_.split(":")[1])})):[]),c.nodes.push(p)}}return c}o(Jde,"clusterNetwork")});var $V=M((pUe,qV)=>{"use strict";var AO=require("joi"),kV=dt(),{routeConstraints:GV}=GI();qV.exports={setRoutesValidator:Xde,deleteRoutesValidator:Zde};function Xde(e){let t=AO.object({server:AO.valid("hub","leaf"),routes:GV.required()});return kV.validateBySchema(e,t)}o(Xde,"setRoutesValidator");function Zde(e){let t=AO.object({routes:GV.required()});return kV.validateBySchema(e,t)}o(Zde,"deleteRoutesValidator")});var jS=M((_Ue,QV)=>{"use strict";var $o=bt(),bO=ie(),vs=(H(),v(W)),kd=oe(),VV=$V(),{handleHDBError:KV,hdbErrors:efe}=ge(),{HTTP_STATUS_CODES:YV}=efe,WV="cluster routes successfully set",zV="cluster routes successfully deleted";QV.exports={setRoutes:rfe,getRoutes:nfe,deleteRoutes:sfe};function tfe(e){let t=$o.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=bO.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"?$o.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):$o.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:WV,set:i,skipped:s}}o(tfe,"setRoutesNats");function rfe(e){let t=VV.setRoutesValidator(e);if(t)throw KV(t,t.message,YV.BAD_REQUEST,void 0,void 0,!0);if(kd.get(vs.CONFIG_PARAMS.CLUSTERING_ENABLED))return tfe(e);let r=[],n=[],s=kd.get(vs.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{jV(s,i)?n.push(i):(s.push(i),r.push(i))}),$o.updateConfigValue(vs.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:WV,set:r,skipped:n}}o(rfe,"setRoutes");function jV(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(jV,"existsInArray");function nfe(){if(kd.get(vs.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=$o.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return kd.get(vs.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}o(nfe,"getRoutes");function sfe(e){let t=VV.deleteRoutesValidator(e);if(t)throw KV(t,t.message,YV.BAD_REQUEST,void 0,void 0,!0);if(kd.get(vs.CONFIG_PARAMS.CLUSTERING_ENABLED))return ife(e);let r=[],n=[],s=kd.get(vs.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(a=>{jV(e.routes,a)?r.push(a):(i.push(a),n.push(a))}),$o.updateConfigValue(vs.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:zV,deleted:r,skipped:n}}o(sfe,"deleteRoutes");function ife(e){let t=$o.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,h=r.length;m<h;m++){let p=r[m];if(d.host===p.host&&d.port===p.port){r.splice(m,1),f=!0,a=!0,s.push(d);break}}if(!f){let m=!0;for(let h=0,p=n.length;h<p;h++){let _=n[h];if(d.host===_.host&&d.port===_.port){n.splice(h,1),c=!0,m=!1,s.push(d);break}}m&&i.push(d)}}return a&&(r=bO.isEmptyOrZeroLength(r)?null:r,$o.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=bO.isEmptyOrZeroLength(n)?null:n,$o.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:zV,deleted:s,skipped:i}}o(ife,"deleteRoutesNats")});var XV=M((SUe,JV)=>{"use strict";var Qh=require("alasql"),Dl=require("recursive-iterator"),Ei=Q(),ofe=ie(),Jh=(H(),v(W)),IO=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,cfe(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=>Jh.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=>!Jh.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][Jh.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[a].attribute_permissions.length>0?c=afe(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=>!Jh.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new Qh.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 afe(e){return e.filter(t=>t[Jh.PERMS_CRUD_ENUM.READ])}o(afe,"filterReadRestrictedAttrs");function cfe(e,t,r,n,s){lfe(e,t,r,n,s)}o(cfe,"interpretAST");function Xh(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(Xh,"addSchemaTableToMap");function lfe(e,t,r,n,s){if(!e){Ei.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof Qh.yy.Insert?mfe(e,t,r):e instanceof Qh.yy.Select?ufe(e,t,r,n,s):e instanceof Qh.yy.Update?dfe(e,t,r):e instanceof Qh.yy.Delete?ffe(e,t,r):Ei.error("AST in getRecordAttributesAST() is not a valid SQL type.")}o(lfe,"getRecordAttributesAST");function ufe(e,t,r,n,s){if(!e){Ei.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(ofe.isEmptyOrZeroLength(i)){Ei.error("No schema specified");return}e.from.forEach(c=>{Xh(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),Xh(c.table,t,r,n,s)});let a=new Dl(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{Ei.info(`table specified as ${l} not found.`);return}t.get(u).get(l).indexOf(c.columnid)<0&&t.get(u).get(l).push(c.columnid)}if(e.where){let c=new Dl(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{Ei.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 Dl(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{Ei.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 Dl(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{Ei.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(ufe,"getSelectAttributes");function dfe(e,t,r){if(!e){Ei.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new Dl(e.columns),s=e.table.databaseid;Xh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&NO(e.table.tableid,s,i.columnid,t,r)}o(dfe,"getUpdateAttributes");function ffe(e,t,r){if(!e){Ei.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new Dl(e.where),s=e.table.databaseid;Xh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&NO(e.table.tableid,s,i.columnid,t,r)}o(ffe,"getDeleteAttributes");function mfe(e,t,r){if(!e){Ei.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new Dl(e.columns),s=e.into.databaseid;Xh(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&NO(e.into.tableid,s,i.columnid,t,r)}o(mfe,"getInsertAttributes");function NO(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(NO,"pushAttribute");JV.exports=IO});var e1=M((RUe,ZV)=>{"use strict";var QS=(H(),v(W)),JS=class{static{o(this,"BaseLicense")}constructor(t=0,r=QS.RAM_ALLOCATION_ENUM.DEFAULT,n=QS.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},wO=class extends JS{static{o(this,"ExtendedLicense")}constructor(t=0,r=QS.RAM_ALLOCATION_ENUM.DEFAULT,n=QS.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};ZV.exports={BaseLicense:JS,ExtendedLicense:wO}});var $d=M((AUe,o1)=>{"use strict";var qd=require("fs-extra"),XS=(mg(),v(fg)),r1=require("crypto"),hfe=require("moment"),pfe=require("uuid").v4,fn=Q(),CO=require("path"),Efe=ie(),Ml=(H(),v(W)),{totalmem:t1}=require("os"),_fe=e1().ExtendedLicense,Gd="invalid license key format",gfe="061183",Sfe="mofi25",Tfe="aes-256-cbc",Rfe=16,yfe=32,n1=oe(),{resolvePath:s1}=bt();n1.initSync();var OO;o1.exports={validateLicense:i1,generateFingerPrint:bfe,licenseSearch:DO,getLicense:wfe,checkMemoryLimit:Ofe};function PO(){return CO.join(n1.getHdbBasePath(),Ml.LICENSE_KEY_DIR_NAME,Ml.LICENSE_FILE_NAME)}o(PO,"getLicenseDirPath");function Afe(){let e=PO();return s1(CO.join(e,Ml.LICENSE_FILE_NAME))}o(Afe,"getLicenseFilePath");function LO(){let e=PO();return s1(CO.join(e,Ml.REG_KEY_FILE_NAME))}o(LO,"getFingerPrintFilePath");async function bfe(){let e=LO();try{return await qd.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Ife();throw fn.error(`Error writing fingerprint file to ${e}`),fn.error(t),new Error("There was an error generating the fingerprint")}}o(bfe,"generateFingerPrint");async function Ife(){let e=pfe(),t=XS.hash(e,XS.HASH_FUNCTION.MD5),r=LO();try{await qd.mkdirp(PO()),await qd.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw fn.error(`Error writing fingerprint file to ${r}`),fn.error(n),new Error("There was an error generating the fingerprint")}return t}o(Ife,"writeFingerprint");function i1(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:Ml.RAM_ALLOCATION_ENUM.DEFAULT,version:Ml.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return fn.error("empty license key passed to validate."),r;let n=LO(),s=!1;try{s=qd.statSync(n)}catch(i){fn.error(i)}if(s){let i;try{i=qd.readFileSync(n,"utf8")}catch{fn.error("error validating this machine in the license"),r.valid_machine=!1;return}let a=e.split(Sfe),c=a[1];c=Buffer.concat([Buffer.from(c)],Rfe);let l=Buffer.concat([Buffer.from(i)],yfe),u=r1.createDecipheriv(Tfe,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let d=null;try{d=u.update(a[0],"hex","utf8"),d.trim(),d+=u.final("utf8")}catch{let h=Nfe(a[0],i);if(h)d=h;else throw r.valid_license=!1,r.valid_machine=!1,console.error(Gd),fn.error(Gd),new Error(Gd)}let f;if(isNaN(d))try{f=JSON.parse(d),r.version=f.version,r.exp_date=f.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),f.ram_allocation&&(r.ram_allocation=f.ram_allocation)}catch{throw console.error(Gd),fn.error(Gd),new Error(Gd)}else r.exp_date=d;r.exp_date<hfe().valueOf()&&(r.valid_date=!1),XS.validate(a[1],`${gfe}${i}${t}`,XS.HASH_FUNCTION.MD5)||(r.valid_license=!1)}else r.valid_license=!1,r.valid_machine=!1;return r.valid_license&&r.valid_machine&&r.valid_date||fn.error("Invalid licence"),r}o(i1,"validateLicense");function Nfe(e,t){try{let r=r1.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{fn.warn("Check old license failed")}}o(Nfe,"checkOldLicense");function DO(){let e=new _fe,t=[];try{t=qd.readFileSync(Afe(),"utf-8").split(`\r
|
|
17
17
|
`)}catch(r){r.code==="ENOENT"?fn.debug("no license file found"):fn.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(Efe.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=i1(s.license_key,s.company);i.valid_machine===!0&&i.valid_date===!0&&i.valid_machine===!0&&(e.exp_date=i.exp_date>e.exp_date?i.exp_date:e.exp_date,e.ram_allocation=i.ram_allocation,e.enterprise=!0)}catch(s){fn.error("There was an error parsing the license string."),fn.error(s),e.ram_allocation=Ml.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return OO=e,e}o(DO,"licenseSearch");async function wfe(){return OO||await DO(),OO}o(wfe,"getLicense");function Ofe(){let e=DO().ram_allocation,t=process.constrainedMemory?.()||t1();if(t=Math.round(Math.min(t,t1())/2**20),t>e)return`This server has more memory (${t}MB) than HarperDB is licensed for (${e}MB), this should only be used for educational and development purposes.`}o(Ofe,"checkMemoryLimit")});var UO=M((IUe,u1)=>{var ZS=$d(),a1=require("chalk"),cs=Q(),c1=require("prompt"),{promisify:Cfe}=require("util"),MO=(H(),v(W)),Pfe=require("fs-extra"),Lfe=require("path"),Dfe=ie(),{packageJson:Mfe}=Rt(),l1=oe();l1.initSync();var vfe=require("moment"),Ufe=Cfe(c1.get),xfe=Lfe.join(l1.getHdbBasePath(),MO.LICENSE_KEY_DIR_NAME,MO.LICENSE_FILE_NAME,MO.LICENSE_FILE_NAME);u1.exports={getFingerprint:Ffe,setLicense:Bfe,parseLicense:vO,register:Hfe,getRegistrationInfo:Gfe};async function Bfe(e){if(e&&e.key&&e.company){try{cs.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await vO(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw cs.error(r),cs.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}o(Bfe,"setLicense");async function Ffe(){let e={};try{e=await ZS.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw cs.error(r),cs.error(t),new Error(r)}return e}o(Ffe,"getFingerprint");async function vO(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");cs.info("Validating license input...");let r=ZS.validateLicense(e,t);if(cs.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(cs.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(cs.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{cs.info("writing license to disk"),await Pfe.writeFile(xfe,JSON.stringify({license_key:e,company:t}))}catch(n){throw cs.error("Failed to write License"),n}return"Registration successful."}o(vO,"parseLicense");async function Hfe(){let e=await kfe();return vO(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}o(Hfe,"register");async function kfe(){let e=await ZS.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:a1.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:a1.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{c1.start()}catch(n){cs.error(n)}let r;try{r=await Ufe(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}o(kfe,"promptForRegistration");async function Gfe(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await ZS.getLicense()}catch(r){throw cs.error(`There was an error when searching licenses due to: ${r.message}`),r}if(Dfe.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=Mfe.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=vfe.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}o(Gfe,"getRegistrationInfo")});var f1=M((wUe,d1)=>{"use strict";var qfe=It(),xO=class{static{o(this,"HubConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f,m,h,p){this.port=t,a===null&&(a=void 0),this.server_name=r+qfe.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:h},HDB:{users:p}},this.system_account="SYS"}};d1.exports=xO});var p1=M((CUe,h1)=>{"use strict";var m1=It(),BO=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+m1.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+m1.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"}};h1.exports=BO});var _1=M((LUe,E1)=>{"use strict";var FO=class{static{o(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};E1.exports=FO});var S1=M((MUe,g1)=>{"use strict";var $fe=It(),HO=class{static{o(this,"SysUserObject")}constructor(t,r){this.user=t+$fe.SERVER_SUFFIX.ADMIN,this.password=r}};g1.exports=HO});var nT=M((UUe,y1)=>{"use strict";var vl=require("path"),Ul=require("fs-extra"),Vfe=f1(),Kfe=p1(),Yfe=_1(),Wfe=S1(),kO=ts(),Kd=ie(),Bn=bt(),tT=(H(),v(W)),Zh=It(),{CONFIG_PARAMS:tr}=tT,Yd=Q(),ep=oe(),T1=$i(),GO=hr(),zfe=os(),Vd="clustering",jfe=1e4,R1=50;y1.exports={generateNatsConfig:Jfe,removeNatsConfig:Xfe,getHubConfigPath:Qfe};function Qfe(){let e=ep.get(tr.ROOTPATH);return vl.join(e,Vd,Zh.NATS_CONFIG_FILES.HUB_SERVER)}o(Qfe,"getHubConfigPath");async function Jfe(e=!1,t=void 0){console.error("Warning: NATS replication is deprecated and will be removed in version 5.0 of Harper");let r=ep.get(tr.ROOTPATH);Ul.ensureDirSync(vl.join(r,"clustering","leaf")),ep.initSync();let n=Bn.getConfigFromFile(tr.CLUSTERING_TLS_CERT_AUTH),s=Bn.getConfigFromFile(tr.CLUSTERING_TLS_PRIVATEKEY),i=Bn.getConfigFromFile(tr.CLUSTERING_TLS_CERTIFICATE);!await Ul.exists(i)&&!await Ul.exists(!n)&&await zfe.createNatsCerts();let a=vl.join(r,Vd,Zh.PID_FILES.HUB),c=vl.join(r,Vd,Zh.PID_FILES.LEAF),l=Bn.getConfigFromFile(tr.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=vl.join(r,Vd,Zh.NATS_CONFIG_FILES.HUB_SERVER),d=vl.join(r,Vd,Zh.NATS_CONFIG_FILES.LEAF_SERVER),f=Bn.getConfigFromFile(tr.CLUSTERING_TLS_INSECURE),m=Bn.getConfigFromFile(tr.CLUSTERING_TLS_VERIFY),h=Bn.getConfigFromFile(tr.CLUSTERING_NODENAME),p=Bn.getConfigFromFile(tr.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await GO.checkNATSServerInstalled()||rT("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let _=await kO.listUsers(),g=Bn.getConfigFromFile(tr.CLUSTERING_USER),y=await kO.getClusterUser();(Kd.isEmpty(y)||y.active!==!0)&&rT(`Invalid cluster user '${cluster_username}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await eT(tr.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await eT(tr.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await eT(tr.CLUSTERING_HUBSERVER_NETWORK_PORT),await eT(tr.CLUSTERING_LEAFSERVER_NETWORK_PORT));let T=[],R=[];for(let[$,Y]of _.entries())Y.role?.role===tT.ROLE_TYPES_ENUM.CLUSTER_USER&&Y.active&&(T.push(new Wfe(Y.username,T1.decrypt(Y.hash))),R.push(new Yfe(Y.username,T1.decrypt(Y.hash))));let N=[],{hub_routes:C}=Bn.getClusteringRoutes();if(!Kd.isEmptyOrZeroLength(C))for(let $ of C)N.push(`tls://${y.sys_name_encoded}:${y.uri_encoded_d_hash}@${$.host}:${$.port}`);let k=new Vfe(Bn.getConfigFromFile(tr.CLUSTERING_HUBSERVER_NETWORK_PORT),h,a,i,s,n,f,m,p,Bn.getConfigFromFile(tr.CLUSTERING_HUBSERVER_CLUSTER_NAME),Bn.getConfigFromFile(tr.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,T,R);n==null&&(delete k.tls.ca_file,delete k.leafnodes.tls.ca_file),t=Kd.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===tT.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Ul.writeJson(u,k),Yd.trace(`Hub server config written to ${u}`));let te=`tls://${y.sys_name_encoded}:${y.uri_encoded_d_hash}@0.0.0.0:${p}`,G=`tls://${y.uri_encoded_name}:${y.uri_encoded_d_hash}@0.0.0.0:${p}`,K=new Kfe(Bn.getConfigFromFile(tr.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[te],[G],T,R,i,s,n,f);n==null&&delete K.tls.ca_file,(t===void 0||t===tT.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Ul.writeJson(d,K),Yd.trace(`Leaf server config written to ${d}`))}o(Jfe,"generateNatsConfig");async function eT(e){let t=ep.get(e);return Kd.isEmpty(t)&&rT(`port undefined for '${e}'`),await Kd.isPortTaken(t)&&rT(`'${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(eT,"isPortAvailable");function rT(e){let t=`Error generating clustering config: ${e}`;Yd.error(t),console.error(t),process.exit(1)}o(rT,"generateNatsConfigError");async function Xfe(e){let{port:t,config_file:r}=GO.getServerConfig(e),{username:n,decrypt_hash:s}=await kO.getClusterUser(),i=0,a=2e3;for(;i<R1;){try{let d=await GO.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){Yd.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=R1)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&&Yd.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await Kd.asyncSetTimeout(u)}let c="0".repeat(jfe),l=vl.join(ep.get(tr.ROOTPATH),Vd,r);await Ul.writeFile(l,c),await Ul.remove(l),Yd.notify(e,"started.")}o(Xfe,"removeNatsConfig")});var O1=M((BUe,w1)=>{"use strict";var ls=oe(),Zfe=$d(),Ve=(H(),v(W)),tp=It(),Vo=require("path"),{PACKAGE_ROOT:iT}=Rt(),A1=oe(),sT=ie(),Wd="/dev/null",eme=Vo.join(iT,"launchServiceScripts"),b1=Vo.join(iT,"utility/scripts"),tme=Vo.join(b1,Ve.HDB_RESTART_SCRIPT),I1=Vo.resolve(iT,"dependencies",`${process.platform}-${process.arch}`,tp.NATS_BINARY_NAME);function N1(){let t=Zfe.licenseSearch().ram_allocation||Ve.RAM_ALLOCATION_ENUM.DEFAULT,r=Ve.MEM_SETTING_KEY+t,n={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return sT.noBootFile()&&(n[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=sT.getEnvCliRootPath()),{name:Ve.PROCESS_DESCRIPTORS.HDB,script:Ve.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:iT}}o(N1,"generateMainServerConfig");var rme=9930;function nme(){ls.initSync(!0);let e=ls.get(Ve.CONFIG_PARAMS.ROOTPATH),t=Vo.join(e,"clustering",tp.NATS_CONFIG_FILES.HUB_SERVER),r=Vo.join(ls.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=A1.get(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=tp.LOG_LEVEL_FLAGS[ls.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==rme?"-"+n:""),script:I1,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return ls.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Wd,i.error_file=Wd),i}o(nme,"generateNatsHubServerConfig");var sme=9940;function ime(){ls.initSync(!0);let e=ls.get(Ve.CONFIG_PARAMS.ROOTPATH),t=Vo.join(e,"clustering",tp.NATS_CONFIG_FILES.LEAF_SERVER),r=Vo.join(ls.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=A1.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=tp.LOG_LEVEL_FLAGS[ls.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==sme?"-"+n:""),script:I1,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return ls.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Wd,i.error_file=Wd),i}o(ime,"generateNatsLeafServerConfig");function ome(){ls.initSync();let e=Vo.join(ls.get(Ve.CONFIG_PARAMS.LOGGING_ROOT),Ve.LOG_NAMES.HDB),t={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ve.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:eme,autorestart:!1};return ls.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=Wd,t.error_file=Wd),t}o(ome,"generateClusteringUpgradeV4ServiceConfig");function ame(){let e={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.RESTART_HDB};return sT.noBootFile()&&(e[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=sT.getEnvCliRootPath()),{...{name:Ve.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:b1},script:tme}}o(ame,"generateRestart");function cme(){return{apps:[N1()]}}o(cme,"generateAllServiceConfigs");w1.exports={generateAllServiceConfigs:cme,generateMainServerConfig:N1,generateRestart:ame,generateNatsHubServerConfig:nme,generateNatsLeafServerConfig:ime,generateClusteringUpgradeV4ServiceConfig:ome}});var np=M((kUe,q1)=>{"use strict";var lt=(H(),v(W)),lme=ie(),Yo=nT(),oT=hr(),Ko=It(),ic=O1(),aT=oe(),xl=Q(),ume=Go(),{startWorker:C1,onMessageFromWorkers:dme}=st(),fme=Ud(),HUe=require("util"),mme=require("child_process"),hme=require("fs"),{execFile:pme}=mme,We;q1.exports={enterPM2Mode:Eme,start:oc,stop:qO,reload:L1,restart:D1,list:$O,describe:U1,connect:Wo,kill:Rme,startAllServices:yme,startService:VO,getUniqueServicesList:x1,restartAllServices:Ame,isServiceRegistered:B1,reloadStopStart:F1,restartHdb:v1,deleteProcess:Sme,startClusteringProcesses:k1,startClusteringThreads:G1,isHdbRestartRunning:Tme,isClusteringRunning:Ime,stopClustering:bme,reloadClustering:Nme,expectedRestartOfChildren:M1};var rp=!1;dme(e=>{e.type==="restart"&&aT.initSync(!0)});function Eme(){rp=!0}o(Eme,"enterPM2Mode");function Wo(){return We||(We=require("pm2")),new Promise((e,t)=>{We.connect((r,n)=>{r&&t(r),e(n)})})}o(Wo,"connect");var mn,_me=10,P1;function oc(e,t=!1){if(rp)return gme(e);let r=pme(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let a=mn.indexOf(r);a>-1&&mn.splice(a,1),!P1&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<_me&&(hme.existsSync(Yo.getHubConfigPath())?oc(e):(await Yo.generateNatsConfig(!0),oc(e),await new Promise(c=>setTimeout(c,3e3)),await Yo.removeNatsConfig(lt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Yo.removeNatsConfig(lt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let a=aT.get(lt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,d;for(;l=c.exec(i);){if(l.index&&Ko.LOG_LEVEL_HIERARCHY[a]>=Ko.LOG_LEVEL_HIERARCHY[d||"info"]){let h=d===Ko.LOG_LEVELS.ERR||d===Ko.LOG_LEVELS.WRN?xl.OUTPUTS.STDERR:xl.OUTPUTS.STDOUT;xl.logCustomLevel(d||"info",h,n,i.slice(u,l.index).trim())}let[f,m]=l;u=l.index+f.length,d=Ko.LOG_LEVELS[m]}if(Ko.LOG_LEVEL_HIERARCHY[a]>=Ko.LOG_LEVEL_HIERARCHY[d||"info"]){let f=d===Ko.LOG_LEVELS.ERR||d===Ko.LOG_LEVELS.WRN?xl.OUTPUTS.STDERR:xl.OUTPUTS.STDOUT;xl.logCustomLevel(d||"info",f,n,i.slice(u).trim())}}if(o(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!mn&&(mn=[],!t)){let i=o(()=>{P1=!0,mn&&(mn.map(a=>a.kill()),process.exit(0))},"killChildren");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}mn.push(r)}o(oc,"start");function gme(e){return new Promise(async(t,r)=>{try{await Wo()}catch(n){r(n)}We.start(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}o(gme,"startWithPM2");function qO(e){if(!rp){for(let t of mn||[])t.name===e&&(mn.splice(mn.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Wo()}catch(n){r(n)}We.stop(e,async(n,s)=>{n&&(We.disconnect(),r(n)),We.delete(e,(i,a)=>{i&&(We.disconnect(),r(n)),We.disconnect(),t(a)})})})}o(qO,"stop");function L1(e){return new Promise(async(t,r)=>{try{await Wo()}catch(n){r(n)}We.reload(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}o(L1,"reload");function D1(e){if(!rp){M1();for(let t of mn||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Wo()}catch(n){r(n)}We.restart(e,(n,s)=>{We.disconnect(),t(s)})})}o(D1,"restart");function M1(){for(let e of mn||[])e.config&&(e.config.restarts=0)}o(M1,"expectedRestartOfChildren");function Sme(e){return new Promise(async(t,r)=>{try{await Wo()}catch(n){r(n)}We.delete(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}o(Sme,"deleteProcess");async function v1(){await oc(ic.generateRestart())}o(v1,"restartHdb");async function Tme(){let e=await $O();for(let t in e)if(e[t].name===lt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}o(Tme,"isHdbRestartRunning");function $O(){return new Promise(async(e,t)=>{try{await Wo()}catch(r){t(r)}We.list((r,n)=>{r&&(We.disconnect(),t(r)),We.disconnect(),e(n)})})}o($O,"list");function U1(e){return new Promise(async(t,r)=>{try{await Wo()}catch(n){r(n)}We.describe(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}o(U1,"describe");function Rme(){if(!rp){for(let e of mn||[])e.kill();mn=[];return}return new Promise(async(e,t)=>{try{await Wo()}catch(r){t(r)}We.killDaemon((r,n)=>{r&&(We.disconnect(),t(r)),We.disconnect(),e(n)})})}o(Rme,"kill");async function yme(){try{await k1(),await G1(),await oc(ic.generateAllServiceConfigs())}catch(e){throw We?.disconnect(),e}}o(yme,"startAllServices");async function VO(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case lt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=ic.generateMainServerConfig();break;case lt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=ic.generateNatsIngestServiceConfig();break;case lt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=ic.generateNatsReplyServiceConfig();break;case lt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=ic.generateNatsHubServerConfig(),await oc(r,t),await Yo.removeNatsConfig(e);return;case lt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=ic.generateNatsLeafServerConfig(),await oc(r,t),await Yo.removeNatsConfig(e);return;case lt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=ic.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await oc(r)}catch(r){throw We?.disconnect(),r}}o(VO,"startService");async function x1(){try{let e=await $O(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw We?.disconnect(),e}}o(x1,"getUniqueServicesList");async function Ame(e=[]){try{let t=!1,r=await x1();for(let n=0,s=Object.values(r).length;n<s;n++){let a=Object.values(r)[n].name;e.includes(a)||(a===lt.PROCESS_DESCRIPTORS.HDB?t=!0:await D1(a))}t&&await F1(lt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw We?.disconnect(),t}}o(Ame,"restartAllServices");async function B1(e){if(mn?.find(r=>r.name===e))return!0;let t=await fme.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}o(B1,"isServiceRegistered");async function F1(e){let t=aT.get(lt.CONFIG_PARAMS.THREADS_COUNT)??aT.get(lt.CONFIG_PARAMS.THREADS),r=await U1(e),n=lme.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await qO(e),await VO(e)):e===lt.PROCESS_DESCRIPTORS.HDB?await v1():await L1(e)}o(F1,"reloadStopStart");var H1;async function k1(e=!1){for(let t in lt.CLUSTERING_PROCESSES){let r=lt.CLUSTERING_PROCESSES[t];await VO(r,e)}}o(k1,"startClusteringProcesses");async function G1(){H1=C1(lt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:lt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await oT.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await oT.updateLocalStreams();let e=await ume.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===lt.PRE_4_0_0_VERSION){xl.info("Starting clustering upgrade 4.0.0 process"),C1(lt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}o(G1,"startClusteringThreads");async function bme(){for(let e in lt.CLUSTERING_PROCESSES)if(e!==lt.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===lt.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await H1.terminate();else{let t=lt.CLUSTERING_PROCESSES[e];await qO(t)}}o(bme,"stopClustering");async function Ime(){for(let e in lt.CLUSTERING_PROCESSES){let t=lt.CLUSTERING_PROCESSES[e];if(await B1(t)===!1)return!1}return!0}o(Ime,"isClusteringRunning");async function Nme(){await Yo.generateNatsConfig(!0),await oT.reloadNATSHub(),await oT.reloadNATSLeaf(),await Yo.removeNatsConfig(lt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Yo.removeNatsConfig(lt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}o(Nme,"reloadClustering")});var WO={};Oe(WO,{compactOnStart:()=>wme,copyDb:()=>z1});async function wme(){ac.notify("Running compact on start"),console.log("Running compact on start");let e=(0,KO.get)(U.ROOTPATH),t=new Map,r=it();(0,YO.updateConfigValue)(U.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,cT.join)(e,"backup",n+".mdb"),a=(0,cT.join)(e,Dc,n+"-copy.mdb"),c=0;try{c=await $1(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){ac.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 z1(n,a),console.log("Backing up",n,"to",i);try{await(0,Bl.move)(s,i,{overwrite:!0})}catch(l){console.log("Error moving database",s,"to",i,l)}}try{id()}catch(n){ac.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,Bl.move)(i,s,{overwrite:!0}),await(0,Bl.remove)((0,cT.join)(e,Dc,`${n}-copy.mdb-lock`));try{id()}catch(n){ac.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){ac.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,YO.updateConfigValue)(U.STORAGE_COMPACTONSTART,!1);for(let[s,{dbPath:i,backupDest:a}]of t){console.error("Moving backup database",a,"back to",i);try{await(0,Bl.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 $1(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}.
|
|
18
18
|
Total record count before compaction: ${i}, total after: ${c}.
|
|
@@ -27,7 +27,7 @@ Host ${s}
|
|
|
27
27
|
IdentityFile ${c}
|
|
28
28
|
IdentitiesOnly yes`;await Ie.pathExists(l)?await Ie.appendFile(l,`
|
|
29
29
|
`+u):await Ie.outputFile(l,u);let d="";if(await Ie.pathExists(jo)||(await Ie.writeFile(jo,""),await Ie.chmod(jo,"0600")),i=="github.com"&&!(await Ie.readFile(jo,"utf8")).includes("github.com"))try{let _=(await(await fetch("https://api.github.com/meta")).json()).ssh_keys;for(let g of _)Ie.appendFile(jo,"github.com "+g+`
|
|
30
|
-
`)}catch{d=". Unable to get known hosts from github.com. Set your known hosts manually using set_ssh_known_hosts."}a&&await Ie.appendFile(jo,a);let f=await gi(e);return f.message=`Added ssh key: ${r}${d}`,f}o(mpe,"addSSHKey");async function hpe(e){let t=Hn.updateSSHKeyValidator(e);if(t)throw Wt(t,t.message,zt.BAD_REQUEST);let{name:r,key:n}=e;Yt.trace("updating ssh key",r);let s=Ce.join(uc,r+".key");if(!await Ie.pathExists(s))throw new Error("Key does not exist. Use add_ssh_key");await Ie.outputFile(s,n);let i=await gi(e);return i.message=`Updated ssh key: ${r}`,i}o(hpe,"updateSSHKey");async function ppe(e){let t=Hn.deleteSSHKeyValidator(e);if(t)throw Wt(t,t.message,zt.BAD_REQUEST);let{name:r}=e;Yt.trace("deleting ssh key",r);let n=Ce.join(uc,r+".key"),s=Ce.join(uc,"config");if(!await Ie.pathExists(n))throw new Error("Key does not exist");let i=await Ie.readFile(s,"utf8"),a=new RegExp(`#${r}[\\S\\s]*?IdentitiesOnly yes`,"g");i=i.replace(a,""),await Ie.outputFile(s,i),Ie.removeSync(n);let c=await gi(e);return c.message=`Deleted ssh key: ${r}`,c}o(ppe,"deleteSSHKey");async function Epe(e){let t=[];return await Ie.pathExists(uc)&&(await Ie.readdir(uc)).forEach(r=>{r!="known_hosts"&&r!="config"&&t.push({name:r.split(".")[0]})}),t}o(Epe,"listSSHKeys");async function _pe(e){let t=Hn.setSSHKnownHostsValidator(e);if(t)throw Wt(t,t.message,zt.BAD_REQUEST);let{known_hosts:r}=e;await Ie.outputFile(jo,r);let n=await gi(e);return n.message="Known hosts successfully set",n}o(_pe,"setSSHKnownHosts");async function gpe(e){return await Ie.pathExists(jo)?{known_hosts:await Ie.readFile(jo,"utf8")}:{known_hosts:null}}o(gpe,"getSSHKnownHosts");nr.customFunctionsStatus=Zhe;nr.getCustomFunctions=epe;nr.getCustomFunction=tpe;nr.setCustomFunction=rpe;nr.dropCustomFunction=npe;nr.addComponent=spe;nr.dropCustomFunctionProject=ipe;nr.packageComponent=ope;nr.deployComponent=ape;nr.getComponents=lpe;nr.getComponentFile=upe;nr.setComponentFile=dpe;nr.dropComponent=fpe;nr.addSSHKey=mpe;nr.updateSSHKey=hpe;nr.deleteSSHKey=ppe;nr.listSSHKeys=Epe;nr.setSSHKnownHosts=_pe;nr.getSSHKnownHosts=gpe});var pC=M((_0e,zK)=>{"use strict";var Bs=require("joi"),WK=dt();zK.exports={readTransactionLogValidator:Spe,deleteTransactionLogsBeforeValidator:Tpe};function Spe(e){let t=Bs.object({schema:Bs.string(),database:Bs.string(),table:Bs.string().required(),from:Bs.date().timestamp(),to:Bs.date().timestamp(),limit:Bs.number().min(1)});return WK.validateBySchema(e,t)}o(Spe,"readTransactionLogValidator");function Tpe(e){let t=Bs.object({schema:Bs.string(),database:Bs.string(),table:Bs.string().required(),timestamp:Bs.date().timestamp().required()});return WK.validateBySchema(e,t)}o(Tpe,"deleteTransactionLogsBeforeValidator")});var AT=M((S0e,eY)=>{"use strict";var EC=(H(),v(W)),Ep=hr(),jK=ie(),QK=oe(),JK=$i(),XK=Q(),{handleHDBError:RT,hdbErrors:Rpe}=ge(),{HTTP_STATUS_CODES:yT}=Rpe,{readTransactionLogValidator:ype,deleteTransactionLogsBeforeValidator:Ape}=pC(),ZK=Jn(),bpe="Logs successfully deleted from transaction log.",Ipe="All logs successfully deleted from transaction log.";eY.exports={readTransactionLog:Npe,deleteTransactionLogsBefore:Ope};async function Npe(e){let t=ype(e);if(t)throw RT(t,t.message,yT.BAD_REQUEST,void 0,void 0,!0);e.database=e.database??e.schema??"data";let r=jK.checkSchemaTableExist(e.database,e.table);if(r)throw RT(new Error,r,yT.NOT_FOUND,void 0,void 0,!0);return QK.get(EC.CONFIG_PARAMS.CLUSTERING_ENABLED)?await wpe(e):(XK.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)),ZK.readAuditLog(e))}o(Npe,"readTransactionLog");async function*wpe(e){let t=JK.createNatsTableStreamName(e.database,e.table),r=await Ep.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===EC.OPERATIONS_ENUM.DELETE&&(i.hash_values=n?.entry?.hash_values),yield i}}o(wpe,"readTransactionLogNats");async function Ope(e){let t=Ape(e);if(t)throw RT(t,t.message,yT.BAD_REQUEST,void 0,void 0,!0);if(e.database=e.database??e.schema??"data",!QK.get(EC.CONFIG_PARAMS.CLUSTERING_ENABLED))return XK.info("Delete transaction logs called for Plexus"),ZK.deleteAuditLogsBefore(e);let{database:r,table:n,timestamp:s}=e,i=jK.checkSchemaTableExist(r,n);if(i)throw RT(new Error,i,yT.NOT_FOUND,void 0,void 0,!0);let a=JK.createNatsTableStreamName(r,n),{jsm:c}=await Ep.getNATSReferences(),l=await Ep.getStreamInfo(a),u=new Date(l.state.first_ts).getTime();if(s<=u)return`No transactions exist before: ${s}`;let d=bpe,f,m=new Date(l.state.last_ts).getTime();return s>m?(f=l.state.last_seq+1,d=Ipe):f=(await Ep.viewStream(a,parseInt(s),1))[0].nats_sequence,await Ep.purgeTableStream(r,n,{seq:f}),d}o(Ope,"deleteTransactionLogsBefore")});var TC={};Oe(TC,{describeMetric:()=>oY,describeMetricOp:()=>SC,get:()=>sY,getOp:()=>_C,listMetrics:()=>iY,listMetricsOp:()=>gC});async function Cpe(e){return(await yg().get(e)).hostname}function tY(e,t){return e.length===0||e.includes(t)}function _C(e){return _p.trace?.("get_analytics request:",e),sY(e.metric,e.get_attributes,e.start_time,e.end_time,e.conditions)}function nY(e){return"conditions"in e?{...e,conditions:e.conditions.map(nY)}:{attribute:e.search_attribute??e.attribute,comparator:e.search_type??e.comparator,value:e.search_value??e.value}}async function sY(e,t,r,n,s){let i=[{attribute:"metric",comparator:"equals",value:e}];s&&i.push(...s.map(nY));let a=t??[];tY(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),_p.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],tY(a,"node")&&(_p.trace?.(`get_analytics lookup hostname for nodeId: ${d}`),u.node=await Cpe(d)),_p.trace?.("get_analytics result:",JSON.stringify(u)),u})}function gC(e){return iY(e.metric_types)}async function iY(e=["builtin"]){let t=[],r=Object.values(Mo);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 SC(e){return oY(e.metric)}async function oY(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 _p.trace?.("describe_metric result:",JSON.stringify(i)),i}return{}}var rY,_p,RC=ue(()=>{rY=w(Q());iN();oN();_p=(0,rY.forComponent)("analytics").conditional;o(Cpe,"lookupHostname");o(tY,"isSelected");o(_C,"getOp");o(nY,"conformCondition");o(sY,"get");o(gC,"listMetricsOp");o(iY,"listMetrics");o(SC,"describeMetricOp");o(oY,"describeMetric")});var bT,IT,gp,NT=ue(()=>{bT={primary:{allowedValues:null},maintenance:{allowedValues:null},availability:{allowedValues:["Available","Unavailable"]}},IT=Object.keys(bT),gp="primary"});function cY(e){return aY.validateBySchema(e,Mpe)}var Sp,aY,Ppe,Lpe,Dpe,Mpe,lY=ue(()=>{Sp=w(require("joi")),aY=w(dt());NT();Ppe=IT,Lpe=Object.entries(bT).reduce((e,[t,r])=>(r.allowedValues&&(e[t]=`Status "${t}" only accepts these values: ${r.allowedValues.join(", ")}`),e),{}),Dpe=o(()=>{let e=Sp.default.string().min(1).max(512);return Object.entries(bT).forEach(([t,r])=>{r.allowedValues&&(e=e.when("id",{is:t,then:Sp.default.string().valid(...r.allowedValues).messages({"any.only":Lpe[t]})}))}),e.required()},"createStatusValidationSchema"),Mpe=Sp.default.object({id:Sp.default.string().valid(...Ppe).required(),status:Dpe()});o(cY,"validateStatus")});var NC={};Oe(NC,{DEFAULT_STATUS_ID:()=>gp,STATUS_IDS:()=>IT,Status:()=>Qo,clear:()=>AC,get:()=>bC,set:()=>IC});function Rp(){return yC||(yC=Qe({database:"system",table:"hdb_status",replicate:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"status"},{name:"__createdtime__"},{name:"__updatedtime__"}]})),yC}function AC({id:e}){return Tp.debug?.("clearStatus",e),Rp().delete(e)}function Upe(){return Tp.debug?.("getAllStatus"),Rp().get({})}function bC({id:e}){return e?(Tp.debug?.("getStatus",e),Rp().get(e)):(Tp.debug?.("getStatus","all"),Upe())}function IC({status:e,id:t=gp}){let r=cY({status:e,id:t});if(r)throw(0,wT.handleHDBError)(r,r.message,vpe.BAD_REQUEST);return Tp.debug?.("setStatus",t,e),Rp().put(t,{status:e})}var wT,uY,vpe,yC,Qo,Tp,yp=ue(()=>{De();wT=w(ge()),uY=w(Zs());lY();NT();NT();({HTTP_STATUS_CODES:vpe}=wT.hdbErrors);o(Rp,"getStatusTable");Qo={get primaryStore(){return Rp().primaryStore}},Tp=(0,uY.loggerWithTag)("status");o(AC,"clearStatus");o(Upe,"getAllStatus");o(bC,"getStatus");o(IC,"setStatus")});var fY=M((B0e,dY)=>{"use strict";var wC=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}};dY.exports=wC});var hY=M((H0e,mY)=>{"use strict";var OC=class{static{o(this,"PermissionAttributeResponseObject")}constructor(t,r=[]){this.attribute_name=t,this.required_permissions=r}};mY.exports=OC});var PC=M((G0e,EY)=>{"use strict";var pY=fY(),xpe=hY(),{HDB_ERROR_MSGS:Bpe}=rn(),CC=class{static{o(this,"PermissionResponseObject")}constructor(){this.error=Bpe.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 pY(t,r,n),i=`${t}_${r}`;this.unauthorized_access[i]=s}addUnauthorizedAttributes(t,r,n,s){let i=[];t.forEach(c=>{let l=new xpe(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 pY(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}};EY.exports=CC});var LT=M(($0e,MY)=>{"use strict";var LC=vn(),OT=on(),Fs=Hh(),Ip=xa(),DC=dl(),Fpe=Uw(),Hpe=T$(),Np=ts(),CT=Th(),wr=Q(),kpe=kw(),Gpe=qS(),qpe=mO(),$pe=VS(),Vpe=EO(),Kpe=_O(),Ype=TO(),Wpe=yO(),MC=jS(),Jo=ie(),zpe=XV(),vC=UO(),SY=Qd(),En=(H(),v(W)),TY=fK(),jpe=Ud(),RY=(hd(),v(Nh)),yY=(pT(),v(cp)),AY=bt(),pr=fC(),Qpe=require("alasql"),bY=AT(),IY=fp(),tf=os(),NY=(Bd(),v(xd)),UC=(RC(),v(TC)),xC=(yp(),v(NC)),wY=PC(),{handleHDBError:kn,hdbErrors:OY}=ge(),{HDB_ERROR_MSGS:Jr,HTTP_STATUS_CODES:Ap}=OY,{cleanupOrphanBlobs:Jpe}=Hh(),X=new Map,CY="delete",dc="insert",Hs="read",ql="update",bp="describe",_Y=Ip.describeSchema.name,gY=Ip.describeTable.name,PY={delete:!0,deleteRecord:!0,update:!0,updateData:!0,dropAttribute:!0,dropTable:!0,dropSchema:!0,upsert:!0,upsertData:!0},Xpe={insert:!0,delete:!0,deleteRecord:!0,update:!0,updateData:!0,upsert:!0,upsertData:!0},Zpe="catchup",eEe="handleGetJob",tEe="handleGetJobsByStartDate",PT={CSV_DATA_LOAD:"csvDataLoad",CSV_URL_LOAD:"csvURLLoad",CSV_FILE_LOAD:"csvFileLoad",IMPORT_FROM_S3:"importFromS3"},rEe=[Fs.createTable.name,Fs.createAttribute.name,Fs.dropTable.name,Fs.dropAttribute.name],LY={EXPORT_TO_S3:"export_to_s3",EXPORT_LOCAL:"export_local"},ee=class{static{o(this,"permission")}constructor(t,r){this.requires_su=t,this.perms=r}};X.set(LC.insert.name,new ee(!1,[dc]));X.set(LC.update.name,new ee(!1,[ql]));X.set(LC.upsert.name,new ee(!1,[dc,ql]));X.set(OT.searchByConditions.name,new ee(!1,[Hs]));X.set(OT.searchByHash.name,new ee(!1,[Hs]));X.set(OT.searchByValue.name,new ee(!1,[Hs]));X.set(OT.search.name,new ee(!1,[Hs]));X.set(Fs.createSchema.name,new ee(!0,[]));X.set(Fs.createTable.name,new ee(!0,[]));X.set(Fs.createAttribute.name,new ee(!1,[dc]));X.set(Fs.dropSchema.name,new ee(!0,[]));X.set(Fs.dropTable.name,new ee(!0,[]));X.set(Fs.dropAttribute.name,new ee(!0,[]));X.set(Ip.describeSchema.name,new ee(!1,[Hs]));X.set(Ip.describeTable.name,new ee(!1,[Hs]));X.set(DC.deleteRecord.name,new ee(!1,[CY]));X.set(Np.addUser.name,new ee(!0,[]));X.set(Np.alterUser.name,new ee(!0,[]));X.set(Np.dropUser.name,new ee(!0,[]));X.set(Np.listUsersExternal.name,new ee(!0,[]));X.set(CT.listRoles.name,new ee(!0,[]));X.set(CT.addRole.name,new ee(!0,[]));X.set(CT.alterRole.name,new ee(!0,[]));X.set(CT.dropRole.name,new ee(!0,[]));X.set(kpe.name,new ee(!0,[]));X.set(Gpe.name,new ee(!0,[]));X.set(qpe.name,new ee(!0,[]));X.set($pe.name,new ee(!0,[]));X.set(Vpe.name,new ee(!0,[]));X.set(Kpe.name,new ee(!0,[]));X.set(MC.setRoutes.name,new ee(!0,[]));X.set(MC.getRoutes.name,new ee(!0,[]));X.set(MC.deleteRoutes.name,new ee(!0,[]));X.set(AY.setConfiguration.name,new ee(!0,[]));X.set(Ype.clusterStatus.name,new ee(!0,[]));X.set(Wpe.name,new ee(!0,[]));X.set(vC.getFingerprint.name,new ee(!0,[]));X.set(vC.setLicense.name,new ee(!0,[]));X.set(DC.deleteFilesBefore.name,new ee(!0,[]));X.set(DC.deleteAuditLogsBefore.name,new ee(!0,[]));X.set(SY.restart.name,new ee(!0,[]));X.set(SY.restartService.name,new ee(!0,[]));X.set(Fpe.name,new ee(!0,[]));X.set(Hpe.name,new ee(!0,[Hs]));X.set(Jpe.name,new ee(!0,[]));X.set(jpe.systemInformation.name,new ee(!0,[]));X.set(AY.getConfiguration.name,new ee(!0,[]));X.set(bY.readTransactionLog.name,new ee(!0,[]));X.set(bY.deleteTransactionLogsBefore.name,new ee(!0,[]));X.set(IY.installModules.name,new ee(!0,[]));X.set(IY.auditModules.name,new ee(!0,[]));X.set(tf.createCsr.name,new ee(!0,[]));X.set(tf.signCertificate.name,new ee(!0,[]));X.set(tf.listCertificates.name,new ee(!0,[]));X.set(tf.addCertificate.name,new ee(!0,[]));X.set(tf.removeCertificate.name,new ee(!0,[]));X.set(tf.getKey.name,new ee(!0,[]));X.set(NY.addNodeBack.name,new ee(!0,[]));X.set(NY.removeNodeBack.name,new ee(!0,[]));X.set(UC.getOp.name,new ee(!1,[Hs]));X.set(UC.listMetricsOp.name,new ee(!1,[Hs]));X.set(UC.describeMetricOp.name,new ee(!1,[Hs]));X.set(xC.clear.name,new ee(!0,[]));X.set(xC.get.name,new ee(!0,[]));X.set(xC.set.name,new ee(!0,[]));X.set(RY.createTokens.name,new ee(!1,[]));X.set(RY.refreshOperationToken.name,new ee(!1,[]));X.set(yY.login.name,new ee(!1,[]));X.set(yY.logout.name,new ee(!1,[]));X.set(pr.customFunctionsStatus.name,new ee(!0,[]));X.set(pr.getCustomFunctions.name,new ee(!0,[]));X.set(pr.getComponents.name,new ee(!0,[]));X.set(pr.getComponentFile.name,new ee(!0,[]));X.set(pr.setComponentFile.name,new ee(!0,[]));X.set(pr.dropComponent.name,new ee(!0,[]));X.set(pr.getCustomFunction.name,new ee(!0,[]));X.set(pr.setCustomFunction.name,new ee(!0,[]));X.set(pr.dropCustomFunction.name,new ee(!0,[]));X.set(pr.addComponent.name,new ee(!0,[]));X.set(pr.dropCustomFunctionProject.name,new ee(!0,[]));X.set(pr.packageComponent.name,new ee(!0,[]));X.set(pr.deployComponent.name,new ee(!0,[]));X.set(pr.addSSHKey.name,new ee(!0,[]));X.set(pr.updateSSHKey.name,new ee(!0,[]));X.set(pr.deleteSSHKey.name,new ee(!0,[]));X.set(pr.listSSHKeys.name,new ee(!0,[]));X.set(pr.setSSHKnownHosts.name,new ee(!0,[]));X.set(pr.getSSHKnownHosts.name,new ee(!0,[]));X.set(vC.getRegistrationInfo.name,new ee(!1,[]));X.set(Np.userInfo.name,new ee(!1,[]));X.set(Ip.describeAll.name,new ee(!1,[]));X.set(eEe,new ee(!1,[]));X.set(tEe,new ee(!0,[]));X.set(Zpe,new ee(!0,[]));X.set(PT.CSV_DATA_LOAD,new ee(!1,[dc,ql]));X.set(PT.CSV_URL_LOAD,new ee(!1,[dc,ql]));X.set(PT.CSV_FILE_LOAD,new ee(!1,[dc,ql]));X.set(PT.IMPORT_FROM_S3,new ee(!1,[dc,ql]));X.set(LY.EXPORT_TO_S3,new ee(!0,[]));X.set(LY.EXPORT_LOCAL,new ee(!0,[]));X.set(En.VALID_SQL_OPS_ENUM.DELETE,new ee(!1,[CY]));X.set(En.VALID_SQL_OPS_ENUM.SELECT,new ee(!1,[Hs]));X.set(En.VALID_SQL_OPS_ENUM.INSERT,new ee(!1,[dc]));X.set(En.VALID_SQL_OPS_ENUM.UPDATE,new ee(!1,[ql]));MY.exports={verifyPerms:sEe,verifyPermsAst:nEe,verifyBulkLoadAttributePerms:oEe};function nEe(e,t,r){if(Jo.isEmptyOrZeroLength(e))throw wr.info("verify_perms_ast has an empty user parameter"),kn(new Error);if(Jo.isEmptyOrZeroLength(t))throw wr.info("verify_perms_ast has an empty user parameter"),kn(new Error);if(Jo.isEmptyOrZeroLength(r))throw wr.info("verify_perms_ast has a null operation parameter"),kn(new Error);try{let n=new wY,s=new zpe(e),i=s.getSchemas(),a=new Map;if((!i||i.length===0)&&s.affected_attributes&&s.affected_attributes.size>0)throw wr.info("No schemas defined in verifyPermsAst(), will not continue."),kn(new Error);let c=!!t.role.permission.super_user,l=i.includes("system");if(l&&PY[r])throw kn(new Error,Jr.DROP_SYSTEM,Ap.FORBIDDEN);if(c&&!l)return null;let u=TY.getRolePermissions(t.role);t.role.permission=u,!c&&e instanceof Qpe.yy.Select&&(e=s.updateAttributeWildcardsForRolePerms(u));for(let f=0;f<i.length;f++){let m=s.getTablesBySchemaName(i[f]);m&&a.set(i[f],m)}let d=DY(t,r,a,n);return d||(a.forEach((f,m)=>{for(let h=0;h<f.length;h++){let p=s.getAttributesBySchemaTableName(m,f[h]),_=FC(t.role.permission,m,f[h]);BC(p,_,r,f[h],m,n)}}),n.getPermsResponse())}catch(n){throw kn(n)}}o(nEe,"verifyPermsAst");function sEe(e,t){if(e===null||t===null||e.hdb_user===void 0||e.hdb_user===null)throw wr.info("null required parameter in verifyPerms"),kn(new Error,Jr.DEFAULT_INVALID_REQUEST,Ap.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 wY;if(Jo.isEmptyOrZeroLength(e.hdb_user?.role)||Jo.isEmptyOrZeroLength(e.hdb_user?.role?.permission))return wr.info(`User ${e.hdb_user?.username} has no role or permissions. Please assign the user a valid role.`),c.handleUnauthorizedItem(Jr.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(En.SYSTEM_SCHEMA_NAME)||s===En.SYSTEM_SCHEMA_NAME;if(l&&d&&Xpe[e.operation]&&(i===En.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME||i===En.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||i===En.SYSTEM_TABLE_NAMES.USER_TABLE_NAME))return null;if(d&&PY[r])throw kn(new Error,Jr.DROP_SYSTEM,Ap.FORBIDDEN);if(l&&!d||u===!0&&(r===Fs.createSchema.name||r===Fs.dropSchema.name))return null;if(rEe.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=TY.getRolePermissions(e.hdb_user?.role);if(e.hdb_user?.role&&(e.hdb_user.role.permission=f),(r===_Y||r===gY)&&!f.super_user){if(s===En.SYSTEM_SCHEMA_NAME)return c.handleUnauthorizedItem(Jr.SCHEMA_PERM_ERROR(s));if(r===_Y&&(!f[s]||!f[s][bp]))return c.handleInvalidItem(Jr.SCHEMA_NOT_FOUND(s));if(r===gY&&(!f[s]||!f[s].tables[i]||!f[s].tables[i][bp]))return c.handleInvalidItem(Jr.TABLE_NOT_FOUND(s,i))}let m=DY(e.hdb_user,r,a,c,n);if(m)return m;if(X.get(r)&&X.get(r).perms.length===0)return null;if(!l&&e.get_attributes&&En.SEARCH_WILDCARDS.includes(e.get_attributes[0])){let _=[],g=f[s].tables[i];g[En.PERMS_CRUD_ENUM.READ]&&(g.attribute_permissions.length>0?g.attribute_permissions.filter(T=>T[En.PERMS_CRUD_ENUM.READ]).forEach(T=>{_.push(T.attribute_name)}):_=global.hdb_schema[s][i].attributes.map(y=>y.attribute),e.get_attributes=_)}let h=iEe(e),p=FC(e.hdb_user?.role?.permission,s,i);return BC(h,p,r,i,s,c,n),c.getPermsResponse()}o(sEe,"verifyPerms");function DY(e,t,r,n,s){if(Jo.arrayHasEmptyValues([e,t,r]))throw wr.info("hasPermissions has an invalid parameter"),kn(new Error);let i=r.has("system"),a=e.role.permission;if(a.super_user&&(!i||X.get(t).requires_su))return null;if(!X.get(t))throw wr.info(`operation ${t} not found.`),kn(new Error,Jr.OP_NOT_FOUND(t),Ap.BAD_REQUEST);if(X.get(t)&&X.get(t).requires_su)return wr.info(`operation ${t} requires SU permissions.`),n.handleUnauthorizedItem(Jr.OP_IS_SU_ONLY(t));let c=r.keys();for(let l of c){try{if(l&&!a[l]||a[l][bp]===!1){n.addInvalidItem(Jr.SCHEMA_NOT_FOUND(l));continue}}catch{n.addInvalidItem(Jr.SCHEMA_NOT_FOUND(l));continue}let u=r.get(l);for(let d of u){let f=a[l].tables[d];if(!f||f[bp]===!1)n.addInvalidItem(Jr.TABLE_NOT_FOUND(l,d));else try{let m=[],h=X.get(t).perms;!Jo.isEmpty(s)&&h.includes(s)&&(h=[s]);for(let p=0;p<h.length;p++){let _=h[p],g=f[_];(g==null||g===!1)&&(wr.info(`Required ${_} permission not found for ${t} ${s?`${s} `:""}operation in role ${e.role.id}`),m.push(_))}m.length>0&&n.addUnauthorizedTable(l,d,m)}catch(m){let h=Jr.UNKNOWN_OP_AUTH_ERROR(t,l,d);throw wr.error(h),wr.error(m),kn(OY.CHECK_LOGS_WRAPPER(h))}}}return r.size<2?n.getPermsResponse():null}o(DY,"hasPermissions");function BC(e,t,r,n,s,i,a){if(!e||!t)throw wr.info("no attributes specified in checkAttributePerms."),kn(new Error);let c=X.get(r).perms;if(!c||c==="")throw wr.info(`no permissions found for ${r} in checkAttributePerms().`),kn(new Error);if(Jo.isEmptyOrZeroLength(t))return wr.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[bp]===!1){i.addInvalidItem(Jr.ATTR_NOT_FOUND(s,n,d),s,n);continue}if(c)for(let m of c){if(En.TIME_STAMP_NAMES.includes(f.attribute_name)&&m!==Hs)throw kn(new Error,Jr.SYSTEM_TIMESTAMP_PERMS_ERR,Ap.FORBIDDEN);f[m]===!1&&(l[f.attribute_name]?l[f.attribute_name].push(m):l[f.attribute_name]=[m])}}else i.addInvalidItem(Jr.ATTR_NOT_FOUND(s,n,d),s,n)}let u=Object.keys(l);u.length>0&&i.addUnauthorizedAttributes(u,s,n,l)}o(BC,"checkAttributePerms");function iEe(e){let t=new Set;try{if(e.action)return t;if(e.operation===En.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS&&e.conditions.forEach(r=>{t.add(r.search_attribute)}),e&&e.search_attribute&&t.add(e.search_attribute),!e.records||e.records.length===0){if(!e.get_attributes||!e.get_attributes.length===0)return t;for(let r=0;r<e.get_attributes.length;r++)t.add(e.get_attributes[r])}else for(let r=0;r<e.records.length;r++){let n=Object.keys(e.records[r]);for(let s=0;s<n.length;s++)t.add(n[s])}}catch(r){wr.info(r)}return t}o(iEe,"getRecordAttributes");function FC(e,t,r){let n=new Map;if(Jo.isEmpty(e))return wr.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{wr.info(`No attribute permissions found for schema ${t} and table ${r}.`)}return n}o(FC,"getAttributePermissions");function oEe(e,t,r,n,s,i,a){let c=new Set(i),l=FC(e,n,s);BC(c,l,t,s,n,a,r)}o(oEe,"verifyBulkLoadAttributePerms")});var MT=M((K0e,FY)=>{"use strict";FY.exports={evaluateSQL:SEe,processAST:BY,convertSQLToAST:xY,checkASTPermissions:UY};var aEe=vn(),vY=require("util"),cEe=vY.callbackify(aEe.insert),lEe=on().search,uEe=HG().update,dEe=vY.callbackify(uEe),fEe=GG().convertDelete,fc=require("alasql"),mEe=LT(),DT=Q(),hEe=rg(),pEe=ie(),wp=(H(),v(W)),{hdbErrors:EEe,handleHDBError:HC}=ge(),{HTTP_STATUS_CODES:kC}=EEe;hEe(fc);var _Ee=403,gEe="There was a problem performing this insert. Please check the logs and try again.",GC=class{static{o(this,"ParsedSQLObject")}constructor(){this.ast=void 0,this.variant=void 0,this.permissions_checked=!1}};function SEe(e,t){let r=e.parsed_sql_object;if(!r){r=xY(e.sql);let n,s=r.ast.statements[0];if(s instanceof fc.yy.Insert?n=s.into.databaseid:s instanceof fc.yy.Select?n=s.from?s.from[0].databaseid:null:s instanceof fc.yy.Update||s instanceof fc.yy.Delete?n=s.table.databaseid:DT.error("AST in evaluateSQL is not a valid SQL type."),!(s instanceof fc.yy.Select)&&pEe.isEmptyOrZeroLength(n))return t("No schema specified",null)}BY(e,r,(n,s)=>{if(n)return t(n);t(null,s)})}o(SEe,"evaluateSQL");function UY(e,t){let r;try{r=mEe.verifyPermsAst(t.ast.statements[0],e.hdb_user,t.variant),t.permissions_checked=!0}catch(n){throw n}return r||null}o(UY,"checkASTPermissions");function xY(e){let t=new GC;if(!e)throw HC(new Error,"The 'sql' parameter is missing from the request body",kC.BAD_REQUEST);try{let r=e.trim(),n=fc.parse(r),s=r.split(" ")[0].toLowerCase();t.ast=n,t.variant=s}catch(r){let n=r.message.split(`
|
|
30
|
+
`)}catch{d=". Unable to get known hosts from github.com. Set your known hosts manually using set_ssh_known_hosts."}a&&await Ie.appendFile(jo,a);let f=await gi(e);return f.message=`Added ssh key: ${r}${d}`,f}o(mpe,"addSSHKey");async function hpe(e){let t=Hn.updateSSHKeyValidator(e);if(t)throw Wt(t,t.message,zt.BAD_REQUEST);let{name:r,key:n}=e;Yt.trace("updating ssh key",r);let s=Ce.join(uc,r+".key");if(!await Ie.pathExists(s))throw new Error("Key does not exist. Use add_ssh_key");await Ie.outputFile(s,n);let i=await gi(e);return i.message=`Updated ssh key: ${r}`,i}o(hpe,"updateSSHKey");async function ppe(e){let t=Hn.deleteSSHKeyValidator(e);if(t)throw Wt(t,t.message,zt.BAD_REQUEST);let{name:r}=e;Yt.trace("deleting ssh key",r);let n=Ce.join(uc,r+".key"),s=Ce.join(uc,"config");if(!await Ie.pathExists(n))throw new Error("Key does not exist");let i=await Ie.readFile(s,"utf8"),a=new RegExp(`#${r}[\\S\\s]*?IdentitiesOnly yes`,"g");i=i.replace(a,""),await Ie.outputFile(s,i),Ie.removeSync(n);let c=await gi(e);return c.message=`Deleted ssh key: ${r}`,c}o(ppe,"deleteSSHKey");async function Epe(e){let t=[];return await Ie.pathExists(uc)&&(await Ie.readdir(uc)).forEach(r=>{r!="known_hosts"&&r!="config"&&t.push({name:r.split(".")[0]})}),t}o(Epe,"listSSHKeys");async function _pe(e){let t=Hn.setSSHKnownHostsValidator(e);if(t)throw Wt(t,t.message,zt.BAD_REQUEST);let{known_hosts:r}=e;await Ie.outputFile(jo,r);let n=await gi(e);return n.message="Known hosts successfully set",n}o(_pe,"setSSHKnownHosts");async function gpe(e){return await Ie.pathExists(jo)?{known_hosts:await Ie.readFile(jo,"utf8")}:{known_hosts:null}}o(gpe,"getSSHKnownHosts");nr.customFunctionsStatus=Zhe;nr.getCustomFunctions=epe;nr.getCustomFunction=tpe;nr.setCustomFunction=rpe;nr.dropCustomFunction=npe;nr.addComponent=spe;nr.dropCustomFunctionProject=ipe;nr.packageComponent=ope;nr.deployComponent=ape;nr.getComponents=lpe;nr.getComponentFile=upe;nr.setComponentFile=dpe;nr.dropComponent=fpe;nr.addSSHKey=mpe;nr.updateSSHKey=hpe;nr.deleteSSHKey=ppe;nr.listSSHKeys=Epe;nr.setSSHKnownHosts=_pe;nr.getSSHKnownHosts=gpe});var pC=M((_0e,zK)=>{"use strict";var Bs=require("joi"),WK=dt();zK.exports={readTransactionLogValidator:Spe,deleteTransactionLogsBeforeValidator:Tpe};function Spe(e){let t=Bs.object({schema:Bs.string(),database:Bs.string(),table:Bs.string().required(),from:Bs.date().timestamp(),to:Bs.date().timestamp(),limit:Bs.number().min(1)});return WK.validateBySchema(e,t)}o(Spe,"readTransactionLogValidator");function Tpe(e){let t=Bs.object({schema:Bs.string(),database:Bs.string(),table:Bs.string().required(),timestamp:Bs.date().timestamp().required()});return WK.validateBySchema(e,t)}o(Tpe,"deleteTransactionLogsBeforeValidator")});var AT=M((S0e,eY)=>{"use strict";var EC=(H(),v(W)),Ep=hr(),jK=ie(),QK=oe(),JK=$i(),XK=Q(),{handleHDBError:RT,hdbErrors:Rpe}=ge(),{HTTP_STATUS_CODES:yT}=Rpe,{readTransactionLogValidator:ype,deleteTransactionLogsBeforeValidator:Ape}=pC(),ZK=Jn(),bpe="Logs successfully deleted from transaction log.",Ipe="All logs successfully deleted from transaction log.";eY.exports={readTransactionLog:Npe,deleteTransactionLogsBefore:Ope};async function Npe(e){let t=ype(e);if(t)throw RT(t,t.message,yT.BAD_REQUEST,void 0,void 0,!0);e.database=e.database??e.schema??"data";let r=jK.checkSchemaTableExist(e.database,e.table);if(r)throw RT(new Error,r,yT.NOT_FOUND,void 0,void 0,!0);return QK.get(EC.CONFIG_PARAMS.CLUSTERING_ENABLED)?await wpe(e):(XK.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)),ZK.readAuditLog(e))}o(Npe,"readTransactionLog");async function*wpe(e){let t=JK.createNatsTableStreamName(e.database,e.table),r=await Ep.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===EC.OPERATIONS_ENUM.DELETE&&(i.hash_values=n?.entry?.hash_values),yield i}}o(wpe,"readTransactionLogNats");async function Ope(e){let t=Ape(e);if(t)throw RT(t,t.message,yT.BAD_REQUEST,void 0,void 0,!0);if(e.database=e.database??e.schema??"data",!QK.get(EC.CONFIG_PARAMS.CLUSTERING_ENABLED))return XK.info("Delete transaction logs called for Plexus"),ZK.deleteAuditLogsBefore(e);let{database:r,table:n,timestamp:s}=e,i=jK.checkSchemaTableExist(r,n);if(i)throw RT(new Error,i,yT.NOT_FOUND,void 0,void 0,!0);let a=JK.createNatsTableStreamName(r,n),{jsm:c}=await Ep.getNATSReferences(),l=await Ep.getStreamInfo(a),u=new Date(l.state.first_ts).getTime();if(s<=u)return`No transactions exist before: ${s}`;let d=bpe,f,m=new Date(l.state.last_ts).getTime();return s>m?(f=l.state.last_seq+1,d=Ipe):f=(await Ep.viewStream(a,parseInt(s),1))[0].nats_sequence,await Ep.purgeTableStream(r,n,{seq:f}),d}o(Ope,"deleteTransactionLogsBefore")});var TC={};Oe(TC,{describeMetric:()=>oY,describeMetricOp:()=>SC,get:()=>sY,getOp:()=>_C,listMetrics:()=>iY,listMetricsOp:()=>gC});async function Cpe(e){return(await yg().get(e)).hostname}function tY(e,t){return e.length===0||e.includes(t)}function _C(e){return _p.trace?.("get_analytics request:",e),sY(e.metric,e.get_attributes,e.start_time,e.end_time,e.conditions)}function nY(e){return"conditions"in e?{...e,conditions:e.conditions.map(nY)}:{attribute:e.search_attribute??e.attribute,comparator:e.search_type??e.comparator,value:e.search_value??e.value}}async function sY(e,t,r,n,s){let i=[{attribute:"metric",comparator:"equals",value:e}];s&&i.push(...s.map(nY));let a=t??[];tY(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),_p.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],tY(a,"node")&&(_p.trace?.(`get_analytics lookup hostname for nodeId: ${d}`),u.node=await Cpe(d)),_p.trace?.("get_analytics result:",JSON.stringify(u)),u})}function gC(e){return iY(e.metric_types)}async function iY(e=["builtin"]){let t=[],r=Object.values(Mo);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 SC(e){return oY(e.metric)}async function oY(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 _p.trace?.("describe_metric result:",JSON.stringify(i)),i}return{}}var rY,_p,RC=ue(()=>{rY=w(Q());iN();oN();_p=(0,rY.forComponent)("analytics").conditional;o(Cpe,"lookupHostname");o(tY,"isSelected");o(_C,"getOp");o(nY,"conformCondition");o(sY,"get");o(gC,"listMetricsOp");o(iY,"listMetrics");o(SC,"describeMetricOp");o(oY,"describeMetric")});var bT,IT,gp,NT=ue(()=>{bT={primary:{allowedValues:null},maintenance:{allowedValues:null},availability:{allowedValues:["Available","Unavailable"]}},IT=Object.keys(bT),gp="primary"});function cY(e){return aY.validateBySchema(e,Mpe)}var Sp,aY,Ppe,Lpe,Dpe,Mpe,lY=ue(()=>{Sp=w(require("joi")),aY=w(dt());NT();Ppe=IT,Lpe=Object.entries(bT).reduce((e,[t,r])=>(r.allowedValues&&(e[t]=`Status "${t}" only accepts these values: ${r.allowedValues.join(", ")}`),e),{}),Dpe=o(()=>{let e=Sp.default.string().min(1).max(512);return Object.entries(bT).forEach(([t,r])=>{r.allowedValues&&(e=e.when("id",{is:t,then:Sp.default.string().valid(...r.allowedValues).messages({"any.only":Lpe[t]})}))}),e.required()},"createStatusValidationSchema"),Mpe=Sp.default.object({id:Sp.default.string().valid(...Ppe).required(),status:Dpe()});o(cY,"validateStatus")});var NC={};Oe(NC,{DEFAULT_STATUS_ID:()=>gp,STATUS_IDS:()=>IT,Status:()=>Qo,clear:()=>AC,get:()=>bC,set:()=>IC});function Rp(){return yC||(yC=Qe({database:"system",table:"hdb_status",replicate:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"status"},{name:"__createdtime__"},{name:"__updatedtime__"}]})),yC}function AC({id:e}){return Tp.debug?.("clearStatus",e),Rp().delete(e)}function Upe(){return Tp.debug?.("getAllStatus"),Rp().get({})}function bC({id:e}){return e?(Tp.debug?.("getStatus",e),Rp().get(e)):(Tp.debug?.("getStatus","all"),Upe())}function IC({status:e,id:t=gp}){let r=cY({status:e,id:t});if(r)throw(0,wT.handleHDBError)(r,r.message,vpe.BAD_REQUEST);return Tp.debug?.("setStatus",t,e),Rp().put(t,{status:e})}var wT,uY,vpe,yC,Qo,Tp,yp=ue(()=>{De();wT=w(ge()),uY=w(Zs());lY();NT();NT();({HTTP_STATUS_CODES:vpe}=wT.hdbErrors);o(Rp,"getStatusTable");Qo={get primaryStore(){return Rp().primaryStore}},Tp=(0,uY.loggerWithTag)("status");o(AC,"clearStatus");o(Upe,"getAllStatus");o(bC,"getStatus");o(IC,"setStatus")});var fY=M((B0e,dY)=>{"use strict";var wC=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}};dY.exports=wC});var hY=M((H0e,mY)=>{"use strict";var OC=class{static{o(this,"PermissionAttributeResponseObject")}constructor(t,r=[]){this.attribute_name=t,this.required_permissions=r}};mY.exports=OC});var PC=M((G0e,EY)=>{"use strict";var pY=fY(),xpe=hY(),{HDB_ERROR_MSGS:Bpe}=rn(),CC=class{static{o(this,"PermissionResponseObject")}constructor(){this.error=Bpe.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 pY(t,r,n),i=`${t}_${r}`;this.unauthorized_access[i]=s}addUnauthorizedAttributes(t,r,n,s){let i=[];t.forEach(c=>{let l=new xpe(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 pY(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}};EY.exports=CC});var LT=M(($0e,MY)=>{"use strict";var LC=vn(),OT=on(),Fs=Hh(),Ip=xa(),DC=dl(),Fpe=Uw(),Hpe=T$(),Np=ts(),CT=Th(),wr=Q(),kpe=kw(),Gpe=qS(),qpe=mO(),$pe=VS(),Vpe=EO(),Kpe=_O(),Ype=TO(),Wpe=yO(),MC=jS(),Jo=ie(),zpe=XV(),vC=UO(),SY=Qd(),En=(H(),v(W)),TY=fK(),jpe=Ud(),RY=(hd(),v(Nh)),yY=(pT(),v(cp)),AY=bt(),pr=fC(),Qpe=require("alasql"),bY=AT(),IY=fp(),tf=os(),NY=(Bd(),v(xd)),UC=(RC(),v(TC)),xC=(yp(),v(NC)),wY=PC(),{handleHDBError:kn,hdbErrors:OY}=ge(),{HDB_ERROR_MSGS:Jr,HTTP_STATUS_CODES:Ap}=OY,{cleanupOrphanBlobs:Jpe}=Hh(),X=new Map,CY="delete",dc="insert",Hs="read",ql="update",bp="describe",_Y=Ip.describeSchema.name,gY=Ip.describeTable.name,PY={delete:!0,deleteRecord:!0,update:!0,updateData:!0,dropAttribute:!0,dropTable:!0,dropSchema:!0,upsert:!0,upsertData:!0},Xpe={insert:!0,delete:!0,deleteRecord:!0,update:!0,updateData:!0,upsert:!0,upsertData:!0},Zpe="catchup",eEe="handleGetJob",tEe="handleGetJobsByStartDate",PT={CSV_DATA_LOAD:"csvDataLoad",CSV_URL_LOAD:"csvURLLoad",CSV_FILE_LOAD:"csvFileLoad",IMPORT_FROM_S3:"importFromS3"},rEe=[Fs.createTable.name,Fs.createAttribute.name,Fs.dropTable.name,Fs.dropAttribute.name],LY={EXPORT_TO_S3:"export_to_s3",EXPORT_LOCAL:"export_local"},ee=class{static{o(this,"permission")}constructor(t,r){this.requires_su=t,this.perms=r}};X.set(LC.insert.name,new ee(!1,[dc]));X.set(LC.update.name,new ee(!1,[ql]));X.set(LC.upsert.name,new ee(!1,[dc,ql]));X.set(OT.searchByConditions.name,new ee(!1,[Hs]));X.set(OT.searchByHash.name,new ee(!1,[Hs]));X.set(OT.searchByValue.name,new ee(!1,[Hs]));X.set(OT.search.name,new ee(!1,[Hs]));X.set(Fs.createSchema.name,new ee(!0,[]));X.set(Fs.createTable.name,new ee(!0,[]));X.set(Fs.createAttribute.name,new ee(!1,[dc]));X.set(Fs.dropSchema.name,new ee(!0,[]));X.set(Fs.dropTable.name,new ee(!0,[]));X.set(Fs.dropAttribute.name,new ee(!0,[]));X.set(Ip.describeSchema.name,new ee(!1,[Hs]));X.set(Ip.describeTable.name,new ee(!1,[Hs]));X.set(DC.deleteRecord.name,new ee(!1,[CY]));X.set(Np.addUser.name,new ee(!0,[]));X.set(Np.alterUser.name,new ee(!0,[]));X.set(Np.dropUser.name,new ee(!0,[]));X.set(Np.listUsersExternal.name,new ee(!0,[]));X.set(CT.listRoles.name,new ee(!0,[]));X.set(CT.addRole.name,new ee(!0,[]));X.set(CT.alterRole.name,new ee(!0,[]));X.set(CT.dropRole.name,new ee(!0,[]));X.set(kpe.name,new ee(!0,[]));X.set(Gpe.name,new ee(!0,[]));X.set(qpe.name,new ee(!0,[]));X.set($pe.name,new ee(!0,[]));X.set(Vpe.name,new ee(!0,[]));X.set(Kpe.name,new ee(!0,[]));X.set(MC.setRoutes.name,new ee(!0,[]));X.set(MC.getRoutes.name,new ee(!0,[]));X.set(MC.deleteRoutes.name,new ee(!0,[]));X.set(AY.setConfiguration.name,new ee(!0,[]));X.set(Ype.clusterStatus.name,new ee(!0,[]));X.set(Wpe.name,new ee(!0,[]));X.set(vC.getFingerprint.name,new ee(!0,[]));X.set(vC.setLicense.name,new ee(!0,[]));X.set(DC.deleteFilesBefore.name,new ee(!0,[]));X.set(DC.deleteAuditLogsBefore.name,new ee(!0,[]));X.set(SY.restart.name,new ee(!0,[]));X.set(SY.restartService.name,new ee(!0,[]));X.set(Fpe.name,new ee(!0,[]));X.set(Hpe.name,new ee(!0,[Hs]));X.set(Jpe.name,new ee(!0,[]));X.set(jpe.systemInformation.name,new ee(!0,[]));X.set(AY.getConfiguration.name,new ee(!0,[]));X.set(bY.readTransactionLog.name,new ee(!0,[]));X.set(bY.deleteTransactionLogsBefore.name,new ee(!0,[]));X.set(IY.installModules.name,new ee(!0,[]));X.set(IY.auditModules.name,new ee(!0,[]));X.set(tf.createCsr.name,new ee(!0,[]));X.set(tf.signCertificate.name,new ee(!0,[]));X.set(tf.listCertificates.name,new ee(!0,[]));X.set(tf.addCertificate.name,new ee(!0,[]));X.set(tf.removeCertificate.name,new ee(!0,[]));X.set(tf.getKey.name,new ee(!0,[]));X.set(NY.addNodeBack.name,new ee(!0,[]));X.set(NY.removeNodeBack.name,new ee(!0,[]));X.set(UC.getOp.name,new ee(!1,[Hs]));X.set(UC.listMetricsOp.name,new ee(!1,[Hs]));X.set(UC.describeMetricOp.name,new ee(!1,[Hs]));X.set(xC.clear.name,new ee(!0,[]));X.set(xC.get.name,new ee(!0,[]));X.set(xC.set.name,new ee(!0,[]));X.set(RY.createTokens.name,new ee(!1,[]));X.set(RY.refreshOperationToken.name,new ee(!1,[]));X.set(yY.login.name,new ee(!1,[]));X.set(yY.logout.name,new ee(!1,[]));X.set(pr.customFunctionsStatus.name,new ee(!0,[]));X.set(pr.getCustomFunctions.name,new ee(!0,[]));X.set(pr.getComponents.name,new ee(!0,[]));X.set(pr.getComponentFile.name,new ee(!0,[]));X.set(pr.setComponentFile.name,new ee(!0,[]));X.set(pr.dropComponent.name,new ee(!0,[]));X.set(pr.getCustomFunction.name,new ee(!0,[]));X.set(pr.setCustomFunction.name,new ee(!0,[]));X.set(pr.dropCustomFunction.name,new ee(!0,[]));X.set(pr.addComponent.name,new ee(!0,[]));X.set(pr.dropCustomFunctionProject.name,new ee(!0,[]));X.set(pr.packageComponent.name,new ee(!0,[]));X.set(pr.deployComponent.name,new ee(!0,[]));X.set(pr.addSSHKey.name,new ee(!0,[]));X.set(pr.updateSSHKey.name,new ee(!0,[]));X.set(pr.deleteSSHKey.name,new ee(!0,[]));X.set(pr.listSSHKeys.name,new ee(!0,[]));X.set(pr.setSSHKnownHosts.name,new ee(!0,[]));X.set(pr.getSSHKnownHosts.name,new ee(!0,[]));X.set(vC.getRegistrationInfo.name,new ee(!1,[]));X.set(Np.userInfo.name,new ee(!1,[]));X.set(Ip.describeAll.name,new ee(!1,[]));X.set(eEe,new ee(!1,[]));X.set(tEe,new ee(!0,[]));X.set(Zpe,new ee(!0,[]));X.set(PT.CSV_DATA_LOAD,new ee(!1,[dc,ql]));X.set(PT.CSV_URL_LOAD,new ee(!1,[dc,ql]));X.set(PT.CSV_FILE_LOAD,new ee(!1,[dc,ql]));X.set(PT.IMPORT_FROM_S3,new ee(!1,[dc,ql]));X.set(LY.EXPORT_TO_S3,new ee(!0,[]));X.set(LY.EXPORT_LOCAL,new ee(!0,[]));X.set(En.VALID_SQL_OPS_ENUM.DELETE,new ee(!1,[CY]));X.set(En.VALID_SQL_OPS_ENUM.SELECT,new ee(!1,[Hs]));X.set(En.VALID_SQL_OPS_ENUM.INSERT,new ee(!1,[dc]));X.set(En.VALID_SQL_OPS_ENUM.UPDATE,new ee(!1,[ql]));MY.exports={verifyPerms:sEe,verifyPermsAst:nEe,verifyBulkLoadAttributePerms:oEe};function nEe(e,t,r){if(Jo.isEmptyOrZeroLength(e))throw wr.info("verify_perms_ast has an empty user parameter"),kn(new Error);if(Jo.isEmptyOrZeroLength(t))throw wr.info("verify_perms_ast has an empty user parameter"),kn(new Error);if(Jo.isEmptyOrZeroLength(r))throw wr.info("verify_perms_ast has a null operation parameter"),kn(new Error);try{let n=new wY,s=new zpe(e),i=s.getSchemas(),a=new Map;if((!i||i.length===0)&&s.affected_attributes&&s.affected_attributes.size>0)throw wr.info("No schemas defined in verifyPermsAst(), will not continue."),kn(new Error);let c=!!t.role.permission.super_user,l=i.includes("system");if(l&&PY[r])throw kn(new Error,Jr.DROP_SYSTEM,Ap.FORBIDDEN);if(c&&!l)return null;let u=TY.getRolePermissions(t.role);t.role.permission=u,!c&&e instanceof Qpe.yy.Select&&(e=s.updateAttributeWildcardsForRolePerms(u));for(let f=0;f<i.length;f++){let m=s.getTablesBySchemaName(i[f]);m&&a.set(i[f],m)}let d=DY(t,r,a,n);return d||(a.forEach((f,m)=>{for(let h=0;h<f.length;h++){let p=s.getAttributesBySchemaTableName(m,f[h]),_=FC(t.role.permission,m,f[h]);BC(p,_,r,f[h],m,n)}}),n.getPermsResponse())}catch(n){throw kn(n)}}o(nEe,"verifyPermsAst");function sEe(e,t){if(e===null||t===null||e.hdb_user===void 0||e.hdb_user===null)throw wr.info("null required parameter in verifyPerms"),kn(new Error,Jr.DEFAULT_INVALID_REQUEST,Ap.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 wY;if(Jo.isEmptyOrZeroLength(e.hdb_user?.role)||Jo.isEmptyOrZeroLength(e.hdb_user?.role?.permission))return wr.info(`User ${e.hdb_user?.username} has no role or permissions. Please assign the user a valid role.`),c.handleUnauthorizedItem(Jr.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(En.SYSTEM_SCHEMA_NAME)||s===En.SYSTEM_SCHEMA_NAME;if(l&&d&&Xpe[e.operation]&&(i===En.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME||i===En.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||i===En.SYSTEM_TABLE_NAMES.USER_TABLE_NAME))return null;if(d&&PY[r])throw kn(new Error,Jr.DROP_SYSTEM,Ap.FORBIDDEN);if(l&&!d||u===!0&&(r===Fs.createSchema.name||r===Fs.dropSchema.name))return null;if(rEe.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=TY.getRolePermissions(e.hdb_user?.role);if(e.hdb_user?.role&&(e.hdb_user.role.permission=f),(r===_Y||r===gY)&&!f.super_user){if(s===En.SYSTEM_SCHEMA_NAME)return c.handleUnauthorizedItem(Jr.SCHEMA_PERM_ERROR(s));if(r===_Y&&(!f[s]||!f[s][bp]))return c.handleInvalidItem(Jr.SCHEMA_NOT_FOUND(s));if(r===gY&&(!f[s]||!f[s].tables[i]||!f[s].tables[i][bp]))return c.handleInvalidItem(Jr.TABLE_NOT_FOUND(s,i))}let m=DY(e.hdb_user,r,a,c,n);if(m)return m;if(X.get(r)&&X.get(r).perms.length===0)return null;if(!l&&e.get_attributes&&En.SEARCH_WILDCARDS.includes(e.get_attributes[0])){let _=[],g=f[s].tables[i];g[En.PERMS_CRUD_ENUM.READ]&&(g.attribute_permissions.length>0?g.attribute_permissions.filter(T=>T[En.PERMS_CRUD_ENUM.READ]).forEach(T=>{_.push(T.attribute_name)}):_=global.hdb_schema[s][i].attributes.map(y=>y.attribute),e.get_attributes=_)}let h=iEe(e),p=FC(e.hdb_user?.role?.permission,s,i);return BC(h,p,r,i,s,c,n),c.getPermsResponse()}o(sEe,"verifyPerms");function DY(e,t,r,n,s){if(Jo.arrayHasEmptyValues([e,t,r]))throw wr.info("hasPermissions has an invalid parameter"),kn(new Error);let i=r.has("system"),a=e.role.permission;if(a.super_user&&(!i||X.get(t).requires_su))return null;if(!X.get(t))throw wr.info(`operation ${t} not found.`),kn(new Error,Jr.OP_NOT_FOUND(t),Ap.BAD_REQUEST);if(X.get(t)&&X.get(t).requires_su)return wr.info(`operation ${t} requires SU permissions.`),n.handleUnauthorizedItem(Jr.OP_IS_SU_ONLY(t));let c=r.keys();for(let l of c){try{if(l&&!a[l]||a[l][bp]===!1){n.addInvalidItem(Jr.SCHEMA_NOT_FOUND(l));continue}}catch{n.addInvalidItem(Jr.SCHEMA_NOT_FOUND(l));continue}let u=r.get(l);for(let d of u){let f=a[l].tables[d];if(!f||f[bp]===!1)n.addInvalidItem(Jr.TABLE_NOT_FOUND(l,d));else try{let m=[],h=X.get(t).perms;!Jo.isEmpty(s)&&h.includes(s)&&(h=[s]);for(let p=0;p<h.length;p++){let _=h[p],g=f[_];(g==null||g===!1)&&(wr.info(`Required ${_} permission not found for ${t} ${s?`${s} `:""}operation in role ${e.role.id}`),m.push(_))}m.length>0&&n.addUnauthorizedTable(l,d,m)}catch(m){let h=Jr.UNKNOWN_OP_AUTH_ERROR(t,l,d);throw wr.error(h),wr.error(m),kn(OY.CHECK_LOGS_WRAPPER(h))}}}return r.size<2?n.getPermsResponse():null}o(DY,"hasPermissions");function BC(e,t,r,n,s,i,a){if(!e||!t)throw wr.info("no attributes specified in checkAttributePerms."),kn(new Error);let c=X.get(r).perms;if(!c||c==="")throw wr.info(`no permissions found for ${r} in checkAttributePerms().`),kn(new Error);if(Jo.isEmptyOrZeroLength(t))return wr.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[bp]===!1){i.addInvalidItem(Jr.ATTR_NOT_FOUND(s,n,d),s,n);continue}if(c)for(let m of c){if(En.TIME_STAMP_NAMES.includes(f.attribute_name)&&m!==Hs)throw kn(new Error,Jr.SYSTEM_TIMESTAMP_PERMS_ERR,Ap.FORBIDDEN);f[m]===!1&&(l[f.attribute_name]?l[f.attribute_name].push(m):l[f.attribute_name]=[m])}}else i.addInvalidItem(Jr.ATTR_NOT_FOUND(s,n,d),s,n)}let u=Object.keys(l);u.length>0&&i.addUnauthorizedAttributes(u,s,n,l)}o(BC,"checkAttributePerms");function iEe(e){let t=new Set;try{if(e.action)return t;if(e.operation===En.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS&&e.conditions.forEach(r=>{t.add(r.search_attribute)}),e&&e.search_attribute&&t.add(e.search_attribute),!e.records||e.records.length===0){if(!e.get_attributes||!e.get_attributes.length===0)return t;for(let r=0;r<e.get_attributes.length;r++)t.add(e.get_attributes[r])}else for(let r=0;r<e.records.length;r++){let n=Object.keys(e.records[r]);for(let s=0;s<n.length;s++)t.add(n[s])}}catch(r){wr.info(r)}return t}o(iEe,"getRecordAttributes");function FC(e,t,r){let n=new Map;if(Jo.isEmpty(e))return wr.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{wr.info(`No attribute permissions found for schema ${t} and table ${r}.`)}return n}o(FC,"getAttributePermissions");function oEe(e,t,r,n,s,i,a){let c=new Set(i),l=FC(e,n,s);BC(c,l,t,s,n,a,r)}o(oEe,"verifyBulkLoadAttributePerms")});var MT=M((K0e,FY)=>{"use strict";FY.exports={evaluateSQL:SEe,processAST:BY,convertSQLToAST:xY,checkASTPermissions:UY};var aEe=vn(),vY=require("util"),cEe=vY.callbackify(aEe.insert),lEe=on().search,uEe=HG().update,dEe=vY.callbackify(uEe),fEe=GG().convertDelete,fc=require("alasql"),mEe=LT(),DT=Q(),hEe=rg(),pEe=ie(),wp=(H(),v(W)),{hdbErrors:EEe,handleHDBError:HC}=ge(),{HTTP_STATUS_CODES:kC}=EEe;hEe(fc);var _Ee=403,gEe="There was a problem performing this insert. Please check the logs and try again.",GC=class{static{o(this,"ParsedSQLObject")}constructor(){this.ast=void 0,this.variant=void 0,this.permissions_checked=!1}};function SEe(e,t){let r=e.parsed_sql_object;if(!r){r=xY(e.sql);let n,s=r.ast.statements[0];if(s instanceof fc.yy.Insert?n=s.into.databaseid:s instanceof fc.yy.Select?n=s.from?s.from[0].databaseid:null:s instanceof fc.yy.Update||s instanceof fc.yy.Delete?n=s.table.databaseid:DT.error("AST in evaluateSQL is not a valid SQL type."),!(s instanceof fc.yy.Select)&&pEe.isEmptyOrZeroLength(n))return t("No schema specified",null)}BY(e,r,(n,s)=>{if(n)return t(n);t(null,s)})}o(SEe,"evaluateSQL");function UY(e,t){let r;try{r=mEe.verifyPermsAst(t.ast.statements[0],e.hdb_user,t.variant),t.permissions_checked=!0}catch(n){throw n}return r||null}o(UY,"checkASTPermissions");function xY(e){let t=new GC;if(!e)throw HC(new Error,"The 'sql' parameter is missing from the request body",kC.BAD_REQUEST);try{let r=e.trim(),n=fc.parse(r),s=r.split(" ")[0].toLowerCase();t.ast=n,t.variant=s}catch(r){let n=r.message.split(`
|
|
31
31
|
`);throw n[1]?HC(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,kC.BAD_REQUEST):HC(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",kC.BAD_REQUEST)}return t}o(xY,"convertSQLToAST");function BY(e,t,r){try{let n=TEe;if(!e.bypass_auth&&!t.permissions_checked){let i=UY(e,t);if(i&&i.length>0)return r(_Ee,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case wp.VALID_SQL_OPS_ENUM.SELECT:n=lEe,s=t.ast.statements[0];break;case wp.VALID_SQL_OPS_ENUM.INSERT:n=REe;break;case wp.VALID_SQL_OPS_ENUM.UPDATE:n=dEe;break;case wp.VALID_SQL_OPS_ENUM.DELETE:n=fEe;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(BY,"processAST");function TEe(e,t){DT.info(e),t("unknown sql statement")}o(TEe,"nullFunction");function REe({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=yEe(i,e.values)}catch(a){return r(a)}cEe(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){DT.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(REe,"convertInsert");function yEe(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]]=fc.compile(`SELECT ${s.toString()} AS [${wp.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw DT.error(r),new Error(gEe)}}o(yEe,"createDataObjects")});var WC=M((j0e,qY)=>{var BT=require("clone"),FT=dt(),AEe=ie(),UT=(H(),v(W)),W0e=Q(),qC=require("fs"),VC=require("joi"),{string:xT}=VC.types(),{hdbErrors:bEe,handleHDBError:vT}=ge(),{HDB_ERROR_MSGS:z0e,HTTP_STATUS_CODES:$C}=bEe,{commonValidators:rf}=Hi(),HY=" is required",IEe=["insert","update","upsert"],KC={database:{presence:!1,format:rf.schema_format,length:rf.schema_length},schema:{presence:!1,format:rf.schema_format,length:rf.schema_length},table:{presence:!0,format:rf.schema_format,length:rf.schema_length},action:{inclusion:{within:IEe,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},NEe={schema:xT.required(),table:xT.required(),action:xT.valid("insert","update","upsert")},{AWS_ACCESS_KEY:wEe,AWS_SECRET:OEe,AWS_BUCKET:CEe,AWS_FILE_KEY:PEe,REGION:LEe}=UT.S3_BUCKET_AUTH_KEYS,DEe={s3:{presence:!0},[`s3.${wEe}`]:{presence:!0,type:"String"},[`s3.${OEe}`]:{presence:!0,type:"String"},[`s3.${CEe}`]:{presence:!0,type:"String"},[`s3.${PEe}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${LEe}`]:{presence:!0,type:"String"}},kY=BT(KC);kY.data.presence={message:HY};var GY=BT(KC);GY.file_path.presence={message:HY};var MEe=Object.assign(BT(KC),DEe),YC=BT(NEe);YC.csv_url=xT.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();YC.passthrough_headers=VC.object();function vEe(e){let t=FT.validateObject(e,kY);return HT(e,t)}o(vEe,"dataObject");function UEe(e){let t=FT.validateBySchema(e,VC.object(YC));return HT(e,t)}o(UEe,"urlObject");function xEe(e){let t=FT.validateObject(e,GY);return HT(e,t)}o(xEe,"fileObject");function BEe(e){let t=FT.validateObject(e,MEe);return HT(e,t)}o(BEe,"s3FileObject");function HT(e,t){if(!t){let r=AEe.checkGlobalSchemaTable(e.schema,e.table);if(r)return vT(new Error,r,$C.BAD_REQUEST);if(e.operation===UT.OPERATIONS_ENUM.CSV_FILE_LOAD)try{qC.accessSync(e.file_path,qC.constants.R_OK|qC.constants.F_OK)}catch(n){return n.code===UT.NODE_ERROR_CODES.ENOENT?vT(n,`No such file or directory ${n.path}`,$C.BAD_REQUEST):n.code===UT.NODE_ERROR_CODES.EACCES?vT(n,`Permission denied ${n.path}`,$C.BAD_REQUEST):vT(n)}}return t}o(HT,"postValidateChecks");qY.exports={dataObject:vEe,urlObject:UEe,fileObject:xEe,s3FileObject:BEe}});var zC=M((J0e,$Y)=>{"use strict";var Op=Q(),kT=(H(),v(W));async function FEe(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===kT.OPERATIONS_ENUM.INSERT||t.operation===kT.OPERATIONS_ENUM.UPDATE||t.operation===kT.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===kT.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(Op.info(i.message),i):i.http_resp_msg?(Op.error(`Error calling operation: ${e.name}`),Op.error(i.http_resp_msg),i):(Op.error(`Error calling operation: ${e.name}`),Op.error(i),i)}}o(FEe,"callOperationFunctionAsAwait");$Y.exports={callOperationFunctionAsAwait:FEe}});var jC=M((Z0e,KY)=>{"use strict";var{S3:HEe,GetObjectCommand:kEe}=require("@aws-sdk/client-s3");KY.exports={getFileStreamFromS3:GEe,getS3AuthObj:VY};async function GEe(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await VY(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new kEe(r))).Body}o(GEe,"getFileStreamFromS3");function VY(e,t,r){return new HEe({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(VY,"getS3AuthObj")});var WY=M((txe,YY)=>{"use strict";var QC=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}},JC=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};YY.exports={BulkLoadFileObject:QC,BulkLoadDataObject:JC}});var ZC=M((nxe,zY)=>{"use strict";var XC=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};zY.exports=XC});var iP=M((lxe,dW)=>{"use strict";var GT=vn(),$T=WC(),qEe=require("needle"),Si=(H(),v(W)),ixe=It(),nf=ie(),{handleHDBError:jt,hdbErrors:nW}=ge(),{HTTP_STATUS_CODES:Xr,HDB_ERROR_MSGS:Or,CHECK_LOGS_WRAPPER:Vl}=nW,sf=Q(),eP=require("papaparse");nf.promisifyPapaParse();var Ti=require("fs-extra"),$Ee=require("path"),{chain:jY}=require("stream-chain"),QY=require("stream-json/streamers/StreamArray"),JY=require("stream-json/utils/Batch"),XY=require("stream-chain/utils/comp"),{finished:ZY}=require("stream"),VEe=oe(),sW=zC(),KEe=jC(),{BulkLoadFileObject:rP,BulkLoadDataObject:YEe}=WY(),nP=PC(),{verifyBulkLoadAttributePerms:iW}=LT(),oxe=ZC(),axe=hr(),cxe=$i(),{databases:WEe}=(De(),v(ht)),{coerceType:zEe}=(w_(),v(pk)),eW="No records parsed from csv file.",$l=`${VEe.get("HDB_ROOT")}/tmp`,{schemaRegex:jEe}=Hi(),tW=1024*1024*2,rW=5e3,QEe={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};dW.exports={csvDataLoad:JEe,csvURLLoad:XEe,csvFileLoad:ZEe,importFromS3:e_e};async function JEe(e,t){let r=$T.dataObject(e);if(r)throw jt(r,r.message,Xr.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=cW(e.schema,e.table),i=eP.parse(e.data,{header:!0,skipEmptyLines:!0,transform:tP.bind(null,s),dynamicTyping:!1}),a=new nP;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&iW(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 jt(new Error,c,Xr.BAD_REQUEST,void 0,void 0,!0);let l=new YEe(e.action,e.schema,e.table,i.data);return n=await sW.callOperationFunctionAsAwait(lW,l,null),n.message===eW?eW:uW(n.records,n.number_written)}catch(s){throw Kl(s)}}o(JEe,"csvDataLoad");async function XEe(e){let t=$T.urlObject(e);if(t)throw jt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${$l}/${r}`;try{await t_e(e,r)}catch(s){throw sf.error(Or.DOWNLOAD_FILE_ERR(r)+" - "+s),jt(s,Vl(Or.DOWNLOAD_FILE_ERR(r)))}try{let s=new rP(this.job_operation_function.name,e.action,e.schema,e.table,n,Si.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await sP(s);return await qT(n),i}catch(s){throw await qT(n),Kl(s)}}o(XEe,"csvURLLoad");async function ZEe(e){let t=$T.fileObject(e);if(t)throw jt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=new rP(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Si.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await sP(r)}catch(n){throw Kl(n)}}o(ZEe,"csvFileLoad");async function e_e(e){let t=$T.s3FileObject(e);if(t)throw jt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=$Ee.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${$l}/${s}`;let i=new rP(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await r_e(s,e);let a=await sP(i);return await qT(r),a}catch(n){throw await qT(r),Kl(n)}}o(e_e,"importFromS3");async function t_e(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await qEe("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 jt(n,s,n.statusCode,Si.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}s_e(r,e.csv_url),await n_e(t,r.raw)}o(t_e,"downloadCSVFile");async function r_e(e,t){try{let r=`${$l}/${e}`;await Ti.mkdirp($l),await Ti.writeFile(`${$l}/${e}`,"",{flag:"a+"});let n=await Ti.createWriteStream(r),s=await KEe.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(){sf.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw sf.error(Or.S3_DOWNLOAD_ERR+" - "+r),jt(r,Vl(Or.S3_DOWNLOAD_ERR))}}o(r_e,"downloadFileFromS3");async function n_e(e,t){try{await Ti.mkdirp($l),await Ti.writeFile(`${$l}/${e}`,t)}catch(r){throw sf.error(Or.WRITE_TEMP_FILE_ERR),jt(r,Vl(Or.DEFAULT_BULK_LOAD_ERR))}}o(n_e,"writeFileToTempFolder");async function qT(e){if(e)try{await Ti.access(e),await Ti.unlink(e)}catch{sf.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(qT,"deleteTempFile");function s_e(e,t){if(e.statusCode!==nW.HTTP_STATUS_CODES.OK)throw jt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,Xr.BAD_REQUEST);if(!QEe[e.headers["content-type"]])throw jt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,Xr.BAD_REQUEST);if(!e.raw)throw jt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,Xr.BAD_REQUEST)}o(s_e,"validateURLResponse");async function sP(e){try{let t;switch(e.file_type){case Si.VALID_S3_FILE_TYPES.CSV:t=await i_e(e);break;case Si.VALID_S3_FILE_TYPES.JSON:t=await o_e(e);break;default:throw jt(new Error,Or.DEFAULT_BULK_LOAD_ERR,Xr.BAD_REQUEST,Si.LOG_LEVELS.ERROR,Or.INVALID_FILE_EXT_ERR(e))}return uW(t.records,t.number_written)}catch(t){throw Kl(t)}}o(sP,"fileLoad");async function oW(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 GT.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&iW(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=jt(c);r(l)}}o(oW,"validateChunk");async function aW(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;nf.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!nf.isEmpty(c)&&!nf.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 sW.callOperationFunctionAsAwait(lW,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=jt(c,Vl(Or.INSERT_CSV_ERR),Xr.INTERNAL_SERVER_ERROR,Si.LOG_LEVELS.ERROR,Or.INSERT_CSV_ERR+" - "+c);r(l)}}o(aW,"insertChunk");async function i_e(e){let t={records:0,number_written:0},r=cW(e.schema,e.table);try{let n=new nP,s=Ti.createReadStream(e.file_path,{highWaterMark:tW});s.setEncoding("utf8"),await eP.parsePromise(s,oW.bind(null,e,n),tP.bind(null,r));let i=n.getPermsResponse();if(i)throw jt(new Error,i,Xr.BAD_REQUEST);return s=Ti.createReadStream(e.file_path,{highWaterMark:tW}),s.setEncoding("utf8"),await eP.parsePromise(s,aW.bind(null,e,t),tP.bind(null,r)),s.destroy(),t}catch(n){throw jt(n,Vl(Or.PAPA_PARSE_ERR),Xr.INTERNAL_SERVER_ERROR,Si.LOG_LEVELS.ERROR,Or.PAPA_PARSE_ERR+n)}}o(i_e,"callPapaParse");function cW(e,t){let r=WEe[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>zEe(i,s));return n}o(cW,"createTransformMap");function tP(e,t,r){let n=e.get(r);return n?n(t):nf.autoCast(t)}o(tP,"typeFunction");async function o_e(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new nP,s=jY([Ti.createReadStream(e.file_path,{encoding:"utf-8"}),QY.withParser(),c=>c.value,new JY({batchSize:rW}),XY(async c=>{await oW(e,n,r,c)})]);await new Promise((c,l)=>{ZY(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw jt(new Error,i,Xr.BAD_REQUEST);let a=jY([Ti.createReadStream(e.file_path,{encoding:"utf-8"}),QY.withParser(),c=>c.value,new JY({batchSize:rW}),XY(async c=>{await aW(e,t,r,c)})]);return await new Promise((c,l)=>{ZY(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw jt(n,Vl(Or.INSERT_JSON_ERR),Xr.INTERNAL_SERVER_ERROR,Si.LOG_LEVELS.ERROR,Or.INSERT_JSON_ERR+n)}}o(o_e,"insertJson");async function lW(e){let t={};try{e.data&&e.data.length>0&&a_e(e.data[0])?t=await c_e(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",sf.info(t.message))}catch(r){throw Kl(r)}return t}o(lW,"callBulkFileLoad");function a_e(e){let t=Object.keys(e);for(let r of t)if(!jEe.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(a_e,"validateColumnNames");async function c_e(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=GT.insert;break;case"update":i=GT.update;break;case"upsert":i=GT.upsert;break;default:throw jt(new Error,Or.INVALID_ACTION_PARAM_ERR(n),Xr.BAD_REQUEST,Si.LOG_LEVELS.ERROR,Or.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=nf.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw Kl(a)}}o(c_e,"bulkFileLoad");function uW(e,t){return`successfully loaded ${t} of ${e} records`}o(uW,"buildResponseMsg");function Kl(e){return jt(e,Vl(Or.DEFAULT_BULK_LOAD_ERR),Xr.INTERNAL_SERVER_ERROR,Si.LOG_LEVELS.ERROR,Or.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(Kl,"buildTopLevelErrMsg")});var cP=M((dxe,SW)=>{"use strict";var aP=on(),l_e=jC(),{AsyncParser:u_e}=require("json2csv"),VT=require("stream"),ds=ie(),oP=require("fs-extra"),d_e=require("path"),ks=Q(),{promisify:hW}=require("util"),Cp=ie(),{handleHDBError:Er,hdbErrors:f_e}=ge(),{HDB_ERROR_MSGS:Gn,HTTP_STATUS_CODES:_r}=f_e,{streamAsJSON:m_e}=(fA(),v(Sv)),{Upload:h_e}=require("@aws-sdk/lib-storage"),{toCsvStream:p_e}=(To(),v(Cv)),fW=["search_by_value","search_by_hash","sql","search_by_conditions"],mW=["json","csv"],pW="json",EW="csv",E_e="Successfully exported JSON locally.",__e="Successfully exported CSV locally.",g_e=1e3,S_e=aP.searchByHash,T_e=aP.searchByValue,R_e=hW(VT.finished);SW.exports={export_to_s3:I_e,export_local:y_e};async function y_e(e){ks.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=_W(e);if(!ds.isEmpty(t))throw ks.error(t),Er(new Error,t,_r.BAD_REQUEST,void 0,void 0,!0);if(ds.isEmpty(e.path))throw ks.error(Gn.MISSING_VALUE("path")),Er(new Error,Gn.MISSING_VALUE("path"),_r.BAD_REQUEST,void 0,void 0,!0);let r=(ds.isEmpty(e.filename)?new Date().getTime():e.filename)+"."+e.format;e.path.endsWith(d_e.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=ds.buildFolderPath(e.path,r);await A_e(e.path);let s=await gW(e);return await b_e(n,e.format,s)}o(y_e,"export_local");async function A_e(e){if(ks.trace("in confirmPath"),ds.isEmptyOrZeroLength(e))throw Er(new Error,`Invalid path: ${e}`,_r.BAD_REQUEST,void 0,void 0,!0);let t;try{t=await oP.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,ks.error(n),Er(new Error,n,_r.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 ks.error(r),Er(new Error,r,_r.BAD_REQUEST,void 0,void 0,!0)}return!0}o(A_e,"confirmPath");async function b_e(e,t,r){if(ks.trace("in saveToLocal"),Cp.isEmptyOrZeroLength(e))throw Er(new Error,Gn.INVALID_VALUE("file_path"),_r.BAD_REQUEST,void 0,void 0,!0);if(Cp.isEmptyOrZeroLength(t))throw Er(new Error,Gn.INVALID_VALUE("Source format"),_r.BAD_REQUEST,void 0,void 0,!0);if(Cp.isEmpty(r))throw Er(new Error,Gn.NOT_FOUND("Data"),_r.BAD_REQUEST,void 0,void 0,!0);if(t===pW){let n=oP.createWriteStream(e);return m_e(r).pipe(n),await R_e(n),{message:E_e,path:e}}else if(t===EW){let n=oP.createWriteStream(e),s=VT.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new u_e(i,c).fromInput(s).toOutput(n).promise(!1),{message:__e,path:e}}throw Er(new Error,Gn.INVALID_VALUE("format"),_r.BAD_REQUEST)}o(b_e,"saveToLocal");async function I_e(e){if(!e.s3||Object.keys(e.s3).length===0)throw Er(new Error,Gn.MISSING_VALUE("S3 object"),_r.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.aws_access_key_id))throw Er(new Error,Gn.MISSING_VALUE("aws_access_key_id"),_r.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.aws_secret_access_key))throw Er(new Error,Gn.MISSING_VALUE("aws_secret_access_key"),_r.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.bucket))throw Er(new Error,Gn.MISSING_VALUE("bucket"),_r.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.key))throw Er(new Error,Gn.MISSING_VALUE("key"),_r.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.region))throw Er(new Error,Gn.MISSING_VALUE("region"),_r.BAD_REQUEST);let t=_W(e);if(!ds.isEmpty(t))throw Er(new Error,t,_r.BAD_REQUEST);ks.trace(`called export_to_s3 to bucket: ${e.s3.bucket} and query ${e.search_operation.sql}`);let r;try{r=await gW(e)}catch(l){throw ks.error(l),l}let n,s=await l_e.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new VT.PassThrough;if(e.format===EW){i=e.s3.key+".csv";let l=p_e(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===pW){i=e.s3.key+".json";let l=new VT.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 h=f===u-1?JSON.stringify(m):JSON.stringify(m)+",";d+=h,f!==0&&f%g_e===0&&(l.push(d),d="")}d.length!==0&&l.push(d),l.push("]"),l.push(null)}else throw Er(new Error,Gn.INVALID_VALUE("format"),_r.BAD_REQUEST);return new h_e({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(I_e,"export_to_s3");function _W(e){if(ks.trace("in exportCoreValidation"),ds.isEmpty(e.format))return"format missing";if(mW.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${mW.join(", ")}`;let t=e.search_operation.operation;if(ds.isEmpty(t))return"search_operation.operation missing";if(fW.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${fW.join(", ")}`}o(_W,"exportCoreValidation");async function gW(e){ks.trace("in getRecords");let t,r;if(Cp.isEmpty(e.search_operation)||Cp.isEmptyOrZeroLength(e.search_operation.operation))throw Er(new Error,Gn.INVALID_VALUE("Search operation"),_r.BAD_REQUEST);switch(e.search_operation.operation){case"search_by_value":t=T_e;break;case"search_by_hash":t=S_e;break;case"search_by_conditions":t=aP.searchByConditions;break;case"sql":{let n=MT();t=hW(n.evaluateSQL);break}default:throw r=`Operation ${e.search_operation.operation} is not support by export.`,ks.error(r),Er(new Error,r,_r.BAD_REQUEST)}return e.search_operation.hdb_user=e.hdb_user,t(e.search_operation)}o(gW,"getRecords")});var RW=M((mxe,TW)=>{"use strict";var lP=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};TW.exports=lP});var bW=M((pxe,AW)=>{"use strict";var N_e=(H(),v(W)),yW=require("moment"),w_e=require("uuid").v4,uP=class{static{o(this,"JobObject")}constructor(){this.id=w_e(),this.type=void 0,this.start_datetime=yW().valueOf(),this.created_datetime=yW().valueOf(),this.end_datetime=void 0,this.status=N_e.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};AW.exports=uP});var dP=M((_xe,DW)=>{"use strict";var O_e=require("uuid").v4,CW=vn(),PW=on(),C_e=oi(),P_e=Gu(),L_e=RW(),Ct=(H(),v(W)),D_e=bW(),M_e=Jg(),Ri=Q(),v_e=Xf(),of=ie(),{promisify:U_e}=require("util"),Yl=require("moment"),x_e=MT(),KT=WC(),IW=II(),{deleteTransactionLogsBeforeValidator:B_e}=pC(),{handleHDBError:NW,hdbErrors:F_e,ClientError:H_e}=ge(),{HTTP_STATUS_CODES:wW}=F_e,OW=PW.searchByValue,k_e=PW.searchByHash,G_e=CW.insert,q_e=U_e(x_e.evaluateSQL),$_e=CW.update;DW.exports={addJob:Y_e,updateJob:z_e,handleGetJob:V_e,handleGetJobsByStartDate:K_e,getJobById:LW};async function V_e(e){if(e.id===void 0)throw new H_e("'id' is required");let t=await LW(e.id);return of.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(V_e,"handleGetJob");async function K_e(e){try{let t=await W_e(e);if(Ri.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=Yl(r.start_datetime)),r.end_datetime&&(r.end_datetime_converted=Yl(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 Ri.error(r),new Error(r)}}o(K_e,"handleGetJobsByStartDate");async function Y_e(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||of.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return Ri.info(d),t.error=d,t}if(!Ct.JOB_TYPE_ENUM[e.operation])return Ri.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Ct.OPERATIONS_ENUM.CSV_FILE_LOAD:n=KT.fileObject(e);break;case Ct.OPERATIONS_ENUM.CSV_URL_LOAD:n=KT.urlObject(e);break;case Ct.OPERATIONS_ENUM.CSV_DATA_LOAD:n=KT.dataObject(e);break;case Ct.OPERATIONS_ENUM.IMPORT_FROM_S3:n=KT.s3FileObject(e);break;case Ct.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Ct.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=IW(e,"date");break;case Ct.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=IW(e,"timestamp");break;case Ct.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=B_e(e);break;case Ct.OPERATIONS_ENUM.RESTART_SERVICE:if(Ct.HDB_PROCESS_SERVICES[e.service]===void 0)throw NW(new Error,"Invalid service",wW.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw NW(n,n.message,wW.BAD_REQUEST,void 0,void 0,!0);let s=new D_e;s.type=e.operation===Ct.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE?Ct.OPERATIONS_ENUM.DELETE_FILES_BEFORE:e.operation,s.type=e.operation,s.user=e.hdb_user?.username;let i=new C_e(Ct.SYSTEM_SCHEMA_NAME,Ct.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await OW(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return Ri.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=O_e();try{a=await OW(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return Ri.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return Ri.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new v_e(Ct.SYSTEM_SCHEMA_NAME,Ct.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await G_e(l)}catch(d){return Ri.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,Ri.trace(d)}return t}o(Y_e,"addJob");async function W_e(e){let t=Yl(e.from_date,Yl.ISO_8601),r=Yl(e.to_date,Yl.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 L_e(n,e.hdb_user);try{return await q_e(s)}catch(i){throw Ri.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(W_e,"getJobsInDateRange");async function LW(e){if(of.isEmptyOrZeroLength(e))return of.errorizeMessage("Invalid job ID specified.");let t=new P_e(Ct.SYSTEM_SCHEMA_NAME,Ct.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await k_e(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return Ri.error(n),of.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(LW,"getJobById");async function z_e(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(of.isEmptyOrZeroLength(e.id))throw new Error("invalid ID passed to updateJob");(e.status===Ct.JOB_STATUS_ENUM.COMPLETE||e.status===Ct.JOB_STATUS_ENUM.ERROR)&&(e.end_datetime=Yl().valueOf());let t=new M_e(Ct.SYSTEM_SCHEMA_NAME,Ct.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await $_e(t),r}o(z_e,"updateJob")});var kW=M((Sxe,HW)=>{"use strict";var MW=ie(),Cr=(H(),v(W)),j_e=require("moment"),YT=iP(),Pp=Q(),vW=dP(),UW=cP(),xW=dl(),BW=st(),Q_e=AT(),J_e=Qd(),{parentPort:X_e,isMainThread:FW}=require("worker_threads"),{onMessageByType:Z_e}=st(),fP=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function ege(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(MW.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(MW.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case Cr.JOB_TYPE_ENUM.csv_file_load:await to(e,YT.csvFileLoad);break;case Cr.JOB_TYPE_ENUM.csv_url_load:await to(e,YT.csvURLLoad);break;case Cr.JOB_TYPE_ENUM.csv_data_load:await to(e,YT.csvDataLoad);break;case Cr.JOB_TYPE_ENUM.import_from_s3:await to(e,YT.importFromS3);break;case Cr.JOB_TYPE_ENUM.empty_trash:break;case Cr.JOB_TYPE_ENUM.export_local:await to(e,UW.export_local);break;case Cr.JOB_TYPE_ENUM.export_to_s3:await to(e,UW.export_to_s3);break;case Cr.JOB_TYPE_ENUM.delete_files_before:case Cr.JOB_TYPE_ENUM.delete_records_before:await to(e,xW.deleteFilesBefore);break;case Cr.JOB_TYPE_ENUM.delete_audit_logs_before:await to(e,xW.deleteAuditLogsBefore);break;case Cr.JOB_TYPE_ENUM.delete_transaction_logs_before:await to(e,Q_e.deleteTransactionLogsBefore);break;case Cr.JOB_TYPE_ENUM.restart_service:return await to(e,J_e.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(ege,"parseMessage");async function to(e,t){try{e.job.status=Cr.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=j_e().valueOf(),await vW.updateJob(e.job),await tge(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):Pp.error(`There was an error running ${t.name} job with id ${e.job.id}`),Pp.error(n),e.job.message=n,e.job.status=Cr.JOB_STATUS_ENUM.ERROR;try{await vW.updateJob(e.job)}catch(s){throw Pp.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(to,"runJob");async function tge(e){Pp.trace("launching job thread:",e),FW?BW.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Cr.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):X_e.postMessage({type:Cr.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(tge,"launchJobThread");FW&&Z_e(Cr.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{BW.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Cr.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){Pp.error(r)}});HW.exports={parseMessage:ege,RunnerMessage:fP}});var qW=M((Rxe,GW)=>{"use strict";var rge=ie(),mP=oe(),mc=(H(),v(W)),nge=It(),sge=hr(),ro=Q(),ige=ZC(),oge=$i();mP.initSync();GW.exports={postOperationHandler:cge,sendOperationTransaction:Lp};async function Lp(e,t,r,n){if(e.schema===mc.SYSTEM_SCHEMA_NAME)return;let s=age(e,t,r);s&&(ro.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await sge.publishToStream(`${nge.SUBJECT_PREFIXES.TXN}.${e.schema}`,oge.createNatsTableStreamName(e.schema,e.table),n,s))}o(Lp,"sendOperationTransaction");function age(e,t,r){if(rge.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===mc.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(age,"convertCRUDOperationToTransaction");async function cge(e,t,r){if(!mP.get(mc.CONFIG_PARAMS.CLUSTERING_ENABLED))return;ro.trace(`postOperationHandler called for operation ${e.operation} on schema.table: ${e.schema}.${e.table}`);let n=e.hdb_user?.username,s=mP.get(mc.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new ige(t.txn_time,n,s);switch(e.operation){case mc.OPERATIONS_ENUM.INSERT:try{await Lp(e,t.inserted_hashes,i,r)}catch(a){ro.error("There was an error calling clustering postOperationHandler for insert."),ro.error(a)}break;case mc.OPERATIONS_ENUM.DELETE:try{await Lp(e,t.deleted_hashes,i,r)}catch(a){ro.error("There was an error calling clustering postOperationHandler for delete."),ro.error(a)}break;case mc.OPERATIONS_ENUM.UPDATE:try{await Lp(e,t.update_hashes,i,r)}catch(a){ro.error("There was an error calling clustering postOperationHandler for update."),ro.error(a)}break;case mc.OPERATIONS_ENUM.UPSERT:try{await Lp(e,t.upserted_hashes,i,r)}catch(a){ro.error("There was an error calling clustering postOperationHandler for upsert."),ro.error(a)}break;default:break}return t}o(cge,"postOperationHandler")});var J,$W=ue(()=>{J=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 mC={};Oe(mC,{chooseOperation:()=>cz,executeJob:()=>Gs,getOperationFunction:()=>lz,operation:()=>yP,processLocalTransaction:()=>az});async function az(e,t){try{if(e.body.operation!=="read_log"&&(Up.default.log_level===qf.INFO||Up.default.log_level===qf.DEBUG||Up.default.log_level===qf.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;_n.info(c)}}catch(n){_n.error(n)}let r=await iz.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return dge[e.body.operation]&&tz.default.setSchemaDataToGlobal(n=>{n&&_n.error(n)}),r}function cz(e){let t;try{t=lz(e)}catch(s){throw _n.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=e.operation==="sql"?e.sql:e.search_operation.sql,i=jT.default.convertSQLToAST(s);if(e.parsed_sql_object=i,!e.bypass_auth){let a=jT.default.checkASTPermissions(e,i);if(a)throw _n.error(`${VW.FORBIDDEN} from operation ${e.operation}`),_n.warn(`User '${e.hdb_user?.username}' is not permitted to ${e.operation}`),(0,qs.handleHDBError)(new Error,a,qs.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,void 0,!0)}}else if(!e.bypass_auth&&e.operation!==q.CREATE_AUTHENTICATION_TOKENS&&e.operation!==q.LOGIN&&e.operation!==q.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=ez.default.verifyPerms(i,s);if(a)throw _n.error(`${VW.FORBIDDEN} from operation ${e.operation}`),_n.warn(`User '${i.hdb_user?.username}' is not permitted to ${i.operation}`),(0,qs.handleHDBError)(new Error,a,qs.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,!1,!0)}}catch(s){throw(0,qs.handleHDBError)(s,"There was an error when trying to choose an operation path")}return r}function lz(e){if(_n.trace(`getOperationFunction with operation: ${e.operation}`),KW.has(e.operation))return KW.get(e.operation);throw(0,qs.handleHDBError)(new Error,qs.hdbErrors.HDB_ERROR_MSGS.OP_NOT_FOUND(e.operation),qs.hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}function yP(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=cz(e);return az({body:e},n)}async function fge(e){_n.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[$y]=!0;let a;switch(i.operation){case q.INSERT:a=await zl.default.insert(i);break;case q.UPDATE:a=await zl.default.update(i);break;case q.UPSERT:a=await zl.default.upsert(i);break;case q.DELETE:a=await lf.default.deleteRecord(i);break;default:_n.warn("invalid operation in catchup");break}await oz.transactToClusteringUtils.postOperationHandler(i,a,e)}catch(a){_n.info("Invalid operation in transaction"),_n.error(a)}}async function Gs(e){(0,sz.transformReq)(e);let t,r;try{if(r=await QT.default.addJob(e),r){t=r.createdJob,_n.info("addJob result",r);let n=new _P.default.RunnerMessage(t,e);return{message:await _P.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 _n.error(i),(0,qs.handleHDBError)(n,i)}}function mge(){let e=new Map;return e.set(q.INSERT,new J(zl.default.insert)),e.set(q.UPDATE,new J(zl.default.update)),e.set(q.UPSERT,new J(zl.default.upsert)),e.set(q.SEARCH_BY_CONDITIONS,new J(cf.default.searchByConditions)),e.set(q.SEARCH_BY_HASH,new J(cf.default.searchByHash)),e.set(q.SEARCH_BY_ID,new J(cf.default.searchByHash)),e.set(q.SEARCH_BY_VALUE,new J(cf.default.searchByValue)),e.set(q.SEARCH,new J(lge)),e.set(q.SQL,new J(uge)),e.set(q.CSV_DATA_LOAD,new J(Gs,Dp.default.csvDataLoad)),e.set(q.CSV_FILE_LOAD,new J(Gs,Dp.default.csvFileLoad)),e.set(q.CSV_URL_LOAD,new J(Gs,Dp.default.csvURLLoad)),e.set(q.IMPORT_FROM_S3,new J(Gs,Dp.default.importFromS3)),e.set(q.CREATE_SCHEMA,new J(yi.default.createSchema)),e.set(q.CREATE_DATABASE,new J(yi.default.createSchema)),e.set(q.CREATE_TABLE,new J(yi.default.createTable)),e.set(q.CREATE_ATTRIBUTE,new J(yi.default.createAttribute)),e.set(q.DROP_SCHEMA,new J(yi.default.dropSchema)),e.set(q.DROP_DATABASE,new J(yi.default.dropSchema)),e.set(q.DROP_TABLE,new J(yi.default.dropTable)),e.set(q.DROP_ATTRIBUTE,new J(yi.default.dropAttribute)),e.set(q.DESCRIBE_SCHEMA,new J(Mp.default.describeSchema)),e.set(q.DESCRIBE_DATABASE,new J(Mp.default.describeSchema)),e.set(q.DESCRIBE_TABLE,new J(Mp.default.describeTable)),e.set(q.DESCRIBE_ALL,new J(Mp.default.describeAll)),e.set(q.DELETE,new J(lf.default.deleteRecord)),e.set(q.ADD_USER,new J(af.default.addUser)),e.set(q.ALTER_USER,new J(af.default.alterUser)),e.set(q.DROP_USER,new J(af.default.dropUser)),e.set(q.LIST_USERS,new J(af.default.listUsersExternal)),e.set(q.LIST_ROLES,new J(vp.default.listRoles)),e.set(q.ADD_ROLE,new J(vp.default.addRole)),e.set(q.ALTER_ROLE,new J(vp.default.alterRole)),e.set(q.DROP_ROLE,new J(vp.default.dropRole)),e.set(q.USER_INFO,new J(af.default.userInfo)),e.set(q.READ_LOG,new J(WW.default)),e.set(q.ADD_NODE,new J(zW.default)),e.set(q.UPDATE_NODE,new J(hP.default)),e.set(q.SET_NODE_REPLICATION,new J(hP.default)),e.set(q.REMOVE_NODE,new J(jW.default)),e.set(q.CONFIGURE_CLUSTER,new J(QW.default)),e.set(q.PURGE_STREAM,new J(JW.default)),e.set(q.SET_CONFIGURATION,new J(gP.default.setConfiguration)),e.set(q.CLUSTER_STATUS,new J(XW.default.clusterStatus)),e.set(q.CLUSTER_NETWORK,new J(ZW.default)),e.set(q.CLUSTER_SET_ROUTES,new J(WT.default.setRoutes)),e.set(q.CLUSTER_GET_ROUTES,new J(WT.default.getRoutes)),e.set(q.CLUSTER_DELETE_ROUTES,new J(WT.default.deleteRoutes)),e.set(q.EXPORT_TO_S3,new J(Gs,pP.default.export_to_s3)),e.set(q.CREATE_CSR,new J(Wl.default.createCsr)),e.set(q.SIGN_CERTIFICATE,new J(Wl.default.signCertificate)),e.set(q.LIST_CERTIFICATES,new J(Wl.default.listCertificates)),e.set(q.ADD_CERTIFICATES,new J(Wl.default.addCertificate)),e.set(q.REMOVE_CERTIFICATE,new J(Wl.default.removeCertificate)),e.set(q.GET_KEY,new J(Wl.default.getKey)),e.set(q.ADD_NODE_BACK,new J(aO)),e.set(q.REMOVE_NODE_BACK,new J(cO)),e.set(q.DELETE_FILES_BEFORE,new J(Gs,lf.default.deleteFilesBefore)),e.set(q.DELETE_RECORDS_BEFORE,new J(Gs,lf.default.deleteFilesBefore)),e.set(q.EXPORT_LOCAL,new J(Gs,pP.default.export_local)),e.set(q.SEARCH_JOBS_BY_START_DATE,new J(QT.default.handleGetJobsByStartDate)),e.set(q.GET_JOB,new J(QT.default.handleGetJob)),e.set(q.GET_FINGERPRINT,new J(zT.default.getFingerprint)),e.set(q.SET_LICENSE,new J(zT.default.setLicense)),e.set(q.GET_REGISTRATION_INFO,new J(zT.default.getRegistrationInfo)),e.set(q.RESTART,new J(EP.default.restart)),e.set(q.RESTART_SERVICE,new J(Gs,EP.default.restartService)),e.set(q.CATCHUP,new J(fge)),e.set(q.SYSTEM_INFORMATION,new J(rz.default.systemInformation)),e.set(q.DELETE_AUDIT_LOGS_BEFORE,new J(Gs,lf.default.deleteAuditLogsBefore)),e.set(q.READ_AUDIT_LOG,new J(YW.default)),e.set(q.CREATE_AUTHENTICATION_TOKENS,new J(QN)),e.set(q.REFRESH_OPERATION_TOKEN,new J(JN)),e.set(q.LOGIN,new J(iC)),e.set(q.LOGOUT,new J(oC)),e.set(q.GET_CONFIGURATION,new J(gP.default.getConfiguration)),e.set(q.CUSTOM_FUNCTIONS_STATUS,new J(Pt.default.customFunctionsStatus)),e.set(q.GET_CUSTOM_FUNCTIONS,new J(Pt.default.getCustomFunctions)),e.set(q.GET_COMPONENT_FILE,new J(Pt.default.getComponentFile)),e.set(q.GET_COMPONENTS,new J(Pt.default.getComponents)),e.set(q.SET_COMPONENT_FILE,new J(Pt.default.setComponentFile)),e.set(q.DROP_COMPONENT,new J(Pt.default.dropComponent)),e.set(q.GET_CUSTOM_FUNCTION,new J(Pt.default.getCustomFunction)),e.set(q.SET_CUSTOM_FUNCTION,new J(Pt.default.setCustomFunction)),e.set(q.DROP_CUSTOM_FUNCTION,new J(Pt.default.dropCustomFunction)),e.set(q.ADD_CUSTOM_FUNCTION_PROJECT,new J(Pt.default.addComponent)),e.set(q.ADD_COMPONENT,new J(Pt.default.addComponent)),e.set(q.DROP_CUSTOM_FUNCTION_PROJECT,new J(Pt.default.dropCustomFunctionProject)),e.set(q.PACKAGE_CUSTOM_FUNCTION_PROJECT,new J(Pt.default.packageComponent)),e.set(q.PACKAGE_COMPONENT,new J(Pt.default.packageComponent)),e.set(q.DEPLOY_CUSTOM_FUNCTION_PROJECT,new J(Pt.default.deployComponent)),e.set(q.DEPLOY_COMPONENT,new J(Pt.default.deployComponent)),e.set(q.READ_TRANSACTION_LOG,new J(SP.default.readTransactionLog)),e.set(q.DELETE_TRANSACTION_LOGS_BEFORE,new J(Gs,SP.default.deleteTransactionLogsBefore)),e.set(q.INSTALL_NODE_MODULES,new J(TP.default.installModules)),e.set(q.AUDIT_NODE_MODULES,new J(TP.default.auditModules)),e.set(q.GET_BACKUP,new J(yi.default.getBackup)),e.set(q.CLEANUP_ORPHAN_BLOBS,new J(yi.default.cleanupOrphanBlobs)),e.set(q.ADD_SSH_KEY,new J(Pt.default.addSSHKey)),e.set(q.UPDATE_SSH_KEY,new J(Pt.default.updateSSHKey)),e.set(q.DELETE_SSH_KEY,new J(Pt.default.deleteSSHKey)),e.set(q.LIST_SSH_KEYS,new J(Pt.default.listSSHKeys)),e.set(q.SET_SSH_KNOWN_HOSTS,new J(Pt.default.setSSHKnownHosts)),e.set(q.GET_SSH_KNOWN_HOSTS,new J(Pt.default.getSSHKnownHosts)),e.set(q.GET_ANALYTICS,new J(_C)),e.set(q.LIST_METRICS,new J(gC)),e.set(q.DESCRIBE_METRIC,new J(SC)),e.set(q.GET_STATUS,new J(bC)),e.set(q.SET_STATUS,new J(IC)),e.set(q.CLEAR_STATUS,new J(AC)),e}var cf,jT,Dp,yi,Mp,lf,YW,af,vp,Pt,Up,WW,zW,hP,jW,QW,JW,XW,ZW,WT,pP,ez,QT,qs,zT,EP,RP,zl,tz,rz,_P,gP,SP,TP,nz,sz,Wl,iz,oz,VW,_n,lge,uge,dge,KW,hC=ue(()=>{cf=w(on()),jT=w(MT()),Dp=w(iP()),yi=w(Hh()),Mp=w(xa()),lf=w(dl()),YW=w(Uw()),af=w(ts()),vp=w(Th()),Pt=w(fC()),Up=w(Q()),WW=w(kw()),zW=w(qS()),hP=w(mO()),jW=w(VS()),QW=w(EO()),JW=w(_O()),XW=w(TO()),ZW=w(yO()),WT=w(jS()),pP=w(cP()),ez=w(LT()),QT=w(dP());H();qs=w(ge()),zT=w(UO()),EP=w(Qd()),RP=w(require("util")),zl=w(vn()),tz=w(si()),rz=w(Ud()),_P=w(kW());hd();pT();gP=w(bt()),SP=w(AT()),TP=w(fp()),nz=w(Xs()),sz=w(ie());Mr();Wl=w(os());Bd();RC();iz=w(zC()),oz=w(qW());yp();$W();({HTTP_STATUS_CODES:VW}=qs.hdbErrors),_n=Up.default.loggerWithTag("operation"),lge=RP.promisify(cf.default.search),uge=RP.promisify(jT.default.evaluateSQL),dge={[q.CREATE_ATTRIBUTE]:!0,[q.CREATE_TABLE]:!0,[q.CREATE_SCHEMA]:!0,[q.DROP_ATTRIBUTE]:!0,[q.DROP_TABLE]:!0,[q.DROP_SCHEMA]:!0};o(az,"processLocalTransaction");KW=mge();Le.operation=yP;o(cz,"chooseOperation");o(lz,"getOperationFunction");(0,nz._assignPackageExport)("operation",yP);o(yP,"operation");o(fge,"catchup");o(Gs,"executeJob");o(mge,"initializeOperationFunctionMap")});var ZT=M((Oxe,fz)=>{"use strict";var JT=(H(),v(W)),hge=ie(),xp=Q(),{handleHDBError:AP,hdbErrors:XT}=ge(),{isMainThread:pge}=require("worker_threads"),{Readable:Ege}=require("stream"),uz=require("os"),_ge=require("util"),gge=ZN(),Sge=_ge.promisify(gge.authorize),dz=(hC(),v(mC)),{createGzip:Tge,constants:Rge}=require("zlib"),yge=[JT.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,JT.OPERATIONS_ENUM.LOGIN,JT.OPERATIONS_ENUM.LOGOUT];function Age(e){let t=`Found an uncaught exception with message: ${e.message}. ${uz.EOL}Stack: ${e.stack} ${uz.EOL}Terminating ${pge?"HDB":"thread"}.`;console.error(t),xp.fatal(t),process.exit(1)}o(Age,"handleServerUncaughtException");function bge(e,t,r){if(xp[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:XT.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(bge,"serverErrorHandler");function Ige(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=AP(new Error,"Invalid JSON.",XT.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(hge.isEmpty(e.body.operation)){let n=AP(new Error,"Request body must include an 'operation' property.",XT.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(Ige,"reqBodyValidationHandler");function Nge(e,t,r){let n;!yge.includes(e.body.operation)||e.body.operation===JT.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?Sge(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{xp.warn(i),xp.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(AP(i,a,XT.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(Nge,"authHandler");async function wge(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=dz.chooseOperation(e.body);let s=await dz.processLocalTransaction(e,n);if(s instanceof Ege&&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(Tge({level:Rge.Z_BEST_SPEED})))}return s}catch(s){throw xp.error(s),s}}o(wge,"handlePostRequest");fz.exports={authHandler:Nge,handlePostRequest:wge,handleServerUncaughtException:Age,serverErrorHandler:bge,reqBodyValidationHandler:Ige}});var Ez=M((Pxe,pz)=>{"use strict";var Oge=require("fastify-plugin"),{handlePostRequest:mz,authHandler:Cge,reqBodyValidationHandler:Pge}=ZT();async function Lge(e){e.decorate("hdbCore",{preValidation:[Pge,Cge],request:o(t=>hz(mz(t,response)),"request"),requestWithoutAuthentication:o((t,r)=>hz(mz(t,r,!0)),"requestWithoutAuthentication")})}o(Lge,"hdbCore");async function hz(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(hz,"convertAsyncIterators");pz.exports=Oge(Lge)});var gz=M((Mxe,_z)=>{"use strict";var Dxe=require("fs"),eR=oe();eR.initSync();var{CONFIG_PARAMS:bP}=(H(),v(W)),Dge=1024*1024*1024;function Mge(e){let t=eR.get(bP.HTTP_TIMEOUT),r=eR.get(bP.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:Dge,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:eR.get(bP.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(Mge,"getServerOptions");_z.exports=Mge});var Rz=M((Uxe,Tz)=>{"use strict";var IP=oe();IP.initSync();var{CONFIG_PARAMS:Sz}=(H(),v(W));function vge(){let e=IP.get(Sz.HTTP_CORSACCESSLIST),t=IP.get(Sz.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(vge,"getCORSOptions");Tz.exports=vge});var bz=M((Bxe,Az)=>{"use strict";var yz=oe();yz.initSync();var Uge=(H(),v(W));function xge(){return yz.get(Uge.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(xge,"getHeaderTimeoutConfig");Az.exports=xge});var wP={};Oe(wP,{customFunctionsServer:()=>Hge,ready:()=>Fz,start:()=>Fge});function Fge(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){Xo||(Xo=Bz(t),Le.http((await Xo).server));let a=await Xo,c=(0,NP.dirname)(s),l=(0,NP.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!Iz.has(c)){Iz.add(c);try{a.register(Gge(c,l))}catch(u){if(u.message==="Root plugin has already booted")St.warn(`Could not load root fastify route for ${s}, this may require a restart to install properly`);else throw u}}},ready:Fz}}async function Hge(){try{St.info("In Custom Functions Fastify server"+process.cwd()),St.info(`Custom Functions Running with NODE_ENV set as: ${process.env.NODE_ENV}`),St.debug(`Custom Functions server process ${process.pid} starting up.`),await kge();let e=Lz.get(U.HTTP_SECUREPORT)>0,t;try{t=Xo=await Bz(e)}catch(r){throw St.error(`Custom Functions buildServer error: ${r}`),r}try{await t.ready()}catch(r){throw St.error(`Custom Functions server.ready() error: ${r}`),r}t.server.cantCleanupProperly=!0}catch(e){St.error(`Custom Functions ${process.pid} Error: ${e}`),St.error(e),process.exit(1)}}async function kge(){try{St.info("Custom Functions starting configuration."),await Dz.setUsersWithRolesCache(),St.info("Custom Functions completed configuration.")}catch(e){St.error(e)}}function Gge(e,t){return async function(r){try{St.info("Custom Functions starting buildRoutes"),St.trace("Loading fastify routes folder "+e),(0,Nz.existsSync)(e)&&r.register(Pz.default,s=>({dir:e,dirNameRoutePrefix:!1,options:{hdbCore:s.hdbCore,logger:St.loggerWithTag("custom-function"),prefix:`/${t}`}})).after((s,i,a)=>{s?.message?St.error(s.message):s&&St.error(s),a()})}catch(n){St.error(`Custom Functions errored buildRoutes: ${n}`)}}}async function Bz(e){St.info("Custom Functions starting buildServer.");let t=(0,Mz.default)(e),r=(0,wz.default)(t);r.server.headersTimeout=(0,Uz.default)(),r.setErrorHandler(xz.serverErrorHandler);let n=(0,vz.default)();return n&&r.register(Oz.default,n),r.register(function(s,i,a){s.setNotFoundHandler(function(c,l){r.server.emit("unhandled",c.raw,l.raw)}),a()}),r.register(Cz.default),await r.register(Bge),await r.after(),om(r),St.info("Custom Functions completed buildServer."),r}function Fz(){if(Xo)return Xo.then?Xo.then(e=>e.ready()):Xo.ready()}var NP,Nz,wz,Oz,Cz,Pz,Lz,St,Bge,Dz,Mz,vz,Uz,xz,Xo,Iz,Hz=ue(()=>{NP=require("path"),Nz=require("fs"),wz=w(require("fastify")),Oz=w(require("@fastify/cors")),Cz=w(YN()),Pz=w(require("@fastify/autoload")),Lz=w(oe());H();St=w(Q()),Bge=w(Ez()),Dz=w(ts()),Mz=w(gz()),vz=w(Rz()),Uz=w(bz()),xz=w(ZT());To();Mr();Iz=new Set;o(Fge,"start");o(Hge,"customFunctionsServer");o(kge,"setUp");o(Gge,"buildRouteFolder");o(Bz,"buildServer");o(Fz,"ready")});var OP={};Oe(OP,{start:()=>qge});function qge(e){return{handleDirectory(t,r){if(t==="/"){let n=(0,Vz.default)(r,e);return e.server.http(async(s,i)=>{if(!s.isWebSocket)return new Promise(a=>n(s._nodeRequest,s._nodeResponse,()=>{a(i(s))}))}),!0}},handleFile(t,r,n){Gz||(Gz=!0,e.server.http(async(s,i)=>{if(!s.isWebSocket){let a=kz.get(s.pathname);if(a)return{handlesHeaders:!0,body:(0,qz.default)(s,(0,$z.realpathSync)(a))}}return i(s)},{runFirst:!0})),kz.set(r,n)}}}var qz,$z,Vz,kz,Gz,Kz=ue(()=>{qz=w(require("send")),$z=require("fs"),Vz=w(require("serve-static")),kz=new Map;o(qge,"start")});var CP={};Oe(CP,{start:()=>$ge});function $ge({override:e}){return{handleFile:o((t,r,n)=>{tR.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,Yz.parse)(t))){if(process.env[s]!==void 0)if(tR.default.warn(`Environment variable conflict: ${s} from ${n} is already set on process.env`),e)tR.default.debug(`override option enabled. overriding environment variable: ${s}`);else continue;process.env[s]=i}},"handleFile")}}var Yz,tR,Wz=ue(()=>{Yz=require("dotenv"),tR=w(Q());o($ge,"start")});var PP={};Oe(PP,{DataLoaderError:()=>fs,DataLoaderResult:()=>uf,EmptyFileError:()=>sR,FileParseError:()=>nR,InvalidPropertyTypeError:()=>iR,MissingRequiredPropertyError:()=>Bp,RecordProcessingError:()=>Fp,SystemDatabaseError:()=>oR,UnsupportedFileExtensionError:()=>rR,handleApplication:()=>Kge,loadDataFile:()=>Xz,suppressHandleApplicationWarning:()=>Vge});function Kge(e){if((0,jz.getWorkerIndex)()!==0){no.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||Xz(t,un,ke).then(r=>{no.debug?.("Data loader processed file: %s: %s",(0,Zo.basename)(t.absolutePath),r.message)})})}async function Xz({contents:e,absolutePath:t,stats:r},n,s){let i=(0,Zo.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,zz.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new rR(t,i);a.mtime=r.mtimeMs}catch(f){throw f instanceof fs?f:new nR(t,f)}if(!a)throw new sR(t);let{database:c,table:l,records:u}=a;if(!l)throw new Bp(t,"table");if(!u)throw new Bp(t,"records");if(!Array.isArray(u))throw new iR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new oR(c,l);try{let f;if(c&&s[c]&&s[c][l])no.debug?.(`Using existing table ${d} from database tables`),f=s[c][l];else if(n&&n[l])no.debug?.(`Using existing table ${d} from global tables`),f=n[l];else{no.debug?.(`Table ${d} not found, creating new table`);let y=[];if(u.length>0){let T=u[0];Object.keys(T).map(R=>{let N={name:R,type:typeof T[R]};return R==="id"&&(N.isPrimaryKey=!0),N}).forEach(R=>{y.push(R)})}f=await Qe({database:c,table:l,attributes:y})}let m=u.length,h=0,p=0,_=0,g=100;for(let y=0;y<u.length;y+=g){let T=u.slice(y,y+g),R=[];for(let N of T)R.push(async()=>{try{let C=null,k=N.id;if(k!==void 0&&(C=await f.get(k)),!C)return h++,f.put(N);let te=C.getUpdatedTime();return a.mtime>te?(p++,f.put(N)):(_++,Promise.resolve({inserted:0,updated:0}))}catch(C){if(C instanceof fs)no.error?.(`Record processing error: ${C.message}`);else{let k=new Fp(d,C);no.error?.(`Record processing error: ${k.message}`)}return Promise.resolve({inserted:0,updated:0,error:C.message})}});await Promise.all(R.map(N=>N()))}if(h>0||p>0){let y=`Loaded ${h} new and updated ${p} records in ${d}`;return _>0&&(y+=` (${_} records skipped)`),no.info?.(y),new uf(t,c,l,"success",h+p,y)}else if(_>0){let y=`All ${_} records in ${d} already up-to-date`;return no.info?.(y),new uf(t,c,l,"skipped",m,y)}else{let y=`No records to process in ${d}`;return no.info?.(y),new uf(t,c,l,"success",0,y)}}catch(f){throw f instanceof fs?f:new Fp(d,f)}}var Zo,zz,jz,ea,Qz,Jz,no,Vge,fs,rR,nR,sR,Bp,iR,oR,Fp,uf,Zz=ue(()=>{Zo=require("node:path"),zz=require("yaml");De();jz=w(st()),ea=w(rn()),Qz=w(ge()),Jz=w(Q()),no=Jz.default.forComponent("dataLoader"),Vge=!0;o(Kge,"handleApplication");o(Xz,"loadDataFile");fs=class extends Qz.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=ea.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},rR=class extends fs{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,Zo.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,ea.HTTP_STATUS_CODES.BAD_REQUEST),this.name="UnsupportedFileExtensionError"}},nR=class extends fs{static{o(this,"FileParseError")}constructor(t,r){super(`Failed to parse data file ${(0,Zo.basename)(t)}: ${r.message}`,ea.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},sR=class extends fs{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,Zo.basename)(t)} is empty or invalid`,ea.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},Bp=class extends fs{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,Zo.basename)(t)} is missing required "${r}" property`,ea.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},iR=class extends fs{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,Zo.basename)(t)} has invalid "${r}" property, expected ${n}`,ea.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},oR=class extends fs{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,ea.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},Fp=class extends fs{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,ea.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},uf=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 DP=M((jxe,ej)=>{"use strict";var Hp=oe();Hp.initSync();var df=require("fs-extra"),LP=require("path"),ff=(H(),v(W)),Yge=require("crypto"),Wge=require("uuid").v4;ej.exports=zge;function zge(){if(Hp.getHdbBasePath()!==void 0){let e=LP.join(Hp.getHdbBasePath(),ff.LICENSE_KEY_DIR_NAME,ff.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=LP.join(Hp.getHdbBasePath(),ff.LICENSE_KEY_DIR_NAME,ff.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=LP.join(Hp.getHdbBasePath(),ff.LICENSE_KEY_DIR_NAME,ff.JWT_ENUM.JWT_PASSPHRASE_NAME);try{df.accessSync(r),df.accessSync(e),df.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=Wge(),i=Yge.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});df.writeFileSync(r,s),df.writeFileSync(e,i.privateKey),df.writeFileSync(t,i.publicKey)}else throw n}}}o(zge,"checkJWTTokenExist")});var rj=M((Jxe,tj)=>{"use strict";var MP=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};tj.exports={HdbInfoInsertObject:MP}});var ij=M((Zxe,sj)=>{"use strict";var nj=(H(),v(W)),vP=class{static{o(this,"UpgradeObject")}constructor(t,r){this[nj.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[nj.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};sj.exports={UpgradeObject:vP}});var aR=M((tBe,aj)=>{"use strict";var $s=require("prompt"),mf=require("chalk"),oj=Q(),Ai=require("os"),UP=Mc(),xP=["yes","y"];async function jge(e){let t=`${Ai.EOL}`+mf.bold.green("Your current HarperDB version requires that we complete an update process.")+`${Ai.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ai.EOL}${Ai.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${Ai.EOL}`;$s.override=UP(["CONFIRM_UPGRADE"]),$s.start(),$s.message=t;let r={properties:{CONFIRM_UPGRADE:{description:mf.magenta(`${Ai.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 $s.get([r])}catch(s){return oj.error("There was an error when prompting user about an upgrade."),oj.error(s),!1}return xP.includes(n.CONFIRM_UPGRADE)}o(jge,"forceUpdatePrompt");async function Qge(e){let t=`${Ai.EOL}`+mf.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.${Ai.EOL}`);$s.override=UP(["CONFIRM_DOWNGRADE"]),$s.start(),$s.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:mf.magenta(`${Ai.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 $s.get([r]);return xP.includes(n.CONFIRM_DOWNGRADE)}o(Qge,"forceDowngradePrompt");async function Jge(){let e=`${Ai.EOL}`+mf.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");$s.override=UP(["GENERATE_CERTS"]),$s.start(),$s.message=e;let t={properties:{GENERATE_CERTS:{description:mf.magenta(`${Ai.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 $s.get([t]);return xP.includes(r.GENERATE_CERTS)}o(Jge,"upgradeCertsPrompt");aj.exports={forceUpdatePrompt:jge,forceDowngradePrompt:Qge,upgradeCertsPrompt:Jge}});var FP=M((nBe,cj)=>{"use strict";var BP=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};cj.exports=BP});var uj=M((lBe,lj)=>{"use strict";var Xge=ie(),Zge=bt(),iBe=Q(),oBe=require("path"),aBe=require("fs"),cBe=(H(),v(W));lj.exports={getOldPropsValue:eSe};function eSe(e,t,r=!1){let n=t.getRaw(e);return Xge.isNotEmptyAndHasValue(n)?n:r?Zge.getDefaultConfig(e):""}o(eSe,"getOldPropsValue")});var hj=M((dBe,mj)=>{"use strict";var hc=require("path"),pc=require("fs-extra"),tSe=require("properties-reader"),rSe=FP(),gr=Q(),{getOldPropsValue:Tt}=uj(),{HDB_SETTINGS_NAMES:ye,CONFIG_PARAMS:jl}=(H(),v(W)),Ql=bt(),cR=oe(),dj=ie(),so=(H(),v(W)),HP=new rSe("3.1.0"),fj=[];function nSe(){let e=tSe(cR.get(ye.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.
|
|
32
32
|
|
|
33
33
|
;The directory selected during install where the database files reside.
|