harperdb 4.5.40 → 4.5.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/harperdb.js +1 -1
- package/bin/lite.js +1 -1
- package/launchServiceScripts/launchNatsIngestService.js +1 -1
- package/launchServiceScripts/launchNatsReplyService.js +1 -1
- package/launchServiceScripts/launchUpdateNodes4-0-0.js +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/server/jobs/jobProcess.js +1 -1
- package/server/threads/threadServer.js +1 -1
- package/studio/build-local/asset-manifest.json +2 -2
- package/studio/build-local/index.html +1 -1
- package/studio/build-local/static/js/{main.e3c003ec.js → main.e5420fc4.js} +2 -2
- package/utility/scripts/restartHdb.js +1 -1
- /package/studio/build-local/static/js/{main.e3c003ec.js.LICENSE.txt → main.e5420fc4.js.LICENSE.txt} +0 -0
|
@@ -17,7 +17,7 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
|
|
|
17
17
|
`),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
|
|
18
18
|
`)},p6="certificate.pem",E6="privateKey.pem",g6="caCertificate.pem",S6="natsCertificate.pem",T6="natsCaCertificate.pem",Rt={DEFAULT:"default","DEFAULT-CA":"default-ca",SERVER:"server",CA:"ca","OPERATIONS-API":"operations-api","OPERATIONS-CA":"operations-ca"},A6={tls_certificate:Rt.SERVER,tls_certificateAuthority:Rt.CA,customFunctions_tls_certificate:Rt.SERVER,customFunctions_tls_certificateAuthority:Rt.CA,operationsApi_tls_certificate:Rt["OPERATIONS-API"],operationsApi_tls_certificateAuthority:Rt["OPERATIONS-CA"]},R6={[Rt.SERVER]:2,[Rt.DEFAULT]:1},y6={[Rt["OPERATIONS-API"]]:3,[Rt.SERVER]:2,[Rt.DEFAULT]:1},b6={[Rt["OPERATIONS-API"]]:3,[Rt.SERVER]:2,[Rt.DEFAULT]:1},O6={[Rt["OPERATIONS-CA"]]:3,[Rt.CA]:2,[Rt["DEFAULT-CA"]]:1},N6={[Rt["OPERATIONS-CA"]]:3,[Rt.CA]:2,[Rt["DEFAULT-CA"]]:1},w6={[Rt.CA]:2,[Rt["DEFAULT-CA"]]:1};Object.assign(Mv,{CERTIFICATE_PEM_NAME:p6,PRIVATEKEY_PEM_NAME:E6,CA_PEM_NAME:g6,CERT_NAME:Rt,CERT_CONFIG_NAME_MAP:A6,CERT_PREFERENCE_APP:R6,CERT_PREFERENCE_OPS:y6,CERT_PREFERENCE_REP:b6,CA_CERT_PREFERENCE_REP:O6,CA_CERT_PREFERENCE_OPS:N6,CA_CERT_PREFERENCE_APP:w6,CERTIFICATE_VALUES:m6,NATS_CERTIFICATE_PEM_NAME:S6,NATS_CA_PEM_NAME:T6})});var py=C((sbe,kv)=>{"use strict";var Bv=require("fs-extra"),ge=require("joi"),I6=require("os"),{boolean:Ge,string:ht,number:tr,array:fa}=ge.types(),{totalmem:vv}=require("os"),kc=require("path"),C6=ee(),my=ie(),nbe=hy(),Uv=(k(),P(q)),P6=ot(),xv="log",D6="components",L6="Invalid logging.rotation.maxSize unit. Available units are G, M or K",M6="Invalid logging.rotation.interval unit. Available units are D, H or M (minutes)",v6="Invalid logging.rotation.maxSize value. Value should be a number followed by unit e.g. '10M'",U6="Invalid logging.rotation.interval value. Value should be a number followed by unit e.g. '10D'",x6="rootPath config parameter is undefined",Tn=ge.alternatives([tr.min(0),ht]).optional().empty(null),qp=ge.alternatives([fa.items(ht,{host:ht.required(),port:Tn},{hostname:ht.required(),port:Tn}).empty(null),fa.items(ht)]),wi,Hv=!1;kv.exports={configValidator:B6,routesValidator:$6,route_constraints:qp};function B6(e,t=!1){if(Hv=t,wi=e.rootPath,my.isEmpty(wi))throw x6;let r=Ge.optional(),n=tr.min(0).max(1e3).empty(null).default(q6),s=ht.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").empty(null).default(r_),i=ht.optional().empty(null),o=ht.pattern(/^[^\s.,*>]+$/).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >"}).empty(null).required(),c=ge.string().empty(null).default(r_),l=ge.custom(k6).empty(null).default(r_),u=e.clustering?.enabled,f=ge.object({certificate:i,certificateAuthority:i,privateKey:i}),d;return u===!0?d=ge.object({enabled:r,hubServer:ge.object({cluster:ge.object({name:ge.required().empty(null),network:ge.object({port:Tn,routes:qp}).required()}).required(),leafNodes:ge.object({network:ge.object({port:Tn}).required()}).required(),network:ge.object({port:Tn}).required()}).required(),leafServer:ge.object({network:ge.object({port:Tn,routes:qp}).required(),streams:ge.object({maxAge:tr.min(120).allow(null).optional(),maxBytes:tr.min(1).allow(null).optional(),maxMsgs:tr.min(1).allow(null).optional(),path:c}).required()}).required(),logLevel:ge.valid("error","warn","info","debug","trace"),nodeName:o,republishMessages:Ge.optional(),databaseLevel:Ge.optional(),tls:ge.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:Ge.required(),verify:Ge.optional()}),user:ht.optional().empty(null)}).optional():d=ge.object({enabled:r,tls:ge.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:Ge.optional()})}).optional(),ge.object({authentication:ge.alternatives(ge.object({authorizeLocal:Ge,cacheTTL:tr.required(),cookie:ge.object({domains:fa.items(ht).optional(),expires:ht.optional()}),enableSessions:Ge,hashFunction:ht.valid("md5","sha256","argon2id").optional().empty(null)}),Ge).optional(),analytics:ge.object({aggregatePeriod:tr}),replication:ge.object({hostname:ge.alternatives(ht,tr).optional().empty(null),url:ht.optional().empty(null),port:Tn,securePort:Tn,routes:fa.optional().empty(null),databases:ge.alternatives(ht,fa),enableRootCAs:Ge.optional(),copyTablesToCatchUp:Ge.optional()}).optional(),componentsRoot:s.optional(),clustering:d,localStudio:ge.object({enabled:r}).required(),logging:ge.object({auditAuthEvents:ge.object({logFailed:Ge,logSuccessful:Ge}),file:Ge.required(),level:ge.valid("notify","fatal","error","warn","info","debug","trace"),rotation:ge.object({enabled:Ge.optional(),compress:Ge.optional(),interval:ht.custom(G6).optional().empty(null),maxSize:ht.custom(F6).optional().empty(null),path:ht.optional().empty(null).default(r_)}).required(),root:s,stdStreams:Ge.required(),auditLog:Ge.required()}).required(),operationsApi:ge.object({network:ge.object({cors:Ge.optional(),corsAccessList:fa.optional(),headersTimeout:tr.min(1).optional(),keepAliveTimeout:tr.min(1).optional(),port:Tn,domainSocket:ge.optional().empty("hdb/operations-server").default(r_),securePort:Tn,timeout:tr.min(1).optional()}).optional(),tls:ge.alternatives([ge.array().items(f),f])}).required(),rootPath:ht.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").required(),mqtt:ge.object({network:ge.object({port:Tn,securePort:Tn,mtls:ge.alternatives([Ge.optional(),ge.object({user:ht.optional(),certificateAuthority:i,required:Ge.optional()})])}).required(),webSocket:Ge.optional(),requireAuthentication:Ge.optional()}),http:ge.object({compressionThreshold:tr.optional(),cors:Ge.optional(),corsAccessList:fa.optional(),headersTimeout:tr.min(1).optional(),port:Tn,securePort:Tn,maxHeaderSize:tr.optional(),mtls:ge.alternatives([Ge.optional(),ge.object({user:ht.optional(),certificateAuthority:i,required:Ge.optional()})]),threadRange:ge.alternatives([fa.optional(),ht.optional()])}).required(),threads:ge.alternatives(n.optional(),ge.object({count:n.optional(),debug:ge.alternatives(Ge.optional(),ge.object({startingPort:tr.min(1).optional(),host:ht.optional(),waitForDebugger:Ge.optional()})),maxHeapMemory:tr.min(0).optional()})),storage:ge.object({writeAsync:Ge.required(),overlappingSync:Ge.optional(),caching:Ge.optional(),compression:ge.alternatives([Ge.optional(),ge.object({dictionary:ht.optional(),threshold:tr.optional()})]),compactOnStart:Ge.optional(),compactOnStartKeepBackup:Ge.optional(),noReadAhead:Ge.optional(),path:l,prefetchWrites:Ge.optional(),maxFreeSpaceToLoad:tr.optional(),maxFreeSpaceToRetain:tr.optional()}).required(),ignoreScripts:Ge.optional(),tls:ge.alternatives([ge.array().items(f),f])}).validate(e,{allowUnknown:!0,abortEarly:!1,errors:{wrap:{label:"'"}}})}a(B6,"configValidator");function H6(e){return Hv||Bv.existsSync(e)?null:`Specified path ${e} does not exist.`}a(H6,"doesPathExist");function k6(e,t){ge.assert(e,ht.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path"));let r=H6(e);if(r)return t.message(r)}a(k6,"validatePath");function F6(e,t){let r=e.slice(-1);if(r!=="G"&&r!=="M"&&r!=="K")return t.message(L6);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(v6):e}a(F6,"validateRotationMaxSize");function G6(e,t){let r=e.slice(-1);if(r!=="D"&&r!=="H"&&r!=="M")return t.message(M6);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(U6):e}a(G6,"validateRotationInterval");function q6(e,t){let r=t.state.path.join("."),n=I6.cpus().length,s=n-1;s<=2&&(s=2);let i=process.constrainedMemory?.()||vv();return i=Math.round(Math.min(i,vv())/1e6),s=Math.max(Math.min(s,Math.round((i-750)/300)),1),C6.info(`Detected ${n} cores and ${i}MB on this machine, defaulting ${r} to ${s}`),s}a(q6,"setDefaultThreads");function r_(e,t){let r=t.state.path.join(".");if(!my.isEmpty(t.original)&&r!=="operationsApi.network.domainSocket")return t.original;if(my.isEmpty(wi))throw new Error(`Error setting default root for: ${r}. HDB root is not defined`);switch(r){case"componentsRoot":return kc.join(wi,D6);case"logging.root":return kc.join(wi,xv);case"clustering.leafServer.streams.path":return kc.join(wi,"clustering","leaf");case"storage.path":let n=kc.join(wi,Uv.LEGACY_DATABASES_DIR_NAME);return Bv.existsSync(n)?n:kc.join(wi,Uv.DATABASES_DIR_NAME);case"logging.rotation.path":return kc.join(wi,xv);case"operationsApi.network.domainSocket":return r==null?null:kc.join(wi,"operations-server");default:throw new Error(`Error setting default root for config parameter: ${r}. Unrecognized config parameter`)}}a(r_,"setDefaultRoot");function $6(e){let t=ge.object({routes:qp});return P6.validateBySchema({routes:e},t)}a($6,"routesValidator")});var Lt=C(jv=>{"use strict";var ms=(k(),P(q)),pr=ie(),rr=ee(),{configValidator:V6,routesValidator:Fv}=py(),Qr=require("fs-extra"),qv=require("yaml"),Vn=require("path"),K6=require("is-number"),$v=require("properties-reader"),Y6=require("lodash"),{handleHDBError:W6}=he(),{HTTP_STATUS_CODES:z6,HDB_ERROR_MSGS:_u}=Un(),{server:Q6}=(Mr(),P(Zl)),{PACKAGE_ROOT:Vv}=Et(),{DATABASES_PARAM_CONFIG:n_,CONFIG_PARAMS:$n,CONFIG_PARAM_MAP:Vs}=ms,j6="Unable to get config value because config is uninitialized",J6="Config successfully initialized",X6="Error backing up config file",Z6="Empty parameter sent to getConfigValue",Kv=Vn.join(Vv,"config","yaml",ms.HDB_DEFAULT_CONFIG_FILE),e8=Vn.join(Vv,"config","yaml","defaultNatsConfig.yaml"),t8="Configuration successfully set. You must restart HarperDB for new config settings to take effect.",Gv={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"},$p,Dt,Vp;Object.assign(jv,{createConfigFile:r8,getDefaultConfig:n8,getConfigValue:Wv,initConfig:Kp,flattenConfig:hu,updateConfigValue:zv,updateConfigObject:i8,getConfiguration:c8,setConfiguration:l8,readConfigFile:Ty,getClusteringRoutes:u8,initOldConfig:Qv,getConfigFromFile:d8,getConfigFilePath:Fc,addConfig:f8,deleteConfigFromFile:_8,getConfigObj:h8,resolvePath:Ey,getFlatConfigObj:m8});function Ey(e){if(e?.startsWith("~/"))return Vn.join(pr.getHomeDir(),e.slice(1));let t=le();try{return Vn.resolve(t.getHdbBasePath(),e)}catch(r){return console.error("Unable to resolve path",e,r),e}}a(Ey,"resolvePath");function r8(e,t=!1){let r=_a(Kv);if(e.clustering_enabled||e.CLUSTERING_ENABLED||e.clustering){let c=qv.parseDocument(Qr.readFileSync(e8,"utf8"),{simpleKeys:!0});r.addIn(["clustering"],c.toJSON().clustering)}$p=hu(r.toJSON());let n;for(let c in e){let l=Vs[c.toLowerCase()];if(l===$n.DATABASES){Array.isArray(e[c])?n=e[c]:n=Object.keys(e[c]).map(u=>({[u]:e[c][u]}));continue}if(!l&&(c.endsWith("_package")||c.endsWith("_port"))&&(l=c),l!==void 0){let u=l.split("_"),f=gy(l,e[c]);l==="rootPath"&&f?.endsWith("/")&&(f=f.slice(0,-1));try{r.setIn([...u],f)}catch(d){rr.error(d)}}}n&&Yv(r,n),Sy(r,t);let s=r.toJSON();Dt=hu(s);let i=r.getIn(["rootPath"]),o=Vn.join(i,ms.HDB_CONFIG_FILE);if(Qr.createFileSync(o),r.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${r.errors}`);Qr.writeFileSync(o,String(r)),rr.trace(`Config file written to ${o}`)}a(r8,"createConfigFile");function Yv(e,t){let r;try{try{r=JSON.parse(t)}catch(n){if(!pr.isObject(t))throw n;r=t}for(let n of r){let s=Object.keys(n)[0];if(n[s].hasOwnProperty(n_.TABLES))for(let i in n[s][n_.TABLES])for(let o in n[s][n_.TABLES][i]){let c=n[s][n_.TABLES][i][o],l=[$n.DATABASES,s,n_.TABLES,i,o];e.hasIn(l)?e.setIn(l,c):e.addIn(l,c)}else for(let i in n[s]){let o=n[s][i],c=[$n.DATABASES,s,i];e.hasIn(c)?e.setIn(c,o):e.addIn(c,o)}}}catch(n){rr.error("Error parsing schemas CLI/env config arguments",n)}}a(Yv,"setSchemasConfig");function n8(e){if($p===void 0){let r=_a(Kv);$p=hu(r.toJSON())}let t=Vs[e.toLowerCase()];if(t!==void 0)return $p[t.toLowerCase()]}a(n8,"getDefaultConfig");function Wv(e){if(e==null){rr.info(Z6);return}if(Dt===void 0){rr.trace(j6);return}let t=Vs[e.toLowerCase()];if(t!==void 0)return Dt[t.toLowerCase()]}a(Wv,"getConfigValue");function Fc(e=pr.getPropsFilePath()){let t=pr.getEnvCliRootPath();if(t)return Ey(Vn.join(t,ms.HDB_CONFIG_FILE));let r=$v(e);return Ey(r.get(ms.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY))}a(Fc,"getConfigFilePath");function Kp(e=!1){if(Dt===void 0||e){let t;if(!pr.noBootFile()){t=pr.getPropsFilePath();try{Qr.accessSync(t,Qr.constants.F_OK|Qr.constants.R_OK)}catch(i){throw rr.error(i),new Error(`HarperDB properties file at path ${t} does not exist`)}}let r=Fc(t),n;if(r.includes("config/settings.js"))try{Qv(r);return}catch(i){if(i.code!==ms.NODE_ERROR_CODES.ENOENT)throw i}try{n=_a(r)}catch(i){if(i.code===ms.NODE_ERROR_CODES.ENOENT){rr.trace(`HarperDB config file not found at ${r}.
|
|
19
19
|
This can occur during early stages of install where the config file has not yet been created`);return}else throw rr.error(i),new Error(`Error reading HarperDB config file at ${r}`)}s8(n,r),Sy(n);let s=n.toJSON();if(Q6.config=s,Dt=hu(s),Dt.logging_rotation_rotate)for(let i in Gv)Dt[i]&&rr.error(`Config ${Gv[i]} has been deprecated. Please check https://docs.harperdb.io/docs/ for further details.`);rr.trace(J6)}}a(Kp,"initConfig");function s8(e,t){let r=e.getIn(["rootPath"]),n=!1;if(e.hasIn(["storage","path"])||(e.setIn(["storage","path"],Vn.join(r,"database")),n=!0),e.hasIn(["logging","rotation","path"])||(e.setIn(["logging","rotation","path"],Vn.join(r,"log")),n=!0),e.hasIn(["authentication"])||(e.addIn(["authentication"],{cacheTTL:3e4,enableSessions:!0,operationTokenTimeout:e.getIn(["operationsApi","authentication","operationTokenTimeout"])??"1d",refreshTokenTimeout:e.getIn(["operationsApi","authentication","refreshTokenTimeout"])??"30d"}),n=!0),e.hasIn(["analytics"])||(e.addIn(["analytics"],{aggregatePeriod:60}),n=!0),n){if(rr.trace("Updating config file with missing config params"),e.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${e.errors}`);Qr.writeFileSync(t,String(e))}}a(s8,"checkForUpdatedConfig");function Sy(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 _u.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 _u.CONFIG_VALIDATION("operationsApi.network.port and operationsApi.network.securePort cannot be the same value");let n=V6(r,t);if(n.error)throw _u.CONFIG_VALIDATION(n.error.message);typeof n.value.threads=="object"?e.setIn(["threads","count"],n.value.threads.count):e.setIn(["threads"],n.value.threads),e.setIn(["componentsRoot"],n.value.componentsRoot),e.setIn(["logging","root"],n.value.logging.root),e.setIn(["storage","path"],n.value.storage.path),e.setIn(["logging","rotation","path"],n.value.logging.rotation.path),e.setIn(["operationsApi","network","domainSocket"],n.value?.operationsApi?.network?.domainSocket),r?.clustering?.enabled&&e.setIn(["clustering","leafServer","streams","path"],n.value.clustering.leafServer.streams?.path)}a(Sy,"validateConfig");function i8(e,t){Dt===void 0&&(Dt={});let r=Vs[e.toLowerCase()];if(r===void 0){rr.trace(`Unable to update config object because config param '${e}' does not exist`);return}Dt[r.toLowerCase()]=t}a(i8,"updateConfigObject");function zv(e,t,r=void 0,n=!1,s=!1,i=!1){Dt===void 0&&Kp();let o=Wv(Vs.hdb_root),c=Vn.join(o,ms.HDB_CONFIG_FILE),l=_a(c),u;if(r&&Dt){let _=!1;for(let h in r)if(r[h]!=Dt[h.toLowerCase()]){_=!0;break}if(!_){rr.trace("No changes detected in config parameters, skipping update");return}}if(r===void 0&&e.toLowerCase()===$n.DATABASES)u=t;else if(r===void 0){let _;if(i)_=e;else if(_=Vs[e.toLowerCase()],_===void 0)throw new Error(`Unable to update config, unrecognized config parameter: ${e}`);let h=_.split("_"),m=gy(_,t);l.setIn([...h],m)}else for(let _ in r){let h=Vs[_.toLowerCase()];if(h===$n.HTTP_SECUREPORT&&r[_]===Dt[$n.HTTP_PORT]?.toString()&&l.setIn(["http","port"],null),h===$n.OPERATIONSAPI_NETWORK_SECUREPORT&&r[_]===Dt[$n.OPERATIONSAPI_NETWORK_PORT.toLowerCase()]?.toString()&&l.setIn(["operationsApi","network","port"],null),h===$n.DATABASES){u=r[_];continue}if(h?.startsWith("threads_")){let m=l.getIn(["threads"]);m>=0&&(l.deleteIn(["threads"]),l.setIn(["threads","count"],m))}if(!h&&(_.endsWith("_package")||_.endsWith("_port"))&&(h=_),h!==void 0){let m=h.split("_"),S=ms.LEGACY_CONFIG_PARAMS[_.toUpperCase()];S&&S.startsWith("customFunctions")&&l.hasIn(S.split("_"))&&(h=S,m=S.split("_"));let g=gy(h,r[_]);h==="rootPath"&&g?.endsWith("/")&&(g=g.slice(0,-1));try{m.length>1&&typeof l.getIn(m.slice(0,-1))=="boolean"&&l.deleteIn(m.slice(0,-1)),l.setIn([...m],g)}catch(R){rr.error(R)}}}u&&Yv(l,u),Sy(l);let f=l.getIn(["rootPath"]),d=Vn.join(f,ms.HDB_CONFIG_FILE);if(n===!0&&o8(c,f),l.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${l.errors}`);Qr.writeFileSync(d,String(l)),s&&(Dt=hu(l.toJSON())),rr.trace(`Config parameter: ${e} updated with value: ${t}`)}a(zv,"updateConfigValue");function o8(e,t){try{let r=Vn.join(t,"backup",`${new Date(Date.now()).toISOString().replaceAll(":","-")}-${ms.HDB_CONFIG_FILE}.bak`);Qr.copySync(e,r),rr.trace(`Config file: ${e} backed up to: ${r}`)}catch(r){rr.error(X6),rr.error(r)}}a(o8,"backupConfigFile");var a8=["databases"];function hu(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}),Vp=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])&&!a8.includes(i)){let o=r(n[i]);for(let c in o){if(!o.hasOwnProperty(c))continue;c!=="package"&&(i=i.toLowerCase());let l=i+"_"+c;!$n[l.toUpperCase()]&&Vs[l]&&(s[Vs[l].toLowerCase()]=o[c]),s[l]=o[c]}}n[i]!==void 0&&(s[i.toLowerCase()]=n[i])}return s}a(r,"squashObj")}a(hu,"flattenConfig");function gy(e,t){if(e===$n.CLUSTERING_NODENAME||e===$n.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(K6(t))return parseFloat(t);if(t===!0||t===!1||Array.isArray(t)||pr.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 pr.autoCast(t)}a(gy,"castConfigValue");function c8(){let e=pr.getPropsFilePath(),t=Fc(e);return _a(t).toJSON()}a(c8,"getConfiguration");async function l8(e){let{operation:t,hdb_user:r,hdb_auth_header:n,...s}=e;try{return zv(void 0,void 0,s,!0),t8}catch(i){throw typeof i=="string"||i instanceof String?W6(i,i,z6.BAD_REQUEST,void 0,void 0,!0):i}}a(l8,"setConfiguration");function Ty(){let e=pr.getPropsFilePath();try{Qr.accessSync(e,Qr.constants.F_OK|Qr.constants.R_OK)}catch(n){if(!pr.noBootFile())throw rr.error(n),new Error(`HarperDB properties file at path ${e} does not exist`)}let t=Fc(e);return _a(t).toJSON()}a(Ty,"readConfigFile");function _a(e){return qv.parseDocument(Qr.readFileSync(e,"utf8"),{simpleKeys:!0})}a(_a,"parseYamlDoc");function u8(){let e=Ty(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=pr.isEmptyOrZeroLength(t)?[]:t;let r=Fv(t);if(r)throw _u.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=pr.isEmptyOrZeroLength(n)?[]:n;let s=Fv(n);if(s)throw _u.CONFIG_VALIDATION(s.message);if(!pr.isEmptyOrZeroLength(n)&&!pr.isEmptyOrZeroLength(t)){let i=t.filter(o=>n.some(c=>c.host===o.host&&c.port===o.port));if(!pr.isEmptyOrZeroLength(i)){let o=`Duplicate hub and leaf routes found ${JSON.stringify(i)}`;throw _u.CONFIG_VALIDATION(o)}}return{hub_routes:t,leaf_routes:n}}a(u8,"getClusteringRoutes");function Qv(e){let t=$v(e);Dt={};for(let r in Vs){let n=t.get(r.toUpperCase());if(pr.isEmpty(n)||typeof n=="string"&&n.trim().length===0)continue;let s=Vs[r].toLowerCase();s===$n.LOGGING_ROOT?Dt[s]=Vn.dirname(n):Dt[s]=n}return Dt}a(Qv,"initOldConfig");function d8(e){let t=Ty();return Y6.get(t,e.replaceAll("_","."))}a(d8,"getConfigFromFile");async function f8(e,t){let r=_a(Fc());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 Qr.writeFile(Fc(),String(r))}a(f8,"addConfig");function _8(e){let t=Fc(pr.getPropsFilePath()),r=_a(t);r.deleteIn(e);let n=r.getIn(["rootPath"]),s=Vn.join(n,ms.HDB_CONFIG_FILE);Qr.writeFileSync(s,String(r))}a(_8,"deleteConfigFromFile");function h8(){return Vp||(Kp(),Vp)}a(h8,"getConfigObj");function m8(){return Dt||Kp(),Dt}a(m8,"getFlatConfigObj")});var Kn=C((cbe,Nr)=>{"use strict";var Zv="username is required",eU="nothing to update, must supply active, role or password to update",tU="password cannot be an empty string",rU="If role is specified, it cannot be empty.",nU="active must be true or false";Nr.exports.addUser=b8;Nr.exports.alterUser=O8;Nr.exports.dropUser=w8;Nr.exports.getSuperUser=L8;Nr.exports.userInfo=I8;Nr.exports.listUsers=Wp;Nr.exports.listUsersExternal=C8;Nr.exports.setUsersWithRolesCache=Gc;Nr.exports.findAndValidateUser=Cy;Nr.exports.getClusterUser=M8;Nr.exports.getUsersWithRolesCache=D8;Nr.exports.USERNAME_REQUIRED=Zv;Nr.exports.ALTERUSER_NOTHING_TO_UPDATE=eU;Nr.exports.EMPTY_PASSWORD=tU;Nr.exports.EMPTY_ROLE=rU;Nr.exports.ACTIVE_BOOLEAN=nU;var sU=An(),p8=Hc(),s_=(Gp(),P(Fp)),iU=Pv(),i_=Wr(),Oy=mo(),Ii=ie(),oU=require("validate.js"),Ny=ee(),{promisify:E8}=require("util"),wy=fo(),Ry=(k(),P(q)),Jv=Pt(),g8=Lt(),S8=le(),T8=co(),{hdb_errors:A8,ClientError:Ks}=he(),{HTTP_STATUS_CODES:ho,AUTHENTICATION_ERROR_MSGS:Ay,HDB_ERROR_MSGS:mu}=A8,{UserEventMsg:Iy}=Ys(),yy=require("lodash"),{server:Yp}=(Mr(),P(Zl)),R8=ee();Yp.getUser=(e,t)=>Cy(e,t,t!=null);Yp.authenticateUser=(e,t)=>Cy(e,t);var aU={username:!0,active:!0,role:!0,password:!0},Xv=new Map,y8=E8(p8.delete),by=S8.get(Ry.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??s_.HASH_FUNCTION.SHA256,Ci;async function b8(e){let t=oU.cleanAttributes(e,aU),r=iU.addUserValidation(t);if(r)throw new Ks(r.message);let n=await i_.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 Ks(mu.ROLE_NAME_NOT_FOUND(t.role),ho.NOT_FOUND);if(n.length>1)throw new Ks(mu.DUP_ROLES_FOUND(t.role),ho.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=wy.encrypt(t.password)),t.password=await s_.hash(t.password,by),t.hash_function=by,t.role=n[0].id;let s=await sU.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(Ny.debug(s),await Gc(),s.skipped_hashes.length===1)throw new Ks(mu.USER_ALREADY_EXISTS(t.username),ho.CONFLICT);return Oy.signalUserChange(new Iy(process.pid)),`${t.username} successfully added`}a(b8,"addUser");async function O8(e){let t=oU.cleanAttributes(e,aU);if(Ii.isEmptyOrZeroLength(t.username))throw new Error(Zv);if(Ii.isEmptyOrZeroLength(t.password)&&Ii.isEmptyOrZeroLength(t.role)&&Ii.isEmptyOrZeroLength(t.active))throw new Error(eU);if(!Ii.isEmpty(t.password)&&Ii.isEmptyOrZeroLength(t.password.trim()))throw new Error(tU);if(!Ii.isEmpty(t.active)&&!Ii.isBoolean(t.active))throw new Error(nU);if(!Ii.isEmpty(t.password)&&!Ii.isEmptyOrZeroLength(t.password.trim())&&(N8(t.username)&&(t.hash=wy.encrypt(t.password)),t.password=await s_.hash(t.password,by)),t.role==="")throw new Error(rU);if(t.role){let n=await i_.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["*"]});if(!n||n.length===0)throw new Ks(mu.ALTER_USER_ROLE_NOT_FOUND(t.role),ho.NOT_FOUND);if(n.length>1)throw new Ks(mu.DUP_ROLES_FOUND(t.role),ho.CONFLICT);t.role=n[0].id}let r=await sU.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await Gc(),Oy.signalUserChange(new Iy(process.pid)),r}a(O8,"alterUser");function N8(e){let t=!1,r=Ci.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}a(N8,"isClusterUser");async function w8(e){let t=iU.dropUserValidation(e);if(t)throw new Ks(t.message);if(Ci.get(e.username)===void 0)throw new Ks(mu.USER_NOT_EXIST(e.username),ho.NOT_FOUND);let r=await y8({table:"hdb_user",schema:"system",hash_values:[e.username]});return Ny.debug(r),await Gc(),Oy.signalUserChange(new Iy(process.pid)),`${e.username} successfully deleted`}a(w8,"dropUser");async function I8(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=yy.cloneDeep(e.hdb_user);let r=await i_.searchByHash({schema:"system",table:"hdb_role",hash_values:[t.role.id],get_attributes:["*"]});return t.role=r[0],delete t.password,delete t.refresh_token,delete t.hash,delete t.hash_function,t}a(I8,"userInfo");async function C8(){let e=await Wp();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}a(C8,"listUsersExternal");async function Wp(){let e=await i_.searchByValue({schema:"system",table:"hdb_role",search_value:"*",search_attribute:"role",get_attributes:["*"]}),t={};for(let s of e)t[s.id]=yy.cloneDeep(s);if(Object.keys(t).length===0)return null;let r=await i_.searchByValue({schema:"system",table:"hdb_user",search_value:"*",search_attribute:"username",get_attributes:["*"]}),n=new Map;for(let s of r)s=yy.cloneDeep(s),s.role=t[s.role],P8(s.role),n.set(s.username,s);return n}a(Wp,"listUsers");function P8(e){if(!e){Ny.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(T8)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}a(P8,"appendSystemTablesToRole");async function Gc(e=void 0){e?Ci=e:Ci=await Wp()}a(Gc,"setUsersWithRolesCache");async function D8(){return Ci||await Gc(),Ci}a(D8,"getUsersWithRolesCache");async function Cy(e,t,r=!0){Ci||await Gc();let n=Ci.get(e);if(!n){if(!r)return{username:e};throw new Ks(Ay.GENERIC_AUTH_FAIL,ho.UNAUTHORIZED)}if(n&&!n.active)throw new Ks(Ay.USER_INACTIVE,ho.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(Xv.get(t)===n.password)return s;{let i=s_.validate(n.password,t,n.hash_function||s_.HASH_FUNCTION.MD5);if(i?.then&&(i=await i),i===!0)Xv.set(t,n.password);else throw new Ks(Ay.GENERIC_AUTH_FAIL,ho.UNAUTHORIZED)}}return s}a(Cy,"findAndValidateUser");async function L8(){Ci||await Gc();for(let[,e]of Ci)if(e.role.role==="super_user")return e}a(L8,"getSuperUser");async function M8(){let e=await Wp(),t=g8.getConfigFromFile(Ry.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==Ry.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=wy.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+Jv.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+Jv.SERVER_SUFFIX.ADMIN,r}a(M8,"getClusterUser");var cU=[];Yp.invalidateUser=function(e){for(let t of cU)try{t(e)}catch(r){R8.error("Error invalidating user",r)}};Yp.onInvalidatedUser=function(e){cU.push(e)}});var a_=C((fbe,fU)=>{"use strict";var qc=ee(),Yn=(k(),P(q)),v8=OM(),ube=$s(),dbe=_o(),U8=Kn(),{validateEvent:lU}=Ys(),o_=qn(),x8=require("process"),{resetDatabases:B8}=(xe(),P(ct)),H8={[Yn.ITC_EVENT_TYPES.SCHEMA]:k8,[Yn.ITC_EVENT_TYPES.USER]:dU};async function k8(e){let t=lU(e);if(t){qc.error(t);return}qc.trace("ITC schemaHandler received schema event:",e),await v8(e.message),await F8(e.message)}a(k8,"schemaHandler");async function F8(e){try{o_.resetReadTxn(Yn.SYSTEM_SCHEMA_NAME,Yn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),o_.resetReadTxn(Yn.SYSTEM_SCHEMA_NAME,Yn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),o_.resetReadTxn(Yn.SYSTEM_SCHEMA_NAME,Yn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=B8();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){qc.error(t)}}a(F8,"syncSchemaMetadata");var uU=[];async function dU(e){try{try{o_.resetReadTxn(Yn.SYSTEM_SCHEMA_NAME,Yn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),o_.resetReadTxn(Yn.SYSTEM_SCHEMA_NAME,Yn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){qc.warn(r)}let t=lU(e);if(t){qc.error(t);return}qc.trace(`ITC userHandler ${Yn.HDB_ITC_CLIENT_PREFIX}${x8.pid} received user event:`,e),await U8.setUsersWithRolesCache();for(let r of uU)r()}catch(t){qc.error(t)}}a(dU,"userHandler");dU.addListener=function(e){uU.push(e)};fU.exports=H8});var Ys=C((gbe,hU)=>{"use strict";var hbe=ee(),Py=ie(),G8=(k(),P(q)),{ITC_ERRORS:c_}=Un(),{parentPort:mbe,threadId:q8,isMainThread:$8,workerData:pbe}=require("worker_threads"),{onMessageFromWorkers:V8,broadcast:Ebe,broadcastWithAcknowledgement:K8}=it();hU.exports={sendItcEvent:Y8,validateEvent:_U,SchemaEventMsg:W8,UserEventMsg:z8};var zp;V8(async(e,t)=>{zp=zp||a_(),_U(e),zp[e.type]&&await zp[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function Y8(e){return!$8&&e.message&&(e.message.originator=q8),K8(e)}a(Y8,"sendItcEvent");function _U(e){if(typeof e!="object")return c_.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||Py.isEmpty(e.type))return c_.MISSING_TYPE;if(!e.hasOwnProperty("message")||Py.isEmpty(e.message))return c_.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||Py.isEmpty(e.message.originator))return c_.MISSING_ORIGIN;if(G8.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return c_.INVALID_EVENT(e.type)}a(_U,"validateEvent");function W8(e,t,r,n=void 0,s=void 0){this.originator=e,this.operation=t,this.schema=r,this.table=n,this.attribute=s}a(W8,"SchemaEventMsg");function z8(e){this.originator=e}a(z8,"UserEventMsg")});var mo=C((Abe,gU)=>{"use strict";var mU=(k(),P(q)),Tbe=ie(),Qp=ee(),pU=RM(),pu,{sendItcEvent:EU}=Ys();function Q8(e){try{Qp.info("signalSchemaChange called with message:",e),pu=pu||a_();let t=new pU(mU.ITC_EVENT_TYPES.SCHEMA,e);return pu.schema(t),EU(t)}catch(t){Qp.error(t)}}a(Q8,"signalSchemaChange");function j8(e){try{Qp.trace("signalUserChange called with message:",e),pu=pu||a_();let t=new pU(mU.ITC_EVENT_TYPES.USER,e);return pu.user(t),EU(t)}catch(t){Qp.error(t)}}a(j8,"signalUserChange");gU.exports={signalSchemaChange:Q8,signalUserChange:j8}});var jp=C((ybe,TU)=>{"use strict";var SU=ie(),J8=(k(),P(q)),X8=ee(),Z8=Dp(),eZ=Pp(),tZ=mo(),{SchemaEventMsg:rZ}=Ys(),nZ="already exists in";TU.exports=sZ;async function sZ(e,t,r){if(SU.isEmptyOrZeroLength(r))return r;let n=[];SU.isEmptyOrZeroLength(t.attributes)||t.attributes.forEach(i=>{n.push(i.attribute)});let s=r.filter(i=>n.indexOf(i)<0);return s.length===0||await Promise.all(s.map(async i=>{await iZ(e,t.schema,t.name,i)})),s}a(sZ,"lmdbCheckForNewAttributes");async function iZ(e,t,r,n){let s=new eZ(t,r,n,void 0,!0);e&&(s.hdb_auth_header=e);try{await oZ(s)}catch(i){if(typeof i=="object"&&i.message!==void 0&&i.message.includes(nZ))X8.warn(`attribute ${t}.${r}.${n} already exists`);else throw i}}a(iZ,"createNewAttribute");async function oZ(e){let t;return t=await Z8(e),tZ.signalSchemaChange(new rZ(process.pid,J8.OPERATIONS_ENUM.CREATE_ATTRIBUTE,e.schema,e.table,e.attribute)),t}a(oZ,"createAttribute")});var Eu=C((Obe,AU)=>{"use strict";var Dy=class{static{a(this,"LMDBTransactionObject")}constructor(t,r,n,s,i=void 0){this.operation=t,this.user_name=r,this.timestamp=n,this.hash_values=s,this.origin=i}};AU.exports=Dy});var yU=C((wbe,RU)=>{"use strict";var aZ=Eu(),cZ=(k(),P(q)).OPERATIONS_ENUM,Ly=class extends aZ{static{a(this,"LMDBInsertTransactionObject")}constructor(t,r,n,s,i=void 0){super(cZ.INSERT,r,n,s,i),this.records=t}};RU.exports=Ly});var OU=C((Cbe,bU)=>{"use strict";var lZ=Eu(),uZ=(k(),P(q)).OPERATIONS_ENUM,My=class extends lZ{static{a(this,"LMDBUpdateTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(uZ.UPDATE,n,s,i,o),this.records=t,this.original_records=r}};bU.exports=My});var wU=C((Dbe,NU)=>{"use strict";var dZ=Eu(),fZ=(k(),P(q)).OPERATIONS_ENUM,vy=class extends dZ{static{a(this,"LMDBUpsertTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(fZ.UPSERT,n,s,i,o),this.records=t,this.original_records=r}};NU.exports=vy});var CU=C((Mbe,IU)=>{"use strict";var _Z=Eu(),hZ=(k(),P(q)).OPERATIONS_ENUM,Uy=class extends _Z{static{a(this,"LMDBDeleteTransactionObject")}constructor(t,r,n,s,i=void 0){super(hZ.DELETE,n,s,t,i),this.original_records=r}};IU.exports=Uy});var l_=C((xbe,MU)=>{"use strict";var Ube=require("path"),PU=_t(),mZ=yU(),pZ=OU(),EZ=wU(),gZ=CU(),gu=Ft(),DU=ie(),{CONFIG_PARAMS:SZ}=(k(),P(q)),LU=le();LU.initSync();var Jp=(k(),P(q)).OPERATIONS_ENUM,{getTransactionAuditStorePath:TZ}=gt();MU.exports=AZ;async function AZ(e,t){if(LU.get(SZ.LOGGING_AUDITLOG)===!1)return;let r=TZ(e.schema,e.table),n=await PU.openEnvironment(r,e.table,!0),s=RZ(e,t);if(!(s===void 0||s.hash_values.length===0)&&n!==void 0){PU.initializeDBIs(n,gu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,gu.TRANSACTIONS_DBIS);let i=s.timestamp;return await n.dbis[gu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].ifNoExists(i,()=>{n.dbis[gu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].put(i,s),DU.isEmpty(s.user_name)||n.dbis[gu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].put(s.user_name,i);for(let o=0;o<s.hash_values.length;o++)n.dbis[gu.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].put(s.hash_values[o],i)})}}a(AZ,"writeTransaction");function RZ(e,t){let r=DU.isEmpty(e.hdb_user)?void 0:e.hdb_user?.username;if(e.operation===Jp.INSERT)return new mZ(e.records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===Jp.UPDATE)return new pZ(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===Jp.UPSERT)return new EZ(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===Jp.DELETE)return new gZ(t.deleted,t.original_records,r,t.txn_time,e.__origin)}a(RZ,"createTransactionObject")});var xy=C((kbe,vU)=>{"use strict";var yZ=Yf(),Hbe=gf(),u_=(k(),P(q)),bZ=Sf(),OZ=Lc().insertRecords,NZ=_t(),wZ=ee(),IZ=jp(),{getSchemaPath:CZ}=gt(),PZ=l_();vU.exports=DZ;async function DZ(e){try{let{schema_table:t,attributes:r}=yZ(e);bZ(e,r,t.hash_attribute),e.schema!==u_.SYSTEM_SCHEMA_NAME&&(r.includes(u_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(u_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(u_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(u_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await IZ(e.hdb_auth_header,t,r),s=CZ(e.schema,e.table),i=await NZ.openEnvironment(s,e.table),o=await OZ(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await PZ(e,o)}catch(c){wZ.error(`unable to write transaction due to ${c.message}`)}return{written_hashes:o.written_hashes,skipped_hashes:o.skipped_hashes,schema_table:t,new_attributes:n,txn_time:o.txn_time}}catch(t){throw t}}a(DZ,"lmdbCreateRecords")});var BU=C((Gbe,xU)=>{"use strict";var UU=(k(),P(q)),LZ=xy(),MZ=gf(),vZ=require("fs-extra"),{getSchemaPath:UZ}=gt();xU.exports=xZ;async function xZ(e){let t=[{name:e.schema,createddate:Date.now()}],r=new MZ(UU.SYSTEM_SCHEMA_NAME,UU.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,void 0,t);await LZ(r),await vZ.mkdirp(UZ(e.schema))}a(xZ,"lmdbCreateSchema")});var kU=C(($be,HU)=>{"use strict";var By=class{static{a(this,"DeleteRecordsResponseObject")}constructor(t=[],r=[],n=void 0,s=[]){this.deleted=t,this.skipped=r,this.txn_time=n,this.original_records=s}};HU.exports=By});var $U=C((zbe,qU)=>{"use strict";var FU=_t(),Hy=un(),ky=Un().LMDB_ERRORS_ENUM,BZ=Ft(),GU=ee(),Kbe=ie(),HZ=require("lmdb"),kZ=kU(),FZ=(k(),P(q)),{OVERFLOW_MARKER:Ybe,MAX_SEARCH_KEY_LENGTH:Wbe}=BZ,GZ=FZ.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function qZ(e,t,r,n){if(Hy.validateEnv(e),t===void 0)throw new Error(ky.HASH_ATTRIBUTE_REQUIRED);if(!Array.isArray(r))throw r===void 0?new Error(ky.IDS_REQUIRED):new Error(ky.IDS_MUST_BE_ITERABLE);try{let s=FU.listDBIs(e);FU.initializeDBIs(e,t,s);let i=new kZ,o,c=[],l=[];for(let _=0,h=r.length;_<h;_++)try{o=r[_];let m=e.dbis[t].get(o);if(!m||n&&m[GZ]>n){i.skipped.push(o);continue}let S=e.dbis[t].ifVersion(o,HZ.IF_EXISTS,()=>{e.dbis[t].remove(o);for(let g=0;g<s.length;g++){let R=s[g];if(!m.hasOwnProperty(R)||R===t)continue;let E=e.dbis[R],T=m[R];if(T!=null)try{let N=Hy.getIndexedValues(T);if(N)for(let M=0,H=N.length;M<H;M++)E.remove(N[M],o)}catch{GU.warn(`cannot delete from attribute: ${R}, ${T}:${o}`)}}});c.push(S),l.push(o),i.original_records.push(m)}catch(m){GU.warn(m),i.skipped.push(o)}let u=[],f=await Promise.all(c);for(let _=0,h=f.length;_<h;_++)f[_]===!0?i.deleted.push(l[_]):(i.skipped.push(l[_]),u.push(_));let d=0;for(let _=0;_<u.length;_++){let h=u[_];i.original_records.splice(h-d,1),d++}return i.txn_time=Hy.getNextMonotonicTime(),i}catch(s){throw s}}a(qZ,"deleteRecords");qU.exports={deleteRecords:qZ}});var d_=C((jbe,KU)=>{"use strict";var Su=ie(),$Z=$U(),VZ=_t(),{getSchemaPath:KZ}=gt(),YZ=l_(),WZ=ee();KU.exports=zZ;async function zZ(e,t=!0){let n=global.hdb_schema[e.schema][e.table].hash_attribute;if(Su.isEmpty(n))throw new Error(`could not retrieve hash attribute for schema:${e.schema} and table ${e.table}`);try{if(Su.isEmptyOrZeroLength(e.hash_values)&&!Su.isEmptyOrZeroLength(e.records)){e.hash_values=[];for(let c=0;c<e.records.length;c++){let l=e.records[c][n];Su.isEmpty(l)||e.hash_values.push(l)}}if(Su.isEmptyOrZeroLength(e.hash_values))return VU([],[]);if(!Array.isArray(e.hash_values))throw new Error("hash_values must be an array");if(Su.isEmptyOrZeroLength(e.records)){e.records=[];for(let c=0;c<e.hash_values.length;c++)e.records[c]={[n]:e.hash_values[c]}}let s=KZ(e.schema,e.table),i=await VZ.openEnvironment(s,e.table),o=await $Z.deleteRecords(i,n,e.hash_values,e.__origin?.timestamp);try{t===!0&&await YZ(e,o)}catch(c){WZ.error(`unable to write transaction due to ${c.message}`)}return VU(o.deleted,o.skipped,o.txn_time)}catch(s){throw s}}a(zZ,"lmdbDeleteRecords");function VU(e,t,r){let n=e.length+t.length,s=n===1?"record":"records";return{message:`${e.length} of ${n} ${s} successfully deleted`,deleted_hashes:e,skipped_hashes:t,txn_time:r}}a(VU,"createDeleteResponse")});var Gy=C((Zbe,YU)=>{"use strict";var QZ=(k(),P(q)),Xbe=un();function Fy(e,t){let r=Object.create(null);if(t.length===1&&QZ.SEARCH_WILDCARDS.indexOf(t[0])>=0)Object.assign(r,e);else for(let n=0;n<t.length;n++){let s=t[n],i=e[s];r[s]=i===void 0?null:i}return r}a(Fy,"parseRow");function jZ(e,t,r,n){let s=Fy(r,e);n.push(s)}a(jZ,"searchAll");function JZ(e,t,r,n){let s=Fy(r,e);n[t]=s}a(JZ,"searchAllToMap");function XZ(e,t,r){r[e]===void 0&&(r[e]=[]),r[e].push(t)}a(XZ,"iterateDBI");function $c(e,t,r,n,s){let i=Object.create(null);i[s]=e;let o;n===s?o=e:(o=t,n!==void 0&&(i[n]=o)),r[0].push(o),r[1].push(i)}a($c,"pushResults");function ZZ(e,t,r,n,s,i){t.toString().endsWith(e)&&$c(t,r,n,s,i)}a(ZZ,"endsWith");function e5(e,t,r,n,s,i){t.toString().includes(e)&&$c(t,r,n,s,i)}a(e5,"contains");function t5(e,t,r,n,s,i){t>e&&$c(t,r,n,s,i)}a(t5,"greaterThanCompare");function r5(e,t,r,n,s,i){t>=e&&$c(t,r,n,s,i)}a(r5,"greaterThanEqualCompare");function n5(e,t,r,n,s,i){t<e&&$c(t,r,n,s,i)}a(n5,"lessThanCompare");function s5(e,t,r,n,s,i){t<=e&&$c(t,r,n,s,i)}a(s5,"lessThanEqualCompare");YU.exports={parseRow:Fy,searchAll:jZ,searchAllToMap:JZ,iterateDBI:XZ,endsWith:ZZ,contains:e5,greaterThanCompare:t5,greaterThanEqualCompare:r5,lessThanCompare:n5,lessThanEqualCompare:s5,pushResults:$c}});var Tu=C((sOe,ZU)=>{"use strict";var ha=_t(),tOe=ee(),Wn=un(),Xp=Ft(),zt=Un().LMDB_ERRORS_ENUM,rOe=ie(),i5=(k(),P(q)),Zp=Gy(),{parseRow:o5}=Zp,nOe=require("lmdb"),{OVERFLOW_MARKER:WU,MAX_SEARCH_KEY_LENGTH:a5}=Xp;function zU(e,t,r,n=!1,s=void 0,i=void 0){return Vc(e,t,r,(o,c)=>c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}))}a(zU,"iterateFullIndex");function f_(e,t,r,n,s,i=!1,o=void 0,c=void 0,l=!1,u=!1){return Vc(e,t,r,(f,d,_,h)=>{let E={transaction:f,start:i===!0?s:n,end:i===!0?n:s,reverse:i,limit:o,offset:c,inclusiveEnd:i===!0?!l:!u,exclusiveStart:i===!0?u:l};return h===r?(E.values=!1,d.getRange(E).map(T=>({value:T}))):d.getRange(E)})}a(f_,"iterateRangeBetween");function Vc(e,t,r,n){let s=e.database||e,i=ha.openDBI(s,r);i[Xp.DBI_DEFINITION_NAME].is_hash_attribute?t=r:t&&ha.openDBI(s,t);let o;e.database?o=e:(o=e.useReadTransaction(),o.database=e);let c=n(o,i,s,t);return c.transaction=o,e.database||(c.onDone=()=>{o.done()}),c}a(Vc,"setupTransaction");function QU(e,t,r,n){let s;return function(i,o){if(typeof i=="string"&&i.endsWith(WU)){if(!s)if(r)s=ha.openDBI(e,r);else{let l=ha.listDBIs(e);for(let u=0,f=l.length;u<f&&(s=ha.openDBI(e,l[u]),!s[Xp.DBI_DEFINITION_NAME].is_hash_attribute);u++);}i=s.get(o,{transaction:t,lazy:!0})[n]}return i}}a(QU,"getOverflowCheck");function c5(e,t,r,n=!1,s=void 0,i=void 0){if(Wn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);return Vc(e,t,t,(o,c,l)=>(eE(r),r=__(l,r),c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}).map(u=>o5(u.value,r))))}a(c5,"searchAll");function l5(e,t,r,n=!1,s=void 0,i=void 0){if(Wn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);eE(r),r=__(e.database||e,r);let o=new Map;for(let{key:c,value:l}of zU(e,t,t,n,s,i))o.set(c,Zp.parseRow(l,r));return o}a(l5,"searchAllToMap");function u5(e,t,r=!1,n=void 0,s=void 0){if(Wn.validateEnv(e),t===void 0)throw new Error(zt.ATTRIBUTE_REQUIRED);let i=Object.create(null),o=zU(e,void 0,t,r,n,s),c=o.transaction,l=QU(c.database,c,void 0,t);for(let{key:u,value:f}of o){let d=l(u,f);i[d]===void 0&&(i[d]=[]),i[d].push(f)}return i}a(u5,"iterateDBI");function d5(e,t){if(Wn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);return ha.statDBI(e,t).entryCount}a(d5,"countAll");function f5(e,t,r,n,s=!1,i=void 0,o=void 0){return ma(e,r,n),Vc(e,t,r,(c,l,u,f)=>(n=Wn.convertKeyValueToWrite(n),f===r?l.get(n,{transaction:c,lazy:!0})===void 0?[]:[{key:n,value:n}]:l.getValues(n,{transaction:c,reverse:s,limit:i,offset:o}).map(d=>({key:n,value:d}))))}a(f5,"equals");function _5(e,t,r){return ma(e,t,r),ha.openDBI(e,t).getValuesCount(r)}a(_5,"count");function h5(e,t,r,n,s=!1,i=void 0,o=void 0){return ma(e,r,n),Vc(e,null,r,(c,l)=>{n=Wn.convertKeyValueToWrite(n);let u=!0;typeof n=="number"&&(u=!1);let f;if(s===!0){let d;for(let _ of l.getKeys({transaction:c,start:n}))if(!_.startsWith(n)){d=_;break}return d!==void 0&&(Number.isInteger(o)?o++:i++),f=l.getRange({transaction:c,start:d,end:void 0,reverse:s,limit:i,offset:o}).map(_=>{let{key:h}=_;if(h!==d){if(h.toString().startsWith(n))return _;if(u===!0)return f.DONE}}),f.filter(_=>_)}else return f=l.getRange({transaction:c,start:n,reverse:s,limit:i,offset:o}).map(d=>{if(d.key.toString().startsWith(n))return d;if(u===!0)return f.DONE}),u?f:f.filter(d=>d)})}a(h5,"startsWith");function m5(e,t,r,n,s=!1,i=void 0,o=void 0){return jU(e,t,r,n,s,i,o,!0)}a(m5,"endsWith");function jU(e,t,r,n,s=!1,i=void 0,o=void 0,c=!1){return ma(e,r,n),Vc(e,null,r,(l,u,f,d)=>{let _=QU(f,l,d,r);return o=Number.isInteger(o)?o:0,u.getKeys({transaction:l,end:s?!1:void 0,reverse:s}).flatMap(h=>{let m=h.toString();return m.endsWith(WU)?u.getValues(h,{transaction:l}).map(S=>{let g=_(h,S);if(c?g.endsWith(n):g.includes(n))return{key:g,value:S}}).filter(S=>S):(c?m.endsWith(n):m.includes(n))?u[Xp.DBI_DEFINITION_NAME].is_hash_attribute?{key:h,value:h}:u.getValues(h,{transaction:l}).map(S=>({key:h,value:S})):[]}).slice(o,i===void 0?void 0:i+(o||0))})}a(jU,"contains");function p5(e,t,r,n,s=!1,i=void 0,o=void 0){ma(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),f_(e,t,r,n,l,s,i,o,!0,!1)}a(p5,"greaterThan");function E5(e,t,r,n,s=!1,i=void 0,o=void 0){ma(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),f_(e,t,r,n,l,s,i,o,!1,!1)}a(E5,"greaterThanEqual");function g5(e,t,r,n,s=!1,i=void 0,o=void 0){ma(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),f_(e,t,r,l,n,s,i,o,!1,!0)}a(g5,"lessThan");function S5(e,t,r,n,s=!1,i=void 0,o=void 0){ma(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),f_(e,t,r,l,n,s,i,o,!1,!1)}a(S5,"lessThanEqual");function T5(e,t,r,n,s,i=!1,o=void 0,c=void 0){if(Wn.validateEnv(e),r===void 0)throw new Error(zt.ATTRIBUTE_REQUIRED);if(n===void 0)throw new Error(zt.START_VALUE_REQUIRED);if(s===void 0)throw new Error(zt.END_VALUE_REQUIRED);if(n=Wn.convertKeyValueToWrite(n),s=Wn.convertKeyValueToWrite(s),n>s)throw new Error(zt.END_VALUE_MUST_BE_GREATER_THAN_START_VALUE);return f_(e,t,r,n,s,i,o,c)}a(T5,"between");function A5(e,t,r,n){Wn.validateEnv(e);let s=e.database||e,i=e.database?e:null;if(t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);if(eE(r),r=__(s,r),n===void 0)throw new Error(zt.ID_REQUIRED);let o=null,c=s.dbis[t].get(n,{transaction:i,lazy:r.length<3});return c&&(o=Zp.parseRow(c,r)),o}a(A5,"searchByHash");function R5(e,t,r){Wn.validateEnv(e);let n=e.database||e,s=e.database?e:null;if(t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(zt.ID_REQUIRED);let i=!0;return n.dbis[t].get(r,{transaction:s,lazy:!0})===void 0&&(i=!1),i}a(R5,"checkHashExists");function y5(e,t,r,n,s=[]){return XU(e,t,r,n,s),JU(e,t,r,n,s).map(i=>i[1])}a(y5,"batchSearchByHash");function b5(e,t,r,n,s=[]){XU(e,t,r,n,s);let i=new Map;for(let[o,c]of JU(e,t,r,n,s))i.set(o,c);return i}a(b5,"batchSearchByHashToMap");function JU(e,t,r,n,s=[]){return Vc(e,t,t,(i,o,c)=>{r=__(c,r);let l=r.length<3;return n.map(u=>{let f=c.dbis[t].get(u,{transaction:i,lazy:l});if(f)return[u,Zp.parseRow(f,r)];s.push(u)}).filter(u=>u)})}a(JU,"batchHashSearch");function XU(e,t,r,n,s){if(Wn.validateEnv(e),t===void 0)throw new Error(zt.HASH_ATTRIBUTE_REQUIRED);if(eE(r),n==null)throw new Error(zt.IDS_REQUIRED);if(!n[Symbol.iterator])throw new Error(zt.IDS_MUST_BE_ITERABLE)}a(XU,"initializeBatchSearchByHash");function eE(e){if(!Array.isArray(e))throw e===void 0?new Error(zt.FETCH_ATTRIBUTES_REQUIRED):new Error(zt.FETCH_ATTRIBUTES_MUST_BE_ARRAY)}a(eE,"validateFetchAttributes");function ma(e,t,r){if(Wn.validateEnv(e),t===void 0)throw new Error(zt.ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(zt.SEARCH_VALUE_REQUIRED);if(r?.length>a5)throw new Error(zt.SEARCH_VALUE_TOO_LARGE)}a(ma,"validateComparisonFunctions");function __(e,t){return t.length===1&&i5.SEARCH_WILDCARDS.indexOf(t[0])>=0&&(t=ha.listDBIs(e)),t}a(__,"setGetWholeRowAttributes");ZU.exports={searchAll:c5,searchAllToMap:l5,count:_5,countAll:d5,equals:f5,startsWith:h5,endsWith:m5,contains:jU,searchByHash:A5,setGetWholeRowAttributes:__,batchSearchByHash:y5,batchSearchByHashToMap:b5,checkHashExists:R5,iterateDBI:u5,greaterThan:p5,greaterThanEqual:E5,lessThan:g5,lessThanEqual:S5,between:T5}});var Au=C((oOe,s0)=>{var e0=require("lodash"),t0=ot(),qe=require("joi"),O5=ie(),{hdb_schema_table:h_,checkValidTable:r0,hdb_table:n0,hdb_database:tE}=bi(),{handleHDBError:N5,hdb_errors:w5}=he(),{getDatabases:I5}=(xe(),P(ct)),{HTTP_STATUS_CODES:C5}=w5,P5=qe.object({database:tE,schema:tE,table:n0,search_attribute:h_,search_value:qe.any().required(),get_attributes:qe.array().min(1).items(qe.alternatives(h_,qe.object())).optional(),desc:qe.bool(),limit:qe.number().integer().min(1),offset:qe.number().integer().min(0)}),D5=qe.object({database:tE,schema:tE,table:n0,operator:qe.string().valid("and","or").default("and").lowercase(),offset:qe.number().integer().min(0),limit:qe.number().integer().min(1),get_attributes:qe.array().min(1).items(qe.alternatives(h_,qe.object())).optional(),sort:qe.object({attribute:qe.alternatives(h_,qe.array().min(1)),descending:qe.bool().optional()}).optional(),conditions:qe.array().min(1).items(qe.alternatives(qe.object({operator:qe.string().valid("and","or").default("and").lowercase(),conditions:qe.array()}),qe.object({search_attribute:qe.alternatives(h_,qe.array().min(1)),search_type:qe.string().valid("equals","contains","starts_with","ends_with","greater_than","greater_than_equal","less_than","less_than_equal","between","not_equal").optional(),search_value:qe.when("search_type",{switch:[{is:"equals",then:qe.any()},{is:"between",then:qe.array().items(qe.alternatives([qe.string(),qe.number()])).length(2)}],otherwise:qe.alternatives(qe.string(),qe.number())}).required()}))).required()});s0.exports=function(e,t){let r=null;switch(t){case"value":r=t0.validateBySchema(e,P5);break;case"hashes":let i=function(o){s?s+=". "+o:s=o};var n=i;a(i,"addError");let s;i(r0("database",e.schema)),i(r0("table",e.table)),e.hash_values?Array.isArray(e.hash_values)?e.hash_values.every(o=>typeof o=="string"||typeof o=="number")||i("'hash_values' must be strings or numbers"):i("'hash_values' must be an array"):i("'hash_values' is required"),e.get_attributes?Array.isArray(e.get_attributes)?e.get_attributes.length===0?i("'get_attributes' must contain at least 1 item"):e.get_attributes.every(o=>typeof o=="string"||typeof o=="number")||i("'get_attributes' must be strings or numbers"):i("'get_attributes' must be an array"):i("'get_attributes' is required"),s&&(r=new Error(s.trim()));break;case"conditions":r=t0.validateBySchema(e,D5);break;default:throw new Error(`Error validating search, unknown type: ${t}`)}if(!r&&e.schema!=="system"){let s=O5.checkGlobalSchemaTable(e.schema,e.table);if(s)return N5(new Error,s,C5.NOT_FOUND);let o=I5()[e.schema][e.table].attributes,c=e.get_attributes?[...e.get_attributes]:[];t==="value"&&c.push(e.search_attribute);let l=a(f=>{for(let d=0,_=f.conditions.length;d<_;d++){let h=f.conditions[d];h.conditions?l(h):c.push(h.search_attribute)}},"addConditions");t==="conditions"&&l(e);let u=e0.filter(c,f=>f!=="*"&&!f.startsWith?.("$")&&f.attribute!=="*"&&!Array.isArray(f)&&!f.name&&!e0.some(o,d=>d===f||d.attribute===f||d.attribute===f.attribute));if(u&&u.length>0){let f=u.join(", ");return f=f.replace(/,([^,]*)$/," and$1"),new Error(`unknown attribute '${f}'`)}}return r}});var qy=C((cOe,i0)=>{"use strict";var L5=_t(),M5=Au(),{getSchemaPath:v5}=gt();i0.exports=U5;function U5(e){let t=M5(e,"hashes");if(t)throw t;let r=v5(e.schema,e.table);return L5.openEnvironment(r,e.table)}a(U5,"initialize")});var $y=C((uOe,o0)=>{"use strict";var x5=Tu(),B5=qy();o0.exports=H5;async function H5(e){let t=await B5(e),r=t.useReadTransaction();r.database=t;let n=global.hdb_schema[e.schema][e.table];try{return x5.batchSearchByHashToMap(r,n.hash_attribute,e.get_attributes,e.hash_values)}finally{r.done()}}a(H5,"lmdbGetDataByHash")});var Ru=C((fOe,a0)=>{"use strict";var Vy=class{static{a(this,"SearchByHashObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.hash_values=n,this.get_attributes=s}};a0.exports=Vy});var l0=C((mOe,c0)=>{"use strict";var hOe=Ru(),k5=Tu(),F5=qy();c0.exports=G5;async function G5(e){let t=await F5(e),r=global.hdb_schema[e.schema][e.table];return k5.batchSearchByHash(t,r.hash_attribute,e.get_attributes,e.hash_values)}a(G5,"lmdbSearchByHash")});var Ws=C((EOe,u0)=>{"use strict";var Ky=class{static{a(this,"SearchObject")}constructor(t,r,n,s,i,o,c,l=!1,u=void 0,f=void 0){this.schema=t,this.table=r,this.search_attribute=n,this.search_value=s,this.hash_attribute=i,this.get_attributes=o,this.end_value=c,this.reverse=l,this.limit=u,this.offset=f}};u0.exports=Ky});var rE=C((SOe,p0)=>{"use strict";var jr=Tu(),q5=_t(),$5=ie(),$e=Ft(),Kc=(k(),P(q)),V5=co(),d0=Un().LMDB_ERRORS_ENUM,{getSchemaPath:K5}=gt(),po=Kc.SEARCH_WILDCARDS;async function Y5(e,t,r){let n;e.schema===Kc.SYSTEM_SCHEMA_NAME?n=V5[e.table]:n=global.hdb_schema[e.schema][e.table];let s=m0(e,n.hash_attribute,r,t);return _0(e,s,n.hash_attribute,r)}a(Y5,"prepSearch");async function _0(e,t,r,n){let s=K5(e.schema,e.table),i=await q5.openEnvironment(s,e.table),o=h0(i,e,t,r),c=o.transaction||i;if([$e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH,$e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP,$e.SEARCH_TYPES.SEARCH_ALL,$e.SEARCH_TYPES.SEARCH_ALL_TO_MAP].indexOf(t)>=0)return o;if(W5(e,r)===!1){let f=e.search_attribute;if(f===r)return n?f0(o,()=>!0):o.map(_=>({[r]:_.key}));let d=a(_=>({[r]:_.value,[f]:_.key}),"toObject");return n?f0(o,d):o.map(d)}let u=e.search_attribute===r?o.map(f=>f.key):o.map(f=>f.value);return n===!0?jr.batchSearchByHashToMap(c,r,e.get_attributes,u):jr.batchSearchByHash(c,r,e.get_attributes,u)}a(_0,"executeSearch");function h0(e,t,r,n){let s,i=n;t.get_attributes.indexOf(n)<0&&(i=void 0);let{reverse:o,limit:c,offset:l}=t;switch(o=typeof o=="boolean"?o:!1,c=Number.isInteger(c)?c:void 0,l=Number.isInteger(l)?l:void 0,r){case $e.SEARCH_TYPES.EQUALS:s=jr.equals(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.CONTAINS:s=jr.contains(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.ENDS_WITH:case $e.SEARCH_TYPES._ENDS_WITH:s=jr.endsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.STARTS_WITH:case $e.SEARCH_TYPES._STARTS_WITH:s=jr.startsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:return jr.batchSearchByHash(e,t.search_attribute,t.get_attributes,[t.search_value]);case $e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:return jr.batchSearchByHashToMap(e,t.search_attribute,t.get_attributes,[t.search_value]);case $e.SEARCH_TYPES.SEARCH_ALL:return jr.searchAll(e,n,t.get_attributes,o,c,l);case $e.SEARCH_TYPES.SEARCH_ALL_TO_MAP:return jr.searchAllToMap(e,n,t.get_attributes,o,c,l);case $e.SEARCH_TYPES.BETWEEN:s=jr.between(e,i,t.search_attribute,t.search_value,t.end_value,o,c,l);break;case $e.SEARCH_TYPES.GREATER_THAN:case $e.SEARCH_TYPES._GREATER_THAN:s=jr.greaterThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.GREATER_THAN_EQUAL:case $e.SEARCH_TYPES._GREATER_THAN_EQUAL:s=jr.greaterThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.LESS_THAN:case $e.SEARCH_TYPES._LESS_THAN:s=jr.lessThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.LESS_THAN_EQUAL:case $e.SEARCH_TYPES._LESS_THAN_EQUAL:s=jr.lessThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;default:return Object.create(null)}return s}a(h0,"searchByType");function f0(e,t){let r=new Map;for(let n of e)r.set(n.value,t(n));return r}a(f0,"createMapFromIterable");function W5(e,t){if(e.get_attributes.length===1&&e.get_attributes[0]==="*")return!0;let r=[e.search_attribute];e.get_attributes.indexOf(t)>=0&&r.push(t);let n=!1;for(let s=0;s<e.get_attributes.length;s++)if(r.indexOf(e.get_attributes[s])<0){n=!0;break}return n}a(W5,"checkToFetchMore");function m0(e,t,r,n){if($5.isEmpty(n)){let s=e.search_value;typeof s=="object"?s=JSON.stringify(s):s=s.toString();let i=s.charAt(0),o=s.charAt(s.length-1),c=!1;if(e.search_attribute===t&&(c=!0),po.indexOf(s)>-1)return r===!0?$e.SEARCH_TYPES.SEARCH_ALL_TO_MAP:$e.SEARCH_TYPES.SEARCH_ALL;if(s.indexOf(po[0])<0&&s.indexOf(po[1])<0)return c===!0?r===!0?$e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:$e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:$e.SEARCH_TYPES.EQUALS;if(po.indexOf(i)>=0&&po.indexOf(o)>=0)return e.search_value=e.search_value.slice(1,-1),$e.SEARCH_TYPES.CONTAINS;if(po.indexOf(i)>=0)return e.search_value=e.search_value.substr(1),$e.SEARCH_TYPES.ENDS_WITH;if(po.indexOf(o)>=0)return e.search_value=e.search_value.slice(0,-1),$e.SEARCH_TYPES.STARTS_WITH;if(s.includes(po[0])||s.includes(po[1]))return $e.SEARCH_TYPES.EQUALS;throw new Error(d0.UNKNOWN_SEARCH_TYPE)}else switch(n){case Kc.VALUE_SEARCH_COMPARATORS.BETWEEN:return $e.SEARCH_TYPES.BETWEEN;case Kc.VALUE_SEARCH_COMPARATORS.GREATER:return $e.SEARCH_TYPES.GREATER_THAN;case Kc.VALUE_SEARCH_COMPARATORS.GREATER_OR_EQ:return $e.SEARCH_TYPES.GREATER_THAN_EQUAL;case Kc.VALUE_SEARCH_COMPARATORS.LESS:return $e.SEARCH_TYPES.LESS_THAN;case Kc.VALUE_SEARCH_COMPARATORS.LESS_OR_EQ:return $e.SEARCH_TYPES.LESS_THAN_EQUAL;default:throw new Error(d0.UNKNOWN_SEARCH_TYPE)}}a(m0,"createSearchTypeFromSearchObject");p0.exports={executeSearch:_0,createSearchTypeFromSearchObject:m0,prepSearch:Y5,searchByType:h0}});var g0=C((ROe,E0)=>{"use strict";var AOe=Ws(),z5=Au(),Q5=ie(),j5=(k(),P(q)),J5=rE();E0.exports=X5;function X5(e,t){if(!Q5.isEmpty(t)&&j5.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=z5(e,"value");if(n)throw n;return J5.prepSearch(e,t,!0)}a(X5,"lmdbGetDataByValue")});var m_=C((OOe,S0)=>{"use strict";var bOe=Ws(),Z5=Au(),e9=ie(),t9=(k(),P(q)),r9=rE();S0.exports=n9;async function n9(e,t){if(!e9.isEmpty(t)&&t9.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=Z5(e,"value");if(n)throw n;return r9.prepSearch(e,t,!1)}a(n9,"lmdbSearchByValue")});var A0=C((IOe,T0)=>{"use strict";var wOe=Ft(),Yy=class{static{a(this,"SearchByConditionsObject")}constructor(t,r,n,s,i=void 0,o=void 0,c="and"){this.schema=t,this.table=r,this.get_attributes=n,this.limit=i,this.offset=o,this.conditions=s,this.operator=c}},Wy=class{static{a(this,"SearchCondition")}constructor(t,r,n){this.search_attribute=t,this.search_type=r,this.search_value=n}},zy=class{static{a(this,"SortAttribute")}constructor(t,r){this.attribute=t,this.desc=r}};T0.exports={SearchByConditionsObject:Yy,SearchCondition:Wy,SortAttribute:zy}});var N0=C((LOe,O0)=>{"use strict";var POe=A0().SearchByConditionsObject,s9=Ws(),i9=Au(),Qy=Tu(),nE=Ft(),{Resource:DOe}=(na(),P(GA)),b0=rE(),o9=Gy(),a9=require("lodash"),{getSchemaPath:c9}=gt(),R0=_t(),{handleHDBError:l9,hdb_errors:u9}=he(),{HTTP_STATUS_CODES:d9}=u9,f9=1e8;O0.exports=_9;async function _9(e){let t=i9(e,"conditions");if(t)throw l9(t,t.message,d9.BAD_REQUEST,void 0,void 0,!0);e.operator=e.operator?e.operator.toLowerCase():void 0,e.offset=Number.isInteger(e.offset)?e.offset:0;let r=c9(e.schema,e.table),n=await R0.openEnvironment(r,e.table),s=global.hdb_schema[e.schema][e.table];for(let u of e.conditions)R0.openDBI(n,u.search_attribute);let i=a9.sortBy(e.conditions,u=>{if(u.estimated_count===void 0){let f=u.search_type;f===nE.SEARCH_TYPES.EQUALS?u.estimated_count=Qy.count(n,u.search_attribute,u.search_value):f===nE.SEARCH_TYPES.CONTAINS||f===nE.SEARCH_TYPES.ENDS_WITH?u.estimated_count=1/0:u.estimated_count=f9}return u.estimated_count}),o=n.useReadTransaction();o.database=n;let c=await y0(o,e,i[0],s.hash_attribute),l;if(!e.operator||e.operator.toLowerCase()==="and"){let u=n.dbis[s.hash_attribute],f=i.slice(1).map(b0.filterByType),d=f.length,_=Qy.setGetWholeRowAttributes(n,e.get_attributes);l=c.map(h=>u.get(h,{transaction:o,lazy:!0})),d>0&&(l=l.filter(h=>{for(let m=0;m<d;m++)if(!f[m](h))return!1;return!0})),(e.offset||e.limit!==void 0)&&(l=l.slice(e.offset,e.limit!==void 0?(e.offset||0)+e.limit:void 0)),l=l.map(h=>o9.parseRow(h,_))}else{for(let d=1;d<i.length;d++){let _=i[d],h=await y0(o,e,_,s.hash_attribute);c=c.concat(h)}let u=new Set,f=e.offset||0;c=c.filter(d=>u.has(d)?!1:(u.add(d),!0)).slice(f,e.limit&&e.limit+f),l=Qy.batchSearchByHash(o,s.hash_attribute,e.get_attributes,c)}return l.onDone=()=>{o.done()},l}a(_9,"lmdbSearchByConditions");async function y0(e,t,r,n){let s=new s9(t.schema,t.table,void 0,void 0,n,t.get_attributes),i=r.search_type;return s.search_attribute=r.search_attribute,i===nE.SEARCH_TYPES.BETWEEN?(s.search_value=r.search_value[0],s.end_value=r.search_value[1]):s.search_value=r.search_value,b0.searchByType(e,s,i,n).map(o=>o.value)}a(y0,"executeConditionSearch")});var p_=C((vOe,w0)=>{"use strict";var h9=(k(),P(q)).OPERATIONS_ENUM,jy=class{static{a(this,"DeleteObject")}constructor(t,r,n,s=void 0){this.operation=h9.DELETE,this.schema=t,this.table=r,this.hash_values=n,this.__origin=s}};w0.exports=jy});var Jy=C((xOe,U0)=>{"use strict";var D0=Ws(),L0=p_(),M0=m_(),v0=d_(),Rn=(k(),P(q)),I0=ie(),C0=_t(),{getTransactionAuditStorePath:m9,getSchemaPath:p9}=gt(),P0=ee();U0.exports=E9;async function E9(e){try{if(I0.isEmpty(global.hdb_schema[e.schema])||I0.isEmpty(global.hdb_schema[e.schema][e.table]))throw new Error(`unknown schema:${e.schema} and table ${e.table}`);await g9(e),await S9(e);let t=p9(e.schema,e.table);try{await C0.deleteEnvironment(t,e.table)}catch(r){if(r.message==="invalid environment")P0.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}try{let r=m9(e.schema,e.table);await C0.deleteEnvironment(r,e.table,!0)}catch(r){if(r.message==="invalid environment")P0.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}}catch(t){throw t}}a(E9,"lmdbDropTable");async function g9(e){let t=new D0(Rn.SYSTEM_SCHEMA_NAME,Rn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r=Array.from(await M0(t)),n=[];for(let i=0;i<r.length;i++){let o=r[i];n.push(o.id)}if(n.length===0)return;let s=new L0(Rn.SYSTEM_SCHEMA_NAME,Rn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,n);await v0(s)}a(g9,"deleteAttributesFromSystem");async function S9(e){let t=new D0(Rn.SYSTEM_SCHEMA_NAME,Rn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,e.table,void 0,[Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r,n;try{r=Array.from(await M0(t))}catch(i){throw i}for(let i=0;i<r.length;i++){let o=r[i];o.name===e.table&&o.schema===e.schema&&(n=o)}if(!n)throw new Error(`${e.schema}.${e.table} was not found`);let s=new L0(Rn.SYSTEM_SCHEMA_NAME,Rn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,[n.id]);try{await v0(s)}catch(i){throw i}}a(S9,"dropTableFromSystem")});var B0=C((HOe,x0)=>{"use strict";var T9=require("fs-extra"),A9=Ws(),R9=Ru(),y9=p_(),b9=Jy(),O9=d_(),N9=$y(),w9=m_(),Eo=(k(),P(q)),{getSchemaPath:I9}=gt(),{handleHDBError:C9,hdb_errors:P9}=he(),{HDB_ERROR_MSGS:D9,HTTP_STATUS_CODES:L9}=P9;x0.exports=M9;async function M9(e){let t;try{t=await v9(e.schema);let r=new A9(Eo.SYSTEM_SCHEMA_NAME,Eo.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,Eo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,t,void 0,[Eo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),n=Array.from(await w9(r));for(let o=0;o<n.length;o++){let c={schema:t,table:n[o].name};try{await b9(c)}catch(l){if(l.message!=="invalid environment")throw l}}let s=new y9(Eo.SYSTEM_SCHEMA_NAME,Eo.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[t]);await O9(s);let i=I9(t);await T9.remove(i)}catch(r){throw r}}a(M9,"lmdbDropSchema");async function v9(e){let t=new R9(Eo.SYSTEM_SCHEMA_NAME,Eo.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[e],[Eo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),r,n;try{r=Array.from(await N9(t))}catch(s){throw s}for(let[,s]of r)s.name===e&&(n=e);if(!n)throw C9(new Error,D9.SCHEMA_NOT_FOUND(e),L9.NOT_FOUND,void 0,void 0,!0);return n}a(v9,"validateDropSchema")});var E_=C((FOe,H0)=>{"use strict";var Xy=class{static{a(this,"CreateTableObject")}constructor(t,r,n){this.schema=t,this.table=r,this.hash_attribute=n}};H0.exports=Xy});var eb=C(($Oe,k0)=>{"use strict";var U9=require("fs-extra"),sE=_t(),{getTransactionAuditStorePath:x9}=gt(),Zy=Ft(),qOe=E_();k0.exports=B9;async function B9(e){let t;try{let r=x9(e.schema,e.table);await U9.mkdirp(r),t=await sE.createEnvironment(r,e.table,!0)}catch(r){throw r.message=`unable to create transactions audit environment for ${e.schema}.${e.table} due to: ${r.message}`,r}try{sE.createDBI(t,Zy.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,!1,!0),sE.createDBI(t,Zy.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,!0,!1),sE.createDBI(t,Zy.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME,!0,!1)}catch(r){throw r.message=`unable to create dbi for ${e.schema}.${e.table} due to: ${r.message}`,r}return t}a(B9,"createTransactionsAuditEnvironment")});var q0=C((YOe,G0)=>{"use strict";var tb=(k(),P(q)),F0=_t(),H9=Lc(),{getSystemSchemaPath:k9,getSchemaPath:F9}=gt(),KOe=co(),G9=Dp(),rb=Pp(),q9=ee(),$9=eb();G0.exports=V9;async function V9(e,t){let r=F9(t.schema,t.table),n=new rb(t.schema,t.table,tb.TIME_STAMP_NAMES_ENUM.CREATED_TIME,void 0,!0),s=new rb(t.schema,t.table,tb.TIME_STAMP_NAMES_ENUM.UPDATED_TIME,void 0,!0),i=new rb(t.schema,t.table,t.hash_attribute,void 0,!1,!0);try{if(await F0.createEnvironment(r,t.table),e!==void 0){let o=await F0.openEnvironment(k9(),tb.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME);await H9.insertRecords(o,HDB_TABLE_INFO.hash_attribute,hdb_table_attributes,[e]),n.skip_table_check=!0,s.skip_table_check=!0,i.skip_table_check=!0,await nb(n),await nb(s),await nb(i)}await $9(t)}catch(o){throw o}}a(V9,"lmdbCreateTable");async function nb(e){try{await G9(e)}catch(t){q9.warn(`failed to create attribute ${e.attribute} due to ${t.message}`)}}a(nb,"createAttribute")});var V0=C((zOe,$0)=>{"use strict";var K9=Yf(),Y9=Sf(),W9=jp(),g_=(k(),P(q)),z9=Lc().updateRecords,Q9=_t(),{getSchemaPath:j9}=gt(),J9=l_(),X9=ee();$0.exports=Z9;async function Z9(e){try{let{schema_table:t,attributes:r}=K9(e);Y9(e,r,t.hash_attribute),e.schema!==g_.SYSTEM_SCHEMA_NAME&&(r.includes(g_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(g_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(g_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(g_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await W9(e.hdb_auth_header,t,r),s=j9(e.schema,e.table),i=await Q9.openEnvironment(s,e.table),o=await z9(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await J9(e,o)}catch(c){X9.error(`unable to write transaction due to ${c.message}`)}return{written_hashes:o.written_hashes,skipped_hashes:o.skipped_hashes,schema_table:t,new_attributes:n,txn_time:o.txn_time}}catch(t){throw t}}a(Z9,"lmdbUpdateRecords")});var Y0=C((jOe,K0)=>{"use strict";var e7=(k(),P(q)).OPERATIONS_ENUM,sb=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=e7.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};K0.exports=sb});var z0=C((ZOe,W0)=>{"use strict";var XOe=Y0(),t7=Yf(),r7=Sf(),n7=jp(),S_=(k(),P(q)),s7=Lc().upsertRecords,i7=_t(),{getSchemaPath:o7}=gt(),a7=l_(),c7=ee(),{handleHDBError:l7,hdb_errors:u7}=he();W0.exports=d7;async function d7(e){let t;try{t=t7(e)}catch(l){throw l7(l,l.message,u7.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}let{schema_table:r,attributes:n}=t;r7(e,n,r.hash_attribute),e.schema!==S_.SYSTEM_SCHEMA_NAME&&(n.includes(S_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||n.push(S_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),n.includes(S_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||n.push(S_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let s=await n7(e.hdb_auth_header,r,n),i=o7(e.schema,e.table),o=await i7.openEnvironment(i,e.table),c=await s7(o,r.hash_attribute,n,e.records,e.__origin?.timestamp);try{await a7(e,c)}catch(l){c7.error(`unable to write transaction due to ${l.message}`)}return{written_hashes:c.written_hashes,schema_table:r,new_attributes:s,txn_time:c.txn_time}}a(d7,"lmdbUpsertRecords")});var j0=C((tNe,Q0)=>{"use strict";var ib=class{static{a(this,"DeleteBeforeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.timestamp=n}};Q0.exports=ib});var X0=C((nNe,J0)=>{"use strict";var ob=class{static{a(this,"DeleteAuditLogsBeforeResults")}constructor(t=void 0,r=void 0,n=0){this.start_timestamp=t,this.end_timestamp=r,this.transactions_deleted=n}};J0.exports=ob});var tx=C((oNe,ex)=>{"use strict";var ab=_t(),{getTransactionAuditStorePath:f7}=gt(),iNe=j0(),T_=Ft(),_7=ie(),Z0=X0(),h7=require("util").promisify,m7=h7(setTimeout),p7=1e4,E7=100;ex.exports=g7;async function g7(e){let t=f7(e.schema,e.table),r=await ab.openEnvironment(t,e.table,!0),n=ab.listDBIs(r);ab.initializeDBIs(r,T_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s,i=new Z0;do s=await S7(r,e.timestamp),i.start_timestamp===void 0&&(i.start_timestamp=s.start_timestamp),s.end_timestamp!==void 0&&(i.end_timestamp=s.end_timestamp),i.transactions_deleted+=s.transactions_deleted,await m7(E7);while(s.transactions_deleted>0);return i}a(g7,"deleteAuditLogsBefore");async function S7(e,t){let r=new Z0;try{let n=e.dbis[T_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP],s;for(let{key:i,value:o}of n.getRange({start:!1})){if(i>=t)break;r.start_timestamp===void 0&&(r.start_timestamp=i),s=n.remove(i);let c=o[T_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME];_7.isEmpty(c)||(s=e.dbis[T_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].remove(c,i));for(let l=0;l<o.hash_values.length;l++)s=e.dbis[T_.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].remove(o.hash_values[l],i);if(r.transactions_deleted++,r.end_timestamp=i,r.transactions_deleted>p7)break}return await s,r}catch(n){throw n}}a(S7,"deleteTransactions")});var nx=C((cNe,rx)=>{"use strict";var cb=class{static{a(this,"DropAttributeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.attribute=n}};rx.exports=cb});var ix=C((dNe,sx)=>{"use strict";var T7=Ws(),A7=p_(),uNe=nx(),Pi=(k(),P(q)),R7=ie(),lb=_t(),y7=co(),b7=m_(),O7=d_(),{getSchemaPath:N7}=gt();sx.exports=w7;async function w7(e,t=!0){let r;e.schema===Pi.SYSTEM_SCHEMA_NAME?r=y7[e.table]:r=global.hdb_schema[e.schema][e.table];let n=await C7(e),s=N7(e.schema,e.table),i=await lb.openEnvironment(s,e.table);return t===!0&&await I7(e,i,r.hash_attribute),lb.dropDBI(i,e.attribute),n}a(w7,"lmdbDropAttribute");async function I7(e,t,r){let n=lb.openDBI(t,r),s,i=e.attribute;for(let{key:o,value:c,version:l}of n.getRange({start:!1,versions:!0})){let u={};for(let f in c)f!==i&&(u[f]=c[f]);s=t.dbis[r].put(o,u,l)}await s}a(I7,"removeAttributeFromAllObjects");async function C7(e){let t=new T7(Pi.SYSTEM_SCHEMA_NAME,Pi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,Pi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[Pi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY,Pi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]),n=Array.from(await b7(t)).filter(o=>o[Pi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]===e.attribute);if(R7.isEmptyOrZeroLength(n))throw new Error(`Attribute '${e.attribute}' was not found in '${e.schema}.${e.table}'`);let s=n.map(o=>o[Pi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),i=new A7(Pi.SYSTEM_SCHEMA_NAME,Pi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,s);return O7(i)}a(C7,"dropAttributeFromSystem")});var dx=C((hNe,ux)=>{"use strict";var ub=_t(),yu=Ft(),_Ne=un(),db=(k(),P(q)),ox=ie(),{getTransactionAuditStorePath:P7}=gt(),D7=Tu(),iE=Eu(),L7=ee();ux.exports=M7;async function M7(e){let t=P7(e.schema,e.table),r=await ub.openEnvironment(t,e.table,!0),n=ub.listDBIs(r);ub.initializeDBIs(r,yu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s;switch(e.search_type){case db.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.TIMESTAMP:return ax(r,e.search_values);case db.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:return s=global.hdb_schema[e.schema][e.table].hash_attribute,U7(r,e.search_values,s);case db.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME:return v7(r,e.search_values);default:return ax(r)}}a(M7,"readAuditLog");function ax(e,t=[0,Date.now()]){ox.isEmpty(t[0])&&(t[0]=0),ox.isEmpty(t[1])&&(t[1]=Date.now());let r=e.dbis[yu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP],n;for(let s of r.getKeys({start:t[1]}))if(s!==t[1]){n=s;break}return r.getRange({start:t[0],end:n}).map(({value:s})=>Object.assign(new iE,s))}a(ax,"searchTransactionsByTimestamp");function v7(e,t=[]){let r=new Map;for(let n=0;n<t.length;n++){let s=t[n],i=[];for(let o of e.dbis[yu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].getValues(s))i.push(o);r.set(s,lx(e,i))}return Object.fromEntries(r)}a(v7,"searchTransactionsByUsername");function U7(e,t,r){let n=new Map;for(let c=0,l=t.length;c<l;c++){let u=t[c],f=D7.equals(e,yu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,yu.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,u);for(let{value:d}of f){let _=Number(d);n.has(_)?n.get(_).push(u.toString()):n.set(_,[u.toString()])}}let s=Array.from(n.keys()),i=lx(e,s),o=new Map;for(let c=0;c<i.length;c++){let l=i[c],u=l.timestamp,f=n.get(u);cx(l,"records",r,f,o),cx(l,"original_records",r,f,o)}return Object.fromEntries(o)}a(U7,"searchTransactionsByHashValues");function cx(e,t,r,n,s){let i=e.timestamp;if(e[t])for(let o=0;o<e[t].length;o++){let c=e[t][o],l=c[r].toString();if(n.indexOf(l)>=0)if(s.has(l)){let u=s.get(l),f=u[u.length-1];if(f.timestamp===i)f[t]=[c];else{let d=new iE(e.operation,e.user_name,i,void 0);d[t]=[c],u.push(d)}}else{let u=new iE(e.operation,e.user_name,i,void 0);u[t]=[c],s.set(l,[u])}}}a(cx,"loopRecords");function lx(e,t){let r=[];try{let n=e.dbis[yu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP];for(let s=0;s<t.length;s++)try{let i=n.get(t[s]);if(i){let o=Object.assign(new iE,i);r.push(o)}}catch(i){L7.warn(i)}return r}catch(n){throw n}}a(lx,"batchSearchTransactions")});var _x=C((gNe,fx)=>{"use strict";var{getSchemaPath:pNe}=gt(),ENe=_t(),{database:x7}=(xe(),P(ct));fx.exports={writeTransaction:B7};async function B7(e,t,r){return x7({database:e,table:t}).transaction(r)}a(B7,"writeTransaction")});var Ex=C((TNe,px)=>{"use strict";var{getSchemaPath:hx}=gt(),mx=_t();px.exports={flush:H7,resetReadTxn:k7};async function H7(e,t){return(await mx.openEnvironment(hx(e,t),t.toString())).flushed}a(H7,"flush");async function k7(e,t){try{(await mx.openEnvironment(hx(e,t),t.toString())).resetReadTxn()}catch{}}a(k7,"resetReadTxn")});var Ax=C((RNe,Tx)=>{"use strict";var{Readable:F7}=require("stream"),{getDatabases:G7}=(xe(),P(ct)),{readSync:q7,openSync:$7,createReadStream:gx}=require("fs"),{open:V7}=require("lmdb"),Sx=Gf(),K7=qf(),{AUDIT_STORE_OPTIONS:Y7}=(Ti(),P(Rx)),{INTERNAL_DBIS_NAME:W7,AUDIT_STORE_NAME:z7}=Ft();Tx.exports=j7;var fb=32768,Q7=100;async function j7(e){let t=e.database||e.schema||"data",r=G7()[t],n=new Date().toISOString(),s=e.tables||e.table&&[e.table];if(s){let u=r[s[0]];if(!u)throw new Error(`Can not find table ${s[0]}`);let f=u.dbisDB,d=V7({noSync:!0,maxDbs:K7.MAX_DBS}),_,h=d.openDB(W7,new Sx(!1)),m=f.useReadTransaction(),S=0,g=a(async function(E,T){T.encoding="binary",T.encoder=void 0;let N=d.openDB(E,T),M=f.openDB(E,T);for(let{key:H,version:X,value:W}of M.getRange({start:null,transaction:m,versions:M.useVersions}))_=N.put(H,W,X),S++%Q7===0&&(await new Promise($=>setTimeout($,20)),m.openTimer&&(m.openTimer=0))},"copyDatabase");for(let{key:E,value:T}of f.getRange({transaction:m,start:!1}))if(s.some(N=>E.startsWith?.(N+"/"))){h.put(E,T);let[,N]=E.split("/"),M=!N,H=new Sx(!M,M);await g(E,H)}e.include_audit&&await g(z7,{...Y7}),await _;let R=gx(d.path);return R.headers=l(),R.on("close",()=>{m.done(),d.close()}),R}let o=r[Object.keys(r)[0]].primaryStore,c=$7(o.path);return o.transaction(()=>{let u=Buffer.alloc(fb);q7(c,u,0,fb),o.resetReadTxn();let f=o.useReadTransaction();f.renew();let d=gx(null,{fd:c,start:fb}),_=new F7.from(async function*(){yield u;for await(let h of d)f.openTimer&&(f.openTimer=0),yield h;f.done()}());return _.headers=l(),_});function l(){let u=new Map;return u.set("content-type","application/octet-stream"),u.set("content-disposition",`attachment; filename="${t}"`),u.set("date",n),u}}a(j7,"getBackup")});var Ox=C((bNe,bx)=>{"use strict";var J7=ee(),{handleHDBError:X7}=he(),Z7=xL(),eee=Dp(),tee=xy(),ree=BU(),nee=d_(),see=$y(),iee=l0(),oee=g0(),aee=m_(),cee=N0(),lee=B0(),uee=q0(),dee=V0(),fee=z0(),_ee=tx(),hee=Jy(),mee=ix(),pee=dx(),Eee=_x(),yx=Ex(),gee=Ax(),_b=class extends Z7{static{a(this,"LMDBBridge")}async searchByConditions(t){return cee(t)}async getDataByHash(t){return await see(t)}async searchByHash(t){return await iee(t)}async getDataByValue(t,r){return await oee(t,r)}async searchByValue(t){return await aee(t)}async createSchema(t){return await ree(t)}async dropSchema(t){return await lee(t)}async createTable(t,r){return await uee(t,r)}async dropTable(t){return await hee(t)}async createAttribute(t){return await eee(t)}async createRecords(t){return await tee(t)}async updateRecords(t){return await dee(t)}async upsertRecords(t){try{return await fee(t)}catch(r){throw X7(r,null,null,J7.ERR,r)}}async deleteRecords(t){return await nee(t)}async dropAttribute(t){return await mee(t)}async deleteAuditLogsBefore(t){return await _ee(t)}async readAuditLog(t){return await pee(t)}writeTransaction(t,r,n){return Eee.writeTransaction(t,r,n)}flush(t,r){return yx.flush(t,r)}resetReadTxn(t,r){return yx.resetReadTxn(t,r)}getBackup(t){return gee(t)}};bx.exports=_b});var mb={};Ue(mb,{add:()=>oE,applyReverse:()=>Nx,getRecordAtTime:()=>hb,rebuildUpdateBefore:()=>aE});function oE(e,t,r){let n=e[t];typeof n=="bigint"?e[t]=n+BigInt(r.value):isNaN(e[t])?e[t]=r.value:e[t]=n+r.value}function aE(e,t,r){let n=null;for(let s in e)if(s in t){let i=t[s];if(i?.__op__){let o=e[s];if(o?.__op__)if(o.__op__===i.__op__)n||(n={}),n[s]=o;else throw new Error("Can not merge updates with different operations");else n||(n={}),n[s]=o,oE(n,s,i)}else r&&(n||(n={}),n[s]=i)}else n||(n={}),n[s]=e[s];return n}function Nx(e,t){for(let r in t){let n=t[r];if(n?.__op__){let s=See[n.__op__]?.reverse;if(s)s(e,r,{value:n.value});else throw new Error(`Unsupported operation ${n.__op__}`)}else e[r]=wx}}function hb(e,t,r){let n=r.rootStore.auditStore,s={...e.value},i=e.localTime;for(;i>t;){let l=n.get(i),u=St(l);switch(u.type){case"put":s=u.getValue(r);break;case"patch":Nx(s,u.getValue(r));break;case"delete":s=null}i=u.previousLocalTime}let o={},c=0;for(let l in s)s[l]===wx&&(o[l]=!0,c++);for(;c>0&&i>0;){let l=n.get(i),u=St(l),f;switch(u.type){case"put":f=u.getValue(r);break;case"patch":f=u.getValue(r);break}for(let d in f)o[d]&&(s[d]=f[d],o[d]=!1,c--);i=u.previousLocalTime}if(c>0)for(let l in o)s[l]=null;return s}var See,wx,cE=Re(()=>{Ti();a(oE,"add");oE.reverse=function(e,t,r){let n=e[t];typeof n=="bigint"?e[t]=n-BigInt(r.value):isNaN(e[t])||(e[t]=n-r.value)};See={add:oE};a(aE,"rebuildUpdateBefore");a(Nx,"applyReverse");wx={};a(hb,"getRecordAtTime")});function yn(e){let t=e.getChanges();return t||(t=Object.create(null),e._setChanges(t)),t}function fE(e,t){let r=e.prototype,n={},s=t.attributes||t.properties||[];for(let c of s){let l=c.name,u,f;if(c.resolve)f={get(){return c.resolve(this,this.getContext?.())},set(d){return c.set(this,d)},configurable:!0};else{switch(c.type){case"String":u=a(function(d){if(!(typeof d=="string"||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a string, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"ID":u=a(function(d){if(!(typeof d=="string"||d?.length>0&&d.every?.(_=>typeof _=="string")||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a string, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Float":case"Number":u=a(function(d){let _=d?.__op__?d.value:d;if(!(typeof _=="number"||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a number, attempt to assign ${_}`);yn(this)[l]=d},"set");break;case"Int":u=a(function(d){let _=d?.__op__?d.value:d;if(!(_>>0===_||d==null&&c.nullable!==!1))if(typeof _=="number"&&Math.abs((_>>0)-_)<=1)_=Math.round(_),d?.__op__?d.value=_:d=_;else throw new zn.ClientError(`${l} must be an integer between -2147483648 and 2147483647, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Long":u=a(function(d){let _=d?.__op__?d.value:d;if(!(Math.round(_)===d&&Math.abs(_)<=9007199254740992||d==null&&c.nullable!==!1))if(typeof _=="number"&&Math.abs(_)<=9007199254740992)_=Math.round(_),d?.__op__?d.value=_:d=_;else throw new zn.ClientError(`${l} must be an integer between -9007199254740992 and 9007199254740992, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"BigInt":u=a(function(d){let _=d?.__op__?d.value:d;if(!(typeof _=="bigint"||d==null&&c.nullable!==!1))if(typeof _=="string"||typeof _=="number")_=BigInt(_),d?.__op__?d.value=_:d=_;else throw new zn.ClientError(`${l} must be a number, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Boolean":u=a(function(d){if(!(typeof d=="boolean"||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a boolean, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Date":u=a(function(d){if(!(d instanceof Date||d==null&&c.nullable!==!1))if(typeof d=="string"||typeof d=="number")d=new Date(d);else throw new zn.ClientError(`${l} must be a Date, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Bytes":u=a(function(d){if(!(d instanceof Uint8Array||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a Buffer or Uint8Array, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Blob":u=a(function(d){if(!(d instanceof Si||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a Blob, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Any":case void 0:u=a(function(d){yn(this)[l]=d},"set");break;default:u=a(function(d){if(!(typeof d=="object"||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be an object, attempt to assign ${d}`);yn(this)[l]=d},"set")}f={get(){let d=this.getChanges?.();if(d&&l in d){let h=d[l];if(h?.__op__){let m=this.getRecord()?.[l];return h.update(m)}return h}let _=this.getRecord()?.[l];if(_&&typeof _=="object"){let h=pb(_,c);if(h)return d||this._setChanges(d=Object.create(null)),d[l]=h}return _},set:u,enumerable:!0,configurable:!0}}f.get.isAttribute=!0,n[l]=f,(!(l in r)||Object.getOwnPropertyDescriptor(r,l)?.get?.isAttribute)&&Object.defineProperty(r,l,f)}i("getProperty",function(c){let l=n[c];if(l)return l.get.call(this);let u=this.getChanges();return u?.[c]!==void 0?u[c]:this.getRecord()?.[c]}),i("set",function(c,l){let u=n[c];if(u)return u.set.call(this,l);if(t.sealed)throw new zn.ClientError("Can not add a property to a sealed table schema");yn(this)[c]=l}),i("deleteProperty",function(c){yn(this)[c]=void 0}),i("toJSON",function(){let c=this.getChanges?.(),l;for(let f in c){l||(l={...this.getRecord()});let d=c[f];if(d?.__op__){let _=l[f];d=d.update(_)}l[f]=d}return Object.keys(this).length>0&&(l||(l={...this.getRecord()}),Object.assign(l,this)),l||this.getRecord()}),r.get||i("get",r.getProperty),r.delete||i("delete",r.deleteProperty),r.then||i("then",null);function i(c,l){Object.defineProperty(r,c,{value:l,configurable:!0})}a(i,"setMethod");let o=r;do{let c=Object.getPrototypeOf(o);if(c===Object.prototype){Object.setPrototypeOf(o,Cx);break}o=c}while(o&&o!==Cx)}function pb(e,t){let r;switch(e.constructor){case Object:return t?(r=t.TrackedObject,r||(t.TrackedObject=r=class extends A_{static{a(this,"TrackedObject")}},fE(r,t)),new r(e)):new A_(e);case Array:let n=new uE(e.length,e);for(let s=0,i=e.length;s<i;s++){let o=e[s];o&&typeof o=="object"&&(o=pb(o,t?.elements)),n[s]=o}return n;default:return e}}function _E(e){let t=e.getChanges?.(),r;for(let s in t){r||(r=e.getRecord?{...e.getRecord()}:{});let i=t[s];if(i&&typeof i=="object")if(i.__op__){let o=r[s];i=i.update(o)}else i=_E(i);r[s]=i}return Object.keys(e).length>0&&(r||(r=e.getRecord?{...e.getRecord()}:{}),Object.assign(r,e)),r||e.getRecord?.()||e}function bu(e,t=e.getChanges?.()){let r;if(e.getRecord&&e.constructor===Array&&!Object.isFrozen(e)){r=e;for(let n=0,s=e.length;n<s;n++){let i=e[n];if(i&&typeof i=="object"){let o=bu(i);o!==i&&r===e&&(r=e.slice(0)),i=o}r[n]=i}return Object.freeze(r)}for(let n in t){r||(r={...e.getRecord?.()});let s=t[n];if(s&&typeof s=="object")if(s.__op__){let i=mb[s?.__op__];if(i)i(r,n,s);else throw new Error("Invalid CRDT operation "+s.__op__);continue}else s=bu(s);r[n]=s}if(!Array.isArray(e))for(let n in e)Tee.call(e,n)&&(r||(r={...e.getRecord?.()}),r[n]=e[n]);return r?Object.freeze(r):e.getRecord?.()??e}function lE(e){let t=e.getRecord?.();if(t===void 0)return!0;if(e.constructor===Array){if(!t||e[Yc]||e.length!==t.length)return!0;for(let r=0,n=e.length;r<n;r++){let s=t[r],i=e[r];if(s&&i?.getRecord?.()===s){if(lE(i))return!0}else return!0}}else{let r=e.getChanges?.();if(r&&!t)return!0;for(let n in r){let s=r[n];if(s&&typeof s=="object"){let i=t[n];if(i&&s.getRecord?.()===i){if(lE(s))return!0}else return!0}else return!0}}return!1}var zn,Ix,Cx,A_,Tee,Yc,uE,dE,Eb=Re(()=>{zn=v(he());cE();pn();a(yn,"getChanges");a(fE,"assignTrackedAccessors");Ix=Object.prototype,Cx=new Proxy({},{get(e,t,r){if(typeof t=="string"){if(t==="then"||t==="getRecord"||t==="getChanges")return;if(Ix[t])return Ix[t];let n=r.getChanges?.();if(n&&t in n)return n[t];let s=r.getRecord?.()?.[t];if(s&&typeof s=="object"){let i=pb(s);if(i)return n||(n=Object.create(null),r._setChanges(n)),n[t]=i,i}return s}}});a(pb,"trackObject");A_=class{static{a(this,"GenericTrackedObject")}#e;#t;constructor(t){if(t?.getRecord)throw new Error("Can not track an already tracked object, check for circular references");this.#e=t}getRecord(){return this.#e}setRecord(t){this.#e=t}getChanges(){return this.#t}_setChanges(t){this.#t=t}};fE(A_,{});a(_E,"collapseData");Tee=Object.prototype.hasOwnProperty;a(bu,"updateAndFreeze");a(lE,"hasChanges");Yc=Symbol.for("has-array-changes"),uE=class extends Array{static{a(this,"TrackedArray")}#e;[Yc];constructor(t,r){super(t),this.#e=r}getRecord(){return this.#e}splice(...t){return this[Yc]=!0,super.splice(...t)}push(...t){return this[Yc]=!0,super.push(...t)}pop(){return this[Yc]=!0,super.pop()}unshift(...t){return this[Yc]=!0,super.unshift(...t)}shift(){return this[Yc]=!0,super.shift()}};uE.prototype.constructor=Array;dE=class{constructor(t){this.value=t}static{a(this,"Addition")}__op__="add";update(t){return(+t||0)+this.value}}});var Bx={};Ue(Bx,{ResourceBridge:()=>Tb});function Ab({get_attributes:e},t){if(e){if(e[0]==="*"){if(t.schemaDefined)return;e=t.attributes.map(r=>r.name)}return e.forceNulls=!0,e}}function Dx(e,t){let r=Di(e),n=Ab(e,r);if(!r)throw new zs.ClientError(`Table ${e.table} not found`);let s;n&&r.attributes.length-n.length>2&&n.length<5&&(s=!0);let i={user:e.hdb_user,onlyIfCached:e.onlyIfCached,noCacheStore:e.noCacheStore,noCache:e.noCache,replicateFrom:e.replicateFrom},o;It(i,()=>new Promise(u=>o=u));let c=e.ids||e.hash_values,l=0;return{[Symbol.asyncIterator](){return{async next(){if(l<c.length){let u=c[l++],f;try{f=await r.get({id:u,lazy:s,select:n},i),f=f&&_E(f)}catch(d){f={message:d.toString()}}return t?{value:{key:u,value:f}}:{value:f}}else return o(),{done:!0}},return(u){return o(),{value:u,done:!0}},throw(u){return o(),{done:!0}}}}}}function Di(e){let t=e.database||e.schema||Ree,r=Xe()[t];if(!r)throw(0,zs.handleHDBError)(new Error,Aee.SCHEMA_NOT_FOUND(t),404);return r[e.table]}function Lx(e,t,r){let n=e.length+t.length,s=n===1?"record":"records";return{message:`${e.length} of ${n} ${s} successfully deleted`,deleted_hashes:e,skipped_hashes:t,txn_time:r}}async function*Mx(e,t,r,n){let s,i=0;for await(let o of e.getHistory(t,r)){let c=o.operation??o.type;c==="put"&&(c="upsert");let{id:l,version:u,value:f}=o;if(s?.timestamp===u)s.hash_values.push(l),s.records.push(f);else{if(s&&(yield s,i++,n&&n<=i)){s=void 0;break}s={operation:c,user_name:o.user,timestamp:u,hash_values:[l],records:[f]}}}s&&(yield s)}var vx,hE,zs,Ux,gb,Sb,xx,Aee,Ree,yee,bee,Px,Tb,Hx=Re(()=>{"use strict";vx=v(Ox()),hE=v(Au()),zs=v(he());xe();Ux=v(Yf());k();gb=v(mo()),Sb=v(Ys()),xx=v(ie());mc();Eb();({HDB_ERROR_MSGS:Aee}=zs.hdb_errors),Ree="data",yee=1e4,bee=10,Tb=class extends vx.default{static{a(this,"ResourceBridge")}constructor(t){super(t),Px=this}async searchByConditions(t){t.select!==void 0&&(t.get_attributes=t.select);for(let o of t.conditions||[])o?.attribute!==void 0&&(o.search_attribute=o.attribute),o?.comparator!==void 0&&(o.search_type=o.comparator),o?.value!==void 0&&(o.search_value=o.value);let r=(0,hE.default)(t,"conditions");if(r)throw(0,zs.handleHDBError)(r,r.message,400,void 0,void 0,!0);let n=Di(t);if(!n)throw new zs.ClientError(`Table ${t.table} not found`);let s=t.conditions.map(i);function i(o){return o.conditions?(o.conditions=o.conditions.map(i),o):{attribute:o.search_attribute??o.attribute,comparator:o.search_type??o.comparator,value:o.search_value!==void 0?o.search_value:o.value}}return a(i,"mapCondition"),n.search({conditions:s,operator:t.operator?t.operator.toLowerCase():void 0,limit:t.limit,offset:t.offset,reverse:t.reverse,select:Ab(t,n),sort:t.sort,allowFullScan:!0},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async createTable(t,r){let n=r.attributes,s=!!n,i=r.primary_key||r.hash_attribute;if(n)for(let o of n)o.is_primary_key?(o.isPrimaryKey=!0,delete o.is_primary_key):o.name===i&&i&&(o.isPrimaryKey=!0);else{if(!i)throw new zs.ClientError("A primary key must be specified with a `primary_key` property or with `attributes`");n=[{name:i,isPrimaryKey:!0},{name:"__createdtime__",indexed:!0},{name:"__updatedtime__",indexed:!0}]}ft({database:r.database??r.schema,table:r.table,attributes:n,schemaDefined:s,expiration:r.expiration,audit:r.audit})}async createAttribute(t){return await Di(t).addAttributes([{name:t.attribute,indexed:t.indexed??!0}]),`attribute ${t.schema}.${t.table}.${t.attribute} successfully created.`}async dropAttribute(t){let r=Di(t);if(await r.removeAttributes([t.attribute]),!r.schemaDefined){let n=t.attribute,s,i=a((o,c,l)=>(c={...c},delete c[n],r.primaryStore.ifVersion(o,l,()=>r.primaryStore.put(o,c,l)).then(u=>{if(!u){let{value:f,version:d}=r.primaryStore.getEntry(o);return i(o,f,d)}})),"deleteRecord");for(let{key:o,value:c,version:l}of r.primaryStore.getRange({start:!0,versions:!0}))s=i(o,c,l),await new Promise(u=>setImmediate(u));await s}return`successfully deleted ${t.schema}.${t.table}.${t.attribute}`}dropTable(t){Di(t).dropTable()}createSchema(t){return Ou({database:t.schema,table:null}),gb.signalSchemaChange(new Sb.SchemaEventMsg(process.pid,Yt.CREATE_SCHEMA,t.schema))}async dropSchema(t){await Rb(t.schema),gb.signalSchemaChange(new Sb.SchemaEventMsg(process.pid,Yt.DROP_SCHEMA,t.schema))}async updateRecords(t){return t.requires_existing=!0,this.upsertRecords(t)}async createRecords(t){return t.requires_no_existing=!0,Px.upsertRecords(t)}async upsertRecords(t){let{schema_table:r,attributes:n}=(0,Ux.default)(t),s,i=Xe()[t.schema][t.table],o={user:t.hdb_user,expiresAt:t.expiresAt,originatingOperation:t.operation};return t.replicateTo&&(o.replicateTo=t.replicateTo),t.replicatedConfirmation&&(o.replicatedConfirmation=t.replicatedConfirmation),It(o,async c=>{if(!i.schemaDefined){s=[];for(let f of n)i.attributes.find(_=>_.name==f)||s.push(f);s.length>0&&await i.addAttributes(s.map(f=>({name:f,indexed:!0})))}let l=[],u=[];for(let f of t.records){let d=f[i.primaryKey],_=d!=null&&await i.get(d,o);if(t.requires_existing&&!_||t.requires_no_existing&&_){u.push(f[i.primaryKey]);continue}_&&(_=_E(_));for(let h in f)if(Object.prototype.hasOwnProperty.call(f,h)){let m=f[h];if(typeof m=="function")try{let S=m([[_]]);Array.isArray(S)&&(m=S[0].func_val,f[h]=m)}catch(S){throw S.message+="Trying to set key "+h+" on object"+JSON.stringify(f),S}}if(_)for(let h in _)Object.prototype.hasOwnProperty.call(f,h)||(f[h]=_[h]);await(d==null?i.create(f,o):i.put(f,o)),l.push(f[i.primaryKey])}return{txn_time:c.timestamp,written_hashes:l,new_attributes:s,skipped_hashes:u}})}async deleteRecords(t){let r=Xe()[t.schema][t.table],n={user:t.hdb_user};return t.replicateTo&&(n.replicateTo=t.replicateTo),t.replicatedConfirmation&&(n.replicatedConfirmation=t.replicatedConfirmation),It(n,async s=>{let i=t.hash_values||t.records.map(l=>l[r.primaryKey]),o=[],c=[];for(let l of i)await r.delete(l,n)?o.push(l):c.push(l);return Lx(o,c,s.timestamp)})}async deleteRecordsBefore(t){let r=Xe()[t.schema][t.table];if(!r.createdTimeProperty)throw new zs.ClientError("Table must have a '__createdtime__' attribute or @createdTime timestamp defined to perform this operation");let n=await r.search({conditions:[{attribute:r.createdTimeProperty.name,value:Date.parse(t.date),comparator:Um.LESS}]}),s=!1,i=[],o=[],c=0,l=[],u=a(async()=>{let f=await this.deleteRecords({schema:t.schema,table:t.table,hash_values:l});i.push(...f.deleted_hashes),o.push(...f.skipped_hashes),await(0,xx.async_set_timeout)(bee),l=[],s=!0},"chunkDelete");for await(let f of n)l.push(f[r.primaryKey]),c++,c%yee===0&&await u();return l.length>0&&await u(),s?Lx(i,o,void 0):{message:"No records found to delete"}}searchByHash(t){t.select!==void 0&&(t.get_attributes=t.select);let r=(0,hE.default)(t,"hashes");if(r)throw r;return Dx(t)}async getDataByHash(t){let r=new Map;t._returnKeyValue=!0;for await(let{key:n,value:s}of Dx(t,!0))r.set(n,s);return r}searchByValue(t,r){if(r&&TA[r]===void 0)throw new Error(`Value search comparator - ${r} - is not valid`);t.select!==void 0&&(t.get_attributes=t.select),t.attribute!==void 0&&(t.search_attribute=condition.attribute),t.value!==void 0&&(t.search_value=condition.value);let n=(0,hE.default)(t,"value");if(n)throw n;let s=Di(t);if(!s)throw new zs.ClientError(`Table ${t.table} not found`);let i=t.search_value;i.includes?.("*")&&(i.startsWith("*")?i.endsWith("*")?i!=="*"&&(r="contains",i=i.slice(1,-1)):(r="ends_with",i=i.slice(1)):i.endsWith("*")&&(r="starts_with",i=i.slice(0,-1))),r===Um.BETWEEN&&(i=[i,t.end_value]);let o=i==="*"?[]:[{attribute:t.search_attribute,value:i,comparator:r}];return s.search({conditions:o,allowFullScan:!0,limit:t.limit,offset:t.offset,reverse:t.reverse,sort:t.sort,select:Ab(t,s)},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async getDataByValue(t,r){let n=new Map,s=Di(t);t.get_attributes&&!t.get_attributes.includes(s.primaryKey)&&t.get_attributes[0]!=="*"&&t.get_attributes.push(s.primaryKey);for await(let i of this.searchByValue(t,r))n.set(i[s.primaryKey],i);return n}resetReadTxn(t,r){Di({schema:t,table:r})?.primaryStore.resetReadTxn()}async deleteAuditLogsBefore(t){return Di(t).deleteHistory(t.timestamp,t.cleanup_deleted_records)}async readAuditLog(t){let r=Di(t),n={};switch(t.search_type){case xm.HASH_VALUE:for(let i of t.search_values)n[i]=(await r.getHistoryOfRecord(i)).map(o=>{let c=o.operation??o.type;return c==="put"&&(c="upsert"),{operation:c,timestamp:o.version,user_name:o.user,hash_values:[i],records:[o.value]}});return n;case xm.USERNAME:let s=t.search_values;for await(let i of Mx(r))s.includes(i.user_name)&&(n[i.user_name]||(n[i.user_name]=[])).push(i);return n;default:return Mx(r,t.search_values?.[0],t.search_values?.[1],t.limit)}}};a(Ab,"getSelect");a(Dx,"getRecords");a(Di,"getTable");a(Lx,"createDeleteResponse");a(Mx,"groupRecordsInHistory")});var qn=C((BNe,kx)=>{"use strict";var{ResourceBridge:Oee}=(Hx(),P(Bx)),Nee=le();Nee.initSync();var mE;function wee(){return mE||(mE=new Oee,mE)}a(wee,"getBridge");kx.exports=wee()});var An=C((kNe,$x)=>{"use strict";var EE=dR(),xr=ie(),Iee=require("util"),gE=qn(),Cee=$s(),Fx=ee(),{handleHDBError:Wc,hdb_errors:Pee}=he(),{HTTP_STATUS_CODES:zc}=Pee,Dee=Iee.promisify(Cee.getTableSchema),Lee="updated",Gx="inserted",qx="upserted";$x.exports={insert:vee,update:Uee,upsert:xee,validation:Mee,flush:Bee};async function Mee(e){if(xr.isEmpty(e))throw new Error("invalid update parameters defined.");if(xr.isEmptyOrZeroLength(e.schema))throw new Error("invalid database specified.");if(xr.isEmptyOrZeroLength(e.table))throw new Error("invalid table specified.");let t=await Dee(e.schema,e.table),r=EE(e);if(r)throw r;if(!Array.isArray(e.records))throw new Error("records must be an array");let n=t.hash_attribute,s=new Set,i={},o=!1;return e.operation==="update"&&(o=!0),e.records.forEach(c=>{if(o&&xr.isEmptyOrZeroLength(c[n]))throw Fx.error("a valid hash attribute must be provided with update record:",c),new Error("a valid hash attribute must be provided with update record");if(!xr.isEmptyOrZeroLength(c[n])&&(c[n]==="null"||c[n]==="undefined"))throw Fx.error(`a valid hash value must be provided with ${e.operation} record:`,c),new Error(`"${c[n]}" is not a valid hash attribute value`);!xr.isEmpty(c[n])&&c[n]!==""&&s.has(xr.autoCast(c[n]))&&(c.skip=!0),s.add(xr.autoCast(c[n]));for(let l in c)i[l]=1}),i[n]=1,{schema_table:t,hashes:Array.from(s),attributes:Object.keys(i)}}a(Mee,"validation");async function vee(e){if(e.operation!=="insert")throw new Error("invalid operation, must be insert");let t=EE(e);if(t)throw Wc(new Error,t.message,zc.BAD_REQUEST);xr.transformReq(e);let r=xr.checkSchemaTableExist(e.schema,e.table);if(r)throw Wc(new Error,r,zc.BAD_REQUEST);let n=await gE.createRecords(e);return pE(Gx,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time)}a(vee,"insertData");async function Uee(e){if(e.operation!=="update")throw new Error("invalid operation, must be update");let t=EE(e);if(t)throw Wc(new Error,t.message,zc.BAD_REQUEST);xr.transformReq(e);let r=xr.checkSchemaTableExist(e.schema,e.table);if(r)throw Wc(new Error,r,zc.BAD_REQUEST);let n=await gE.updateRecords(e);return xr.isEmpty(n.existing_rows)?pE(Lee,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time):pE(n.update_action,[],e,n.hashes,void 0,n.txn_time)}a(Uee,"updateData");async function xee(e){if(e.operation!=="upsert")throw Wc(new Error,"invalid operation, must be upsert",zc.INTERNAL_SERVER_ERROR);let t=EE(e);if(t)throw Wc(new Error,t.message,zc.BAD_REQUEST);xr.transformReq(e);let r=xr.checkSchemaTableExist(e.schema,e.table);if(r)throw Wc(new Error,r,zc.BAD_REQUEST);let n=await gE.upsertRecords(e);return pE(qx,n.written_hashes,e,[],n.new_attributes,n.txn_time)}a(xee,"upsertData");function pE(e,t,r,n,s,i){let o={message:`${e} ${t.length} of ${t.length+n.length} records`,new_attributes:s,txn_time:i};return e===Gx?(o.inserted_hashes=t,o.skipped_hashes=n,o):e===qx?(o.upserted_hashes=t,o):(o.update_hashes=t,o.skipped_hashes=n,o)}a(pE,"returnObject");function Bee(e){return xr.transformReq(e),gE.flush(e.schema,e.table)}a(Bee,"flush")});var Qx=C((GNe,zx)=>{var Nu=require("validate.js"),Kx=ot(),wu=(k(),P(q)),{handleHDBError:Hee,hdb_errors:kee}=he(),{HDB_ERROR_MSGS:Qt,HTTP_STATUS_CODES:Fee}=kee,yb=a(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Gee={STRUCTURE_USER:"structure_user"},Vx=Object.values(wu.ROLE_TYPES_ENUM),qee="attribute_permissions",$ee="attribute_name",{PERMS_CRUD_ENUM:Iu}=wu,Vee=[qee,...Object.values(Iu)],Yx=[Iu.READ,Iu.INSERT,Iu.UPDATE],Kee=[$ee,...Yx];function Yee(e){let t=yb();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,Wx(e,t)}a(Yee,"addRoleValidation");function Wee(e){let t=yb();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,Wx(e,t)}a(Wee,"alterRoleValidation");function zee(e){let t=yb();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,Kx.validateObject(e,t)}a(zee,"dropRoleValidation");var Qee=["operation","role","id","permission","hdb_user","access"];function Wx(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let o=0,c=n.length;o<c;o++)Qee.includes(n[o])||s.push(n[o]);s.length>0&&nr(Qt.INVALID_ROLE_JSON_KEYS(s),r);let i=Kx.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{nr(o,r)}),e.permission){let o=jee(e);o&&nr(o,r),Vx.forEach(c=>{e.permission[c]&&!Nu.isBoolean(e.permission[c])&&nr(Qt.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let o in e.permission)if(Vx.indexOf(o)<0){if(o===Gee.STRUCTURE_USER){let l=e.permission[o];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,f=l.length;u<f;u++){let d=l[u];global.hdb_schema[d]||nr(Qt.SCHEMA_NOT_FOUND(d),r)}continue}nr(Qt.STRUCTURE_USER_ROLE_TYPE_ERROR(o),r);continue}let c=e.permission[o];if(!o||!global.hdb_schema[o]){nr(Qt.SCHEMA_NOT_FOUND(o),r);continue}if(c.tables)for(let l in c.tables){let u=c.tables[l];if(!l||!global.hdb_schema[o][l]){nr(Qt.TABLE_NOT_FOUND(o,l),r);continue}if(Object.keys(u).forEach(f=>{Vee.includes(f)||nr(Qt.INVALID_PERM_KEY(f),r,o,l)}),Object.values(Iu).forEach(f=>{Nu.isDefined(u[f])?Nu.isBoolean(u[f])||nr(Qt.TABLE_PERM_NOT_BOOLEAN(f),r,o,l):nr(Qt.TABLE_PERM_MISSING(f),r,o,l)}),u.attribute_permissions===void 0){nr(Qt.ATTR_PERMS_ARRAY_MISSING,r,o,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){nr(Qt.ATTR_PERMS_NOT_ARRAY,r,o,l);continue}if(u.attribute_permissions){let f=global.hdb_schema[o][l].attributes.map(({attribute:_})=>_),d={read:!1,insert:!1,update:!1};for(let _ in u.attribute_permissions){let h=u.attribute_permissions[_];if(Object.keys(h).forEach(S=>{!Kee.includes(S)&&S!==Iu.DELETE&&nr(Qt.INVALID_ATTR_PERM_KEY(S),r,o,l)}),!Nu.isDefined(h.attribute_name)){nr(Qt.ATTR_PERM_MISSING_NAME,r,o,l);continue}let m=h.attribute_name;if(!f.includes(m)){nr(Qt.INVALID_ATTRIBUTE_IN_PERMS(m),r,o,l);continue}Yx.forEach(S=>{Nu.isDefined(h[S])?Nu.isBoolean(h[S])||nr(Qt.ATTR_PERM_NOT_BOOLEAN(S,m),r,o,l):nr(Qt.ATTR_PERM_MISSING(S,m),r,o,l)}),!d.read&&h.read===!0&&(d.read=!0),!d.insert&&h.insert===!0&&(d.insert=!0),!d.update&&h.update===!0&&(d.update=!0)}if(u.read===!1&&d.read===!0||u.insert===!1&&d.insert===!0||u.update===!1&&d.update===!0){let _=`${o}.${l}`;nr(Qt.MISMATCHED_TABLE_ATTR_PERMS(_),r,o,l)}}}}return Jee(r)}a(Wx,"customValidate");zx.exports={addRoleValidation:Yee,alterRoleValidation:Wee,dropRoleValidation:zee};function jee(e){let{operation:t,permission:r}=e;if(t===wu.OPERATIONS_ENUM.ADD_ROLE||t===wu.OPERATIONS_ENUM.ALTER_ROLE){let n=r.super_user===!0,s=r.cluster_user===!0;if(Object.keys(r).length>1&&(n||s)){if(s&&n)return Qt.SU_CU_ROLE_COMBINED_ERROR;{let o=r.super_user?wu.ROLE_TYPES_ENUM.SUPER_USER:wu.ROLE_TYPES_ENUM.CLUSTER_USER;return Qt.SU_CU_ROLE_NO_PERMS_ALLOWED(o)}}}return null}a(jee,"validateNoSUPerms");function Jee(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:Qt.ROLE_PERMS_ERROR,...e};return Hee(new Error,n,Fee.BAD_REQUEST)}else return null}a(Jee,"generateRolePermResponse");function nr(e,t,r,n){if(!r)t.main_permissions.push(e);else{let s=n?r+"_"+n:r;t.schema_permissions[s]?t.schema_permissions[s].push(e):t.schema_permissions[s]=[e]}}a(nr,"addPermError")});var y_=C((VNe,Zx)=>{"use strict";var jx=An(),Jx=Wr(),Xee=Hc(),Ob=Qx(),Nb=mo(),$Ne=require("uuid").v4,Zee=require("util"),SE=(k(),P(q)),ete=ie(),wb=Jx.searchByValue,tte=Jx.searchByHash,rte=Zee.promisify(Xee.delete),nte=Ws(),ste=Ru(),{hdb_errors:ite,handleHDBError:Qc}=he(),{HDB_ERROR_MSGS:Xx,HTTP_STATUS_CODES:R_}=ite,{UserEventMsg:Ib}=Ys();Zx.exports={addRole:ote,alterRole:ate,dropRole:cte,listRoles:lte};function bb(e){try{e.hdb_auth_header&&delete e.hdb_auth_header,e.HDB_INTERNAL_PATH&&delete e.HDB_INTERNAL_PATH,e.operation&&delete e.operation,e.hdb_user&&delete e.hdb_user}catch{}return e}a(bb,"scrubRoleDetails");async function ote(e){let t=Ob.addRoleValidation(e);if(t)throw t;e=bb(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 wb(r)||[])}catch(i){throw Qc(i)}if(n&&n.length>0)throw Qc(new Error,Xx.ROLE_ALREADY_EXISTS(e.role),R_.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 jx.insert(s),Nb.signalUserChange(new Ib(process.pid)),e=bb(e),e}a(ote,"addRole");async function ate(e){let t=Ob.alterRoleValidation(e);if(t)throw t;e=bb(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await jx.update(r)}catch(s){throw Qc(s)}if(n&&n?.message==="updated 0 of 1 records")throw Qc(new Error,"Invalid role id",R_.BAD_REQUEST,void 0,void 0,!0);return await Nb.signalUserChange(new Ib(process.pid)),e}a(ate,"alterRole");async function cte(e){let t=Ob.dropRoleValidation(e);if(t)throw Qc(new Error,t,R_.BAD_REQUEST,void 0,void 0,!0);let r=new ste(SE.SYSTEM_SCHEMA_NAME,SE.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await tte(r));if(n.length===0)throw Qc(new Error,Xx.ROLE_NOT_FOUND,R_.NOT_FOUND,void 0,void 0,!0);let s=new nte(SE.SYSTEM_SCHEMA_NAME,SE.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await wb(s)),o=!1;if(ete.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){o=!0;break}}if(o===!0)throw Qc(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,R_.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await rte(c),Nb.signalUserChange(new Ib(process.pid)),`${n[0].role} successfully deleted`}a(cte,"dropRole");async function lte(){return wb({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}a(lte,"listRoles")});var Cb={};Ue(Cb,{start:()=>rB,startOnMainThread:()=>fte});function rB({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,eB.parseDocument)(r.toString(),{simpleKeys:!0}).toJSON();for(let s in n){let i=n[s];i.permission||(i={permission:i},i.permission.access&&(i.access=i.permission.access,delete i.permission.access));for(let o in i.permission){if(ute.includes(o))continue;let c=i.permission[o];c.tables||(i.permission[o]=c={tables:c});for(let l in c.tables){let u=c.tables[l];if(u.read=!!u.read,u.insert=!!u.insert,u.update=!!u.update,u.delete=!!u.delete,u.attributes){let f=[];for(let d in u.attributes){let _=u.attributes[d];_.attribute_name=d,f.push(_)}u.attribute_permissions=f,delete u.attributes}if(u.attribute_permissions){if(!Array.isArray(u.attribute_permissions))throw new Error("attribute_permissions must be an array if defined");for(let f of u.attribute_permissions)f.read=!!f.read,f.insert=!!f.insert,f.update=!!f.update}else u.attribute_permissions=null}}i.role=i.id=s,await dte(i)}}}async function dte(e){let t=Xe().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,tB.isEqual)(i,e)?void 0:(e.id=r.id,(0,TE.alterRole)(e))}return(0,TE.addRole)(e)}var TE,eB,tB,ute,fte,nB=Re(()=>{xe();TE=v(y_()),eB=require("yaml"),tB=require("lodash"),ute=["super_user","cluster_user","structure_user"];a(rB,"start");a(dte,"ensureRole");fte=rB});async function AE(e){let t=(0,oB.pathToFileURL)(e).toString();if(_te)return b_||(b_=hte(pte)),(await(await b_).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function hte(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),b_=new Compartment({console,Math,Date,fetch:mte,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,iB.extname)(r)||(r+=".js"),r)},importHook:a(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){Object.assign(s,{Resource:Kr,tables:Qn,databases:We})}};let n=await(0,sB.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),b_}function mte(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 pte(){return{Resource:Kr,tables:Qn}}var sB,iB,oB,_te,b_,Pb=Re(()=>{na();xe();sB=require("fs/promises"),iB=require("path"),oB=require("url"),_te=!1;a(AE,"secureImport");a(hte,"getCompartment");a(mte,"secureOnlyFetch");a(pte,"getGlobalVars")});var Lb={};Ue(Lb,{handleFile:()=>Ete});async function Ete(e,t,r,n){let s=new Map,i=await AE(r);c(i.default)&&n.set((0,Db.dirname)(t),i.default),o(i,(0,Db.dirname)(t));function o(l,u){for(let f in l){let d=l[f];c(d)?n.set(u+"/"+f,d):typeof d=="object"&&o(d,u+"/"+f)}}a(o,"recurseForResources");function c(l){return typeof l=="function"&&(l.get||l.put||l.post||l.delete)}return a(c,"isResource"),s}var Db,aB=Re(()=>{Pb();Db=require("path");a(Ete,"handleFile")});var vb={};Ue(vb,{start:()=>gte});function gte({resources:e}){e.set("login",Mb),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var Mb,cB=Re(()=>{na();a(gte,"start");Mb=class extends Kr{static{a(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:o}=r;return{data:await n.login(s,i)}}}});var P_={};Ue(P_,{addAnalyticsListener:()=>C_,calculateCPUUtilization:()=>wB,diffResourceUsage:()=>IB,recordAction:()=>Mt,recordActionBinary:()=>jn,setAnalyticsEnabled:()=>Ste});function Ste(e){RB=e}function Tte(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 Ate(e,t,r,n,s,i){let o={};if(typeof t=="number")o.total=t,o.values=new Float32Array(4),o.values.index=1,o.values[0]=t,o.total=t;else if(typeof t=="boolean")o.total=t?1:0,o.count=1;else if(typeof t=="function")o.count=1,o.callback=t;else throw new TypeError("Invalid metric value type "+typeof t);o.description={metric:r,path:n,method:s,type:i},yE.set(e,o)}function Mt(e,t,r,n,s){if(!RB)return;let i=t+(r?"-"+r:"");n!==void 0&&(i+="-"+n),s!==void 0&&(i+="-"+s);let o=yE.get(i);o?Tte(e,o):Ate(i,e,t,r,n,s),RE||Rte()}function jn(e,t,r,n,s){Mt(!!e,t,r,n,s)}function C_(e){OB.push(e)}function Rte(){RE=performance.now(),setTimeout(async()=>{let e=performance.now()-RE;RE=0;let t=[],r={time:Date.now(),period:e,threadId:jc.threadId,metrics:t};for(let[s,i]of yE){if(i.values){let o=i.values.subarray(0,i.values.index);o.sort();let c=o.length,l=0,u=[],f;for(let d of NB){let _=Math.floor(c*d),h=o[_-1];if(_>l){let m=_-l;if(h===f){let S=u[u.length-1];typeof S=="number"?u[u.length-1]={value:S,count:1+m}:S.count+=m}else u.push(m>1?{value:h,count:m}:h),f=h;l=_}}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 CB()}let n=process.memoryUsage();t.push({metric:"memory",threadId:jc.threadId,byThread:!0,...n});for(let s of OB)s(t);yE=new Map,jc.parentPort?jc.parentPort.postMessage({type:bB,report:r}):LB({report:r})},yB).unref()}function bE(e,t,r){let n={id:(0,w_.getNextMonotonicTime)(),metric:t,...r};e.primaryStore.put(n.id,n,{append:!0}).then(s=>{s||e.primaryStore.put(n.id,n)})}function wB(e,t){let r=e.userCPUTime+e.systemCPUTime;return Math.round(r/t*100)/100}function IB(e,t){return{userCPUTime:t.userCPUTime/1e3-(e?.userCPUTime??0),systemCPUTime:t.systemCPUTime/1e3-(e?.systemCPUTime??0),minorPageFault:t.minorPageFault-(e?.minorPageFault??0),majorPageFault:t.majorPageFault-(e?.majorPageFault??0),fsRead:t.fsRead-(e?.fsRead??0),fsWrite:t.fsWrite-(e?.fsWrite??0),voluntaryContextSwitches:t.voluntaryContextSwitches-(e?.voluntaryContextSwitches??0),involuntaryContextSwitches:t.involuntaryContextSwitches-(e?.involuntaryContextSwitches??0)}}function yte(e,t,r){let n=0;for(let[s,i]of Object.entries(r)){let o=`${t}.${s}`,c=i.getSize(),l={database:t,table:s,size:c};bE(e,"table-size",l),Jc.trace?.(`table ${o} size metric: ${JSON.stringify(l)}`),n+=c}return n}function lB(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getAuditSize();if(!i)return;let o=AB.default.statSync(s.primaryStore.env.path).size,c=yte(e,r,n),l=o-c,u={database:r,size:o,used:c,free:l,audit:i};bE(e,"database-size",u),Jc.trace?.(`database ${r} size metric: ${JSON.stringify(u)}`)}catch(s){Jc.warn?.("Error getting DB size metrics",s)}}function uB(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getStorageStats();if(!i)return;let o={database:r,...i};bE(e,"storage-volume",o),Jc.trace?.(`db ${r} storage volume metrics: ${JSON.stringify(o)}`)}catch(s){Jc.warn?.("Error getting DB volume metrics",s)}}async function bte(e,t=6e4){let r=xb(),n=PB(),s=new Promise(E=>{let T=performance.now();setImmediate(()=>{let N=performance.now();N-T>5e3&&Jc.warn?.("Unusually high event queue latency on the main thread of "+Math.round(N-T)+"ms"),T=performance.now()}),n.primaryStore.prefetch([1],()=>{let N=performance.now();N-T>5e3&&Jc.warn?.("Unusually high task queue latency on the main thread of "+Math.round(N-T)+"ms"),E(N-T)})}),i;for(let E of n.primaryStore.getRange({start:1/0,end:!1,reverse:!0}))if(E.value?.time){i=E.value.time;break}if(Date.now()-t<i)return;let o,c=new Map,l=new Map,u=[],f;for(let{key:E,value:T}of r.primaryStore.getRange({start:i||!1,exclusiveStart:!0,end:1/0})){if(!T)continue;if(o){if(E>o+t)break}else o=E;f=E;let{metrics:N,threadId:M}=T;for(let H of N||[]){let{path:X,method:W,type:$,metric:se,count:z,total:fe,distribution:ue,threads:Z,...Ae}=H;z||(z=1);let me=se+(X?"-"+X:"");W!==void 0&&(me+="-"+W),$!==void 0&&(me+="-"+$);let ye=c.get(me);if(ye){if(ye.threads){let dt=ye.threads[M];if(dt)ye=dt;else{ye.threads[M]={...Ae};continue}}ye.count||(ye.count=1);let Ht=ye.count;for(let dt in Ae){let Ln=Ae[dt];typeof Ln=="number"&&(ye[dt]=(ye[dt]*Ht+Ln*z)/(Ht+z))}ye.count+=z,fe>=0&&(ye.total+=fe,ye.ratio=ye.total/ye.count)}else ye={period:t,...H},delete ye.distribution,c.set(me,ye),ye.byThread&&(ye.threads=[],ye.threads[M]={...Ae},u.push(ye));if(ue){ue=ue.map(dt=>typeof dt=="number"?{value:dt,count:1}:dt);let Ht=l.get(me);Ht?Ht.push(...ue):l.set(me,ue)}}await CB()}for(let E of u){let{path:T,method:N,type:M,metric:H,count:X,total:W,distribution:$,threads:se,...z}=E;se=se.filter(fe=>fe);for(let fe in z){if(typeof E[fe]!="number")continue;let ue=0;for(let Z of se){let Ae=Z[fe];typeof Ae=="number"&&(ue+=Ae)}E[fe]=ue}E.count=se.length,delete E.threads,delete E.byThread}for(let[E,T]of l){let N=c.get(E);T.sort((dt,Ln)=>dt.value>Ln.value?1:-1);let M=N.count-1,H=[],X=0,W=0,$;for(let dt of NB){let Ln=M*dt;for(;X<Ln;)$=T[W++],X+=$.count,W===1&&X--;let Vr=T[W>1?W-2:0];$||($=T[0]),H.push($.value-($.value-Vr.value)*(X-Ln)/$.count)}let[se,z,fe,ue,Z,Ae,me,ye,Ht]=H;Object.assign(N,{p1:se,p10:z,p25:fe,median:ue,p75:Z,p90:Ae,p95:me,p99:ye,p999:Ht})}let d;for(let[E,T]of c)T.id=(0,w_.getNextMonotonicTime)(),T.time=f,n.primaryStore.put(T.id,T,{append:!0}).then(N=>{N||n.primaryStore.put(T.id,T)}),d=!0;let _=Date.now(),{idle:h,active:m}=performance.eventLoopUtilization();if(d||m*10>h){let E=(0,w_.getNextMonotonicTime)(),T={id:E,metric:"main-thread-utilization",idle:h-dB,active:m-fB,taskQueueLatency:await s,time:_,...process.memoryUsage()};n.primaryStore.put(E,T,{append:!0}).then(N=>{N||n.primaryStore.put(E,T)})}dB=h,fB=m;let S=process.resourceUsage(),g=IB(O_,S);g.time=_,g.period=O_.time?_-O_.time:t,g.cpuUtilization=wB(O_,g.period),bE(n,"resource-usage",g),O_=g;let R=Xe();lB(n,R),lB(n,{system:R.system}),uB(n,R),uB(n,{system:R.system})}async function _B(e,t){let r=Date.now()-t;for(let n of e.primaryStore.getKeys({start:!1,end:r}))e.primaryStore.remove(n)}function xb(){return hB||(hB=ft({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function PB(){return mB||(mB=ft({table:"hdb_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]}))}function wte(){DB=!0;let e=(0,I_.get)(x.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await bte(yB,e),await _B(xb(),Ote),await _B(PB(),Nte)},Math.min(e/2,2147483647)).unref()}function LB(e,t){let r=e.report;r.threadId=t?.threadId||jc.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(pB+=n.mean*n.count);r.totalBytesProcessed=pB,t&&(r.metrics.push({metric:"utilization",...t.performance.eventLoopUtilization(EB.get(t))}),EB.set(t,t.performance.eventLoopUtilization())),r.id=(0,w_.getNextMonotonicTime)(),xb().primaryStore.put(r.id,r),DB||wte(),Ite&&(MB=Pte(r))}async function Pte(e){if(await MB,!pa){let r=(0,N_.dirname)((0,SB.getLogFilePath)());try{pa=await(0,Ub.open)((0,N_.join)(r,"analytics.log"),"r+")}catch{pa=await(0,Ub.open)((0,N_.join)(r,"analytics.log"),"w+")}}let t=(await pa.stat()).size;if(t>Cte){let r=Buffer.alloc(t);await pa.read(r,{position:0}),r=r.subarray(r.indexOf(10,r.length/2)+1),await pa.write(r,{position:0}),await pa.truncate(r.length),t=r.length}await pa.write(JSON.stringify(e)+`
|
|
20
|
-
`,t)}var jc,gB,SB,TB,N_,Ub,w_,I_,AB,Jc,yE,RB,RE,yB,bB,OB,NB,dB,fB,O_,CB,Ote,Nte,hB,mB,DB,pB,EB,Ite,MB,pa,Cte,Li=Re(()=>{jc=require("worker_threads"),gB=v(it());xe();SB=v(ee()),TB=v(ks()),N_=require("path"),Ub=require("fs/promises"),w_=v(un()),I_=v(le());k();Mr();AB=v(require("node:fs")),Jc=(0,TB.loggerWithTag)("analytics");(0,I_.initSync)();yE=new Map,RB=(0,I_.get)(x.ANALYTICS_AGGREGATEPERIOD)>-1;a(Ste,"setAnalyticsEnabled");a(Tte,"recordExistingAction");a(Ate,"recordNewAction");a(Mt,"recordAction");Ye.recordAnalytics=Mt;a(jn,"recordActionBinary");RE=0,yB=1e3,bB="analytics-report",OB=[];a(C_,"addAnalyticsListener");NB=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Rte,"sendAnalytics");a(bE,"storeMetric");a(wB,"calculateCPUUtilization");a(IB,"diffResourceUsage");a(yte,"storeTableSizeMetrics");a(lB,"storeDBSizeMetrics");a(uB,"storeVolumeMetrics");a(bte,"aggregation");dB=0,fB=0,O_={},CB=a(()=>new Promise(setImmediate),"rest");a(_B,"cleanup");Ote=36e5,Nte=31536e6;a(xb,"getRawAnalyticsTable");a(PB,"getAnalyticsTable");(0,gB.setChildListenerByType)(bB,LB);a(wte,"startScheduledTasks");pB=0,EB=new Map,Ite=!1;a(LB,"recordAnalytics");Cte=1e6;a(Pte,"logAnalytics")});var vB={};Ue(vB,{Headers:()=>go,appendHeader:()=>OE,mergeHeaders:()=>Bb});function OE(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 Bb(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new go(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 go,D_=Re(()=>{go=class extends Map{static{a(this,"Headers")}constructor(t){if(t)if(t[Symbol.iterator])super(t);else{super();for(let r in t)this.set(r,t[r])}else super()}set(t,r){return typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r),super.set(t.toLowerCase(),[t,r])}get(t){return typeof t!="string"&&(t=""+t),super.get(t.toLowerCase())?.[1]}has(t){return typeof t!="string"&&(t=""+t),super.has(t.toLowerCase())}setIfNone(t,r){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let n=t.toLowerCase();if(!super.has(n))return super.set(n,[t,r])}append(t,r,n){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let s=t.toLowerCase(),i=super.get(s);if(i){let o=i[1];if(n)r=(typeof o=="string"?o:o.join(", "))+", "+r;else if(typeof o=="string")r=[o,r];else{o.push(r);return}}return super.set(s,[t,r])}[Symbol.iterator](){return super.values()[Symbol.iterator]()}};a(OE,"appendHeader");a(Bb,"mergeHeaders")});function kB(e){let t={openapi:Dte,info:{title:"HarperDB HTTP REST interface",version:HB.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}];for(let[,n]of e){if(!n.path||n.Resource.isError)continue;let{path:s}=n,i=s.split("/").slice(-1),{attributes:o,primaryKey:c,prototype:l}=n.Resource;if(c=c??"id",!c)continue;let u={},f=[];if(o)for(let{type:T,name:N,elements:M,relationship:H,definition:X}of o){if(H)T==="array"?u[N]={type:"array",items:{$ref:Ea+M.type}}:u[N]={$ref:Ea+T};else{let W=X??M?.definition;if(W){if(!t.components.schemas[W.type]){let $={};W.properties.forEach(se=>{$[se.name]=new Gb(Hb[se.type],se.type)}),t.components.schemas[W.type]=new BB($)}T==="array"?u[N]={type:"array",items:{$ref:Ea+W.type}}:u[N]={$ref:Ea+W.type}}else T==="array"?M.type==="Any"||M.type=="ID"?u[N]={type:"array",items:{format:M.type}}:u[N]={type:"array",items:new Gb(Hb[M.type],M.type)}:T==="Any"||T=="ID"?u[N]={format:T}:u[N]=new Gb(Hb[T],T)}f.push(new qb(N,"query",u[N]))}let d=Object.keys(u),_=new qb(c,"path",{format:"ID"});_.required=!0,_.description="primary key of record";let h=new qb("property","path",{enum:d});h.required=!0,t.components.schemas[i]=new BB(u);let m=l.post!==Resource.prototype.post||l.update,S=typeof l.put=="function",g=typeof l.get=="function",R=typeof l.delete=="function",E="/"+s+"/";m&&(t.paths[E]={},t.paths[E].post=new Lte(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[E]||(t.paths[E]={}),t.paths[E].get=new kb(f,r,{200:new Fb({$ref:Ea+i})},"search for records by the specified property name and value pairs")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new xB(f,r,"delete all the records that match the provided query",{204:new UB})),E="/"+s+"/{"+c+"}",g&&(t.paths[E]={},t.paths[E].get=new kb([_],r,{200:new Fb({$ref:Ea+i})},"retrieve a record by its primary key")),S&&(t.paths[E]||(t.paths[E]={}),t.paths[E].put=new Mte([_],r,i,"create or update the record with the URL path that maps to the record's primary key")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new xB([_],r,"delete a record with the given primary key",{204:new UB})),g&&h.schema.enum.length>0&&(E="/"+s+"/{"+c+"}.{property}",t.paths[E]={},t.paths[E].get=new kb([_,h],r,{200:new Fb({enum:d})},"used to retrieve the specified property of the specified record"))}return t}function Lte(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:Ea+e}}}},this.security=t,this.responses={200:{description:$b,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function kb(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function Fb(e){this.description=$b,this.content={"application/json":{schema:e}}}function UB(){this.description="successfully processed request, no content returned to client"}function Mte(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Ea+r}}}},this.responses={200:{description:$b}}}function xB(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function BB(e){this.type="object",this.properties=e}function Gb(e,t){this.type=e,this.format=t}function qb(e,t,r){this.name=e,this.in=t,this.schema=r}var HB,Dte,Hb,Ea,$b,FB=Re(()=>{HB=v(Et()),Dte="3.0.3",Hb={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},Ea="#/components/schemas/",$b="successful operation";a(kB,"generateJsonApi");a(Lte,"Post");a(kb,"Get");a(Fb,"Response200");a(UB,"Response204");a(Mte,"Put");a(xB,"Delete");a(BB,"ResourceSchema");a(Gb,"Type");a(qb,"Parameter")});var qB={};Ue(qB,{Request:()=>L_,createReuseportFd:()=>NE});var GB,L_,Vb,Kb,NE,wE=Re(()=>{GB=require("os"),L_=class{static{a(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 Kb(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 Vb(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get isAborted(){return!1}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},Vb=class{static{a(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)}},Kb=class{constructor(t){this.asObject=t}static{a(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,GB.platform)()!="win32"&&(NE=require("node-unix-socket").createReuseportFd)});var CE={};Ue(CE,{parseHeaderValue:()=>Wb,start:()=>xte});async function Ute(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&Zm(e);let i=new go;try{e.responseHeaders=i;let o=e.url.slice(1),c,l;if(o!==$B){let g=IE.getMatch(o,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new pc(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=Wb(g);for(let E of R)switch(E.name){case"max-age":e.expiresAt=E.value*1e3+Date.now();break;case"only-if-cached":e.onlyIfCached=!0;break;case"no-cache":e.noCache=!0;break;case"no-store":e.noCacheStore=!0;break;case"stale-if-error":e.staleIfError=!0;break;case"must-revalidate":e.mustRevalidate=!0;break}}}let u=r["x-replicate-to"];if(u){let g=Wb(u).map(R=>(R.next?.name==="confirm"&&R.next.value>=0&&(e.replicatedConfirmation=+R.next.value),R.name));e.replicateTo=g.length===1&&+g[0]>=0?+g[0]:g[0]==="*"?void 0:g}r["x-replicate-from"]==="none"&&(e.replicateFrom=!1);let d=await It(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=oo(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new Cu.ClientError(g,400)}if(e.authorize=!0,o===$B&&s==="GET"){if(e?.user?.role?.permission?.super_user)return kB(IE);throw new Cu.ServerError("Forbidden",403)}switch(s){case"GET":case"HEAD":return l.get(c,e);case"POST":return l.post(c,e.data,e);case"PUT":return l.put(c,e.data,e);case"DELETE":return l.delete(c,e);case"PATCH":return l.patch(c,e.data,e);case"OPTIONS":i.setIfNone("Allow","GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE");return;case"CONNECT":return l.connect(c,null,e);case"TRACE":return"HarperDB is the terminating server";case"QUERY":return l.query(c,e.data,e);case"COPY":return l.copy(c,r.destination,e);case"MOVE":return l.move(c,r.destination,e);case"BREW":throw new Cu.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Cu.ServerError(`Method ${s} is not recognized`,501)}}),_=200,h;if(d==null)_=s==="GET"||s==="HEAD"?404:204,Yb.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(d.status>0&&d.headers){let g=Bb(d.headers,i);return d.headers!==g&&(d.headers=g),d.data!==void 0&&(d.body=vf(d.data,e,d)),d}else if(h=e.lastModified){vte[0]=h;let g=String.fromCharCode(34,(Br[0]&63)+62,(Br[0]>>6)+(Br[1]<<2&63)+62,(Br[1]>>4)+(Br[2]<<4&63)+62,(Br[2]>>2)+62,(Br[3]&63)+62,(Br[3]>>6)+(Br[4]<<2&63)+62,(Br[4]>>4)+(Br[5]<<4&63)+62,(Br[5]>>2)+62,(Br[6]&63)+62,(Br[6]>>6)+(Br[7]<<2&63)+62,34),R=r["if-none-match"];R&&g==R?(d?.onDone&&d.onDone(),_=304,d=void 0):i.setIfNone("ETag",g),Yb.lastModified&&i.setIfNone("Last-Modified",new Date(h).toUTCString())}e.createdResource&&(_=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let m={status:_,headers:i,body:void 0},S=d?.wasLoadedFromSource?.();return S!==void 0&&(m.wasCacheMiss=S,!S&&h&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||h))/1e3))),d!==void 0&&(m.body=vf(d,e,m),s==="HEAD"&&(m.body=void 0)),m}catch(o){o.statusCode?o.statusCode===500?Mi.warn(o):Mi.info(o):Mi.error(o),o.statusCode===405&&(o.method&&(o.message+=` to handle HTTP method ${o.method.toUpperCase()||""}`),o.allow&&(o.allow.push("trace","head","options"),i.setIfNone("Allow",o.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:o.statusCode||500,headers:i,body:void 0};return c.body=vf(o.contentType?o:o.toString(),e,c),c}}function xte(e){Yb=e,e.includeExpensiveRecordCountEstimates&&(L_.prototype.includeExpensiveRecordCountEstimates=!0),!VB&&(VB=!0,IE=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return Ute(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{M_++;let s=new xn;KB||(KB=!0,C_(l=>{M_>0&&l.push({metric:"ws-connections",connections:M_,byThread:!0})}));let i;t.on("error",l=>{i=!0,Mi.warn(l)});let o;t.on("message",a(function(u){o||(o=oo(r.requestedContentType??r.headers.asObject["content-type"],!1));let f=o(u);Mt(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(f)},"message"));let c;t.on("close",()=>{M_--,jn(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=IE.getMatch(l,"ws");if(jn(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,Mt(m=>({count:m.count,total:M_}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let f=new pc(u.relativeURL),d=u.Resource;c=(await It(r,()=>d.connect(f,s,r)))[Symbol.asyncIterator]();let h;for(;!(h=await c.next()).done;){let m=await aa(h.value,r);t.send(m),Mt(m.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(S=>t._socket.once("drain",S))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?Mi.warn(l):Mi.info(l):Mi.error(l),t.close(Bte[l.statusCode]||1011,l.toString())}t.close()},e))}function Wb(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,o]=s.trim().split("=");i=i.trim(),o&&(o=o.trim()),r={name:i.toLowerCase(),value:o,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var Mi,Cu,Br,vte,Yb,$B,VB,IE,KB,M_,Bte,YB=Re(()=>{no();Li();Mi=v(ee()),Cu=v(he());bf();zl();mc();D_();FB();bf();wE();Br=new Uint8Array(8),vte=new Float64Array(Br.buffer,0,1),Yb={},$B="openapi";a(Ute,"http");M_=0;a(xte,"start");Bte={401:3e3,403:3003};a(Wb,"parseHeaderValue")});var zb=C((Awe,zB)=>{var{recordAction:PE,recordActionBinary:WB}=(Li(),P(P_)),Hte=require("fastify-plugin"),kte=200;zB.exports=Hte(function(e,t,r){e.addHook("onResponse",async(n,s)=>{let i=s.elapsedTime}),e.addHook("onSend",async(n,s,i)=>{let o=s.elapsedTime,c=performance.now(),l=s.request.routeOptions,u,f,d;l.config?.isOperation?(u=n.body?.operation,f="operation"):(u=l.url,f="fastify-route",d=l.method),PE(o,"duration",u,d,f),WB(s.raw.statusCode<400,"success",u,d,f),WB(1,"response_"+s.raw.statusCode,u,d,f);let _=kte;i?.pipe?(i.on("data",g=>{_+=g.length}),i.on("end",()=>{PE(performance.now()-c,"transfer",u,d,f),PE(_,"bytes-sent",u,d,f)})):(_+=i?.length||0,PE(_,"bytes-sent",u,d,f));let h=o.toFixed(3),m=s.getHeader("Server-Timing"),S=`db;dur=${h}`;s.header("Server-Timing",m?`${m}, ${S}`:S)}),r()},{name:"hdb-request-time"})});var jB=C((Rwe,QB)=>{var Fte=ot(),Gte={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};QB.exports=function(e){return Fte.validateObject(e,Gte)}});var DE=C((ywe,JB)=>{"use strict";var qte=(k(),P(q)).OPERATIONS_ENUM,Qb=class{static{a(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=qte.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};JB.exports=Qb});var x_={};Ue(x_,{createTokens:()=>Vte,getJWTRSAKeys:()=>xE,refreshOperationToken:()=>Kte,validateOperationToken:()=>Xb,validateRefreshToken:()=>BE});async function xE(){if(LE)return LE;try{let e=v_.default.join(U_.default.getHdbBasePath(),EA),t=await ME.default.readFile(v_.default.join(e,cf.JWT_PASSPHRASE_NAME),"utf8"),r=await ME.default.readFile(v_.default.join(e,cf.JWT_PRIVATE_KEY_NAME),"utf8");return LE={publicKey:await ME.default.readFile(v_.default.join(e,cf.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},LE}catch(e){throw UE.default.error(e),new Qs.ClientError(Du.NO_ENCRYPTION_KEYS,Pu.INTERNAL_SERVER_ERROR)}}async function Vte(e){let t=(0,jb.validateBySchema)(e,vi.default.object({username:vi.default.string().optional(),password:vi.default.string().optional(),role:vi.default.string().optional(),expires_in:vi.default.alternatives(vi.default.string(),vi.default.number()).optional()}));if(t)throw new Qs.ClientError(t.message);let r;try{let d=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,d=!1),r=await(0,Jb.findAndValidateUser)(e.username,e.password,d)}catch(d){throw UE.default.error(d),new Qs.ClientError(Du.INVALID_CREDENTIALS,Pu.UNAUTHORIZED)}if(!r)throw new Qs.ClientError(Du.INVALID_CREDENTIALS,Pu.UNAUTHORIZED);let n=!1,s=!1;r.role?.permission&&(n=r.role.permission.super_user===!0,s=r.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s};e.role&&(i.role=e.role);let o=await xE(),c=await Lu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:e.expires_in??rH,algorithm:vE,subject:"operation"}),l=await Lu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:$te,algorithm:vE,subject:"refresh"}),u=uy(l,"sha256");if((await(0,XB.update)(new ZB.default(af,Yl.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new Qs.ClientError(Du.REFRESH_TOKEN_SAVE_FAILED,Pu.INTERNAL_SERVER_ERROR);return eH.default.signalUserChange(new tH.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function Kte(e){let t=(0,jb.validateBySchema)(e,vi.default.object({refresh_token:vi.default.string().required()}).required());if(t)throw new Qs.ClientError(t.message);let{refresh_token:r}=e;await BE(r);let n=await xE(),s=await Lu.default.decode(r);return{operation_token:await Lu.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:rH,algorithm:vE,subject:"operation"})}}async function Xb(e){return nH(e,"operation")}async function BE(e){return nH(e,"refresh")}async function nH(e,t){try{let r=await xE(),n=await Lu.default.verify(e,r.publicKey,{algorithms:vE,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,Jb.findAndValidateUser)(n.username,void 0,!1);if(t==="refresh"&&!dy(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw UE.default.warn(r),r?.name==="TokenExpiredError"?new Qs.ClientError(Du.TOKEN_EXPIRED,Pu.FORBIDDEN):new Qs.ClientError(Du.INVALID_TOKEN,Pu.UNAUTHORIZED)}}var Lu,ME,v_,vi,jb,Qs,UE,Jb,XB,ZB,eH,tH,U_,Pu,Du,rH,$te,vE,LE,Mu=Re(()=>{Lu=v(require("jsonwebtoken")),ME=v(require("fs-extra")),v_=v(require("node:path")),vi=v(require("joi")),jb=v(ot());k();Qs=v(he()),UE=v(ee());Gp();Jb=v(Kn()),XB=v(An()),ZB=v(DE()),eH=v(mo()),tH=v(Ys()),U_=v(le()),{HTTP_STATUS_CODES:Pu,AUTHENTICATION_ERROR_MSGS:Du}=Qs.hdb_errors;U_.default.initSync();rH=U_.default.get(x.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",$te=U_.default.get(x.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",vE="RS256";a(xE,"getJWTRSAKeys");a(Vte,"createTokens");a(Kte,"refreshOperationToken");a(Xb,"validateOperationToken");a(BE,"validateRefreshToken");a(nH,"validateToken")});var Zb=C((Iwe,oH)=>{"use strict";var Yte=jB(),vu=require("passport"),Wte=require("passport-local").Strategy,zte=require("passport-http").BasicStrategy,Qte=require("util"),jte=Kn(),iH=Qte.callbackify(jte.findAndValidateUser),wwe=Un(),Jte=(k(),P(q)),sH=(Mu(),P(x_));vu.use(new Wte(function(e,t,r){iH(e,t,r)}));vu.use(new zte(function(e,t,r){iH(e,t,r)}));vu.serializeUser(function(e,t){t(null,e)});vu.deserializeUser(function(e,t){t(null,e)});function Xte(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let o=e.headers.authorization.split(" ");n=o[0],s=o[1]}function i(o,c){return o?r(o):c?r(null,c):r("Must login")}switch(a(i,"handleResponse"),n){case"Basic":vu.authenticate("basic",{session:!1},(o,c)=>{i(o,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===Jte.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?sH.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):sH.validateOperationToken(s).then(o=>{r(null,o)}).catch(o=>{r(o)});break;default:vu.authenticate("local",{session:!1},function(o,c){i(o,c)})(e,t,r);break}}a(Xte,"authorize");function Zte(e,t){let r=Yte(e);if(r){t(r);return}let n={authorized:!0,messages:[]},s=e.user.role;if(!s?.permission)return t("Invalid role");let i=JSON.parse(s.permission);if(i.super_user)return t(null,n);if(!i[e.schema])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.schema} schema`),t(null,n);if(!i[e.schema].tables[e.table])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.table} table`),t(null,n);if(!i[e.schema].tables[e.table][e.operation])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.operation} on ${e.table} table`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&!e.attributes)return n.authorized=!1,n.messages.push(`${e.schema}.${e.table} has attribute permissions. Missing attributes to validate`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&e.attributes){let o=i[e.schema].tables[e.table].attribute_permissions;for(let c in o)e.attributes.indexOf(o[c].attribute_name)>-1&&!o[c][e.operation]&&(n.authorized=!1,n.messages.push(`Not authorized to ${e.operation} ${o[c].attribute_name} `))}return t(null,n)}a(Zte,"checkPermissions");oH.exports={authorize:Xte,checkPermissions:Zte}});var HE=C((Pwe,aH)=>{"use strict";var ere=qn();aH.exports={writeTransaction:tre};function tre(e,t,r){return ere.writeTransaction(e,t,r)}a(tre,"writeTransaction")});var dH=C((Mwe,uH)=>{"use strict";var rre=Wr(),nre=$s(),cH=ee(),sre=An(),Lwe=HE(),ire=require("clone"),tO=require("alasql"),ore=Mp(),lH=require("util"),are=lH.promisify(nre.getTableSchema),cre=lH.promisify(rre.search),lre=(k(),P(q)),eO=ie();ore(tO);uH.exports={update:dre};var ure="There was a problem performing this update. Please check the logs and try again.";async function dre({statement:e,hdb_user:t}){let r=await are(e.table.databaseid,e.table.tableid),n=fre(e.columns);eO.backtickASTSchemaItems(e);let{table:s,where:i}=e,o=ire(s),c=eO.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=tO.parse(l).statements[0],f=await cre(u),d=_re(n,f);return hre(o,d,t)}a(dre,"update");function fre(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=tO.compile(`SELECT ${r.expression.toString()} AS [${lre.FUNC_VAL}] FROM ?`)}),t}catch(t){throw cH.error(t),new Error(ure)}}a(fre,"createUpdateRecord");function _re(e,t){return eO.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}a(_re,"buildUpdateRecords");async function hre(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await sre.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){cH.error(`Error delete new_attributes from update response: ${i}`)}return s}a(hre,"updateRecords")});var _H=C((Bwe,fH)=>{var mre=require("alasql"),pre=Wr(),Ere=ee(),gre=qn(),nO=require("util"),rO=ie(),Sre=(k(),P(q)),Tre=$s(),Uwe=HE(),xwe=An(),Are="record",Rre="successfully deleted",yre=nO.callbackify(wre),bre=nO.promisify(pre.search),Ore=nO.promisify(Tre.getTableSchema);fH.exports={convertDelete:yre};function Nre(e){return`${e.deleted_hashes.length} ${Are}${e.deleted_hashes.length===1?"":"s"} ${Rre}`}a(Nre,"generateReturnMessage");async function wre({statement:e,hdb_user:t}){let r=await Ore(e.table.databaseid,e.table.tableid);rO.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=rO.isEmpty(s)?"":` WHERE ${s.toString()}`,o=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=mre.parse(o).statements[0],l={operation:Sre.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await bre(c);let u=await gre.deleteRecords(l);return rO.isEmptyOrZeroLength(u.message)&&(u.message=Nre(u)),delete u.txn_time,u}catch(u){throw Ere.error(u),u.hdb_code?u.message:u}}a(wre,"convertDelete")});var gH=C((kwe,EH)=>{"use strict";var Ire=_o(),{hdb_errors:hH}=he(),{getDatabases:mH}=(xe(),P(ct));EH.exports={checkSchemaExists:pH,checkSchemaTableExists:Cre,schema_describe:Ire};async function pH(e){if(!mH()[e])return hH.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(pH,"checkSchemaExists");async function Cre(e,t){let r=await pH(e);if(r)return r;if(!mH()[e][t])return hH.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(Cre,"checkSchemaTableExists")});function sO(e){let t=e.get(kE),r=t?(0,Uu.unpack)(t):null;r||(r={remoteNameToId:{}});let n=et(),s=!1;r.nodeName=et();let i=r.remoteNameToId;if(i[n]!==0){let o=0,c;for(let l in i){let u=i[l];u===0?c=l:u>o&&(o=u)}if(c){o++,i[c]=o;let l=[Symbol.for("seq"),o];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:H_(e)??1,nodes:[]})})}i[n]=0,e.putSync(kE,(0,Uu.pack)(r))}return r}function B_(e){return sO(e).remoteNameToId}function TH(e,t){let r=sO(t),n=r.remoteNameToId,s=new Map,i=!1;for(let o in e){let c=e[o],l=n[o];if(l==null){let u=0;for(let f in n){let d=n[f];d>u&&(u=d)}l=u+1,n[o]=l,i=!0}s.set(c,l)}return i&&t.putSync(kE,(0,Uu.pack)(r)),s}function FE(e,t){let r=sO(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let o in n){let c=n[o];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(kE,(0,Uu.pack)(r))}return SH.trace?.("The remote node name map",e,n,s),s}var SH,Uu,kE,iO=Re(()=>{SH=v(ks());ps();Uu=require("msgpackr"),kE=Symbol.for("remote-ids");a(sO,"getIdMappingRecord");a(B_,"exportIdMapping");a(TH,"remoteToLocalNodeId");a(FE,"getIdOfRemoteNode")});var oO={};Ue(oO,{commits_awaiting_replication:()=>xu,getHDBNodeTable:()=>sr,getReplicationSharedStatus:()=>GE,iterateRoutes:()=>F_,shouldReplicateToNode:()=>k_,subscribeToNodeUpdates:()=>Bu});function sr(){return AH||(AH=ft({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 GE(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Bu(e){sr().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;OH.debug?.("adding node",n,"on node",et()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==et()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of sr().search({}))if(i.shard!=null){let o=s.get(i.shard);o||s.set(i.shard,o=[]),o.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function k_(e,t){let r=ga.default.get(x.REPLICATION_DATABASES);return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&(r==="*"||r?.find?.(n=>(typeof n=="string"?n:n.name)===t&&(!n.sharded||e.shard===ga.default.get(x.REPLICATION_SHARD))))&&sr().primaryStore.get(et())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function Pre(){Bu(e=>{Sa({},(t,r)=>{let n=e.name,s=RH.get(n);if(s||RH.set(n,s=new Map),s.has(r))return;let i;for(let o in t)if(i=t[o].auditStore,i)break;if(i){let o=GE(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of xu.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*F_(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=ga.default.get(x.REPLICATION_SECUREPORT)??(!ga.default.get(x.REPLICATION_PORT)&&ga.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||ga.default.get(x.REPLICATION_PORT)||ga.default.get(x.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){yH.isMainThread&&console.error("Invalid route, must specify a url or host (with port)");continue}yield{replicates:!t.subscriptions,url:r,subscription:t.subscriptions,routes:t.routes,start_time:t.startTime,revoked_certificates:t.revokedCertificates}}}var yH,bH,ga,OH,AH,RH,xu,Xc=Re(()=>{xe();ps();jm();yH=require("worker_threads"),bH=v(he()),ga=v(le());k();OH=v(ks());server.nodes=[];a(sr,"getHDBNodeTable");a(GE,"getReplicationSharedStatus");a(Bu,"subscribeToNodeUpdates");a(k_,"shouldReplicateToNode");RH=new Map;PD((e,t,r)=>{if(r>server.nodes.length)throw new bH.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);xu||(xu=new Map,Pre());let n=xu.get(e);return n||(n=[],xu.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(Pre,"startSubscriptionToReplications");a(F_,"iterateRoutes")});var IH={};Ue(IH,{connectedToNode:()=>Zc,disconnectedFromNode:()=>ku,ensureNode:()=>So,requestClusterStatus:()=>wH,startOnMainThread:()=>cO});async function cO(e){let t=0,r=Xe();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){qE.set(i,H_(l.auditStore));break}}}xi.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes?.search([])||[])i.push(o);for(let o of F_(e))try{let c=!o.subscriptions;if(c){let u=et(),f=sr().primaryStore.get(u);if(f!==null){let d=e.url??Ta();(f===void 0||f.url!==d||f.shard!==e.shard)&&await So(u,{name:u,url:d,shard:e.shard,replicates:!0})}}let l=o.trusted!==!1;if(c&&o.replicates==null&&(o.replicates=!0),i.find(u=>u.url===o.url))continue;s(o)}catch(c){console.error(c)}Bu(s)});let n;function s(i,o=i?.name){let c=et()&&o===et()||Ta()&&i?.url===Ta();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let _ of sr().search([]))_.replicates&&_.name!==o&&s(_,_.name);n=d}if(nt.trace("Setting up node replication for",i),!i){for(let[d,_]of Ui){let h;for(let[m,{worker:S,nodes:g}]of _){let R=g[0];if(R&&R.name==o){h=!0;for(let[E,{worker:T}]of _)_.delete(E),nt.warn("Node was deleted, unsubscribing from node",o,E,d),T?.postMessage({type:"unsubscribe-from-node",node:o,database:E,url:d});break}}if(h){Ui.get(d).iterator.remove(),Ui.delete(d);return}}return}if(c)return;if(!i.url){nt.info(`Node ${i.name} is missing url`);return}let l=Ui.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(nt.info(`Added node ${i.name} at ${i.url} for process ${et()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[d,_]of Hu)if(i.url===_.url){Hu.delete(d);break}Hu.set(i.name,i)}let u=Xe();if(l||(l=new Map,Ui.set(i.url,l)),l.iterator=Sa(e,(d,_,h)=>{h?f(_,!0):f(_,!1)}),i.subscriptions)for(let d of i.subscriptions){let _=d.database||d.schema;u[_]||(nt.warn(`Database ${_} not found for node ${i.name}, making a subscription anyway`),f(_,!1))}function f(d,_){nt.trace("Setting up replication for database",d,"on node",i.name);let h=l.get(d),m,S=[{replicateByDefault:_,...i}];qE.has(d)&&G_.default.get(x.REPLICATION_FAILOVER)&&(S.push({replicateByDefault:_,name:et(),start_time:qE.get(d),end_time:Date.now(),replicates:!0}),qE.delete(d));let g=k_(i,d),R=xi.workers.filter(E=>E.name==="http");if(h?(m=h.worker,h.nodes=S):g&&(t=t%R.length,m=R[t++],l.set(d,{worker:m,nodes:S,url:i.url}),m?.on("exit",()=>{l.get(d)?.worker===m&&(l.delete(d),f(d,_))})),g)setTimeout(()=>{let E={type:"subscribe-to-node",database:d,nodes:S};m?m.postMessage(E):q_(E)},Dre);else{nt.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],sr().primaryStore.get(et())?.replicates),sr().primaryStore.get(et())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};m?m.postMessage(E):VE(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),ku=a(function(i){try{nt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(Hu.keys()),c=o.sort(),l=c.indexOf(i.name||js(i.url));if(l===-1){nt.warn("Disconnected node not found in node map",i.name,o);return}let u=Ui.get(i.url),f=u?.get(i.database);if(!f){nt.warn("Disconnected node not found in replication map",i.database,u);return}if(f.connected=!1,i.finished||!G_.default.get(x.REPLICATION_FAILOVER))return;let d=f.nodes[0];if(!(d.replicates===!0||d.replicates?.sends||d.subscriptions?.length))return;let _=d.shard,h=(l+1)%c.length;for(;l!==h;){let m=c[h],S=Hu.get(m);u=Ui.get(S.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==_){h=(h+1)%c.length;continue}let{worker:R,nodes:E}=g,T=!1;for(let N of f.nodes){if(E.some(M=>M.name===N.name)){nt.info(`Disconnected node is already failing over to ${m} for ${i.database}`);continue}N.end_time<Date.now()||(E.push(N),T=!0)}if(f.nodes=[f.nodes[0]],!T){nt.info(`Disconnected node ${i.name} has no nodes to fail over to ${m}`);return}nt.info(`Failing over ${i.database} from ${i.name} to ${m}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:E}):q_({database:i.database,nodes:E});return}nt.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){nt.error("Error failing over node",o)}},"disconnectedFromNode"),Zc=a(function(i){let o=Ui.get(i.url),c=o?.get(i.database);if(!c){nt.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){nt.info("Connected node has no nodes",i.database,c);return}if(!l.name){nt.debug("Connected node is not named yet",i.database,c);return}if(!G_.default.get(x.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let f of Ui.values()){let d=f.get(i.database);if(!d||d==c)continue;let{worker:_,nodes:h,connected:m}=d;if(h)if(m===!1&&h[0].shard===l.shard)u=!0,c.nodes.push(h[0]);else{let S=h.filter(g=>g.name!==l.name);S.length<h.length&&(d.nodes=S,_.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",ku),(0,xi.onMessageByType)("connected-to-node",Zc),(0,xi.onMessageByType)("request-cluster-status",wH)}function wH(e,t){let r=[];for(let[n,s]of Hu)try{let i=Ui.get(s.url);nt.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let o=[];if(i){for(let[l,{worker:u,connected:f,nodes:d,latency:_}]of i)o.push({database:l,connected:f,latency:_,thread_id:u?.threadId,nodes:d.filter(h=>!(h.end_time<Date.now())).map(h=>h.name)});let c=(0,aO.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){nt.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function So(e,t){let r=sr();e=e??js(t.url),t.name=e;try{if(t.ca){let s=new NH.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subject_alt_name:s.subjectAltName,serial_number:s.serialNumber,valid_from:s.validFrom,valid_to:s.validTo}}}catch(s){nt.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(nt.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!G_.default.get(x.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],o=(0,aO.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of o)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...o,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}nt.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var xi,$E,nt,aO,G_,NH,Dre,Ui,ku,Zc,Hu,qE,$_=Re(()=>{xe();xi=v(it());ps();$E=require("worker_threads");Xc();nt=v(ee()),aO=require("lodash"),G_=v(le());k();NH=require("crypto"),Dre=200,Ui=new Map,Hu=new Map,qE=new Map;a(cO,"startOnMainThread");a(wH,"requestClusterStatus");$E.parentPort&&(ku=a(e=>{$E.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Zc=a(e=>{$E.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,xi.onMessageByType)("subscribe-to-node",e=>{q_(e)}),(0,xi.onMessageByType)("unsubscribe-from-node",e=>{VE(e)}));a(So,"ensureNode")});var Zs=C(jH=>{"use strict";var ir=require("path"),{watch:vH}=require("chokidar"),bn=require("fs-extra"),Fu=require("node-forge"),UH=require("net"),{generateKeyPair:uO,X509Certificate:To,createPrivateKey:xH}=require("crypto"),Lre=require("util");uO=Lre.promisify(uO);var bt=Fu.pki,Js=require("joi"),{v4:BH}=require("uuid"),{validateBySchema:hO}=ot(),yt=ee(),Jn=le(),Es=(k(),P(q)),{CONFIG_PARAMS:tl}=Es,Xs=hy(),{ClientError:Ra}=he(),YE=require("node:tls"),{relative:HH,join:Mre}=require("node:path"),{CERT_PREFERENCE_APP:rIe,CERTIFICATE_VALUES:CH}=Xs,vre=_c(),KE=Lt(),{table:Ure,getDatabases:xre,databases:lO}=(xe(),P(ct)),{getJWTRSAKeys:PH}=(Mu(),P(x_));Object.assign(jH,{generateKeys:gO,updateConfigCert:VH,createCsr:Vre,signCertificate:Kre,setCertTable:Gu,loadCertificates:EO,reviewSelfSignedCert:TO,createTLSSelector:YH,listCertificates:zH,addCertificate:Jre,removeCertificate:Zre,createNatsCerts:zre,generateCertsKeys:Wre,getReplicationCert:K_,getReplicationCertAuth:qre,renewSelfSigned:Qre,hostnamesFromCert:AO,getKey:ene});var{urlToNodeName:kH,getThisNodeUrl:Bre,getThisNodeName:jE,clearThisNodeName:Hre}=(ps(),P(Oa)),{readFileSync:kre,statSync:FH}=require("node:fs"),nIe=le(),{getTicketKeys:Fre,onMessageFromWorkers:Gre}=it(),Aa=ee(),{isMainThread:dO}=require("worker_threads"),{TLSSocket:GH,createSecureContext:sIe}=require("node:tls"),mO=3650,V_=["127.0.0.1","localhost","::1"],pO=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];Gre(async e=>{e.type===Es.ITC_EVENT_TYPES.RESTART&&(Jn.initSync(!0),await TO())});var Hr;function ba(){return Hr||(Hr=xre().system.hdb_certificate,Hr||(Hr=Ure({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__"}]}))),Hr}a(ba,"getCertTable");async function K_(){let e=YH("replication"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(jE());if(!r)return;let n=new To(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(K_,"getReplicationCert");async function qre(){ba();let e=(await K_()).options.cert,r=new To(e).issuer.match(/CN=(.*)/)?.[1];return Hr.get(r)}a(qre,"getReplicationCertAuth");var fO,ya=new Map,WE=[],DH;function EO(){if(fO)return;if(fO=!0,!DH&&dO){let n=KE.getConfigFilePath();DH=vH(n,{persistent:!1}).on("change",()=>{logger.warn?.("Config file changed, reloading certificates"),$re()})}let e=[{configKey:tl.TLS},{configKey:tl.OPERATIONSAPI_TLS}];ba();let t=ir.dirname(KE.getConfigFilePath()),r;for(let{configKey:n}of e){let s=KE.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&HH(Mre(t,"keys"),o);if(c){let l=LH(o,u=>{ya.set(c,u)},"private key");l&&WE.push(l)}for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&dO){let f=LH(u,d=>{if(CH.cert===d)return;let _=i.hostname??i.hostnames??i.host??i.hosts;_&&!Array.isArray(_)&&(_=[_]);let h=KH(u),m=new To(h),S;try{S=!l&&i.name||QH(x509Cert)}catch(M){logger.error("error extracting host name from certificate",M);return}if(S==null){logger.error("No host name found on certificate");return}if(m.checkIssued(new To(CH.cert)))return;let g=Hr.primaryStore.get(S),R=FH(u).mtimeMs,E=!g||g.is_self_signed?1:g.fileTimestamp??g.__updatedtime__,T=i.uses??["https",...n.includes("operations")?["operations"]:[]],N=g&&R===E&&(JSON.stringify(g.uses)!==JSON.stringify(T)||g.ciphers!==i.ciphers||JSON.stringify(g.hostnames)!==JSON.stringify(_));if(E&&R<=E&&!N){R<E&&logger.info?.(`Certificate ${S} at ${u} is older (${new Date(R)}) than the certificate in the database (${E>1?new Date(E):"only self signed certificate available"})`);return}N&&logger.info?.(`Config values changed for certificate ${S}, updating record`),r=Hr.put({name:S,uses:i.uses??["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:_,file_timestamp:R,details:{issuer:m.issuer.replace(/\n/g," "),subject:m.subject?.replace(/\n/g," "),subject_alt_name:m.subjectAltName,serial_number:m.serialNumber,valid_from:m.validFrom,valid_to:m.validTo}})},l?"certificate authority":"certificate");f&&WE.push(f)}}}}}return r}a(EO,"loadCertificates");function $re(){for(let e of WE)e.close();WE.length=0,fO=!1,EO()}a($re,"reloadCertificates");function LH(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&dO&&yt.warn(`Reloading ${r}:`,i),n=c,t(KH(i)))}catch(c){yt.error(`Error loading ${r}:`,i,c)}},"loadFile");return bn.existsSync(e)?s(e,FH(e)):yt.error?.(`${r} file not found:`,e),vH(e,{persistent:!1}).on("change",s)}a(LH,"loadAndWatch");function zE(){let e=Bre();if(e==null){let t=V_[0];return yt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return kH(e)}a(zE,"getHost");function QE(){let e=jE();if(e==null){let t=V_[0];return yt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(QE,"getCommonName");async function Vre(){let e=await K_(),t=bt.certificateFromPem(e.options.cert),r=bt.privateKeyFromPem(e.options.key);yt.info("Creating CSR with cert named:",e.name);let n=bt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:QE()},...pO];yt.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:qH()}];return yt.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Fu.pki.certificationRequestToPem(n)}a(Vre,"createCsr");function qH(){let e=V_.includes(QE())?V_:[...V_,QE()];return e.includes(zE())||e.push(zE()),[{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=>UH.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(qH,"certExtensions");async function Kre(e){let t={},r=ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;ba();for await(let f of Hr.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if(ya.has(f.private_key_name)){n=ya.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await bn.exists(ir.join(r,f.private_key_name))){n=bn.readFile(ir.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await _O();s=f.ca,n=f.private_key}n=bt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=bt.certificateFromPem(s.certificate);yt.info("Signing CSR with cert named",s.name);let o=bt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return yt.error(f),new Error("Error verifying CSR: "+f.message)}let c=Fu.pki.createCertificate();c.serialNumber=Math.random().toString().slice(2,10),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+mO),yt.info("sign cert setting validity:",c.validity),yt.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),yt.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;yt.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,Fu.md.sha256.create()),t.certificate=bt.certificateToPem(c)}else yt.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(Kre,"signCertificate");async function Yre(e,t){await Gu({name:jE(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Gu({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:bt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}a(Yre,"createCertificateTable");async function Gu(e){let t=new To(e.certificate);e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},ba(),await Hr.patch(e)}a(Gu,"setCertTable");async function gO(){let e=await uO("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{public_key:bt.publicKeyFromPem(e.publicKey),private_key:bt.privateKeyFromPem(e.privateKey)}}a(gO,"generateKeys");async function SO(e,t,r){let n=bt.createCertificate();if(!t){let o=await K_();t=bt.certificateFromPem(o.options.cert).publicKey}n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+mO);let i=[{name:"commonName",value:QE()},...pO];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(qH()),n.sign(e,Fu.md.sha256.create()),bt.certificateToPem(n)}a(SO,"generateCertificates");async function _O(){let e=await zH(),t;for(let r of e){if(!r.is_authority)continue;let n=await WH(r.private_key_name);if(r.private_key_name&&n&&new To(r.certificate).checkPrivateKey(xH(n))){yt.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;yt.trace("No CA found with matching private key")}a(_O,"getCertAuthority");async function $H(e,t,r=!0){let n=bt.createCertificate();n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+mO);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${Jn.get(tl.REPLICATION_HOSTNAME)??kH(Jn.get(tl.REPLICATION_URL))??BH().split("-")[0]}`},...pO];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Fu.md.sha256.create());let o=ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=ir.join(o,Xs.PRIVATEKEY_PEM_NAME);return r&&await bn.writeFile(c,bt.privateKeyToPem(e)),n}a($H,"generateCertAuthority");async function Wre(){let{private_key:e,public_key:t}=await gO(),r=await $H(e,t),n=await SO(e,t,r);await Yre(n,r),VH()}a(Wre,"generateCertsKeys");async function zre(){let e=await SO(bt.privateKeyFromPem(Xs.CERTIFICATE_VALUES.key),void 0,bt.certificateFromPem(Xs.CERTIFICATE_VALUES.cert)),t=ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=ir.join(t,Xs.NATS_CERTIFICATE_PEM_NAME);await bn.exists(r)||await bn.writeFile(r,e);let n=ir.join(t,Xs.NATS_CA_PEM_NAME);await bn.exists(n)||await bn.writeFile(n,Xs.CERTIFICATE_VALUES.cert)}a(zre,"createNatsCerts");async function Qre(){ba();for await(let e of Hr.search([{attribute:"is_self_signed",value:!0}]))await Hr.delete(e.name);await TO()}a(Qre,"renewSelfSigned");async function TO(){Hre(),await EO(),ba();let e=await _O();if(!e){yt.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=a(u=>{try{return{key:bt.privateKeyFromPem(bn.readFileSync(u)),keyPath:u}}catch(f){return yt.warn(`Failed to parse private key from ${u}:`,f.message),{key:null,keyPath:u}}},"tryToParseKey"),n=Jn.get(tl.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let f=r(u.privateKey);if(s=f.key,i=f.keyPath,f.key)break}}else{let u=Jn.get(tl.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=HH(o,i);s||(yt.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{private_key:s}=await gO(),bn.existsSync(ir.join(o,Xs.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${BH().split("-")[0]}.pem`),await bn.writeFile(ir.join(o,c),bt.privateKeyToPem(s)));let l=await $H(s,bt.setRsaPublicKey(s.n,s.e),!1);await Gu({name:l.subject.getField("CN").value,uses:["https"],certificate:bt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await K_()){let r=jE();yt.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await _O();let n=bt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await SO(bt.privateKeyFromPem(e.private_key),s,n);await Gu({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(TO,"reviewSelfSignedCert");function VH(){let e=vre(Object.keys(Es.CONFIG_PARAM_MAP),!0),t=ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=ir.join(t,Xs.PRIVATEKEY_PEM_NAME),n=ir.join(t,Xs.NATS_CERTIFICATE_PEM_NAME),s=ir.join(t,Xs.NATS_CA_PEM_NAME),i=Es.CONFIG_PARAMS,o={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(o[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(o[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,o[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,o[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),KE.updateConfigValue(void 0,void 0,o,!1,!0)}a(VH,"updateConfigCert");function KH(e){return e.startsWith("-----BEGIN")?e:kre(e,"utf8")}a(KH,"readPEM");var MH=YE.createSecureContext;YE.createSecureContext=function(e){if(!e.cert||!e.key)return MH(e);let t={...e};delete t.key,delete t.cert;let r=MH(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var jre=GH.prototype._init;GH.prototype._init=function(e,t){jre.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,o)=>{this.sni_context=o?.context||o,this.certCbDone()})}};var el=new Map;function YH(e,t){let r=new Map,n,s=!1;return i.initialize=o=>i.ready?i.ready:(o&&(o.secureContexts=r,o.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),el.clear();let f=0;for await(let d of lO.system.hdb_certificate.search([])){let _=d.certificate,h=new To(_);d.is_authority&&(h.asString=_,el.set(h.subject,_))}for await(let d of lO.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let _=e==="operations-api",h=d.is_self_signed?1:2;d.uses?.includes(e)&&(h+=1);let m=await WH(d.private_key_name),S=d.certificate,g=new To(S);if(el.has(g.issuer)&&(S+=`
|
|
20
|
+
`,t)}var jc,gB,SB,TB,N_,Ub,w_,I_,AB,Jc,yE,RB,RE,yB,bB,OB,NB,dB,fB,O_,CB,Ote,Nte,hB,mB,DB,pB,EB,Ite,MB,pa,Cte,Li=Re(()=>{jc=require("worker_threads"),gB=v(it());xe();SB=v(ee()),TB=v(ks()),N_=require("path"),Ub=require("fs/promises"),w_=v(un()),I_=v(le());k();Mr();AB=v(require("node:fs")),Jc=(0,TB.loggerWithTag)("analytics");(0,I_.initSync)();yE=new Map,RB=(0,I_.get)(x.ANALYTICS_AGGREGATEPERIOD)>-1;a(Ste,"setAnalyticsEnabled");a(Tte,"recordExistingAction");a(Ate,"recordNewAction");a(Mt,"recordAction");Ye.recordAnalytics=Mt;a(jn,"recordActionBinary");RE=0,yB=1e3,bB="analytics-report",OB=[];a(C_,"addAnalyticsListener");NB=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Rte,"sendAnalytics");a(bE,"storeMetric");a(wB,"calculateCPUUtilization");a(IB,"diffResourceUsage");a(yte,"storeTableSizeMetrics");a(lB,"storeDBSizeMetrics");a(uB,"storeVolumeMetrics");a(bte,"aggregation");dB=0,fB=0,O_={},CB=a(()=>new Promise(setImmediate),"rest");a(_B,"cleanup");Ote=36e5,Nte=31536e6;a(xb,"getRawAnalyticsTable");a(PB,"getAnalyticsTable");(0,gB.setChildListenerByType)(bB,LB);a(wte,"startScheduledTasks");pB=0,EB=new Map,Ite=!1;a(LB,"recordAnalytics");Cte=1e6;a(Pte,"logAnalytics")});var vB={};Ue(vB,{Headers:()=>go,appendHeader:()=>OE,mergeHeaders:()=>Bb});function OE(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 Bb(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new go(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 go,D_=Re(()=>{go=class extends Map{static{a(this,"Headers")}constructor(t){if(t)if(t[Symbol.iterator])super(t);else{super();for(let r in t)this.set(r,t[r])}else super()}set(t,r){return typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r),super.set(t.toLowerCase(),[t,r])}get(t){return typeof t!="string"&&(t=""+t),super.get(t.toLowerCase())?.[1]}has(t){return typeof t!="string"&&(t=""+t),super.has(t.toLowerCase())}setIfNone(t,r){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let n=t.toLowerCase();if(!super.has(n))return super.set(n,[t,r])}append(t,r,n){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let s=t.toLowerCase(),i=super.get(s);if(i){let o=i[1];if(n)r=(typeof o=="string"?o:o.join(", "))+", "+r;else if(typeof o=="string")r=[o,r];else{o.push(r);return}}return super.set(s,[t,r])}[Symbol.iterator](){return super.values()[Symbol.iterator]()}};a(OE,"appendHeader");a(Bb,"mergeHeaders")});function kB(e){let t={openapi:Dte,info:{title:"HarperDB HTTP REST interface",version:HB.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}];for(let[,n]of e){if(!n.path||n.Resource.isError)continue;let{path:s}=n,i=s.split("/").slice(-1),{attributes:o,primaryKey:c,prototype:l}=n.Resource;if(c=c??"id",!c)continue;let u={},f=[];if(o)for(let{type:T,name:N,elements:M,relationship:H,definition:X}of o){if(H)T==="array"?u[N]={type:"array",items:{$ref:Ea+M.type}}:u[N]={$ref:Ea+T};else{let W=X??M?.definition;if(W){if(!t.components.schemas[W.type]){let $={};W.properties.forEach(se=>{$[se.name]=new Gb(Hb[se.type],se.type)}),t.components.schemas[W.type]=new BB($)}T==="array"?u[N]={type:"array",items:{$ref:Ea+W.type}}:u[N]={$ref:Ea+W.type}}else T==="array"?M.type==="Any"||M.type=="ID"?u[N]={type:"array",items:{format:M.type}}:u[N]={type:"array",items:new Gb(Hb[M.type],M.type)}:T==="Any"||T=="ID"?u[N]={format:T}:u[N]=new Gb(Hb[T],T)}f.push(new qb(N,"query",u[N]))}let d=Object.keys(u),_=new qb(c,"path",{format:"ID"});_.required=!0,_.description="primary key of record";let h=new qb("property","path",{enum:d});h.required=!0,t.components.schemas[i]=new BB(u);let m=l.post!==Resource.prototype.post||l.update,S=typeof l.put=="function",g=typeof l.get=="function",R=typeof l.delete=="function",E="/"+s+"/";m&&(t.paths[E]={},t.paths[E].post=new Lte(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[E]||(t.paths[E]={}),t.paths[E].get=new kb(f,r,{200:new Fb({$ref:Ea+i})},"search for records by the specified property name and value pairs")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new xB(f,r,"delete all the records that match the provided query",{204:new UB})),E="/"+s+"/{"+c+"}",g&&(t.paths[E]={},t.paths[E].get=new kb([_],r,{200:new Fb({$ref:Ea+i})},"retrieve a record by its primary key")),S&&(t.paths[E]||(t.paths[E]={}),t.paths[E].put=new Mte([_],r,i,"create or update the record with the URL path that maps to the record's primary key")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new xB([_],r,"delete a record with the given primary key",{204:new UB})),g&&h.schema.enum.length>0&&(E="/"+s+"/{"+c+"}.{property}",t.paths[E]={},t.paths[E].get=new kb([_,h],r,{200:new Fb({enum:d})},"used to retrieve the specified property of the specified record"))}return t}function Lte(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:Ea+e}}}},this.security=t,this.responses={200:{description:$b,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function kb(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function Fb(e){this.description=$b,this.content={"application/json":{schema:e}}}function UB(){this.description="successfully processed request, no content returned to client"}function Mte(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Ea+r}}}},this.responses={200:{description:$b}}}function xB(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function BB(e){this.type="object",this.properties=e}function Gb(e,t){this.type=e,this.format=t}function qb(e,t,r){this.name=e,this.in=t,this.schema=r}var HB,Dte,Hb,Ea,$b,FB=Re(()=>{HB=v(Et()),Dte="3.0.3",Hb={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},Ea="#/components/schemas/",$b="successful operation";a(kB,"generateJsonApi");a(Lte,"Post");a(kb,"Get");a(Fb,"Response200");a(UB,"Response204");a(Mte,"Put");a(xB,"Delete");a(BB,"ResourceSchema");a(Gb,"Type");a(qb,"Parameter")});var qB={};Ue(qB,{Request:()=>L_,createReuseportFd:()=>NE});var GB,L_,Vb,Kb,NE,wE=Re(()=>{GB=require("os"),L_=class{static{a(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 Kb(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 Vb(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get isAborted(){return!1}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},Vb=class{static{a(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)}},Kb=class{constructor(t){this.asObject=t}static{a(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,GB.platform)()!="win32"&&(NE=require("node-unix-socket").createReuseportFd)});var CE={};Ue(CE,{parseHeaderValue:()=>Wb,start:()=>xte});async function Ute(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&Zm(e);let i=new go;try{e.responseHeaders=i;let o=e.url.slice(1),c,l;if(o!==$B){let g=IE.getMatch(o,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new pc(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=Wb(g);for(let E of R)switch(E.name){case"max-age":e.expiresAt=E.value*1e3+Date.now();break;case"only-if-cached":e.onlyIfCached=!0;break;case"no-cache":e.noCache=!0;break;case"no-store":e.noCacheStore=!0;break;case"stale-if-error":e.staleIfError=!0;break;case"must-revalidate":e.mustRevalidate=!0;break}}}let u=r["x-replicate-to"];if(u){let g=Wb(u).map(R=>(R.next?.name==="confirm"&&R.next.value>=0&&(e.replicatedConfirmation=+R.next.value),R.name));e.replicateTo=g.length===1&&+g[0]>=0?+g[0]:g[0]==="*"?void 0:g}r["x-replicate-from"]==="none"&&(e.replicateFrom=!1);let d=await It(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=oo(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new Cu.ClientError(g,400)}if(e.authorize=!0,o===$B&&s==="GET"){if(e?.user?.role?.permission?.super_user)return kB(IE);throw new Cu.ServerError("Forbidden",403)}switch(s){case"GET":case"HEAD":return l.get(c,e);case"POST":return l.post(c,e.data,e);case"PUT":return l.put(c,e.data,e);case"DELETE":return l.delete(c,e);case"PATCH":return l.patch(c,e.data,e);case"OPTIONS":i.setIfNone("Allow","GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE");return;case"CONNECT":return l.connect(c,null,e);case"TRACE":return"HarperDB is the terminating server";case"QUERY":return l.query(c,e.data,e);case"COPY":return l.copy(c,r.destination,e);case"MOVE":return l.move(c,r.destination,e);case"BREW":throw new Cu.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Cu.ServerError(`Method ${s} is not recognized`,501)}}),_=200,h;if(d==null)_=s==="GET"||s==="HEAD"?404:204,Yb.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(d.status>0&&d.headers){let g=Bb(d.headers,i);return d.headers!==g&&(d.headers=g),d.data!==void 0&&(d.body=vf(d.data,e,d)),d}else if(h=e.lastModified){vte[0]=h;let g=String.fromCharCode(34,(Br[0]&63)+62,(Br[0]>>6)+(Br[1]<<2&63)+62,(Br[1]>>4)+(Br[2]<<4&63)+62,(Br[2]>>2)+62,(Br[3]&63)+62,(Br[3]>>6)+(Br[4]<<2&63)+62,(Br[4]>>4)+(Br[5]<<4&63)+62,(Br[5]>>2)+62,(Br[6]&63)+62,(Br[6]>>6)+(Br[7]<<2&63)+62,34),R=r["if-none-match"];R&&g==R?(d?.onDone&&d.onDone(),_=304,d=void 0):i.setIfNone("ETag",g),Yb.lastModified&&i.setIfNone("Last-Modified",new Date(h).toUTCString())}e.createdResource&&(_=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let m={status:_,headers:i,body:void 0},S=d?.wasLoadedFromSource?.();return S!==void 0&&(m.wasCacheMiss=S,!S&&h&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||h))/1e3))),d!==void 0&&(m.body=vf(d,e,m),s==="HEAD"&&(m.body=void 0)),m}catch(o){o.statusCode?o.statusCode===500?Mi.warn(o):Mi.info(o):Mi.error(o),o.statusCode===405&&(o.method&&(o.message+=` to handle HTTP method ${o.method.toUpperCase()||""}`),o.allow&&(o.allow.push("trace","head","options"),i.setIfNone("Allow",o.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:o.statusCode||500,headers:i,body:void 0};return c.body=vf(o.contentType?o:o.toString(),e,c),c}}function xte(e){Yb=e,e.includeExpensiveRecordCountEstimates&&(L_.prototype.includeExpensiveRecordCountEstimates=!0),!VB&&(VB=!0,IE=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return Ute(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{M_++;let s=new xn;KB||(KB=!0,C_(l=>{M_>0&&l.push({metric:"ws-connections",connections:M_,byThread:!0})}));let i;t.on("error",l=>{i=!0,Mi.warn(l)});let o;t.on("message",a(function(u){o||(o=oo(r.requestedContentType??r.headers.asObject["content-type"],!1));let f=o(u);Mt(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(f)},"message"));let c;t.on("close",()=>{M_--,jn(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=IE.getMatch(l,"ws");if(jn(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,Mt(m=>({count:m.count,total:M_}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let f=new pc(u.relativeURL),d=u.Resource;c=(await It(r,()=>d.connect(f,s,r)))[Symbol.asyncIterator]();let h;for(;!(h=await c.next()).done;){let m=await aa(h.value,r);t.send(m),Mt(m.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(S=>t._socket.once("drain",S))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?Mi.warn(l):Mi.info(l):Mi.error(l),t.close(Bte[l.statusCode]||1011,l.toString())}t.close()},e))}function Wb(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,o]=s.trim().split("=");i=i.trim(),o&&(o=o.trim()),r={name:i.toLowerCase(),value:o,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var Mi,Cu,Br,vte,Yb,$B,VB,IE,KB,M_,Bte,YB=Re(()=>{no();Li();Mi=v(ee()),Cu=v(he());bf();zl();mc();D_();FB();bf();wE();Br=new Uint8Array(8),vte=new Float64Array(Br.buffer,0,1),Yb={},$B="openapi";a(Ute,"http");M_=0;a(xte,"start");Bte={401:3e3,403:3003};a(Wb,"parseHeaderValue")});var zb=C((Awe,zB)=>{var{recordAction:PE,recordActionBinary:WB}=(Li(),P(P_)),Hte=require("fastify-plugin"),kte=200;zB.exports=Hte(function(e,t,r){e.addHook("onResponse",async(n,s)=>{let i=s.elapsedTime}),e.addHook("onSend",async(n,s,i)=>{let o=s.elapsedTime,c=performance.now(),l=s.request.routeOptions,u,f,d;l.config?.isOperation?(u=n.body?.operation,f="operation"):(u=l.url,f="fastify-route",d=l.method),PE(o,"duration",u,d,f),WB(s.raw.statusCode<400,"success",u,d,f),WB(1,"response_"+s.raw.statusCode,u,d,f);let _=kte;i?.pipe?(i.on("data",g=>{_+=g.length}),i.on("end",()=>{PE(performance.now()-c,"transfer",u,d,f),PE(_,"bytes-sent",u,d,f)})):(_+=i?.length||0,PE(_,"bytes-sent",u,d,f));let h=o.toFixed(3),m=s.getHeader("Server-Timing"),S=`db;dur=${h}`;s.header("Server-Timing",m?`${m}, ${S}`:S)}),r()},{name:"hdb-request-time"})});var jB=C((Rwe,QB)=>{var Fte=ot(),Gte={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};QB.exports=function(e){return Fte.validateObject(e,Gte)}});var DE=C((ywe,JB)=>{"use strict";var qte=(k(),P(q)).OPERATIONS_ENUM,Qb=class{static{a(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=qte.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};JB.exports=Qb});var x_={};Ue(x_,{createTokens:()=>Vte,getJWTRSAKeys:()=>xE,refreshOperationToken:()=>Kte,validateOperationToken:()=>Xb,validateRefreshToken:()=>BE});async function xE(){if(LE)return LE;try{let e=v_.default.join(U_.default.getHdbBasePath(),EA),t=await ME.default.readFile(v_.default.join(e,cf.JWT_PASSPHRASE_NAME),"utf8"),r=await ME.default.readFile(v_.default.join(e,cf.JWT_PRIVATE_KEY_NAME),"utf8");return LE={publicKey:await ME.default.readFile(v_.default.join(e,cf.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},LE}catch(e){throw UE.default.error(e),new Qs.ClientError(Du.NO_ENCRYPTION_KEYS,Pu.INTERNAL_SERVER_ERROR)}}async function Vte(e){let t=(0,jb.validateBySchema)(e,vi.default.object({username:vi.default.string().optional(),password:vi.default.string().optional(),role:vi.default.string().optional(),expires_in:vi.default.alternatives(vi.default.string(),vi.default.number()).optional()}));if(t)throw new Qs.ClientError(t.message);let r;try{let d=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,d=!1),r=await(0,Jb.findAndValidateUser)(e.username,e.password,d)}catch(d){throw UE.default.error(d),new Qs.ClientError(Du.INVALID_CREDENTIALS,Pu.UNAUTHORIZED)}if(!r)throw new Qs.ClientError(Du.INVALID_CREDENTIALS,Pu.UNAUTHORIZED);let n=!1,s=!1;r.role?.permission&&(n=r.role.permission.super_user===!0,s=r.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s};e.role&&(i.role=e.role);let o=await xE(),c=await Lu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:e.expires_in??rH,algorithm:vE,subject:"operation"}),l=await Lu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:$te,algorithm:vE,subject:"refresh"}),u=uy(l,"sha256");if((await(0,XB.update)(new ZB.default(af,Yl.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new Qs.ClientError(Du.REFRESH_TOKEN_SAVE_FAILED,Pu.INTERNAL_SERVER_ERROR);return eH.default.signalUserChange(new tH.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function Kte(e){let t=(0,jb.validateBySchema)(e,vi.default.object({refresh_token:vi.default.string().required()}).required());if(t)throw new Qs.ClientError(t.message);let{refresh_token:r}=e;await BE(r);let n=await xE(),s=await Lu.default.decode(r);return{operation_token:await Lu.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:rH,algorithm:vE,subject:"operation"})}}async function Xb(e){return nH(e,"operation")}async function BE(e){return nH(e,"refresh")}async function nH(e,t){try{let r=await xE(),n=await Lu.default.verify(e,r.publicKey,{algorithms:vE,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,Jb.findAndValidateUser)(n.username,void 0,!1);if(t==="refresh"&&!dy(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw UE.default.warn(r),r?.name==="TokenExpiredError"?new Qs.ClientError(Du.TOKEN_EXPIRED,Pu.FORBIDDEN):new Qs.ClientError(Du.INVALID_TOKEN,Pu.UNAUTHORIZED)}}var Lu,ME,v_,vi,jb,Qs,UE,Jb,XB,ZB,eH,tH,U_,Pu,Du,rH,$te,vE,LE,Mu=Re(()=>{Lu=v(require("jsonwebtoken")),ME=v(require("fs-extra")),v_=v(require("node:path")),vi=v(require("joi")),jb=v(ot());k();Qs=v(he()),UE=v(ee());Gp();Jb=v(Kn()),XB=v(An()),ZB=v(DE()),eH=v(mo()),tH=v(Ys()),U_=v(le()),{HTTP_STATUS_CODES:Pu,AUTHENTICATION_ERROR_MSGS:Du}=Qs.hdb_errors;U_.default.initSync();rH=U_.default.get(x.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",$te=U_.default.get(x.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",vE="RS256";a(xE,"getJWTRSAKeys");a(Vte,"createTokens");a(Kte,"refreshOperationToken");a(Xb,"validateOperationToken");a(BE,"validateRefreshToken");a(nH,"validateToken")});var Zb=C((Iwe,oH)=>{"use strict";var Yte=jB(),vu=require("passport"),Wte=require("passport-local").Strategy,zte=require("passport-http").BasicStrategy,Qte=require("util"),jte=Kn(),iH=Qte.callbackify(jte.findAndValidateUser),wwe=Un(),Jte=(k(),P(q)),sH=(Mu(),P(x_));vu.use(new Wte(function(e,t,r){iH(e,t,r)}));vu.use(new zte(function(e,t,r){iH(e,t,r)}));vu.serializeUser(function(e,t){t(null,e)});vu.deserializeUser(function(e,t){t(null,e)});function Xte(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let o=e.headers.authorization.split(" ");n=o[0],s=o[1]}function i(o,c){return o?r(o):c?r(null,c):r("Must login")}switch(a(i,"handleResponse"),n){case"Basic":vu.authenticate("basic",{session:!1},(o,c)=>{i(o,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===Jte.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?sH.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):sH.validateOperationToken(s).then(o=>{r(null,o)}).catch(o=>{r(o)});break;default:vu.authenticate("local",{session:!1},function(o,c){i(o,c)})(e,t,r);break}}a(Xte,"authorize");function Zte(e,t){let r=Yte(e);if(r){t(r);return}let n={authorized:!0,messages:[]},s=e.user.role;if(!s?.permission)return t("Invalid role");let i=JSON.parse(s.permission);if(i.super_user)return t(null,n);if(!i[e.schema])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.schema} schema`),t(null,n);if(!i[e.schema].tables[e.table])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.table} table`),t(null,n);if(!i[e.schema].tables[e.table][e.operation])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.operation} on ${e.table} table`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&!e.attributes)return n.authorized=!1,n.messages.push(`${e.schema}.${e.table} has attribute permissions. Missing attributes to validate`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&e.attributes){let o=i[e.schema].tables[e.table].attribute_permissions;for(let c in o)e.attributes.indexOf(o[c].attribute_name)>-1&&!o[c][e.operation]&&(n.authorized=!1,n.messages.push(`Not authorized to ${e.operation} ${o[c].attribute_name} `))}return t(null,n)}a(Zte,"checkPermissions");oH.exports={authorize:Xte,checkPermissions:Zte}});var HE=C((Pwe,aH)=>{"use strict";var ere=qn();aH.exports={writeTransaction:tre};function tre(e,t,r){return ere.writeTransaction(e,t,r)}a(tre,"writeTransaction")});var dH=C((Mwe,uH)=>{"use strict";var rre=Wr(),nre=$s(),cH=ee(),sre=An(),Lwe=HE(),ire=require("clone"),tO=require("alasql"),ore=Mp(),lH=require("util"),are=lH.promisify(nre.getTableSchema),cre=lH.promisify(rre.search),lre=(k(),P(q)),eO=ie();ore(tO);uH.exports={update:dre};var ure="There was a problem performing this update. Please check the logs and try again.";async function dre({statement:e,hdb_user:t}){let r=await are(e.table.databaseid,e.table.tableid),n=fre(e.columns);eO.backtickASTSchemaItems(e);let{table:s,where:i}=e,o=ire(s),c=eO.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=tO.parse(l).statements[0],f=await cre(u),d=_re(n,f);return hre(o,d,t)}a(dre,"update");function fre(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=tO.compile(`SELECT ${r.expression.toString()} AS [${lre.FUNC_VAL}] FROM ?`)}),t}catch(t){throw cH.error(t),new Error(ure)}}a(fre,"createUpdateRecord");function _re(e,t){return eO.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}a(_re,"buildUpdateRecords");async function hre(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await sre.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){cH.error(`Error delete new_attributes from update response: ${i}`)}return s}a(hre,"updateRecords")});var _H=C((Bwe,fH)=>{var mre=require("alasql"),pre=Wr(),Ere=ee(),gre=qn(),nO=require("util"),rO=ie(),Sre=(k(),P(q)),Tre=$s(),Uwe=HE(),xwe=An(),Are="record",Rre="successfully deleted",yre=nO.callbackify(wre),bre=nO.promisify(pre.search),Ore=nO.promisify(Tre.getTableSchema);fH.exports={convertDelete:yre};function Nre(e){return`${e.deleted_hashes.length} ${Are}${e.deleted_hashes.length===1?"":"s"} ${Rre}`}a(Nre,"generateReturnMessage");async function wre({statement:e,hdb_user:t}){let r=await Ore(e.table.databaseid,e.table.tableid);rO.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=rO.isEmpty(s)?"":` WHERE ${s.toString()}`,o=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=mre.parse(o).statements[0],l={operation:Sre.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await bre(c);let u=await gre.deleteRecords(l);return rO.isEmptyOrZeroLength(u.message)&&(u.message=Nre(u)),delete u.txn_time,u}catch(u){throw Ere.error(u),u.hdb_code?u.message:u}}a(wre,"convertDelete")});var gH=C((kwe,EH)=>{"use strict";var Ire=_o(),{hdb_errors:hH}=he(),{getDatabases:mH}=(xe(),P(ct));EH.exports={checkSchemaExists:pH,checkSchemaTableExists:Cre,schema_describe:Ire};async function pH(e){if(!mH()[e])return hH.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(pH,"checkSchemaExists");async function Cre(e,t){let r=await pH(e);if(r)return r;if(!mH()[e][t])return hH.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(Cre,"checkSchemaTableExists")});function sO(e){let t=e.get(kE),r=t?(0,Uu.unpack)(t):null;r||(r={remoteNameToId:{}});let n=et(),s=!1;r.nodeName=et();let i=r.remoteNameToId;if(i[n]!==0){let o=0,c;for(let l in i){let u=i[l];u===0?c=l:u>o&&(o=u)}if(c){o++,i[c]=o;let l=[Symbol.for("seq"),o];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:H_(e)??1,nodes:[]})})}i[n]=0,e.putSync(kE,(0,Uu.pack)(r))}return r}function B_(e){return sO(e).remoteNameToId}function TH(e,t){let r=sO(t),n=r.remoteNameToId,s=new Map,i=!1;for(let o in e){let c=e[o],l=n[o];if(l==null){let u=0;for(let f in n){let d=n[f];d>u&&(u=d)}l=u+1,n[o]=l,i=!0}s.set(c,l)}return i&&t.putSync(kE,(0,Uu.pack)(r)),s}function FE(e,t){let r=sO(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let o in n){let c=n[o];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(kE,(0,Uu.pack)(r))}return SH.trace?.("The remote node name map",e,n,s),s}var SH,Uu,kE,iO=Re(()=>{SH=v(ks());ps();Uu=require("msgpackr"),kE=Symbol.for("remote-ids");a(sO,"getIdMappingRecord");a(B_,"exportIdMapping");a(TH,"remoteToLocalNodeId");a(FE,"getIdOfRemoteNode")});var oO={};Ue(oO,{commits_awaiting_replication:()=>xu,getHDBNodeTable:()=>sr,getReplicationSharedStatus:()=>GE,iterateRoutes:()=>F_,shouldReplicateToNode:()=>k_,subscribeToNodeUpdates:()=>Bu});function sr(){return AH||(AH=ft({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 GE(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Bu(e){sr().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;OH.debug?.("adding node",n,"on node",et()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==et()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of sr().search({}))if(i.shard!=null){let o=s.get(i.shard);o||s.set(i.shard,o=[]),o.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function k_(e,t){let r=ga.default.get(x.REPLICATION_DATABASES);return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&(r==="*"||r?.find?.(n=>(typeof n=="string"?n:n.name)===t&&(!n.sharded||e.shard===ga.default.get(x.REPLICATION_SHARD))))&&sr().primaryStore.get(et())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function Pre(){Bu(e=>{Sa({},(t,r)=>{let n=e.name,s=RH.get(n);if(s||RH.set(n,s=new Map),s.has(r))return;let i;for(let o in t)if(i=t[o].auditStore,i)break;if(i){let o=GE(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of xu.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*F_(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=ga.default.get(x.REPLICATION_SECUREPORT)??(!ga.default.get(x.REPLICATION_PORT)&&ga.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||ga.default.get(x.REPLICATION_PORT)||ga.default.get(x.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){yH.isMainThread&&console.error("Invalid route, must specify a url or host (with port)");continue}yield{replicates:!t.subscriptions,url:r,subscription:t.subscriptions,routes:t.routes,start_time:t.startTime,revoked_certificates:t.revokedCertificates}}}var yH,bH,ga,OH,AH,RH,xu,Xc=Re(()=>{xe();ps();jm();yH=require("worker_threads"),bH=v(he()),ga=v(le());k();OH=v(ks());server.nodes=[];a(sr,"getHDBNodeTable");a(GE,"getReplicationSharedStatus");a(Bu,"subscribeToNodeUpdates");a(k_,"shouldReplicateToNode");RH=new Map;PD((e,t,r)=>{if(r>server.nodes.length)throw new bH.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);xu||(xu=new Map,Pre());let n=xu.get(e);return n||(n=[],xu.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(Pre,"startSubscriptionToReplications");a(F_,"iterateRoutes")});var IH={};Ue(IH,{connectedToNode:()=>Zc,disconnectedFromNode:()=>ku,ensureNode:()=>So,requestClusterStatus:()=>wH,startOnMainThread:()=>cO});async function cO(e){let t=0,r=Xe();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){qE.set(i,H_(l.auditStore));break}}}xi.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes?.search([])||[])i.push(o);for(let o of F_(e))try{let c=!o.subscriptions;if(c){let u=et(),f=sr().primaryStore.get(u);if(f!==null){let d=e.url??Ta();(f===void 0||f.url!==d||f.shard!==e.shard)&&await So(u,{name:u,url:d,shard:e.shard,replicates:!0})}}let l=o.trusted!==!1;if(c&&o.replicates==null&&(o.replicates=!0),i.find(u=>u.url===o.url))continue;s(o)}catch(c){console.error(c)}Bu(s)});let n;function s(i,o=i?.name){let c=et()&&o===et()||Ta()&&i?.url===Ta();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let _ of sr().search([]))_.replicates&&_.name!==o&&s(_,_.name);n=d}if(nt.trace("Setting up node replication for",i),!i){for(let[d,_]of Ui){let h;for(let[m,{worker:S,nodes:g}]of _){let R=g[0];if(R&&R.name==o){h=!0;for(let[E,{worker:T}]of _)_.delete(E),nt.warn("Node was deleted, unsubscribing from node",o,E,d),T?.postMessage({type:"unsubscribe-from-node",node:o,database:E,url:d});break}}if(h){Ui.get(d).iterator.remove(),Ui.delete(d);return}}return}if(c)return;if(!i.url){nt.info(`Node ${i.name} is missing url`);return}let l=Ui.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(nt.info(`Added node ${i.name} at ${i.url} for process ${et()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[d,_]of Hu)if(i.url===_.url){Hu.delete(d);break}Hu.set(i.name,i)}let u=Xe();if(l||(l=new Map,Ui.set(i.url,l)),l.iterator=Sa(e,(d,_,h)=>{h?f(_,!0):f(_,!1)}),i.subscriptions)for(let d of i.subscriptions){let _=d.database||d.schema;u[_]||(nt.warn(`Database ${_} not found for node ${i.name}, making a subscription anyway`),f(_,!1))}function f(d,_){nt.trace("Setting up replication for database",d,"on node",i.name);let h=l.get(d),m,S=[{replicateByDefault:_,...i}];qE.has(d)&&G_.default.get(x.REPLICATION_FAILOVER)&&(S.push({replicateByDefault:_,name:et(),start_time:qE.get(d),end_time:Date.now(),replicates:!0}),qE.delete(d));let g=k_(i,d),R=xi.workers.filter(E=>E.name==="http");if(h?(m=h.worker,h.nodes=S):g&&(t=t%R.length,m=R[t++],l.set(d,{worker:m,nodes:S,url:i.url}),m?.on("exit",()=>{l.get(d)?.worker===m&&(l.delete(d),f(d,_))})),g)setTimeout(()=>{let E={type:"subscribe-to-node",database:d,nodes:S};m?m.postMessage(E):q_(E)},Dre);else{nt.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],sr().primaryStore.get(et())?.replicates),sr().primaryStore.get(et())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};m?m.postMessage(E):VE(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),ku=a(function(i){try{nt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(Hu.keys()),c=o.sort(),l=c.indexOf(i.name||js(i.url));if(l===-1){nt.warn("Disconnected node not found in node map",i.name,o);return}let u=Ui.get(i.url),f=u?.get(i.database);if(!f){nt.warn("Disconnected node not found in replication map",i.database,u);return}if(f.connected=!1,i.finished||!G_.default.get(x.REPLICATION_FAILOVER))return;let d=f.nodes[0];if(!(d.replicates===!0||d.replicates?.sends||d.subscriptions?.length))return;let _=d.shard,h=(l+1)%c.length;for(;l!==h;){let m=c[h],S=Hu.get(m);u=Ui.get(S.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==_){h=(h+1)%c.length;continue}let{worker:R,nodes:E}=g,T=!1;for(let N of f.nodes){if(E.some(M=>M.name===N.name)){nt.info(`Disconnected node is already failing over to ${m} for ${i.database}`);continue}N.end_time<Date.now()||(E.push(N),T=!0)}if(f.nodes=[f.nodes[0]],!T){nt.info(`Disconnected node ${i.name} has no nodes to fail over to ${m}`);return}nt.info(`Failing over ${i.database} from ${i.name} to ${m}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:E}):q_({database:i.database,nodes:E});return}nt.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){nt.error("Error failing over node",o)}},"disconnectedFromNode"),Zc=a(function(i){let o=Ui.get(i.url),c=o?.get(i.database);if(!c){nt.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){nt.info("Connected node has no nodes",i.database,c);return}if(!l.name){nt.debug("Connected node is not named yet",i.database,c);return}if(!G_.default.get(x.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let f of Ui.values()){let d=f.get(i.database);if(!d||d==c)continue;let{worker:_,nodes:h,connected:m}=d;if(h)if(m===!1&&h[0].shard===l.shard)u=!0,c.nodes.push(h[0]);else{let S=h.filter(g=>g.name!==l.name);S.length<h.length&&(d.nodes=S,_.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",ku),(0,xi.onMessageByType)("connected-to-node",Zc),(0,xi.onMessageByType)("request-cluster-status",wH)}function wH(e,t){let r=[];for(let[n,s]of Hu)try{let i=Ui.get(s.url);nt.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let o=[];if(i){for(let[l,{worker:u,connected:f,nodes:d,latency:_}]of i)o.push({database:l,connected:f,latency:_,thread_id:u?.threadId,nodes:d.filter(h=>!(h.end_time<Date.now())).map(h=>h.name)});let c=(0,aO.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){nt.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function So(e,t){let r=sr();e=e??js(t.url),t.name=e;try{if(t.ca){let s=new NH.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subject_alt_name:s.subjectAltName,serial_number:s.serialNumber,valid_from:s.validFrom,valid_to:s.validTo}}}catch(s){nt.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(nt.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!G_.default.get(x.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],o=(0,aO.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of o)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...o,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}nt.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var xi,$E,nt,aO,G_,NH,Dre,Ui,ku,Zc,Hu,qE,$_=Re(()=>{xe();xi=v(it());ps();$E=require("worker_threads");Xc();nt=v(ee()),aO=require("lodash"),G_=v(le());k();NH=require("crypto"),Dre=200,Ui=new Map,Hu=new Map,qE=new Map;a(cO,"startOnMainThread");a(wH,"requestClusterStatus");$E.parentPort&&(ku=a(e=>{$E.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Zc=a(e=>{$E.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,xi.onMessageByType)("subscribe-to-node",e=>{q_(e)}),(0,xi.onMessageByType)("unsubscribe-from-node",e=>{VE(e)}));a(So,"ensureNode")});var Zs=C(jH=>{"use strict";var ir=require("path"),{watch:vH}=require("chokidar"),bn=require("fs-extra"),Fu=require("node-forge"),UH=require("net"),{generateKeyPair:uO,X509Certificate:To,createPrivateKey:xH}=require("crypto"),Lre=require("util");uO=Lre.promisify(uO);var bt=Fu.pki,Js=require("joi"),{v4:BH}=require("uuid"),{validateBySchema:hO}=ot(),yt=ee(),Jn=le(),Es=(k(),P(q)),{CONFIG_PARAMS:tl}=Es,Xs=hy(),{ClientError:Ra}=he(),YE=require("node:tls"),{relative:HH,join:Mre}=require("node:path"),{CERT_PREFERENCE_APP:rIe,CERTIFICATE_VALUES:CH}=Xs,vre=_c(),KE=Lt(),{table:Ure,getDatabases:xre,databases:lO}=(xe(),P(ct)),{getJWTRSAKeys:PH}=(Mu(),P(x_));Object.assign(jH,{generateKeys:gO,updateConfigCert:VH,createCsr:Vre,signCertificate:Kre,setCertTable:Gu,loadCertificates:EO,reviewSelfSignedCert:TO,createTLSSelector:YH,listCertificates:zH,addCertificate:Jre,removeCertificate:Zre,createNatsCerts:zre,generateCertsKeys:Wre,getReplicationCert:K_,getReplicationCertAuth:qre,renewSelfSigned:Qre,hostnamesFromCert:AO,getKey:ene});var{urlToNodeName:kH,getThisNodeUrl:Bre,getThisNodeName:jE,clearThisNodeName:Hre}=(ps(),P(Oa)),{readFileSync:kre,statSync:FH}=require("node:fs"),nIe=le(),{getTicketKeys:Fre,onMessageFromWorkers:Gre}=it(),Aa=ee(),{isMainThread:dO}=require("worker_threads"),{TLSSocket:GH,createSecureContext:sIe}=require("node:tls"),mO=3650,V_=["127.0.0.1","localhost","::1"],pO=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];Gre(async e=>{e.type===Es.ITC_EVENT_TYPES.RESTART&&(Jn.initSync(!0),await TO())});var Hr;function ba(){return Hr||(Hr=xre().system.hdb_certificate,Hr||(Hr=Ure({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__"}]}))),Hr}a(ba,"getCertTable");async function K_(){let e=YH("replication"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(jE());if(!r)return;let n=new To(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(K_,"getReplicationCert");async function qre(){ba();let e=(await K_()).options.cert,r=new To(e).issuer.match(/CN=(.*)/)?.[1];return Hr.get(r)}a(qre,"getReplicationCertAuth");var fO,ya=new Map,WE=[],DH;function EO(){if(fO)return;if(fO=!0,!DH&&dO){let n=KE.getConfigFilePath();DH=vH(n,{persistent:!1}).on("change",()=>{logger.warn?.("Config file changed, reloading certificates"),$re()})}let e=[{configKey:tl.TLS},{configKey:tl.OPERATIONSAPI_TLS}];ba();let t=ir.dirname(KE.getConfigFilePath()),r;for(let{configKey:n}of e){let s=KE.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&HH(Mre(t,"keys"),o);if(c){let l=LH(o,u=>{ya.set(c,u)},"private key");l&&WE.push(l)}for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&dO){let f=LH(u,d=>{if(CH.cert===d)return;let _=i.hostname??i.hostnames??i.host??i.hosts;_&&!Array.isArray(_)&&(_=[_]);let h=KH(u),m=new To(h),S;try{S=!l&&i.name||QH(m)}catch(M){logger.error("error extracting host name from certificate",M);return}if(S==null){logger.error("No host name found on certificate");return}if(m.checkIssued(new To(CH.cert)))return;let g=Hr.primaryStore.get(S),R=FH(u).mtimeMs,E=!g||g.is_self_signed?1:g.fileTimestamp??g.__updatedtime__,T=i.uses??["https",...n.includes("operations")?["operations"]:[]],N=g&&R===E&&(JSON.stringify(g.uses)!==JSON.stringify(T)||g.ciphers!==i.ciphers||JSON.stringify(g.hostnames)!==JSON.stringify(_));if(E&&R<=E&&!N){R<E&&logger.info?.(`Certificate ${S} at ${u} is older (${new Date(R)}) than the certificate in the database (${E>1?new Date(E):"only self signed certificate available"})`);return}N&&logger.info?.(`Config values changed for certificate ${S}, updating record`),r=Hr.put({name:S,uses:i.uses??["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:_,file_timestamp:R,details:{issuer:m.issuer.replace(/\n/g," "),subject:m.subject?.replace(/\n/g," "),subject_alt_name:m.subjectAltName,serial_number:m.serialNumber,valid_from:m.validFrom,valid_to:m.validTo}})},l?"certificate authority":"certificate");f&&WE.push(f)}}}}}return r}a(EO,"loadCertificates");function $re(){for(let e of WE)e.close();WE.length=0,fO=!1,EO()}a($re,"reloadCertificates");function LH(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&dO&&yt.warn(`Reloading ${r}:`,i),n=c,t(KH(i)))}catch(c){yt.error(`Error loading ${r}:`,i,c)}},"loadFile");return bn.existsSync(e)?s(e,FH(e)):yt.error?.(`${r} file not found:`,e),vH(e,{persistent:!1}).on("change",s)}a(LH,"loadAndWatch");function zE(){let e=Bre();if(e==null){let t=V_[0];return yt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return kH(e)}a(zE,"getHost");function QE(){let e=jE();if(e==null){let t=V_[0];return yt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(QE,"getCommonName");async function Vre(){let e=await K_(),t=bt.certificateFromPem(e.options.cert),r=bt.privateKeyFromPem(e.options.key);yt.info("Creating CSR with cert named:",e.name);let n=bt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:QE()},...pO];yt.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:qH()}];return yt.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Fu.pki.certificationRequestToPem(n)}a(Vre,"createCsr");function qH(){let e=V_.includes(QE())?V_:[...V_,QE()];return e.includes(zE())||e.push(zE()),[{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=>UH.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(qH,"certExtensions");async function Kre(e){let t={},r=ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;ba();for await(let f of Hr.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if(ya.has(f.private_key_name)){n=ya.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await bn.exists(ir.join(r,f.private_key_name))){n=bn.readFile(ir.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await _O();s=f.ca,n=f.private_key}n=bt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=bt.certificateFromPem(s.certificate);yt.info("Signing CSR with cert named",s.name);let o=bt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return yt.error(f),new Error("Error verifying CSR: "+f.message)}let c=Fu.pki.createCertificate();c.serialNumber=Math.random().toString().slice(2,10),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+mO),yt.info("sign cert setting validity:",c.validity),yt.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),yt.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;yt.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,Fu.md.sha256.create()),t.certificate=bt.certificateToPem(c)}else yt.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(Kre,"signCertificate");async function Yre(e,t){await Gu({name:jE(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Gu({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:bt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}a(Yre,"createCertificateTable");async function Gu(e){let t=new To(e.certificate);e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},ba(),await Hr.patch(e)}a(Gu,"setCertTable");async function gO(){let e=await uO("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{public_key:bt.publicKeyFromPem(e.publicKey),private_key:bt.privateKeyFromPem(e.privateKey)}}a(gO,"generateKeys");async function SO(e,t,r){let n=bt.createCertificate();if(!t){let o=await K_();t=bt.certificateFromPem(o.options.cert).publicKey}n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+mO);let i=[{name:"commonName",value:QE()},...pO];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(qH()),n.sign(e,Fu.md.sha256.create()),bt.certificateToPem(n)}a(SO,"generateCertificates");async function _O(){let e=await zH(),t;for(let r of e){if(!r.is_authority)continue;let n=await WH(r.private_key_name);if(r.private_key_name&&n&&new To(r.certificate).checkPrivateKey(xH(n))){yt.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;yt.trace("No CA found with matching private key")}a(_O,"getCertAuthority");async function $H(e,t,r=!0){let n=bt.createCertificate();n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+mO);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${Jn.get(tl.REPLICATION_HOSTNAME)??kH(Jn.get(tl.REPLICATION_URL))??BH().split("-")[0]}`},...pO];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Fu.md.sha256.create());let o=ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=ir.join(o,Xs.PRIVATEKEY_PEM_NAME);return r&&await bn.writeFile(c,bt.privateKeyToPem(e)),n}a($H,"generateCertAuthority");async function Wre(){let{private_key:e,public_key:t}=await gO(),r=await $H(e,t),n=await SO(e,t,r);await Yre(n,r),VH()}a(Wre,"generateCertsKeys");async function zre(){let e=await SO(bt.privateKeyFromPem(Xs.CERTIFICATE_VALUES.key),void 0,bt.certificateFromPem(Xs.CERTIFICATE_VALUES.cert)),t=ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=ir.join(t,Xs.NATS_CERTIFICATE_PEM_NAME);await bn.exists(r)||await bn.writeFile(r,e);let n=ir.join(t,Xs.NATS_CA_PEM_NAME);await bn.exists(n)||await bn.writeFile(n,Xs.CERTIFICATE_VALUES.cert)}a(zre,"createNatsCerts");async function Qre(){ba();for await(let e of Hr.search([{attribute:"is_self_signed",value:!0}]))await Hr.delete(e.name);await TO()}a(Qre,"renewSelfSigned");async function TO(){Hre(),await EO(),ba();let e=await _O();if(!e){yt.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=a(u=>{try{return{key:bt.privateKeyFromPem(bn.readFileSync(u)),keyPath:u}}catch(f){return yt.warn(`Failed to parse private key from ${u}:`,f.message),{key:null,keyPath:u}}},"tryToParseKey"),n=Jn.get(tl.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let f=r(u.privateKey);if(s=f.key,i=f.keyPath,f.key)break}}else{let u=Jn.get(tl.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=HH(o,i);s||(yt.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{private_key:s}=await gO(),bn.existsSync(ir.join(o,Xs.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${BH().split("-")[0]}.pem`),await bn.writeFile(ir.join(o,c),bt.privateKeyToPem(s)));let l=await $H(s,bt.setRsaPublicKey(s.n,s.e),!1);await Gu({name:l.subject.getField("CN").value,uses:["https"],certificate:bt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await K_()){let r=jE();yt.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await _O();let n=bt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await SO(bt.privateKeyFromPem(e.private_key),s,n);await Gu({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(TO,"reviewSelfSignedCert");function VH(){let e=vre(Object.keys(Es.CONFIG_PARAM_MAP),!0),t=ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=ir.join(t,Xs.PRIVATEKEY_PEM_NAME),n=ir.join(t,Xs.NATS_CERTIFICATE_PEM_NAME),s=ir.join(t,Xs.NATS_CA_PEM_NAME),i=Es.CONFIG_PARAMS,o={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(o[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(o[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,o[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,o[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),KE.updateConfigValue(void 0,void 0,o,!1,!0)}a(VH,"updateConfigCert");function KH(e){return e.startsWith("-----BEGIN")?e:kre(e,"utf8")}a(KH,"readPEM");var MH=YE.createSecureContext;YE.createSecureContext=function(e){if(!e.cert||!e.key)return MH(e);let t={...e};delete t.key,delete t.cert;let r=MH(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var jre=GH.prototype._init;GH.prototype._init=function(e,t){jre.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,o)=>{this.sni_context=o?.context||o,this.certCbDone()})}};var el=new Map;function YH(e,t){let r=new Map,n,s=!1;return i.initialize=o=>i.ready?i.ready:(o&&(o.secureContexts=r,o.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),el.clear();let f=0;for await(let d of lO.system.hdb_certificate.search([])){let _=d.certificate,h=new To(_);d.is_authority&&(h.asString=_,el.set(h.subject,_))}for await(let d of lO.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let _=e==="operations-api",h=d.is_self_signed?1:2;d.uses?.includes(e)&&(h+=1);let m=await WH(d.private_key_name),S=d.certificate,g=new To(S);if(el.has(g.issuer)&&(S+=`
|
|
21
21
|
`+el.get(g.issuer)),!m||!S)throw new Error("Missing private key or certificate for secure server");let R={ciphers:d.ciphers,ticketKeys:Fre(),availableCAs:el,ca:t&&Array.from(el.values()),cert:S,key:m,key_file:d.private_key_name,is_self_signed:d.is_self_signed};o&&(R.sessionIdContext=o.sessionIdContext);let E=d.hostnames??AO(g);Array.isArray(E)||(E=[E]);for(let M of E)M===zE()&&(h+=.1);let T=YE.createSecureContext(R);T.name=d.name,T.options=R,T.quality=h,T.certificateAuthorities=Array.from(el),T.certStart=S.toString().slice(0,100),Array.isArray(E)||(E=[E]);let N;for(let M of E)if(M){M[0]==="*"&&(s=!0,M=M.slice(1)),M===zE()&&(h+=2),UH.isIP(M)&&(N=!0);let H=r.get(M)?.quality??0;h>H&&r.set(M,T)}else Aa.error("No hostname found for certificate at",YE.certificate);Aa.trace("Adding TLS",T.name,"for",o.ports||"client","cert named",d.name,"hostnames",E,"quality",h,"best quality",f),h>f&&(i.defaultContext=n=T,f=h,o&&(o.defaultContext=T))}catch(_){Aa.error("Error applying TLS for",d.name,_)}o?.secureContextsListeners.forEach(d=>d()),c(n)}catch(f){l(f)}}a(u,"updateTLS"),lO.system.hdb_certificate.subscribe({listener:a(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(o,c){Aa.info("TLS requested for",o||"(no SNI)");let l=o;for(;;){let f=r.get(l);if(f)return Aa.debug("Found certificate for",o,f.certStart),f.updatedContext&&(f=f.updatedContext),c(null,f);if(s&&l){let d=l.indexOf(".",1);d<0?l="":l=l.slice(d)}else break}o?Aa.debug("No certificate found to match",o,"using the default certificate"):Aa.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):Aa.info("No default certificate found"),c(null,u)}a(i,"SNICallback")}a(YH,"createTLSSelector");async function WH(e){let t=ya.get(e);return!t&&e?await bn.readFile(ir.join(Jn.get(tl.ROOTPATH),Es.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(WH,"getPrivateKeyByName");async function zH(){ba();let e=[];for await(let t of Hr.search([]))e.push(t);return e}a(zH,"listCertificates");async function Jre(e){let t=hO(e,Js.object({name:Js.string().required(),certificate:Js.string().required(),is_authority:Js.boolean().required(),private_key:Js.string(),hosts:Js.array(),uses:Js.array()}));if(t)throw new Ra(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,o=new To(n),c=!1,l=!1,u;for(let[h,m]of ya)!s&&!c&&o.checkPrivateKey(xH(m))&&(c=!0,u=h),s&&s===m&&(l=!0,u=h);if(!i&&!s&&!c)throw new Ra("A suitable private key was not found for this certificate");let f;if(!r){try{f=QH(o)}catch(h){yt.error(h)}if(f==null)throw new Ra("Error extracting certificate common name, please provide a name parameter")}let d=Xre(r??f);s&&!c&&!l&&(await bn.writeFile(ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME,d+".pem"),s),ya.set(d,s));let _={name:r??f,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(_.private_key_name=u??d+".pem"),e.ciphers&&(_.ciphers=e.ciphers),await Gu(_),"Successfully added certificate: "+d}a(Jre,"addCertificate");function Xre(e){return e.replace(/[^a-z0-9.]/gi,"-")}a(Xre,"sanitizeName");async function Zre(e){let t=hO(e,Js.object({name:Js.string().required()}));if(t)throw new Ra(t.message);let{name:r}=e;ba();let n=await Hr.get(r);if(!n)throw new Ra(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Hr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(yt.info("Removing private key named",s),await bn.remove(ir.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME,s)))}return await Hr.delete(r),"Successfully removed "+r}a(Zre,"removeCertificate");function QH(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||AO(e)[0]}a(QH,"getPrimaryHostName");function AO(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]:[]}a(AO,"hostnamesFromCert");async function ene(e){if(e.bypass_auth!==!0)throw new Ra("Unauthorized","401");let t=hO(e,Js.object({name:Js.string().required()}));if(t)throw new Ra(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await PH()).privateKey;if(r===".jwtPublic")return(await PH()).publicKey;if(ya.get(r))return ya.get(e.name);throw new Ra("Key not found")}a(ene,"getKey")});var Ek={};Ue(Ek,{CONFIRMATION_STATUS_POSITION:()=>mk,NodeReplicationConnection:()=>$u,OPERATION_REQUEST:()=>OO,RECEIVED_TIME_POSITION:()=>sg,RECEIVED_VERSION_POSITION:()=>ng,RECEIVING_STATUS_POSITION:()=>ig,RECEIVING_STATUS_RECEIVING:()=>pk,RECEIVING_STATUS_WAITING:()=>NO,SENDING_TIME_POSITION:()=>Y_,createWebSocket:()=>ag,database_subscriptions:()=>wa,replicateOverWS:()=>W_,table_update_listeners:()=>IO});async function ag(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=et(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!yO){let l=(0,dk.createTLSSelector)("replication"),u={secureContexts:null};await l.initialize(u),yO=u.secureContexts}if(i=yO.get(s),i&&ce.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let o={};r&&(o.Authorization=r);let c={headers:o,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,_k.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(rg?.caCount!==Ao.size&&(rg=fk.createSecureContext({...i.options,ca:[...Ao,...i.options.availableCAs.values()]}),rg.caCount=Ao.size),c.secureContext=rg),new lk.WebSocket(e,"harperdb-replication-v1",c)}function W_(e,t,r){let n=t.port||t.securePort,s=rl.pid%1e3+"-"+uk.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3),i=0,o=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(o.buffer,0,1024),u=t.database,f=t.databaseSubscriptions||wa,d,_,h=!1,m=t.subscription;m?.then&&m.then(A=>m=A);let S=t.tables||u&&Xe()[u];if(!r){ce.error?.("No authorization provided"),cn(1008,"Unauthorized");return}let g=new Map,R=[],E=r.name;E&&t.connection&&(t.connection.nodeName=E);let T,N,M,H,X,W,$,se=6e4,z,fe=0,ue=0,Z=0,Ae=ck.default.get(x.REPLICATION_BLOBTIMEOUT)??12e4,me=new Map,ye=[],Ht=0,dt;if(t.url){let A=a(()=>{X&&ue===e._socket?.bytesRead&&Z===e._socket?.bytesWritten?e.terminate():(X=performance.now(),e.ping(),ue=e._socket?.bytesRead,Z=e._socket?.bytesWritten)},"send_ping");M=setInterval(A,ok).unref(),A()}else Ln();e._socket?.setMaxListeners(200);function Ln(){clearTimeout(H),ue=e._socket?.bytesRead,Z=e._socket?.bytesWritten,H=setTimeout(()=>{ue===e._socket?.bytesRead&&Z===e._socket?.bytesWritten&&(ce.warn?.(`Timeout waiting for ping from ${E}, terminating connection and reconnecting`),e.terminate())},ok*2).unref()}a(Ln,"resetPingTimer");function Vr(){if(!(!E||!u||!d))return _||(_=GE(d,u,E)),_}a(Vr,"getSharedStatus"),u&&jo(u);let Cr,Qd,oc=[],iA=[],oA,kt=[],jd=[],Jd=[],aA=150,Im=25,Xd=0,Ce=0,Zd=!1,Ji,Pr,Mn,ac;e.on("message",A=>{fe=performance.now();try{let y=A.dataView=new nl(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let B=(0,Ze.decode)(A),[w,D,G]=B;switch(w){case XH:{if(D){if(E){if(E!==D){ce.error?.(s,`Node name mismatch, expecting to connect to ${E}, but peer reported name as ${D}, disconnecting`),e.send((0,Ze.encode)([qu])),cn(1008,"Node name mismatch");return}}else if(E=D,t.connection?.tentativeNode){let oe=t.connection.tentativeNode;oe.name=E,t.connection.tentativeNode=null,So(E,oe)}if(t.connection&&(t.connection.nodeName=E),ce.debug?.(s,"received node name:",E,"db:",u),!u)try{jo(u=B[2]),u==="system"&&(Cr=Sa(t,(oe,V)=>{Qo(V)&&rf(V)}),e.on("close",()=>{Cr?.remove()}))}catch(oe){ce.warn?.(s,"Error setting database",oe),e.send((0,Ze.encode)([qu])),cn(1008,oe.message);return}zo()}break}case sk:{ce.debug?.(s,"Received table definitions for",D.map(oe=>oe.table));for(let oe of D){let V=B[2];oe.database=V;let J;Qo(V)&&(V==="system"?We[V]?.[oe.table]||(J=L(oe,We[V]?.[oe.table])):J=L(oe,We[V]?.[oe.table]),d||(d=J?.auditStore),S||(S=Xe()?.[V]))}break}case qu:cn();break;case OO:try{let oe=r?.replicates||r?.subscribers||r?.name;server.operation(D,{user:r},!oe).then(V=>{Array.isArray(V)&&(V={results:V}),V.requestId=D.requestId,e.send((0,Ze.encode)([XE,V]))},V=>{e.send((0,Ze.encode)([XE,{requestId:D.requestId,error:V instanceof Error?V.toString():V}]))})}catch(oe){e.send((0,Ze.encode)([XE,{requestId:D.requestId,error:oe instanceof Error?oe.toString():oe}]))}break;case XE:let{resolve:j,reject:Q}=g.get(D.requestId);D.error?Q(new Error(D.error)):j(D),g.delete(D.requestId);break;case RO:let F=B[3];S||(u?ce.error?.(s,"No tables found for",u):ce.error?.(s,"Database name never received"));let ve=S[F];ve=L({table:F,database:u,attributes:D.attributes,schemaDefined:D.schemaDefined},ve),oc[G]={name:F,decoder:new Ze.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:D.typedStructs,structures:D.structures}),getEntry(oe){return ve.primaryStore.getEntry(oe)},rootStore:ve.primaryStore.rootStore};break;case ZH:ac=d?TH(D,d):new Map,oA=B[2],ce.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${oA}`);break;case ek:let Ee=G;Jd[Ee]=D;break;case nk:Vr()[mk]=D,ce.trace?.(s,"received and broadcasting committed update",D),Vr().buffer.notify();break;case rk:T=D,m.send({type:"end_txn",localTime:T,remoteNodeIds:R}),Vr(),_[ng]=T,_[sg]=Date.now(),_[ig]=NO;break;case ZE:{let oe=B[1],{fileId:V,size:J,finished:de,error:pe}=oe,ae=me.get(V);ce.debug?.("Received blob",V,"has stream",!!ae,"connectedToBlob",!!ae?.connectedToBlob,"length",B[2].length,"finished",de),ae||(ae=new bO.PassThrough,ae.expectedSize=J,me.set(V,ae)),ae.lastChunk=Date.now();let Ie=B[2];Mt(Ie.byteLength,"bytes-received",`${E}.${u}`,"replication","blob");try{de?(pe?(ae.on("error",()=>{}),ae.destroy(new Error("Blob error: "+pe+" for record "+(ae.recordId??"unknown")+" from "+E))):ae.end(Ie),ae.connectedToBlob&&me.delete(V)):ae.write(Ie)}catch(He){ce.error?.(`Error receiving blob for ${ae.recordId} from ${E} and streaming to storage`,He),me.delete(V)}break}case tk:{let oe=D,V;try{let J=B[3],de=iA[G]||(iA[G]=S[B[4]]);if(!de)return ce.warn?.("Unknown table id trying to handle record request",G);let pe=de.primaryStore.getBinaryFast(Symbol.for("structures")),ae=pe?.length;if(ae>0&&ae!==Ce){Ce=ae;let He=(0,Ze.decode)(pe);e.send((0,Ze.encode)([RO,{typedStructs:He.typed,structures:He.named},G,de.tableName]))}let Ie=de.primaryStore.getBinaryFast(J);if(Ie){let He=de.primaryStore.decoder.decode(Ie,{valueAsBuffer:!0}),De=He.value;He[Nc]&Ur&&(De=Buffer.from(De),Pf(()=>de.primaryStore.decoder.decode(Ie),rt=>cc(rt,J),de.primaryStore.rootStore)),V=(0,Ze.encode)([JE,oe,{value:De,expiresAt:He.expiresAt,version:He.version,residencyId:He.residencyId,nodeId:He.nodeId,user:He.user}])}else V=(0,Ze.encode)([JE,oe])}catch(J){V=(0,Ze.encode)([JE,oe,{error:J.message}])}e.send(V);break}case JE:{let{resolve:oe,reject:V,tableId:J,key:de}=g.get(B[1]),pe=B[2];if(pe?.error)V(new Error(pe.error));else if(pe){let ae;fp(()=>{let Ie=oc[J].decoder.decode(pe.value);pe.value=Ie,pe.key=de,oe(pe)||ae&&setTimeout(()=>ae.forEach(lp),6e4).unref()},d?.rootStore,Ie=>{let He=ef(Ie,de);return ae||(ae=[]),ae.push(He),He})}else oe();g.delete(B[1]);break}case JH:{Mn=D;let oe,V,J=!1;if(m){if(u!==m.databaseName&&!m.then){ce.error?.("Subscription request for wrong database",u,m.databaseName);return}}else m=f.get(u);if(ce.debug?.(s,"received subscription request for",u,"at",Mn),!m){let Oe;m=new Promise(Rr=>{ce.debug?.("Waiting for subscription to database "+u),Oe=Rr}),m.ready=Oe,wa.set(u,m)}if(r.name)V=sr().subscribe(r.name),V.then(async Oe=>{oe=Oe;for await(let Rr of oe){let Nt=Rr.value;if(!(Nt?.replicates===!0||Nt?.replicates?.receives||Nt?.subscriptions?.some(yr=>(yr.database||yr.schema)===u&&yr.publish!==!1))){J=!0,e.send((0,Ze.encode)([qu])),cn(1008,`Unauthorized database subscription to ${u}`);return}}},Oe=>{ce.error?.(s,"Error subscribing to HDB nodes",Oe)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,Ze.encode)([qu])),cn(1008,`Unauthorized database subscription to ${u}`);return}if(Pr&&(ce.debug?.(s,"stopping previous subscription",u),Pr.emit("close")),Mn.length===0)return;let de=Mn[0],pe=a(Oe=>{if(Oe&&(de.replicateByDefault?!de.tables.includes(Oe.tableName):de.tables.includes(Oe.tableName)))return{table:Oe}},"tableToTableEntry"),ae={txnTime:0},Ie,He,De=1/0,rt,vn=a((Oe,Rr)=>{if(Oe.type==="end_txn"){ae.txnTime&&(o[i]!==66&&ce.error?.("Invalid encoding of message"),Xi(9),Xi(og),p(rt=Rr),di()),i=c,ae.txnTime=0;return}let Nt=Oe.nodeId,yr=Oe.tableId,At=He[yr];if(!At&&(At=He[yr]=pe(m.tableById[yr]),!At))return ce.debug?.("Not subscribed to table",yr);let ls=At.table,wt=ls.primaryStore,vs=wt.encoder;(Oe.extendedType&Ap||!vs.typedStructs)&&(vs._mergeStructures(vs.getStructures()),vs.typedStructs&&(vs.lastTypedStructuresLength=vs.typedStructs.length));let Kl=Ie[Nt];if(!(Kl&&Kl.startTime<Rr&&(!Kl.endTime||Kl.endTime>Rr)))return tg&&ce.trace?.(s,"skipping replication update",Oe.recordId,"to:",E,"from:",Nt,"subscribed:",Ie),hP();tg&&ce.trace?.(s,"sending replication update",Oe.recordId,"to:",E,"from:",Nt,"subscribed:",Ie);let cA=Oe.version,dc=Oe.residencyId,lA=tf(dc,ls),Pm;if(lA&&!lA.includes(E)){let Us=tf(Oe.previousResidencyId,ls);if(Us&&!Us.includes(E)&&(Oe.type==="put"||Oe.type==="patch")||ls.getResidencyById)return hP();let nf=Oe.recordId;ce.trace?.(s,"sending invalidation",nf,E,"from",Nt);let sf=0;dc&&(sf|=Cc),Oe.previousResidencyId&&(sf|=Pc);let fA,Dm=null;for(let mP in ls.indices){if(!Dm){if(fA=Oe.getValue(wt,!0),!fA)break;Dm={}}Dm[mP]=fA[mP]}Pm=wc(Oe.version,yr,nf,null,Nt,Oe.user,Oe.type==="put"||Oe.type==="patch"?"invalidate":Oe.type,vs.encode(Dm),sf,dc,Oe.previousResidencyId,Oe.expiresAt)}function hP(){return ce.trace?.(s,"skipping audit record",Oe.recordId),W||(W=setTimeout(()=>{W=null,(rt||0)+ik/2<De&&(tg&&ce.trace?.(s,"sending skipped sequence update",De),e.send((0,Ze.encode)([rk,De])))},ik).unref()),new Promise(setImmediate)}a(hP,"skipAuditRecord");let uA=vs.typedStructs,dA=vs.structures;if((uA?.length!=At.typed_length||dA?.length!=At.structure_length)&&(At.typed_length=uA?.length,At.structure_length=dA.length,ce.debug?.(s,"send table struct",At.typed_length,At.structure_length),At.sentName||(At.sentName=!0),e.send((0,Ze.encode)([RO,{typedStructs:uA,structures:dA,attributes:ls.attributes,schemaDefined:ls.schemaDefined},yr,At.table.tableName]))),dc&&!jd[dc]&&(e.send((0,Ze.encode)([ek,lA,dc])),jd[dc]=!0),ae.txnTime!==cA&&(ae.txnTime&&(tg&&ce.trace?.(s,"new txn time, sending queued txn",ae.txnTime),o[i]!==66&&ce.error?.("Invalid encoding of message"),di()),ae.txnTime=cA,i=c,p(cA)),Pm)Xi(Pm.length),K(Pm);else{let Us=Oe.encoded;Oe.extendedType&Ur&&Pf(()=>Oe.getValue(wt),sf=>cc(sf,Oe.recordId),wt.rootStore);let nf=Us[0]===66?8:0;Xi(Us.length-nf),K(Us,nf),ce.trace?.("wrote record",Oe.recordId,"length:",Us.length)}return e._socket.writableNeedDrain?new Promise(Us=>{ce.debug?.(`Waiting for remote node ${E} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Us)}):Ht>Im?new Promise(Us=>{dt=Us}):new Promise(setImmediate)},"sendAuditRecord"),di=a(()=>{c-i>8?(e.send(o.subarray(i,c)),ce.debug?.(s,"Sent message, size:",c-i),Mt(c-i,"bytes-sent",`${E}.${u}`,"replication","egress")):ce.debug?.(s,"skipping empty transaction")},"sendQueuedData");Pr=new wO.EventEmitter,Pr.once("close",()=>{J=!0,oe?.end()});for(let{startTime:Oe}of Mn)Oe<De&&(De=Oe);(V||Promise.resolve()).then(async()=>{m=await m,d=m.auditStore,He=m.tableById.map(pe),Ie=[];for(let{name:Rr,startTime:Nt,endTime:yr}of Mn){let At=FE(Rr,d);ce.debug?.("subscription to",Rr,"using local id",At,"starting",Nt),Ie[At]={startTime:Nt,endTime:yr}}rf(u),Cr||(Cr=sl(Rr=>{Rr.databaseName===u&&rf(u)}),Qd=z_(Rr=>{Rr===u&&(e.send((0,Ze.encode)([qu])),cn())}),e.on("close",()=>{Cr?.remove(),Qd?.remove()})),e.send((0,Ze.encode)([ZH,B_(m.auditStore),Mn.map(({name:Rr})=>Rr)]));let Oe=!0;do{isFinite(De)||(ce.warn?.("Invalid sequence id "+De),cn(1008,"Invalid sequence id"+De));let Rr;if(Oe&&!J&&(Oe=!1,De===0)){let Nt=De,yr=cg(d);for(let At in S){if(!pe(At))continue;let ls=S[At];ce.warn?.(`Fully copying ${At} table to ${E}`);for(let wt of ls.primaryStore.getRange({snapshot:!1,versions:!0})){if(J)return;if(wt.localTime>=De){ce.trace?.(s,"Copying record from",u,At,wt.key,wt.localTime),Nt=Math.max(wt.localTime,Nt),Vr()[Y_]=1;let vs=wc(wt.version,ls.tableId,wt.key,null,yr,null,"put",Pf(()=>ls.primaryStore.encoder.encode(wt.value),Kl=>cc(Kl,wt.key)),wt.metadataFlags&-256,wt.residencyId,null,wt.expiresAt);await vn({recordId:wt.key,tableId:ls.tableId,type:"put",getValue(){return wt.value},encoded:vs,version:wt.version,residencyId:wt.residencyId,nodeId:yr,extendedType:wt.metadataFlags},wt.localTime)}}}c-i>8&&vn({type:"end_txn"},De),Vr()[Y_]=0,De=Nt}for(let{key:Nt,value:yr}of d.getRange({start:De||1,exclusiveStart:!0,snapshot:!1})){if(J)return;let At=St(yr);ce.debug?.("sending audit record",new Date(Nt)),Vr()[Y_]=Nt,De=Nt,await vn(At,Nt),Pr.startTime=Nt}c-i>8&&vn({type:"end_txn"},De),Vr()[Y_]=0,await gk(d)}while(!J)}).catch(Oe=>{ce.error?.(s,"Error handling subscription to node",Oe),cn(1008,"Error handling subscription to node")});break}}return}y.position=8;let I=!0,b,U;do{Vr();let B=y.readInt();if(B===9&&y.getUint8(y.position)==og){y.position++,T=U=y.readFloat64(),_[ng]=T,_[sg]=Date.now(),_[ig]=NO,ce.trace?.("received remote sequence update",T,u);break}let w=y.position,D=St(A,w,w+B),G=oc[D.tableId];G||ce.error?.(`No table found with an id of ${D.tableId}`);let j;D.residencyId&&(j=Jd[D.residencyId],ce.trace?.(s,"received residency list",j,D.type,D.recordId));try{let Q=D.recordId;fp(()=>{b={table:G.name,id:Q,type:D.type,nodeId:ac.get(D.nodeId),residencyList:j,timestamp:D.version,value:D.getValue(G),user:D.user,beginTxn:I,expiresAt:D.expiresAt}},d?.rootStore,F=>ef(F,Q))}catch(Q){throw Q.message+="typed structures for current decoder"+JSON.stringify(G.decoder.typedStructs),Q}I=!1,ce.trace?.(s,"received replication message",D.type,"id",b.id,"version",new Date(D.version),"nodeId",b.nodeId),_[ng]=D.version,_[sg]=Date.now(),_[ig]=pk,m.send(b),y.position=w+B}while(y.position<A.byteLength);Xd++,Mt(A.byteLength,"bytes-received",`${E}.${u}.${b?.table||"unknown_table"}`,"replication","ingest"),Xd>aA&&!Zd&&(Zd=!0,e.pause(),ce.debug?.(`Commit backlog causing replication back-pressure, requesting that ${E} pause replication`)),m.send({type:"end_txn",localTime:T,remoteNodeIds:R,async onCommit(){if(b){let B=Date.now()-b.timestamp;Mt(B,"replication-latency",E+"."+u+"."+b.table,b.type,"ingest")}Xd--,Zd&&(Zd=!1,e.resume(),ce.debug?.(`Replication resuming ${E}`)),ye.length>0&&await Promise.all(ye),ce.trace?.("All blobs finished"),!N&&U&&(ce.trace?.(s,"queuing confirmation of a commit at",U),setTimeout(()=>{e.send((0,Ze.encode)([nk,N])),ce.trace?.(s,"sent confirmation of a commit at",N),N=null},rne)),N=U,ce.debug?.("last sequence committed",new Date(U),u)}})}catch(y){ce.error?.(s,"Error handling incoming replication message",y)}}),e.on("ping",Ln),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-X,t.isSubscriptionConnection&&Zc({name:E,database:u,url:t.url,latency:t.connection.latency})),X=null}),e.on("close",(A,y)=>{clearInterval(M),clearTimeout(H),clearInterval($),Pr&&Pr.emit("close"),Ji&&Ji.end();for(let[I,{reject:b}]of g)b(new Error(`Connection closed ${y?.toString()} ${A}`));ce.debug?.(s,"closed",A,y?.toString())});function cn(A,y){e.isFinished=!0,e.close(A,y),t.connection?.emit("finished")}a(cn,"close");let Dr=new Set;async function cc(A,y){let I=up(A);if(Dr.has(I)){ce.debug?.("Blob already being sent",I);return}Dr.add(I);try{let b;Ht++;for await(let U of A.stream())b&&(ce.debug?.("Sending blob chunk",I,"length",b.length),e.send((0,Ze.encode)([ZE,{fileId:I,size:A.size},b]))),b=U,e._socket.writableNeedDrain&&(ce.debug?.("draining",I),await new Promise(B=>e._socket.once("drain",B)),ce.debug?.("drained",I)),Mt(U.length,"bytes-sent",`${E}.${u}`,"replication","blob");ce.debug?.("Sending final blob chunk",I,"length",b.length),e.send((0,Ze.encode)([ZE,{fileId:I,size:A.size,finished:!0},b]))}catch(b){ce.warn?.("Error sending blob",b,"blob id",I,"for record",y),e.send((0,Ze.encode)([ZE,{fileId:I,finished:!0,error:b.toString()},Buffer.alloc(0)]))}finally{Dr.delete(I),Ht--,Ht<Im&&dt?.()}}a(cc,"sendBlobs");function ef(A,y){let I=up(A),b=me.get(I);ce.debug?.("Received transaction for record",y,"with blob",I,"has stream",!!b,"ended",!!b?.writableEnded),b?b.writableEnded&&me.delete(I):(b=new bO.PassThrough,me.set(I,b)),b.connectedToBlob=!0,b.lastChunk=Date.now(),b.recordId=y,A.size===void 0&&b.expectedSize&&(A.size=b.expectedSize);let U=b.blob??createBlob(b,A);b.blob=U;let B=ro(()=>Cf(U).saving,m.auditStore?.rootStore);return B&&(B.blobId=I,ye.push(B),B.finally(()=>{ce.debug?.(`Finished receiving blob stream ${I}`),ye.splice(ye.indexOf(B),1)})),U}a(ef,"receiveBlobs");function zo(){if(h||(h=!0,t.connection?.on("subscriptions-updated",zo)),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let A=new Map;d||(d=m?.auditStore);try{for(let b of m?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let U of b.value.nodes||[])U.lastTxnTime>(A.get(U.id)??0)&&A.set(U.id,U.lastTxnTime)}catch(b){if(!b.message.includes("Can not re"))throw b}let y=t.connection?.nodeSubscriptions?.[0];R=[];let I=t.connection?.nodeSubscriptions?.map((b,U)=>{let B=[],{replicateByDefault:w}=b;if(b.subscriptions){for(let Q of b.subscriptions)if(Q.subscribe&&(Q.schema||Q.database)===u){let F=Q.table;S?.[F]?.replicate!==!1&&B.push(F)}w=!1}else for(let Q in S)(w?S[Q].replicate===!1:S[Q].replicate)&&B.push(Q);let D=d&&FE(b.name,d),G=m?.dbisDB?.get([Symbol.for("seq"),D])??1,j=Math.max(G?.seqId??1,(typeof b.start_time=="string"?new Date(b.start_time).getTime():b.start_time)??1);if(ce.debug?.("Starting time recorded in db",b.name,D,u,G?.seqId,"start time:",j,new Date(j)),y!==b){let Q=d&&FE(y.name,d),F=m?.dbisDB?.get([Symbol.for("seq"),Q])??1;for(let ve of F?.nodes||[])ve.name===b.name&&(j=ve.seqId,ce.debug?.("Using sequence id from proxy node",y.name,j))}if(D===void 0?ce.warn("Starting subscription request from node",b,"but no node id found"):R.push(D),A.get(D)>j&&(j=A.get(D),ce.debug?.("Updating start time from more recent txn recorded",y.name,j)),j===1&&eg)try{new URL(eg).hostname===b.name&&E===b.name?(ce.warn?.(`Requesting full copy of database ${u} from ${eg}`),j=0):j=Date.now()-6e4}catch(Q){ce.error?.("Error parsing leader URL",eg,Q)}return ce.trace?.(s,"defining subscription request",b.name,u,new Date(j)),{name:b.name,replicateByDefault:w,tables:B,startTime:j,endTime:b.end_time}});if(I)if(ce.debug?.(s,"sending subscription request",I,m?.dbisDB?.path),clearTimeout(z),I.length>0)e.send((0,Ze.encode)([JH,I]));else{let b=a(()=>{let U=performance.now();z=setTimeout(()=>{fe<=U?cn(1008,"Connection has no subscriptions and is no longer used"):b()},se).unref()},"schedule_close");b()}}a(zo,"sendSubscriptionRequestUpdate");function tf(A,y){if(!A)return;let I=kt[A];return I||(I=y.getResidencyRecord(A),kt[A]=I),I}a(tf,"getResidence");function Qo(A){return!(Na&&Na!="*"&&!Na[A]&&!Na.includes?.(A)&&!Na.some?.(y=>y.name===A))}a(Qo,"checkDatabaseAccess");function jo(A){if(m=m||f.get(A),!Qo(A))throw new Error(`Access to database "${A}" is not permitted`);m||ce.warn?.(`No database named "${A}" was declared and registered`),d=m?.auditStore,S||(S=Xe()?.[A]);let y=et();if(y===E)throw y?new Error("Should not connect to self",y):new Error("Node name not defined");return Cm(y,A),!0}a(jo,"setDatabase");function Cm(A,y){let I=Xe()?.[y],b=[];for(let U in I){let B=I[U];b.push({table:U,schemaDefined:B.schemaDefined,attributes:B.attributes.map(w=>({name:w.name,type:w.type,isPrimaryKey:w.isPrimaryKey}))})}ce.trace?.("Sending database info for node",A,"database name",y),e.send((0,Ze.encode)([XH,A,y,b]))}a(Cm,"sendNodeDBName");function rf(A){let y=Xe()?.[A],I=[];for(let b in y){if(Mn&&!Mn.some(B=>B.replicateByDefault?!B.tables.includes(b):B.tables.includes(b)))continue;let U=y[b];I.push({table:b,schemaDefined:U.schemaDefined,attributes:U.attributes.map(B=>({name:B.name,type:B.type,isPrimaryKey:B.isPrimaryKey}))})}e.send((0,Ze.encode)([sk,I,A]))}a(rf,"sendDBSchema"),$=setInterval(()=>{for(let[A,y]of me)y.lastChunk+Ae<Date.now()&&(ce.warn?.(`Timeout waiting for blob stream to finish ${A} for record ${y.recordId??"unknown"} from ${E}`),me.delete(A),y.end())},Ae).unref();let lc=1,uc=[];return{end(){Ji&&Ji.end(),Pr&&Pr.emit("close")},getRecord(A){let y=lc++;return new Promise((I,b)=>{let U=[tk,y,A.table.tableId,A.id];uc[A.table.tableId]||(U.push(A.table.tableName),uc[A.table.tableId]=!0),e.send((0,Ze.encode)(U)),fe=performance.now(),g.set(y,{tableId:A.table.tableId,key:A.id,resolve(B){let{table:w,entry:D}=A;if(I(B),B)return w._recordRelocate(D,B)},reject:b})})},sendOperation(A){let y=lc++;return A.requestId=y,e.send((0,Ze.encode)([OO,A])),new Promise((I,b)=>{g.set(y,{resolve:I,reject:b})})}};function Xi(A){O(5),A<128?o[c++]=A:A<16384?(l.setUint16(c,A|32768),c+=2):A<1056964608?(l.setUint32(c,A|3221225472),c+=4):(o[c]=255,l.setUint32(c+1,A),c+=5)}function K(A,y=0,I=A.length){let b=I-y;O(b),A.copy(o,c,y,I),c+=b}function p(A){O(8),l.setFloat64(c,A),c+=8}function O(A){if(A+16>o.length-c){let y=Buffer.allocUnsafeSlow(c+A-i+65536>>10<<11);o.copy(y,0,i,c),c=c-i,i=0,o=y,l=new DataView(o.buffer,0,o.length)}}function L(A,y){let I=A.database??"data";if(I!=="data"&&!We[I]){ce.warn?.("Database not found",A.database);return}y||(y={});let b=y.schemaDefined,U=!1,B=A.schemaDefined,w=y.attributes||[];for(let D=0;D<A.attributes?.length;D++){let G=A.attributes[D],j=w.find(Q=>Q.name===G.name);(!j||j.type!==G.type)&&(b?ce.error?.(`Schema for '${u}.${A.table}' is defined locally, but attribute '${G.name}: ${G.type}' from '${E}' does not match local attribute ${j?"'"+j.name+": "+j.type+"'":"which does not exist"}`):(U=!0,B||(G.indexed=!0),j?w[w.indexOf(j)]=G:w.push(G)))}return U?(ce.debug?.("(Re)creating",A),ft({table:A.table,database:A.database,schemaDefined:A.schemaDefined,attributes:w,...y})):y}}var ck,Ze,lk,uk,ce,wO,dk,fk,rl,_k,bO,hk,JH,XH,ZH,qu,ek,RO,tk,JE,OO,XE,rk,nk,sk,ZE,mk,ng,sg,Y_,ig,NO,pk,tne,eg,IO,wa,tg,ik,rne,ok,yO,rg,ak,$u,CO=Re(()=>{xe();Ti();iO();PO();ps();ck=v(le());k();lu();Ze=require("msgpackr"),lk=require("ws"),uk=require("worker_threads"),ce=v(ks());$_();wO=require("events"),dk=v(Zs()),fk=v(require("node:tls"));Xc();rl=v(require("node:process")),_k=require("node:net");Li();pn();bO=require("node:stream"),hk=v(require("minimist")),JH=129,XH=140,ZH=141,qu=142,ek=130,RO=132,tk=133,JE=134,OO=136,XE=137,rk=143,nk=144,sk=145,ZE=146,mk=0,ng=1,sg=2,Y_=3,ig=4,NO=0,pk=1,tne=(0,hk.default)(rl.argv),eg=tne.HDB_LEADER_URL??rl.env.HDB_LEADER_URL,IO=new Map,wa=new Map,tg=!0,ik=300,rne=2,ok=3e4;a(ag,"createWebSocket");ak=500,$u=class extends wO.EventEmitter{constructor(r,n,s,i,o){super();this.url=r;this.subscription=n;this.databaseName=s;this.nodeName=i;this.authorization=o;this.nodeName=this.nodeName??js(r)}static{a(this,"NodeReplicationConnection")}socket;startTime;retryTime=ak;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await ag(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;ce.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${rl.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ce[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=ak,this.nodeSubscriptions&&Zc({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,n=W_(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(n)}),this.socket.on("error",s=>{s.code==="SELF_SIGNED_CERT_IN_CHAIN"?(ce.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),s.isHandled=!0):s.code!=="ECONNREFUSED"&&(s.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?ce.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`):ce.error?.(`Error in connection to ${this.url} due to ${s.message}`)),this.sessionReject(s)}),this.socket.on("close",(s,i)=>{if(this.isConnected&&(this.nodeSubscriptions&&ku({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,n?.end(),this.emit("finished");return}if(++this.retries%20===1){let o=i?.toString();ce.warn?.(`${n?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${o?'"'+o+'" ':""}(code: ${s})`)}n=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((r,n)=>{this.sessionResolve=r,this.sessionReject=n})}subscribe(r,n){this.nodeSubscriptions=r,this.replicateTablesByDefault=n,this.emit("subscriptions-updated",r)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(r){return this.session.then(n=>n.getRecord(r))}};a(W_,"replicateOverWS")});var Oa={};Ue(Oa,{clearThisNodeName:()=>dne,disableReplication:()=>one,enabled_databases:()=>Na,forEachReplicatedDatabase:()=>Sa,getThisNodeId:()=>cg,getThisNodeName:()=>et,getThisNodeUrl:()=>Ta,hostnameToUrl:()=>_g,lastTimeInAuditStore:()=>H_,monitorNodeCAs:()=>Nk,replicateOperation:()=>_ne,replication_certificate_authorities:()=>Ao,sendOperationToNode:()=>Q_,servers:()=>sne,setReplicator:()=>Ik,start:()=>ine,startOnMainThread:()=>cO,subscribeToNode:()=>q_,unsubscribeFromNode:()=>VE,urlToNodeName:()=>js});function ine(e){if(!e.port&&!e.securePort&&(e.port=gs.default.get(x.OPERATIONSAPI_NETWORK_PORT),e.securePort=gs.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),!et())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of F_(e))t.set(js(s.url),s);ane(e),e={mtls:!0,usageType:"replication",maxPayload:10*1024*1024*1024,...e};let r=Ye.ws(async(s,i,o,c)=>{if(i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,o);await o,s._socket.unref(),W_(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&or.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Ye.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){!s.authorized&&s._nodeRequest.socket.authorizationError&&or.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 o=sr().primaryStore;if(s.authorized&&s.peerCertificate.subject){let c=s.peerCertificate.subject,l=c&&(o.get(c.CN)||t.get(c.CN));if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){or.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else or.warn(`No node found for certificate common name ${c.CN}, available nodes are ${Array.from(o.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=o.get(s.ip)||t.get(s.ip);c?s.user=c:or.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...o.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=a(()=>{let o=new Set(s.secureContexts.values());s.defaultContext&&o.add(s.defaultContext);for(let c of o)try{let l=Array.from(Ao);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=fg.createSecureContext(u)}catch(l){or.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),gs.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1&&i()}Nk(()=>{for(let s of n)s()})}function Nk(e){let t=0;Bu(r=>{r?.ca&&(Ao.add(r.ca),Ao.size!==t&&(t=Ao.size,e?.()))})}function one(e=!0){Ok=e}function ane(e){Ok||(Xe(),Na=e.databases,Sa(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||wa;for(let[s,i]of ug){let o=i.get(r);o&&(o.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];Ik(r,s,e),IO.get(s)?.forEach(i=>i(s))}}))}function Ik(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 wk extends Kr{static{a(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||wa,o=i.get(e),c=o?.tableById||[];c[t.tableId]=t;let l=o?.ready;if(or.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new xn,i.set(e,o),o.tableById=c,o.auditStore=t.auditStore,o.dbisDB=t.dbisDB,o.databaseName=e,l&&l(o),o;this.subscription=o}static subscribeOnThisThread(i,o){return!0}static async load(i){if(i){let o=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),o]);if(c){let l,u=new Set;do{let f;for(let _ of c){if(_===Ye.hostname)continue;let h=lne(_,wk.subscription,e);h?.isConnected&&!u.has(h)&&(!f||h.latency<f.latency)&&(f=h)}if(!f)throw l||new yk.ServerError("No connection to any other nodes are available",502);let d={requestId:nne++,table:t,entry:i,id:i.key};u.add(f);try{return await f.getRecord(d)}catch(_){if(f.isConnected)throw _;or.warn("Error in load from node",dg,_),l||(l=_)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function cne(e,t,r,n,s){let i=ug.get(e);i||(i=new Map,ug.set(e,i));let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new $u(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function lne(e,t,r){let n=Sk.get(e);n||(n=new Map,Sk.set(e,n));let s=n.get(r);if(s)return s;let i=sr().primaryStore.get(e);return i?.url&&(s=new $u(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function Q_(e,t,r){r||(r={}),r.serverName=e.name;let n=await ag(e.url,r),s=W_(n,{},{});return new Promise((i,o)=>{n.on("open",()=>{i(s.sendOperation(t))}),n.on("error",c=>{o(c)}),n.on("close",c=>{or.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function q_(e){try{bk.isMainThread&&or.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=wa.get(e.database);if(!t){let n;t=new Promise(s=>{or.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,wa.set(e.database,t)}let r=cne(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=>k_(n,e.database)),e.replicateByDefault)}catch(t){or.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function VE({name:e,url:t,database:r}){or.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(sr().primaryStore.getRange({})));let n=ug.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function une(){if(DO!==void 0)return DO;let e=gs.default.get(x.OPERATIONSAPI_TLS_CERTIFICATE)||gs.default.get(x.TLS_CERTIFICATE);if(e)return DO=new Ak.X509Certificate((0,Rk.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function et(){return dg||(dg=gs.default.get("replication_hostname")??js(gs.default.get("replication_url"))??une()??Tk("operationsapi_network_secureport")??Tk("operationsapi_network_port")??"127.0.0.1")}function dne(){dg=void 0}function Tk(e){let t=gs.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function lg(e){let t=gs.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[[\]]/g,""):+t}function cg(e){return B_(e)?.[et()]}function Ta(){let e=gs.default.get("replication_url");return e||_g(et())}function _g(e){let t=lg("replication_port");if(t)return`ws://${e}:${t}`;if(t=lg("replication_secureport"),t)return`wss://${e}:${t}`;if(t=lg("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=lg("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function js(e){if(e)return new URL(e).hostname}function Sa(e,t){for(let n of Object.getOwnPropertyNames(We))r(n);return z_(n=>{r(n)}),sl((n,s)=>{r(n.databaseName)});function r(n){let s=We[n];or.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):fne(n)&&t(s,n,!1)}a(r,"forDatabase")}function fne(e){let t=We[e];for(let r in t)if(t[r].replicate)return!0}function H_(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function _ne(e){let t={message:""};if(e.replicated){e.replicated=!1,or.trace?.("Replicating operation",e.operation,"to nodes",Ye.nodes.map(n=>n.name));let r=await Promise.allSettled(Ye.nodes.map(n=>Q_(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Ye.nodes[s]?.name,i})}return t}var gs,or,Ak,Rk,fg,yk,bk,Ok,nne,sne,Ao,Na,ug,Sk,DO,dg,ps=Re(()=>{xe();na();zl();CO();Mr();gs=v(le()),or=v(ee()),Ak=require("crypto"),Rk=require("fs");$_();Xc();k();iO();fg=v(require("node:tls")),yk=v(he()),bk=require("worker_threads"),nne=1,sne=[],Ao=gs.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1?new Set(fg.rootCertificates):new Set;a(ine,"start");a(Nk,"monitorNodeCAs");a(one,"disableReplication");a(ane,"assignReplicationSource");a(Ik,"setReplicator");ug=new Map;a(cne,"getSubscriptionConnection");Sk=new Map;a(lne,"getRetrievalConnectionByName");a(Q_,"sendOperationToNode");a(q_,"subscribeToNode");a(VE,"unsubscribeFromNode");a(une,"getCommonNameFromCert");a(et,"getThisNodeName");a(dne,"clearThisNodeName");Object.defineProperty(Ye,"hostname",{get(){return et()}});a(Tk,"getHostFromListeningPort");a(lg,"getPortFromListeningPort");a(cg,"getThisNodeId");Ye.replication={getThisNodeId:cg,exportIdMapping:B_};a(Ta,"getThisNodeUrl");a(_g,"hostnameToUrl");a(js,"urlToNodeName");a(Sa,"forEachReplicatedDatabase");a(fne,"hasExplicitlyReplicatedTable");a(H_,"lastTimeInAuditStore");a(_ne,"replicateOperation")});var J_=C((DIe,Mk)=>{"use strict";var Vu=gH(),{validateBySchema:j_}=ot(),{common_validators:Ku,schema_regex:LO}=bi(),ar=require("joi"),hne=ee(),mne=require("uuid").v4,pg=mo(),Yu=(k(),P(q)),pne=require("util"),Ia=qn(),{handleHDBError:Ro,hdb_errors:Ene,ClientError:il}=he(),{HDB_ERROR_MSGS:hg,HTTP_STATUS_CODES:yo}=Ene,{SchemaEventMsg:Eg}=Ys(),Ck=Er(),{getDatabases:gne}=(xe(),P(ct)),{transformReq:Wu}=ie(),{replicateOperation:Pk}=(ps(),P(Oa)),{cleanupOrphans:PIe}=(pn(),P(au)),mg=ar.string().min(1).max(Ku.schema_length.maximum).pattern(LO).messages({"string.pattern.base":"{:#label} "+Ku.schema_format.message}),Sne=ar.string().min(1).max(Ku.schema_length.maximum).pattern(LO).messages({"string.pattern.base":"{:#label} "+Ku.schema_format.message}).required(),Tne=ar.string().min(1).max(Ku.schema_length.maximum).pattern(LO).messages({"string.pattern.base":"{:#label} "+Ku.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();Mk.exports={createSchema:Ane,createSchemaStructure:Dk,createTable:Rne,createTableStructure:Lk,createAttribute:wne,dropSchema:yne,dropTable:bne,dropAttribute:One,getBackup:Ine,cleanupOrphanBlobs:Cne};async function Ane(e){let t=await Dk(e);return pg.signalSchemaChange(new Eg(process.pid,e.operation,e.schema)),t}a(Ane,"createSchema");async function Dk(e){let t=j_(e,ar.object({database:mg,schema:mg}));if(t)throw new il(t.message);if(Wu(e),!await Vu.checkSchemaExists(e.schema))throw Ro(new Error,hg.SCHEMA_EXISTS_ERR(e.schema),yo.BAD_REQUEST,Yu.LOG_LEVELS.ERROR,hg.SCHEMA_EXISTS_ERR(e.schema),!0);return await Ia.createSchema(e),`database '${e.schema}' successfully created`}a(Dk,"createSchemaStructure");async function Rne(e){return Wu(e),e.hash_attribute=e.primary_key??e.hash_attribute,await Lk(e)}a(Rne,"createTable");async function Lk(e){let t=j_(e,ar.object({database:mg,schema:mg,table:Sne,residence:ar.array().items(ar.string().min(1)).optional(),hash_attribute:Tne}));if(t)throw new il(t.message);if(!await Vu.checkSchemaTableExists(e.schema,e.table))throw Ro(new Error,hg.TABLE_EXISTS_ERR(e.schema,e.table),yo.BAD_REQUEST,Yu.LOG_LEVELS.ERROR,hg.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:mne(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await Ia.createTable(n,e);else throw Ro(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",yo.BAD_REQUEST);else await Ia.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}a(Lk,"createTableStructure");async function yne(e){let t=j_(e,ar.object({database:ar.string(),schema:ar.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new il(t.message);Wu(e);let r=await Vu.checkSchemaExists(e.schema);if(r)throw Ro(new Error,r,yo.NOT_FOUND,Yu.LOG_LEVELS.ERROR,r,!0);let n=await Vu.schema_describe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await Ia.dropSchema(e),pg.signalSchemaChange(new Eg(process.pid,e.operation,e.schema)),await Ck.purgeSchemaTableStreams(e.schema,s);let i=await Pk(e);return i.message=`successfully deleted '${e.schema}'`,i}a(yne,"dropSchema");async function bne(e){let t=j_(e,ar.object({database:ar.string(),schema:ar.string(),table:ar.string().required()}));if(t)throw new il(t.message);Wu(e);let r=await Vu.checkSchemaTableExists(e.schema,e.table);if(r)throw Ro(new Error,r,yo.NOT_FOUND,Yu.LOG_LEVELS.ERROR,r,!0);await Ia.dropTable(e),await Ck.purgeTableStream(e.schema,e.table);let n=await Pk(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(bne,"dropTable");async function One(e){let t=j_(e,ar.object({database:ar.string(),schema:ar.string(),table:ar.string().required(),attribute:ar.string().required()}));if(t)throw new il(t.message);Wu(e);let r=await Vu.checkSchemaTableExists(e.schema,e.table);if(r)throw Ro(new Error,r,yo.NOT_FOUND,Yu.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Ro(new Error,"You cannot drop a hash attribute",yo.BAD_REQUEST,void 0,void 0,!0);if(Yu.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Ro(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,yo.BAD_REQUEST,void 0,void 0,!0);try{return await Ia.dropAttribute(e),Nne(e),pg.signalSchemaChange(new Eg(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw hne.error(`Got an error deleting attribute ${pne.inspect(e)}.`),n}}a(One,"dropAttribute");function Nne(e){let t=Object.values(global.hdb_schema[e.schema][e.table].attributes);for(let r=0;r<t.length;r++)t[r].attribute===e.attribute&&global.hdb_schema[e.schema][e.table].attributes.splice(r,1)}a(Nne,"dropAttributeFromGlobal");async function wne(e){Wu(e);let t=gne()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Ro(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,yo.BAD_REQUEST,void 0,void 0,!0);return await Ia.createAttribute(e),pg.signalSchemaChange(new Eg(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(wne,"createAttribute");function Ine(e){return Ia.getBackup(e)}a(Ine,"getBackup");function Cne(e){if(!e.database)throw new il('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new il(`Unknown database '${e.database}'`);let{cleanupOrphans:r}=(pn(),P(au));return r(databases[e.database],e.database),{message:"Orphaned blobs cleanup started, check logs for progress"}}a(Cne,"cleanupOrphanBlobs")});var Uk=C((MIe,vk)=>{"use strict";var{OPERATIONS_ENUM:Pne}=(k(),P(q)),MO=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Pne.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};vk.exports=MO});var vO=C((xIe,Fk)=>{"use strict";var Dne=qn(),UIe=Uk(),gg=ie(),Sg=(k(),P(q)),Lne=le(),{handleHDBError:xk,hdb_errors:Mne}=he(),{HDB_ERROR_MSGS:Bk,HTTP_STATUS_CODES:Hk}=Mne,vne=Object.values(Sg.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),kk="To use this operation audit log must be enabled in harperdb-config.yaml";Fk.exports=Une;async function Une(e){if(gg.isEmpty(e.schema))throw new Error(Bk.SCHEMA_REQUIRED_ERR);if(gg.isEmpty(e.table))throw new Error(Bk.TABLE_REQUIRED_ERR);if(!Lne.get(Sg.CONFIG_PARAMS.LOGGING_AUDITLOG))throw xk(new Error,kk,Hk.BAD_REQUEST,Sg.LOG_LEVELS.ERROR,kk,!0);let t=gg.checkSchemaTableExist(e.schema,e.table);if(t)throw xk(new Error,t,Hk.NOT_FOUND,Sg.LOG_LEVELS.ERROR,t,!0);if(!gg.isEmpty(e.search_type)&&vne.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await Dne.readAuditLog(e)}a(Une,"readAuditLog")});var qk=C((HIe,Gk)=>{"use strict";var{OPERATIONS_ENUM:xne}=(k(),P(q)),UO=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=xne.GET_BACKUP,this.schema=t,this.table=r}};Gk.exports=UO});var Kk=C((qIe,Vk)=>{"use strict";var Bne=qn(),FIe=qk(),xO=ie(),Hne=(k(),P(q)),GIe=le(),{handleHDBError:kne,hdb_errors:Fne}=he(),{HDB_ERROR_MSGS:$k,HTTP_STATUS_CODES:Gne}=Fne;Vk.exports=qne;async function qne(e){if(xO.isEmpty(e.schema))throw new Error($k.SCHEMA_REQUIRED_ERR);if(xO.isEmpty(e.table))throw new Error($k.TABLE_REQUIRED_ERR);let t=xO.checkSchemaTableExist(e.schema,e.table);if(t)throw kne(new Error,t,Gne.NOT_FOUND,Hne.LOG_LEVELS.ERROR,t,!0);return await Bne.getBackup(read_audit_log_object)}a(qne,"getBackup")});var Qk=C((VIe,zk)=>{"use strict";var $ne=le(),Ca=require("joi"),Vne=ot(),Yk=require("moment"),Kne=require("fs-extra"),BO=require("path"),Yne=require("lodash"),X_=(k(),P(q)),{LOG_LEVELS:ol}=(k(),P(q)),Wne="YYYY-MM-DD hh:mm:ss",zne=BO.resolve(__dirname,"../logs");zk.exports=function(e){return Vne.validateBySchema(e,Qne)};var Qne=Ca.object({from:Ca.custom(Wk),until:Ca.custom(Wk),level:Ca.valid(ol.NOTIFY,ol.FATAL,ol.ERROR,ol.WARN,ol.INFO,ol.DEBUG,ol.TRACE),order:Ca.valid("asc","desc"),limit:Ca.number().min(1),start:Ca.number().min(0),log_name:Ca.custom(jne)});function Wk(e,t){if(Yk(e,Yk.ISO_8601).format(Wne)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(Wk,"validateDatetime");function jne(e,t){if(Yne.invert(X_.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=$ne.get(X_.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?X_.LOG_NAMES.HDB:e,i=s===X_.LOG_NAMES.INSTALL?BO.join(zne,X_.LOG_NAMES.INSTALL):BO.join(n,s);return Kne.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(jne,"validateReadLogPath")});var kO=C((YIe,Jk)=>{"use strict";var Tg=(k(),P(q)),Jne=ee(),Xne=le(),Zne=Qk(),HO=require("path"),jk=require("fs-extra"),{once:ese}=require("events"),{handleHDBError:tse,hdb_errors:rse}=he(),{PACKAGE_ROOT:nse}=Et(),sse=HO.join(nse,"logs"),ise=1e3,ose=200;Jk.exports=ase;async function ase(e){let t=Zne(e);if(t)throw tse(t,t.message,rse.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=Xne.get(Tg.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?Tg.LOG_NAMES.HDB:e.log_name,s=n===Tg.LOG_NAMES.INSTALL?HO.join(sse,Tg.LOG_NAMES.INSTALL):HO.join(r,n),i=e.level!==void 0,o=i?e.level:void 0,c=e.from!==void 0,l=c?new Date(e.from):void 0,u=e.until!==void 0,f=u?new Date(e.until):void 0,d=e.limit===void 0?ise:e.limit,_=e.order===void 0?void 0:e.order,h=e.start===void 0?0:e.start,m=h+d,S=0;_==="desc"&&!l&&!f&&(S=Math.max(jk.statSync(s).size-(m+5)*ose,0));let g=jk.createReadStream(s,{start:S});g.on("error",H=>{Jne.error(H)});let R=0,E=[],T="",N;g.on("data",H=>{let X=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;H=T+H;let W=0,$;for(;($=X.exec(H))&&!g.destroyed;){N&&(N.message=H.slice(W,$.index),M(N));let[se,z,fe]=$,ue=fe.split("] ["),Z=ue[0],Ae=ue[1];ue.splice(0,2),N={timestamp:z,thread:Z,level:Ae,tags:ue,message:""},W=$.index+se.length}T=H.slice(W)}),g.on("end",H=>{g.destroyed||N&&(N.message=T.trim(),M(N))}),g.resume();function M(H){let X,W,$;switch(!0){case(i&&c&&u):X=new Date(H.timestamp),W=new Date(l),$=new Date(f),H.level===o&&X>=W&&X<=$&&R<h?R++:H.level===o&&X>=W&&X<=$&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case(i&&c):X=new Date(H.timestamp),W=new Date(l),H.level===o&&X>=W&&R<h?R++:H.level===o&&X>=W&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case(i&&u):X=new Date(H.timestamp),$=new Date(f),H.level===o&&X<=$&&R<h?R++:H.level===o&&X<=$&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case(c&&u):X=new Date(H.timestamp),W=new Date(l),$=new Date(f),X>=W&&X<=$&&R<h?R++:X>=W&&X<=$&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case i:H.level===o&&R<h?R++:H.level===o&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case c:X=new Date(H.timestamp),W=new Date(l),X>=W&&R<h?R++:X>=W&&R>=h&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case u:X=new Date(H.timestamp),$=new Date(f),X<=$&&R<h?R++:X<=$&&R>=h&&(Pa(H,_,E),R++,R===m&&g.destroy());break;default:R<h?R++:(Pa(H,_,E),R++,R===m&&g.destroy())}}return a(M,"onLogMessage"),await ese(g,"close"),E}a(ase,"readLog");function Pa(e,t,r){t==="desc"?cse(e,r):t==="asc"?lse(e,r):r.push(e)}a(Pa,"pushLineToResult");function cse(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)>r?n=i+1:s=i}t.splice(n,0,e)}a(cse,"insertDescending");function lse(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)<r?n=i+1:s=i}t.splice(n,0,e)}a(lse,"insertAscending")});var Ag=C((XIe,tF)=>{"use strict";var FO=require("joi"),{string:zu,boolean:Xk,date:use}=FO.types(),dse=ot(),{validateSchemaExists:zIe,validateTableExists:QIe,validateSchemaName:jIe}=bi(),fse=(k(),P(q)),_se=Pt(),Zk=le();Zk.initSync();var JIe=zu.invalid(Zk.get(fse.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(_se.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),eF={operation:zu.valid("add_node","update_node","set_node_replication"),node_name:zu.optional(),subscriptions:FO.array().items({table:zu.optional(),schema:zu.optional(),database:zu.optional(),subscribe:Xk.required(),publish:Xk.required().custom(mse),start_time:use.iso()})};function hse(e){return dse.validateBySchema(e,FO.object(eF))}a(hse,"addUpdateNodeValidator");function mse(e,t){if(t.state.ancestors[2].operation==="add_node"&&e===!1&&t.state.ancestors[0].subscribe===!1)return t.message(`'subscriptions[${t.state.path[1]}]' subscribe and/or publish must be set to true when adding a node`)}a(mse,"checkForFalsy");tF.exports={addUpdateNodeValidator:hse,validation_schema:eF}});var Qu=C((eCe,rF)=>{"use strict";var GO=class{static{a(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},qO=class{static{a(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};rF.exports={Node:GO,NodeSubscription:qO}});var sF=C((rCe,nF)=>{"use strict";var pse=(k(),P(q)).OPERATIONS_ENUM,$O=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=pse.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};nF.exports=$O});var Z_=C((sCe,iF)=>{"use strict";var VO=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},KO=class{static{a(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,o,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=o,c!==void 0&&(this.attributes=c)}};iF.exports={RemotePayloadObject:VO,RemotePayloadSubscription:KO}});var aF=C((oCe,oF)=>{"use strict";var YO=class{static{a(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,o=0){this.schema=t,this.table=r,this.table_size=n,this.record_count=s,this.transaction_log_size=i,this.transaction_log_record_count=o}};oF.exports=YO});var lF=C((fCe,cF)=>{"use strict";var Ese=aF(),cCe=Ft(),lCe=_t(),gse=ee(),{getSchemaPath:uCe,getTransactionAuditStorePath:dCe}=gt(),{getDatabases:Sse}=(xe(),P(ct));cF.exports=Tse;async function Tse(e){let t=new Ese;try{let r=Sse()[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){gse.warn(`unable to stat table dbi due to ${r}`)}return t}a(Tse,"lmdbGetTableSize")});var dF=C((hCe,uF)=>{"use strict";var WO=class{static{a(this,"SystemInformationObject")}constructor(t,r,n,s,i,o,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=o,this.harperdb_processes=c}};uF.exports=WO});var Ju=C((TCe,mF)=>{"use strict";var Ase=require("fs-extra"),Rse=require("path"),Jr=require("systeminformation"),Da=ee(),fF=Er(),pCe=Pt(),ju=(k(),P(q)),yse=lF(),bse=_o(),{getThreadInfo:_F}=it(),eh=le();eh.initSync();var Ose=dF(),{openEnvironment:ECe}=_t(),{getSchemaPath:gCe}=gt(),{database:SCe,databases:zO}=(xe(),P(ct)),Rg;mF.exports={getHDBProcessInfo:XO,getNetworkInfo:eN,getDiskInfo:ZO,getMemoryInfo:JO,getCPUInfo:jO,getTimeInfo:QO,getSystemInformation:tN,systemInformation:Nse,getTableSize:rN,getMetrics:nN};function QO(){return Jr.time()}a(QO,"getTimeInfo");async function jO(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:o,governor:c,socket:l,cache:u,...f}=await Jr.cpu();f.cpu_speed=await Jr.cpuCurrentSpeed();let{raw_currentload:d,raw_currentload_idle:_,raw_currentload_irq:h,raw_currentload_nice:m,raw_currentload_system:S,raw_currentload_user:g,cpus:R,...E}=await Jr.currentLoad();return E.cpus=[],R.forEach(T=>{let{raw_load:N,raw_load_idle:M,raw_load_irq:H,raw_load_nice:X,raw_load_system:W,raw_load_user:$,...se}=T;E.cpus.push(se)}),f.current_load=E,f}catch(e){return Da.error(`error in getCPUInfo: ${e}`),{}}}a(jO,"getCPUInfo");async function JO(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await Jr.mem();return Object.assign(s,process.memoryUsage())}catch(e){return Da.error(`error in getMemoryInfo: ${e}`),{}}}a(JO,"getMemoryInfo");async function XO(){let e={core:[],clustering:[]};try{let t=await Jr.processes(),r;try{r=Number.parseInt(await Ase.readFile(Rse.join(eh.get(ju.CONFIG_PARAMS.ROOTPATH),ju.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===ju.NODE_ERROR_CODES.ENOENT)Da.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 Da.error(`error in getHDBProcessInfo: ${t}`),e}}a(XO,"getHDBProcessInfo");async function ZO(){let e={};try{if(!eh.get(ju.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await Jr.disksIO();e.io=i;let{rx_sec:o,tx_sec:c,wx_sec:l,...u}=await Jr.fsStats();return e.read_write=u,e.size=await Jr.fsSize(),e}catch(t){return Da.error(`error in getDiskInfo: ${t}`),e}}a(ZO,"getDiskInfo");async function eN(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return eh.get(ju.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await Jr.networkInterfaceDefault(),e.latency=await Jr.inetChecksite("google.com"),(await Jr.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:o,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:f,carrier_changes:d,..._}=n;e.interfaces.push(_)}),(await Jr.networkStats()).forEach(n=>{let{rx_sec:s,tx_sec:i,ms:o,...c}=n;e.stats.push(c)})),e}catch(t){return Da.error(`error in getNetworkInfo: ${t}`),e}}a(eN,"getNetworkInfo");async function tN(){if(Rg!==void 0)return Rg;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:o,...c}=await Jr.osInfo();e=c;let l=await Jr.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,Rg=e,Rg}catch(t){return Da.error(`error in getSystemInformation: ${t}`),e}}a(tN,"getSystemInformation");async function rN(){let e=[],t=await bse.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await yse(n));return e}a(rN,"getTableSize");async function nN(){let e={};for(let t in zO){let r=e[t]={},n=r.tables={};for(let s in zO[t])try{let i=zO[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,f,d]=l.trim().split(" ");return{pid:u,thread:f,txnid:d}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:_}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:_}}let o=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=o[l];n[s]=c}catch(i){Da.notify(`Error getting stats for table ${s}: ${i}`)}}return e}a(nN,"getMetrics");async function hF(){if(eh.get(ju.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await fF.getNATSReferences(),t=await fF.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let o={stream_name:n.config.name,database:n.config.subjects[0].split(".")[1],table:n.config.subjects[0].split(".")[2],state:n.state,consumers:s};r.push(o)}return r}}a(hF,"getNatsStreamInfo");async function Nse(e){let t=new Ose;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await tN(),t.time=QO(),t.cpu=await jO(),t.memory=await JO(),t.disk=await ZO(),t.network=await eN(),t.harperdb_processes=await XO(),t.table_size=await rN(),t.metrics=await nN(),t.threads=await _F(),t.replication=await hF(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await tN();break;case"time":t.time=QO();break;case"cpu":t.cpu=await jO();break;case"memory":t.memory=await JO();break;case"disk":t.disk=await ZO();break;case"network":t.network=await eN();break;case"harperdb_processes":t.harperdb_processes=await XO();break;case"table_size":t.table_size=await rN();break;case"database_metrics":case"metrics":t.metrics=await nN();break;case"threads":t.threads=await _F();break;case"replication":t.replication=await hF();break;default:break}return t}a(Nse,"systemInformation")});var bo=C((OCe,SF)=>{"use strict";var wse=An(),sN=ie(),Ise=require("util"),al=(k(),P(q)),pF=le();pF.initSync();var Cse=Zb(),EF=Wr(),{Node:RCe,NodeSubscription:yCe}=Qu(),Pse=Ru(),Dse=sF(),{RemotePayloadObject:Lse,RemotePayloadSubscription:Mse}=Z_(),{handleHDBError:vse,hdb_errors:Use}=he(),{HTTP_STATUS_CODES:xse,HDB_ERROR_MSGS:Bse}=Use,Hse=Ws(),kse=Ju(),{packageJson:Fse}=Et(),{getDatabases:Gse}=(xe(),P(ct)),bCe=Ise.promisify(Cse.authorize),qse=EF.searchByHash,$se=EF.searchByValue;SF.exports={isEmpty:Vse,getNodeRecord:Kse,upsertNodeRecord:Yse,buildNodePayloads:Wse,checkClusteringEnabled:zse,getAllNodeRecords:Qse,getSystemInfo:jse,reverseSubscription:gF};function Vse(e){return e==null}a(Vse,"isEmpty");async function Kse(e){let t=new Pse(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return qse(t)}a(Kse,"getNodeRecord");async function Yse(e){let t=new Dse(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return wse.upsert(t)}a(Yse,"upsertNodeRecord");function gF(e){if(sN.isEmpty(e.subscribe)||sN.isEmpty(e.publish))throw new Error("Received invalid subscription object");let{schema:t,table:r,hash_attribute:n}=e,s={schema:t,table:r,hash_attribute:n};return e.subscribe===!0&&e.publish===!1?(s.subscribe=!1,s.publish=!0):e.subscribe===!1&&e.publish===!0?(s.subscribe=!0,s.publish=!1):(s.subscribe=e.subscribe,s.publish=e.publish),s}a(gF,"reverseSubscription");function Wse(e,t,r,n){let s=[];for(let i=0,o=e.length;i<o;i++){let c=e[i],{schema:l,table:u}=c,f=sN.getTableHashAttribute(l,u),{subscribe:d,publish:_}=gF(c),h=Gse()[l]?.[u],m=new Mse(l,u,f,_,d,c.start_time,h.schemaDefined?h.attributes:void 0);s.push(m)}return new Lse(r,t,s,n)}a(Wse,"buildNodePayloads");function zse(){if(!pF.get(al.CONFIG_PARAMS.CLUSTERING_ENABLED))throw vse(new Error,Bse.CLUSTERING_NOT_ENABLED,xse.BAD_REQUEST,void 0,void 0,!0)}a(zse,"checkClusteringEnabled");async function Qse(){let e=new Hse(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await $se(e))}a(Qse,"getAllNodeRecords");async function jse(){let e=await kse.getSystemInformation();return{hdb_version:Fse.version,node_version:e.node_version,platform:e.platform}}a(jse,"getSystemInfo")});var iN=C((wCe,wF)=>{"use strict";var yg=Er(),TF=ie(),AF=Pt(),RF=(k(),P(q)),bg=ee(),yF=J_(),Jse=E_(),{RemotePayloadObject:Xse}=Z_(),{handleHDBError:bF,hdb_errors:Zse}=he(),{HTTP_STATUS_CODES:OF}=Zse,{NodeSubscription:NF}=Qu();wF.exports=eie;async function eie(e,t){let r;try{r=await yg.request(`${t}.${AF.REQUEST_SUFFIX}`,new Xse(RF.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),bg.trace("Response from remote describe all request:",r)}catch(o){bg.error(`addNode received error from describe all request to remote node: ${o}`);let c=yg.requestErrorHandler(o,"add_node",t);throw bF(new Error,c,OF.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===AF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw bF(new Error,o,OF.INTERNAL_SERVER_ERROR,"error",o)}let n=r.message,s=[],i=[];for(let o of e){let{table:c}=o,l=o.database??o.schema??"data";if(l===RF.SYSTEM_SCHEMA_NAME){await yg.createLocalTableStream(l,c);let m=new NF(l,c,o.publish,o.subscribe);m.start_time=o.start_time,i.push(m);continue}let u=TF.doesSchemaExist(l),f=n[l]!==void 0,d=c?TF.doesTableExist(l,c):!0,_=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!f||!d&&!_){s.push(o);continue}if(!u&&f&&(bg.trace(`addNode creating schema: ${l}`),await yF.createSchema({operation:"create_schema",schema:l})),!d&&_){bg.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let m=new Jse(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(m.attributes=n[l][c].attributes),await yF.createTable(m)}await yg.createLocalTableStream(l,c);let h=new NF(l,c,o.publish,o.subscribe);h.start_time=o.start_time,i.push(h)}return{added:i,skipped:s}}a(eie,"reviewSubscriptions")});var cl={};Ue(cl,{addNodeBack:()=>iie,removeNodeBack:()=>oie,setNode:()=>sie});async function sie(e){e.node_name&&!e.hostname&&(e.hostname=e.node_name),e.verify_tls!==void 0&&(e.rejectUnauthorized=e.verify_tls);let{url:t,hostname:r}=e;t?r||(r=e.hostname=js(t)):t=_g(r);let n=(0,CF.validateBySchema)(e,nie);if(n)throw(0,Oo.handleHDBError)(n,n.message,rie.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new Oo.ClientError("url or hostname is required for remove_node operation");let h=r,m=sr(),S=await m.get(h);if(!S)throw new Oo.ClientError(h+" does not exist");try{await Q_({url:S.url},{operation:Yt.REMOVE_NODE_BACK,name:S?.subscriptions?.length>0?et():h},void 0)}catch(g){Xn.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 m.delete(h),`Successfully removed '${h}' from cluster`}if(!t)throw new Oo.ClientError("url required for this operation");let s=Ta();if(s==null)throw new Oo.ClientError("replication url is missing from harperdb-config.yaml");let i,o,c;if(t?.startsWith("wss:")){i=await(0,Ss.getReplicationCert)();let h=await(0,Ss.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed||e.force_signing?(o=await(0,Ss.createCsr)(),Xn.info("Sending CSR to target node:",t)):h&&(c=h.certificate,Xn.info("Sending CA named",h.name,"to target node",t))}let l={operation:Yt.ADD_NODE_BACK,hostname:(0,Ma.get)(x.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:o,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,Ma.get)(x.REPLICATION_SHARD)!==void 0&&(l.shard=(0,Ma.get)(x.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(IF):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let h=IF(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,f;try{u=await Q_({url:t},l,e)}catch(h){h.message=`Error returned from ${t}: `+h.message,Xn.warn("Error adding node:",t,"to cluster:",h),f=h}if(o&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw f?(f.message+=" and connection was required to sign certificate",f):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);o&&(Xn.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ss.setCertTable)({name:tie.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ss.setCertTable)({name:et()+"-replication",uses:["replication"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let d={url:t,ca:u?.usingCA};if(e.hostname&&(d.name=e.hostname),e.subscriptions?d.subscriptions=e.subscriptions:d.replicates=!0,e.start_time&&(d.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(d.authorization=e.authorization),e.revoked_certificates&&(d.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?d.shard=u.shard:e.shard!==void 0&&(d.shard=e.shard),d.replicates){let h={url:s,ca:c,replicates:!0,subscriptions:null};(0,Ma.get)(x.REPLICATION_SHARD)!==void 0&&(h.shard=(0,Ma.get)(x.REPLICATION_SHARD)),e.retain_authorization&&(h.authorization=e.authorization),e.start_time&&(h.start_time=e.start_time),await So(et(),h)}await So(u?u.nodeName:d.name??js(t),d);let _;return e.operation==="update_node"?_=`Successfully updated '${t}'`:_=`Successfully added '${t}' to cluster`,f&&(_+=" but there was an error updating target node: "+f.message),_}async function iie(e){Xn.trace("addNodeBack received request:",e);let t=await(0,Ss.signCertificate)(e),r;e.csr?(r=t.signingCA,Xn.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,Xn.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,Ss.getReplicationCertAuth)();if(n.replicates){let i={url:Ta(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,Ma.get)(x.REPLICATION_SHARD)!==void 0&&(i.shard=(0,Ma.get)(x.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await So(et(),i)}return await So(e.hostname,n),t.nodeName=et(),t.usingCA=s?.certificate,Xn.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function oie(e){Xn.trace("removeNodeBack received request:",e),await sr().delete(e.name)}function IF(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ss,CF,La,Ma,Xn,Oo,tie,rie,nie,ll=Re(()=>{Ss=v(Zs()),CF=v(ot()),La=v(require("joi")),Ma=v(le());k();$_();Xc();ps();Xn=v(ee()),Oo=v(he()),{pki:tie}=require("node-forge"),{HTTP_STATUS_CODES:rie}=Oo.hdb_errors,nie=La.default.object({hostname:La.default.string(),verify_tls:La.default.boolean(),replicates:La.default.boolean(),subscriptions:La.default.array(),revoked_certificates:La.default.array(),shard:La.default.number()});a(sie,"setNode");a(iie,"addNodeBack");a(oie,"removeNodeBack");a(IF,"reverseSubscription")});var Cg=C((xCe,DF)=>{"use strict";var{handleHDBError:Og,hdb_errors:aie}=he(),{HTTP_STATUS_CODES:Ng}=aie,{addUpdateNodeValidator:cie}=Ag(),wg=ee(),Ig=(k(),P(q)),PF=Pt(),lie=ie(),th=Er(),rh=bo(),oN=le(),uie=iN(),{Node:die,NodeSubscription:fie}=Qu(),{broadcast:_ie}=it(),{setNode:hie}=(ll(),P(cl)),vCe=le(),UCe=(k(),P(q)),mie="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",pie="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Eie=oN.get(Ig.CONFIG_PARAMS.CLUSTERING_NODENAME);DF.exports=gie;async function gie(e,t=!1){if(wg.trace("addNode called with:",e),oN.get(Ig.CONFIG_PARAMS.REPLICATION_URL)||oN.get(Ig.CONFIG_PARAMS.REPLICATION_HOSTNAME))return hie(e);rh.checkClusteringEnabled();let r=cie(e);if(r)throw Og(r,r.message,Ng.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let d=await rh.getNodeRecord(n);if(!lie.isEmptyOrZeroLength(d))throw Og(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,Ng.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await uie(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=mie,o;let c=rh.buildNodePayloads(s,Eie,Ig.OPERATIONS_ENUM.ADD_NODE,await rh.getSystemInfo()),l=[];for(let d=0,_=s.length;d<_;d++){let h=s[d];s[d].start_time===void 0&&delete s[d].start_time,l.push(new fie(h.schema,h.table,h.publish,h.subscribe))}wg.trace("addNode sending remote payload:",c);let u;try{u=await th.request(`${n}.${PF.REQUEST_SUFFIX}`,c)}catch(d){wg.error(`addNode received error from request: ${d}`);for(let h=0,m=s.length;h<m;h++){let S=s[h];S.publish=!1,S.subscribe=!1,await th.updateRemoteConsumer(S,n)}let _=th.requestErrorHandler(d,"add_node",n);throw Og(new Error,_,Ng.INTERNAL_SERVER_ERROR,"error",_)}if(u.status===PF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${n}: ${u.message}`;throw Og(new Error,d,Ng.INTERNAL_SERVER_ERROR,"error",d)}wg.trace(u);for(let d=0,_=s.length;d<_;d++){let h=s[d];await th.updateRemoteConsumer(h,n),h.subscribe===!0&&await th.updateConsumerIterator(h.schema,h.table,n,"start")}let f=new die(n,l,u.system_info);return await rh.upsertNodeRecord(f),_ie({type:"nats_update"}),i.length>0?o.message=pie:o.message=`Successfully added '${n}' to manifest`,o}a(gie,"addNode")});var uN=C((kCe,MF)=>{"use strict";var{handleHDBError:aN,hdb_errors:Sie}=he(),{HTTP_STATUS_CODES:cN}=Sie,{addUpdateNodeValidator:Tie}=Ag(),nh=ee(),Pg=(k(),P(q)),LF=Pt(),HCe=ie(),sh=Er(),ih=bo(),lN=le(),{cloneDeep:Aie}=require("lodash"),Rie=iN(),{Node:yie,NodeSubscription:bie}=Qu(),{broadcast:Oie}=it(),{setNode:Nie}=(ll(),P(cl)),wie="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",Iie="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Cie=lN.get(Pg.CONFIG_PARAMS.CLUSTERING_NODENAME);MF.exports=Pie;async function Pie(e){if(nh.trace("updateNode called with:",e),lN.get(Pg.CONFIG_PARAMS.REPLICATION_URL)??lN.get(Pg.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Nie(e);ih.checkClusteringEnabled();let t=Tie(e);if(t)throw aN(t,t.message,cN.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await ih.getNodeRecord(r);s.length>0&&(n=Aie(s));let{added:i,skipped:o}=await Rie(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=wie,c;let l=ih.buildNodePayloads(i,Cie,Pg.OPERATIONS_ENUM.UPDATE_NODE,await ih.getSystemInfo());for(let f=0,d=i.length;f<d;f++){let _=i[f];nh.trace(`updateNode updating work stream for node: ${r} subscription:`,_),i[f].start_time===void 0&&delete i[f].start_time}nh.trace("updateNode sending remote payload:",l);let u;try{u=await sh.request(`${r}.${LF.REQUEST_SUFFIX}`,l)}catch(f){nh.error(`updateNode received error from request: ${f}`);let d=sh.requestErrorHandler(f,"update_node",r);throw aN(new Error,d,cN.INTERNAL_SERVER_ERROR,"error",d)}if(u.status===LF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${r}: ${u.message}`;throw aN(new Error,f,cN.INTERNAL_SERVER_ERROR,"error",f)}nh.trace(u);for(let f=0,d=i.length;f<d;f++){let _=i[f];await sh.updateRemoteConsumer(_,r),_.subscribe===!0?await sh.updateConsumerIterator(_.schema,_.table,r,"start"):await sh.updateConsumerIterator(_.schema,_.table,r,"stop")}return n||(n=[new yie(r,[],u.system_info)]),await Die(n[0],i,u.system_info),o.length>0?c.message=Iie:c.message=`Successfully updated '${r}'`,c}a(Pie,"updateNode");async function Die(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let o=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let f=n.subscriptions[l];if(f.schema===o.schema&&f.table===o.table){f.publish=o.publish,f.subscribe=o.subscribe,c=!0;break}}c||n.subscriptions.push(new bie(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await ih.upsertNodeRecord(n),Oie({type:"nats_update"})}a(Die,"updateNodeTable")});var HF=C((GCe,BF)=>{"use strict";var xF=require("joi"),{string:vF}=xF.types(),Lie=ot(),UF=(k(),P(q)),Mie=le(),vie=Pt();BF.exports=Uie;function Uie(e){let t=vF.invalid(Mie.get(UF.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(vie.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=xF.object({operation:vF.valid(UF.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return Lie.validateBySchema(e,r)}a(Uie,"removeNodeValidator")});var Dg=C(($Ce,$F)=>{"use strict";var{handleHDBError:kF,hdb_errors:xie}=he(),{HTTP_STATUS_CODES:FF}=xie,Bie=HF(),oh=ee(),GF=bo(),Hie=ie(),Xu=(k(),P(q)),qF=Pt(),dN=Er(),fN=le(),{RemotePayloadObject:kie}=Z_(),{NodeSubscription:Fie}=Qu(),Gie=p_(),qie=Hc(),{broadcast:$ie}=it(),{setNode:Vie}=(ll(),P(cl)),Kie=fN.get(Xu.CONFIG_PARAMS.CLUSTERING_NODENAME);$F.exports=Yie;async function Yie(e){if(oh.trace("removeNode called with:",e),fN.get(Xu.CONFIG_PARAMS.REPLICATION_URL)??fN.get(Xu.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Vie(e);GF.checkClusteringEnabled();let t=Bie(e);if(t)throw kF(t,t.message,FF.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await GF.getNodeRecord(r);if(Hie.isEmptyOrZeroLength(n))throw kF(new Error,`Node '${r}' was not found.`,FF.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new kie(Xu.OPERATIONS_ENUM.REMOVE_NODE,Kie,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let f=n.subscriptions[l];f.subscribe===!0&&await dN.updateConsumerIterator(f.schema,f.table,r,"stop");try{await dN.updateRemoteConsumer(new Fie(f.schema,f.table,!1,!1),r)}catch(d){oh.error(d)}}try{i=await dN.request(`${r}.${qF.REQUEST_SUFFIX}`,s),oh.trace("Remove node reply from remote node:",r,i)}catch(l){oh.error("removeNode received error from request:",l),o=!0}let c=new Gie(Xu.SYSTEM_SCHEMA_NAME,Xu.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await qie.deleteRecord(c),$ie({type:"nats_update"}),i?.status===qF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(oh.error("Error returned from remote node:",r,i?.message),`Successfully removed '${r}' from local manifest, however there was an error reaching remote node. Check the logs for more details.`):`Successfully removed '${r}' from manifest`}a(Yie,"removeNode")});var YF=C((KCe,KF)=>{"use strict";var VF=require("joi"),{string:Wie,array:zie}=VF.types(),Qie=ot(),jie=Ag();KF.exports=Jie;function Jie(e){let t=VF.object({operation:Wie.valid("configure_cluster").required(),connections:zie.items(jie.validation_schema).required()});return Qie.validateBySchema(e,t)}a(Jie,"configureClusterValidator")});var _N=C((WCe,JF)=>{"use strict";var WF=(k(),P(q)),Lg=ee(),Xie=ie(),Zie=le(),eoe=Dg(),toe=Cg(),roe=bo(),noe=YF(),{handleHDBError:zF,hdb_errors:soe}=he(),{HTTP_STATUS_CODES:QF}=soe,ioe="Configure cluster complete.",ooe="Failed to configure the cluster. Check the logs for more details.",aoe="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";JF.exports=coe;async function coe(e){Lg.trace("configure cluster called with:",e);let t=noe(e);if(t)throw zF(t,t.message,QF.BAD_REQUEST,void 0,void 0,!0);let r=await roe.getAllNodeRecords(),n=[];if(Zie.get(WF.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let f=0,d=r.length;f<d;f++){let _=await jF(eoe,{operation:WF.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[f].name},r[f].name);n.push(_)}Lg.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let f=0;f<i;f++){let d=e.connections[f],_=await jF(toe,d,d.node_name);s.push(_)}Lg.trace("All results from configure_cluster add node:",s);let o=[],c=[],l=!1,u=n.concat(s);for(let f=0,d=u.length;f<d;f++){let _=u[f];_.status==="rejected"&&(Lg.error(_.node_name,_?.error?.message,_?.error?.stack),o.includes(_.node_name)||o.push(_.node_name)),(_?.result?.message?.includes?.("Successfully")||_?.result?.includes?.("Successfully"))&&(l=!0),!(typeof _.result=="string"&&_.result.includes("Successfully removed")||_.status==="rejected")&&c.push({node_name:_?.node_name,response:_?.result})}if(Xie.isEmptyOrZeroLength(o))return{message:ioe,connections:c};if(l)return{message:aoe,failed_nodes:o,connections:c};throw zF(new Error,ooe,QF.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(coe,"configureCluster");async function jF(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(jF,"functionWrapper")});var tG=C((QCe,eG)=>{"use strict";var ah=require("joi"),loe=ot(),{validateSchemaExists:XF,validateTableExists:uoe,validateSchemaName:ZF}=bi(),doe=ah.object({operation:ah.string().valid("purge_stream"),schema:ah.string().custom(XF).custom(ZF).optional(),database:ah.string().custom(XF).custom(ZF).optional(),table:ah.string().custom(uoe).required()});function foe(e){return loe.validateBySchema(e,doe)}a(foe,"purgeStreamValidator");eG.exports=foe});var hN=C((JCe,rG)=>{"use strict";var{handleHDBError:_oe,hdb_errors:hoe}=he(),{HTTP_STATUS_CODES:moe}=hoe,poe=tG(),Eoe=Er(),goe=bo();rG.exports=Soe;async function Soe(e){e.schema=e.schema??e.database;let t=poe(e);if(t)throw _oe(t,t.message,moe.BAD_REQUEST,void 0,void 0,!0);goe.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Eoe.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(Soe,"purgeStream")});var EN=C((ZCe,lG)=>{"use strict";var pN=bo(),Toe=Er(),vg=le(),Zu=(k(),P(q)),ul=Pt(),Aoe=ie(),mN=ee(),{RemotePayloadObject:Roe}=Z_(),{ErrorCode:nG}=require("nats"),{parentPort:sG}=require("worker_threads"),{onMessageByType:yoe}=it(),{getThisNodeName:boe}=(ps(),P(Oa)),{requestClusterStatus:Ooe}=($_(),P(IH)),{getReplicationSharedStatus:Noe,getHDBNodeTable:woe}=(Xc(),P(oO)),{CONFIRMATION_STATUS_POSITION:Ioe,RECEIVED_VERSION_POSITION:Coe,RECEIVED_TIME_POSITION:Poe,SENDING_TIME_POSITION:Doe,RECEIVING_STATUS_POSITION:Loe,RECEIVING_STATUS_RECEIVING:Moe}=(CO(),P(Ek)),iG=vg.get(Zu.CONFIG_PARAMS.CLUSTERING_ENABLED),oG=vg.get(Zu.CONFIG_PARAMS.CLUSTERING_NODENAME);lG.exports={clusterStatus:voe,buildNodeStatus:cG};var aG;yoe("cluster-status",async e=>{aG(e)});async function voe(){if(vg.get(Zu.CONFIG_PARAMS.REPLICATION_URL)||vg.get(Zu.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(sG){sG.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{aG=i});for(let i of n.connections){let o=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let d of Object.values(databases[l]||{}))if(u=d.auditStore,u)break;if(!u)continue;let f=Noe(u,l,o);c.lastCommitConfirmed=Mg(f[Ioe]),c.lastReceivedRemoteTime=Mg(f[Coe]),c.lastReceivedLocalTime=Mg(f[Poe]),c.sendingMessage=Mg(f[Doe]),c.lastReceivedStatus=f[Loe]===Moe?"Receiving":"Waiting"}}}else n=Ooe();n.node_name=boe();let s=woe().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:oG,is_enabled:iG,connections:[]};if(!iG)return e;let t=await pN.getAllNodeRecords();if(Aoe.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(cG(t[n],e.connections));return await Promise.allSettled(r),e}a(voe,"clusterStatus");function Mg(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}a(Mg,"asDate");async function cG(e,t){let r=e.name,n=new Roe(Zu.OPERATIONS_ENUM.CLUSTER_STATUS,oG,void 0,await pN.getSystemInfo()),s,i,o=ul.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Toe.request(ul.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===ul.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=ul.CLUSTER_STATUS_STATUSES.CLOSED,mN.error(`Error getting node status from ${r} `,s))}catch(l){mN.warn(`Error getting node status from ${r}`,l),l.code===nG.NoResponders?o=ul.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===nG.Timeout?o=ul.CLUSTER_STATUS_STATUSES.TIMEOUT:o=ul.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Uoe(r,o,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==Zu.PRE_4_0_0_VERSION&&await pN.upsertNodeRecord(l)}catch(l){mN.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(cG,"buildNodeStatus");function Uoe(e,t,r,n,s,i,o,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=o,this.system_info=c}a(Uoe,"NodeStatusObject")});var SN=C((tPe,uG)=>{"use strict";var{handleHDBError:xoe,hdb_errors:Boe}=he(),{HTTP_STATUS_CODES:Hoe}=Boe,koe=Er(),Foe=bo(),gN=ie(),Ug=require("joi"),Goe=ot(),qoe=2e3,$oe=Ug.object({timeout:Ug.number().min(1),connected_nodes:Ug.boolean(),routes:Ug.boolean()});uG.exports=Voe;async function Voe(e){Foe.checkClusteringEnabled();let t=Goe.validateBySchema(e,$oe);if(t)throw xoe(t,t.message,Hoe.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||gN.autoCastBoolean(n),o=s===void 0||gN.autoCastBoolean(s),c={nodes:[]},l=await koe.getServerList(r??qoe),u={};if(i)for(let f=0,d=l.length;f<d;f++){let _=l[f].statsz;_&&(u[l[f].server.name]=_.routes)}for(let f=0,d=l.length;f<d;f++){if(l[f].statsz)continue;let _=l[f].server,h=l[f].data;if(_.name.endsWith("-hub")){let m={name:_.name.slice(0,-4),response_time:l[f].response_time};i&&(m.connected_nodes=[],u[_.name]&&u[_.name].forEach(S=>{m.connected_nodes.includes(S.name.slice(0,-4))||m.connected_nodes.push(S.name.slice(0,-4))})),o&&(m.routes=h.cluster?.urls?h.cluster?.urls.map(S=>({host:S.split(":")[0],port:gN.autoCast(S.split(":")[1])})):[]),c.nodes.push(m)}}return c}a(Voe,"clusterNetwork")});var hG=C((nPe,_G)=>{"use strict";var TN=require("joi"),dG=ot(),{route_constraints:fG}=py();_G.exports={setRoutesValidator:Koe,deleteRoutesValidator:Yoe};function Koe(e){let t=TN.object({server:TN.valid("hub","leaf"),routes:fG.required()});return dG.validateBySchema(e,t)}a(Koe,"setRoutesValidator");function Yoe(e){let t=TN.object({routes:fG.required()});return dG.validateBySchema(e,t)}a(Yoe,"deleteRoutesValidator")});var xg=C((iPe,AG)=>{"use strict";var No=Lt(),AN=ie(),Ts=(k(),P(q)),ed=le(),mG=hG(),{handleHDBError:pG,hdb_errors:Woe}=he(),{HTTP_STATUS_CODES:EG}=Woe,gG="cluster routes successfully set",SG="cluster routes successfully deleted";AG.exports={setRoutes:Qoe,getRoutes:joe,deleteRoutes:Joe};function zoe(e){let t=No.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let o=0,c=e.routes.length;o<c;o++){let l=e.routes[o];l.port=AN.autoCast(l.port);let u=r.some(d=>d.host===l.host&&d.port===l.port),f=n.some(d=>d.host===l.host&&d.port===l.port);u||f?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?No.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):No.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:gG,set:i,skipped:s}}a(zoe,"setRoutesNats");function Qoe(e){let t=mG.setRoutesValidator(e);if(t)throw pG(t,t.message,EG.BAD_REQUEST,void 0,void 0,!0);if(ed.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED))return zoe(e);let r=[],n=[],s=ed.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{TG(s,i)?n.push(i):(s.push(i),r.push(i))}),No.updateConfigValue(Ts.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:gG,set:r,skipped:n}}a(Qoe,"setRoutes");function TG(e,t){return typeof t=="string"?e.includes(t):typeof t=="object"&&t!==null?e.some(r=>(r.host===t.host||r.hostname===t.hostname)&&r.port===t.port):!1}a(TG,"existsInArray");function joe(){if(ed.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=No.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return ed.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(joe,"getRoutes");function Joe(e){let t=mG.deleteRoutesValidator(e);if(t)throw pG(t,t.message,EG.BAD_REQUEST,void 0,void 0,!0);if(ed.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED))return Xoe(e);let r=[],n=[],s=ed.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{TG(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),No.updateConfigValue(Ts.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:SG,deleted:r,skipped:n}}a(Joe,"deleteRoutes");function Xoe(e){let t=No.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],o=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let f=e.routes[l],d=!1;for(let _=0,h=r.length;_<h;_++){let m=r[_];if(f.host===m.host&&f.port===m.port){r.splice(_,1),d=!0,o=!0,s.push(f);break}}if(!d){let _=!0;for(let h=0,m=n.length;h<m;h++){let S=n[h];if(f.host===S.host&&f.port===S.port){n.splice(h,1),c=!0,_=!1,s.push(f);break}}_&&i.push(f)}}return o&&(r=AN.isEmptyOrZeroLength(r)?null:r,No.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=AN.isEmptyOrZeroLength(n)?null:n,No.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:SG,deleted:s,skipped:i}}a(Xoe,"deleteRoutesNats")});var yG=C((aPe,RG)=>{"use strict";var ch=require("alasql"),dl=require("recursive-iterator"),ei=ee(),Zoe=ie(),lh=(k(),P(q)),RN=class{static{a(this,"sql_statement_bucket")}constructor(t){this.ast=t,this.affected_attributes=new Map,this.table_lookup=new Map,this.schema_lookup=new Map,this.table_to_schema_lookup=new Map,tae(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=>lh.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=>!lh.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,o=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[o]&&t[i].tables[o][lh.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[o].attribute_permissions.length>0?c=eae(t[i].tables[o].attribute_permissions):c=global.hdb_schema[i][o].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(o).filter(u=>!lh.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let f=new ch.yy.Column({columnid:u});s.tableid&&(f.tableid=s.tableid),this.ast.columns.push(f),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(o,l)}}),this.ast}};function eae(e){return e.filter(t=>t[lh.PERMS_CRUD_ENUM.READ])}a(eae,"filterReadRestrictedAttrs");function tae(e,t,r,n,s){rae(e,t,r,n,s)}a(tae,"interpretAST");function uh(e,t,r,n,s){if(!(!e||!e.databaseid)&&(t.has(e.databaseid)||t.set(e.databaseid,new Map),t.get(e.databaseid).has(e.tableid)||t.get(e.databaseid).set(e.tableid,[]),e.as&&(r.has(e.as)||r.set(e.as,e.tableid),n&&!n.has(e.as)&&n.set(e.as,e.databaseid)),s)){let i=e.databaseid,o=e.tableid;e.as&&(o=e.as),s.set(o,i)}}a(uh,"addSchemaTableToMap");function rae(e,t,r,n,s){if(!e){ei.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof ch.yy.Insert?oae(e,t,r):e instanceof ch.yy.Select?nae(e,t,r,n,s):e instanceof ch.yy.Update?sae(e,t,r):e instanceof ch.yy.Delete?iae(e,t,r):ei.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(rae,"getRecordAttributesAST");function nae(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(Zoe.isEmptyOrZeroLength(i)){ei.error("No schema specified");return}e.from.forEach(c=>{uh(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),uh(c.table,t,r,n,s)});let o=new dl(e.columns);for(let{node:c}of o)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{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 f=u.tableid?u.tableid:l;if(!t.get(i).has(f))if(r.has(f))f=r.get(f);else{ei.info(`table specified as ${f} not found.`);continue}t.get(i).get(f).indexOf(u.columnid)<0&&t.get(i).get(f).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new dl(c.on);for(let{node:u}of l)if(u&&u.columnid){let f=u.tableid,d=s.get(f);if(!t.get(d).has(f))if(r.has(f))f=r.get(f);else{ei.info(`table specified as ${f} not found.`);continue}t.get(d).get(f).indexOf(u.columnid)<0&&t.get(d).get(f).push(u.columnid)}}),e.order){let c=new dl(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,f=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(f).has(u))if(r.has(u))u=r.get(u);else{ei.info(`table specified as ${u} not found.`);return}t.get(f).get(u).indexOf(l.columnid)<0&&t.get(f).get(u).push(l.columnid)}}}a(nae,"getSelectAttributes");function sae(e,t,r){if(!e){ei.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new dl(e.columns),s=e.table.databaseid;uh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&yN(e.table.tableid,s,i.columnid,t,r)}a(sae,"getUpdateAttributes");function iae(e,t,r){if(!e){ei.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new dl(e.where),s=e.table.databaseid;uh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&yN(e.table.tableid,s,i.columnid,t,r)}a(iae,"getDeleteAttributes");function oae(e,t,r){if(!e){ei.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new dl(e.columns),s=e.into.databaseid;uh(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&yN(e.into.tableid,s,i.columnid,t,r)}a(oae,"getInsertAttributes");function yN(e,t,r,n,s){if(!n.get(t))return;let i=e;n.get(t).has(i)||(i=s.get(i)),n.get(t).get(i).push(r)}a(yN,"pushAttribute");RG.exports=RN});var OG=C((lPe,bG)=>{"use strict";var Bg=(k(),P(q)),Hg=class{static{a(this,"BaseLicense")}constructor(t=0,r=Bg.RAM_ALLOCATION_ENUM.DEFAULT,n=Bg.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},bN=class extends Hg{static{a(this,"ExtendedLicense")}constructor(t=0,r=Bg.RAM_ALLOCATION_ENUM.DEFAULT,n=Bg.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};bG.exports={BaseLicense:Hg,ExtendedLicense:bN}});var nd=C((dPe,DG)=>{"use strict";var rd=require("fs-extra"),kg=(Gp(),P(Fp)),wG=require("crypto"),aae=require("moment"),cae=require("uuid").v4,Xr=ee(),NN=require("path"),lae=ie(),fl=(k(),P(q)),{totalmem:NG}=require("os"),uae=OG().ExtendedLicense,td="invalid license key format",dae="061183",fae="mofi25",_ae="aes-256-cbc",hae=16,mae=32,IG=le(),{resolvePath:CG}=Lt();IG.initSync();var ON;DG.exports={validateLicense:PG,generateFingerPrint:Eae,licenseSearch:CN,getLicense:Tae,checkMemoryLimit:Aae};function wN(){return NN.join(IG.getHdbBasePath(),fl.LICENSE_KEY_DIR_NAME,fl.LICENSE_FILE_NAME)}a(wN,"getLicenseDirPath");function pae(){let e=wN();return CG(NN.join(e,fl.LICENSE_FILE_NAME))}a(pae,"getLicenseFilePath");function IN(){let e=wN();return CG(NN.join(e,fl.REG_KEY_FILE_NAME))}a(IN,"getFingerPrintFilePath");async function Eae(){let e=IN();try{return await rd.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await gae();throw Xr.error(`Error writing fingerprint file to ${e}`),Xr.error(t),new Error("There was an error generating the fingerprint")}}a(Eae,"generateFingerPrint");async function gae(){let e=cae(),t=kg.hash(e,kg.HASH_FUNCTION.MD5),r=IN();try{await rd.mkdirp(wN()),await rd.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw Xr.error(`Error writing fingerprint file to ${r}`),Xr.error(n),new Error("There was an error generating the fingerprint")}return t}a(gae,"writeFingerprint");function PG(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:fl.RAM_ALLOCATION_ENUM.DEFAULT,version:fl.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return Xr.error("empty license key passed to validate."),r;let n=IN(),s=!1;try{s=rd.statSync(n)}catch(i){Xr.error(i)}if(s){let i;try{i=rd.readFileSync(n,"utf8")}catch{Xr.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(fae),c=o[1];c=Buffer.concat([Buffer.from(c)],hae);let l=Buffer.concat([Buffer.from(i)],mae),u=wG.createDecipheriv(_ae,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let f=null;try{f=u.update(o[0],"hex","utf8"),f.trim(),f+=u.final("utf8")}catch{let h=Sae(o[0],i);if(h)f=h;else throw r.valid_license=!1,r.valid_machine=!1,console.error(td),Xr.error(td),new Error(td)}let d;if(isNaN(f))try{d=JSON.parse(f),r.version=d.version,r.exp_date=d.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),d.ram_allocation&&(r.ram_allocation=d.ram_allocation)}catch{throw console.error(td),Xr.error(td),new Error(td)}else r.exp_date=f;r.exp_date<aae().valueOf()&&(r.valid_date=!1),kg.validate(o[1],`${dae}${i}${t}`,kg.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||Xr.error("Invalid licence"),r}a(PG,"validateLicense");function Sae(e,t){try{let r=wG.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{Xr.warn("Check old license failed")}}a(Sae,"checkOldLicense");function CN(){let e=new uae,t=[];try{t=rd.readFileSync(pae(),"utf-8").split(`\r
|
|
22
22
|
`)}catch(r){r.code==="ENOENT"?Xr.debug("no license file found"):Xr.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(lae.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=PG(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){Xr.error("There was an error parsing the license string."),Xr.error(s),e.ram_allocation=fl.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return ON=e,e}a(CN,"licenseSearch");async function Tae(){return ON||await CN(),ON}a(Tae,"getLicense");function Aae(){let e=CN().ram_allocation,t=process.constrainedMemory?.()||NG();if(t=Math.round(Math.min(t,NG())/2**20),t>e)return`This server has more memory (${t}MB) than HarperDB is licensed for (${e}MB), this should only be used for educational and development purposes.`}a(Aae,"checkMemoryLimit")});var LN=C((_Pe,UG)=>{var Fg=nd(),LG=require("chalk"),Zn=ee(),MG=require("prompt"),{promisify:Rae}=require("util"),PN=(k(),P(q)),yae=require("fs-extra"),bae=require("path"),Oae=ie(),{packageJson:Nae}=Et(),vG=le();vG.initSync();var wae=require("moment"),Iae=Rae(MG.get),Cae=bae.join(vG.getHdbBasePath(),PN.LICENSE_KEY_DIR_NAME,PN.LICENSE_FILE_NAME,PN.LICENSE_FILE_NAME);UG.exports={getFingerprint:Dae,setLicense:Pae,parseLicense:DN,register:Lae,getRegistrationInfo:vae};async function Pae(e){if(e&&e.key&&e.company){try{Zn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await DN(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw Zn.error(r),Zn.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(Pae,"setLicense");async function Dae(){let e={};try{e=await Fg.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw Zn.error(r),Zn.error(t),new Error(r)}return e}a(Dae,"getFingerprint");async function DN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");Zn.info("Validating license input...");let r=Fg.validateLicense(e,t);if(Zn.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(Zn.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(Zn.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{Zn.info("writing license to disk"),await yae.writeFile(Cae,JSON.stringify({license_key:e,company:t}))}catch(n){throw Zn.error("Failed to write License"),n}return"Registration successful."}a(DN,"parseLicense");async function Lae(){let e=await Mae();return DN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Lae,"register");async function Mae(){let e=await Fg.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:LG.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:LG.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{MG.start()}catch(n){Zn.error(n)}let r;try{r=await Iae(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(Mae,"promptForRegistration");async function vae(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await Fg.getLicense()}catch(r){throw Zn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(Oae.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=Nae.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=wae.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(vae,"getRegistrationInfo")});var BG=C((mPe,xG)=>{"use strict";var Uae=Pt(),MN=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d,_,h,m){this.port=t,o===null&&(o=void 0),this.server_name=r+Uae.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c}},this.cluster={name:f,port:d,routes:_,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l}},this.accounts={SYS:{users:h},HDB:{users:m}},this.system_account="SYS"}};xG.exports=MN});var FG=C((EPe,kG)=>{"use strict";var HG=Pt(),vN=class{static{a(this,"LeafConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d){this.port=t,d===null&&(d=void 0),this.server_name=r+HG.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+HG.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:f,ca_file:d,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:d,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:d,insecure:!0},urls:o,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};kG.exports=vN});var qG=C((SPe,GG)=>{"use strict";var UN=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};GG.exports=UN});var VG=C((APe,$G)=>{"use strict";var xae=Pt(),xN=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+xae.SERVER_SUFFIX.ADMIN,this.password=r}};$G.exports=xN});var Vg=C((yPe,WG)=>{"use strict";var _l=require("path"),hl=require("fs-extra"),Bae=BG(),Hae=FG(),kae=qG(),Fae=VG(),BN=Kn(),id=ie(),On=Lt(),qg=(k(),P(q)),dh=Pt(),{CONFIG_PARAMS:jt}=qg,od=ee(),fh=le(),KG=fo(),HN=Er(),Gae=Zs(),sd="clustering",qae=1e4,YG=50;WG.exports={generateNatsConfig:Vae,removeNatsConfig:Kae,getHubConfigPath:$ae};function $ae(){let e=fh.get(jt.ROOTPATH);return _l.join(e,sd,dh.NATS_CONFIG_FILES.HUB_SERVER)}a($ae,"getHubConfigPath");async function Vae(e=!1,t=void 0){let r=fh.get(jt.ROOTPATH);hl.ensureDirSync(_l.join(r,"clustering","leaf")),fh.initSync();let n=On.getConfigFromFile(jt.CLUSTERING_TLS_CERT_AUTH),s=On.getConfigFromFile(jt.CLUSTERING_TLS_PRIVATEKEY),i=On.getConfigFromFile(jt.CLUSTERING_TLS_CERTIFICATE);!await hl.exists(i)&&!await hl.exists(!n)&&await Gae.createNatsCerts();let o=_l.join(r,sd,dh.PID_FILES.HUB),c=_l.join(r,sd,dh.PID_FILES.LEAF),l=On.getConfigFromFile(jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=_l.join(r,sd,dh.NATS_CONFIG_FILES.HUB_SERVER),f=_l.join(r,sd,dh.NATS_CONFIG_FILES.LEAF_SERVER),d=On.getConfigFromFile(jt.CLUSTERING_TLS_INSECURE),_=On.getConfigFromFile(jt.CLUSTERING_TLS_VERIFY),h=On.getConfigFromFile(jt.CLUSTERING_NODENAME),m=On.getConfigFromFile(jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await HN.checkNATSServerInstalled()||$g("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await BN.listUsers(),g=On.getConfigFromFile(jt.CLUSTERING_USER),R=await BN.getClusterUser();(id.isEmpty(R)||R.active!==!0)&&$g(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await Gg(jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await Gg(jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await Gg(jt.CLUSTERING_HUBSERVER_NETWORK_PORT),await Gg(jt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[se,z]of S.entries())z.role?.role===qg.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(E.push(new Fae(z.username,KG.decrypt(z.hash))),T.push(new kae(z.username,KG.decrypt(z.hash))));let N=[],{hub_routes:M}=On.getClusteringRoutes();if(!id.isEmptyOrZeroLength(M))for(let se of M)N.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${se.host}:${se.port}`);let H=new Bae(On.getConfigFromFile(jt.CLUSTERING_HUBSERVER_NETWORK_PORT),h,o,i,s,n,d,_,m,On.getConfigFromFile(jt.CLUSTERING_HUBSERVER_CLUSTER_NAME),On.getConfigFromFile(jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete H.tls.ca_file,delete H.leafnodes.tls.ca_file),t=id.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===qg.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await hl.writeJson(u,H),od.trace(`Hub server config written to ${u}`));let X=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,W=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,$=new Hae(On.getConfigFromFile(jt.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[X],[W],E,T,i,s,n,d);n==null&&delete $.tls.ca_file,(t===void 0||t===qg.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await hl.writeJson(f,$),od.trace(`Leaf server config written to ${f}`))}a(Vae,"generateNatsConfig");async function Gg(e){let t=fh.get(e);return id.isEmpty(t)&&$g(`port undefined for '${e}'`),await id.isPortTaken(t)&&$g(`'${e}' port '${t}' is is in use by another process, check to see if HarperDB is already running or another process is using this port.`),!0}a(Gg,"isPortAvailable");function $g(e){let t=`Error generating clustering config: ${e}`;od.error(t),console.error(t),process.exit(1)}a($g,"generateNatsConfigError");async function Kae(e){let{port:t,config_file:r}=HN.getServerConfig(e),{username:n,decrypt_hash:s}=await BN.getClusterUser(),i=0,o=2e3;for(;i<YG;){try{let f=await HN.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){od.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=YG)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=o*(i*2);u>3e4&&od.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await id.async_set_timeout(u)}let c="0".repeat(qae),l=_l.join(fh.get(jt.ROOTPATH),sd,r);await hl.writeFile(l,c),await hl.remove(l),od.notify(e,"started.")}a(Kae,"removeNatsConfig")});var ZG=C((OPe,XG)=>{"use strict";var es=le(),Yae=nd(),Ve=(k(),P(q)),_h=Pt(),wo=require("path"),{PACKAGE_ROOT:Yg}=Et(),zG=le(),Kg=ie(),ad="/dev/null",Wae=wo.join(Yg,"launchServiceScripts"),QG=wo.join(Yg,"utility/scripts"),zae=wo.join(QG,Ve.HDB_RESTART_SCRIPT),jG=wo.resolve(Yg,"dependencies",`${process.platform}-${process.arch}`,_h.NATS_BINARY_NAME);function JG(){let t=Yae.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 Kg.noBootFile()&&(n[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Kg.getEnvCliRootPath()),{name:Ve.PROCESS_DESCRIPTORS.HDB,script:Ve.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:Yg}}a(JG,"generateMainServerConfig");var Qae=9930;function jae(){es.initSync(!0);let e=es.get(Ve.CONFIG_PARAMS.ROOTPATH),t=wo.join(e,"clustering",_h.NATS_CONFIG_FILES.HUB_SERVER),r=wo.join(es.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=zG.get(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=_h.LOG_LEVEL_FLAGS[es.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Qae?"-"+n:""),script:jG,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 es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=ad,i.error_file=ad),i}a(jae,"generateNatsHubServerConfig");var Jae=9940;function Xae(){es.initSync(!0);let e=es.get(Ve.CONFIG_PARAMS.ROOTPATH),t=wo.join(e,"clustering",_h.NATS_CONFIG_FILES.LEAF_SERVER),r=wo.join(es.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=zG.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=_h.LOG_LEVEL_FLAGS[es.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Jae?"-"+n:""),script:jG,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 es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=ad,i.error_file=ad),i}a(Xae,"generateNatsLeafServerConfig");function Zae(){es.initSync();let e=wo.join(es.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:Wae,autorestart:!1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=ad,t.error_file=ad),t}a(Zae,"generateClusteringUpgradeV4ServiceConfig");function ece(){let e={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.RESTART_HDB};return Kg.noBootFile()&&(e[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Kg.getEnvCliRootPath()),{...{name:Ve.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:QG},script:zae}}a(ece,"generateRestart");function tce(){return{apps:[JG()]}}a(tce,"generateAllServiceConfigs");XG.exports={generateAllServiceConfigs:tce,generateMainServerConfig:JG,generateRestart:ece,generateNatsHubServerConfig:jae,generateNatsLeafServerConfig:Xae,generateClusteringUpgradeV4ServiceConfig:Zae}});var mh=C((IPe,_q)=>{"use strict";var tt=(k(),P(q)),rce=ie(),Co=Vg(),Wg=Er(),Io=Pt(),va=ZG(),zg=le(),ml=ee(),nce=bo(),{startWorker:eq,onMessageFromWorkers:sce}=it(),ice=Ju(),wPe=require("util"),oce=require("child_process"),ace=require("fs"),{execFile:cce}=oce,ze;_q.exports={enterPM2Mode:lce,start:Ua,stop:kN,reload:rq,restart:nq,list:FN,describe:oq,connect:Po,kill:hce,startAllServices:mce,startService:GN,getUniqueServicesList:aq,restartAllServices:pce,isServiceRegistered:cq,reloadStopStart:lq,restartHdb:iq,deleteProcess:fce,startClusteringProcesses:dq,startClusteringThreads:fq,isHdbRestartRunning:_ce,isClusteringRunning:gce,stopClustering:Ece,reloadClustering:Sce,expectedRestartOfChildren:sq};var hh=!1;sce(e=>{e.type==="restart"&&zg.initSync(!0)});function lce(){hh=!0}a(lce,"enterPM2Mode");function Po(){return ze||(ze=require("pm2")),new Promise((e,t)=>{ze.connect((r,n)=>{r&&t(r),e(n)})})}a(Po,"connect");var Zr,uce=10,tq;function Ua(e,t=!1){if(hh)return dce(e);let r=cce(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=Zr.indexOf(r);o>-1&&Zr.splice(o,1),!tq&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<uce&&(ace.existsSync(Co.getHubConfigPath())?Ua(e):(await Co.generateNatsConfig(!0),Ua(e),await new Promise(c=>setTimeout(c,3e3)),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=zg.get(tt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&Io.LOG_LEVEL_HIERARCHY[o]>=Io.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===Io.LOG_LEVELS.ERR||f===Io.LOG_LEVELS.WRN?ml.OUTPUTS.STDERR:ml.OUTPUTS.STDOUT;ml.logCustomLevel(f||"info",h,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=Io.LOG_LEVELS[_]}if(Io.LOG_LEVEL_HIERARCHY[o]>=Io.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===Io.LOG_LEVELS.ERR||f===Io.LOG_LEVELS.WRN?ml.OUTPUTS.STDERR:ml.OUTPUTS.STDOUT;ml.logCustomLevel(f||"info",d,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!Zr&&(Zr=[],!t)){let i=a(()=>{tq=!0,Zr&&(Zr.map(o=>o.kill()),process.exit(0))},"kill_children");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}Zr.push(r)}a(Ua,"start");function dce(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.start(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(dce,"startWithPM2");function kN(e){if(!hh){for(let t of Zr||[])t.name===e&&(Zr.splice(Zr.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.stop(e,async(n,s)=>{n&&(ze.disconnect(),r(n)),ze.delete(e,(i,o)=>{i&&(ze.disconnect(),r(n)),ze.disconnect(),t(o)})})})}a(kN,"stop");function rq(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.reload(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(rq,"reload");function nq(e){if(!hh){sq();for(let t of Zr||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.restart(e,(n,s)=>{ze.disconnect(),t(s)})})}a(nq,"restart");function sq(){for(let e of Zr||[])e.config&&(e.config.restarts=0)}a(sq,"expectedRestartOfChildren");function fce(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.delete(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(fce,"deleteProcess");async function iq(){await Ua(va.generateRestart())}a(iq,"restartHdb");async function _ce(){let e=await FN();for(let t in e)if(e[t].name===tt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(_ce,"isHdbRestartRunning");function FN(){return new Promise(async(e,t)=>{try{await Po()}catch(r){t(r)}ze.list((r,n)=>{r&&(ze.disconnect(),t(r)),ze.disconnect(),e(n)})})}a(FN,"list");function oq(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.describe(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(oq,"describe");function hce(){if(!hh){for(let e of Zr||[])e.kill();Zr=[];return}return new Promise(async(e,t)=>{try{await Po()}catch(r){t(r)}ze.killDaemon((r,n)=>{r&&(ze.disconnect(),t(r)),ze.disconnect(),e(n)})})}a(hce,"kill");async function mce(){try{await dq(),await fq(),await Ua(va.generateAllServiceConfigs())}catch(e){throw ze?.disconnect(),e}}a(mce,"startAllServices");async function GN(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case tt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=va.generateMainServerConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=va.generateNatsIngestServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=va.generateNatsReplyServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=va.generateNatsHubServerConfig(),await Ua(r,t),await Co.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=va.generateNatsLeafServerConfig(),await Ua(r,t),await Co.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=va.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await Ua(r)}catch(r){throw ze?.disconnect(),r}}a(GN,"startService");async function aq(){try{let e=await FN(),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 ze?.disconnect(),e}}a(aq,"getUniqueServicesList");async function pce(e=[]){try{let t=!1,r=await aq();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===tt.PROCESS_DESCRIPTORS.HDB?t=!0:await nq(o))}t&&await lq(tt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw ze?.disconnect(),t}}a(pce,"restartAllServices");async function cq(e){if(Zr?.find(r=>r.name===e))return!0;let t=await ice.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(cq,"isServiceRegistered");async function lq(e){let t=zg.get(tt.CONFIG_PARAMS.THREADS_COUNT)??zg.get(tt.CONFIG_PARAMS.THREADS),r=await oq(e),n=rce.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await kN(e),await GN(e)):e===tt.PROCESS_DESCRIPTORS.HDB?await iq():await rq(e)}a(lq,"reloadStopStart");var uq;async function dq(e=!1){for(let t in tt.CLUSTERING_PROCESSES){let r=tt.CLUSTERING_PROCESSES[t];await GN(r,e)}}a(dq,"startClusteringProcesses");async function fq(){uq=eq(tt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await Wg.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await Wg.updateLocalStreams();let e=await nce.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===tt.PRE_4_0_0_VERSION){ml.info("Starting clustering upgrade 4.0.0 process"),eq(tt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(fq,"startClusteringThreads");async function Ece(){for(let e in tt.CLUSTERING_PROCESSES)if(e!==tt.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===tt.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await uq.terminate();else{let t=tt.CLUSTERING_PROCESSES[e];await kN(t)}}a(Ece,"stopClustering");async function gce(){for(let e in tt.CLUSTERING_PROCESSES){let t=tt.CLUSTERING_PROCESSES[e];if(await cq(t)===!1)return!1}return!0}a(gce,"isClusteringRunning");async function Sce(){await Co.generateNatsConfig(!0),await Wg.reloadNATSHub(),await Wg.reloadNATSLeaf(),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(Sce,"reloadClustering")});var VN={};Ue(VN,{compactOnStart:()=>Tce,copyDb:()=>Sq});async function Tce(){xa.notify("Running compact on start"),console.log("Running compact on start");let e=(0,qN.get)(x.ROOTPATH),t=new Map,r=Xe();(0,$N.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,Qg.join)(e,"backup",n+".mdb"),o=(0,Qg.join)(e,fc,n+"-copy.mdb"),c=0;try{c=await hq(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){xa.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{db_path:s,copy_dest:o,backup_dest:i,record_count:c}),await Sq(n,o),console.log("Backing up",n,"to",i),await(0,pl.move)(s,i,{overwrite:!0}),console.log("Moving copy compacted",n,"to",s),await(0,pl.move)(o,s,{overwrite:!0}),await(0,pl.remove)((0,Qg.join)(e,fc,`${n}-copy.mdb-lock`))}try{ld()}catch(n){xa.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}try{ld()}catch(n){xa.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){xa.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,$N.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);for(let[s,{db_path:i,backup_dest:o}]of t){console.error("Moving backup database",o,"back to",i);try{await(0,pl.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw ld(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=await hq(n);if(console.log("Database",n,"after compact has a total record count of",o),i!==o){let c=`There is a discrepancy between pre and post compact record count for database ${n}.
|
|
23
23
|
Total record count before compaction: ${i}, total after: ${o}.
|