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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,9 +13,9 @@
13
13
  `),key:"-----BEGIN RSA PRIVATE KEY-----\rMIIEowIBAAKCAQEArBFJQRfFiJku/KwhV1Ssp7cX61vvuKmd4Rp6A9jB2QLgx8nj\r/+Xhp2hPRkISnOA8BuAxr4dMD9syGJwX4kNy9mbZ5Q0fWZCiEGBpVcU1J+k+N5K4\rSuZ2SqgxeN2IN2RLzt3GyQY4imcdHgNv7aHoXUrEwBx0MeYEw3IIDXtrYKCR2D8I\rvWBfwMUgWa24G8lpWILWA5hd9srRz9NxlAiHSjhbgT7B0xruEpHRCHSyKjvaIJVt\rWBR+amejYsAKVrD/hgrqjsA1123Y6++YqvU6vwg64xhS2kz5r3dkNKhvwbWgpZdI\rIaRvsiB77f4kLGo0vi8RFgJ1ZRjGg3RRK2w1LQIDAQABAoIBAQCEOmh78EOpnGZC\rYBjjHrvrysVD5gvLcfVUtl8Ls7gMB60re1eOIF+PoZZCHKZnDd6zPfiQtj1adg0C\rYnnsM/8VoaZS4gm0b3RLd3ubIQifWhuo40RissY2yxfxlPSH9LhZCY8ojnJG0cTL\resK579E8WCfopjUY33XLqEbN7Ylv39J+DSqInjqV3efJZUa+HqUJ98VxxzodcKMD\rP3bwUU4gHoSSp4pAsOFH5sQhaIWH1IcNjrAwpee2cJQuh4G157RRIuuUpagtaEG/\rXJIiAyBguJyu3JQFnIBQF01N5+omJgXYJ1L0m54543/iIRThmF3zDCDgCyUzmOk+\rH6As9fv1AoGBANOpOtOZLSAScjGsgJamT3ceJ2wCa86g2j8Oxu8lJUmUp5s3tA0v\rBFW5O3S4KR1EXwkLMBUMrfFM8YvzHWxsXBI6XV8azGLvyqPHxr65OhmpGYkGZMXu\rn9okgjkqlewnY2I073gvyK7ppX51UL5y9fF1vlsk+UlW+Rgx/vMHbdcjAoGBANAc\rxRUsxs4QJpbS4zD3JOkHjr24a97TrS3kCybAHUMpR2NrEHPZw9zex0/aphOJUHfL\rIMkOZdpfDqMfxWy4FAEmqBEMkO2SB+h0Wp4P+qp81ax4vGFiB0cD3wtixr11U1tt\rlZ/ZTdv4VDpDFNK1KaplhTDeyuCjeYfS3/GJia9vAoGAcOsAgjBevZR5rXx84WH6\rVO8WUu37u7FenXNxt9VWTinrPMh72uixZFY8nOk+rely1e1NCn3IMko9Ns9NbDFm\r8SaH95vhXArXTYbfxZIlp9jp0YtCqcHDL+p4Oq04bFMbFyJseu7rHj1x18QYfnHw\rOY/6LL/N6k1m+Hx7qgXVmIcCgYB/w0nTCBw84XlvWqSTqQaF8VfWbWP79mP5KmkW\rLxdH5g2noVEGbohqDnK6OXd/wusdwByukiJBf94Skyy25AOT+VFwthA7aU1ljhkb\rtJ+lDuJ28eBkwLPLCzthWBC+u0qjdJFJAzVjd/7tjcU43nNn4s90AzL12iaAFhvZ\rwyA+DQKBgGc/4cdyGJ3YkcA8150gQBawgJZ7q8V1JND87ggWA8wnK3cHn7rMZQl2\r3emDp9HEFXFex5dbGDDqZFAoesZCDxjknIn9oNfW4PvaWS8q7b6ZKLZG1p03Pu7/\rtYaD0kPbo0kysfFT/co+NgHbdykvIyboomfGdNLTUjYuy6lpwpvs\r-----END RSA PRIVATE KEY-----\r".replace(/\r/g,`\r
14
14
  `)},Jse="certificate.pem",Xse="privateKey.pem",Zse="caCertificate.pem",eie="natsCertificate.pem",tie="natsCaCertificate.pem",Pt={DEFAULT:"default","DEFAULT-CA":"default-ca",SERVER:"server",CA:"ca","OPERATIONS-API":"operations-api","OPERATIONS-CA":"operations-ca"},rie={tls_certificate:Pt.SERVER,tlsCertificateAuthority:Pt.CA,customFunctions_tls_certificate:Pt.SERVER,customFunctionsTlsCertificateAuthority:Pt.CA,operationsApi_tls_certificate:Pt["OPERATIONS-API"],operationsApiTlsCertificateAuthority:Pt["OPERATIONS-CA"]},nie={[Pt.SERVER]:2,[Pt.DEFAULT]:1},sie={[Pt["OPERATIONS-API"]]:3,[Pt.SERVER]:2,[Pt.DEFAULT]:1},iie={[Pt["OPERATIONS-API"]]:3,[Pt.SERVER]:2,[Pt.DEFAULT]:1},oie={[Pt["OPERATIONS-CA"]]:3,[Pt.CA]:2,[Pt["DEFAULT-CA"]]:1},aie={[Pt["OPERATIONS-CA"]]:3,[Pt.CA]:2,[Pt["DEFAULT-CA"]]:1},cie={[Pt.CA]:2,[Pt["DEFAULT-CA"]]:1};En.CERTIFICATE_PEM_NAME=Jse;En.PRIVATEKEY_PEM_NAME=Xse;En.CA_PEM_NAME=Zse;En.CERT_NAME=Pt;En.CERT_CONFIG_NAME_MAP=rie;En.CERT_PREFERENCE_APP=nie;En.CERT_PREFERENCE_OPS=sie;En.CERT_PREFERENCE_REP=iie;En.CA_CERT_PREFERENCE_REP=oie;En.CA_CERT_PREFERENCE_OPS=aie;En.CA_CERT_PREFERENCE_APP=cie;En.CERTIFICATE_VALUES=Qse;En.NATS_CERTIFICATE_PEM_NAME=eie;En.NATS_CA_PEM_NAME=tie});var Ow=v((pDe,AH)=>{"use strict";var RH=require("fs-extra"),ge=require("joi"),lie=require("os"),{boolean:We,string:gt,number:dr,array:ja}=ge.types(),{totalmem:SH}=require("os"),yl=require("path"),uie=Q(),Cw=ae(),mDe=Nw(),TH=(q(),M(z)),die=mt(),yH="log",fie="components",mie="Invalid logging.rotation.maxSize unit. Available units are G, M or K",pie="Invalid logging.rotation.interval unit. Available units are D, H or M (minutes)",hie="Invalid logging.rotation.maxSize value. Value should be a number followed by unit e.g. '10M'",Eie="Invalid logging.rotation.interval value. Value should be a number followed by unit e.g. '10D'",_ie="rootPath config parameter is undefined",$n=ge.alternatives([dr.min(0),gt]).optional().empty(null),Ug=ge.alternatives([ja.items(gt,{host:gt.required(),port:$n},{hostname:gt.required(),port:$n}).empty(null),ja.items(gt)]),Zi,bH=!1;AH.exports={configValidator:gie,routesValidator:Aie,routeConstraints:Ug};function gie(e,t=!1){if(bH=t,Zi=e.rootPath,Cw.isEmpty(Zi))throw _ie;let r=We.optional(),n=dr.min(0).max(1e3).empty(null).default(bie),s=gt.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").empty(null).default(Ep),i=gt.optional().empty(null),a=gt.pattern(/^[^\s.,*>]+$/).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >"}).empty(null).required(),c=ge.string().empty(null).default(Ep),l=ge.custom(Tie).empty(null).default(Ep),u=e.clustering?.enabled,d=ge.object({certificate:i,certificateAuthority:i,privateKey:i}),f;return u===!0?f=ge.object({enabled:r,hubServer:ge.object({cluster:ge.object({name:ge.required().empty(null),network:ge.object({port:$n,routes:Ug}).required()}).required(),leafNodes:ge.object({network:ge.object({port:$n}).required()}).required(),network:ge.object({port:$n}).required()}).required(),leafServer:ge.object({network:ge.object({port:$n,routes:Ug}).required(),streams:ge.object({maxAge:dr.min(120).allow(null).optional(),maxBytes:dr.min(1).allow(null).optional(),maxMsgs:dr.min(1).allow(null).optional(),path:c}).required()}).required(),logLevel:ge.valid("error","warn","info","debug","trace"),nodeName:a,republishMessages:We.optional(),databaseLevel:We.optional(),tls:ge.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:We.required(),verify:We.optional()}),user:gt.optional().empty(null)}).optional():f=ge.object({enabled:r,tls:ge.object({certificate:i,certificateAuthority:i,privateKey:i,insecure:We.optional()})}).optional(),ge.object({authentication:ge.alternatives(ge.object({authorizeLocal:We,cacheTTL:dr.required(),cookie:ge.object({domains:ja.items(gt).optional(),expires:gt.optional()}),enableSessions:We,hashFunction:gt.valid("md5","sha256","argon2id").optional().empty(null)}),We).optional(),analytics:ge.object({aggregatePeriod:dr,replicate:We.optional()}),replication:ge.object({hostname:ge.alternatives(gt,dr).optional().empty(null),url:gt.optional().empty(null),port:$n,securePort:$n,routes:ja.optional().empty(null),databases:ge.alternatives(gt,ja),enableRootCAs:We.optional(),copyTablesToCatchUp:We.optional()}).optional(),componentsRoot:s.optional(),clustering:f,localStudio:ge.object({enabled:r}).required(),logging:ge.object({auditAuthEvents:ge.object({logFailed:We,logSuccessful:We}),file:We.required(),level:ge.valid("notify","fatal","error","warn","info","debug","trace"),rotation:ge.object({enabled:We.optional(),compress:We.optional(),interval:gt.custom(Rie).optional().empty(null),maxSize:gt.custom(yie).optional().empty(null),path:gt.optional().empty(null).default(Ep)}).required(),root:s,stdStreams:We.required(),auditLog:We.required()}).required(),operationsApi:ge.object({network:ge.object({cors:We.optional(),corsAccessList:ja.optional(),headersTimeout:dr.min(1).optional(),keepAliveTimeout:dr.min(1).optional(),port:$n,domainSocket:ge.optional().empty("hdb/operations-server").default(Ep),securePort:$n,timeout:dr.min(1).optional()}).optional(),tls:ge.alternatives([ge.array().items(d),d])}).required(),rootPath:gt.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path").required(),mqtt:ge.object({network:ge.object({port:$n,securePort:$n,mtls:ge.alternatives([We.optional(),ge.object({user:gt.optional(),certificateAuthority:i,required:We.optional()})])}).required(),webSocket:We.optional(),requireAuthentication:We.optional()}),http:ge.object({compressionThreshold:dr.optional(),cors:We.optional(),corsAccessList:ja.optional(),headersTimeout:dr.min(1).optional(),port:$n,securePort:$n,maxHeaderSize:dr.optional(),mtls:ge.alternatives([We.optional(),ge.object({user:gt.optional(),certificateAuthority:i,required:We.optional()})]),threadRange:ge.alternatives([ja.optional(),gt.optional()])}).required(),threads:ge.alternatives(n.optional(),ge.object({count:n.optional(),debug:ge.alternatives(We.optional(),ge.object({startingPort:dr.min(1).optional(),host:gt.optional(),waitForDebugger:We.optional()})),maxHeapMemory:dr.min(0).optional()})),storage:ge.object({writeAsync:We.required(),overlappingSync:We.optional(),caching:We.optional(),compression:ge.alternatives([We.optional(),ge.object({dictionary:gt.optional(),threshold:dr.optional()})]),compactOnStart:We.optional(),compactOnStartKeepBackup:We.optional(),noReadAhead:We.optional(),path:l,prefetchWrites:We.optional(),maxFreeSpaceToLoad:dr.optional(),maxFreeSpaceToRetain:dr.optional()}).required(),ignoreScripts:We.optional(),tls:ge.alternatives([ge.array().items(d),d])}).validate(e,{allowUnknown:!0,abortEarly:!1,errors:{wrap:{label:"'"}}})}o(gie,"configValidator");function Sie(e){return bH||RH.existsSync(e)?null:`Specified path ${e} does not exist.`}o(Sie,"doesPathExist");function Tie(e,t){ge.assert(e,gt.pattern(/^[\\\/]$|([\\\/a-zA-Z_0-9\:-]+)+$/,"directory path"));let r=Sie(e);if(r)return t.message(r)}o(Tie,"validatePath");function yie(e,t){let r=e.slice(-1);if(r!=="G"&&r!=="M"&&r!=="K")return t.message(mie);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(hie):e}o(yie,"validateRotationMaxSize");function Rie(e,t){let r=e.slice(-1);if(r!=="D"&&r!=="H"&&r!=="M")return t.message(pie);let n=e.slice(0,-1);return isNaN(parseInt(n))?t.message(Eie):e}o(Rie,"validateRotationInterval");function bie(e,t){let r=t.state.path.join("."),n=lie.cpus().length,s=n-1;s<=2&&(s=2);let i=process.constrainedMemory?.()||SH();return i=Math.round(Math.min(i,SH())/1e6),s=Math.max(Math.min(s,Math.round((i-750)/300)),1),uie.info(`Detected ${n} cores and ${i}MB on this machine, defaulting ${r} to ${s}`),s}o(bie,"setDefaultThreads");function Ep(e,t){let r=t.state.path.join(".");if(!Cw.isEmpty(t.original)&&r!=="operationsApi.network.domainSocket")return t.original;if(Cw.isEmpty(Zi))throw new Error(`Error setting default root for: ${r}. HDB root is not defined`);switch(r){case"componentsRoot":return yl.join(Zi,fie);case"logging.root":return yl.join(Zi,yH);case"clustering.leafServer.streams.path":return yl.join(Zi,"clustering","leaf");case"storage.path":let n=yl.join(Zi,TH.LEGACY_DATABASES_DIR_NAME);return RH.existsSync(n)?n:yl.join(Zi,TH.DATABASES_DIR_NAME);case"logging.rotation.path":return yl.join(Zi,yH);case"operationsApi.network.domainSocket":return r==null?null:yl.join(Zi,"operations-server");default:throw new Error(`Error setting default root for config parameter: ${r}. Unrecognized config parameter`)}}o(Ep,"setDefaultRoot");function Aie(e){let t=ge.object({routes:Ug});return die.validateBySchema({routes:e},t)}o(Aie,"routesValidator")});var St=v(nr=>{"use strict";var Bs=(q(),M(z)),Nr=ae(),fr=Q(),{configValidator:Iie,routesValidator:IH}=Ow(),_n=require("fs-extra"),NH=require("yaml"),ds=require("path"),wie=require("is-number"),CH=require("properties-reader"),Nie=require("lodash"),{handleHDBError:Cie}=_e(),{HTTP_STATUS_CODES:Oie,HDB_ERROR_MSGS:id}=zr(),{server:Pie}=(Fr(),M(am)),{PACKAGE_ROOT:OH}=Ct(),{DATABASES_PARAM_CONFIG:_p,CONFIG_PARAMS:us,CONFIG_PARAM_MAP:mi}=Bs,Lie="Unable to get config value because config is uninitialized",Die="Config successfully initialized",Mie="Error backing up config file",vie="Empty parameter sent to getConfigValue",PH=ds.join(OH,"config","yaml",Bs.HDB_DEFAULT_CONFIG_FILE),Uie=ds.join(OH,"config","yaml","defaultNatsConfig.yaml"),xie="Configuration successfully set. You must restart HarperDB for new config settings to take effect.",wH={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"},xg,kt,Bg;nr.createConfigFile=Bie;nr.getDefaultConfig=Fie;nr.getConfigValue=DH;nr.initConfig=Fg;nr.flattenConfig=od;nr.updateConfigValue=MH;nr.updateConfigObject=Hie;nr.getConfiguration=$ie;nr.setConfiguration=Vie;nr.readConfigFile=Mw;nr.getClusteringRoutes=Kie;nr.initOldConfig=vH;nr.getConfigFromFile=Yie;nr.getConfigFilePath=Rl;nr.addConfig=Wie;nr.deleteConfigFromFile=zie;nr.getConfigObj=jie;nr.resolvePath=Pw;nr.getFlatConfigObj=Qie;function Pw(e){if(e?.startsWith("~/"))return ds.join(Nr.getHomeDir(),e.slice(1));let t=me();try{return ds.resolve(t.getHdbBasePath(),e)}catch(r){return console.error("Unable to resolve path",e,r),e}}o(Pw,"resolvePath");function Bie(e,t=!1){let r=Qa(PH);if(e.clustering_enabled||e.CLUSTERING_ENABLED||e.clustering){let c=NH.parseDocument(_n.readFileSync(Uie,"utf8"),{simpleKeys:!0});r.addIn(["clustering"],c.toJSON().clustering)}xg=od(r.toJSON());let n;for(let c in e){let l=mi[c.toLowerCase()];if(l===us.DATABASES){Array.isArray(e[c])?n=e[c]:n=Object.keys(e[c]).map(u=>({[u]:e[c][u]}));continue}if(!l&&(c.endsWith("_package")||c.endsWith("_port"))&&(l=c),l!==void 0){let u=l.split("_"),d=Lw(l,e[c]);l==="rootPath"&&d?.endsWith("/")&&(d=d.slice(0,-1));try{u.length>1&&typeof r.getIn(u.slice(0,-1))=="boolean"&&r.deleteIn(u.slice(0,-1)),r.setIn([...u],d)}catch(f){fr.error(f)}}}n&&LH(r,n),Dw(r,t);let s=r.toJSON();kt=od(s);let i=r.getIn(["rootPath"]),a=ds.join(i,Bs.HDB_CONFIG_FILE);if(_n.createFileSync(a),r.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${r.errors}`);_n.writeFileSync(a,String(r)),fr.trace(`Config file written to ${a}`)}o(Bie,"createConfigFile");function LH(e,t){let r;try{try{r=JSON.parse(t)}catch(n){if(!Nr.isObject(t))throw n;r=t}for(let n of r){let s=Object.keys(n)[0];if(n[s].hasOwnProperty(_p.TABLES))for(let i in n[s][_p.TABLES])for(let a in n[s][_p.TABLES][i]){let c=n[s][_p.TABLES][i][a],l=[us.DATABASES,s,_p.TABLES,i,a];e.hasIn(l)?e.setIn(l,c):e.addIn(l,c)}else for(let i in n[s]){let a=n[s][i],c=[us.DATABASES,s,i];e.hasIn(c)?e.setIn(c,a):e.addIn(c,a)}}}catch(n){fr.error("Error parsing schemas CLI/env config arguments",n)}}o(LH,"setSchemasConfig");function Fie(e){if(xg===void 0){let r=Qa(PH);xg=od(r.toJSON())}let t=mi[e.toLowerCase()];if(t!==void 0)return xg[t.toLowerCase()]}o(Fie,"getDefaultConfig");function DH(e){if(e==null){fr.info(vie);return}if(kt===void 0){fr.trace(Lie);return}let t=mi[e.toLowerCase()];if(t!==void 0)return kt[t.toLowerCase()]}o(DH,"getConfigValue");function Rl(e=Nr.getPropsFilePath()){let t=Nr.getEnvCliRootPath();if(t)return Pw(ds.join(t,Bs.HDB_CONFIG_FILE));let r=CH(e);return Pw(r.get(Bs.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY))}o(Rl,"getConfigFilePath");function Fg(e=!1){if(kt===void 0||e){let t;if(!Nr.noBootFile()){t=Nr.getPropsFilePath();try{_n.accessSync(t,_n.constants.F_OK|_n.constants.R_OK)}catch(i){throw fr.error(i),new Error(`HarperDB properties file at path ${t} does not exist`)}}let r=Rl(t),n;if(r.includes("config/settings.js"))try{vH(r);return}catch(i){if(i.code!==Bs.NODE_ERROR_CODES.ENOENT)throw i}try{n=Qa(r)}catch(i){if(i.code===Bs.NODE_ERROR_CODES.ENOENT){fr.trace(`HarperDB config file not found at ${r}.
15
15
  This can occur during early stages of install where the config file has not yet been created`);return}else throw fr.error(i),new Error(`Error reading HarperDB config file at ${r}`)}kie(n,r),Dw(n);let s=n.toJSON();if(Pie.config=s,kt=od(s),kt.logging_rotation_rotate)for(let i in wH)kt[i]&&fr.error(`Config ${wH[i]} has been deprecated. Please check https://docs.harperdb.io/docs/ for further details.`);fr.trace(Die)}}o(Fg,"initConfig");function kie(e,t){let r=e.getIn(["rootPath"]),n=!1;if(e.hasIn(["storage","path"])||(e.setIn(["storage","path"],ds.join(r,"database")),n=!0),e.hasIn(["logging","rotation","path"])||(e.setIn(["logging","rotation","path"],ds.join(r,"log")),n=!0),e.hasIn(["authentication"])||(e.addIn(["authentication"],{cacheTTL:3e4,enableSessions:!0,operationTokenTimeout:e.getIn(["operationsApi","authentication","operationTokenTimeout"])??"1d",refreshTokenTimeout:e.getIn(["operationsApi","authentication","refreshTokenTimeout"])??"30d"}),n=!0),e.hasIn(["analytics"])||(e.addIn(["analytics"],{aggregatePeriod:60,replicate:!1}),n=!0),n){if(fr.trace("Updating config file with missing config params"),e.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${e.errors}`);_n.writeFileSync(t,String(e))}}o(kie,"checkForUpdatedConfig");function Dw(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 id.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 id.CONFIG_VALIDATION("operationsApi.network.port and operationsApi.network.securePort cannot be the same value");let n=Iie(r,t);if(n.error)throw id.CONFIG_VALIDATION(n.error.message);typeof n.value.threads=="object"?e.setIn(["threads","count"],n.value.threads.count):e.setIn(["threads"],n.value.threads),e.setIn(["componentsRoot"],n.value.componentsRoot),e.setIn(["logging","root"],n.value.logging.root),e.setIn(["storage","path"],n.value.storage.path),e.setIn(["logging","rotation","path"],n.value.logging.rotation.path),e.setIn(["operationsApi","network","domainSocket"],n.value?.operationsApi?.network?.domainSocket),r?.clustering?.enabled&&e.setIn(["clustering","leafServer","streams","path"],n.value.clustering.leafServer.streams?.path)}o(Dw,"validateConfig");function Hie(e,t){kt===void 0&&(kt={});let r=mi[e.toLowerCase()];if(r===void 0){fr.trace(`Unable to update config object because config param '${e}' does not exist`);return}kt[r.toLowerCase()]=t}o(Hie,"updateConfigObject");function MH(e,t,r=void 0,n=!1,s=!1,i=!1){kt===void 0&&Fg();let a=DH(mi.hdb_root),c=ds.join(a,Bs.HDB_CONFIG_FILE),l=Qa(c),u;if(r&&kt){let m=!1;for(let p in r)if(r[p]!=kt[p.toLowerCase()]){m=!0;break}if(!m){fr.trace("No changes detected in config parameters, skipping update");return}}if(r===void 0&&e.toLowerCase()===us.DATABASES)u=t;else if(r===void 0){let m;if(i)m=e;else if(m=mi[e.toLowerCase()],m===void 0)throw new Error(`Unable to update config, unrecognized config parameter: ${e}`);let p=m.split("_"),h=Lw(m,t);l.setIn([...p],h)}else for(let m in r){let p=mi[m.toLowerCase()];if(p===us.HTTP_SECUREPORT&&r[m]===kt[us.HTTP_PORT]?.toString()&&l.setIn(["http","port"],null),p===us.OPERATIONSAPI_NETWORK_SECUREPORT&&r[m]===kt[us.OPERATIONSAPI_NETWORK_PORT.toLowerCase()]?.toString()&&l.setIn(["operationsApi","network","port"],null),p===us.DATABASES){u=r[m];continue}if(p?.startsWith("threads_")){let h=l.getIn(["threads"]);h>=0&&(l.deleteIn(["threads"]),l.setIn(["threads","count"],h))}if(!p&&(m.endsWith("_package")||m.endsWith("_port"))&&(p=m),p!==void 0){let h=p.split("_"),E=Bs.LEGACY_CONFIG_PARAMS[m.toUpperCase()];E&&E.startsWith("customFunctions")&&l.hasIn(E.split("_"))&&(p=E,h=E.split("_"));let g=Lw(p,r[m]);p==="rootPath"&&g?.endsWith("/")&&(g=g.slice(0,-1));try{h.length>1&&typeof l.getIn(h.slice(0,-1))=="boolean"&&l.deleteIn(h.slice(0,-1)),l.setIn([...h],g)}catch(R){fr.error(R)}}}u&&LH(l,u),Dw(l);let d=l.getIn(["rootPath"]),f=ds.join(d,Bs.HDB_CONFIG_FILE);if(n===!0&&Gie(c,d),l.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${l.errors}`);_n.writeFileSync(f,String(l)),s&&(kt=od(l.toJSON())),fr.trace(`Config parameter: ${e} updated with value: ${t}`)}o(MH,"updateConfigValue");function Gie(e,t){try{let r=ds.join(t,"backup",`${new Date(Date.now()).toISOString().replaceAll(":","-")}-${Bs.HDB_CONFIG_FILE}.bak`);_n.copySync(e,r),fr.trace(`Config file: ${e} backed up to: ${r}`)}catch(r){fr.error(Mie),fr.error(r)}}o(Gie,"backupConfigFile");var qie=["databases"];function od(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}),Bg=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])&&!qie.includes(i)){let a=r(n[i]);for(let c in a){if(!a.hasOwnProperty(c))continue;c!=="package"&&(i=i.toLowerCase());let l=i+"_"+c;!us[l.toUpperCase()]&&mi[l]&&(s[mi[l].toLowerCase()]=a[c]),s[l]=a[c]}}n[i]!==void 0&&(s[i.toLowerCase()]=n[i])}return s}o(r,"squashObj")}o(od,"flattenConfig");function Lw(e,t){if(e===us.CLUSTERING_NODENAME||e===us.CLUSTERING_USER){if(t==null)return t;if(!isNaN(t))return t.toString();if(typeof t=="string"&&t.toLowerCase()==="true"||typeof t=="string"&&t.toLowerCase()==="false")return t}else{if(wie(t))return parseFloat(t);if(t===!0||t===!1||Array.isArray(t)||Nr.isObject(t)||t===null)return t;if(typeof t=="string"&&t.toLowerCase()==="true")return!0;if(typeof t=="string"&&t.toLowerCase()==="false")return!1}if(t===void 0||t.toLowerCase()==="undefined")return null;if(typeof t=="string"&&(t.startsWith("{")&&t.endsWith("}")||t.startsWith("[")&&t.endsWith("]")))try{return JSON.parse(t)}catch{}return Nr.autoCast(t)}o(Lw,"castConfigValue");function $ie(){let e=Nr.getPropsFilePath(),t=Rl(e);return Qa(t).toJSON()}o($ie,"getConfiguration");async function Vie(e){let{operation:t,hdb_user:r,hdbAuthHeader:n,...s}=e;try{return MH(void 0,void 0,s,!0),xie}catch(i){throw typeof i=="string"||i instanceof String?Cie(i,i,Oie.BAD_REQUEST,void 0,void 0,!0):i}}o(Vie,"setConfiguration");function Mw(){let e=Nr.getPropsFilePath();try{_n.accessSync(e,_n.constants.F_OK|_n.constants.R_OK)}catch(n){if(!Nr.noBootFile())throw fr.error(n),new Error(`HarperDB properties file at path ${e} does not exist`)}let t=Rl(e);return Qa(t).toJSON()}o(Mw,"readConfigFile");function Qa(e){return NH.parseDocument(_n.readFileSync(e,"utf8"),{simpleKeys:!0})}o(Qa,"parseYamlDoc");function Kie(){let e=Mw(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=Nr.isEmptyOrZeroLength(t)?[]:t;let r=IH(t);if(r)throw id.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=Nr.isEmptyOrZeroLength(n)?[]:n;let s=IH(n);if(s)throw id.CONFIG_VALIDATION(s.message);if(!Nr.isEmptyOrZeroLength(n)&&!Nr.isEmptyOrZeroLength(t)){let i=t.filter(a=>n.some(c=>c.host===a.host&&c.port===a.port));if(!Nr.isEmptyOrZeroLength(i)){let a=`Duplicate hub and leaf routes found ${JSON.stringify(i)}`;throw id.CONFIG_VALIDATION(a)}}return{hub_routes:t,leaf_routes:n}}o(Kie,"getClusteringRoutes");function vH(e){let t=CH(e);kt={};for(let r in mi){let n=t.get(r.toUpperCase());if(Nr.isEmpty(n)||typeof n=="string"&&n.trim().length===0)continue;let s=mi[r].toLowerCase();s===us.LOGGING_ROOT?kt[s]=ds.dirname(n):kt[s]=n}return kt}o(vH,"initOldConfig");function Yie(e){let t=Mw();return Nie.get(t,e.replaceAll("_","."))}o(Yie,"getConfigFromFile");async function Wie(e,t){let r=Qa(Rl());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 _n.writeFile(Rl(),String(r))}o(Wie,"addConfig");function zie(e){let t=Rl(Nr.getPropsFilePath()),r=Qa(t);r.deleteIn(e);let n=r.getIn(["rootPath"]),s=ds.join(n,Bs.HDB_CONFIG_FILE);_n.writeFileSync(s,String(r))}o(zie,"deleteConfigFromFile");function jie(){return Bg||(Fg(),Bg)}o(jie,"getConfigObj");function Qie(){return kt||Fg(),kt}o(Qie,"getFlatConfigObj")});var fs=v((gDe,qr)=>{"use strict";var BH="username is required",FH="nothing to update, must supply active, role or password to update",kH="password cannot be an empty string",HH="If role is specified, it cannot be empty.",GH="active must be true or false";qr.exports.addUser=ioe;qr.exports.alterUser=ooe;qr.exports.dropUser=coe;qr.exports.getSuperUser=moe;qr.exports.userInfo=loe;qr.exports.listUsers=Hg;qr.exports.listUsersExternal=uoe;qr.exports.setUsersWithRolesCache=bl;qr.exports.findAndValidateUser=qw;qr.exports.getClusterUser=poe;qr.exports.getUsersWithRolesCache=foe;qr.exports.USERNAME_REQUIRED=BH;qr.exports.ALTERUSER_NOTHING_TO_UPDATE=FH;qr.exports.EMPTY_PASSWORD=kH;qr.exports.EMPTY_ROLE=HH;qr.exports.ACTIVE_BOOLEAN=GH;var qH=Gn(),Jie=Sl(),gp=(pw(),M(mw)),$H=Bk(),Sp=hn(),Fw=Ho(),eo=ae(),VH=require("validate.js"),kw=Q(),{promisify:Xie}=require("util"),Hw=Xi(),Uw=(q(),M(z)),UH=Ot(),Zie=St(),eoe=me(),toe=Wi(),{hdbErrors:roe,ClientError:pi}=_e(),{HTTP_STATUS_CODES:Vo,AUTHENTICATION_ERROR_MSGS:vw,HDB_ERROR_MSGS:ad}=roe,{UserEventMsg:Gw}=is(),xw=require("lodash"),{server:kg}=(Fr(),M(am)),noe=Q();kg.getUser=(e,t)=>qw(e,t,t!=null);kg.authenticateUser=(e,t)=>qw(e,t);var KH={username:!0,active:!0,role:!0,password:!0},xH=new Map,soe=Xie(Jie.delete),Bw=eoe.get(Uw.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??gp.HASH_FUNCTION.SHA256,to;async function ioe(e){let t=VH.cleanAttributes(e,KH),r=$H.addUserValidation(t);if(r)throw new pi(r.message);let n=await Sp.searchByValue({schema:"system",table:"hdb_role",attribute:"role",value:t.role,get_attributes:["id","permission","role"]});if(!n||n.length<1)throw new pi(ad.ROLE_NAME_NOT_FOUND(t.role),Vo.NOT_FOUND);if(n.length>1)throw new pi(ad.DUP_ROLES_FOUND(t.role),Vo.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=Hw.encrypt(t.password)),t.password=await gp.hash(t.password,Bw),t.hash_function=Bw,t.role=n[0].id;let s=await qH.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(kw.debug(s),await bl(),s.skipped_hashes.length===1)throw new pi(ad.USER_ALREADY_EXISTS(t.username),Vo.CONFLICT);return Fw.signalUserChange(new Gw(process.pid)),`${t.username} successfully added`}o(ioe,"addUser");async function ooe(e){let t=VH.cleanAttributes(e,KH);if(eo.isEmptyOrZeroLength(t.username))throw new Error(BH);if(eo.isEmptyOrZeroLength(t.password)&&eo.isEmptyOrZeroLength(t.role)&&eo.isEmptyOrZeroLength(t.active))throw new Error(FH);if(!eo.isEmpty(t.password)&&eo.isEmptyOrZeroLength(t.password.trim()))throw new Error(kH);if(!eo.isEmpty(t.active)&&!eo.isBoolean(t.active))throw new Error(GH);if(!eo.isEmpty(t.password)&&!eo.isEmptyOrZeroLength(t.password.trim())&&(aoe(t.username)&&(t.hash=Hw.encrypt(t.password)),t.password=await gp.hash(t.password,Bw)),t.role==="")throw new Error(HH);if(t.role){let n=await Sp.searchByValue({schema:"system",table:"hdb_role",attribute:"role",value:t.role,get_attributes:["*"]});if(!n||n.length===0)throw new pi(ad.ALTER_USER_ROLE_NOT_FOUND(t.role),Vo.NOT_FOUND);if(n.length>1)throw new pi(ad.DUP_ROLES_FOUND(t.role),Vo.CONFLICT);t.role=n[0].id}let r=await qH.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await bl(),Fw.signalUserChange(new Gw(process.pid)),r}o(ooe,"alterUser");function aoe(e){let t=!1,r=to.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}o(aoe,"isClusterUser");async function coe(e){let t=$H.dropUserValidation(e);if(t)throw new pi(t.message);if(to.get(e.username)===void 0)throw new pi(ad.USER_NOT_EXIST(e.username),Vo.NOT_FOUND);let r=await soe({table:"hdb_user",schema:"system",hash_values:[e.username]});return kw.debug(r),await bl(),Fw.signalUserChange(new Gw(process.pid)),`${e.username} successfully deleted`}o(coe,"dropUser");async function loe(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=xw.cloneDeep(e.hdb_user);let r=await Sp.searchByHash({schema:"system",table:"hdb_role",hash_values:[t.role.id],get_attributes:["*"]});return t.role=r[0],delete t.password,delete t.refresh_token,delete t.hash,delete t.hash_function,t}o(loe,"userInfo");async function uoe(){let e=await Hg();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}o(uoe,"listUsersExternal");async function Hg(){let e=await Sp.searchByValue({schema:"system",table:"hdb_role",value:"*",attribute:"role",get_attributes:["*"]}),t={};for(let s of e)t[s.id]=xw.cloneDeep(s);if(Object.keys(t).length===0)return null;let r=await Sp.searchByValue({schema:"system",table:"hdb_user",value:"*",attribute:"username",get_attributes:["*"]}),n=new Map;for(let s of r)s=xw.cloneDeep(s),s.role=t[s.role],doe(s.role),n.set(s.username,s);return n}o(Hg,"listUsers");function doe(e){if(!e){kw.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(toe)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}o(doe,"appendSystemTablesToRole");async function bl(e=void 0){e?to=e:to=await Hg()}o(bl,"setUsersWithRolesCache");async function foe(){return to||await bl(),to}o(foe,"getUsersWithRolesCache");async function qw(e,t,r=!0){to||await bl();let n=to.get(e);if(!n){if(!r)return{username:e};throw new pi(vw.GENERIC_AUTH_FAIL,Vo.UNAUTHORIZED)}if(n&&!n.active)throw new pi(vw.USER_INACTIVE,Vo.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(xH.get(t)===n.password)return s;{let i=gp.validate(n.password,t,n.hash_function||gp.HASH_FUNCTION.MD5);if(i?.then&&(i=await i),i===!0)xH.set(t,n.password);else throw new pi(vw.GENERIC_AUTH_FAIL,Vo.UNAUTHORIZED)}}return s}o(qw,"findAndValidateUser");async function moe(){to||await bl();for(let[,e]of to)if(e.role.role==="super_user")return e}o(moe,"getSuperUser");async function poe(){let e=await Hg(),t=Zie.getConfigFromFile(Uw.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==Uw.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=Hw.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+UH.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+UH.SERVER_SUFFIX.ADMIN,r}o(poe,"getClusterUser");var YH=[];kg.invalidateUser=function(e){for(let t of YH)try{t(e)}catch(r){noe.error("Error invalidating user",r)}};kg.onInvalidatedUser=function(e){YH.push(e)}});var Ie,cd=se(()=>{Ie={HEALTHY:"healthy",WARNING:"warning",ERROR:"error",UNKNOWN:"unknown",LOADING:"loading"}});var ld,$w=se(()=>{cd();ld=class{static{o(this,"ComponentStatus")}lastChecked;status;message;error;constructor(t,r,n){this.lastChecked=new Date,this.status=t,this.message=r,this.error=n}updateStatus(t,r){this.status=t,this.message=r,this.lastChecked=new Date,t!==Ie.ERROR&&(this.error=void 0)}markHealthy(t){this.updateStatus(Ie.HEALTHY,t||"Component is healthy")}markError(t,r){this.status=Ie.ERROR,this.error=t,this.message=r||(typeof t=="string"?t:t.message),this.lastChecked=new Date}markWarning(t){this.updateStatus(Ie.WARNING,t)}markLoading(t){this.updateStatus(Ie.LOADING,t||"Component is loading")}isHealthy(){return this.status===Ie.HEALTHY}hasError(){return this.status===Ie.ERROR}isLoading(){return this.status===Ie.LOADING}hasWarning(){return this.status===Ie.WARNING}getSummary(){let t=this.status.toUpperCase(),r=this.message?`: ${this.message}`:"";return`${t}${r}`}}});var Al,Ja,Vw,ud,Kw,dd,Yw,Gg=se(()=>{Al=b(zr()),Ja=class extends Error{static{o(this,"ComponentStatusError")}statusCode;timestamp;constructor(t,r=Al.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR){super(t),this.name="ComponentStatusError",this.statusCode=r,this.timestamp=new Date,Error.captureStackTrace(this,this.constructor)}},Vw=class extends Ja{static{o(this,"CrossThreadTimeoutError")}requestId;timeoutMs;collectedCount;constructor(t,r,n){super(`Component status collection timeout after ${r}ms. Collected ${n} responses for request ${t}.`,Al.HTTP_STATUS_CODES.GATEWAY_TIMEOUT),this.name="CrossThreadTimeoutError",this.requestId=t,this.timeoutMs=r,this.collectedCount=n}},ud=class extends Ja{static{o(this,"ITCError")}operation;cause;constructor(t,r){super(`Inter-thread communication failed during ${t}: ${r?.message||"Unknown error"}`,Al.HTTP_STATUS_CODES.SERVICE_UNAVAILABLE),this.name="ITCError",this.operation=t,this.cause=r}},Kw=class extends Ja{static{o(this,"AggregationError")}componentCount;cause;constructor(t,r){super(`Failed to aggregate status for ${t} components: ${r?.message||"Unknown error"}`,Al.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="AggregationError",this.componentCount=t,this.cause=r}},dd=class extends Ja{static{o(this,"ComponentStatusOperationError")}componentName;operation;constructor(t,r,n){super(`Component '${t}' ${r} failed: ${n}`,Al.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="ComponentStatusOperationError",this.componentName=t,this.operation=r}},Yw=class extends Ja{static{o(this,"CrossThreadCollectionError")}result;constructor(t){let r=t.success?`Partial collection success: ${t.collectedFromThreads} threads responded`+(t.timedOutThreads.length>0?`, ${t.timedOutThreads.length} timed out`:""):`Collection failed: ${t.errors.map(n=>n.message).join(", ")}`;super(r,Al.HTTP_STATUS_CODES.OK),this.name="CrossThreadCollectionError",this.result=t}getDiagnostics(){let t=[`Cross-thread collection ${this.result.success?"partially succeeded":"failed"}`,`Threads responded: ${this.result.collectedFromThreads}`];return this.result.expectedThreads&&t.push(`Expected threads: ${this.result.expectedThreads}`),this.result.timedOutThreads.length>0&&t.push(`Timed out threads: ${this.result.timedOutThreads.join(", ")}`),this.result.errors.length>0&&(t.push("Errors:"),this.result.errors.forEach((r,n)=>{t.push(` ${n+1}. ${r.name}: ${r.message}`)})),t.join(`
16
- `)}}});var WH,Il,zH,Xa,Tp,fd,hoe,qg,Ww=se(()=>{WH=b(is()),Il=b(nt());q();zH=b(Zn());cd();Gg();Xa=(0,zH.loggerWithTag)("componentStatus.crossThread"),Tp=class{static{o(this,"CrossThreadStatusCollector")}awaitingResponses=new Map;responseCheckers=new Map;nextRequestId=1;listenerAttached=!1;timeout;cleanupTimer=null;constructor(t=5e3){this.timeout=t}attachListener(){this.listenerAttached||((0,Il.onMessageByType)(e_.COMPONENT_STATUS_RESPONSE,({message:t})=>{let r=t.isMainThread?"main":`worker-${t.workerIndex}`;Xa.trace?.("Received component status response from %s, with requestId: %d",r,t.requestId);let n=this.awaitingResponses.get(t.requestId);if(n){n.push({workerIndex:t.workerIndex,isMainThread:t.isMainThread||!1,statuses:t.statuses||[]});let s=this.responseCheckers.get(t.requestId);s&&s()}}),this.listenerAttached=!0)}scheduleCleanup(){this.cleanupTimer&&clearTimeout(this.cleanupTimer),this.awaitingResponses.size>0&&(this.cleanupTimer=setTimeout(()=>{this.awaitingResponses.size>0&&(Xa.debug?.(`Cleaning up ${this.awaitingResponses.size} stale pending requests`),this.awaitingResponses.clear()),this.cleanupTimer=null},3e4))}async collect(t){try{this.attachListener(),this.scheduleCleanup();let r=this.nextRequestId++,n=[];this.awaitingResponses.set(r,n);let a=((0,Il.getWorkerCount)()||1)+1-1,l=await new Promise((p,h)=>{let E=!1,g=o(()=>{let y=this.awaitingResponses.get(r);y&&y.length>=a&&!E&&(E=!0,S(),Xa.trace?.(`Collected all ${y.length} expected responses for request ${r}`),p(y))},"checkComplete"),R=setTimeout(()=>{if(!E){E=!0;let y=this.awaitingResponses.get(r)||[];this.awaitingResponses.delete(r),Xa.debug?.(`Collection timeout for request ${r}: collected ${y.length}/${a} responses`),p(y)}},this.timeout),S=o(()=>{this.awaitingResponses.delete(r),clearTimeout(R)},"cleanup");this.responseCheckers.set(r,g),(0,WH.sendItcEvent)({type:e_.COMPONENT_STATUS_REQUEST,message:{requestId:r}}).then(()=>{g()}).catch(y=>{E=!0,S(),this.responseCheckers.delete(r),h(new ud("sendItcEvent",y))})});this.responseCheckers.delete(r);let u=new Map,d=t.getAllStatuses(),f=(0,Il.getWorkerIndex)(),m=f===void 0?"main":`worker-${f}`;for(let[p,h]of d)u.set(`${p}@${m}`,{...h,workerIndex:f});for(let p of l)for(let[h,E]of p.statuses){let g=p.isMainThread?"main":`worker-${p.workerIndex}`;u.set(`${h}@${g}`,{...E,workerIndex:p.workerIndex})}return Xa.debug?.(`Collected component status from ${l.length+1} threads (including local)`),u}catch(r){return r instanceof ud?Xa.error?.(`ITC failure during component status collection: ${r.message}`):Xa.warn?.("Failed to collect component status from all threads:",r),Xa.debug?.(`Collection failed for request. Error: ${r instanceof Error?r.message:"Unknown error"}`),this.getLocalStatusOnly(t)}}getLocalStatusOnly(t){let r=t.getAllStatuses(),n=new Map,s=(0,Il.getWorkerIndex)(),i=s===void 0?"main":`worker-${s}`;for(let[a,c]of r)n.set(`${a}@${i}`,{...c,workerIndex:s});return n}cleanup(){this.awaitingResponses.clear(),this.responseCheckers.clear(),this.cleanupTimer&&(clearTimeout(this.cleanupTimer),this.cleanupTimer=null)}},fd=class{static{o(this,"StatusAggregator")}static aggregate(t){let r=new Map,n=new Map;for(let[s,i]of t){let a=s.indexOf("@"),c=a!==-1?s.substring(0,a):s,l=n.get(c);l||(l=[],n.set(c,l)),l.push([s,i])}for(let[s,i]of n){let a=this.aggregateComponentGroup(s,i);r.set(s,a)}return r}static aggregateComponentGroup(t,r){let n={workers:{}},s=0,i,a,c=new Map,l=new Map;for(let[m,p]of r){let h=m.lastIndexOf("@"),E=h!==-1?m.substring(h+1):"",g=p.lastChecked instanceof Date?p.lastChecked.getTime():new Date(p.lastChecked).getTime();if(E==="main")n.main=g;else if(E&&E.startsWith("worker-")){let R=parseInt(E.substring(7));isNaN(R)||(n.workers[R]=g)}c.set(p.status,(c.get(p.status)||0)+1),p.status!==Ie.HEALTHY&&p.message&&(!i||g>s)&&(s=g,i=p.message),p.error&&!a&&(a=p.error)}let u=this.determineOverallStatus(c);if(Array.from(c.keys()).length>1)for(let[m,p]of r)p.status!==u&&l.set(m,{workerIndex:p.workerIndex!==void 0?p.workerIndex:-1,status:p.status,message:p.message,error:p.error});let f={componentName:t,status:u,lastChecked:n,latestMessage:i,error:a};return l.size>0&&(f.abnormalities=l),f}static determineOverallStatus(t){let r=[Ie.ERROR,Ie.WARNING,Ie.LOADING,Ie.UNKNOWN,Ie.HEALTHY];for(let n of r)if(t.has(n)&&t.get(n)>0)return n;return Ie.UNKNOWN}},hoe=parseInt(process.env.COMPONENT_STATUS_TIMEOUT||"5000"),qg=new Tp(hoe)});var Za,$g=se(()=>{$w();cd();Ww();Gg();Za=class e{static{o(this,"ComponentStatusRegistry")}statusMap=new Map;reset(){this.statusMap=new Map}setStatus(t,r,n,s){if(!t||typeof t!="string")throw new dd(String(t),"setStatus","Component name must be a non-empty string");if(!Object.values(Ie).includes(r))throw new dd(t,"setStatus",`Invalid status level: ${r}. Must be one of: ${Object.values(Ie).join(", ")}`);this.statusMap.set(t,new ld(r,n,s))}getStatus(t){return this.statusMap.get(t)}getAllStatuses(){return this.statusMap}reportHealthy(t,r){this.setStatus(t,Ie.HEALTHY,r)}reportError(t,r,n){this.setStatus(t,Ie.ERROR,n,r)}reportWarning(t,r){this.setStatus(t,Ie.WARNING,r)}initializeLoading(t,r){this.setStatus(t,Ie.LOADING,r||"Component is loading")}markLoaded(t,r){this.setStatus(t,Ie.HEALTHY,r||"Component loaded successfully")}markFailed(t,r,n){this.setStatus(t,Ie.ERROR,n,r)}getComponentsByStatus(t){let r=[];for(let[n,s]of this.statusMap)s.status===t&&r.push({name:n,status:s});return r}getStatusSummary(){let t={[Ie.HEALTHY]:0,[Ie.ERROR]:0,[Ie.WARNING]:0,[Ie.LOADING]:0,[Ie.UNKNOWN]:0};for(let r of this.statusMap.values())t[r.status]++;return t}static async getAggregatedFromAllThreads(t){let r=await qg.collect(t);return fd.aggregate(r)}async getAggregatedStatusFor(t,r){r||(r=await e.getAggregatedFromAllThreads(this));let n=[],s=t+".",i=r.get(t);i&&n.push({key:t,...i});for(let[f,m]of r)f.startsWith(s)&&n.push({key:f,...m});if(n.length===0)return{status:Ie.UNKNOWN,message:"The component has not been loaded yet (may need a restart)",lastChecked:{workers:{}}};let a=n.some(f=>f.status===Ie.ERROR),c=n.some(f=>f.status===Ie.LOADING),l=a?Ie.ERROR:c?Ie.LOADING:Ie.HEALTHY,u="All components loaded successfully",d={};if(a||c){u=n.filter(m=>m.status===Ie.ERROR||m.status===Ie.LOADING).map(m=>`${m.key}: ${m.latestMessage||m.status}`).join("; ");for(let m of n)m.status!==Ie.HEALTHY&&(d[m.key]={status:m.status,message:m.latestMessage})}return{status:l,message:u,...Object.keys(d).length>0&&{details:d},lastChecked:n[0]?.lastChecked||{workers:{}}}}}});var mr,Vg=se(()=>{$g();mr=new Za});function QH(e){let t=jH.get(e);return t||(t=new zw(e),jH.set(e,t)),t}function JH(){mr.reset()}var zw,jH,ro,XH,ZH=se(()=>{Vg();cd();zw=class{static{o(this,"ComponentStatusBuilder")}componentName;constructor(t){this.componentName=t}healthy(t){return mr.setStatus(this.componentName,Ie.HEALTHY,t),this}warning(t){return mr.setStatus(this.componentName,Ie.WARNING,t),this}error(t,r){return mr.setStatus(this.componentName,Ie.ERROR,t,r),this}loading(t){return mr.setStatus(this.componentName,Ie.LOADING,t||"Loading..."),this}unknown(t){return mr.setStatus(this.componentName,Ie.UNKNOWN,t),this}get(){return mr.getStatus(this.componentName)}},jH=new Map;o(QH,"statusForComponent");ro={loading(e,t){mr.initializeLoading(e,t)},loaded(e,t){mr.markLoaded(e,t)},failed(e,t,r){mr.markFailed(e,t,r)}};o(JH,"reset");XH=Ie});var yp={};Re(yp,{AggregationError:()=>Kw,COMPONENT_STATUS_LEVELS:()=>Ie,ComponentStatus:()=>ld,ComponentStatusError:()=>Ja,ComponentStatusOperationError:()=>dd,ComponentStatusRegistry:()=>Za,CrossThreadCollectionError:()=>Yw,CrossThreadStatusCollector:()=>Tp,CrossThreadTimeoutError:()=>Vw,ITCError:()=>ud,StatusAggregator:()=>fd,componentStatusRegistry:()=>mr,crossThreadCollector:()=>qg,query:()=>Eoe});var Eoe,eG=se(()=>{Vg();$g();$w();$g();Ww();Vg();Gg();cd();Eoe={get(e){return mr.getStatus(e)},all(){return mr.getAllStatuses()},byStatus(e){return mr.getComponentsByStatus(e)},summary(){return mr.getStatusSummary()},async allThreads(){return Za.getAggregatedFromAllThreads(mr)}}});var jw={};Re(jw,{STATUS:()=>XH,internal:()=>yp,lifecycle:()=>ro,reset:()=>JH,statusForComponent:()=>QH});var Rp=se(()=>{ZH();eG()});var Ap=v((XDe,nG)=>{"use strict";var ms=Q(),gn=(q(),M(z)),_oe=R0(),goe=fs(),{validateEvent:Qw}=is(),bp=cs(),Soe=require("process"),{resetDatabases:Toe}=(we(),M(ft)),yoe={[gn.ITC_EVENT_TYPES.SCHEMA]:Roe,[gn.ITC_EVENT_TYPES.USER]:rG,[gn.ITC_EVENT_TYPES.COMPONENT_STATUS_REQUEST]:Aoe};async function Roe(e){let t=Qw(e);if(t){ms.error(t);return}ms.trace("ITC schemaHandler received schema event:",e),await _oe(e.message),await boe(e.message)}o(Roe,"schemaHandler");async function boe(e){try{bp.resetReadTxn(gn.SYSTEM_SCHEMA_NAME,gn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),bp.resetReadTxn(gn.SYSTEM_SCHEMA_NAME,gn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),bp.resetReadTxn(gn.SYSTEM_SCHEMA_NAME,gn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=Toe();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){ms.error(t)}}o(boe,"syncSchemaMetadata");var tG=[];async function rG(e){try{try{bp.resetReadTxn(gn.SYSTEM_SCHEMA_NAME,gn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),bp.resetReadTxn(gn.SYSTEM_SCHEMA_NAME,gn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){ms.warn(r)}let t=Qw(e);if(t){ms.error(t);return}ms.trace(`ITC userHandler ${gn.HDB_ITC_CLIENT_PREFIX}${Soe.pid} received user event:`,e),await goe.setUsersWithRolesCache();for(let r of tG)r()}catch(t){ms.error(t)}}o(rG,"userHandler");rG.addListener=function(e){tG.push(e)};async function Aoe(e){try{let t=Qw(e);if(t){ms.error(t);return}ms.trace("ITC componentStatusRequestHandler received request:",e);let{internal:r}=(Rp(),M(jw)),{getWorkerIndex:n}=nt(),{sendItcEvent:s}=is(),i=r.componentStatusRegistry.getAllStatuses(),a=Array.from(i.entries()),c=n(),l=c===void 0,u=e.message.originator,d={type:gn.ITC_EVENT_TYPES.COMPONENT_STATUS_RESPONSE,message:{requestId:e.message.requestId,statuses:a,workerIndex:c,isMainThread:l}};u!==void 0&&threads.sendToThread(u,d)?ms.trace(`Sent component status response directly to thread ${u}`):(u===void 0?ms.debug("No originator threadId, falling back to broadcast"):ms.warn(`Failed to send direct response to thread ${u}, falling back to broadcast`),await s(d))}catch(t){ms.error("Error handling component status request:",t)}}o(Aoe,"componentStatusRequestHandler");nG.exports=yoe});var is=v((sMe,iG)=>{"use strict";var eMe=Q(),Jw=ae(),Ioe=(q(),M(z)),{ITC_ERRORS:Ip}=zr(),{parentPort:tMe,threadId:woe,isMainThread:Noe,workerData:rMe}=require("worker_threads"),{onMessageFromWorkers:Coe,broadcast:nMe,broadcastWithAcknowledgement:Ooe}=nt();iG.exports={sendItcEvent:Poe,validateEvent:sG,SchemaEventMsg:Loe,UserEventMsg:Doe};var Kg;Coe(async(e,t)=>{Kg=Kg||Ap(),sG(e),Kg[e.type]&&await Kg[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function Poe(e){return!Noe&&e.message&&(e.message.originator=woe),Ooe(e)}o(Poe,"sendItcEvent");function sG(e){if(typeof e!="object")return Ip.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||Jw.isEmpty(e.type))return Ip.MISSING_TYPE;if(!e.hasOwnProperty("message")||Jw.isEmpty(e.message))return Ip.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||Jw.isEmpty(e.message.originator))return Ip.MISSING_ORIGIN;if(Ioe.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return Ip.INVALID_EVENT(e.type)}o(sG,"validateEvent");function Loe(e,t,r,n=void 0,s=void 0){this.originator=e,this.operation=t,this.schema=r,this.table=n,this.attribute=s}o(Loe,"SchemaEventMsg");function Doe(e){this.originator=e}o(Doe,"UserEventMsg")});var Ho=v((aMe,lG)=>{"use strict";var oG=(q(),M(z)),oMe=ae(),Yg=Q(),aG=s0(),md,{sendItcEvent:cG}=is();function Moe(e){try{Yg.debug("signalSchemaChange called with message:",e),md=md||Ap();let t=new aG(oG.ITC_EVENT_TYPES.SCHEMA,e);return md.schema(t),cG(t)}catch(t){Yg.error(t)}}o(Moe,"signalSchemaChange");function voe(e){try{Yg.trace("signalUserChange called with message:",e),md=md||Ap();let t=new aG(oG.ITC_EVENT_TYPES.USER,e);return md.user(t),cG(t)}catch(t){Yg.error(t)}}o(voe,"signalUserChange");lG.exports={signalSchemaChange:Moe,signalUserChange:voe}});function wp(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 uG(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new Fs(e));for(let[r,n]of t)e.has(r)?r.toLowerCase()==="set-cookie"&&e.append?.(r,n,!0):e.set(r,n);return e}var Fs,Np=se(()=>{Fs=class extends Map{static{o(this,"Headers")}constructor(t){if(t)if(t[Symbol.iterator])super(t);else{super();for(let r in t)this.set(r,t[r])}else super()}set(t,r){return typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r),super.set(t.toLowerCase(),[t,r])}get(t){return typeof t!="string"&&(t=""+t),super.get(t.toLowerCase())?.[1]}has(t){return typeof t!="string"&&(t=""+t),super.has(t.toLowerCase())}setIfNone(t,r){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let n=t.toLowerCase();if(!super.has(n))return super.set(n,[t,r])}append(t,r,n){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let s=t.toLowerCase(),i=super.get(s);if(i){let a=i[1];if(n)r=(typeof a=="string"?a:a.join(", "))+", "+r;else if(typeof a=="string")r=[a,r];else{a.push(r);return}}return super.set(s,[t,r])}[Symbol.iterator](){return super.values()[Symbol.iterator]()}};o(wp,"appendHeader");o(uG,"mergeHeaders")});function Wg(e,t,r=xoe){let n;return function(...i){return n?n.length*Xw>r?t(...i):new Promise((a,c)=>{n.push({args:i,fn(){try{let l=e(...i);a(l)}catch(l){c(l)}}})}):(n=[],s(performance.now(),i),e(...i))};function s(i,a){setImmediate(()=>{let c=performance.now();Xw=(Xw*4+c-i)/5;let l=n.shift();if(l){let{args:u,fn:d}=l;d(),s(c,u)}else n=null})}}var mG,Uoe,xoe,dG,Boe,Zw,fG,Xw,eN=se(()=>{mG=b(Zn()),Uoe=3e3,xoe=2e4,dG=0,Boe=3e4,Zw=3e3,fG=performance.now()+Zw,Xw=0;o(Wg,"throttle");setInterval(()=>{let e=performance.now();e-fG-Zw>Uoe&&dG+Boe<e&&(mG.default.warn?.("JavaScript execution has taken too long and is not allowing proper event queue cycling, consider using 'await new Promise(setImmediate)' in code that will execute for a long duration"),dG=e),fG=e},Zw).unref()});var AG={};Re(AG,{EVICTED:()=>Ha,INVALIDATED:()=>Un,coerceType:()=>jg,makeTable:()=>Jg});function Jg(e){let{primaryKey:t,indices:r,tableId:n,tableName:s,primaryStore:i,databasePath:a,databaseName:c,auditStore:l,schemaDefined:u,dbisDB:d,sealed:f,splitSegments:m,replicate:p}=e,{expirationMS:h,evictionMS:E,audit:g,trackDeletes:R}=e;E??=0;let{attributes:S}=e;S||(S=[]);let y=OA(i,n,l),C,I,k={},J=Promise.resolve(),G,H,X;for(let K of S)(K.assignCreatedTime||K.name==="__createdtime__")&&(G=K),(K.assignUpdatedTime||K.name==="__updatedtime__")&&(H=K),K.expiresAt&&(X=K),K.isPrimaryKey&&(k=K);let W,ue=[],ce=[],te=1,ye=2,Ae={},Ye={},qe=864e5,Ar=0,tr,Wr,vr,_u=!1,Fc,xt,ri,Na=Nl.get(F.REPLICATION_DATABASES);if(Array.isArray(Na)){for(let K of Na)if(K.name===c&&K.replicateTo>=0){ri=K.replicateTo;break}}let GE=i.getRange({start:!1,end:!1}).constructor,jf=10,qE=6;g&&em(),Cm(i.env.path,K=>{if(I)return Oa(K)});class Qf extends ml{static{o(this,"Updatable")}getUpdatedTime(){return Fa.get(this.getRecord())?.version}getExpiresAt(){return Fa.get(this.getRecord())?.expiresAt}addTo(_,T){if(typeof T=="number"||typeof T=="bigint")this.set(_,new ap(T));else throw new Error("Can not add or subtract a non-numeric value")}subtractFrom(_,T){return this.addTo(_,-T)}}class Pe extends Hr{#e;#t;#r;#n;#s;#i;static name=s;static primaryStore=i;static auditStore=l;static primaryKey=t;static tableName=s;static tableId=n;static indices=r;static audit=g;static databasePath=a;static databaseName=c;static attributes=S;static replicate=p;static sealed=f;static splitSegments=m??!0;static createdTimeProperty=G;static updatedTimeProperty=H;static propertyResolvers;static userResolvers={};static sources=[];static getResidencyById;static get expirationMS(){return h}static dbisDB=d;static schemaDefined=u;static sourcedFrom(_,T){if(T&&(this.sourceOptions=T,(T.expiration||T.eviction||T.scanInterval)&&this.setTTLExpiration(T)),T?.intermediateSource)_.intermediateSource=!0,this.sources.unshift(_);else{if(this.sources.some(L=>!L.intermediateSource)){if(this.sources.some(L=>L.name===_.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(_)}I=I||_.get&&(!_.get.reliesOnPrototype||_.prototype.get),C=C||_.load;let N=o(L=>{let A=this.sources;if(A=A.filter(U=>U.intermediateSource&&U[L]&&(!U[L].reliesOnPrototype||U.prototype[L])),A.length>0)if(A.length===1){let U=A[0];return(w,D,$)=>{if(w?.source!==U)return U[L](D,$,w)}}else return(U,w,D)=>{let $=[];for(let Y of A){if(U?.source===Y)break;$.push(Y[L](w,D,U))}return Promise.all($)}},"getApplyToIntermediateSource"),P=this.sources[this.sources.length-1];P.intermediateSource&&(P={});let O=o(L=>{if(P[L]&&(!P[L].reliesOnPrototype||P.prototype[L]))return(A,U,w)=>{if(!A?.source)return P[L](U,w,A)}},"getApplyToCanonicalSource");Ae={put:O("put"),patch:O("patch"),delete:O("delete"),publish:O("publish")},Ye={put:N("put"),patch:N("patch"),delete:N("delete"),publish:N("publish"),invalidate:N("invalidate")};let x=P.shouldRevalidateEvents;return(async()=>{let L=!1,A,U=o(async(w,D)=>{let $=w.value,Y=w.table?De[c][w.table]:Pe;if(c===sm&&(w.table===bu.ROLE_TABLE_NAME||w.table===bu.USER_TABLE_NAME)&&(L=!0),w.id===void 0&&(w.id=$[Y.primaryKey],w.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(w));w.source=_;let j={residencyId:kc(w.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:w.nodeId,async:!0},B=w.id,Ee=await Y.getResource(B,D,j);switch(w.finished&&await w.finished,w.type){case"put":return x?Ee._writeInvalidate(B,$,j):Ee._writeUpdate(B,$,!0,j);case"patch":return x?Ee._writeInvalidate(B,$,j):Ee._writeUpdate(B,$,!1,j);case"delete":return Ee._writeDelete(B,j);case"publish":case"message":return Ee._writePublish(B,$,j);case"invalidate":return Ee._writeInvalidate(B,$,j);case"relocate":return Ee._writeRelocate(B,j);default:Fe.default.error?.("Unknown operation",w.type,w.id)}},"writeUpdate");try{let w=_.subscribe;w&&R==null&&(R=!0);let D={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},$=_.subscribeOnThisThread?_.subscribeOnThisThread((0,wl.getWorkerIndex)(),D):(0,wl.getWorkerIndex)()===0,Y=w&&$&&await _.subscribe?.(D);if(Y){let j;for await(let B of Y)try{if(!(B.type==="transaction"?B.writes[0]:B)){Fe.default.error?.("Bad subscription event",B);continue}if(B.source=_,B.type==="end_txn"){if(j?.resolve(),B.localTime&&A!==B.localTime){if(B.remoteNodeIds?.length>0){let pe=[Symbol.for("seq"),B.remoteNodeIds[0]],ne=d.get(pe),ie=ne?.nodes;ie||(ie=[]);for(let de of B.remoteNodeIds.slice(1)){let oe=ie.find(ke=>ke.id===de);ie=ie.filter(ke=>ke.id!==de||ke===oe),oe||(oe={id:de,seqId:0},ie.push(oe)),oe.seqId=Math.max(ne?.seqId??1,B.localTime),de===j?.nodeId&&(oe.lastTxnTime=B.timestamp)}let xe=Math.max(ne?.seqId??1,B.localTime);Fe.default.trace?.("Received txn",c,xe,new Date(xe),B.localTime,new Date(B.localTime),B.remoteNodeIds),d.put(pe,{seqId:xe,nodes:ie})}A=B.localTime}B.onCommit&&j?.committed.then(B.onCommit);continue}if(j)if(B.beginTxn)j.resolve();else{j.write_promises.push(U(B,j));continue}!B.timestamp&&B.version&&(B.timestamp=B.version);let fe=bt(B,()=>{if(B.type==="transaction"){let pe=[];for(let ne of B.writes)try{pe.push(U(ne,B))}catch(ie){throw ie.message+=" writing "+JSON.stringify(ne)+" of event "+JSON.stringify(B),ie}return Promise.all(pe)}else if(B.type==="define_schema"){let pe=this.attributes.slice(0),ne=!1;for(let ie of B.attributes)pe.find(xe=>xe.name===ie.name)||(pe.push(ie),ne=!0);ne&&(Ze({table:s,database:c,attributes:pe,origin:"cluster"}),Op.signalSchemaChange(new Pp.SchemaEventMsg(process.pid,V.CREATE_TABLE,c,s)))}else return B.beginTxn?(j=B,j.write_promises=[U(B,B)],new Promise(pe=>{j.resolve=()=>pe(Promise.all(j.write_promises))})):U(B,B)});j&&(j.committed=fe),L&&fe&&!fe?.waitingForUserChange&&(fe.then(()=>Op.signalUserChange(new Pp.UserEventMsg(process.pid))),fe.waitingForUserChange=!0),B.onCommit&&(fe?fe.then(B.onCommit):B.onCommit())}catch(Ee){Fe.default.error?.("error in subscription handler",Ee)}}}catch(w){Fe.default.error?.(w)}})(),this}static get isCaching(){return I}static get shouldRevalidateEvents(){return this.prototype.get!==Pe.prototype.get}static getResource(_,T,N){let P=super.getResource(_,T,N);if(this.loadAsInstance===!1&&(T._freezeRecords=!0),_!=null&&this.loadAsInstance!==!1){Ui(_);try{if(P.getRecord?.())return P;if(typeof _=="object"&&_&&!Array.isArray(_))throw new Error(`Invalid id ${JSON.stringify(_)}`);let O=!N?.async||i.cache?.get?.(_),x=Ur(T),L=x.getReadTxn();if(L?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return Io(_,T,{transaction:L,ensureLoaded:N?.ensureLoaded},O,A=>{if(A?Pe._updateResource(P,A):P.#e=null,T.onlyIfCached){if(!P.doesExist())throw new lt.ServerError("Entry is not cached",504)}else if(N?.ensureLoaded){let U=dn(_,A,T,P);if(U)return x?.disregardReadTxn(),P.#i=!0,T.loadedFromSource=!0,ks(U,w=>(Pe._updateResource(P,w),P))}return P})}catch(O){throw O.message.includes("Unable to serialize object")&&(O.message+=": "+JSON.stringify(_)),O}}return P}static _updateResource(_,T){_.#n=T,_.#e=T?.value??null,_.#r=T?.version}ensureLoaded(){let _=dn(this.getId(),this.#n,this.getContext());if(_)return this.#i=!0,this.getContext().loadedFromSource=!0,ks(_,T=>{this.#n=T,this.#e=T.value,this.#r=T.version})}static getNewId(){let _=k?.type;if(_==="String"||_==="ID")return super.getNewId();if(!xt){let O=i.getEntry(Symbol.for("id_allocation")),x=O?.value,L;if(x&&x.nodeName===server.hostname&&(!joe(i)||x.pid===process.pid)){let A=x.start,U=x.end;L=A;for(let w of i.getKeys({start:U,end:A,limit:1,reverse:!0}))L=w}else x=P(O?.version??null),L=x.start;xt=new BigInt64Array([BigInt(L)+1n]),xt=new BigInt64Array(i.getUserSharedBuffer("id",xt.buffer)),xt.maxSafeId=x.end}let T=Number(Atomics.add(xt,0,1n)),N=_==="Int"?512:1048576;if(T+N>=xt.maxSafeId){let O=o(x=>{xt.maxSafeId=T+(_==="Int"?1023:4194303);let L=(_==="Int"?Math.pow(2,31):Math.pow(2,49))-1,A=x?void 0:i.useReadTransaction(),U=Number(xt[0]);for(let $ of i.getKeys({start:U+1,end:L,limit:1,transaction:A}))L=$;A?.done();let{value:w,version:D}=i.getEntry(Symbol.for("id_allocation"));if(xt.maxSafeId<L){if(w.end>xt.maxSafeId-100)return;Fe.default.info?.("New id allocation",T,xt.maxSafeId,D),i.put(Symbol.for("id_allocation"),{start:w.start,end:xt.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),D)}else{Fe.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${xt.maxSafeId}, but id of ${L} detected`);let $=P(D);$.alreadyUpdated||Atomics.store(xt,0,BigInt($.start+1)),xt.maxSafeId=$.end}},"updateEnd");T+N===xt.maxSafeId?setImmediate(O):T+100>=xt.maxSafeId&&(Fe.default.warn?.(`Synchronous id allocation required on table ${s}${_=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>O(!0)))}return T;function P(O){let x=(_==="Int"?Math.pow(2,31):Math.pow(2,49))-1,L=x/4,A,U,w=!1,D,$;do{D=Math.floor(Math.random()*x),$={start:D,end:D+(_==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},A=0;for(let Y of i.getKeys({start:D,limit:1,reverse:!0}))A=Y;U=x;for(let Y of i.getKeys({start:D+1,end:x,limit:1}))U=Y;L*=.875,L<1e3&&!w&&(w=!0,Fe.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${_==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,D,A,U,L))}while(!(L<U-D&&(L<D-A||A===0)));return i.transactionSync(()=>{let Y=i.getEntry(Symbol.for("id_allocation"));return(Y?.version??null)==O?(Fe.default.info?.("Allocated new id range",$),i.put(Symbol.for("id_allocation"),$,Date.now()),$):(Fe.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...Y.value})})}}static setTTLExpiration(_){if(typeof _=="number")h=_*1e3,E||(E=0);else if(_&&typeof _=="object")h=_.expiration*1e3,E=(_.eviction||0)*1e3,qe=_.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(h<0)throw new Error("Expiration can not be negative");qe=qe||(h+E)/4,Oa()}static getResidencyRecord(_){return d.get([Symbol.for("residency_by_id"),_])}static setResidency(_){Pe.getResidency=_&&((T,N)=>{try{return _(T,N)}catch(P){throw P.message+=` in residency function for table ${s}`,P}})}static setResidencyById(_){Pe.getResidencyById=_&&(T=>{try{return _(T)}catch(N){throw N.message+=` in residency function for table ${s}`,N}})}static getResidency(_,T){if(Pe.getResidencyById)return Pe.getResidencyById(_[t]);let N=ri;if(T.replicateTo!=null){if(Array.isArray(T.replicateTo))return T.replicateTo.includes(server.hostname)?T.replicateTo:[server.hostname,...T.replicateTo];T.replicateTo>=0&&(N=T.replicateTo)}if(N>=0&&server.nodes){let P=[server.hostname];if(T.previousResidency)P.push(...T.previousResidency.slice(0,N));else{let O=server.nodes.map(A=>A.name),x=Math.floor(O.length*Math.random());P.push(...O.slice(x,x+N));let L=x+N-O.length;L>0&&P.push(...O.slice(0,L))}return P}}static enableAuditing(){g||(g=!0,em(),Pe.audit=!0)}static coerceId(_){return _===""?null:jg(_,k)}static async dropTable(){delete De[c][s];for(let _ of i.getRange({versions:!0,snapshot:!1,lazy:!0}))_.metadataFlags&Jr&&_.value&&Ua(_.value);if(c===a){for(let _ of S)d.remove(Pe.tableName+"/"+_.name),r[_.name]?.drop();d.remove(Pe.tableName+"/"),i.drop(),await d.committed}else console.log("legacy dropTable"),await i.close(),rN.default.unlinkSync(i.env.path);Op.signalSchemaChange(new Pp.SchemaEventMsg(process.pid,V.DROP_TABLE,c,s))}get(_){let T=this.constructor;if(typeof _=="string"&&T.loadAsInstance!==!1)return this.getProperty(_);if(Jf(_))return this.search(_);if(_&&_.id===void 0&&!_.toString()){let N={records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:S,recordCount:void 0,estimatedRecordRange:void 0};return this.getContext()?.includeExpensiveRecordCountEstimates?Pe.getRecordCount().then(P=>(N.recordCount=P.recordCount,N.estimatedRecordRange=P.estimatedRange,N)):N}if(_!==void 0&&T.loadAsInstance===!1){let N=this.getContext(),P=Ur(N),O=P.getReadTxn();if(O?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");let x=Os(_);Ui(x);let L=!0;return _.checkPermission&&(L=this.allowRead(N.user,_)),ks(ks(L,A=>{if(!A)throw new lt.AccessViolation(N.user);let U=!0;return Io(x,N,{transaction:O,ensureLoaded:U},!1,w=>{if(N.onlyIfCached){if(!w?.value)throw new lt.ServerError("Entry is not cached",504)}else if(U){let D=dn(x,w,N);if(D)return P?.disregardReadTxn(),N.loadedFromSource=!0,D.then($=>$?.value)}return w?.value})}),A=>{let U=_?.select;return U&&A!=null?Vu(U,this.constructor)(A):A})}if(_?.property)return this.getProperty(_.property);if(this.doesExist()||_?.ensureLoaded===!1||this.getContext()?.returnNonexistent)return this}allowRead(_,T){let N=On(_,T);if(N?.read){if(N.isSuperUser)return!0;let P=N.attribute_permissions,O=T?.select;if(P?.length>0||_u&&O){if(T||(T={}),O){let x=P?.length>0&&tN(P,"read");T.select=O.map(L=>{let A=L.name||L;if(!x||x[A]){let U=vr[A]?.definition?.tableClass;if(U){if(L.name||(L={name:L}),!L.checkPermission&&T.checkPermission&&(L.checkPermission=T.checkPermission),!U.prototype.allowRead.call(null,_,L))return!1;if(!L.select)return L.name}return L}}).filter(Boolean)}else T.select=P.filter(x=>x.read&&!vr[x.attribute_name]).map(x=>x.attribute_name);return T}else return!0}}allowUpdate(_,T,N){let P=On(_,N);if(P?.update){let O=P.attribute_permissions;if(O?.length>0){let x=tN(O,"update");for(let L in T)if(!x[L])return!1;for(let L of O){let A=L.attribute_name;!L.update&&!(A in T)&&(T[A]=this.getProperty(A))}}return Ca(this.getContext())}}allowCreate(_,T,N){if(this.isCollection){let P=On(_,N);if(P?.insert){let O=P.attribute_permissions;if(O?.length>0){let x=tN(O,"insert");for(let L in T)if(!x[L])return!1;return Ca(this.getContext())}else return Ca(this.getContext())}}else return this.allowUpdate(_,{})}allowDelete(_,T){return On(_,T)?.delete&&Ca(this.getContext())}update(_,T){let N,P=typeof T=="boolean"||T===void 0&&(_==null||typeof _=="object"&&!(_ instanceof URLSearchParams)),O=!1;P?(O=T,T=_,N=this.getId()):N=Os(_);let x=this.getContext();if(!Ur(x))throw new Error("Can not update a table resource outside of a transaction");if(T===!1)return this;if(typeof T=="object"&&T)if(O)Object.isFrozen(T)&&(T={...T}),this.#e={},this.#t=T;else if(P){let A=this.#t;A&&(T=Object.assign(A,T)),this.#t=T}else{let A=!0;if(_==null)throw new TypeError("Can not put a record without a target");return _.checkPermission&&(A=this.allowUpdate(x.user,T,_)),ks(A,U=>{if(!U)throw new lt.AccessViolation(x.user);return ks(i.get(Os(_)),w=>{let D=new Qf(w);return D._setChanges(T),this._writeUpdate(N,D.getChanges(),!1),D})})}return this._writeUpdate(N,this.#t,O),this}addTo(_,T){if(typeof T=="number"||typeof T=="bigint")this.#s===hG?this.set(_,(+this.getProperty(_)||0)+T):(this.#s||this.update(),this.set(_,new ap(T)));else throw new Error("Can not add a non-numeric value")}subtractFrom(_,T){if(typeof T=="number")return this.addTo(_,-T);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this.#n}getRecord(){return this.#e}getChanges(){return this.#t}_setChanges(_){this.#t=_}setRecord(_){this.#e=_}invalidate(_){let T=!0,N=this.getContext();return _?.checkPermission&&(T=this.allowDelete(N.user,_,N)),ks(T,P=>{if(!P)throw new lt.AccessViolation(N.user);this._writeInvalidate(_?Os(_):this.getId())})}_writeInvalidate(_,T,N){let P=this.getContext();Ui(_),Ur(this.getContext()).addWrite({key:_,store:i,invalidated:!0,entry:this.#n,before:Ae.invalidate?.bind(this,P,_),beforeIntermediate:yu(T,Ye.invalidate?.bind(this,P,_)),commit:o((x,L)=>{if(!(xr(x,L,N?.nodeId)<=0)){T??=null;for(let A in r)T||(T={}),T[A]===void 0&&(T[A]=this.getProperty(A));Fe.default.trace?.(`Invalidating entry in ${s} id: ${_}, timestamp: ${new Date(x).toISOString()}`),y(_,T,L,x,Un,g,{user:P?.user,residencyId:N?.residencyId,nodeId:N?.nodeId,tableToTrack:s},"invalidate")}},"commit")})}_writeRelocate(_,T){let N=this.getContext();Ui(_),Ur(this.getContext()).addWrite({key:_,store:i,invalidated:!0,entry:this.#n,before:Ae.relocate?.bind(this,N,_),beforeIntermediate:Ye.relocate?.bind(this,N,_),commit:o((O,x)=>{if(xr(O,x,T?.nodeId)<=0)return;let L=Pe.getResidencyRecord(T.residencyId),A=0,U=null,w=x?.value;if(L&&!L.includes(server.hostname)){for(let D in r)U||(U={}),U[D]=w[D];A=Un}else U=w;Fe.default.trace?.(`Relocating entry id: ${_}, timestamp: ${new Date(O).toISOString()}`),y(_,U,x,O,A,g,{user:N.user,residencyId:T.residencyId,nodeId:T.nodeId,expiresAt:T.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(_,T){let N={previousResidency:this.getResidencyRecord(_.residencyId),isRelocation:!0},P=Pa(this.getResidency(T.value,N)),O;if(P){if(!P.includes(server.hostname))return!1;O=kc(P)}let x=0;Fe.default.debug?.("Performing a relocate of an entry",existing_entry.key,T.value,P);let L=y(_.key,T.value,_,_.version,x,!0,{residencyId:O,expiresAt:T.expiresAt},"relocate",!1,null);return!0}static evict(_,T,N){let P=this.Source,O;if(!((I||g)&&(!T||(O=i.getEntry(_),!O||!T)||O.version!==N))){if(I){if(i.hasLock(_,O.version))return;let x;for(let L in r)x||(x={}),x[L]=T[L];if(x)return y(_,x,O,N,Ha,null,null,null,!0)}if(i.ifVersion(_,N,()=>{gu(_,T,null)}),g)return y(_,null,O,N,Ha,null,null,null,!0);nl(i,O??i.getEntry(_),N)}}lock(){throw new Error("Not yet implemented")}static operation(_,T){return _.table||=s,_.schema||=c,global.operation(_,T)}put(_,T){if(T===void 0||T instanceof URLSearchParams)this.update(_,!0);else{let N=!0;if(_==null)throw new TypeError("Can not put a record without a target");let P=this.getContext();return _.checkPermission&&(N=this.allowUpdate(P.user,T,_)),ks(N,O=>{if(!O)throw new lt.AccessViolation(P.user);if(Array.isArray(T))for(let x of T){let L=x[t];this._writeUpdate(L,x,!0)}else{let x=Os(_);this._writeUpdate(x,T,!0)}})}}create(_,T){let N=!0,P=this.getContext();if(!T&&!(_ instanceof URLSearchParams)&&(T=_,_=void 0),!T||typeof T!="object"||Array.isArray(T))throw new TypeError("Can not create a record without an object");return _?.checkPermission&&(N=this.allowCreate(P.user,T,_)),ks(N,O=>{if(!O)throw new lt.AccessViolation(P.user);let x=Os(_)??T[t];if(x===void 0)x=this.constructor.getNewId();else if(i.get(x))throw new lt.ClientError("Record already exists",409);return this._writeUpdate(x,T,!0),T})}patch(_,T){if(T===void 0||T instanceof URLSearchParams)this.update(_,!1);else{let N=this.update(_,T);if(N?.then)return N.then(()=>{})}}_writeUpdate(_,T,N,P){let O=this.getContext(),x=Ur(O);Ui(_);let L=this.#n??i.getEntry(_);this.#s=N?hG:Koe;let A=o(w=>N?w.put?()=>w.put(O,_,T):null:w.patch?()=>w.patch(O,_,T):w.put?()=>w.put(O,_,pl(this)):null,"writeToSources"),U={key:_,store:i,entry:L,nodeName:O?.nodeName,validate:o(w=>{T||(T=this.#t),N||T&&bg(this.#t===T?this:T)?O?.source||(x.checkOverloaded(),this.validate(T,!N),H&&(T[H.name]=H.type==="Date"?new Date(w):H.type==="String"?new Date(w).toISOString():w),N&&(t&&T[t]!==_&&(T[t]=_),G&&(L?.value?T[G.name]=L?.value[G.name]:T[G.name]=G.type==="Date"?new Date(w):G.type==="String"?new Date(w).toISOString():w),T=pl(T))):x.removeWrite(U)},"validate"),before:A(Ae),beforeIntermediate:yu(T,A(Ye)),commit:o((w,D,$)=>{if($){if(O&&D?.version>(O.lastModified||0)&&(O.lastModified=D.version),this.#n=D,D?.value&&D.value.getRecord)throw new Error("Can not assign a record to a record, check for circular references");N||(this.#e=D?.value??null)}this.#t=void 0,this.#r=w;let Y=D?.value,j;this.#s=0;let B=!1,Ee=xr(w,D,P?.nodeId),fe;if(Ee<=0){if(g){let de=D.localTime,oe=D.version;Fe.default.trace?.("Applying CRDT update to record with id: ",_,"txn time",new Date(w),"applying later update from:",new Date(oe),"local recorded time",new Date(de));let ke=[];for(;de>w||oe>=w&&de>0;){let Be=l.get(de);if(!Be)break;let Le=At(Be);if(oe=Le.version,oe>=w){if(oe===w){if(Ee=xr(w,{version:oe,localTime:de},P?.nodeId),Ee===0)return;if(Ee>0)continue}if(Le.type==="patch")ke.push(Le),fe=T;else if(Le.type==="put"||Le.type==="delete")return}de=Le.previousLocalTime}de||Fe.default.debug?.("No further audit history, applying incremental updates based on available history",_,"existing version preserved",D),ke.sort((Be,Le)=>Be.version-Le.version);for(let Be of ke){let Le=Be.getValue(i);if(Fe.default.debug?.("Rebuilding update with future patch:",new Date(Be.version),Le,Be),j=p_(j??T,Le,N),!j)return}}else{if(N)return;j=p_(j??T,Y,N),Fe.default.debug?.("Rebuilding update without audit:",j)}Fe.default.trace?.("Rebuilt record to save:",j," is full update:",N)}let pe;if(N&&!j?pe=T:this.constructor.loadAsInstance===!1?pe=pl(Y,j??T):(this.#e=Y,pe=pl(this,j??T)),this.#e=pe,pe&&pe.getRecord)throw new Error("Can not assign a record to a record, check for circular references");let ne;if(P?.residencyId!=null)ne=P.residencyId;else{L?.residencyId&&(O.previousResidency=Pe.getResidencyRecord(L.residencyId));let de=Pa(Pe.getResidency(pe,O));if(de&&!de.includes(server.hostname))if(fe??=pe,B=!0,Pe.getResidencyById)pe=void 0;else{pe=null;for(let oe in r)pe||(pe={}),pe[oe]=fe[oe]}ne=kc(de)}N||(fe=T);let ie=O?.expiresAt??(h?h+Date.now():-1);Fe.default.trace?.(`Saving record with id: ${_}, timestamp: ${new Date(w).toISOString()}${ie?", expires at: "+new Date(ie).toISOString():""}${D?", replaces entry from: "+new Date(D.version).toISOString():", new entry"}`,(()=>{try{return JSON.stringify(pe).slice(0,100)}catch{return""}})()),gu(_,Y,pe);let xe=N?"put":"patch";y(_,pe,D,w,B?Un:0,g,{omitLocalRecord:B,user:O?.user,residencyId:ne,expiresAt:ie,nodeId:P?.nodeId,originatingOperation:O?.originatingOperation,tableToTrack:c==="system"?null:s},xe,!1,fe),O.expiresAt&&Oa()},"commit")};x.addWrite(U)}async delete(_){if(Jf(_)){_.select=["$id"];for await(let T of this.search(_))this._writeDelete(T.$id);return!0}if(_){let T=!0,N=this.getContext();return _.checkPermission&&(T=this.allowDelete(N.user,_,N)),ks(T,P=>{if(!P)throw new lt.AccessViolation(N.user);let O=Os(_);return this._writeDelete(O),!0})}return this._writeDelete(this.getId()),!!this.#e}_writeDelete(_,T){let N=Ur(this.getContext());Ui(_);let P=this.getContext();return N.addWrite({key:_,store:i,entry:this.#n,nodeName:P?.nodeName,before:Ae.delete?.bind(this,P,_),beforeIntermediate:Ye.delete?.bind(this,P,_),commit:o((O,x,L)=>{let A=x?.value;L&&(P&&x?.version>(P.lastModified||0)&&(P.lastModified=x.version),Pe._updateResource(this,x)),!(xr(O,x,T?.nodeId)<=0)&&(gu(this.getId(),A),Fe.default.trace?.(`Deleting record with id: ${_}, txn timestamp: ${new Date(O).toISOString()}`),g||R?(y(_,null,x,O,0,g,{user:P?.user,nodeId:T?.nodeId,tableToTrack:s},"delete"),g||Oa()):nl(i,x))},"commit")}),!0}search(_){let T=this.getContext(),N=Ur(T);if(!_)throw new Error("No query provided");if(_.parseError)throw _.parseError;if(_.checkPermission&&!this.allowRead(T.user,_))throw new lt.AccessViolation(T.user);T&&(T.lastModified=Goe);let P=_.conditions;P?P.length===void 0&&(P=P[Symbol.iterator]?Array.from(P):[P]):P=Array.isArray(_)?_:_[Symbol.iterator]?Array.from(_):[];let O=_.id??this.getId();O&&(P=[{attribute:null,comparator:Array.isArray(O)?"prefix":"starts_with",value:O}].concat(P));let x,L={};function A(ie,xe){let de;switch(xe){case"and":case void 0:if(ie.length<1)throw new Error('An "and" operator requires at least one condition');de=!0;break;case"or":if(ie.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+xe)}for(let oe of ie){if(oe.conditions){oe.conditions=A(oe.conditions,oe.operator);continue}let ke=oe[0]??oe.attribute,Be=ke==null?k:$i(S,ke);if(Be)(Be.type||LA[oe.comparator])&&(oe[1]===void 0?oe.value=w(oe.value,Be):oe[1]=w(oe[1],Be));else if(ke!=null)throw(0,lt.handleHDBError)(new Error,`${ke} is not a defined attribute`,404);if(oe.chainedConditions)if(oe.chainedConditions.length===1&&(!oe.operator||oe.operator=="and")){let Le=oe.chainedConditions[0],Me,pt;if(Le.comparator==="gt"||Le.comparator==="greater_than"||Le.comparator==="ge"||Le.comparator==="greater_than_equal"?(Me=oe,pt=Le):(Me=Le,pt=oe),Me.comparator!=="lt"&&Me.comparator!=="less_than"&&Me.comparator!=="le"&&Me.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let wt=pt.comparator==="ge"||pt.comparator==="greater_than_equal",Et=Me.comparator==="le"||Me.comparator==="less_than_equal";oe.comparator=(wt?"ge":"gt")+(Et?"le":"lt"),oe.value=[pt.value,Me.value]}else throw new Error("Multiple chained conditions are not currently supported")}return ie}o(A,"prepareConditions");function U(ie,xe){if(_.enforceExecutionOrder)return ie;for(let de of ie)de.conditions&&(de.conditions=U(de.conditions,de.operator));return ie.length>1&&xe!=="or"?Foe(ie,X_(Pe)):ie}o(U,"orderConditions");function w(ie,xe){return Array.isArray(ie)?ie.map(de=>jg(de,xe)):jg(ie,xe)}o(w,"coerceTypedValues");let D=_.operator;(P.length>0||D)&&(P=A(P,D));let $=typeof _.sort=="object"&&_.sort,Y;if($&&D!=="or"){let ie=$.attribute;if(ie==null)throw new lt.ClientError("Sort requires an attribute");if(x=P.find(xe=>Gu(xe.attribute)===Gu(ie)),!x){let xe=$i(S,ie);if(!xe)throw(0,lt.handleHDBError)(new Error,`${Array.isArray(ie)?ie.join("."):ie} is not a defined attribute`,404);if(xe.indexed)x={...$,comparator:"sort"},P.push(x);else if(P.length===0&&!_.allowFullScan)throw(0,lt.handleHDBError)(new Error,`${Array.isArray(ie)?ie.join("."):ie} is not indexed and not combined with any other conditions`,404)}x&&(x.descending=!!$.descending)}P=U(P,D),$&&(x&&P[0]===x?$.next&&(Y={dbOrderedAttribute:$.attribute,attribute:$.next.attribute,descending:$.next.descending,next:$.next.next}):(x&&P.splice(P.indexOf(x),1),Y=$));let j=_.select;if(P.length===0&&(P=[{attribute:t,comparator:"greater_than",value:!0}]),_.explain)return{conditions:P,operator:D,postOrdering:Y,selectApplied:!!j};let B=N.useReadTxn(),Ee=DA(P,D,Pe,B,_,T,(ie,xe)=>Zf(ie,j,T,B,xe),L),fe=_.ensureLoaded!==!1,pe=Pe.transformEntryForSelect(j,T,B,L,fe,!0),ne=Pe.transformToOrderedSelect(Ee,j,Y,T,B,pe);return(_.offset||_.limit!==void 0)&&(ne=ne.slice(_.offset,_.limit!==void 0?(_.offset||0)+_.limit:void 0)),ne.onDone=()=>{ne.onDone=null,N.doneReadTxn()},ne.selectApplied=!0,ne.getColumns=()=>{if(j){let ie=[];for(let xe of j)xe==="*"?ie.push(...S.map(de=>de.name)):ie.push(xe.name||xe);return ie}return S.filter(ie=>!ie.computed&&!ie.relationship).map(ie=>ie.name)},ne}static transformToOrderedSelect(_,T,N,P,O,x){let L=new GE;if(N){_=Zf(_,T,P,O,null);let A;L.iterate=function(){let w,D=_[Symbol.asyncIterator]?_[Symbol.asyncIterator]():_[Symbol.iterator](),$,Y=N.dbOrderedAttribute,j,B,Ee=!0;function fe(ne){let ie=ne.next&&fe(ne.next),xe=ne.descending;return P.sort=ne,(de,oe)=>{let ke=Su(de,ne.attribute,P),Be=Su(oe,ne.attribute,P),Le=xe?(0,Cl.compareKeys)(Be,ke):(0,Cl.compareKeys)(ke,Be);return Le===0?ie?.(de,oe)||0:Le}}o(fe,"createComparator");let pe=fe(N);return{async next(){let ne;if(w)if(ne=w.next(),ne.done){if($)return L.onDone&&L.onDone(),ne}else return{value:await x.call(this,ne.value)};A=[],j&&A.push(j);do if(ne=await D.next(),ne.done){if($=!0,A.length)break;return L.onDone&&L.onDone(),ne}else{let ie=ne.value;if(ie?.then&&(ie=await ie),Y){let xe=Su(ie,Y,P);if(Ee)Ee=!1,B=xe;else if(xe!==B){B=xe,j=ie;break}}A.push(ie)}while(!0);return N.isGrouped,A.sort(pe),w=A[Symbol.iterator](),ne=w.next(),ne.done?(L.onDone&&L.onDone(),ne):{value:await x.call(this,ne.value)}},return(){return L.onDone&&L.onDone(),D.return()},throw(){return L.onDone&&L.onDone(),D.throw()}}};let U=o(w=>{if(typeof T=="object"&&Array.isArray(w.attribute))for(let D=0;D<T.length;D++){let $=T[D],Y;if($.name===w.attribute[0]){for(Y=$.sort||($.sort={});Y.next;)Y=Y.next;Y.attribute=w.attribute.slice(1),Y.descending=w.descending}else $===w.attribute[0]&&(T[D]=Y={name:$,sort:{attribute:w.attribute.slice(1),descending:w.descending}})}w.next&&U(w.next)},"applySortingOnSelect");U(N)}else L.iterate=(_[Symbol.asyncIterator]||_[Symbol.iterator]).bind(_),L=L.map(function(A){try{let U=x.call(this,A);return typeof U?.catch=="function"?U.catch(w=>{throw w.partialObject={[t]:A.key},w}):U}catch(U){throw U.partialObject={[t]:A.key},U}});return L}static transformEntryForSelect(_,T,N,P,O,x){let L;O&&I&&!(typeof _=="string"?[_]:_)?.every(w=>{let D;return typeof w=="object"?D=w.name:D=w,r[D]||D===t})&&(L=!0);let A,U=o(function(w){let D;if(T?.transaction?.stale&&(T.transaction.stale=!1),w!=null){if(D=w.deref?w.deref():w.value,!D&&(w.key===void 0||w.deref)||w.metadataFlags&Un){if(w.metadataFlags&Un&&T.replicateFrom===!1&&x&&w.residencyId)return tc.SKIP;if(w=Io(w.key??w,T,{transaction:N,lazy:_?.length<4,ensureLoaded:O},this?.isSync,$=>$),w?.then)return w.then(U.bind(this));D=w?.value}if(L&&w?.metadataFlags&(Un|Ha)||w?.expiresAt!=null&&w?.expiresAt<Date.now()){if(T.onlyIfCached)return{[t]:w.key,message:"This entry has expired"};let $=dn(w.key??w,w,T);if($?.then)return $.then(U)}}if(D==null)return x?tc.SKIP:D;if(_&&!(_[0]==="*"&&_.length===1)){let $,Y=o((B,Ee)=>{let fe;typeof B=="object"?fe=B.name:fe=B;let pe=vr?.[fe],ne;if(pe){let ie=P?.[fe];if(ie)if(ie.hasMappings){let de=pe.from?D[pe.from]:Gu(w.key);ne=ie.get(de),ne||(ne=[])}else ne=ie.fromRecord?.(D);else ne=pe(D,T,w,!0);let xe=o(de=>{if(pe.directReturn)return Ee(de,fe);if(de&&typeof de=="object"){let oe=pe.definition?.tableClass||Pe;A||(A={});let ke=A[fe]||(A[fe]=oe.transformEntryForSelect(fe===B?null:B.select||(Array.isArray(B)?B:null),T,N,ie,O));if(Array.isArray(de)){let Be=[],Le=oe.transformToOrderedSelect(de,B.select,typeof B.sort=="object"&&B.sort,T,N,ke)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),Me=o(wt=>{for(;!wt.done;){if(wt?.then)return wt.then(Me);Be.push(wt.value),wt=Le.next()}Ee(Be,fe)},"nextValue"),pt=Me(Le.next());pt&&($||($=[]),$.push(pt));return}else if(de=ke.call(this,de),de?.then){$||($=[]),$.push(de.then(Be=>Ee(Be,fe)));return}}Ee(de,fe)},"handleResolvedValue");ne?.then?($||($=[]),$.push(ne.then(xe))):xe(ne);return}else ne=D[fe],ne&&typeof ne=="object"&&fe!==B&&(ne=Pe.transformEntryForSelect(B.select||B,T,N,null)({value:ne}));Ee(ne,fe)},"selectAttribute"),j;if(typeof _=="string")Y(_,B=>{j=B});else if(Array.isArray(_))if(_.asArray)j=[],_.forEach((B,Ee)=>{B==="*"?_[Ee]=D:Y(B,fe=>j[Ee]=fe)});else{j={};let B=_.forceNulls;for(let Ee of _)if(Ee==="*")for(let fe in D)j[fe]=D[fe];else Y(Ee,(fe,pe)=>{fe===void 0&&B&&(fe=null),j[pe]=fe})}else throw new lt.ClientError("Invalid select"+_);return $?Promise.all($).then(()=>j):j}return D},"transform");return U}async subscribe(_){if(!l)throw new Error("Can not subscribe to a table without an audit log");g||Ze({table:s,database:c,schemaDefined:u,attributes:S,audit:!0}),_||(_={});let T=!_.rawEvents,N=[],P=kA(Pe,this.getId()??null,function(L,A,U,w){try{let D=A.getValue?.(i,T),$=A.type;if(!D&&$==="patch"&&T){let j=i.getEntry(L);j?.version===A.version?D=j.value:D=A.getValue?.(i,!0,U),$="put"}let Y={id:L,localTime:U,value:D,version:A.version,type:$,beginTxn:w};N?N.push(Y):(c!=="system"&&Ve(A.size??1,"db-message",s,null),this.send(Y))}catch(D){Fe.default.error?.(D)}},_.startTime||0,_),O=(async()=>{this.isCollection&&(P.includeDescendants=!0,_.onlyChildren&&(P.onlyChildren=!0)),_.supportsTransactions&&(P.supportsTransactions=!0);let L=this.getId(),A=_.previousCount;A>1e3&&(A=1e3);let U=_.startTime;if(this.isCollection){if(U){if(A)throw new lt.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:w,value:D}of l.getRange({start:U,exclusiveStart:!0,snapshot:!1})){let $=At(D);if($.tableId!==n)continue;let Y=$.recordId;if(L==null||SG(L,Y)){let j=$.getValue(i,T,w);if(x({id:Y,localTime:w,value:j,version:$.version,type:$.type,size:$.size}),P.queue?.length>_G&&await P.waitForDrain()===!1)return}P.startTime=w}}else if(A){let w=[];for(let{key:D,value:$}of l.getRange({start:"z",end:!1,reverse:!0}))try{let Y=At($);if(Y.tableId!==n)continue;let j=Y.recordId;if(L==null||SG(L,j)){let B=Y.getValue(i,T,D);if(w.push({id:j,localTime:D,value:B,version:Y.version,type:Y.type}),--A<=0)break}}catch(Y){Fe.default.error("Error getting history entry",D,Y)}for(let D=w.length;D>0;)x(w[--D]);w[0]&&(P.startTime=w[0].localTime)}else if(!_.omitCurrent){for(let{key:w,value:D,version:$,localTime:Y,size:j}of i.getRange({start:L??!1,end:L==null?void 0:[L,Cl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(D&&(x({id:w,localTime:Y,value:D,version:$,type:"put",size:j}),P.queue?.length>_G&&await P.waitForDrain()===!1))return}}else{A&&!U&&(U=0);let w=this.#n?.localTime;if(w===CA&&(i.cache?.delete(L),this.#n=i.getEntry(L),Fe.default.trace?.("re-retrieved record",w,this.#n?.localTime),w=this.#n?.localTime),Fe.default.trace?.("Subscription from",U,"from",L,w),U<w){let D=[],$=w;do{let Y=l.get($);if(Y){_.omitCurrent=!0;let j=At(Y),B=j.getValue(i,T,$);T&&(j.type="put"),D.push({id:L,value:B,localTime:$,...j}),$=j.previousLocalTime}else break;A&&A--}while($>U&&A!==0);for(let Y=D.length;Y>0;)x(D[--Y]);P.startTime=w}!_.omitCurrent&&this.doesExist()&&x({id:L,localTime:w,value:this.#e,version:this.#r,type:"put"})}for(let w of N)x(w);N=null})();function x(L){c!=="system"&&Ve(L.size??1,"db-message",s,null),P.send(L)}return o(x,"send"),_.listener&&P.on("data",_.listener),P}static subscribeOnThisThread(_,T){return _===0||T?.crossThreads===!1}doesExist(){return!!(this.#e||this.#s)}publish(_,T,N){if(T===void 0||T instanceof URLSearchParams)this._writePublish(this.getId(),_,T);else{let P=!0,O=this.getContext();return _.checkPermission&&(P=this.allowCreate(O.user,_,O)),ks(P,x=>{if(!x)throw new lt.AccessViolation(O.user);let L=Os(_);this._writePublish(L,T,N)})}}_writePublish(_,T,N){let P=Ur(this.getContext());_??=null,_!==null&&Ui(_);let O=this.getContext();P.addWrite({key:_,store:i,entry:this.#n,nodeName:O?.nodeName,validate:o(()=>{O?.source||(P.checkOverloaded(),this.validate(T))},"validate"),before:Ae.publish?.bind(this,O,_,T),beforeIntermediate:yu(T,Ye.publish?.bind(this,O,_,T)),commit:o((x,L,A)=>{L===void 0&&R&&!g&&Oa(),Fe.default.trace?.(`Publishing message to id: ${_}, timestamp: ${new Date(x).toISOString()}`),y(_,L?.value??null,L,L?.version||x,0,!0,{user:O?.user,residencyId:N?.residencyId,expiresAt:O?.expiresAt,nodeId:N?.nodeId,tableToTrack:s},"message",!1,T)},"commit")})}validate(_,T){let N,P=o((O,x,L)=>{if(x.type&&O!=null)if(T&&O.__op__&&(O=O.value),x.properties){typeof O!="object"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an object${x.type?" ("+x.type+")":""}`);let A=x.properties;for(let U=0,w=A.length;U<w;U++){let D=A[U];if(D.relationship||D.computed){_.hasOwnProperty(D.name)&&(N||(N=[])).push(`Computed property ${L}.${D.name} may not be directly assigned a value`);continue}let $=P(O[D.name],D,L+"."+D.name);$&&(O[D.name]=$)}if(x.sealed&&O!=null&&typeof O=="object")for(let U in O)A.find(w=>w.name===U)||(N||(N=[])).push(`Property ${U} is not allowed within object in property ${L}`)}else switch(x.type){case"Int":(typeof O!="number"||O>>0!==O)&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof O!="number"||!(Math.floor(O)===O&&Math.abs(O)<=9007199254740992))&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof O!="number"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a number`);break;case"ID":typeof O=="string"||O?.length>0&&O.every?.(A=>typeof A=="string")||(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a string, or an array of strings`);break;case"String":typeof O!="string"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a string`);break;case"Boolean":typeof O!="boolean"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a boolean`);break;case"Date":if(!(O instanceof Date)){if(typeof O=="string"||typeof O=="number")return new Date(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Date`)}break;case"BigInt":if(typeof O!="bigint"){if(typeof O=="string"||typeof O=="number")return BigInt(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a bigint`)}break;case"Bytes":if(!(O instanceof Uint8Array)){if(typeof O=="string")return Buffer.from(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Buffer or Uint8Array`)}break;case"Blob":if(!(O instanceof Ls)){if(typeof O=="string"&&(O=Buffer.from(O)),O instanceof Buffer)return createBlob(O,{type:"text/plain"});(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Blob`)}break;case"array":if(Array.isArray(O)){if(x.elements)for(let A=0,U=O.length;A<U;A++){let w=O[A],D=P(w,x.elements,L+"[*]");D&&(O[A]=D)}}else(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an Array`);break}x.nullable===!1&&O==null&&(N||(N=[])).push(`Property ${L} is required (and not does not allow null values)`)},"validateValue");for(let O=0,x=S.length;O<x;O++){let L=S[O];if(L.relationship||L.computed){Object.hasOwn(_,L.name)&&(N||(N=[])).push(`Computed property ${L.name} may not be directly assigned a value`);continue}if(!T||L.name in _){let A=P(_[L.name],L,L.name);A!==void 0&&(_[L.name]=A)}}if(f)for(let O in _)S.find(x=>x.name===O)||(N||(N=[])).push(`Property ${O} is not allowed`);if(N)throw new lt.ClientError(N.join(". "))}getUpdatedTime(){return this.#r}wasLoadedFromSource(){return I?!!this.#i:void 0}static async addAttributes(_){let T=S.slice(0);for(let N of _){if(!N.name)throw new lt.ClientError("Attribute name is required");if(N.name.match(/[`/]/))throw new lt.ClientError("Attribute names cannot include backticks or forward slashes");koe(N.name),T.push(N)}return Ze({table:s,database:c,schemaDefined:u,attributes:T}),Pe.indexingOperation}static async removeAttributes(_){let T=S.filter(N=>!_.includes(N.name));return Ze({table:s,database:c,schemaDefined:u,attributes:T}),Pe.indexingOperation}static getSize(){let _=i.getStats();return(_.treeBranchPageCount+_.treeLeafPageCount+_.overflowPages)*_.pageSize}static getAuditSize(){let _=l?.getStats();return _&&(_.treeBranchPageCount+_.treeLeafPageCount+_.overflowPages)*_.pageSize}static getStorageStats(){let _=i.env.path,T=rN.default.statfsSync?.(_)??{};return{available:T.bavail*T.bsize,free:T.bfree*T.bsize,size:T.blocks*T.bsize}}static async getRecordCount(_){let T=i.getStats().entryCount,N=1e3/2,P=performance.now(),O=Math.floor(T/2),x=_?.exactCount,L=0,A=0,U;for(let{value:w}of i.getRange({start:!0,lazy:!0,snapshot:!1}))if(w!=null&&L++,A++,await ec(),!x&&A<O&&performance.now()-P>N){U=A;break}if(U){let w=L;L=0;for(let{value:ne}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:U,snapshot:!1}))ne!=null&&L++,await ec();let D=U*2,$=(L+w)/D,Y=Math.pow((L-w+1)/U/2,2)+$*(1-$)/D,j=Math.max(Math.sqrt(Y)*T,1),B=Math.round($*T),Ee=Math.max(B-1.96*j,L+w),fe=Math.min(B+1.96*j,T),pe=Math.pow(10,Math.round(Math.log10(j)));return pe>B&&(pe=pe/10),L=Math.round(B/pe)*pe,{recordCount:L,estimatedRange:[Math.round(Ee),Math.round(fe)]}}return{recordCount:L}}static updatedAttributes(){vr=this.propertyResolvers={$id:o((_,T,N)=>({value:N.key}),"$id"),$updatedtime:o((_,T,N)=>N.version,"$updatedtime"),$updatedTime:o((_,T,N)=>N.version,"$updatedTime"),$expiresAt:o((_,T,N)=>N.expiresAt,"$expiresAt"),$record:o((_,T,N)=>N?{value:_}:_,"$record"),$distance:o((_,T,N)=>N&&(N.distance??T?.vectorDistances?.get(N)),"$distance")};for(let _ of this.attributes){_.isPrimaryKey&&(k=_),_.resolve=null;let T=_.relationship,N=_.computed;if(T)if(_.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),N&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),_u=!0,T.to)_.elements?.definition?(vr[_.name]=_.resolve=(P,O,x,L)=>{let A=P[T.from?T.from:t],U=_.elements.definition.tableClass;return L?Hu({attribute:T.to,value:A},Ur(O).getReadTxn(),!1,U,!1).map(w=>w&&w.key!==void 0?w:U.primaryStore.getEntry(w,{transaction:Ur(O).getReadTxn()})).asArray:U.search([{attribute:T.to,value:A}],O).asArray},_.set=()=>{},_.resolve.definition=_.elements.definition,_.resolve.to=T.to,T.from&&(_.resolve.from=T.from)):console.error(`The one-to-many/many-to-many relationship property "${_.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(T.from){let P=_.definition||_.elements?.definition;P?(vr[_.name]=_.resolve=(O,x,L,A)=>{let U=O[T.from];if(U===void 0)return;if(_.elements){let D,$=U?.map(Y=>{let j=P.tableClass.primaryStore[A?"getEntry":"get"](Y,{transaction:Ur(x).getReadTxn()});return j?.then&&(D=!0),Pe.loadAsInstance===!1&&Object.freeze(A?j?.value:j),j});return T.filterMissing?D?Promise.all($).then(Y=>Y.filter(TG)):$.filter(TG):D?Promise.all($):$}let w=P.tableClass.primaryStore[A?"getEntry":"get"](U,{transaction:Ur(x).getReadTxn()});return Pe.loadAsInstance===!1&&Object.freeze(A?w?.value:w),w},_.set=(O,x)=>{if(Array.isArray(x)){let L=x.map(A=>A.getId?.()||A[P.tableClass.primaryKey]);O[T.from]=L}else{let L=x.getId?.()||x[P.tableClass.primaryKey];O[T.from]=L}},_.resolve.definition=_.definition||_.elements?.definition,_.resolve.from=T.from):console.error(`The relationship property "${_.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${_.name}" in table "${s}" must use either "from" or "to" arguments`);else if(N)typeof N.from=="function"&&this.setComputedAttribute(_.name,N.from),vr[_.name]=_.resolve=(P,O,x)=>{let L=typeof N.from=="string"?P[N.from]:P,A=this.userResolvers[_.name];if(A)return A(L,O,x);Fe.default.warn(`Computed attribute "${_.name}" does not have a function assigned to it. Please use setComputedAttribute('${_.name}', resolver) to assign a resolver function.`),this.userResolvers[_.name]=()=>{}},_.resolve.directReturn=!0;else if(r[_.name]?.customIndex?.propertyResolver){let P=r[_.name].customIndex;vr[_.name]=(O,x,L)=>{let A=O[_.name];return P.propertyResolver(A,x,L)},vr[_.name].directReturn=!0}}cp(this,this),cp(Qf,this,!0);for(let _ of S){let T=_.name;_.resolve&&Object.defineProperty(i.encoder.structPrototype,T,{get(){return _.resolve(this,$u.getStore())},set(N){return _.set(this,N)},configurable:!0})}}static setComputedAttribute(_,T){let N=$i(S,_);if(!N){console.error(`The attribute "${_}" does not exist in the table "${s}"`);return}if(!N.computed){console.error(`The attribute "${_}" is not defined as computed in the table "${s}"`);return}this.userResolvers[_]=T}static async deleteHistory(_=0,T=!1){let N;for(let{key:P,value:O}of l.getRange({start:0,end:_}))await ec(),At(O).tableId===n&&(N=x_(l,P,O));if(T)for(let P of i.getRange({start:0,versions:!0})){let{key:O,value:x,localTime:L}=P;await ec(),x===null&&L<_&&(N=nl(i,P))}await N}static async*getHistory(_=0,T=1/0){for(let{key:N,value:P}of l.getRange({start:_||1,end:T})){await ec();let O=At(P);O.tableId===n&&(yield{id:O.recordId,localTime:N,version:O.version,type:O.type,value:O.getValue(i,!0,N),user:O.user,operation:O.originatingOperation})}}static async getHistoryOfRecord(_){let T=[];if(_==null)throw new Error("An id is required");let N=i.getEntry(_);if(!N)return T;let P=N.localTime;if(!P)throw new Error("The entry does not have a local audit time");let O=0;do{await ec();let x=l.get(P);if(x){let L=At(x);T.push({id:L.recordId,localTime:P,version:L.version,type:L.type,value:L.getValue(i,!0,P),user:L.user}),P=L.previousLocalTime}else break}while(O<1e3&&P);return T.reverse()}static cleanup(){W?.remove()}}let $E=Wg(async(K,_,T)=>{for(let N of Pe.sources)if(N.get&&(!N.get.reliesOnPrototype||N.prototype.get)){if(N.available?.(T)===!1)continue;_.source=N;let P=await N.get(K,_);if(P)return P}},()=>{throw new lt.ServerError("Service unavailable, exceeded request queue limit for resolving cache record",503)});Pe.updatedAttributes();let ab=Pe.prototype;return h&&Pe.setTTLExpiration(h/1e3),X&&VE(),Pe;function gu(K,_,T){let N;for(let P in r){let O=r[P],x=O.isIndexing,L=vr[P],A=T&&(L?L(T):T[P]),U=_&&(L?L(_):_[P]);if(A===U&&!x)continue;if(O.customIndex){O.customIndex.index(K,A,U);continue}N=!0;let w=O.indexNulls,D=(0,Cp.getIndexedValues)(A,w),$=(0,Cp.getIndexedValues)(U,w);if($?.length>0){let Y=new Set($);if(D=D?D.filter(j=>{if(Y.has(j))Y.delete(j);else return!0}):[],$=Array.from(Y),($.length>0||D.length>0)&&pG){let j=$.concat(D).map(B=>({key:B,value:K}));O.prefetch(j,gG)}for(let j=0,B=$.length;j<B;j++)O.remove($[j],K)}else D?.length>0&&pG&&O.prefetch(D.map(Y=>({key:Y,value:K})),gG);if(D)for(let Y=0,j=D.length;Y<j;Y++)O.put(D[Y],K)}return N}o(gu,"updateIndices");function Ui(K){switch(typeof K){case"number":return!0;case"string":if(K.length<659)return!0;if(K.length>EG)throw new Error("Primary key size is too large: "+K.length);break;case"object":if(K===null)throw new Error("Invalid primary key of null");break;case"bigint":if(K<2n**64n&&K>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof K)}if((0,Cl.writeKey)(K,Yoe,0)>EG)throw new Error("Primary key size is too large: "+K.length);return!0}o(Ui,"checkValidId");function Os(K){return typeof K=="object"&&K?K.id:K}o(Os,"requestTargetToId");function Jf(K){return typeof K=="object"&&K&&K.isCollection}o(Jf,"isSearchTarget");function Xf(K){}o(Xf,"isRequestTarget");function Io(K,_,T,N,P){if(Pe.getResidencyById&&T.ensureLoaded&&_?.replicateFrom!==!1){let x=Pa(Pe.getResidencyById(K));if(x&&!x.includes(server.hostname)&&C)return C({key:K,residency:x}).then(P)}let O=o(()=>{if(_?.transaction?.stale&&(_.transaction.stale=!1),T.transaction?.isDone)return P(null,K);let x=i.getEntry(K,T);return(c!=="system"||s==="hdb_analytics")&&(bG.default.trace?.("Recording db-read action for",`${c}.${s}`),Ve(x?.size??1,"db-read",s,null)),_?._freezeRecords&&Object.freeze(x?.value),x?.residencyId&&x.metadataFlags&Un&&C&&T.ensureLoaded&&_?.replicateFrom!==!1?C(x).then(L=>P(L,K),L=>(Fe.default.error?.("Error loading remote record",K,x,T,L),P(null,K))):(x&&_&&(x?.version>(_.lastModified||0)&&(_.lastModified=x.version),x?.localTime&&!_.lastRefreshed&&(_.lastRefreshed=x.localTime)),P(x,K))},"whenPrefetched");return N?O():te>0?(te--,O()):new Promise((x,L)=>{te===0?(te--,i.prefetch([K],()=>{A(),U()})):(ue.push(K),ce.push(U),ue.length>qE&&(te--,A()));function A(){if(ue.length>0){let w=ce;i.prefetch(ue,()=>{te===-1?A():te++;for(let D of w)D()}),ue=[],ce=[],ye>2&&ye--}else te=ye,ye<jf&&ye++}o(A,"prefetch");function U(){try{x(O())}catch(w){L(w)}}o(U,"load")})}o(Io,"loadLocalRecord");function On(K,_){let T=_?.checkPermission;if(typeof T!="object"){if(!K?.role)return;T=K.role.permission}if(T.super_user)return Woe;let N=T[c],P,O=N?.tables;if(O)return O[s];if(c==="data"&&(P=T[s])&&!P.tables)return P}o(On,"getTablePermissions");function dn(K,_,T,N){if(I){let P=!1;if(T.noCache?P=!0:(_?(!_.value||_.metadataFlags&(Un|Ha)||_.expiresAt!=null&&_.expiresAt<Date.now())&&(P=!0):P=!0,Zr(!P,"cache-hit",s)),P){let O=Tu(K,_,T).then(x=>(x?.value&&x?.value.getRecord?.()&&Fe.default.error?.("Can not assign a record that is already a resource"),T&&(x?.version>(T.lastModified||0)&&(T.lastModified=x.version),T.lastRefreshed=Date.now()),x));if(T?.onlyIfCached||_?.value&&N?.allowStaleWhileRevalidate?.(_,K)){if(O.catch(x=>Fe.default.warn?.(x)),T?.onlyIfCached&&!N.doesExist())throw new lt.ServerError("Entry is not cached",504);return}else return O}}else if(_?.value&&_.expiresAt!=null&&_.expiresAt<Date.now())return Pe.evict(_.key,_.value,_.version),_.value=null,{then(P){return P(_)}}}o(dn,"ensureLoadedFromSource");function Ur(K){let _=K?.transaction;if(_){if(!_.lmdbDb)return _.lmdbDb=i,_;do{if(_.lmdbDb?.path===i.path)return _;let T=_.next;if(!T)return _=_.next=new No,_.lmdbDb=i,_;_=T}while(!0)}else return new f_}o(Ur,"txnForContext");function Su(K,_,T){if(!K)return;let N=(K.deref?K.deref():K.value)??i.getEntry(K.key)?.value;if(typeof _=="object"){let O=vr,x=N;for(let L=0,A=_.length;L<A;L++){let U=_[L],w=O?.[U];x=w&&x?w(x,T,K):x?.[U],K=null,O=w?.definition?.tableClass?.propertyResolvers}return x}let P=vr[_];return P?P(N,T,K):N[_]}o(Su,"getAttributeValue");function Zf(K,_,T,N,P){let O=P?.length,x={transaction:N,lazy:O>0||typeof _=="string"||_?.length<4,alwaysPrefetch:!0},L;function A(U,w){let D=U?.value;if(!D)return tc.SKIP;for(let $=0;$<O;$++)if(!L?.includes($)&&!P[$](D,U))return tc.SKIP;return w!==void 0&&(U.key=w),U}if(o(A,"processEntry"),O>0||!K.hasEntries){let U=K.map(w=>{if(L=null,typeof w=="object"&&w?.key!==void 0)return O>0?A(w):w;if(w==null)return tc.SKIP;for(let D=0;D<O;D++){let Y=P[D].idFilter;if(Y){if(!Y(w))return tc.SKIP;L||(L=[]),L.push(D)}}return Io(w,T,x,!1,A)});return Array.isArray(K)&&(U=U.filter(w=>w!==tc.SKIP)),U.hasEntries=!0,U}return K}o(Zf,"transformToEntries");function xr(K,_,T=server.replication?.getThisNodeId(l)){if(K<=_?.version){if(_?.version===K&&T!==void 0){let N=server.replication?.exportIdMapping(l),P=_.localTime,O=P&&l.get(P);if(O){let x,L,A=At(O);for(let U in N)N[U]===T&&(x=U),N[U]===A.nodeId&&(L=U);if(x>L)return 1;if(x===L)return 0}}return-1}return 1}o(xr,"precedesExistingVersion");async function Tu(K,_,T){let N=_?.metadataFlags,P=_?.version,O,x;if(!i.attemptLock(K,P,()=>{clearTimeout(x);let w=i.getEntry(K);!w||!w.value||w.metadataFlags&(Un|Ha)?O(Tu(K,i.getEntry(K),T)):O(w)}))return new Promise(w=>{O=w,x=setTimeout(()=>{i.unlock(K,P)},Voe)});let L=_?.value,A={requestContext:T,replacingRecord:L,replacingEntry:_,replacingVersion:P,noCacheStore:!1,source:null,resourceCache:T?.resourceCache,transaction:void 0,expiresAt:void 0,lastModified:void 0},U=T?.responseHeaders;return new Promise((w,D)=>{let $;ks(bt(A,async Y=>{let j=performance.now(),B,Ee,fe;try{B=await $E(K,A,_),fe=N&Un;let ne=A.lastModified||fe&&P;Ee=fe||ne>P||!L,ne||(ne=(0,Cp.getNextMonotonicTime)());let ie=performance.now()-j;if(Ve(ie,"cache-resolution",s,null,"success"),U&&wp(U,"Server-Timing",`cache-resolve;dur=${ie.toFixed(2)}`,!0),Y.timestamp=ne,h&&A.expiresAt==null&&(A.expiresAt=Date.now()+h),B){if(typeof B!="object")throw new Error("Only objects can be cached and stored in tables");if(B.status>0&&B.headers)if(B.status>=300)if(B.status===304)B=L,ne=P;else throw new lt.ServerError(B.body||"Error from source",B.status);else B=B.body;typeof B.toJSON=="function"&&(B=B.toJSON()),t&&B[t]!==K&&(B[t]=K)}$=!0,w({key:K,version:ne,value:B})}catch(ne){ne.message+=` while resolving record ${K} for ${s}`,L&&((ne.code==="ECONNRESET"||ne.code==="ECONNREFUSED"||ne.code==="EAI_AGAIN")&&!T?.mustRevalidate||T?.staleIfError&&(ne.statusCode===500||ne.statusCode===502||ne.statusCode===503||ne.statusCode===504))?(w({key:K,version:P,value:L}),Fe.default.trace?.(ne.message,"(returned stale record)")):D(ne);let ie=performance.now()-j;Ve(ie,"cache-resolution",s,null,"fail"),U&&wp(U,"Server-Timing",`cache-resolve;dur=${ie.toFixed(2)}`,!0),A.transaction.abort();return}if(T?.noCacheStore||A.noCacheStore){A.transaction.abort();return}Ur(A).addWrite({key:K,store:i,entry:_,nodeName:"source",before:yu(B),commit:o((ne,ie)=>{if(ie?.version!==P)return;let xe=gu(K,L,B);if(B){Ye.put?.(A,K,B),ie&&(T.previousResidency=Pe.getResidencyRecord(ie.residencyId));let de,oe=!1,ke,Be=Pa(Pe.getResidency(B,T));if(Be){if(!Be.includes(server.hostname))if(de=B,oe=!0,Pe.getResidencyById)B=void 0;else{B=null;for(let Le in r)B||(B={}),B[Le]=de[Le]}ke=kc(Be)}Fe.default.trace?.(`Writing resolved record from source with id: ${K}, timestamp: ${new Date(ne).toISOString()}`),y(K,B,ie,ne,oe?Un:0,g&&(Ee||oe)||null,{user:A?.user,expiresAt:A.expiresAt,residencyId:ke,tableToTrack:s},"put",!!fe,de)}else ie&&(Ye.delete?.(A,K),Fe.default.trace?.(`Deleting resolved record from source with id: ${K}, timestamp: ${new Date(ne).toISOString()}`),g||R?y(K,null,ie,ne,0,g&&Ee||null,{user:A?.user,tableToTrack:s},"delete",!!fe):nl(i,ie,P))},"commit")})}),()=>{i.unlock(K,P)},Y=>{i.unlock(K,P),$&&Fe.default.error?.("Error committing cache update",Y)})})}o(Tu,"getFromSource");function Ca(K){if(!K||K.user?.role?.permission?.super_user)return!0;if(K.replicateTo)throw new lt.ClientError("Can not specify replication parameters without super user permissions",403);if(K.replicatedConfirmation)throw new lt.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}o(Ca,"checkContextPermissions");function Oa(K){let _=!1;if(K&&(K-Ar>1&&(_=!0),Ar=K),!(qe===tr&&!_)&&(tr=qe,(0,wl.getWorkerIndex)()===(0,wl.getWorkerCount)()-1))return Wr&&clearTimeout(Wr),qe?new Promise(T=>{let N=new Date;N.setMonth(0),N.setDate(1),N.setHours(0),N.setMinutes(0),N.setSeconds(0);let P=qe/(1+Ar),O=_?Date.now():Math.ceil((Date.now()-N.getTime())/P)*P+N.getTime(),x=o(L=>{Fe.default.trace?.(`Scheduled next cleanup scan at ${new Date(L)}`),Wr=setTimeout(()=>J=J.then(async()=>{if(x(Math.max(L+qe,Date.now())),i.rootStore.status!=="open"){clearTimeout(Wr);return}let A=50,U=new Array(A),w=0,D=Math.pow(Ar,8)*(Nl.get(F.STORAGE_RECLAMATION_EVICTIONFACTOR)??1e5),$=E/Math.pow(Math.max(Ar,1),4);Fe.default.debug?.(`Starting cleanup scan for ${s}, evict threshold ${D}, adjusted eviction ${$}ms`);function Y(j,B,Ee,fe){let pe=j+$-Date.now();if(pe<0)return!0;if(Ar){let ne=i.lastSize;return Ee&Jr&&Wc(fe,ie=>{ie.size&&(ne+=ie.size)}),Fe.default.trace?.(`shouldEvict adjusted ${pe} ${ne}, ${pe*(j-B)/ne} < ${D}`),pe*(j-B)/ne<D}return!1}o(Y,"shouldEvict");try{let j=0;for(let B of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let{key:Ee,value:fe,version:pe,expiresAt:ne,metadataFlags:ie}=B,xe;fe===null&&!g&&pe+$oe<Date.now()?xe=nl(i,B,pe):ne!=null&&Y(ne,pe,ie,fe)&&(xe=Pe.evict(Ee,fe,pe),j++),xe&&(await U[w],U[w]=xe.catch(de=>{Fe.default.error?.("Cleanup error",de)}),++w>=A&&(w=0)),await ec()}Fe.default.debug?.(`Finished cleanup scan for ${s}, evicted ${j} entries`)}catch(j){Fe.default.warn?.(`Error in cleanup scan for ${s}:`,j)}T(void 0),Ar=0}),Math.min(L-Date.now(),2147483647)).unref()},"startNextTimer");x(O)}):void 0}o(Oa,"scheduleCleanup");function em(){W=l?.addDeleteRemovalCallback(n,i,(K,_)=>{i.remove(K,_)})}o(em,"addDeleteRemoval");function VE(){(0,wl.getWorkerIndex)()===0&&setInterval(async()=>{if(!Fc){Fc=!0;try{let K=X.name,_=r[K];if(!_)throw new Error(`expiresAt attribute ${X} must be indexed`);for(let T of _.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let N of _.getValues(T)){let P=i.getEntry(N);P?.value?P.value[K]<Date.now()&&Pe.evict(N,P.value,P.version):i.ifVersion(N,P?.version,()=>_.remove(T,N))}await ec()}}catch(K){Fe.default.error?.("Error in evicting old records",K)}finally{Fc=!1}}},qoe).unref()}o(VE,"runRecordExpirationEviction");function Pa(K){if(K!=null){if(Array.isArray(K))return K;if(typeof K=="number"){if(K>=65536)throw new Error(`Shard id ${K} must be below 65536`);let _=server.shards?.get?.(K);if(_)return Fe.default.trace?.(`Shard ${K} mapped to ${_.map(T=>T.name).join(", ")}`),_.map(T=>T.name);throw new Error(`Shard ${K} is not defined`)}throw new Error(`Shard or residency list ${K} is not a valid type, must be a shard number or residency list of node hostnames`)}}o(Pa,"residencyFromFunction");function kc(K){if(K){let _=K.join(","),T=d.get([Symbol.for("residency_by_set"),_]);return T||(d.put([Symbol.for("residency_by_set"),_],T=Math.floor(Math.random()*2147418112)+65535),d.put([Symbol.for("residency_by_id"),T],K),T)}}o(kc,"getResidencyId");function yu(K,_){let T=Zb(K,i.rootStore);if(T){let N=_;return N?async()=>{await N(),await T}:()=>T}return _}o(yu,"preCommitBlobsForRecordBefore")}function tN(e,t){let r=e.attr_object||(e.attr_object={}),n=r[t];if(n)return n;n=r[t]=Object.create(null);for(let s of e)n[s.attribute_name]=s[t];return n}function gG(){}function jg(e,t){let r=t?.type;if(e===null)return e;if(e===""&&r&&r!=="String"&&r!=="Any")return null;try{switch(r){case"Int":case"Long":if(e[0]==="$")return zg(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return zg(+e);case"Float":return e==="null"?null:zg(+e);case"BigInt":return e==="null"?null:BigInt(e);case"Boolean":return e==="true"?!0:e==="false"?!1:e;case"Date":if(isNaN(e)){if(e==="null")return null;zoe.test(e)||(e+="Z");let n=new Date(e);return zg(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,Qg.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function zg(e){if(isNaN(e))throw new SyntaxError;return e}function SG(e,t){if(e==null)return!0;if(!Array.isArray(t))return e===t||t.startsWith?.(e);if(Array.isArray(e)){let r=e.length;if(e[r-1]===null&&r--,t.length>=r){for(let n=0;n<r;n++)if(t[n]!==e[n])return!1;return!0}return!1}else if(t[0]===e)return!0}function ks(e,t,r){return e?.then?e.then(t,r):t(e)}function TG(e){return e!=null}function Hs(e){try{return JSON.stringify(e)}catch{return e}}function joe(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var tc,Cp,yG,RG,Nl,lt,Op,Pp,Fe,Cl,wl,Qg,rN,bG,Foe,koe,Hoe,Goe,qoe,$oe,pG,Voe,hG,Koe,Un,Ha,Yoe,EG,_G,Woe,OMe,zoe,ec,tg=se(()=>{q();tc=require("lmdb"),Cp=b(Dn()),yG=b(require("lodash")),RG=b(hm());Ga();_m();Nl=b(me());HA();lt=b(_e()),Op=b(Ho()),Pp=b(is());we();eg();Fe=b(Zn());zI();va();Cl=require("ordered-binary"),wl=b(nt());Fi();Qg=b(ae());el();ts();h_();Np();rN=b(require("node:fs"));es();D_();bG=b(Q());eN();({sortBy:Foe}=yG.default),{validateAttribute:koe}=RG.default,Hoe=new Uint8Array(9);Hoe[8]=192;Goe=1/0,qoe=6e4,$oe=864e5;Nl.initSync();pG=Nl.get(F.STORAGE_PREFETCHWRITES),Voe=1e4,hG=1,Koe=2,Un=1,Ha=8,Yoe=Buffer.allocUnsafeSlow(8192),EG=1978,_G=100,Woe={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},OMe=(0,Qg.convertToMS)(Nl.get(F.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;o(Jg,"makeTable");o(tN,"attributesAsObject");o(gG,"noop");zoe=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;o(jg,"coerceType");o(zg,"rejectNaN");o(SG,"isDescendantId");ec=o(()=>new Promise(setImmediate),"rest");o(ks,"when");o(TG,"exists");o(Hs,"stringify");o(joe,"hasOtherProcesses")});function Xg(e,t){if(!Array.isArray(e)||!Array.isArray(t))throw new Error("Euclidean distance comparison requires an array");let r=0,n=Math.max(e.length,t.length);for(let s=0;s<n;s++){let i=e[s]||0,a=t[s]||0,c=i-a;r+=c*c}return r}function Zg(e,t){if(!Array.isArray(e)||!Array.isArray(t))throw new Error("Cosine distance comparison requires an array");let r=0,n=0,s=0,i=Math.max(e.length,t.length);for(let a=0;a<i;a++){let c=e[a]||0,l=t[a]||0;r+=c*l,n+=c*c,s+=l*l}return n=Math.sqrt(n),s=Math.sqrt(s),1-r/(n*s||1)}var IG=se(()=>{o(Xg,"euclideanDistance");o(Zg,"cosineDistance")});var wG,NG,hd,no,pd,Qoe,Joe,eS,CG=se(()=>{IG();wG=require("msgpackr"),NG=b(Zn()),hd=b(_e()),no=(0,NG.loggerWithTag)("HNSW"),pd=Symbol.for("entryPoint"),Qoe=Symbol.for("key"),Joe=10,eS=class{static{o(this,"HierarchicalNavigableSmallWorld")}static useObjectStore=!0;indexStore;M=16;efConstruction=100;efConstructionSearch=50;mL=1/Math.log(this.M);optimizeRouting=.5;nodesVisitedCount=0;idIncrementer;distance;constructor(t,r){this.indexStore=t,t&&(this.indexStore.encoder.useFloat32=wG.FLOAT32_OPTIONS.ALWAYS),this.distance=r?.distance==="euclidean"?Xg:Zg,r&&(r.M!==void 0&&(this.M=r.M,this.mL=1/Math.log(this.M)),r.efConstruction!==void 0&&(this.efConstruction=this.efConstructionSearch=r.efConstruction),r.efConstructionSearch!==void 0&&(this.efConstructionSearch=r.efConstructionSearch),r.mL!==void 0&&(this.mL=r.mL),r.optimizeRouting!==void 0&&(this.optimizeRouting=r.optimizeRouting))}index(t,r,n){let s=typeof t=="number"?[Qoe,t]:t,i=this.indexStore.get(s);if(!i){if(!r)return;if(!this.idIncrementer){let f=0;for(let m of this.indexStore.getKeys({reverse:!0,limit:1,start:1/0,end:0}))typeof m=="number"&&(f=m);this.idIncrementer=new BigInt64Array([BigInt(f)+1n]),this.idIncrementer=new BigInt64Array(this.indexStore.getUserSharedBuffer("next-id",this.idIncrementer.buffer))}i=Number(Atomics.add(this.idIncrementer,0,1n)),this.indexStore.put(s,i)}let a=new Map,c,l=this.indexStore.get(pd);if(n?c={...this.indexStore.get(i)}:c={},r){let f=l&&this.indexStore.get(l);if(f===void 0){let E=Math.floor(-Math.log(Math.random())*this.mL),g={vector:r,level:E,primaryKey:t};for(let R=0;R<=E;R++)g[R]=[];if(this.indexStore.put(i,g),typeof i!="number")throw new Error("Invalid nodeId: "+i);no.debug?.("setting entry point to",i),this.indexStore.put(pd,i);return}let m=c.level??Math.min(Math.floor(-Math.log(Math.random())*this.mL),Joe),p=f.level;if(m>=p){if(typeof i!="number")throw new Error("Invalid nodeId: "+i);no.debug?.("setting entry point to",i),this.indexStore.put(pd,i)}for(;p>m;){let E=this.searchLayer(r,l,f,this.efConstruction,p);E.length>0&&(l=E[0].id,f=E[0].node),p--}let h=new Array(m+1);for(let E=0;E<=m;E++)h[E]=[];for(let E=Math.min(m,p);E>=0;E--){let g=this.searchLayer(r,l,f,this.efConstruction,E);g=g.slice(0,this.M<<1),g.length===0&&E===0&&no.info?.("should not have zero connections for",l);let R=h[E];for(let S=0;S<g.length;S++){let{id:y,distance:C,node:I}=g[S];if(y===i)continue;let k=[];if(this.optimizeRouting){let H=!1,X=I[E],W=1+this.optimizeRouting*(1+.5*S/this.M);for(let ue=0;ue<X.length;ue++){let{id:ce,distance:te}=X[ue],ye=1+this.optimizeRouting*(1+.5*ue/this.M);for(let Ae=0;Ae<R.length;Ae++){let{id:Ye,distance:qe}=R[Ae];if(Ye===ce){C*W>qe+te?H=!0:te*ye>C+qe&&(k.push({fromId:Ye,toId:y}),k.push({fromId:y,toId:Ye}));break}}if(H)break}if(H)continue}else if(S>=(E>0?this.M:this.M<<1))continue;R.push({id:y,distance:C});for(let{fromId:H,toId:X}of k){let W=d(H);W||(W=d(H,this.indexStore.get(H)));for(let ue=0;ue<W[E].length;ue++)if(W[E][ue].id===X){Object.isFrozen(W[E])&&(W[E]=W[E].slice()),W[E].splice(ue,1);break}}let J=c[E],G=J?.find(({id:H})=>H===y);if(G){let H=J?.indexOf(G);J.copied||(J=[...J],J.copied=!0,c[E]=J),J.splice(H,1)}else this.addConnection(y,d(y,I),i,E,C,d)}}this.indexStore.put(i,{vector:r,level:m,primaryKey:t,...h})}else{if(l===i){let f=c.level??0;for(let m=f;m>=0&&(l=c[m][0]?.id,l===void 0);m--);if(l===void 0){let m=-1;for(let{key:p,value:h}of this.indexStore.getRange({start:0,end:1/0}))if(h.level>m){if(l=p,h.level===f)break;m=h.level}}if(l===void 0)this.indexStore.remove(pd);else{if(typeof l!="number")throw new Error("Invalid nodeId: "+l);no.debug?.("setting entry point to",l),this.indexStore.put(pd,l)}}this.indexStore.remove(i)}let u=new Map;if(c.level!==void 0)for(let f=0;f<=c.level;f++){let m=c[f];for(let{id:p}of m){let h=d(p,this.indexStore.get(p));for(let E=0;E<=f;E++)h[E]=h[E]?.filter(({id:g})=>g!==i),h[E].length===0&&(no.info?.("node was left orphaned, will reindex",p),u.set(h.primaryKey,h.vector))}}function d(f,m){let p=a.get(f);return!p&&m&&(p={...m},a.set(f,p)),p}o(d,"updateNode");for(let[f,m]of a)this.indexStore.put(f,m);for(let[f,m]of u)this.index(f,m,m);this.checkSymmetry(i,this.indexStore.get(i))}getEntryPoint(){let t=this.indexStore.get(pd);if(t===void 0)return;let r=this.indexStore.get(t);return{id:t,...r}}searchLayer(t,r,n,s,i,a=this.distance){let c=new Set([r]),l=[{id:r,distance:this.distance(t,n.vector),node:n}],u=[...l];for(;l.length>0;){l.sort((p,h)=>p.distance-h.distance);let d=l.shift(),f=u[u.length-1].distance;if(d.distance>f)break;let m=d.node;for(let{id:p}of m[i]||[]){if(c.has(p)||p===void 0)continue;c.add(p);let h=this.indexStore.get(p);if(!h)continue;this.nodesVisitedCount++;let E=a(t,h.vector);if(E<f||u.length<s){let g={id:p,distance:E,node:h};l.push(g),u.push(g)}}u.sort((p,h)=>p.distance-h.distance),u.length>s&&u.splice(s,u.length-s)}return u.visited=c.size,u}search({target:t,value:r,descending:n,distance:s,comparator:i}){let a=0;switch(i){case"lt":case"le":a=r;case"sort":break;default:throw new hd.ClientError(`Can not use "${i}" comparator with HNSW`)}if(n)throw new hd.ClientError("Can not use descending sort order with HNSW");let c;if(s==="cosine")c=Zg;else if(s==="euclidean")c=Xg;else{if(s)throw new hd.ClientError("Unknown distance function");c=this.distance}if(!t)throw new hd.ClientError("A target vector must be provided for an HNSW query");if(!Array.isArray(t))throw new hd.ClientError("The target vector must be an array");let l=this.getEntryPoint();if(!l)return[];let u=l.id,d=[];for(let f=l.level;f>=0;f--)if(d=this.searchLayer(t,u,l,this.efConstructionSearch,f,c),d.length>0){let m=d[0];l=m.node,u=m.id}return a&&(d=d.filter(f=>f.distance<a)),d.map(f=>({key:f.node.primaryKey,distance:f.distance}))}checkSymmetry(t,r){if(!r)return;let n=0,s;for(;(s=r[n])&&s.length!==0;){for(let{id:i}of s){let a=this.indexStore.get(i);if(!a){no.info?.("could not find neighbor node",a);continue}a[n]?.find(({id:l})=>l==t)||no.info?.("asymmetry detected",a[n])}n++}}addConnection(t,r,n,s,i,a){r[s]||(r[s]=[]);let c=s===0?this.M<<1:this.M;if(this.optimizeRouting&&(c<<=2),r[s].length>=c+(c>>2)){no.warn?.("maxConnections reached, removing some connections",c);let l=[...r[s]];l.sort((f,m)=>f.distance-m.distance);let u=l.slice(0,c),d=l.slice(c);r[s]=u;for(let f of d){let m=a(f.id)??this.indexStore.get(f.id);m&&m[s]&&(m=a(f.id,m),m[s]=m[s].filter(({id:p})=>p!==t),s===0&&m[s].length===0&&no.info?.("should not remove last connection",t,n))}}r[s].find(({id:l})=>l===n)?no.debug?.("already connected",t,n):r[s]=[...r[s],{id:n,distance:i}]}validateConnectivity(t=0){let r=this.getEntryPoint(),n=new Set,s=[r.id];n.add(r.id);let i=0;for(;s.length>0;){let a=s.shift(),c=this.indexStore.get(a);for(let l=t;l<=c.level;l++)for(let{id:u}of c[l]||[])i++,n.has(u)||(n.add(u),s.push(u))}return n.size!==this.totalNodes&&console.log("visited",n.size,"total",this.totalNodes),{isFullyConnected:n.size===this.totalNodes,averageConnections:i/n.size}}get totalNodes(){return Array.from(this.indexStore.getKeys({start:0,end:1/0})).length}estimateCountAsSort(){return Math.sqrt(this.indexStore.getStats().entryCount*this.efConstructionSearch)}propertyResolver(t,r,n){let s=r?.sort;if(s){let i=s.vectorDistances;if(i){let l=i.get(n);if(l)return l}else i=r.vectorDistances=s.vectorDistances=new Map;let a=this.distance;s.type&&(a=s.distance==="euclidean"?Xg:Zg);let c=a(s.target,t);return i.set(n,c),c}return t}}});var nN,OG=se(()=>{CG();nN={HNSW:eS}});var ft={};Re(ft,{NON_REPLICATING_SYSTEM_TABLES:()=>tS,database:()=>td,databaseEnvs:()=>Ko,databases:()=>De,dropDatabase:()=>ZI,dropTableMeta:()=>nae,getDatabases:()=>at,getDefaultCompression:()=>cS,getTables:()=>Zoe,onRemovedDB:()=>Bp,onUpdatedTable:()=>Ol,readMetaDb:()=>Lp,resetDatabases:()=>Td,table:()=>Ze,tables:()=>Sn});function xp(e,t){let r=oS.OpenDBIObject??oS.default.OpenDBIObject;return new r(e,t)}function Zoe(){return iS||at(),Sn||{}}function at(){if(iS)return De;iS=!0,gd=new Map;let e=(0,zt.getHdbBasePath)()&&(0,Ht.join)((0,zt.getHdbBasePath)(),qc),t=(0,zt.get)(F.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,zt.get)(F.STORAGE_PATH)||e&&((0,ps.existsSync)(e)?e:(0,Ht.join)((0,zt.getHdbBasePath)(),JE)),!!e){if((0,ps.existsSync)(e))for(let r of(0,ps.readdirSync)(e,{withFileTypes:!0})){let n=(0,Ht.basename)(r.name,".mdb");r.isFile()&&(0,Ht.extname)(r.name).toLowerCase()===".mdb"&&!t[n]?.path&&Lp((0,Ht.join)(e,r.name),null,n)}if((0,ps.existsSync)((0,_d.getBaseSchemaPath)())){for(let r of(0,ps.readdirSync)((0,_d.getBaseSchemaPath)(),{withFileTypes:!0}))if(!r.isFile()){let n=(0,Ht.join)((0,_d.getBaseSchemaPath)(),r.name),s=(0,Ht.join)((0,_d.getTransactionAuditStoreBasePath)(),r.name);for(let i of(0,ps.readdirSync)(n,{withFileTypes:!0}))if(i.isFile()&&(0,Ht.extname)(i.name).toLowerCase()===".mdb"){let a=(0,Ht.join)(s,i.name);Lp((0,Ht.join)(n,i.name),(0,Ht.basename)(i.name,".mdb"),r.name,a,!0)}}}if(t)for(let r in t){let n=t[r],s=n.path;if((0,ps.existsSync)(s))for(let a of(0,ps.readdirSync)(s,{withFileTypes:!0}))a.isFile()&&(0,Ht.extname)(a.name).toLowerCase()===".mdb"&&Lp((0,Ht.join)(s,a.name),(0,Ht.basename)(a.name,".mdb"),r);let i=n.tables;if(i)for(let a in i){let c=i[a],l=(0,Ht.join)(c.path,(0,Ht.basename)(a+".mdb"));(0,ps.existsSync)(l)&&Lp(l,a,r,null,!0)}}for(let r in De){let n=gd.get(r);if(n){let s=De[r];r.includes("delete")&&Cr.trace(`defined tables ${Array.from(n.keys())}`);for(let i in s)n.has(i)||(Cr.trace(`delete table class ${i}`),delete s[i])}else if(delete De[r],r==="data"){for(let s in Sn)delete Sn[s];delete Sn[aS]}}if((0,zt.get)(F.ANALYTICS_REPLICATE)===!1?tS.includes("hdb_analytics")||tS.push("hdb_analytics"):(De.system?.hdb_analytics?.enableAuditing(),De.system?.hdb_analytics_hostname?.enableAuditing()),De.system)for(let r of tS)De.system[r]&&(De.system[r].replicate=!1);return gd=null,De}}function Td(){iS=!1;for(let[,e]of Ko)e.needsDeletion=!0;at();for(let[e,t]of Ko)if(t.needsDeletion&&!e.endsWith("system.mdb")){t.close(),Ko.delete(e);let r=De[t.databaseName];for(let n in r)if(r[n].primaryStore.path===e){delete De[t.databaseName],Mp.forEach(i=>i(t.databaseName));break}}return De}function Lp(e,t,r=oN,n,s){let i=new sN.default(e,!1);try{let a=Ko.get(e);a?a.needsDeletion=!1:(a=(0,Sd.open)(i),Ko.set(e,a));let c=new xp(!1),l=a.dbisDb||(a.dbisDb=a.openDB(rS.INTERNAL_DBIS_NAME,c)),u=a.auditStore;u||(n?(0,ps.existsSync)(n)&&(i.path=n,u=(0,Sd.open)(i),u.isLegacy=!0):u=U_(a));let d=vG(r),f=d[aS],m=new Map;for(let{key:p,value:h}of l.getRange({start:!1})){let[E,g]=p.toString().split("/");g===""?g=h.name:g||(g=E,E=t,h.name||(h.name=g,h.indexed=!h.is_hash_attribute)),f?.add(E);let R=m.get(E);R||m.set(E,R={attributes:[]}),(g==null||h.is_hash_attribute)&&(R.primary=h),g!=null&&R.attributes.push(h),Object.defineProperty(h,"key",{value:p,configurable:!0})}for(let[p,h]of m){let{attributes:E,primary:g}=h;if(!g){for(let te of E)if(te.is_hash_attribute||te.isPrimaryKey){g=te;break}if(!g){Cr.warn(`Unable to find a primary key attribute on table ${p}, with attributes: ${JSON.stringify(E)}`);continue}}let R=d[p],S={},y=[],C,I,k=typeof g.audit=="boolean"?g.audit:(0,zt.get)(F.LOGGING_AUDITLOG),J=g.trackDeletes,G=g.expiration,H=g.eviction,X=g.sealed,W=g.splitSegments,ue=g.replicate;if(R)S=R.indices,y=R.attributes,R.schemaVersion++;else{C=g.tableId,C?C>=(l.get(Ed)||0)&&(l.putSync(Ed,C+1),Cr.info(`Updating next table id (it was out of sync) to ${C+1} for ${p}`)):(g.tableId=C=l.get(Ed),C||(C=1),Cr.debug("Table {tableName} missing an id, assigning {tableId}"),l.putSync(Ed,C+1),l.putSync(g.key,g));let te=new xp(!g.is_hash_attribute,g.is_hash_attribute);if(te.compression=g.compression,te.compression){let ye=(0,zt.get)(F.STORAGE_COMPRESSION_THRESHOLD)||MG;te.compression.threshold=ye}I=Q_(a.openDB(g.key,te),a),a.databaseName=r,I.tableId=C}let ce;for(let te of E){te.attribute=te.name;try{if(!te.is_hash_attribute&&(te.indexed||te.attribute&&!te.name)){if(!S[te.name]){let Ae=xG(te.key,a,te);S[te.name]=Ae,S[te.name].indexNulls=te.indexNulls}let ye=y.find(Ae=>Ae.name===te.name);ye?y.splice(y.indexOf(ye),1,te):y.push(te),ce=!0}}catch(ye){Cr.error("Error trying to update attribute",te,y,S,ye)}}for(let te of y)if(!E.find(Ae=>Ae.name===te.name)){if(te.is_hash_attribute){Cr.error("Unable to remove existing primary key attribute",te);continue}te.indexed&&(y.splice(y.indexOf(te),1),ce=!0)}if(R)ce&&(R.schemaVersion++,R.updatedAttributes());else{R=UG(d,p,Jg({primaryStore:I,auditStore:u,audit:k,sealed:X,splitSegments:W,replicate:ue,expirationMS:G&&G*1e3,evictionMS:H&&H*1e3,trackDeletes:J,tableName:p,tableId:C,primaryKey:g.name,databasePath:s?r+"/"+p:r,databaseName:r,indices:S,attributes:E,schemaDefined:g.schemaDefined,dbisDB:l})),R.schemaVersion=1;for(let te of Dp)te(R)}}return a}catch(a){throw a.message+=` opening database ${e}`,a}}function vG(e){let t=De[e];if(t||(e==="data"?t=De[e]=Sn:e==="system"?Object.defineProperty(De,"system",{value:t=Object.create(null),configurable:!0}):t=De[e]=Object.create(null)),gd&&!gd.has(e)){let r=new Set;t[aS]=r,gd.set(e,r)}return t}function UG(e,t,r){return e[t]=r,r}function td({database:e,table:t}){e||(e=oN),at();let r=vG(e),n=(0,Ht.join)((0,zt.getHdbBasePath)(),qc),s=(0,zt.get)(F.DATABASES)||{};process.env.SCHEMAS_DATA_PATH&&(s.data={path:process.env.SCHEMAS_DATA_PATH});let i=t&&s[e]?.tables?.[t]?.path;n=i||s[e]?.path||process.env.STORAGE_PATH||(0,zt.get)(F.STORAGE_PATH)||((0,ps.existsSync)(n)?n:(0,Ht.join)((0,zt.getHdbBasePath)(),JE));let a=(0,Ht.join)(n,(i?t:e)+".mdb"),c=Ko.get(a);if(!c||c.status==="closed"){let l=new sN.default(a,!1);c=(0,Sd.open)(l),Ko.set(a,c)}return c.auditStore||(c.auditStore=U_(c)),c}async function ZI(e){if(!De[e])throw new Error("Schema does not exist");let t=De[e],r;for(let n in t)r=t[n].primaryStore.rootStore,Ko.delete(r.path),r.status==="open"&&(await r.close(),await vp.remove(r.path));if(r||(r=td({database:e,table:null}),r.status==="open"&&(await r.close(),await vp.remove(r.path))),e==="data"){for(let n in Sn)delete Sn[n];delete Sn[aS]}delete De[e],Mp.forEach(n=>n(e)),await Xb(r)}function xG(e,t,r){let n=r.is_hash_attribute||r.indexed.type&&nN[r.indexed.type]?.useObjectStore,s=new xp(!n,n),i=t.openDB(e,s);if(r.indexed.type){let a=nN[r.indexed.type];a?i.customIndex=new a(i,r.indexed):Cr.error(`The indexing type '${r.indexed.type}' is unknown`)}return i}function Ze(e){let{table:t,database:r,expiration:n,eviction:s,scanInterval:i,attributes:a,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,schemaDefined:m,origin:p}=e;r||(r=oN);let h=td({database:r,table:t}),E=De[r];Cr.trace(`Defining ${t} in ${r}`);let g=E?.[t];if(h.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let R,S,y;m==null&&(m=!0);let C=new xp(!1);for(let W of a)W.attribute&&!W.name?(W.name=W.attribute,W.indexed=!0):W.attribute=W.name,W.expiresAt&&(W.indexed=!0);let I,k;if(g){if(R=g.primaryKey,g.primaryStore.rootStore.status==="closed")throw new Error(`Can not use a closed data store from ${t} class`);u==null&&(u=g.splitSegments),g.attributes.splice(0,g.attributes.length,...a)}else{let W=h.auditStore;S=a.find(ye=>ye.isPrimaryKey)||{},R=S.name,S.is_hash_attribute=S.isPrimaryKey=!0,S.schemaDefined=m,S.compression=cS(),f&&(S.trackDeletes=!0),c=S.audit=typeof c=="boolean"?c:(0,zt.get)(F.LOGGING_AUDITLOG),n&&(S.expiration=n),s&&(S.eviction=s),u??=!1,S.splitSegments=u,typeof l=="boolean"&&(S.sealed=l),typeof d=="boolean"&&(S.replicate=d),p&&(S.origins?S.origins.includes(p)||S.origins.push(p):S.origins=[p]),Cr.trace(`${t} table loading, opening primary store`);let ue=new xp(!1,!0);ue.compression=S.compression;let ce=t+"/";if(y=h.dbisDb=h.openDB(rS.INTERNAL_DBIS_NAME,C),X(),y.get(ce))return k&&k(),Td(),Ze(e);let te=Q_(h.openDB(ce,ue),h);h.databaseName=r,te.tableId=y.get(Ed),Cr.trace(`Assigning new table id ${te.tableId} for ${t}`),te.tableId||(te.tableId=1),y.put(Ed,te.tableId+1),S.tableId=te.tableId,g=UG(E,t,Jg({primaryStore:te,auditStore:W,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:R,tableName:t,tableId:te.tableId,databasePath:r,databaseName:r,indices:{},attributes:a,schemaDefined:m,dbisDB:y})),g.schemaVersion=1,I=!0,y.put(ce,S)}let J=g.indices;y=y||(h.dbisDb=h.openDB(rS.INTERNAL_DBIS_NAME,C)),g.dbisDB=y;let G=[];for(let{key:W,value:ue}of y.getRange({start:!0})){let[ce,te]=W.toString().split("/");if(te===""&&(te=ue.name),te){if(ce!==t)continue}else continue;let ye=a.find(Ye=>Ye.name===te),Ae=!ye?.indexed&&ue.indexed&&!ue.isPrimaryKey;if((!ye||Ae)&&(X(),I=!0,ye||y.remove(W),Ae)){let Ye=g.indices[ce];Ye&&G.push(Ye)}}let H=[];try{for(let W of a||[]){if((W.relationship||W.computed)&&(I=!0,W.relationship))continue;let ue=t+"/"+(W.name||"");Object.defineProperty(W,"key",{value:ue,configurable:!0});let ce=y.get(ue);if(W.isPrimaryKey){if(ce=ce||y.get(ue=t+"/")||{},c!==void 0&&c!==g.audit||l!==void 0&&l!==g.sealed||d!==void 0&&d!==g.replicate||(+n||void 0)!==(+ce.expiration||void 0)||(+s||void 0)!==(+ce.eviction||void 0)||W.type!==ce.type){let ye={...ce};typeof c=="boolean"&&(c&&g.enableAuditing(c),ye.audit=c),n&&(ye.expiration=+n),s&&(ye.eviction=+s),l!==void 0&&(ye.sealed=l),d!==void 0&&(ye.replicate=d),W.type&&(ye.type=W.type),I=!0,X(),y.put(ue,ye)}continue}ce?.attribute&&!ce.name&&(ce.indexed=!0);let te=!ce||ce.type!==W.type||JSON.stringify(ce.indexed)!==JSON.stringify(W.indexed)||ce.nullable!==W.nullable||ce.version!==W.version||JSON.stringify(ce.properties)!==JSON.stringify(W.properties)||JSON.stringify(ce.elements)!==JSON.stringify(W.elements);if(W.indexed){let ye=xG(ue,h,W);(te||ce.indexingPID&&ce.indexingPID!==process.pid||ce.restartNumber<Up.workerData?.restartNumber)&&(I=!0,X(),ce=y.get(ue),(te||ce.indexingPID&&ce.indexingPID!==process.pid||ce.restartNumber<Up.workerData?.restartNumber)&&(I=!0,W.indexNulls===void 0&&(W.indexNulls=!0),g.primaryStore.getStats().entryCount>0&&(W.lastIndexedKey=ce?.lastIndexedKey??void 0,W.indexingPID=process.pid,ye.isIndexing=!0,Object.defineProperty(W,"dbi",{value:ye}),H.push(W))),y.put(ue,W)),ce?.indexNulls&&W.indexNulls===void 0&&(W.indexNulls=!0),ye.indexNulls=W.indexNulls,J[W.name]=ye}else te&&(I=!0,X(),y.put(ue,W))}}finally{k&&k()}if(I&&(g.schemaVersion++,g.updatedAttributes()),Cr.trace(`${t} table loading, running index`),H.length>0||G.length>0?g.indexingOperation=rae(g,H,G):I&&nS.signalSchemaChange(new sS.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=p,I)for(let W of Dp)W(g,p!=="cluster");return(n||s||i)&&g.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),Cr.trace(`${t} table loaded`),g;function X(){k||h.transactionSync(()=>({then(W){k=W}}))}o(X,"startTxn")}async function rae(e,t,r){try{Cr.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await nS.signalSchemaChange(new sS.SchemaEventMsg(process.pid,"schema-change",e.databaseName,e.tableName));let s;for(let u of r)s=u.drop();let i,a={},c=0,l=t.length;if(await new Promise(u=>setImmediate(u)),l>0){let u;for(let f of t)(0,Sd.compareKeys)(f.lastIndexedKey,u)<0&&(u=f.lastIndexedKey),f.lastIndexedKey==null&&f.dbi.clearAsync();let d=0;for(let{key:f,value:m,version:p}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(m){if(d++,s=e.primaryStore.ifVersion(f,p,()=>{for(let h=0;h<l;h++){let E=t[h],g=E.name,R=E.dbi;try{let S=E.resolve,y=m&&(S?S(m):m[g]);if(R.customIndex){R.customIndex.index(f,y);continue}let C=(0,PG.getIndexedValues)(y);if(C)for(let I=0,k=C.length;I<k;I++)R.put(C[I],f)}catch(S){a[g]||(a[g]=!0,Cr.error(`Error indexing attribute ${g}`,S))}}}),s.then(()=>d--,h=>{d--,Cr.error(h)}),Up.workerData&&Up.workerData.restartNumber!==DG.restartNumber&&(i=!0),++c%100===0||i){for(let h of t)h.lastIndexedKey=f,e.dbisDB.put(h.key,h);if(i)return}d>eae?await s:d>tae&&await new Promise(h=>setImmediate(h))}for(let f of t)delete f.lastIndexedKey,delete f.indexingPID,f.dbi.isIndexing=!1,s=e.dbisDB.put(f.key,f)}await s,await nS.signalSchemaChange(new sS.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),Cr.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){Cr.error("Error in indexing",n)}}function nae({table:e,database:t}){let r=td({database:t,table:e}),n=[],s=r.dbisDb;for(let i of s.getKeys({start:e+"/",end:e+"0"}))n.push(s.remove(i));return Promise.all(n)}function Ol(e){return Dp.push(e),{remove(){let t=Dp.indexOf(e);t>-1&&Dp.splice(t,1)}}}function Bp(e){return Mp.push(e),{remove(){let t=Mp.indexOf(e);t>-1&&Mp.splice(t,1)}}}function cS(){let e=(0,zt.get)(F.STORAGE_COMPRESSION),t=(0,zt.get)(F.STORAGE_COMPRESSION_DICTIONARY),r=(0,zt.get)(F.STORAGE_COMPRESSION_THRESHOLD)||MG,n={startingOffset:32};return t&&(n.dictionary=vp.readFileSync(t)),r&&(n.threshold=r),e&&n}var zt,rS,Sd,Ht,ps,_d,sN,vp,iN,PG,nS,sS,Up,LG,DG,oS,Xoe,Cr,oN,aS,MG,tS,Sn,De,Ed,Dp,Mp,iS,Ko,gd,eae,tae,we=se(()=>{zt=b(me()),rS=b(Yt()),Sd=require("lmdb"),Ht=require("path"),ps=require("fs"),_d=b(Rt());tg();sN=b(Vm());q();vp=b(require("fs-extra")),iN=b(ii()),PG=b(Dn()),nS=b(Ho()),sS=b(is()),Up=require("worker_threads"),LG=b(Q()),DG=b(nt());Fi();el();es();OG();oS=b($m()),{forComponent:Xoe}=LG.default;o(xp,"OpenDBIObject");Cr=Xoe("storage"),oN="data",aS=Symbol("defined-tables"),MG=((0,zt.get)(F.STORAGE_PAGESIZE)||4096)-60;(0,zt.initSync)();tS=["hdb_temp","hdb_certificate","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_info"],Sn=Object.create(null),De=Object.create(null);(0,iN._assignPackageExport)("databases",De);(0,iN._assignPackageExport)("tables",Sn);Ed=Symbol.for("next-table-id"),Dp=[],Mp=[],Ko=new Map;o(Zoe,"getTables");o(at,"getDatabases");o(Td,"resetDatabases");o(Lp,"readMetaDb");o(vG,"ensureDB");o(UG,"setTable");o(td,"database");o(ZI,"dropDatabase");o(xG,"openIndex");o(Ze,"table");eae=1e3,tae=10;o(rae,"runIndexing");o(nae,"dropTableMeta");o(Ol,"onUpdatedTable");o(Bp,"onRemovedDB");o(cS,"getDefaultCompression")});var lN={};Re(lN,{loadGQLSchema:()=>oae,start:()=>cN,startOnMainThread:()=>iae});function cN({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r,n,s,i){let{parse:a,Source:c,Kind:l,NamedTypeNode:u,StringValueNode:d}=await import("graphql"),f=a(new c(r.toString(),s)),m=new Map,p=[],h;for(let R of f.definitions)switch(R.kind){case l.OBJECT_TYPE_DEFINITION:let k=function(G){if(G.kind==="NonNullType"){let W=k(G.type);return W.nullable=!1,W}if(G.kind==="ListType")return{type:"array",elements:k(G.type)};let X={type:G.name?.value};return Object.defineProperty(X,"location",{value:G.loc.startToken}),X};o(k,"getProperty");let S=R.name.value,y=[],C={table:null,database:null,properties:y};m.set(S,C),i.allTypes.set(S,C);for(let G of R.directives){if(G.name.value==="table"){for(let X of G.arguments)C[X.name.value]=X.value.value;C.schema&&(C.database=C.schema),C.table||(C.table=S),C.audit&&(C.audit=C.audit!=="false"),C.attributes=C.properties,p.push(C)}if(G.name.value==="sealed"&&(C.sealed=!0),G.name.value==="splitSegments"&&(C.splitSegments=!0),G.name.value==="replicate"&&(C.replicate=!0),G.name.value==="export"){C.export=!0;for(let X of G.arguments)typeof C.export!="object"&&(C.export={}),C.export[X.name.value]=X.value.value}}let I=!1,J={};for(let G of R.fields){let H=k(G.type);H.name=G.name.value,y.push(H),J[H.name]=void 0;for(let X of G.directives){let W=X.name.value;if(W==="primaryKey")I?console.warn("Can not define two attributes as a primary key at",X.loc):(H.isPrimaryKey=!0,I=!0);else if(W==="indexed"){let ue={};for(let ce of X.arguments||[])ue[ce.name.value]=ce.value.value;H.indexed=ue}else if(W==="computed"){for(let ue of X.arguments||[])if(ue.name.value==="from"){let ce=ue.value.value;H.computed={from:g(ce,ue,J)},H.version==null&&(H.version=ce)}else ue.name.value==="version"&&(H.version=ue.value.value);H.computed=H.computed||!0}else if(W==="relationship"){let ue={};for(let ce of X.arguments)ue[ce.name.value]=ce.value.value;H.relationship=ue}else if(W==="createdTime")H.assignCreatedTime=!0;else if(W==="updatedTime")H.assignUpdatedTime=!0;else if(W==="expiresAt")H.expiresAt=!0;else if(W==="allow"){let ue=H.authorizedRoles=[];for(let ce of X.arguments)ce.name.value==="role"&&ue.push(ce.value.value)}else server.knownGraphQLDirectives.includes(W)&&console.warn(`@${W} is an unknown directive, at`,X.loc)}}C.type=S,S==="Query"&&(h=C)}function E(R){let S=m.get(R.type);S?(Object.defineProperty(R,"properties",{value:S.properties}),Object.defineProperty(R,"definition",{value:S})):R.type==="array"?E(R.elements):sae.includes(R.type)||(0,FG.getWorkerIndex)()===0&&console.error(`The type ${R.type} is unknown at line ${R.location.line}, column ${R.location.column}, in ${s}`)}o(E,"connectPropertyType");for(let R of m.values())for(let S of R.properties)E(S);for(let R of p)R.tableClass=e(R),R.export&&(R.export.name===""?i.set((0,aN.dirname)(n),R.tableClass):i.set((0,aN.dirname)(n)+"/"+(R.export.name||R.type),R.tableClass,R.export));function g(R,S,y){return new BG.Script(`function computed(attributes) { return function(record) { with(attributes) { with (record) { return ${R}; } } } } computed;`,{filename:s,lineOffset:S.loc.startToken.line-1,columnOffset:S.loc.startToken.column}).runInThisContext()(y)}o(g,"createComputedFrom")}}var aN,BG,FG,sae,iae,oae,kG=se(()=>{aN=require("path"),BG=require("node:vm");we();FG=b(nt());qa();sae=["ID","Int","Float","Long","String","Boolean","Date","Bytes","Any","BigInt","Blob"];server.knownGraphQLDirectives&&(server.knownGraphQLDirectives=["table","sealed","export","primaryKey","indexed","computed","relationship","createdTime","updatedTime","expiresAt","allow"]);o(cN,"start");iae=cN,oae=o(e=>cN({ensureTable:Ze}).handleFile(e,null,null,new Ku),"loadGQLSchema")});var dN={};Re(dN,{start:()=>hae});function aae(e){if(e.kind!==He.Kind.OPERATION_DEFINITION&&e.kind!==He.Kind.FRAGMENT_DEFINITION)throw new $r(`Unexpected non-executable definition type ${e.kind}.`)}function HG(e){if(typeof e!="object"||e===null)throw new so("Request body must be an object.");if(!("query"in e))throw new so("Request body must contain a `query` field.");if(typeof e.query!="string")throw new so("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new so("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new so("Request body `operationName` field must be a string.")}function uN(e){return parseInt(e.value,10)}function qG(e){return parseFloat(e.value)}function $G(e,t,r){let n=r.get(e.name.value);return VG(n)?KG(n,t):{attribute:t,value:n}}function VG(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function KG(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],VG(n)?KG(n,t):{attribute:t,value:n}))}function cae(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case He.Kind.NULL:return{attribute:t,value:null};case He.Kind.INT:return{attribute:t,value:uN(e.value)};case He.Kind.FLOAT:return{attribute:t,value:qG(e.value)};case He.Kind.BOOLEAN:case He.Kind.STRING:return{attribute:t,value:e.value.value};case He.Kind.VARIABLE:return $G(e.value,t,r);case He.Kind.OBJECT:return YG(e.value,t,r);case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Value type, ${e.value.kind}, is not supported.`)}}function YG(e,t,r){return e.fields.flatMap(n=>cae(n,t,r))}function lae(e,t){switch(e.value.kind){case He.Kind.NULL:return{attribute:e.name.value,value:null};case He.Kind.INT:return{attribute:e.name.value,value:uN(e.value)};case He.Kind.FLOAT:return{attribute:e.name.value,value:qG(e.value)};case He.Kind.BOOLEAN:case He.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case He.Kind.VARIABLE:return $G(e.value,e.name.value,t);case He.Kind.OBJECT:return YG(e.value,[e.name.value],t);case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Argument type, ${e.value.kind}, is not supported.`)}}function uae(e,t){return e.flatMap(r=>lae(r,t))}function lS(e,t){return e.selections.flatMap(r=>{switch(r.kind){case He.Kind.FIELD:return r;case He.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new $r(`Fragment \`${n}\` not found.`);return lS(s.selectionSet,t)}case He.Kind.INLINE_FRAGMENT:return lS(r.selectionSet,t)}})}function WG(e,t){return lS(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:WG(r.selectionSet,t)}:r.name.value)}async function dae(e,t,r,n){let s=vs.getMatch(e.name.value,"graphql");if(s===void 0)throw new $r(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,a={select:WG(e.selectionSet,r),conditions:uae(e.arguments,t)},c=[];n.authorize=!0;for await(let l of i.search(a,n))c.push(l);return[e.name.value,c]}function zG(e){switch(e.kind){case He.Kind.NULL:return null;case He.Kind.INT:return uN(e);case He.Kind.FLOAT:return parseFloat(e.value);case He.Kind.STRING:case He.Kind.BOOLEAN:return e.value;case He.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:zG(r.value),...t}),{});case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Value type, ${e.kind}, is not supported.`)}}function fae(e,t){let r=new Map;for(let n of e){let s=n.variable.name.value,i=t?.[s];if(i===void 0&&n.defaultValue!==void 0&&(i=zG(n.defaultValue)),n.type.kind===He.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new $r(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function mae(e,t,r,n){if(e.operation===He.OperationTypeNode.SUBSCRIPTION)throw new $r("Subscriptions are not supported.");if(e.operation===He.OperationTypeNode.MUTATION)throw new $r("Mutations are not supported yet.");let s=fae(e.variableDefinitions,t),i=await Promise.all(lS(e.selectionSet,r).map(c=>dae(c,s,r,n))),a={data:{}};for(let[c,l]of i)a.data[c]=l;return a}async function GG({query:e,variables:t={},operationName:r},n){let s=He.parse(e),i=new Map,a=new Map;for(let u of s.definitions)if(aae(u),u.kind===He.Kind.FRAGMENT_DEFINITION)a.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new $r("Unnamed operations are only allowed when there is a single operation in the document.");let d=u.name?.value??"Unnamed Query";if(i.has(d))throw new $r(`Duplicate operation definition: ${d}`);i.set(d,u)}let c;if(r==null)if(i.size===1)c=i.entries().next().value[1];else throw new $r("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new $r(`Operation \`${r}\` not found.`);let l=await mae(c,t,a,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function pae(e){switch(e.method){case"GET":{let t=new URLSearchParams(e.url.split("?")[1]),r={};for(let[n,s]of t)r[n]=n==="variables"||n==="extensions"?JSON.parse(s):s;return HG(r),GG(r,e)}case"POST":{let r=await Lo(e.headers.get("content-type"),!0)(e._nodeRequest);return HG(r),GG(r,e)}default:throw new so("Method Not Allowed",405,{Allow:"GET, POST"})}}function hae(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await pae(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof so)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof He.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof $r)return{status:200,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};break}default:logger.info(`Unsupported accept header, ${s}, defaulting to application/graphql-response+json`);case"application/graphql-response+json":{if(n instanceof so)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof He.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof $r)return{status:400,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};break}}throw n}},{port:e.port,securePort:e.securePort})}var He,$r,so,jG=se(()=>{He=b(require("graphql"));Do();qa();o(aae,"assertExecutableDefinitionNode");o(HG,"assertRequestParams");o(uN,"processIntValueNode");o(qG,"processFloatValueNode");o($G,"processVariableNode");o(VG,"isObject");o(KG,"transformObjectIntoQueryCondition");o(cae,"processObjectFieldNode");o(YG,"processObjectValueNode");o(lae,"processArgumentNode");o(uae,"buildConditionsQuery");o(lS,"fillInFragments");o(WG,"buildSelectQuery");o(dae,"processFieldNode");o(zG,"processConstValueNode");o(fae,"resolveVariables");o(mae,"executeOperation");o(GG,"resolver");$r=class extends Error{static{o(this,"GraphQLQueryingError")}},so=class extends Error{static{o(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};o(pae,"graphqlQueryingHandler");o(hae,"start")});var tq=v((JMe,eq)=>{var yd=require("validate.js"),JG=mt(),Rd=(q(),M(z)),{handleHDBError:Eae,hdbErrors:_ae}=_e(),{HDB_ERROR_MSGS:sr,HTTP_STATUS_CODES:gae}=_ae,fN=o(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Sae={STRUCTURE_USER:"structure_user"},QG=Object.values(Rd.ROLE_TYPES_ENUM),Tae="attribute_permissions",yae="attribute_name",{PERMS_CRUD_ENUM:bd}=Rd,Rae=[Tae,...Object.values(bd)],XG=[bd.READ,bd.INSERT,bd.UPDATE],bae=[yae,...XG];function Aae(e){let t=fN();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,ZG(e,t)}o(Aae,"addRoleValidation");function Iae(e){let t=fN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,ZG(e,t)}o(Iae,"alterRoleValidation");function wae(e){let t=fN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,JG.validateObject(e,t)}o(wae,"dropRoleValidation");var Nae=["operation","role","id","permission","hdb_user","access"];function ZG(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let a=0,c=n.length;a<c;a++)Nae.includes(n[a])||s.push(n[a]);s.length>0&&pr(sr.INVALID_ROLE_JSON_KEYS(s),r);let i=JG.validateObject(e,t);if(i&&i.message.split(",").forEach(a=>{pr(a,r)}),e.permission){let a=Cae(e);a&&pr(a,r),QG.forEach(c=>{e.permission[c]&&!yd.isBoolean(e.permission[c])&&pr(sr.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let a in e.permission)if(QG.indexOf(a)<0){if(a===Sae.STRUCTURE_USER){let l=e.permission[a];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,d=l.length;u<d;u++){let f=l[u];global.hdb_schema[f]||pr(sr.SCHEMA_NOT_FOUND(f),r)}continue}pr(sr.STRUCTURE_USER_ROLE_TYPE_ERROR(a),r);continue}let c=e.permission[a];if(!a||!global.hdb_schema[a]){pr(sr.SCHEMA_NOT_FOUND(a),r);continue}if(c.tables)for(let l in c.tables){let u=c.tables[l];if(!l||!global.hdb_schema[a][l]){pr(sr.TABLE_NOT_FOUND(a,l),r);continue}if(Object.keys(u).forEach(d=>{Rae.includes(d)||pr(sr.INVALID_PERM_KEY(d),r,a,l)}),Object.values(bd).forEach(d=>{yd.isDefined(u[d])?yd.isBoolean(u[d])||pr(sr.TABLE_PERM_NOT_BOOLEAN(d),r,a,l):pr(sr.TABLE_PERM_MISSING(d),r,a,l)}),u.attribute_permissions===void 0){pr(sr.ATTR_PERMS_ARRAY_MISSING,r,a,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){pr(sr.ATTR_PERMS_NOT_ARRAY,r,a,l);continue}if(u.attribute_permissions){let d=global.hdb_schema[a][l].attributes.map(({attribute:m})=>m),f={read:!1,insert:!1,update:!1};for(let m in u.attribute_permissions){let p=u.attribute_permissions[m];if(Object.keys(p).forEach(E=>{!bae.includes(E)&&E!==bd.DELETE&&pr(sr.INVALID_ATTR_PERM_KEY(E),r,a,l)}),!yd.isDefined(p.attribute_name)){pr(sr.ATTR_PERM_MISSING_NAME,r,a,l);continue}let h=p.attribute_name;if(!d.includes(h)){pr(sr.INVALID_ATTRIBUTE_IN_PERMS(h),r,a,l);continue}XG.forEach(E=>{yd.isDefined(p[E])?yd.isBoolean(p[E])||pr(sr.ATTR_PERM_NOT_BOOLEAN(E,h),r,a,l):pr(sr.ATTR_PERM_MISSING(E,h),r,a,l)}),!f.read&&p.read===!0&&(f.read=!0),!f.insert&&p.insert===!0&&(f.insert=!0),!f.update&&p.update===!0&&(f.update=!0)}if(u.read===!1&&f.read===!0||u.insert===!1&&f.insert===!0||u.update===!1&&f.update===!0){let m=`${a}.${l}`;pr(sr.MISMATCHED_TABLE_ATTR_PERMS(m),r,a,l)}}}}return Oae(r)}o(ZG,"customValidate");eq.exports={addRoleValidation:Aae,alterRoleValidation:Iae,dropRoleValidation:wae};function Cae(e){let{operation:t,permission:r}=e;if(t===Rd.OPERATIONS_ENUM.ADD_ROLE||t===Rd.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 sr.SU_CU_ROLE_COMBINED_ERROR;{let a=r.super_user?Rd.ROLE_TYPES_ENUM.SUPER_USER:Rd.ROLE_TYPES_ENUM.CLUSTER_USER;return sr.SU_CU_ROLE_NO_PERMS_ALLOWED(a)}}}return null}o(Cae,"validateNoSUPerms");function Oae(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:sr.ROLE_PERMS_ERROR,...e};return Eae(new Error,n,gae.BAD_REQUEST)}else return null}o(Oae,"generateRolePermResponse");function pr(e,t,r,n){if(!r)t.main_permissions.push(e);else{let s=n?r+"_"+n:r;t.schema_permissions[s]?t.schema_permissions[s].push(e):t.schema_permissions[s]=[e]}}o(pr,"addPermError")});var kp=v((eve,iq)=>{"use strict";var rq=Gn(),nq=hn(),Pae=Sl(),pN=tq(),hN=Ho(),ZMe=require("uuid").v4,Lae=require("util"),uS=(q(),M(z)),Dae=ae(),EN=nq.searchByValue,Mae=nq.searchByHash,vae=Lae.promisify(Pae.delete),Uae=ui(),xae=Zu(),{hdbErrors:Bae,handleHDBError:Pl}=_e(),{HDB_ERROR_MSGS:sq,HTTP_STATUS_CODES:Fp}=Bae,{UserEventMsg:_N}=is();iq.exports={addRole:Fae,alterRole:kae,dropRole:Hae,listRoles:Gae};function mN(e){try{e.hdb_auth_header&&delete e.hdb_auth_header,e.HDB_INTERNAL_PATH&&delete e.HDB_INTERNAL_PATH,e.operation&&delete e.operation,e.hdb_user&&delete e.hdb_user}catch{}return e}o(mN,"scrubRoleDetails");async function Fae(e){let t=pN.addRoleValidation(e);if(t)throw t;e=mN(e);let r={schema:"system",table:"hdb_role",attribute:"role",value:e.role,hash_attribute:"id",get_attributes:["*"]},n;try{n=Array.from(await EN(r)||[])}catch(i){throw Pl(i)}if(n&&n.length>0)throw Pl(new Error,sq.ROLE_ALREADY_EXISTS(e.role),Fp.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 rq.insert(s),hN.signalUserChange(new _N(process.pid)),e=mN(e),e}o(Fae,"addRole");async function kae(e){let t=pN.alterRoleValidation(e);if(t)throw t;e=mN(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await rq.update(r)}catch(s){throw Pl(s)}if(n&&n?.message==="updated 0 of 1 records")throw Pl(new Error,"Invalid role id",Fp.BAD_REQUEST,void 0,void 0,!0);return await hN.signalUserChange(new _N(process.pid)),e}o(kae,"alterRole");async function Hae(e){let t=pN.dropRoleValidation(e);if(t)throw Pl(new Error,t,Fp.BAD_REQUEST,void 0,void 0,!0);let r=new xae(uS.SYSTEM_SCHEMA_NAME,uS.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Mae(r));if(n.length===0)throw Pl(new Error,sq.ROLE_NOT_FOUND,Fp.NOT_FOUND,void 0,void 0,!0);let s=new Uae(uS.SYSTEM_SCHEMA_NAME,uS.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await EN(s)),a=!1;if(Dae.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){a=!0;break}}if(a===!0)throw Pl(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,Fp.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await vae(c),hN.signalUserChange(new _N(process.pid)),`${n[0].role} successfully deleted`}o(Hae,"dropRole");async function Gae(){return EN({table:"hdb_role",schema:"system",hash_attribute:"id",attribute:"id",value:"*",get_attributes:["*"]})}o(Gae,"listRoles")});var gN={};Re(gN,{start:()=>cq,startOnMainThread:()=>Vae});function cq({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,oq.parseDocument)(r.toString(),{simpleKeys:!0}).toJSON();for(let s in n){let i=n[s];i.permission||(i={permission:i},i.permission.access&&(i.access=i.permission.access,delete i.permission.access));for(let a in i.permission){if(qae.includes(a))continue;let c=i.permission[a];c.tables||(i.permission[a]=c={tables:c});for(let l in c.tables){let u=c.tables[l];if(u.read=!!u.read,u.insert=!!u.insert,u.update=!!u.update,u.delete=!!u.delete,u.attributes){let d=[];for(let f in u.attributes){let m=u.attributes[f];m.attribute_name=f,d.push(m)}u.attribute_permissions=d,delete u.attributes}if(u.attribute_permissions){if(!Array.isArray(u.attribute_permissions))throw new Error("attribute_permissions must be an array if defined");for(let d of u.attribute_permissions)d.read=!!d.read,d.insert=!!d.insert,d.update=!!d.update}else u.attribute_permissions=null}}i.role=i.id=s,await $ae(i)}}}async function $ae(e){let t=at().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,aq.isEqual)(i,e)?void 0:(e.id=r.id,(0,dS.alterRole)(e))}return(0,dS.addRole)(e)}var dS,oq,aq,qae,Vae,lq=se(()=>{we();dS=b(kp()),oq=require("yaml"),aq=require("lodash"),qae=["super_user","cluster_user","structure_user"];o(cq,"start");o($ae,"ensureRole");Vae=cq});async function fS(e){let t=(0,fq.pathToFileURL)(e).toString();if(Kae)return Hp||(Hp=Yae(zae)),(await(await Hp).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function Yae(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),Hp=new Compartment({console,Math,Date,fetch:Wae,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,dq.extname)(r)||(r+=".js"),r)},importHook:o(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){s.Resource=Hr,s.tables=Sn,s.databases=De}};let n=await(0,uq.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),Hp}function Wae(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 zae(){return{Resource:Hr,tables:Sn}}var uq,dq,fq,Kae,Hp,SN=se(()=>{Ga();we();uq=require("fs/promises"),dq=require("path"),fq=require("url"),Kae=!1;o(fS,"secureImport");o(Yae,"getCompartment");o(Wae,"secureOnlyFetch");o(zae,"getGlobalVars")});var TN={};Re(TN,{handleApplication:()=>jae,suppressHandleApplicationWarning:()=>Qae});function mq(e){return typeof e=="function"&&("get"in e||"put"in e||"post"in e||"delete"in e)}async function jae(e){e.handleEntry(t=>{if(t.entryType!=="file"){e.logger.warn(`jsResource plugin cannot handle entry type ${t.entryType}. Modify the 'files' option in ${e.configFilePath} to only include files.`);return}if(t.eventType!=="add"){e.requestRestart();return}fS(t.absolutePath).then(r=>{let n=(0,mS.dirname)(t.urlPath);mq(r.default)&&(e.resources.set(n,r.default),e.logger.debug(`Registered root resource: ${n}`)),pq(e,r,n)}).catch(r=>{e.logger.error(`Failed to load resource module ${t.absolutePath}: ${r}`),e.requestRestart()})})}function pq(e,t,r){for(let n in t){let s=t[n],i=(0,mS.join)(r,n);mq(s)?(e.resources.set(i,s),e.logger.debug(`Registered resource: ${i}`)):typeof s=="object"&&pq(e,s,i)}}var mS,Qae,hq=se(()=>{SN();mS=require("path");o(mq,"isResource");o(jae,"handleApplication");o(pq,"recurseForResources");Qae=!0});var RN={};Re(RN,{start:()=>Jae});function Jae({resources:e}){e.set("login",yN),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var yN,Eq=se(()=>{Ga();o(Jae,"start");yN=class extends Hr{static{o(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:a}=r;return{data:await n.login(s,i)}}}});function Rq(e){let t={openapi:Xae,info:{title:"HarperDB HTTP REST interface",version:Tq.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}],n=o(s=>{if(s.type&&!t.components.schemas[s.type]){t.components.schemas[s.type]={};let i={},a=[];for(let c of s.properties)pS[c.type]?i[c.name]=new AN(pS[c.type],c.type):c.properties?(i[c.name]=new bq(c.type),n(c)):c.elements?.properties&&(i[c.name]=new sce(c.elements.type),n(c.elements)),c.nullable===!1&&a.push(c.name);t.components.schemas[s.type]=new Sq(i,!s.sealed,a)}},"includeDefinitionInSchema");for(let[,s]of e){if(!s.path||s.Resource.isError)continue;let{path:i}=s,a=i.split("/").pop(),{attributes:c,sealed:l}=s.Resource,{prototype:u,primaryKey:d="id"}=s.Resource;if(!c&&e.allTypes.has(s.path)){let J=e.allTypes.get(s.path);l=J.sealed,c=J.properties}if(!d)continue;let f={},m=[],p=[];if(c)for(let{type:J,name:G,elements:H,relationship:X,definition:W,nullable:ue}of c){let ce=W??H?.definition;ce&&n(ce),ue===!1&&p.push(G),X?J==="array"?f[G]={type:"array",items:{$ref:Gs+H.type}}:f[G]={$ref:Gs+J}:ce?J==="array"?f[G]={type:"array",items:{$ref:Gs+ce.type}}:f[G]={$ref:Gs+ce.type}:J==="array"?H.type==="Any"?f[G]={type:"array",items:{format:H.type}}:f[G]={type:"array",items:new AN(pS[H.type],H.type)}:J==="Any"?f[G]={format:J}:f[G]=new AN(pS[J],J),m.push(new IN(G,"query",f[G]))}let h=Object.keys(f),E=new IN(d,"path",{type:"string",format:"ID"});E.required=!0,E.description="primary key of record";let g=new IN("property","path",{enum:h});g.required=!0,t.components.schemas[a]=new Sq(f,!l,p);let R=u.post!==Resource.prototype.post||u.update,S=typeof u.put=="function",y=typeof u.get=="function",C=typeof u.delete=="function",I=typeof u.patch=="function",k="/"+i+"/";R&&(t.paths[k]={},t.paths[k].post=new Zae(a,r,{200:new Ad({$ref:Gs+a},{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}})},"create a new record auto-assigning a primary key")),y&&(t.paths[k]||(t.paths[k]={}),t.paths[k].get=new bN(m,r,{200:new Ad({type:"array",items:{$ref:Gs+a}})},"search for records by the specified property name and value pairs")),t.paths[k]||(t.paths[k]={}),t.paths[k].options=new ece(m,r,{200:new tce},"retrieve information about the communication options available for a target resource or the server as a whole, without performing any resource action"),C&&(t.paths[k]||(t.paths[k]={}),t.paths[k].delete=new gq(m,r,"delete all the records that match the provided query",{204:new _q})),k="/"+i+"/{"+d+"}",y&&(t.paths[k]={},t.paths[k].get=new bN([E],r,{200:new Ad({$ref:Gs+a})},"retrieve a record by its primary key")),S&&(t.paths[k]||(t.paths[k]={}),t.paths[k].put=new rce([E],r,a,{200:new Ad({$ref:Gs+a})},"create or update the record with the URL path that maps to the record's primary key")),I&&(t.paths[k]||(t.paths[k]={}),t.paths[k].patch=new nce([E],r,a,{200:new Ad({$ref:Gs+a})},"patch the record with the URL path that maps to the record's primary key")),C&&(t.paths[k]||(t.paths[k]={}),t.paths[k].delete=new gq([E],r,"delete a record with the given primary key",{204:new _q})),y&&g.schema.enum.length>0&&(k="/"+i+"/{"+d+"}.{property}",t.paths[k]={},t.paths[k].get=new bN([E,g],r,{200:new Ad({enum:h})},"used to retrieve the specified property of the specified record"))}for(let[,s]of e.allTypes)n(s),s.sealed&&t.components.schemas[s.type].additionalProperties&&(t.components.schemas[s.type].additionalProperties=!1);return t}function Zae(e,t,r,n){this.description=n,this.requestBody={content:{"application/json":{schema:{$ref:Gs+e}}}},this.security=t,this.responses=r}function bN(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function ece(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function tce(){this.description=yq,this.headers={},this.content={}}function Ad(e,t){this.description=yq,this.content={"application/json":{schema:e}},this.headers=t}function _q(){this.description="successfully processed request, no content returned to client"}function rce(e,t,r,n,s){this.description=s,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Gs+r}}}},this.responses=n}function nce(e,t,r,n,s){this.description=s,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Gs+r}}}},this.responses=n}function gq(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function Sq(e,t,r){this.type="object",this.properties=e,this.additionalProperties=t,this.required=r}function AN(e,t){this.type=e,(e==="string"||e==="number"||e==="integer")&&t!=="String"&&(this.format=t)}function bq(e){this.$ref=`#/components/schemas/${e}`}function sce(e){this.type="array",this.items=new bq(e)}function IN(e,t,r){this.name=e,this.in=t,this.schema=r}var Tq,Xae,pS,Gs,yq,Aq=se(()=>{Tq=b(Ct()),Xae="3.0.3",pS={Int:"integer",Float:"number",Long:"integer",ID:"string",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer"},Gs="#/components/schemas/",yq="successful operation";o(Rq,"generateJsonApi");o(Zae,"Post");o(bN,"Get");o(ece,"Options");o(tce,"ResponseOptions200");o(Ad,"Response200");o(_q,"Response204");o(rce,"Put");o(nce,"Patch");o(gq,"Delete");o(Sq,"ResourceSchema");o(AN,"Type");o(bq,"Ref");o(sce,"ArrayRef");o(IN,"Parameter")});var wq={};Re(wq,{Request:()=>rc,createReuseportFd:()=>hS});var Iq,rc,wN,NN,hS,Gp=se(()=>{Iq=require("os"),rc=class{static{o(this,"Request")}#e;#t;_nodeRequest;_nodeResponse;method;url;headers;isWebSocket;user;constructor(t,r){this.method=t.method;let n=t.url;this._nodeRequest=t,this._nodeResponse=r,this.url=n,this.headers=new NN(t.headers)}get absoluteURL(){return this.protocol+"://"+this.host+this.url}get pathname(){let t=this.url.indexOf("?");return t>-1?this.url.slice(0,t):this.url}set pathname(t){let r=this.url.indexOf("?");r>-1?this.url=t+this.url.slice(r):this.url=t}get protocol(){return this._nodeRequest.socket.encrypted?"https":"http"}get ip(){return this._nodeRequest.socket.remoteAddress}get authorized(){return this._nodeRequest.socket.authorized}get peerCertificate(){return this.#t===void 0&&(this.#t=this._nodeRequest.socket.getPeerCertificate?.(!0)||null),this.#t}get mtlsConfig(){return this._nodeRequest.socket.server.mtlsConfig}get body(){return this.#e||(this.#e=new wN(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get httpVersion(){return this._nodeRequest.httpVersion}get isAborted(){return!1}get nodeRequest(){return this._nodeRequest}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},wN=class{static{o(this,"RequestBody")}#e;constructor(t){this.#e=t}on(t,r){return this.#e.on(t,r),this}pipe(t,r){return this.#e.pipe(t,r)}},NN=class{static{o(this,"Headers")}asObject;constructor(t){this.asObject=t}set(t,r){this.asObject[t.toLowerCase()]=r}get(t){return this.asObject[t.toLowerCase()]}has(t){return Object.prototype.hasOwnProperty.call(this.asObject,t.toLowerCase())}[Symbol.iterator](){return Object.entries(this.asObject)[Symbol.iterator]()}keys(){return Object.keys(this.asObject)}values(){return Object.values(this.asObject)}delete(t){delete this.asObject[t.toLowerCase()]}forEach(t){for(let[r,n]of this)t(n,r,this)}};(0,Iq.platform)()!="win32"&&(hS=require("node-unix-socket").createReuseportFd)});var _S={};Re(_S,{parseHeaderValue:()=>ON,start:()=>ace});async function oce(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&Z_(e);let i=new Fs;try{e.responseHeaders=i;let a=e.url.slice(1),c,l;if(a!==Nq){let g=ES.getMatch(a,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new ai(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=ON(g);for(let S of R)switch(S.name){case"max-age":e.expiresAt=S.value*1e3+Date.now();break;case"only-if-cached":e.onlyIfCached=!0;break;case"no-cache":e.noCache=!0;break;case"no-store":e.noCacheStore=!0;break;case"stale-if-error":e.staleIfError=!0;break;case"must-revalidate":e.mustRevalidate=!0;break}}}let u=r["x-replicate-to"];if(u){let g=ON(u).map(R=>(R.next?.name==="confirm"&&R.next.value>=0&&(e.replicatedConfirmation=+R.next.value),R.name));e.replicateTo=g.length===1&&+g[0]>=0?+g[0]:g[0]==="*"?void 0:g}r["x-replicate-from"]==="none"&&(e.replicateFrom=!1);let f=await bt(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=Lo(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new Id.ClientError(g,400)}if(e.authorize=!0,a===Nq&&s==="GET"){if(e?.user?.role?.permission?.super_user)return Rq(ES);throw new Id.ServerError("Forbidden",403)}switch(c.checkPermission=e.user?.role?.permission??{},s){case"GET":case"HEAD":return l.get(c,e);case"POST":return l.post(c,e.data,e);case"PUT":return l.put(c,e.data,e);case"DELETE":return l.delete(c,e);case"PATCH":return l.patch(c,e.data,e);case"OPTIONS":i.setIfNone("Allow","GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE");return;case"CONNECT":return l.connect(c,null,e);case"TRACE":return"HarperDB is the terminating server";case"QUERY":return l.query(c,e.data,e);case"COPY":return l.copy(c,r.destination,e);case"MOVE":return l.move(c,r.destination,e);case"BREW":throw new Id.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Id.ServerError(`Method ${s} is not recognized`,501)}}),m=200,p=e.lastModified;if(f==null)m=s==="GET"||s==="HEAD"?404:204,CN.lastModified&&isFinite(p)&&i.setIfNone("Last-Modified",new Date(p).toUTCString());else if(f.status>0&&f.headers){let g=uG(f.headers,i);return f.headers!==g&&(f.headers=g),f.data!==void 0&&(f.body=bm(f.data,e,f)),f}else if(isFinite(p)){ice[0]=p;let g=String.fromCharCode(34,(rn[0]&63)+62,(rn[0]>>6)+(rn[1]<<2&63)+62,(rn[1]>>4)+(rn[2]<<4&63)+62,(rn[2]>>2)+62,(rn[3]&63)+62,(rn[3]>>6)+(rn[4]<<2&63)+62,(rn[4]>>4)+(rn[5]<<4&63)+62,(rn[5]>>2)+62,(rn[6]&63)+62,(rn[6]>>6)+(rn[7]<<2&63)+62,34),R=r["if-none-match"];R&&g==R?(f?.onDone&&f.onDone(),m=304,f=void 0):i.setIfNone("ETag",g),CN.lastModified&&i.setIfNone("Last-Modified",new Date(p).toUTCString())}e.createdResource&&(m=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let h={status:m,headers:i,body:void 0},E=e.loadedFromSource??f?.wasLoadedFromSource?.();return E!==void 0&&(h.wasCacheMiss=E,!E&&isFinite(p)&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||p))/1e3))),f!==void 0&&(h.body=bm(f,e,h),s==="HEAD"&&(h.body=void 0)),h}catch(a){a.statusCode?a.statusCode===500?hi.warn(a):hi.info(a):hi.error(a),a.statusCode===405&&(a.method&&(a.message+=` to handle HTTP method ${a.method.toUpperCase()||""}`),a.allow&&(a.allow.push("trace","head","options"),i.setIfNone("Allow",a.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:a.statusCode||500,headers:i,body:void 0};return c.body=bm(a.contentType?a:Pq(a),e,c),c}}function ace(e){CN=e,e.includeExpensiveRecordCountEstimates&&(rc.prototype.includeExpensiveRecordCountEstimates=!0),!Cq&&(Cq=!0,ES=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return oce(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{qp++;let s=new Xn;Oq||(Oq=!0,Fm(l=>{qp>0&&l.push({metric:"ws-connections",connections:qp,byThread:!0})}));let i;t.on("error",l=>{i=!0,hi.warn(l)});let a;t.on("message",o(function(u){a||(a=Lo(r.requestedContentType??r.headers.asObject["content-type"],!1));let d=a(u);Ve(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(d)},"message"));let c;t.on("close",()=>{qp--,Zr(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=ES.getMatch(l,"ws");if(Zr(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,Ve(h=>({count:h.count,total:qp}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let d=new ai(u.relativeURL);d.checkPermission=r.user?.role?.permission??{};let f=u.Resource;c=(await bt(r,()=>f.connect(d,s,r)))[Symbol.asyncIterator]();let p;for(;!(p=await c.next()).done;){let h=await Po(p.value,r);t.send(h),Ve(h.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(E=>t._socket.once("drain",E))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?hi.warn(l):hi.info(l):hi.error(l),t.close(cce[l.statusCode]||1011,Pq(l))}t.close()},e))}function ON(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,a]=s.trim().split("=");i=i.trim(),a&&(a=a.trim()),r={name:i.toLowerCase(),value:a,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var hi,Id,Pq,rn,ice,CN,Nq,Cq,ES,Oq,qp,cce,Lq=se(()=>{Do();ts();hi=b(Q()),Id=b(_e());eg();wu();va();Np();Aq();Gp();rg();({errorToString:Pq}=hi),rn=new Uint8Array(8),ice=new Float64Array(rn.buffer,0,1),CN={},Nq="openapi";o(oce,"http");qp=0;o(ace,"start");cce={401:3e3,403:3003};o(ON,"parseHeaderValue")});var PN=v((wve,Mq)=>{var{recordAction:gS,recordActionBinary:Dq}=(ts(),M(K_)),lce=require("fastify-plugin"),uce=200;Mq.exports=lce(function(e,t,r){e.addHook("onResponse",async(n,s)=>{let i=s.elapsedTime}),e.addHook("onSend",async(n,s,i)=>{let a=s.elapsedTime,c=performance.now(),l=s.request.routeOptions,u,d,f;l.config?.isOperation?(u=n.body?.operation,d="operation"):(u=l.url,d="fastify-route",f=l.method),gS(a,"duration",u,f,d),Dq(s.raw.statusCode<400,"success",u,f,d),Dq(1,"response_"+s.raw.statusCode,u,f,d);let m=uce;i?.pipe?(i.on("data",g=>{m+=g.length}),i.on("end",()=>{gS(performance.now()-c,"transfer",u,f,d),gS(m,"bytes-sent",u,f,d)})):(m+=i?.length||0,gS(m,"bytes-sent",u,f,d));let p=a.toFixed(3),h=s.getHeader("Server-Timing"),E=`db;dur=${p}`;s.header("Server-Timing",h?`${h}, ${E}`:E)}),r()},{name:"hdb-request-time"})});var Uq=v((Nve,vq)=>{var dce=mt(),fce={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};vq.exports=function(e){return dce.validateObject(e,fce)}});var SS=v((Cve,xq)=>{"use strict";var mce=(q(),M(z)).OPERATIONS_ENUM,LN=class{static{o(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=mce.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};xq.exports=LN});var Kp={};Re(Kp,{createTokens:()=>vN,getJWTRSAKeys:()=>AS,refreshOperationToken:()=>UN,validateOperationToken:()=>xN,validateRefreshToken:()=>IS});async function AS(){if(TS)return TS;try{let e=$p.default.join(Vp.default.getHdbBasePath(),_b),t=await yS.default.readFile($p.default.join(e,om.JWT_PASSPHRASE_NAME),"utf8"),r=await yS.default.readFile($p.default.join(e,om.JWT_PRIVATE_KEY_NAME),"utf8");return TS={publicKey:await yS.default.readFile($p.default.join(e,om.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},TS}catch(e){throw bS.default.error(e),new Ei.ClientError(Nd.NO_ENCRYPTION_KEYS,wd.INTERNAL_SERVER_ERROR)}}async function vN(e){let t=(0,DN.validateBySchema)(e,io.default.object({username:io.default.string().optional(),password:io.default.string().optional(),role:io.default.string().optional(),expires_in:io.default.alternatives(io.default.string(),io.default.number()).optional()}));if(t)throw new Ei.ClientError(t.message);let r;try{let f=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,f=!1),r=await(0,MN.findAndValidateUser)(e.username,e.password,f)}catch(f){throw bS.default.error(f),new Ei.ClientError(Nd.INVALID_CREDENTIALS,wd.UNAUTHORIZED)}if(!r)throw new Ei.ClientError(Nd.INVALID_CREDENTIALS,wd.UNAUTHORIZED);let n=!1,s=!1;r.role?.permission&&(n=r.role.permission.super_user===!0,s=r.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s};e.role&&(i.role=e.role);let a=await AS(),c=await Cd.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:e.expires_in??Gq,algorithm:RS,subject:Od.OPERATION}),l=await Cd.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:pce,algorithm:RS,subject:Od.REFRESH}),u=dw(l,Gr.SHA256);if((await(0,Bq.update)(new Fq.default(sm,bu.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new Ei.ClientError(Nd.REFRESH_TOKEN_SAVE_FAILED,wd.INTERNAL_SERVER_ERROR);return kq.default.signalUserChange(new Hq.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function UN(e){let t=(0,DN.validateBySchema)(e,io.default.object({refresh_token:io.default.string().required()}).required());if(t)throw new Ei.ClientError(t.message);let{refresh_token:r}=e;await IS(r);let n=await AS(),s=await Cd.default.decode(r);return{operation_token:await Cd.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:Gq,algorithm:RS,subject:Od.OPERATION})}}async function xN(e){return qq(e,Od.OPERATION)}async function IS(e){return qq(e,Od.REFRESH)}async function qq(e,t){try{let r=await AS(),n=await Cd.default.verify(e,r.publicKey,{algorithms:RS,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,MN.findAndValidateUser)(n.username,void 0,!1);if(t===Od.REFRESH&&!fw(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw bS.default.warn(r),r?.name==="TokenExpiredError"?new Ei.ClientError(Nd.TOKEN_EXPIRED,wd.FORBIDDEN):new Ei.ClientError(Nd.INVALID_TOKEN,wd.UNAUTHORIZED)}}var Cd,yS,$p,io,DN,Ei,bS,MN,Bq,Fq,kq,Hq,Vp,wd,Nd,Gq,pce,RS,Od,TS,Pd=se(()=>{Cd=b(require("jsonwebtoken")),yS=b(require("fs-extra")),$p=b(require("node:path")),io=b(require("joi")),DN=b(mt());q();Ei=b(_e()),bS=b(Q());pw();MN=b(fs()),Bq=b(Gn()),Fq=b(SS()),kq=b(Ho()),Hq=b(is()),Vp=b(me()),{HTTP_STATUS_CODES:wd,AUTHENTICATION_ERROR_MSGS:Nd}=Ei.hdbErrors;Vp.default.initSync();Gq=Vp.default.get(F.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",pce=Vp.default.get(F.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",RS="RS256",Od={OPERATION:"operation",REFRESH:"refresh"};o(AS,"getJWTRSAKeys");o(vN,"createTokens");o(UN,"refreshOperationToken");o(xN,"validateOperationToken");o(IS,"validateRefreshToken");o(qq,"validateToken")});var BN=v((Mve,Kq)=>{"use strict";var hce=Uq(),Ld=require("passport"),Ece=require("passport-local").Strategy,_ce=require("passport-http").BasicStrategy,gce=require("util"),Sce=fs(),Vq=gce.callbackify(Sce.findAndValidateUser),Dve=zr(),Tce=(q(),M(z)),$q=(Pd(),M(Kp));Ld.use(new Ece(function(e,t,r){Vq(e,t,r)}));Ld.use(new _ce(function(e,t,r){Vq(e,t,r)}));Ld.serializeUser(function(e,t){t(null,e)});Ld.deserializeUser(function(e,t){t(null,e)});function yce(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let a=e.headers.authorization.split(" ");n=a[0],s=a[1]}function i(a,c){return a?r(a):c?r(null,c):r("Must login")}switch(o(i,"handleResponse"),n){case"Basic":Ld.authenticate("basic",{session:!1},(a,c)=>{i(a,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===Tce.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?$q.validateRefreshToken(s).then(a=>{e.body.refresh_token=s,r(null,a)}).catch(a=>{r(a)}):$q.validateOperationToken(s).then(a=>{r(null,a)}).catch(a=>{r(a)});break;default:Ld.authenticate("local",{session:!1},function(a,c){i(a,c)})(e,t,r);break}}o(yce,"authorize");function Rce(e,t){let r=hce(e);if(r){t(r);return}let n={authorized:!0,messages:[]},s=e.user.role;if(!s?.permission)return t("Invalid role");let i=JSON.parse(s.permission);if(i.super_user)return t(null,n);if(!i[e.schema])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.schema} schema`),t(null,n);if(!i[e.schema].tables[e.table])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.table} table`),t(null,n);if(!i[e.schema].tables[e.table][e.operation])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.operation} on ${e.table} table`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&!e.attributes)return n.authorized=!1,n.messages.push(`${e.schema}.${e.table} has attribute permissions. Missing attributes to validate`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&e.attributes){let a=i[e.schema].tables[e.table].attribute_permissions;for(let c in a)e.attributes.indexOf(a[c].attribute_name)>-1&&!a[c][e.operation]&&(n.authorized=!1,n.messages.push(`Not authorized to ${e.operation} ${a[c].attribute_name} `))}return t(null,n)}o(Rce,"checkPermissions");Kq.exports={authorize:yce,checkPermissions:Rce}});var $N=v((Bve,jq)=>{var OS=require("clone"),PS=mt(),bce=ae(),NS=(q(),M(z)),Uve=Q(),FN=require("fs"),HN=require("joi"),{string:CS}=HN.types(),{hdbErrors:Ace,handleHDBError:wS}=_e(),{HDB_ERROR_MSGS:xve,HTTP_STATUS_CODES:kN}=Ace,{commonValidators:Dd}=Ki(),Yq=" is required",Ice=["insert","update","upsert"],GN={database:{presence:!1,format:Dd.schema_format,length:Dd.schema_length},schema:{presence:!1,format:Dd.schema_format,length:Dd.schema_length},table:{presence:!0,format:Dd.schema_format,length:Dd.schema_length},action:{inclusion:{within:Ice,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},wce={schema:CS.required(),table:CS.required(),action:CS.valid("insert","update","upsert")},{AWS_ACCESS_KEY:Nce,AWS_SECRET:Cce,AWS_BUCKET:Oce,AWS_FILE_KEY:Pce,REGION:Lce}=NS.S3_BUCKET_AUTH_KEYS,Dce={s3:{presence:!0},[`s3.${Nce}`]:{presence:!0,type:"String"},[`s3.${Cce}`]:{presence:!0,type:"String"},[`s3.${Oce}`]:{presence:!0,type:"String"},[`s3.${Pce}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${Lce}`]:{presence:!0,type:"String"}},Wq=OS(GN);Wq.data.presence={message:Yq};var zq=OS(GN);zq.file_path.presence={message:Yq};var Mce=Object.assign(OS(GN),Dce),qN=OS(wce);qN.csv_url=CS.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();qN.passthrough_headers=HN.object();function vce(e){let t=PS.validateObject(e,Wq);return LS(e,t)}o(vce,"dataObject");function Uce(e){let t=PS.validateBySchema(e,HN.object(qN));return LS(e,t)}o(Uce,"urlObject");function xce(e){let t=PS.validateObject(e,zq);return LS(e,t)}o(xce,"fileObject");function Bce(e){let t=PS.validateObject(e,Mce);return LS(e,t)}o(Bce,"s3FileObject");function LS(e,t){if(!t){let r=bce.checkGlobalSchemaTable(e.schema,e.table);if(r)return wS(new Error,r,kN.BAD_REQUEST);if(e.operation===NS.OPERATIONS_ENUM.CSV_FILE_LOAD)try{FN.accessSync(e.file_path,FN.constants.R_OK|FN.constants.F_OK)}catch(n){return n.code===NS.NODE_ERROR_CODES.ENOENT?wS(n,`No such file or directory ${n.path}`,kN.BAD_REQUEST):n.code===NS.NODE_ERROR_CODES.EACCES?wS(n,`Permission denied ${n.path}`,kN.BAD_REQUEST):wS(n)}}return t}o(LS,"postValidateChecks");jq.exports={dataObject:vce,urlObject:Uce,fileObject:xce,s3FileObject:Bce}});var VN=v((kve,Qq)=>{"use strict";var Yp=Q(),DS=(q(),M(z));async function Fce(e,t,r,n=void 0){if(!e||typeof e!="function")throw new Error("Invalid function parameter");let s;try{return s=await e(t),r&&await r(t,s,n),t.operation===DS.OPERATIONS_ENUM.INSERT||t.operation===DS.OPERATIONS_ENUM.UPDATE||t.operation===DS.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===DS.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(Yp.info(i.message),i):i.http_resp_msg?(Yp.error(`Error calling operation: ${e.name}`),Yp.error(i.http_resp_msg),i):(Yp.error(`Error calling operation: ${e.name}`),Yp.error(i),i)}}o(Fce,"callOperationFunctionAsAwait");Qq.exports={callOperationFunctionAsAwait:Fce}});var KN=v((Gve,Xq)=>{"use strict";var{S3:kce,GetObjectCommand:Hce}=require("@aws-sdk/client-s3");Xq.exports={getFileStreamFromS3:Gce,getS3AuthObj:Jq};async function Gce(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await Jq(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new Hce(r))).Body}o(Gce,"getFileStreamFromS3");function Jq(e,t,r){return new kce({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(Jq,"getS3AuthObj")});var e$=v(($ve,Zq)=>{"use strict";var YN=class{static{o(this,"BulkLoadFileObject")}constructor(t,r,n,s,i,a,c=null){this.op=t,this.action=r,this.schema=n,this.table=s,this.file_path=i,this.file_type=a,this.role_perms=c}},WN=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};Zq.exports={BulkLoadFileObject:YN,BulkLoadDataObject:WN}});var r$=v((Kve,t$)=>{"use strict";var zN=class{static{o(this,"PermissionTableResponseObject")}constructor(t,r,n=[],s=[]){this.schema=t,this.table=r,this.required_table_permissions=n,this.required_attribute_permissions=s}};t$.exports=zN});var s$=v((Wve,n$)=>{"use strict";var jN=class{static{o(this,"PermissionAttributeResponseObject")}constructor(t,r=[]){this.attribute_name=t,this.required_permissions=r}};n$.exports=jN});var JN=v((jve,o$)=>{"use strict";var i$=r$(),qce=s$(),{HDB_ERROR_MSGS:$ce}=zr(),QN=class{static{o(this,"PermissionResponseObject")}constructor(){this.error=$ce.OP_AUTH_PERMS_ERROR,this.unauthorized_access={},this.invalid_schema_items=[]}handleUnauthorizedItem(t){return this.invalid_schema_items=[],this.unauthorized_access=[t],this}handleInvalidItem(t){return this.invalid_schema_items=[t],this.unauthorized_access=[],this}addInvalidItem(t,r,n){if(r&&n){let s=`${r}_${n}`;if(this.unauthorized_access[s])return}this.invalid_schema_items.push(t)}addUnauthorizedTable(t,r,n){let s=new i$(t,r,n),i=`${t}_${r}`;this.unauthorized_access[i]=s}addUnauthorizedAttributes(t,r,n,s){let i=[];t.forEach(c=>{let l=new qce(c,s[c]);i.push(l)});let a=`${r}_${n}`;if(this.unauthorized_access[a])this.unauthorized_access[a].required_attribute_permissions=i;else{let c=new i$(r,n,[],i);this.unauthorized_access[a]=c}}getPermsResponse(){let t=Object.values(this.unauthorized_access);return t.length>0||this.invalid_schema_items.length>0?(this.unauthorized_access=t,this):null}};o$.exports=QN});var Ll=v((Xve,u$)=>{"use strict";var Jve=hn(),Wp=Q(),{validateBySchema:a$}=mt(),Yo=require("joi"),Vce=Xi(),MS=ae(),{handleHDBError:vS,hdbErrors:Kce,ClientError:c$}=_e(),{HDB_ERROR_MSGS:US,HTTP_STATUS_CODES:XN}=Kce,l$=me();l$.initSync();var{getDatabases:ZN}=(we(),M(ft)),Yce=require("fs-extra"),Wce=(q(),M(z));u$.exports={describeAll:zce,describeTable:xS,describeSchema:jce};async function zce(e={}){try{let t=MS.isEmptyOrZeroLength(e),r=!!e.bypass_auth,n,s;!t&&!r&&(n=e.hdb_user?.role?.permission,s=n?.super_user||n?.cluster_user);let i=ZN(),a={},c={},l=[],u=e?.exact_count,d=e?.include_computed;for(let m in i){a[m]=!0,!t&&!s&&!r&&(c[m]=e.hdb_user?.role?.permission[m]?.describe);let p=i[m];for(let h in p)try{let E;if(t||s||r)E=await xS({schema:m,table:h,exact_count:u,include_computed:d});else if(n&&n[m].describe&&n[m].tables[h].describe){let g=n[m].tables[h].attribute_permissions;E=await xS({schema:m,table:h,exact_count:u,include_computed:d},g)}E&&l.push(E)}catch(E){Wp.error(E)}}let f={};for(let m in l)t||s||r?(f[l[m].schema]==null&&(f[l[m].schema]={}),f[l[m].schema][l[m].name]=l[m],a[l[m].schema]&&delete a[l[m].schema]):c[l[m].schema]&&(f[l[m].schema]==null&&(f[l[m].schema]={}),f[l[m].schema][l[m].name]=l[m],a[l[m].schema]&&delete a[l[m].schema]);for(let m in a)t||s||r?f[m]={}:c[m]&&(f[m]={});return f}catch(t){return Wp.error("Got an error in describeAll"),Wp.error(t),vS(new Error,US.DESCRIBE_ALL_ERR)}}o(zce,"describeAll");async function xS(e,t){MS.transformReq(e);let{schema:r,table:n}=e;r=r?.toString(),n=n?.toString();let s=t;e.hdb_user&&!e.hdb_user?.role?.permission?.super_user&&(s=e.hdb_user?.role?.permission[r]?.tables[n]?.attribute_permissions);let i=a$(e,Yo.object({database:Yo.string(),table:Yo.string().required(),exact_count:Yo.boolean().strict(),include_computed:Yo.boolean().strict()}));if(i)throw new c$(i.message);let c=ZN()[r];if(!c)throw vS(new Error,US.SCHEMA_NOT_FOUND(e.schema),XN.NOT_FOUND);let l=c[n];if(!l)throw vS(new Error,US.TABLE_NOT_FOUND(e.schema,e.table),XN.NOT_FOUND);function u(p){(!p.computed||e.include_computed)&&d.push({attribute:p.attribute,type:p.type,elements:p.elements?.type,indexed:p.indexed,is_primary_key:p.isPrimaryKey,assigned_created_time:p.assignCreatedTime,assigned_updated_time:p.assignUpdatedTime,nullable:p.nullable,computed:p.computed?!0:void 0,properties:p.properties?p.properties.map(h=>({type:h.type,name:h.name})):void 0})}o(u,"pushAtt");let d=[];if(s){let p={};s.forEach(h=>{h.describe&&(p[h.attribute_name]=!0)}),l.attributes.forEach(h=>{p[h.name]&&u(h)})}else l.attributes?.forEach(p=>u(p));let f;try{f=(await Yce.stat(l.primaryStore.env.path)).size}catch(p){Wp.warn("unable to get database size",p)}let m={schema:r,name:l.tableName,hash_attribute:l.attributes.find(p=>p.isPrimaryKey||p.is_hash_attribute)?.name,audit:l.audit,schema_defined:l.schemaDefined,attributes:d,db_size:f};l.replicate!==void 0&&(m.replicate=l.replicate),l.expirationMS!==void 0&&(m.expiration=l.expirationMS/1e3+"s"),l.sealed!==void 0&&(m.sealed=l.sealed),l.sources?.length>0&&(m.sources=l.sources.map(p=>p.name).filter(p=>p&&p!=="NATSReplicator"&&p!=="Replicator")),l$.get(Wce.CONFIG_PARAMS.CLUSTERING_ENABLED)&&(m.clustering_stream_name=Vce.createNatsTableStreamName(m.schema,m.name));try{let p=await l.getRecordCount({exactCount:!!e.exact_count});m.record_count=p.recordCount,m.table_size=l.getSize(),m.db_audit_size=l.getAuditSize(),m.estimated_record_range=p.estimatedRange;let h=l.auditStore;if(h)for(let E of h.getKeys({reverse:!0,limit:1}))m.last_updated_record=E[0];if(!m.last_updated_record&&l.indices.__updatedtime__)for(let E of l.indices.__updatedtime__.getKeys({reverse:!0,limit:1}))m.last_updated_record=E}catch(p){Wp.warn(`unable to stat table dbi due to ${p}`)}return m}o(xS,"descTable");async function jce(e){MS.transformReq(e);let t=a$(e,Yo.object({database:Yo.string(),exact_count:Yo.boolean().strict(),include_computed:Yo.boolean().strict()}));if(t)throw new c$(t.message);let r;e.hdb_user&&!e.hdb_user?.role?.permission?.super_user&&(r=e.hdb_user?.role?.permission[e.schema]);let n=e.schema.toString(),i=ZN()[n];if(!i)throw vS(new Error,US.SCHEMA_NOT_FOUND(e.schema),XN.NOT_FOUND);let a={};for(let c in i){let l;if(r&&r.tables[c]&&(l=r.tables[c]),MS.isEmpty(l)||l.describe){let u=await xS({schema:e.schema,table:c,exact_count:e.exact_count,include_computed:e.include_computed},l?l.attribute_permissions:null);u&&(a[u.name]=u)}}return a}o(jce,"describeSchema")});var h$=v((eUe,p$)=>{"use strict";var Qce=Ll(),{hdbErrors:d$}=_e(),{getDatabases:f$}=(we(),M(ft));p$.exports={checkSchemaExists:m$,checkSchemaTableExists:Jce,schemaDescribe:Qce};async function m$(e){if(!f$()[e])return d$.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}o(m$,"checkSchemaExists");async function Jce(e,t){let r=await m$(e);if(r)return r;if(!f$()[e][t])return d$.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}o(Jce,"checkSchemaTableExists")});function eC(e){let t=e.get(BS),r=t?(0,Md.unpack)(t):null;r||(r={remoteNameToId:{}});let n=it(),s=!1;r.nodeName=it();let i=r.remoteNameToId;if(i[n]!==0){let a=0,c;for(let l in i){let u=i[l];u===0?c=l:u>a&&(a=u)}if(c){a++,i[c]=a;let l=[Symbol.for("seq"),a];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:jp(e)??1,nodes:[]})})}i[n]=0,e.putSync(BS,(0,Md.pack)(r))}return r}function zp(e){return eC(e).remoteNameToId}function _$(e,t){let r=eC(t),n=r.remoteNameToId,s=new Map,i=!1;for(let a in e){let c=e[a],l=n[a];if(l==null){let u=0;for(let d in n){let f=n[d];f>u&&(u=f)}l=u+1,n[a]=l,i=!0}s.set(c,l)}return i&&t.putSync(BS,(0,Md.pack)(r)),s}function FS(e,t){let r=eC(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let a in n){let c=n[a];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(BS,(0,Md.pack)(r))}return E$.trace?.("The remote node name map",e,n,s),s}var E$,Md,BS,tC=se(()=>{E$=b(Zn());hs();Md=require("msgpackr"),BS=Symbol.for("remote-ids");o(eC,"getIdMappingRecord");o(zp,"exportIdMapping");o(_$,"remoteToLocalNodeId");o(FS,"getIdOfRemoteNode")});var b$={};Re(b$,{commitsAwaitingReplication:()=>Ud,getHDBNodeTable:()=>jt,getReplicationSharedStatus:()=>xd,iterateRoutes:()=>Jp,shouldReplicateToNode:()=>Qp,subscribeToNodeUpdates:()=>Bd});function jt(){return g$||(g$=Ze({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 xd(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(64),n&&{callback:n}))}function Bd(e){jt().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;R$.debug?.("adding node",n,"on node",it()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==it()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of jt().search({}))if(i.shard!=null){let a=s.get(i.shard);a||s.set(i.shard,a=[]),a.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function Qp(e,t){return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&jt().primaryStore.get(it())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function Xce(){Bd(e=>{nc({},(t,r)=>{let n=e.name,s=S$.get(n);if(s||S$.set(n,s=new Map),s.has(r))return;let i;for(let a in t)if(i=t[a].auditStore,i)break;if(i){let a=xd(i,r,n,()=>{let c=a[0],l=a.lastTime;for(let{txnTime:u,onConfirm:d}of Ud.get(r)||[])u>l&&u<=c&&d();a.lastTime=c});a.lastTime=0,s.set(r,a)}})})}function*Jp(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=vd.default.get(F.REPLICATION_SECUREPORT)??(!vd.default.get(F.REPLICATION_PORT)&&vd.default.get(F.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||vd.default.get(F.REPLICATION_PORT)||vd.default.get(F.OPERATIONSAPI_NETWORK_PORT);let a=i?.lastIndexOf?.(":");a>0&&(i=+i.slice(a+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){T$.isMainThread&&console.error("Invalid route, must specify a url or host (with port)");continue}yield{replicates:!t.subscriptions,url:r,subscription:t.subscriptions,routes:t.routes,startTime:t.startTime,revoked_certificates:t.revokedCertificates}}}var T$,y$,vd,R$,g$,S$,Ud,Fd=se(()=>{we();hs();_m();T$=require("worker_threads"),y$=b(_e()),vd=b(me());q();R$=b(Zn());server.nodes=[];o(jt,"getHDBNodeTable");o(xd,"getReplicationSharedStatus");o(Bd,"subscribeToNodeUpdates");o(Qp,"shouldReplicateToNode");S$=new Map;sU((e,t,r)=>{if(r>server.nodes.length)throw new y$.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);Ud||(Ud=new Map,Xce());let n=Ud.get(e);return n||(n=[],Ud.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:o(()=>{++i===r&&s()},"onConfirm")})})});o(Xce,"startSubscriptionToReplications");o(Jp,"iterateRoutes")});var C$={};Re(C$,{connectedToNode:()=>Dl,disconnectedFromNode:()=>Hd,ensureNode:()=>Wo,requestClusterStatus:()=>N$,startOnMainThread:()=>rC});async function rC(e){let t=0,r=at();for(let i of Object.getOwnPropertyNames(r)){let a=r[i];for(let c in a){let l=a[c];if(l.auditStore){kS.set(i,jp(l.auditStore));break}}}ao.whenThreadsStarted.then(async()=>{let i=[];for await(let l of r.system.hdb_nodes?.search([])||[])i.push(l);let a=it();function c(){let l=jt().primaryStore.get(a);if(l!==null){let u=e.url??sc();if(l===void 0||l.url!==u||l.shard!==e.shard)return Wo(a,{name:a,url:u,shard:e.shard,replicates:!0})}}o(c,"ensureThisNode"),jt().primaryStore.get(a)&&c();for(let l of Jp(e))try{let u=!l.subscriptions;if(u&&await c(),u&&l.replicates==null&&(l.replicates=!0),i.find(d=>d.url===l.url))continue;s(l)}catch(u){console.error(u)}Bd(s)});let n;function s(i,a=i?.name){let c=it()&&a===it()||sc()&&i?.url===sc();if(c){let f=!!i?.replicates;if(n!==void 0&&n!==f)for(let m of jt().search([]))m.replicates&&m.name!==a&&s(m,m.name);n=f}if(ut.trace("Setting up node replication for",i),!i){for(let[f,m]of oo){let p;for(let[h,{worker:E,nodes:g}]of m){let R=g[0];if(R&&R.name==a){p=!0;for(let[S,{worker:y}]of m)m.delete(S),ut.warn("Node was deleted, unsubscribing from node",a,S,f),y?.postMessage({type:"unsubscribe-from-node",node:a,database:S,url:f});break}}if(p){oo.get(f).iterator.remove(),oo.delete(f);return}}return}if(c)return;if(!i.url){ut.info(`Node ${i.name} is missing url`);return}let l=oo.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(ut.info(`Added node ${i.name} at ${i.url} for process ${it()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[f,m]of kd)if(i.url===m.url){kd.delete(f);break}kd.set(i.name,i)}let u=at();if(l||(l=new Map,oo.set(i.url,l)),l.iterator=nc(e,(f,m,p)=>{p?d(m,!0):d(m,!1)}),i.subscriptions)for(let f of i.subscriptions){let m=f.database||f.schema;u[m]||(ut.warn(`Database ${m} not found for node ${i.name}, making a subscription anyway`),d(m,!1))}function d(f,m){ut.trace("Setting up replication for database",f,"on node",i.name);let p=l.get(f),h,E=[{replicateByDefault:m,...i}];kS.has(f)&&Xp.default.get(F.REPLICATION_FAILOVER)&&(E.push({replicateByDefault:m,name:it(),startTime:kS.get(f),endTime:Date.now(),replicates:!0}),kS.delete(f));let g=Qp(i,f),R=ao.workers.filter(S=>S.name==="http");if(p?(h=p.worker,p.nodes=E):g&&(t=t%R.length,h=R[t++],l.set(f,{worker:h,nodes:E,url:i.url}),h?.on("exit",()=>{l.get(f)?.worker===h&&(l.delete(f),d(f,m))})),g)setTimeout(()=>{let S={type:"subscribe-to-node",database:f,nodes:E};h?h.postMessage(S):Zp(S)},Zce);else{ut.info("Node no longer should be used, unsubscribing from node",{replicates:i.replicates,databaseName:f,node:i,subscriptions:i.subscriptions,hasDatabase:!!u[f],thisReplicates:jt().primaryStore.get(it())?.replicates}),jt().primaryStore.get(it())?.replicates||(n=!1,ut.info("Disabling replication, this node name",it(),jt().primaryStore.get(it()),f));let S={type:"unsubscribe-from-node",database:f,url:i.url,name:i.name};h?h.postMessage(S):GS(S)}}o(d,"onDatabase")}o(s,"onNodeUpdate"),Hd=o(function(i){try{ut.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let a=Array.from(kd.keys()),c=a.sort(),l=c.indexOf(i.name||_i(i.url));if(l===-1){ut.warn("Disconnected node not found in node map",i.name,a);return}let u=oo.get(i.url),d=u?.get(i.database);if(!d){ut.warn("Disconnected node not found in replication map",i.database,u);return}if(d.connected=!1,i.finished||!Xp.default.get(F.REPLICATION_FAILOVER))return;let f=d.nodes[0];if(!(f.replicates===!0||f.replicates?.sends||f.subscriptions?.length))return;let m=f.shard,p=(l+1)%c.length;for(;l!==p;){let h=c[p],E=kd.get(h);u=oo.get(E.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==m){p=(p+1)%c.length;continue}let{worker:R,nodes:S}=g,y=!1;for(let C of d.nodes){if(S.some(I=>I.name===C.name)){ut.info(`Disconnected node is already failing over to ${h} for ${i.database}`);continue}C.endTime<Date.now()||(S.push(C),y=!0)}if(d.nodes=[d.nodes[0]],!y){ut.info(`Disconnected node ${i.name} has no nodes to fail over to ${h}`);return}ut.info(`Failing over ${i.database} from ${i.name} to ${h}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:S}):Zp({database:i.database,nodes:S});return}ut.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(a){ut.error("Error failing over node",a)}},"disconnectedFromNode"),Dl=o(function(i){let a=oo.get(i.url),c=a?.get(i.database);if(!c){ut.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,a);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){ut.warn("Newly connected node has no node subscriptions",i.database,c);return}if(!l.name){ut.debug("Connected node is not named yet",i.database,c);return}if(!Xp.default.get(F.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let d of oo.values()){let f=d.get(i.database);if(!f||f==c)continue;let{worker:m,nodes:p,connected:h}=f;if(p)if(h===!1&&p[0].shard===l.shard)u=!0,c.nodes.push(p[0]);else{let E=p.filter(g=>g&&g.name!==l.name);E.length<p.length&&(f.nodes=E,m.postMessage({type:"subscribe-to-node",database:i.database,nodes:p}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,ao.onMessageByType)("disconnected-from-node",Hd),(0,ao.onMessageByType)("connected-to-node",Dl),(0,ao.onMessageByType)("request-cluster-status",N$)}function N$(e,t){let r=[];for(let[n,s]of kd)try{let i=oo.get(s.url);ut.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let a=[];if(i){for(let[l,{worker:u,connected:d,nodes:f,latency:m}]of i)a.push({database:l,connected:d,latency:m,threadId:u?.threadId,nodes:f.filter(p=>!(p.endTime<Date.now())).map(p=>p.name)});let c=I$(s);c.database_sockets=a,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){ut.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Wo(e,t){let r=jt();e=e??_i(t.url),t.name=e;try{if(t.ca){let s=new w$.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subjectAltName:s.subjectAltName,serialNumber:s.serialNumber,validFrom:s.validFrom,validTo:s.validTo}}}catch(s){ut.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(ut.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!Xp.default.get(F.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],a=I$(n[s]);for(let c of t[s]){let l=!1;for(let u of a)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...a,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}ut.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var ao,HS,ut,A$,Xp,w$,I$,Zce,oo,Hd,Dl,kd,kS,eh=se(()=>{we();ao=b(nt());hs();HS=require("worker_threads");Fd();ut=b(Q()),A$=b(require("lodash")),Xp=b(me());q();w$=require("crypto"),{cloneDeep:I$}=A$.default,Zce=200,oo=new Map,kd=new Map,kS=new Map;o(rC,"startOnMainThread");o(N$,"requestClusterStatus");HS.parentPort&&(Hd=o(e=>{HS.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Dl=o(e=>{HS.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,ao.onMessageByType)("subscribe-to-node",e=>{Zp(e)}),(0,ao.onMessageByType)("unsubscribe-from-node",e=>{GS(e)}));o(Wo,"ensureNode")});var _s=v(Gt=>{"use strict";var hr=require("path"),{watch:ele}=require("chokidar"),Vn=require("fs-extra"),Gd=require("node-forge"),v$=require("net"),{generateKeyPair:nC,X509Certificate:zo,createPrivateKey:U$,randomBytes:tle}=require("node:crypto"),rle=require("util");nC=rle.promisify(nC);var Lt=Gd.pki,gi=require("joi"),{v4:x$}=require("uuid"),{validateBySchema:aC}=mt(),{forComponent:nle}=Q(),Es=me(),qs=(q(),M(z)),{CONFIG_PARAMS:vl}=qs,Si=Nw(),{ClientError:ic}=_e(),$S=require("node:tls"),{relative:B$,join:sle}=require("node:path"),{CERTIFICATE_VALUES:O$}=Si,ile=$c(),sC=St(),{table:ole,getDatabases:ale,databases:qS}=(we(),M(ft)),{getJWTRSAKeys:P$}=(Pd(),M(Kp)),Qe=nle("tls").conditional;Gt.generateKeys=uC;Gt.updateConfigCert=K$;Gt.createCsr=ple;Gt.signCertificate=hle;Gt.setCertTable=qd;Gt.loadCertificates=q$;Gt.reviewSelfSignedCert=fC;Gt.createTLSSelector=W$;Gt.listCertificates=j$;Gt.addCertificate=yle;Gt.removeCertificate=ble;Gt.createNatsCerts=gle;Gt.generateCertsKeys=_le;Gt.getReplicationCert=rh;Gt.getReplicationCertAuth=mle;Gt.renewSelfSigned=Sle;Gt.hostnamesFromCert=pC;Gt.getKey=Ale;Gt.getHostnamesFromCertificate=Ile;Gt.getPrimaryHostName=mC;Gt.generateSerialNumber=YS;var{urlToNodeName:F$,getThisNodeUrl:cle,getThisNodeName:KS,clearThisNodeName:lle}=(hs(),M(jo)),{readFileSync:ule,statSync:k$}=require("node:fs"),_Ue=me(),{getTicketKeys:dle,onMessageFromWorkers:fle}=nt(),{isMainThread:H$}=require("worker_threads"),{TLSSocket:G$,createSecureContext:gUe}=require("node:tls"),cC=3650,th=["127.0.0.1","localhost","::1"],lC=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];function YS(){let e=tle(8);return e[0]=e[0]&127|1,e.toString("hex")}o(YS,"generateSerialNumber");fle(async e=>{e.type===qs.ITC_EVENT_TYPES.RESTART&&(Es.initSync(!0),await fC())});var nn;function ac(){return nn||(nn=ale().system.hdb_certificate,nn||(nn=ole({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__"}]}))),nn}o(ac,"getCertTable");async function rh(){let e=W$("operations-api"),t={secureContexts:null,setSecureContext:o(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(KS());if(!r)return;let n=new zo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}o(rh,"getReplicationCert");async function mle(){ac();let e=(await rh()).options.cert,r=new zo(e).issuer.match(/CN=(.*)/)?.[1];return nn.get(r)}o(mle,"getReplicationCertAuth");var L$,oc=new Map;function q$(){if(L$)return;L$=!0;let e=[{configKey:vl.TLS},{configKey:vl.OPERATIONSAPI_TLS}];ac();let t=hr.dirname(sC.getConfigFilePath()),r;for(let{configKey:n}of e){let s=sC.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let a=i.privateKey,c=a&&B$(sle(t,"keys"),a);c&&D$(a,l=>{oc.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&H$){let d;D$(u,f=>{if(O$.cert===f)return;let m=i.hostname??i.hostnames??i.host??i.hosts;m&&!Array.isArray(m)&&(m=[m]);let p=Y$(u),h=new zo(p),E;try{E=mC(h)}catch(y){Qe.error?.("error extracting host name from certificate",y);return}if(E==null){Qe.error?.("No host name found on certificate");return}if(h.checkIssued(new zo(O$.cert)))return;let g=nn.primaryStore.get(E),R=k$(u).mtimeMs,S=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&R<=S){R<S&&Qe.info?.(`Certificate ${E} at ${u} is older (${new Date(R)}) than the certificate in the database (${S>1?new Date(S):"only self signed certificate available"})`);return}r=nn.put({name:E,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:p,private_key_name:c,is_authority:l,hostnames:m,fileTimestamp:R,details:{issuer:h.issuer.replace(/\n/g," "),subject:h.subject?.replace(/\n/g," "),subject_alt_name:h.subjectAltName,serial_number:h.serialNumber,valid_from:h.validFrom,valid_to:h.validTo}})},l?"certificate authority":"certificate")}}}}}return r}o(q$,"loadCertificates");function D$(e,t,r){let n,s=o((i,a)=>{try{let c=a.mtimeMs;c&&c!==n&&(n&&H$&&Qe.warn?.(`Reloading ${r}:`,i),n=c,t(Y$(i)))}catch(c){Qe.error?.(`Error loading ${r}:`,i,c)}},"loadFile");Vn.existsSync(e)?s(e,k$(e)):Qe.error?.(`${r} file not found:`,e),ele(e,{persistent:!1}).on("change",s)}o(D$,"loadAndWatch");function iC(){let e=cle();if(e==null){let t=th[0];return Qe.info?.("replication url is missing from harperdb-config.yaml, using default host"+t),t}return F$(e)}o(iC,"getHost");function VS(){let e=KS();if(e==null){let t=th[0];return Qe.info?.("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}o(VS,"getCommonName");async function ple(){let e=await rh(),t=Lt.certificateFromPem(e.options.cert),r=Lt.privateKeyFromPem(e.options.key);Qe.info?.("Creating CSR with cert named:",e.name);let n=Lt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:VS()},...lC];Qe.info?.("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:$$()}];return Qe.info?.("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Gd.pki.certificationRequestToPem(n)}o(ple,"createCsr");function $$(){let e=th.includes(VS())?th:[...th,VS()];return e.includes(iC())||e.push(iC()),[{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=>v$.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}o($$,"certExtensions");async function hle(e){let t={},r=hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;ac();for await(let d of nn.search([]))if(d.is_authority&&!d.details.issuer.includes("HarperDB-Certificate-Authority")){if(oc.has(d.private_key_name)){n=oc.get(d.private_key_name),s=d;break}else if(d.private_key_name&&await Vn.exists(hr.join(r,d.private_key_name))){n=Vn.readFile(hr.join(r,d.private_key_name)),s=d;break}}if(!n){let d=await oC();s=d.ca,n=d.private_key}n=Lt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=Lt.certificateFromPem(s.certificate);Qe.info?.("Signing CSR with cert named",s.name);let a=Lt.certificationRequestFromPem(e.csr);try{a.verify()}catch(d){return Qe.error?.(d),new Error("Error verifying CSR: "+d.message)}let c=Gd.pki.createCertificate();c.serialNumber=YS(),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+cC),Qe.info?.("sign cert setting validity:",c.validity),Qe.info?.("sign cert setting subject from CSR:",a.subject.attributes),c.setSubject(a.subject.attributes),Qe.info?.("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=a.getAttribute({name:"extensionRequest"}).extensions;Qe.info?.("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=a.publicKey,c.sign(n,Gd.md.sha256.create()),t.certificate=Lt.certificateToPem(c)}else Qe.info?.("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}o(hle,"signCertificate");async function Ele(e,t){await qd({name:KS(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await qd({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:Lt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}o(Ele,"createCertificateTable");async function qd(e){let t;try{t=new zo(e.certificate)}catch(r){Qe.error?.(`Failed to parse certificate for ${e.name}:`,r.message),Qe.debug?.("Certificate record details:",JSON.stringify(e,null,2));let n=new Error(`Invalid certificate format for ${e.name}: ${r.message}. This may be due to corrupted certificate data during transfer or encoding issues.`);throw n.code="INVALID_CERTIFICATE_FORMAT",n.cause=r,n}e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},ac(),await nn.patch(e)}o(qd,"setCertTable");async function uC(){let e=await nC("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{publicKey:Lt.publicKeyFromPem(e.publicKey),privateKey:Lt.privateKeyFromPem(e.privateKey)}}o(uC,"generateKeys");async function dC(e,t,r){let n=Lt.createCertificate();if(!t){let a=await rh();t=Lt.certificateFromPem(a.options.cert).publicKey}n.publicKey=t,n.serialNumber=YS(),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+cC);let i=[{name:"commonName",value:VS()},...lC];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions($$()),n.sign(e,Gd.md.sha256.create()),Lt.certificateToPem(n)}o(dC,"generateCertificates");async function oC(){let e=await j$(),t;for(let r of e){if(!r.is_authority)continue;let n=await z$(r.private_key_name);if(r.private_key_name&&n&&new zo(r.certificate).checkPrivateKey(U$(n))){Qe.trace?.(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;Qe.trace?.("No CA found with matching private key")}o(oC,"getCertAuthority");async function V$(e,t,r=!0){let n=Lt.createCertificate();n.publicKey=t,n.serialNumber=YS(),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+cC);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${Es.get(vl.REPLICATION_HOSTNAME)??F$(Es.get(vl.REPLICATION_URL))??x$().split("-")[0]}`},...lC];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0},{name:"subjectKeyIdentifier"}]),n.sign(e,Gd.md.sha256.create());let a=hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME),c=hr.join(a,Si.PRIVATEKEY_PEM_NAME);return r&&await Vn.writeFile(c,Lt.privateKeyToPem(e)),n}o(V$,"generateCertAuthority");async function _le(){let{privateKey:e,publicKey:t}=await uC(),r=await V$(e,t),n=await dC(e,t,r);await Ele(n,r),K$()}o(_le,"generateCertsKeys");async function gle(){let e=await dC(Lt.privateKeyFromPem(Si.CERTIFICATE_VALUES.key),void 0,Lt.certificateFromPem(Si.CERTIFICATE_VALUES.cert)),t=hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME),r=hr.join(t,Si.NATS_CERTIFICATE_PEM_NAME);await Vn.exists(r)||await Vn.writeFile(r,e);let n=hr.join(t,Si.NATS_CA_PEM_NAME);await Vn.exists(n)||await Vn.writeFile(n,Si.CERTIFICATE_VALUES.cert)}o(gle,"createNatsCerts");async function Sle(){ac();for await(let e of nn.search([{attribute:"is_self_signed",value:!0}]))await nn.delete(e.name);await fC()}o(Sle,"renewSelfSigned");async function fC(){lle(),await q$(),ac();let e=await oC();if(!e){Qe.notify?.("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=o(u=>{try{return{key:Lt.privateKeyFromPem(Vn.readFileSync(u)),keyPath:u}}catch(d){return Qe.warn?.(`Failed to parse private key from ${u}:`,d.message),{key:null,keyPath:u}}},"tryToParseKey"),n=Es.get(vl.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let d=r(u.privateKey);if(s=d.key,i=d.keyPath,d.key)break}}else{let u=Es.get(vl.TLS_PRIVATEKEY),d=r(u);s=d.key,i=d.keyPath}let a=hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME),c=B$(a,i);s||(Qe.warn?.("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{privateKey:s}=await uC(),Vn.existsSync(hr.join(a,Si.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${x$().split("-")[0]}.pem`),await Vn.writeFile(hr.join(a,c),Lt.privateKeyToPem(s)));let l=await V$(s,Lt.setRsaPublicKey(s.n,s.e),!1);await qd({name:l.subject.getField("CN").value,uses:["https"],certificate:Lt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await rh()){let r=KS();Qe.notify?.(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await oC();let n=Lt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await dC(Lt.privateKeyFromPem(e.private_key),s,n);await qd({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}o(fC,"reviewSelfSignedCert");function K$(){let e=ile(Object.keys(qs.CONFIG_PARAM_MAP),!0),t=hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME),r=hr.join(t,Si.PRIVATEKEY_PEM_NAME),n=hr.join(t,Si.NATS_CERTIFICATE_PEM_NAME),s=hr.join(t,Si.NATS_CA_PEM_NAME),i=qs.CONFIG_PARAMS,a={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(a[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(a[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,a[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,a[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),sC.updateConfigValue(void 0,void 0,a,!1,!0)}o(K$,"updateConfigCert");function Y$(e){return e.startsWith("-----BEGIN")?e:ule(e,"utf8")}o(Y$,"readPEM");var M$=$S.createSecureContext;$S.createSecureContext=function(e){if(!e.cert||!e.key)return M$(e);let t={...e};delete t.key,delete t.cert;let r=M$(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var Tle=G$.prototype._init;G$.prototype._init=function(e,t){Tle.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,a)=>{this.sni_context=a?.context||a,this.certCbDone()})}};var Ml=new Map;function W$(e,t){let r=new Map,n,s=!1;return i.initialize=a=>i.ready?i.ready:(a&&(a.secureContexts=r,a.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),Ml.clear();let d=0;if(qS===void 0){c();return}for await(let f of qS.system.hdb_certificate.search([])){let m=f.certificate,p=new zo(m);f.is_authority&&(p.asString=m,Ml.set(p.subject,m))}for await(let f of qS.system.hdb_certificate.search([]))try{if(f.is_authority)continue;let m=e==="operations-api",p=f.is_self_signed?1:3;m&&f.uses?.includes?.("operations")&&(p+=1);let h=await z$(f.private_key_name),E=f.certificate,g=new zo(E);if(Ml.has(g.issuer)&&(E+=`
16
+ `)}}});var WH,Il,zH,Xa,Tp,fd,hoe,qg,Ww=se(()=>{WH=b(is()),Il=b(nt());q();zH=b(Zn());cd();Gg();Xa=(0,zH.loggerWithTag)("componentStatus.crossThread"),Tp=class{static{o(this,"CrossThreadStatusCollector")}awaitingResponses=new Map;responseCheckers=new Map;nextRequestId=1;listenerAttached=!1;timeout;cleanupTimer=null;constructor(t=5e3){this.timeout=t}attachListener(){this.listenerAttached||((0,Il.onMessageByType)(e_.COMPONENT_STATUS_RESPONSE,({message:t})=>{let r=t.isMainThread?"main":`worker-${t.workerIndex}`;Xa.trace?.("Received component status response from %s, with requestId: %d",r,t.requestId);let n=this.awaitingResponses.get(t.requestId);if(n){n.push({workerIndex:t.workerIndex,isMainThread:t.isMainThread||!1,statuses:t.statuses||[]});let s=this.responseCheckers.get(t.requestId);s&&s()}}),this.listenerAttached=!0)}scheduleCleanup(){this.cleanupTimer&&clearTimeout(this.cleanupTimer),this.awaitingResponses.size>0&&(this.cleanupTimer=setTimeout(()=>{this.awaitingResponses.size>0&&(Xa.debug?.(`Cleaning up ${this.awaitingResponses.size} stale pending requests`),this.awaitingResponses.clear()),this.cleanupTimer=null},3e4))}async collect(t){try{this.attachListener(),this.scheduleCleanup();let r=this.nextRequestId++,n=[];this.awaitingResponses.set(r,n);let a=((0,Il.getWorkerCount)()||1)+1-1,l=await new Promise((p,h)=>{let E=!1,g=o(()=>{let y=this.awaitingResponses.get(r);y&&y.length>=a&&!E&&(E=!0,S(),Xa.trace?.(`Collected all ${y.length} expected responses for request ${r}`),p(y))},"checkComplete"),R=setTimeout(()=>{if(!E){E=!0;let y=this.awaitingResponses.get(r)||[];this.awaitingResponses.delete(r),Xa.debug?.(`Collection timeout for request ${r}: collected ${y.length}/${a} responses`),p(y)}},this.timeout),S=o(()=>{this.awaitingResponses.delete(r),clearTimeout(R)},"cleanup");this.responseCheckers.set(r,g),(0,WH.sendItcEvent)({type:e_.COMPONENT_STATUS_REQUEST,message:{requestId:r}}).then(()=>{g()}).catch(y=>{E=!0,S(),this.responseCheckers.delete(r),h(new ud("sendItcEvent",y))})});this.responseCheckers.delete(r);let u=new Map,d=t.getAllStatuses(),f=(0,Il.getWorkerIndex)(),m=f===void 0?"main":`worker-${f}`;for(let[p,h]of d)u.set(`${p}@${m}`,{...h,workerIndex:f});for(let p of l)for(let[h,E]of p.statuses){let g=p.isMainThread?"main":`worker-${p.workerIndex}`;u.set(`${h}@${g}`,{...E,workerIndex:p.workerIndex})}return Xa.debug?.(`Collected component status from ${l.length+1} threads (including local)`),u}catch(r){return r instanceof ud?Xa.error?.(`ITC failure during component status collection: ${r.message}`):Xa.warn?.("Failed to collect component status from all threads:",r),Xa.debug?.(`Collection failed for request. Error: ${r instanceof Error?r.message:"Unknown error"}`),this.getLocalStatusOnly(t)}}getLocalStatusOnly(t){let r=t.getAllStatuses(),n=new Map,s=(0,Il.getWorkerIndex)(),i=s===void 0?"main":`worker-${s}`;for(let[a,c]of r)n.set(`${a}@${i}`,{...c,workerIndex:s});return n}cleanup(){this.awaitingResponses.clear(),this.responseCheckers.clear(),this.cleanupTimer&&(clearTimeout(this.cleanupTimer),this.cleanupTimer=null)}},fd=class{static{o(this,"StatusAggregator")}static aggregate(t){let r=new Map,n=new Map;for(let[s,i]of t){let a=s.indexOf("@"),c=a!==-1?s.substring(0,a):s,l=n.get(c);l||(l=[],n.set(c,l)),l.push([s,i])}for(let[s,i]of n){let a=this.aggregateComponentGroup(s,i);r.set(s,a)}return r}static aggregateComponentGroup(t,r){let n={workers:{}},s=0,i,a,c=new Map,l=new Map;for(let[m,p]of r){let h=m.lastIndexOf("@"),E=h!==-1?m.substring(h+1):"",g=p.lastChecked instanceof Date?p.lastChecked.getTime():new Date(p.lastChecked).getTime();if(E==="main")n.main=g;else if(E&&E.startsWith("worker-")){let R=parseInt(E.substring(7));isNaN(R)||(n.workers[R]=g)}c.set(p.status,(c.get(p.status)||0)+1),p.status!==Ie.HEALTHY&&p.message&&(!i||g>s)&&(s=g,i=p.message),p.error&&!a&&(a=p.error)}let u=this.determineOverallStatus(c);if(Array.from(c.keys()).length>1)for(let[m,p]of r)p.status!==u&&l.set(m,{workerIndex:p.workerIndex!==void 0?p.workerIndex:-1,status:p.status,message:p.message,error:p.error});let f={componentName:t,status:u,lastChecked:n,latestMessage:i,error:a};return l.size>0&&(f.abnormalities=l),f}static determineOverallStatus(t){let r=[Ie.ERROR,Ie.WARNING,Ie.LOADING,Ie.UNKNOWN,Ie.HEALTHY];for(let n of r)if(t.has(n)&&t.get(n)>0)return n;return Ie.UNKNOWN}},hoe=parseInt(process.env.COMPONENT_STATUS_TIMEOUT||"5000"),qg=new Tp(hoe)});var Za,$g=se(()=>{$w();cd();Ww();Gg();Za=class e{static{o(this,"ComponentStatusRegistry")}statusMap=new Map;reset(){this.statusMap=new Map}setStatus(t,r,n,s){if(!t||typeof t!="string")throw new dd(String(t),"setStatus","Component name must be a non-empty string");if(!Object.values(Ie).includes(r))throw new dd(t,"setStatus",`Invalid status level: ${r}. Must be one of: ${Object.values(Ie).join(", ")}`);this.statusMap.set(t,new ld(r,n,s))}getStatus(t){return this.statusMap.get(t)}getAllStatuses(){return this.statusMap}reportHealthy(t,r){this.setStatus(t,Ie.HEALTHY,r)}reportError(t,r,n){this.setStatus(t,Ie.ERROR,n,r)}reportWarning(t,r){this.setStatus(t,Ie.WARNING,r)}initializeLoading(t,r){this.setStatus(t,Ie.LOADING,r||"Component is loading")}markLoaded(t,r){this.setStatus(t,Ie.HEALTHY,r||"Component loaded successfully")}markFailed(t,r,n){this.setStatus(t,Ie.ERROR,n,r)}getComponentsByStatus(t){let r=[];for(let[n,s]of this.statusMap)s.status===t&&r.push({name:n,status:s});return r}getStatusSummary(){let t={[Ie.HEALTHY]:0,[Ie.ERROR]:0,[Ie.WARNING]:0,[Ie.LOADING]:0,[Ie.UNKNOWN]:0};for(let r of this.statusMap.values())t[r.status]++;return t}static async getAggregatedFromAllThreads(t){let r=await qg.collect(t);return fd.aggregate(r)}async getAggregatedStatusFor(t,r){r||(r=await e.getAggregatedFromAllThreads(this));let n=[],s=t+".",i=r.get(t);i&&n.push({key:t,...i});for(let[f,m]of r)f.startsWith(s)&&n.push({key:f,...m});if(n.length===0)return{status:Ie.UNKNOWN,message:"The component has not been loaded yet (may need a restart)",lastChecked:{workers:{}}};let a=n.some(f=>f.status===Ie.ERROR),c=n.some(f=>f.status===Ie.LOADING),l=a?Ie.ERROR:c?Ie.LOADING:Ie.HEALTHY,u="All components loaded successfully",d={};if(a||c){u=n.filter(m=>m.status===Ie.ERROR||m.status===Ie.LOADING).map(m=>`${m.key}: ${m.latestMessage||m.status}`).join("; ");for(let m of n)m.status!==Ie.HEALTHY&&(d[m.key]={status:m.status,message:m.latestMessage})}return{status:l,message:u,...Object.keys(d).length>0&&{details:d},lastChecked:n[0]?.lastChecked||{workers:{}}}}}});var mr,Vg=se(()=>{$g();mr=new Za});function QH(e){let t=jH.get(e);return t||(t=new zw(e),jH.set(e,t)),t}function JH(){mr.reset()}var zw,jH,ro,XH,ZH=se(()=>{Vg();cd();zw=class{static{o(this,"ComponentStatusBuilder")}componentName;constructor(t){this.componentName=t}healthy(t){return mr.setStatus(this.componentName,Ie.HEALTHY,t),this}warning(t){return mr.setStatus(this.componentName,Ie.WARNING,t),this}error(t,r){return mr.setStatus(this.componentName,Ie.ERROR,t,r),this}loading(t){return mr.setStatus(this.componentName,Ie.LOADING,t||"Loading..."),this}unknown(t){return mr.setStatus(this.componentName,Ie.UNKNOWN,t),this}get(){return mr.getStatus(this.componentName)}},jH=new Map;o(QH,"statusForComponent");ro={loading(e,t){mr.initializeLoading(e,t)},loaded(e,t){mr.markLoaded(e,t)},failed(e,t,r){mr.markFailed(e,t,r)}};o(JH,"reset");XH=Ie});var yp={};Re(yp,{AggregationError:()=>Kw,COMPONENT_STATUS_LEVELS:()=>Ie,ComponentStatus:()=>ld,ComponentStatusError:()=>Ja,ComponentStatusOperationError:()=>dd,ComponentStatusRegistry:()=>Za,CrossThreadCollectionError:()=>Yw,CrossThreadStatusCollector:()=>Tp,CrossThreadTimeoutError:()=>Vw,ITCError:()=>ud,StatusAggregator:()=>fd,componentStatusRegistry:()=>mr,crossThreadCollector:()=>qg,query:()=>Eoe});var Eoe,eG=se(()=>{Vg();$g();$w();$g();Ww();Vg();Gg();cd();Eoe={get(e){return mr.getStatus(e)},all(){return mr.getAllStatuses()},byStatus(e){return mr.getComponentsByStatus(e)},summary(){return mr.getStatusSummary()},async allThreads(){return Za.getAggregatedFromAllThreads(mr)}}});var jw={};Re(jw,{STATUS:()=>XH,internal:()=>yp,lifecycle:()=>ro,reset:()=>JH,statusForComponent:()=>QH});var Rp=se(()=>{ZH();eG()});var Ap=v((XDe,nG)=>{"use strict";var ms=Q(),gn=(q(),M(z)),_oe=R0(),goe=fs(),{validateEvent:Qw}=is(),bp=cs(),Soe=require("process"),{resetDatabases:Toe}=(we(),M(ft)),yoe={[gn.ITC_EVENT_TYPES.SCHEMA]:Roe,[gn.ITC_EVENT_TYPES.USER]:rG,[gn.ITC_EVENT_TYPES.COMPONENT_STATUS_REQUEST]:Aoe};async function Roe(e){let t=Qw(e);if(t){ms.error(t);return}ms.trace("ITC schemaHandler received schema event:",e),await _oe(e.message),await boe(e.message)}o(Roe,"schemaHandler");async function boe(e){try{bp.resetReadTxn(gn.SYSTEM_SCHEMA_NAME,gn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),bp.resetReadTxn(gn.SYSTEM_SCHEMA_NAME,gn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),bp.resetReadTxn(gn.SYSTEM_SCHEMA_NAME,gn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=Toe();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){ms.error(t)}}o(boe,"syncSchemaMetadata");var tG=[];async function rG(e){try{try{bp.resetReadTxn(gn.SYSTEM_SCHEMA_NAME,gn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),bp.resetReadTxn(gn.SYSTEM_SCHEMA_NAME,gn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){ms.warn(r)}let t=Qw(e);if(t){ms.error(t);return}ms.trace(`ITC userHandler ${gn.HDB_ITC_CLIENT_PREFIX}${Soe.pid} received user event:`,e),await goe.setUsersWithRolesCache();for(let r of tG)r()}catch(t){ms.error(t)}}o(rG,"userHandler");rG.addListener=function(e){tG.push(e)};async function Aoe(e){try{let t=Qw(e);if(t){ms.error(t);return}ms.trace("ITC componentStatusRequestHandler received request:",e);let{internal:r}=(Rp(),M(jw)),{getWorkerIndex:n}=nt(),{sendItcEvent:s}=is(),i=r.componentStatusRegistry.getAllStatuses(),a=Array.from(i.entries()),c=n(),l=c===void 0,u=e.message.originator,d={type:gn.ITC_EVENT_TYPES.COMPONENT_STATUS_RESPONSE,message:{requestId:e.message.requestId,statuses:a,workerIndex:c,isMainThread:l}};u!==void 0&&threads.sendToThread(u,d)?ms.trace(`Sent component status response directly to thread ${u}`):(u===void 0?ms.debug("No originator threadId, falling back to broadcast"):ms.warn(`Failed to send direct response to thread ${u}, falling back to broadcast`),await s(d))}catch(t){ms.error("Error handling component status request:",t)}}o(Aoe,"componentStatusRequestHandler");nG.exports=yoe});var is=v((sMe,iG)=>{"use strict";var eMe=Q(),Jw=ae(),Ioe=(q(),M(z)),{ITC_ERRORS:Ip}=zr(),{parentPort:tMe,threadId:woe,isMainThread:Noe,workerData:rMe}=require("worker_threads"),{onMessageFromWorkers:Coe,broadcast:nMe,broadcastWithAcknowledgement:Ooe}=nt();iG.exports={sendItcEvent:Poe,validateEvent:sG,SchemaEventMsg:Loe,UserEventMsg:Doe};var Kg;Coe(async(e,t)=>{Kg=Kg||Ap(),sG(e),Kg[e.type]&&await Kg[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function Poe(e){return!Noe&&e.message&&(e.message.originator=woe),Ooe(e)}o(Poe,"sendItcEvent");function sG(e){if(typeof e!="object")return Ip.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||Jw.isEmpty(e.type))return Ip.MISSING_TYPE;if(!e.hasOwnProperty("message")||Jw.isEmpty(e.message))return Ip.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||Jw.isEmpty(e.message.originator))return Ip.MISSING_ORIGIN;if(Ioe.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return Ip.INVALID_EVENT(e.type)}o(sG,"validateEvent");function Loe(e,t,r,n=void 0,s=void 0){this.originator=e,this.operation=t,this.schema=r,this.table=n,this.attribute=s}o(Loe,"SchemaEventMsg");function Doe(e){this.originator=e}o(Doe,"UserEventMsg")});var Ho=v((aMe,lG)=>{"use strict";var oG=(q(),M(z)),oMe=ae(),Yg=Q(),aG=s0(),md,{sendItcEvent:cG}=is();function Moe(e){try{Yg.debug("signalSchemaChange called with message:",e),md=md||Ap();let t=new aG(oG.ITC_EVENT_TYPES.SCHEMA,e);return md.schema(t),cG(t)}catch(t){Yg.error(t)}}o(Moe,"signalSchemaChange");function voe(e){try{Yg.trace("signalUserChange called with message:",e),md=md||Ap();let t=new aG(oG.ITC_EVENT_TYPES.USER,e);return md.user(t),cG(t)}catch(t){Yg.error(t)}}o(voe,"signalUserChange");lG.exports={signalSchemaChange:Moe,signalUserChange:voe}});function wp(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 uG(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new Fs(e));for(let[r,n]of t)e.has(r)?r.toLowerCase()==="set-cookie"&&e.append?.(r,n,!0):e.set(r,n);return e}var Fs,Np=se(()=>{Fs=class extends Map{static{o(this,"Headers")}constructor(t){if(t)if(t[Symbol.iterator])super(t);else{super();for(let r in t)this.set(r,t[r])}else super()}set(t,r){return typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r),super.set(t.toLowerCase(),[t,r])}get(t){return typeof t!="string"&&(t=""+t),super.get(t.toLowerCase())?.[1]}has(t){return typeof t!="string"&&(t=""+t),super.has(t.toLowerCase())}setIfNone(t,r){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let n=t.toLowerCase();if(!super.has(n))return super.set(n,[t,r])}append(t,r,n){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let s=t.toLowerCase(),i=super.get(s);if(i){let a=i[1];if(n)r=(typeof a=="string"?a:a.join(", "))+", "+r;else if(typeof a=="string")r=[a,r];else{a.push(r);return}}return super.set(s,[t,r])}[Symbol.iterator](){return super.values()[Symbol.iterator]()}};o(wp,"appendHeader");o(uG,"mergeHeaders")});function Wg(e,t,r=xoe){let n;return function(...i){return n?n.length*Xw>r?t(...i):new Promise((a,c)=>{n.push({args:i,fn(){try{let l=e(...i);a(l)}catch(l){c(l)}}})}):(n=[],s(performance.now(),i),e(...i))};function s(i,a){setImmediate(()=>{let c=performance.now();Xw=(Xw*4+c-i)/5;let l=n.shift();if(l){let{args:u,fn:d}=l;d(),s(c,u)}else n=null})}}var mG,Uoe,xoe,dG,Boe,Zw,fG,Xw,eN=se(()=>{mG=b(Zn()),Uoe=3e3,xoe=2e4,dG=0,Boe=3e4,Zw=3e3,fG=performance.now()+Zw,Xw=0;o(Wg,"throttle");setInterval(()=>{let e=performance.now();e-fG-Zw>Uoe&&dG+Boe<e&&(mG.default.warn?.("JavaScript execution has taken too long and is not allowing proper event queue cycling, consider using 'await new Promise(setImmediate)' in code that will execute for a long duration"),dG=e),fG=e},Zw).unref()});var AG={};Re(AG,{EVICTED:()=>Ha,INVALIDATED:()=>Un,coerceType:()=>jg,makeTable:()=>Jg});function Jg(e){let{primaryKey:t,indices:r,tableId:n,tableName:s,primaryStore:i,databasePath:a,databaseName:c,auditStore:l,schemaDefined:u,dbisDB:d,sealed:f,splitSegments:m,replicate:p}=e,{expirationMS:h,evictionMS:E,audit:g,trackDeletes:R}=e;E??=0;let{attributes:S}=e;S||(S=[]);let y=OA(i,n,l),C,I,k={},J=Promise.resolve(),G,H,X;for(let K of S)(K.assignCreatedTime||K.name==="__createdtime__")&&(G=K),(K.assignUpdatedTime||K.name==="__updatedtime__")&&(H=K),K.expiresAt&&(X=K),K.isPrimaryKey&&(k=K);let W,ue=[],ce=[],te=1,ye=2,Ae={},Ye={},qe=864e5,Ar=0,tr,Wr,vr,_u=!1,Fc,xt,ri,Na=Nl.get(F.REPLICATION_DATABASES);if(Array.isArray(Na)){for(let K of Na)if(K.name===c&&K.replicateTo>=0){ri=K.replicateTo;break}}let GE=i.getRange({start:!1,end:!1}).constructor,jf=10,qE=6;g&&em(),Cm(i.env.path,K=>{if(I)return Oa(K)});class Qf extends ml{static{o(this,"Updatable")}getUpdatedTime(){return Fa.get(this.getRecord())?.version}getExpiresAt(){return Fa.get(this.getRecord())?.expiresAt}addTo(_,T){if(typeof T=="number"||typeof T=="bigint")this.set(_,new ap(T));else throw new Error("Can not add or subtract a non-numeric value")}subtractFrom(_,T){return this.addTo(_,-T)}}class Pe extends Hr{#e;#t;#r;#n;#s;#i;static name=s;static primaryStore=i;static auditStore=l;static primaryKey=t;static tableName=s;static tableId=n;static indices=r;static audit=g;static databasePath=a;static databaseName=c;static attributes=S;static replicate=p;static sealed=f;static splitSegments=m??!0;static createdTimeProperty=G;static updatedTimeProperty=H;static propertyResolvers;static userResolvers={};static sources=[];static getResidencyById;static get expirationMS(){return h}static dbisDB=d;static schemaDefined=u;static sourcedFrom(_,T){if(T&&(this.sourceOptions=T,(T.expiration||T.eviction||T.scanInterval)&&this.setTTLExpiration(T)),T?.intermediateSource)_.intermediateSource=!0,this.sources.unshift(_);else{if(this.sources.some(L=>!L.intermediateSource)){if(this.sources.some(L=>L.name===_.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(_)}I=I||_.get&&(!_.get.reliesOnPrototype||_.prototype.get),C=C||_.load;let N=o(L=>{let A=this.sources;if(A=A.filter(U=>U.intermediateSource&&U[L]&&(!U[L].reliesOnPrototype||U.prototype[L])),A.length>0)if(A.length===1){let U=A[0];return(w,D,$)=>{if(w?.source!==U)return U[L](D,$,w)}}else return(U,w,D)=>{let $=[];for(let Y of A){if(U?.source===Y)break;$.push(Y[L](w,D,U))}return Promise.all($)}},"getApplyToIntermediateSource"),P=this.sources[this.sources.length-1];P.intermediateSource&&(P={});let O=o(L=>{if(P[L]&&(!P[L].reliesOnPrototype||P.prototype[L]))return(A,U,w)=>{if(!A?.source)return P[L](U,w,A)}},"getApplyToCanonicalSource");Ae={put:O("put"),patch:O("patch"),delete:O("delete"),publish:O("publish")},Ye={put:N("put"),patch:N("patch"),delete:N("delete"),publish:N("publish"),invalidate:N("invalidate")};let x=P.shouldRevalidateEvents;return(async()=>{let L=!1,A,U=o(async(w,D)=>{let $=w.value,Y=w.table?De[c][w.table]:Pe;if(c===sm&&(w.table===bu.ROLE_TABLE_NAME||w.table===bu.USER_TABLE_NAME)&&(L=!0),w.id===void 0&&(w.id=$[Y.primaryKey],w.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(w));w.source=_;let j={residencyId:kc(w.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:w.nodeId,async:!0},B=w.id,Ee=await Y.getResource(B,D,j);switch(w.finished&&await w.finished,w.type){case"put":return x?Ee._writeInvalidate(B,$,j):Ee._writeUpdate(B,$,!0,j);case"patch":return x?Ee._writeInvalidate(B,$,j):Ee._writeUpdate(B,$,!1,j);case"delete":return Ee._writeDelete(B,j);case"publish":case"message":return Ee._writePublish(B,$,j);case"invalidate":return Ee._writeInvalidate(B,$,j);case"relocate":return Ee._writeRelocate(B,j);default:Fe.default.error?.("Unknown operation",w.type,w.id)}},"writeUpdate");try{let w=_.subscribe;w&&R==null&&(R=!0);let D={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},$=_.subscribeOnThisThread?_.subscribeOnThisThread((0,wl.getWorkerIndex)(),D):(0,wl.getWorkerIndex)()===0,Y=w&&$&&await _.subscribe?.(D);if(Y){let j;for await(let B of Y)try{if(!(B.type==="transaction"?B.writes[0]:B)){Fe.default.error?.("Bad subscription event",B);continue}if(B.source=_,B.type==="end_txn"){if(j?.resolve(),B.localTime&&A!==B.localTime){if(B.remoteNodeIds?.length>0){let pe=[Symbol.for("seq"),B.remoteNodeIds[0]],ne=d.get(pe),ie=ne?.nodes;ie||(ie=[]);for(let de of B.remoteNodeIds.slice(1)){let oe=ie.find(ke=>ke.id===de);ie=ie.filter(ke=>ke.id!==de||ke===oe),oe||(oe={id:de,seqId:0},ie.push(oe)),oe.seqId=Math.max(ne?.seqId??1,B.localTime),de===j?.nodeId&&(oe.lastTxnTime=B.timestamp)}let xe=Math.max(ne?.seqId??1,B.localTime);Fe.default.trace?.("Received txn",c,xe,new Date(xe),B.localTime,new Date(B.localTime),B.remoteNodeIds),d.put(pe,{seqId:xe,nodes:ie})}A=B.localTime}B.onCommit&&j?.committed.then(B.onCommit);continue}if(j)if(B.beginTxn)j.resolve();else{j.write_promises.push(U(B,j));continue}!B.timestamp&&B.version&&(B.timestamp=B.version);let fe=bt(B,()=>{if(B.type==="transaction"){let pe=[];for(let ne of B.writes)try{pe.push(U(ne,B))}catch(ie){throw ie.message+=" writing "+JSON.stringify(ne)+" of event "+JSON.stringify(B),ie}return Promise.all(pe)}else if(B.type==="define_schema"){let pe=this.attributes.slice(0),ne=!1;for(let ie of B.attributes)pe.find(xe=>xe.name===ie.name)||(pe.push(ie),ne=!0);ne&&(Ze({table:s,database:c,attributes:pe,origin:"cluster"}),Op.signalSchemaChange(new Pp.SchemaEventMsg(process.pid,V.CREATE_TABLE,c,s)))}else return B.beginTxn?(j=B,j.write_promises=[U(B,B)],new Promise(pe=>{j.resolve=()=>pe(Promise.all(j.write_promises))})):U(B,B)});j&&(j.committed=fe),L&&fe&&!fe?.waitingForUserChange&&(fe.then(()=>Op.signalUserChange(new Pp.UserEventMsg(process.pid))),fe.waitingForUserChange=!0),B.onCommit&&(fe?fe.then(B.onCommit):B.onCommit())}catch(Ee){Fe.default.error?.("error in subscription handler",Ee)}}}catch(w){Fe.default.error?.(w)}})(),this}static get isCaching(){return I}static get shouldRevalidateEvents(){return this.prototype.get!==Pe.prototype.get}static getResource(_,T,N){let P=super.getResource(_,T,N);if(this.loadAsInstance===!1&&(T._freezeRecords=!0),_!=null&&this.loadAsInstance!==!1){Ui(_);try{if(P.getRecord?.())return P;if(typeof _=="object"&&_&&!Array.isArray(_))throw new Error(`Invalid id ${JSON.stringify(_)}`);let O=!N?.async||i.cache?.get?.(_),x=Ur(T),L=x.getReadTxn();if(L?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return Io(_,T,{transaction:L,ensureLoaded:N?.ensureLoaded},O,A=>{if(A?Pe._updateResource(P,A):P.#e=null,T.onlyIfCached){if(!P.doesExist())throw new lt.ServerError("Entry is not cached",504)}else if(N?.ensureLoaded){let U=dn(_,A,T,P);if(U)return x?.disregardReadTxn(),P.#i=!0,T.loadedFromSource=!0,ks(U,w=>(Pe._updateResource(P,w),P))}return P})}catch(O){throw O.message.includes("Unable to serialize object")&&(O.message+=": "+JSON.stringify(_)),O}}return P}static _updateResource(_,T){_.#n=T,_.#e=T?.value??null,_.#r=T?.version}ensureLoaded(){let _=dn(this.getId(),this.#n,this.getContext());if(_)return this.#i=!0,this.getContext().loadedFromSource=!0,ks(_,T=>{this.#n=T,this.#e=T.value,this.#r=T.version})}static getNewId(){let _=k?.type;if(_==="String"||_==="ID")return super.getNewId();if(!xt){let O=i.getEntry(Symbol.for("id_allocation")),x=O?.value,L;if(x&&x.nodeName===server.hostname&&(!joe(i)||x.pid===process.pid)){let A=x.start,U=x.end;L=A;for(let w of i.getKeys({start:U,end:A,limit:1,reverse:!0}))L=w}else x=P(O?.version??null),L=x.start;xt=new BigInt64Array([BigInt(L)+1n]),xt=new BigInt64Array(i.getUserSharedBuffer("id",xt.buffer)),xt.maxSafeId=x.end}let T=Number(Atomics.add(xt,0,1n)),N=_==="Int"?512:1048576;if(T+N>=xt.maxSafeId){let O=o(x=>{xt.maxSafeId=T+(_==="Int"?1023:4194303);let L=(_==="Int"?Math.pow(2,31):Math.pow(2,49))-1,A=x?void 0:i.useReadTransaction(),U=Number(xt[0]);for(let $ of i.getKeys({start:U+1,end:L,limit:1,transaction:A}))L=$;A?.done();let{value:w,version:D}=i.getEntry(Symbol.for("id_allocation"));if(xt.maxSafeId<L){if(w.end>xt.maxSafeId-100)return;Fe.default.info?.("New id allocation",T,xt.maxSafeId,D),i.put(Symbol.for("id_allocation"),{start:w.start,end:xt.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),D)}else{Fe.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${xt.maxSafeId}, but id of ${L} detected`);let $=P(D);$.alreadyUpdated||Atomics.store(xt,0,BigInt($.start+1)),xt.maxSafeId=$.end}},"updateEnd");T+N===xt.maxSafeId?setImmediate(O):T+100>=xt.maxSafeId&&(Fe.default.warn?.(`Synchronous id allocation required on table ${s}${_=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>O(!0)))}return T;function P(O){let x=(_==="Int"?Math.pow(2,31):Math.pow(2,49))-1,L=x/4,A,U,w=!1,D,$;do{D=Math.floor(Math.random()*x),$={start:D,end:D+(_==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},A=0;for(let Y of i.getKeys({start:D,limit:1,reverse:!0}))A=Y;U=x;for(let Y of i.getKeys({start:D+1,end:x,limit:1}))U=Y;L*=.875,L<1e3&&!w&&(w=!0,Fe.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${_==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,D,A,U,L))}while(!(L<U-D&&(L<D-A||A===0)));return i.transactionSync(()=>{let Y=i.getEntry(Symbol.for("id_allocation"));return(Y?.version??null)==O?(Fe.default.info?.("Allocated new id range",$),i.put(Symbol.for("id_allocation"),$,Date.now()),$):(Fe.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...Y.value})})}}static setTTLExpiration(_){if(typeof _=="number")h=_*1e3,E||(E=0);else if(_&&typeof _=="object")h=_.expiration*1e3,E=(_.eviction||0)*1e3,qe=_.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(h<0)throw new Error("Expiration can not be negative");qe=qe||(h+E)/4,Oa()}static getResidencyRecord(_){return d.get([Symbol.for("residency_by_id"),_])}static setResidency(_){Pe.getResidency=_&&((T,N)=>{try{return _(T,N)}catch(P){throw P.message+=` in residency function for table ${s}`,P}})}static setResidencyById(_){Pe.getResidencyById=_&&(T=>{try{return _(T)}catch(N){throw N.message+=` in residency function for table ${s}`,N}})}static getResidency(_,T){if(Pe.getResidencyById)return Pe.getResidencyById(_[t]);let N=ri;if(T.replicateTo!=null){if(Array.isArray(T.replicateTo))return T.replicateTo.includes(server.hostname)?T.replicateTo:[server.hostname,...T.replicateTo];T.replicateTo>=0&&(N=T.replicateTo)}if(N>=0&&server.nodes){let P=[server.hostname];if(T.previousResidency)P.push(...T.previousResidency.slice(0,N));else{let O=server.nodes.map(A=>A.name),x=Math.floor(O.length*Math.random());P.push(...O.slice(x,x+N));let L=x+N-O.length;L>0&&P.push(...O.slice(0,L))}return P}}static enableAuditing(){g||(g=!0,em(),Pe.audit=!0)}static coerceId(_){return _===""?null:jg(_,k)}static async dropTable(){delete De[c][s];for(let _ of i.getRange({versions:!0,snapshot:!1,lazy:!0}))_.metadataFlags&Jr&&_.value&&Ua(_.value);if(c===a){for(let _ of S)d.remove(Pe.tableName+"/"+_.name),r[_.name]?.drop();d.remove(Pe.tableName+"/"),i.drop(),await d.committed}else console.log("legacy dropTable"),await i.close(),rN.default.unlinkSync(i.env.path);Op.signalSchemaChange(new Pp.SchemaEventMsg(process.pid,V.DROP_TABLE,c,s))}get(_){let T=this.constructor;if(typeof _=="string"&&T.loadAsInstance!==!1)return this.getProperty(_);if(Jf(_))return this.search(_);if(_&&_.id===void 0&&!_.toString()){let N={records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:S,recordCount:void 0,estimatedRecordRange:void 0};return this.getContext()?.includeExpensiveRecordCountEstimates?Pe.getRecordCount().then(P=>(N.recordCount=P.recordCount,N.estimatedRecordRange=P.estimatedRange,N)):N}if(_!==void 0&&T.loadAsInstance===!1){let N=this.getContext(),P=Ur(N),O=P.getReadTxn();if(O?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");let x=Os(_);Ui(x);let L=!0;return _.checkPermission&&(L=this.allowRead(N.user,_)),ks(ks(L,A=>{if(!A)throw new lt.AccessViolation(N.user);let U=!0;return Io(x,N,{transaction:O,ensureLoaded:U},!1,w=>{if(N.onlyIfCached){if(!w?.value)throw new lt.ServerError("Entry is not cached",504)}else if(U){let D=dn(x,w,N);if(D)return P?.disregardReadTxn(),N.loadedFromSource=!0,D.then($=>$?.value)}return w?.value})}),A=>{let U=_?.select;return U&&A!=null?Vu(U,this.constructor)(A):A})}if(_?.property)return this.getProperty(_.property);if(this.doesExist()||_?.ensureLoaded===!1||this.getContext()?.returnNonexistent)return this}allowRead(_,T){let N=On(_,T);if(N?.read){if(N.isSuperUser)return!0;let P=N.attribute_permissions,O=T?.select;if(P?.length>0||_u&&O){if(T||(T={}),O){let x=P?.length>0&&tN(P,"read");T.select=O.map(L=>{let A=L.name||L;if(!x||x[A]){let U=vr[A]?.definition?.tableClass;if(U){if(L.name||(L={name:L}),!L.checkPermission&&T.checkPermission&&(L.checkPermission=T.checkPermission),!U.prototype.allowRead.call(null,_,L))return!1;if(!L.select)return L.name}return L}}).filter(Boolean)}else T.select=P.filter(x=>x.read&&!vr[x.attribute_name]).map(x=>x.attribute_name);return T}else return!0}}allowUpdate(_,T,N){let P=On(_,N);if(P?.update){let O=P.attribute_permissions;if(O?.length>0){let x=tN(O,"update");for(let L in T)if(!x[L])return!1;for(let L of O){let A=L.attribute_name;!L.update&&!(A in T)&&(T[A]=this.getProperty(A))}}return Ca(this.getContext())}}allowCreate(_,T,N){if(this.isCollection){let P=On(_,N);if(P?.insert){let O=P.attribute_permissions;if(O?.length>0){let x=tN(O,"insert");for(let L in T)if(!x[L])return!1;return Ca(this.getContext())}else return Ca(this.getContext())}}else return this.allowUpdate(_,{})}allowDelete(_,T){return On(_,T)?.delete&&Ca(this.getContext())}update(_,T){let N,P=typeof T=="boolean"||T===void 0&&(_==null||typeof _=="object"&&!(_ instanceof URLSearchParams)),O=!1;P?(O=T,T=_,N=this.getId()):N=Os(_);let x=this.getContext();if(!Ur(x))throw new Error("Can not update a table resource outside of a transaction");if(T===!1)return this;if(typeof T=="object"&&T)if(O)Object.isFrozen(T)&&(T={...T}),this.#e={},this.#t=T;else if(P){let A=this.#t;A&&(T=Object.assign(A,T)),this.#t=T}else{let A=!0;if(_==null)throw new TypeError("Can not put a record without a target");return _.checkPermission&&(A=this.allowUpdate(x.user,T,_)),ks(A,U=>{if(!U)throw new lt.AccessViolation(x.user);return ks(i.get(Os(_)),w=>{let D=new Qf(w);return D._setChanges(T),this._writeUpdate(N,D.getChanges(),!1),D})})}return this._writeUpdate(N,this.#t,O),this}addTo(_,T){if(typeof T=="number"||typeof T=="bigint")this.#s===hG?this.set(_,(+this.getProperty(_)||0)+T):(this.#s||this.update(),this.set(_,new ap(T)));else throw new Error("Can not add a non-numeric value")}subtractFrom(_,T){if(typeof T=="number")return this.addTo(_,-T);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this.#n}getRecord(){return this.#e}getChanges(){return this.#t}_setChanges(_){this.#t=_}setRecord(_){this.#e=_}invalidate(_){let T=!0,N=this.getContext();return _?.checkPermission&&(T=this.allowDelete(N.user,_,N)),ks(T,P=>{if(!P)throw new lt.AccessViolation(N.user);this._writeInvalidate(_?Os(_):this.getId())})}_writeInvalidate(_,T,N){let P=this.getContext();Ui(_),Ur(this.getContext()).addWrite({key:_,store:i,invalidated:!0,entry:this.#n,before:Ae.invalidate?.bind(this,P,_),beforeIntermediate:yu(T,Ye.invalidate?.bind(this,P,_)),commit:o((x,L)=>{if(!(xr(x,L,N?.nodeId)<=0)){T??=null;for(let A in r)T||(T={}),T[A]===void 0&&(T[A]=this.getProperty(A));Fe.default.trace?.(`Invalidating entry in ${s} id: ${_}, timestamp: ${new Date(x).toISOString()}`),y(_,T,L,x,Un,g,{user:P?.user,residencyId:N?.residencyId,nodeId:N?.nodeId,tableToTrack:s},"invalidate")}},"commit")})}_writeRelocate(_,T){let N=this.getContext();Ui(_),Ur(this.getContext()).addWrite({key:_,store:i,invalidated:!0,entry:this.#n,before:Ae.relocate?.bind(this,N,_),beforeIntermediate:Ye.relocate?.bind(this,N,_),commit:o((O,x)=>{if(xr(O,x,T?.nodeId)<=0)return;let L=Pe.getResidencyRecord(T.residencyId),A=0,U=null,w=x?.value;if(L&&!L.includes(server.hostname)){for(let D in r)U||(U={}),U[D]=w[D];A=Un}else U=w;Fe.default.trace?.(`Relocating entry id: ${_}, timestamp: ${new Date(O).toISOString()}`),y(_,U,x,O,A,g,{user:N.user,residencyId:T.residencyId,nodeId:T.nodeId,expiresAt:T.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(_,T){let N={previousResidency:this.getResidencyRecord(_.residencyId),isRelocation:!0},P=Pa(this.getResidency(T.value,N)),O;if(P){if(!P.includes(server.hostname))return!1;O=kc(P)}let x=0;Fe.default.debug?.("Performing a relocate of an entry",existing_entry.key,T.value,P);let L=y(_.key,T.value,_,_.version,x,!0,{residencyId:O,expiresAt:T.expiresAt},"relocate",!1,null);return!0}static evict(_,T,N){let P=this.Source,O;if(!((I||g)&&(!T||(O=i.getEntry(_),!O||!T)||O.version!==N))){if(I){if(i.hasLock(_,O.version))return;let x;for(let L in r)x||(x={}),x[L]=T[L];if(x)return y(_,x,O,N,Ha,null,null,null,!0)}if(i.ifVersion(_,N,()=>{gu(_,T,null)}),g)return y(_,null,O,N,Ha,null,null,null,!0);nl(i,O??i.getEntry(_),N)}}lock(){throw new Error("Not yet implemented")}static operation(_,T){return _.table||=s,_.schema||=c,global.operation(_,T)}put(_,T){if(T===void 0||T instanceof URLSearchParams)this.update(_,!0);else{let N=!0;if(_==null)throw new TypeError("Can not put a record without a target");let P=this.getContext();return _.checkPermission&&(N=this.allowUpdate(P.user,T,_)),ks(N,O=>{if(!O)throw new lt.AccessViolation(P.user);if(Array.isArray(T))for(let x of T){let L=x[t];this._writeUpdate(L,x,!0)}else{let x=Os(_);this._writeUpdate(x,T,!0)}})}}create(_,T){let N=!0,P=this.getContext();if(!T&&!(_ instanceof URLSearchParams)&&(T=_,_=void 0),!T||typeof T!="object"||Array.isArray(T))throw new TypeError("Can not create a record without an object");return _?.checkPermission&&(N=this.allowCreate(P.user,T,_)),ks(N,O=>{if(!O)throw new lt.AccessViolation(P.user);let x=Os(_)??T[t];if(x===void 0)x=this.constructor.getNewId();else if(i.get(x))throw new lt.ClientError("Record already exists",409);return this._writeUpdate(x,T,!0),T})}patch(_,T){if(T===void 0||T instanceof URLSearchParams)this.update(_,!1);else{let N=this.update(_,T);if(N?.then)return N.then(()=>{})}}_writeUpdate(_,T,N,P){let O=this.getContext(),x=Ur(O);Ui(_);let L=this.#n??i.getEntry(_);this.#s=N?hG:Koe;let A=o(w=>N?w.put?()=>w.put(O,_,T):null:w.patch?()=>w.patch(O,_,T):w.put?()=>w.put(O,_,pl(this)):null,"writeToSources"),U={key:_,store:i,entry:L,nodeName:O?.nodeName,validate:o(w=>{T||(T=this.#t),N||T&&bg(this.#t===T?this:T)?O?.source||(x.checkOverloaded(),this.validate(T,!N),H&&(T[H.name]=H.type==="Date"?new Date(w):H.type==="String"?new Date(w).toISOString():w),N&&(t&&T[t]!==_&&(T[t]=_),G&&(L?.value?T[G.name]=L?.value[G.name]:T[G.name]=G.type==="Date"?new Date(w):G.type==="String"?new Date(w).toISOString():w),T=pl(T))):x.removeWrite(U)},"validate"),before:A(Ae),beforeIntermediate:yu(T,A(Ye)),commit:o((w,D,$)=>{if($){if(O&&D?.version>(O.lastModified||0)&&(O.lastModified=D.version),this.#n=D,D?.value&&D.value.getRecord)throw new Error("Can not assign a record to a record, check for circular references");N||(this.#e=D?.value??null)}this.#t=void 0,this.#r=w;let Y=D?.value,j;this.#s=0;let B=!1,Ee=xr(w,D,P?.nodeId),fe;if(Ee<=0){if(g){let de=D.localTime,oe=D.version;Fe.default.trace?.("Applying CRDT update to record with id: ",_,"txn time",new Date(w),"applying later update from:",new Date(oe),"local recorded time",new Date(de));let ke=[];for(;de>w||oe>=w&&de>0;){let Be=l.get(de);if(!Be)break;let Le=At(Be);if(oe=Le.version,oe>=w){if(oe===w){if(Ee=xr(w,{version:oe,localTime:de},P?.nodeId),Ee===0)return;if(Ee>0)continue}if(Le.type==="patch")ke.push(Le),fe=T;else if(Le.type==="put"||Le.type==="delete")return}de=Le.previousLocalTime}de||Fe.default.debug?.("No further audit history, applying incremental updates based on available history",_,"existing version preserved",D),ke.sort((Be,Le)=>Be.version-Le.version);for(let Be of ke){let Le=Be.getValue(i);if(Fe.default.debug?.("Rebuilding update with future patch:",new Date(Be.version),Le,Be),j=p_(j??T,Le,N),!j)return}}else{if(N)return;j=p_(j??T,Y,N),Fe.default.debug?.("Rebuilding update without audit:",j)}Fe.default.trace?.("Rebuilt record to save:",j," is full update:",N)}let pe;if(N&&!j?pe=T:this.constructor.loadAsInstance===!1?pe=pl(Y,j??T):(this.#e=Y,pe=pl(this,j??T)),this.#e=pe,pe&&pe.getRecord)throw new Error("Can not assign a record to a record, check for circular references");let ne;if(P?.residencyId!=null)ne=P.residencyId;else{L?.residencyId&&(O.previousResidency=Pe.getResidencyRecord(L.residencyId));let de=Pa(Pe.getResidency(pe,O));if(de&&!de.includes(server.hostname))if(fe??=pe,B=!0,Pe.getResidencyById)pe=void 0;else{pe=null;for(let oe in r)pe||(pe={}),pe[oe]=fe[oe]}ne=kc(de)}N||(fe=T);let ie=O?.expiresAt??(h?h+Date.now():-1);Fe.default.trace?.(`Saving record with id: ${_}, timestamp: ${new Date(w).toISOString()}${ie?", expires at: "+new Date(ie).toISOString():""}${D?", replaces entry from: "+new Date(D.version).toISOString():", new entry"}`,(()=>{try{return JSON.stringify(pe).slice(0,100)}catch{return""}})()),gu(_,Y,pe);let xe=N?"put":"patch";y(_,pe,D,w,B?Un:0,g,{omitLocalRecord:B,user:O?.user,residencyId:ne,expiresAt:ie,nodeId:P?.nodeId,originatingOperation:O?.originatingOperation,tableToTrack:c==="system"?null:s},xe,!1,fe),O.expiresAt&&Oa()},"commit")};x.addWrite(U)}async delete(_){if(Jf(_)){_.select=["$id"];for await(let T of this.search(_))this._writeDelete(T.$id);return!0}if(_){let T=!0,N=this.getContext();return _.checkPermission&&(T=this.allowDelete(N.user,_,N)),ks(T,P=>{if(!P)throw new lt.AccessViolation(N.user);let O=Os(_);return this._writeDelete(O),!0})}return this._writeDelete(this.getId()),!!this.#e}_writeDelete(_,T){let N=Ur(this.getContext());Ui(_);let P=this.getContext();return N.addWrite({key:_,store:i,entry:this.#n,nodeName:P?.nodeName,before:Ae.delete?.bind(this,P,_),beforeIntermediate:Ye.delete?.bind(this,P,_),commit:o((O,x,L)=>{let A=x?.value;L&&(P&&x?.version>(P.lastModified||0)&&(P.lastModified=x.version),Pe._updateResource(this,x)),!(xr(O,x,T?.nodeId)<=0)&&(gu(this.getId(),A),Fe.default.trace?.(`Deleting record with id: ${_}, txn timestamp: ${new Date(O).toISOString()}`),g||R?(y(_,null,x,O,0,g,{user:P?.user,nodeId:T?.nodeId,tableToTrack:s},"delete"),g||Oa()):nl(i,x))},"commit")}),!0}search(_){let T=this.getContext(),N=Ur(T);if(!_)throw new Error("No query provided");if(_.parseError)throw _.parseError;if(_.checkPermission&&!this.allowRead(T.user,_))throw new lt.AccessViolation(T.user);T&&(T.lastModified=Goe);let P=_.conditions;P?P.length===void 0&&(P=P[Symbol.iterator]?Array.from(P):[P]):P=Array.isArray(_)?_:_[Symbol.iterator]?Array.from(_):[];let O=_.id??this.getId();O&&(P=[{attribute:null,comparator:Array.isArray(O)?"prefix":"starts_with",value:O}].concat(P));let x,L={};function A(ie,xe){let de;switch(xe){case"and":case void 0:if(ie.length<1)throw new Error('An "and" operator requires at least one condition');de=!0;break;case"or":if(ie.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+xe)}for(let oe of ie){if(oe.conditions){oe.conditions=A(oe.conditions,oe.operator);continue}let ke=oe[0]??oe.attribute,Be=ke==null?k:$i(S,ke);if(Be)(Be.type||LA[oe.comparator])&&(oe[1]===void 0?oe.value=w(oe.value,Be):oe[1]=w(oe[1],Be));else if(ke!=null&&!_.allowConditionsOnDynamicAttributes)throw(0,lt.handleHDBError)(new Error,`${ke} is not a defined attribute`,404);if(oe.chainedConditions)if(oe.chainedConditions.length===1&&(!oe.operator||oe.operator=="and")){let Le=oe.chainedConditions[0],Me,pt;if(Le.comparator==="gt"||Le.comparator==="greater_than"||Le.comparator==="ge"||Le.comparator==="greater_than_equal"?(Me=oe,pt=Le):(Me=Le,pt=oe),Me.comparator!=="lt"&&Me.comparator!=="less_than"&&Me.comparator!=="le"&&Me.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let wt=pt.comparator==="ge"||pt.comparator==="greater_than_equal",Et=Me.comparator==="le"||Me.comparator==="less_than_equal";oe.comparator=(wt?"ge":"gt")+(Et?"le":"lt"),oe.value=[pt.value,Me.value]}else throw new Error("Multiple chained conditions are not currently supported")}return ie}o(A,"prepareConditions");function U(ie,xe){if(_.enforceExecutionOrder)return ie;for(let de of ie)de.conditions&&(de.conditions=U(de.conditions,de.operator));return ie.length>1&&xe!=="or"?Foe(ie,X_(Pe)):ie}o(U,"orderConditions");function w(ie,xe){return Array.isArray(ie)?ie.map(de=>jg(de,xe)):jg(ie,xe)}o(w,"coerceTypedValues");let D=_.operator;(P.length>0||D)&&(P=A(P,D));let $=typeof _.sort=="object"&&_.sort,Y;if($&&D!=="or"){let ie=$.attribute;if(ie==null)throw new lt.ClientError("Sort requires an attribute");if(x=P.find(xe=>Gu(xe.attribute)===Gu(ie)),!x){let xe=$i(S,ie);if(!xe)throw(0,lt.handleHDBError)(new Error,`${Array.isArray(ie)?ie.join("."):ie} is not a defined attribute`,404);if(xe.indexed)x={...$,comparator:"sort"},P.push(x);else if(P.length===0&&!_.allowFullScan)throw(0,lt.handleHDBError)(new Error,`${Array.isArray(ie)?ie.join("."):ie} is not indexed and not combined with any other conditions`,404)}x&&(x.descending=!!$.descending)}P=U(P,D),$&&(x&&P[0]===x?$.next&&(Y={dbOrderedAttribute:$.attribute,attribute:$.next.attribute,descending:$.next.descending,next:$.next.next}):(x&&P.splice(P.indexOf(x),1),Y=$));let j=_.select;if(P.length===0&&(P=[{attribute:t,comparator:"greater_than",value:!0}]),_.explain)return{conditions:P,operator:D,postOrdering:Y,selectApplied:!!j};let B=N.useReadTxn(),Ee=DA(P,D,Pe,B,_,T,(ie,xe)=>Zf(ie,j,T,B,xe),L),fe=_.ensureLoaded!==!1,pe=Pe.transformEntryForSelect(j,T,B,L,fe,!0),ne=Pe.transformToOrderedSelect(Ee,j,Y,T,B,pe);return(_.offset||_.limit!==void 0)&&(ne=ne.slice(_.offset,_.limit!==void 0?(_.offset||0)+_.limit:void 0)),ne.onDone=()=>{ne.onDone=null,N.doneReadTxn()},ne.selectApplied=!0,ne.getColumns=()=>{if(j){let ie=[];for(let xe of j)xe==="*"?ie.push(...S.map(de=>de.name)):ie.push(xe.name||xe);return ie}return S.filter(ie=>!ie.computed&&!ie.relationship).map(ie=>ie.name)},ne}static transformToOrderedSelect(_,T,N,P,O,x){let L=new GE;if(N){_=Zf(_,T,P,O,null);let A;L.iterate=function(){let w,D=_[Symbol.asyncIterator]?_[Symbol.asyncIterator]():_[Symbol.iterator](),$,Y=N.dbOrderedAttribute,j,B,Ee=!0;function fe(ne){let ie=ne.next&&fe(ne.next),xe=ne.descending;return P.sort=ne,(de,oe)=>{let ke=Su(de,ne.attribute,P),Be=Su(oe,ne.attribute,P),Le=xe?(0,Cl.compareKeys)(Be,ke):(0,Cl.compareKeys)(ke,Be);return Le===0?ie?.(de,oe)||0:Le}}o(fe,"createComparator");let pe=fe(N);return{async next(){let ne;if(w)if(ne=w.next(),ne.done){if($)return L.onDone&&L.onDone(),ne}else return{value:await x.call(this,ne.value)};A=[],j&&A.push(j);do if(ne=await D.next(),ne.done){if($=!0,A.length)break;return L.onDone&&L.onDone(),ne}else{let ie=ne.value;if(ie?.then&&(ie=await ie),Y){let xe=Su(ie,Y,P);if(Ee)Ee=!1,B=xe;else if(xe!==B){B=xe,j=ie;break}}A.push(ie)}while(!0);return N.isGrouped,A.sort(pe),w=A[Symbol.iterator](),ne=w.next(),ne.done?(L.onDone&&L.onDone(),ne):{value:await x.call(this,ne.value)}},return(){return L.onDone&&L.onDone(),D.return()},throw(){return L.onDone&&L.onDone(),D.throw()}}};let U=o(w=>{if(typeof T=="object"&&Array.isArray(w.attribute))for(let D=0;D<T.length;D++){let $=T[D],Y;if($.name===w.attribute[0]){for(Y=$.sort||($.sort={});Y.next;)Y=Y.next;Y.attribute=w.attribute.slice(1),Y.descending=w.descending}else $===w.attribute[0]&&(T[D]=Y={name:$,sort:{attribute:w.attribute.slice(1),descending:w.descending}})}w.next&&U(w.next)},"applySortingOnSelect");U(N)}else L.iterate=(_[Symbol.asyncIterator]||_[Symbol.iterator]).bind(_),L=L.map(function(A){try{let U=x.call(this,A);return typeof U?.catch=="function"?U.catch(w=>{throw w.partialObject={[t]:A.key},w}):U}catch(U){throw U.partialObject={[t]:A.key},U}});return L}static transformEntryForSelect(_,T,N,P,O,x){let L;O&&I&&!(typeof _=="string"?[_]:_)?.every(w=>{let D;return typeof w=="object"?D=w.name:D=w,r[D]||D===t})&&(L=!0);let A,U=o(function(w){let D;if(T?.transaction?.stale&&(T.transaction.stale=!1),w!=null){if(D=w.deref?w.deref():w.value,!D&&(w.key===void 0||w.deref)||w.metadataFlags&Un){if(w.metadataFlags&Un&&T.replicateFrom===!1&&x&&w.residencyId)return tc.SKIP;if(w=Io(w.key??w,T,{transaction:N,lazy:_?.length<4,ensureLoaded:O},this?.isSync,$=>$),w?.then)return w.then(U.bind(this));D=w?.value}if(L&&w?.metadataFlags&(Un|Ha)||w?.expiresAt!=null&&w?.expiresAt<Date.now()){if(T.onlyIfCached)return{[t]:w.key,message:"This entry has expired"};let $=dn(w.key??w,w,T);if($?.then)return $.then(U)}}if(D==null)return x?tc.SKIP:D;if(_&&!(_[0]==="*"&&_.length===1)){let $,Y=o((B,Ee)=>{let fe;typeof B=="object"?fe=B.name:fe=B;let pe=vr?.[fe],ne;if(pe){let ie=P?.[fe];if(ie)if(ie.hasMappings){let de=pe.from?D[pe.from]:Gu(w.key);ne=ie.get(de),ne||(ne=[])}else ne=ie.fromRecord?.(D);else ne=pe(D,T,w,!0);let xe=o(de=>{if(pe.directReturn)return Ee(de,fe);if(de&&typeof de=="object"){let oe=pe.definition?.tableClass||Pe;A||(A={});let ke=A[fe]||(A[fe]=oe.transformEntryForSelect(fe===B?null:B.select||(Array.isArray(B)?B:null),T,N,ie,O));if(Array.isArray(de)){let Be=[],Le=oe.transformToOrderedSelect(de,B.select,typeof B.sort=="object"&&B.sort,T,N,ke)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),Me=o(wt=>{for(;!wt.done;){if(wt?.then)return wt.then(Me);Be.push(wt.value),wt=Le.next()}Ee(Be,fe)},"nextValue"),pt=Me(Le.next());pt&&($||($=[]),$.push(pt));return}else if(de=ke.call(this,de),de?.then){$||($=[]),$.push(de.then(Be=>Ee(Be,fe)));return}}Ee(de,fe)},"handleResolvedValue");ne?.then?($||($=[]),$.push(ne.then(xe))):xe(ne);return}else ne=D[fe],ne&&typeof ne=="object"&&fe!==B&&(ne=Pe.transformEntryForSelect(B.select||B,T,N,null)({value:ne}));Ee(ne,fe)},"selectAttribute"),j;if(typeof _=="string")Y(_,B=>{j=B});else if(Array.isArray(_))if(_.asArray)j=[],_.forEach((B,Ee)=>{B==="*"?_[Ee]=D:Y(B,fe=>j[Ee]=fe)});else{j={};let B=_.forceNulls;for(let Ee of _)if(Ee==="*")for(let fe in D)j[fe]=D[fe];else Y(Ee,(fe,pe)=>{fe===void 0&&B&&(fe=null),j[pe]=fe})}else throw new lt.ClientError("Invalid select"+_);return $?Promise.all($).then(()=>j):j}return D},"transform");return U}async subscribe(_){if(!l)throw new Error("Can not subscribe to a table without an audit log");g||Ze({table:s,database:c,schemaDefined:u,attributes:S,audit:!0}),_||(_={});let T=!_.rawEvents,N=[],P=kA(Pe,this.getId()??null,function(L,A,U,w){try{let D=A.getValue?.(i,T),$=A.type;if(!D&&$==="patch"&&T){let j=i.getEntry(L);j?.version===A.version?D=j.value:D=A.getValue?.(i,!0,U),$="put"}let Y={id:L,localTime:U,value:D,version:A.version,type:$,beginTxn:w};N?N.push(Y):(c!=="system"&&Ve(A.size??1,"db-message",s,null),this.send(Y))}catch(D){Fe.default.error?.(D)}},_.startTime||0,_),O=(async()=>{this.isCollection&&(P.includeDescendants=!0,_.onlyChildren&&(P.onlyChildren=!0)),_.supportsTransactions&&(P.supportsTransactions=!0);let L=this.getId(),A=_.previousCount;A>1e3&&(A=1e3);let U=_.startTime;if(this.isCollection){if(U){if(A)throw new lt.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:w,value:D}of l.getRange({start:U,exclusiveStart:!0,snapshot:!1})){let $=At(D);if($.tableId!==n)continue;let Y=$.recordId;if(L==null||SG(L,Y)){let j=$.getValue(i,T,w);if(x({id:Y,localTime:w,value:j,version:$.version,type:$.type,size:$.size}),P.queue?.length>_G&&await P.waitForDrain()===!1)return}P.startTime=w}}else if(A){let w=[];for(let{key:D,value:$}of l.getRange({start:"z",end:!1,reverse:!0}))try{let Y=At($);if(Y.tableId!==n)continue;let j=Y.recordId;if(L==null||SG(L,j)){let B=Y.getValue(i,T,D);if(w.push({id:j,localTime:D,value:B,version:Y.version,type:Y.type}),--A<=0)break}}catch(Y){Fe.default.error("Error getting history entry",D,Y)}for(let D=w.length;D>0;)x(w[--D]);w[0]&&(P.startTime=w[0].localTime)}else if(!_.omitCurrent){for(let{key:w,value:D,version:$,localTime:Y,size:j}of i.getRange({start:L??!1,end:L==null?void 0:[L,Cl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(D&&(x({id:w,localTime:Y,value:D,version:$,type:"put",size:j}),P.queue?.length>_G&&await P.waitForDrain()===!1))return}}else{A&&!U&&(U=0);let w=this.#n?.localTime;if(w===CA&&(i.cache?.delete(L),this.#n=i.getEntry(L),Fe.default.trace?.("re-retrieved record",w,this.#n?.localTime),w=this.#n?.localTime),Fe.default.trace?.("Subscription from",U,"from",L,w),U<w){let D=[],$=w;do{let Y=l.get($);if(Y){_.omitCurrent=!0;let j=At(Y),B=j.getValue(i,T,$);T&&(j.type="put"),D.push({id:L,value:B,localTime:$,...j}),$=j.previousLocalTime}else break;A&&A--}while($>U&&A!==0);for(let Y=D.length;Y>0;)x(D[--Y]);P.startTime=w}!_.omitCurrent&&this.doesExist()&&x({id:L,localTime:w,value:this.#e,version:this.#r,type:"put"})}for(let w of N)x(w);N=null})();function x(L){c!=="system"&&Ve(L.size??1,"db-message",s,null),P.send(L)}return o(x,"send"),_.listener&&P.on("data",_.listener),P}static subscribeOnThisThread(_,T){return _===0||T?.crossThreads===!1}doesExist(){return!!(this.#e||this.#s)}publish(_,T,N){if(T===void 0||T instanceof URLSearchParams)this._writePublish(this.getId(),_,T);else{let P=!0,O=this.getContext();return _.checkPermission&&(P=this.allowCreate(O.user,_,O)),ks(P,x=>{if(!x)throw new lt.AccessViolation(O.user);let L=Os(_);this._writePublish(L,T,N)})}}_writePublish(_,T,N){let P=Ur(this.getContext());_??=null,_!==null&&Ui(_);let O=this.getContext();P.addWrite({key:_,store:i,entry:this.#n,nodeName:O?.nodeName,validate:o(()=>{O?.source||(P.checkOverloaded(),this.validate(T))},"validate"),before:Ae.publish?.bind(this,O,_,T),beforeIntermediate:yu(T,Ye.publish?.bind(this,O,_,T)),commit:o((x,L,A)=>{L===void 0&&R&&!g&&Oa(),Fe.default.trace?.(`Publishing message to id: ${_}, timestamp: ${new Date(x).toISOString()}`),y(_,L?.value??null,L,L?.version||x,0,!0,{user:O?.user,residencyId:N?.residencyId,expiresAt:O?.expiresAt,nodeId:N?.nodeId,tableToTrack:s},"message",!1,T)},"commit")})}validate(_,T){let N,P=o((O,x,L)=>{if(x.type&&O!=null)if(T&&O.__op__&&(O=O.value),x.properties){typeof O!="object"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an object${x.type?" ("+x.type+")":""}`);let A=x.properties;for(let U=0,w=A.length;U<w;U++){let D=A[U];if(D.relationship||D.computed){_.hasOwnProperty(D.name)&&(N||(N=[])).push(`Computed property ${L}.${D.name} may not be directly assigned a value`);continue}let $=P(O[D.name],D,L+"."+D.name);$&&(O[D.name]=$)}if(x.sealed&&O!=null&&typeof O=="object")for(let U in O)A.find(w=>w.name===U)||(N||(N=[])).push(`Property ${U} is not allowed within object in property ${L}`)}else switch(x.type){case"Int":(typeof O!="number"||O>>0!==O)&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof O!="number"||!(Math.floor(O)===O&&Math.abs(O)<=9007199254740992))&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof O!="number"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a number`);break;case"ID":typeof O=="string"||O?.length>0&&O.every?.(A=>typeof A=="string")||(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a string, or an array of strings`);break;case"String":typeof O!="string"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a string`);break;case"Boolean":typeof O!="boolean"&&(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a boolean`);break;case"Date":if(!(O instanceof Date)){if(typeof O=="string"||typeof O=="number")return new Date(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Date`)}break;case"BigInt":if(typeof O!="bigint"){if(typeof O=="string"||typeof O=="number")return BigInt(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a bigint`)}break;case"Bytes":if(!(O instanceof Uint8Array)){if(typeof O=="string")return Buffer.from(O);(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Buffer or Uint8Array`)}break;case"Blob":if(!(O instanceof Ls)){if(typeof O=="string"&&(O=Buffer.from(O)),O instanceof Buffer)return createBlob(O,{type:"text/plain"});(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be a Blob`)}break;case"array":if(Array.isArray(O)){if(x.elements)for(let A=0,U=O.length;A<U;A++){let w=O[A],D=P(w,x.elements,L+"[*]");D&&(O[A]=D)}}else(N||(N=[])).push(`Value ${Hs(O)} in property ${L} must be an Array`);break}x.nullable===!1&&O==null&&(N||(N=[])).push(`Property ${L} is required (and not does not allow null values)`)},"validateValue");for(let O=0,x=S.length;O<x;O++){let L=S[O];if(L.relationship||L.computed){Object.hasOwn(_,L.name)&&(N||(N=[])).push(`Computed property ${L.name} may not be directly assigned a value`);continue}if(!T||L.name in _){let A=P(_[L.name],L,L.name);A!==void 0&&(_[L.name]=A)}}if(f)for(let O in _)S.find(x=>x.name===O)||(N||(N=[])).push(`Property ${O} is not allowed`);if(N)throw new lt.ClientError(N.join(". "))}getUpdatedTime(){return this.#r}wasLoadedFromSource(){return I?!!this.#i:void 0}static async addAttributes(_){let T=S.slice(0);for(let N of _){if(!N.name)throw new lt.ClientError("Attribute name is required");if(N.name.match(/[`/]/))throw new lt.ClientError("Attribute names cannot include backticks or forward slashes");koe(N.name),T.push(N)}return Ze({table:s,database:c,schemaDefined:u,attributes:T}),Pe.indexingOperation}static async removeAttributes(_){let T=S.filter(N=>!_.includes(N.name));return Ze({table:s,database:c,schemaDefined:u,attributes:T}),Pe.indexingOperation}static getSize(){let _=i.getStats();return(_.treeBranchPageCount+_.treeLeafPageCount+_.overflowPages)*_.pageSize}static getAuditSize(){let _=l?.getStats();return _&&(_.treeBranchPageCount+_.treeLeafPageCount+_.overflowPages)*_.pageSize}static getStorageStats(){let _=i.env.path,T=rN.default.statfsSync?.(_)??{};return{available:T.bavail*T.bsize,free:T.bfree*T.bsize,size:T.blocks*T.bsize}}static async getRecordCount(_){let T=i.getStats().entryCount,N=1e3/2,P=performance.now(),O=Math.floor(T/2),x=_?.exactCount,L=0,A=0,U;for(let{value:w}of i.getRange({start:!0,lazy:!0,snapshot:!1}))if(w!=null&&L++,A++,await ec(),!x&&A<O&&performance.now()-P>N){U=A;break}if(U){let w=L;L=0;for(let{value:ne}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:U,snapshot:!1}))ne!=null&&L++,await ec();let D=U*2,$=(L+w)/D,Y=Math.pow((L-w+1)/U/2,2)+$*(1-$)/D,j=Math.max(Math.sqrt(Y)*T,1),B=Math.round($*T),Ee=Math.max(B-1.96*j,L+w),fe=Math.min(B+1.96*j,T),pe=Math.pow(10,Math.round(Math.log10(j)));return pe>B&&(pe=pe/10),L=Math.round(B/pe)*pe,{recordCount:L,estimatedRange:[Math.round(Ee),Math.round(fe)]}}return{recordCount:L}}static updatedAttributes(){vr=this.propertyResolvers={$id:o((_,T,N)=>({value:N.key}),"$id"),$updatedtime:o((_,T,N)=>N.version,"$updatedtime"),$updatedTime:o((_,T,N)=>N.version,"$updatedTime"),$expiresAt:o((_,T,N)=>N.expiresAt,"$expiresAt"),$record:o((_,T,N)=>N?{value:_}:_,"$record"),$distance:o((_,T,N)=>N&&(N.distance??T?.vectorDistances?.get(N)),"$distance")};for(let _ of this.attributes){_.isPrimaryKey&&(k=_),_.resolve=null;let T=_.relationship,N=_.computed;if(T)if(_.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),N&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),_u=!0,T.to)_.elements?.definition?(vr[_.name]=_.resolve=(P,O,x,L)=>{let A=P[T.from?T.from:t],U=_.elements.definition.tableClass;return L?Hu({attribute:T.to,value:A},Ur(O).getReadTxn(),!1,U,!1).map(w=>w&&w.key!==void 0?w:U.primaryStore.getEntry(w,{transaction:Ur(O).getReadTxn()})).asArray:U.search([{attribute:T.to,value:A}],O).asArray},_.set=()=>{},_.resolve.definition=_.elements.definition,_.resolve.to=T.to,T.from&&(_.resolve.from=T.from)):console.error(`The one-to-many/many-to-many relationship property "${_.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(T.from){let P=_.definition||_.elements?.definition;P?(vr[_.name]=_.resolve=(O,x,L,A)=>{let U=O[T.from];if(U===void 0)return;if(_.elements){let D,$=U?.map(Y=>{let j=P.tableClass.primaryStore[A?"getEntry":"get"](Y,{transaction:Ur(x).getReadTxn()});return j?.then&&(D=!0),Pe.loadAsInstance===!1&&Object.freeze(A?j?.value:j),j});return T.filterMissing?D?Promise.all($).then(Y=>Y.filter(TG)):$.filter(TG):D?Promise.all($):$}let w=P.tableClass.primaryStore[A?"getEntry":"get"](U,{transaction:Ur(x).getReadTxn()});return Pe.loadAsInstance===!1&&Object.freeze(A?w?.value:w),w},_.set=(O,x)=>{if(Array.isArray(x)){let L=x.map(A=>A.getId?.()||A[P.tableClass.primaryKey]);O[T.from]=L}else{let L=x.getId?.()||x[P.tableClass.primaryKey];O[T.from]=L}},_.resolve.definition=_.definition||_.elements?.definition,_.resolve.from=T.from):console.error(`The relationship property "${_.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${_.name}" in table "${s}" must use either "from" or "to" arguments`);else if(N)typeof N.from=="function"&&this.setComputedAttribute(_.name,N.from),vr[_.name]=_.resolve=(P,O,x)=>{let L=typeof N.from=="string"?P[N.from]:P,A=this.userResolvers[_.name];if(A)return A(L,O,x);Fe.default.warn(`Computed attribute "${_.name}" does not have a function assigned to it. Please use setComputedAttribute('${_.name}', resolver) to assign a resolver function.`),this.userResolvers[_.name]=()=>{}},_.resolve.directReturn=!0;else if(r[_.name]?.customIndex?.propertyResolver){let P=r[_.name].customIndex;vr[_.name]=(O,x,L)=>{let A=O[_.name];return P.propertyResolver(A,x,L)},vr[_.name].directReturn=!0}}cp(this,this),cp(Qf,this,!0);for(let _ of S){let T=_.name;_.resolve&&Object.defineProperty(i.encoder.structPrototype,T,{get(){return _.resolve(this,$u.getStore())},set(N){return _.set(this,N)},configurable:!0})}}static setComputedAttribute(_,T){let N=$i(S,_);if(!N){console.error(`The attribute "${_}" does not exist in the table "${s}"`);return}if(!N.computed){console.error(`The attribute "${_}" is not defined as computed in the table "${s}"`);return}this.userResolvers[_]=T}static async deleteHistory(_=0,T=!1){let N;for(let{key:P,value:O}of l.getRange({start:0,end:_}))await ec(),At(O).tableId===n&&(N=x_(l,P,O));if(T)for(let P of i.getRange({start:0,versions:!0})){let{key:O,value:x,localTime:L}=P;await ec(),x===null&&L<_&&(N=nl(i,P))}await N}static async*getHistory(_=0,T=1/0){for(let{key:N,value:P}of l.getRange({start:_||1,end:T})){await ec();let O=At(P);O.tableId===n&&(yield{id:O.recordId,localTime:N,version:O.version,type:O.type,value:O.getValue(i,!0,N),user:O.user,operation:O.originatingOperation})}}static async getHistoryOfRecord(_){let T=[];if(_==null)throw new Error("An id is required");let N=i.getEntry(_);if(!N)return T;let P=N.localTime;if(!P)throw new Error("The entry does not have a local audit time");let O=0;do{await ec();let x=l.get(P);if(x){let L=At(x);T.push({id:L.recordId,localTime:P,version:L.version,type:L.type,value:L.getValue(i,!0,P),user:L.user}),P=L.previousLocalTime}else break}while(O<1e3&&P);return T.reverse()}static cleanup(){W?.remove()}}let $E=Wg(async(K,_,T)=>{for(let N of Pe.sources)if(N.get&&(!N.get.reliesOnPrototype||N.prototype.get)){if(N.available?.(T)===!1)continue;_.source=N;let P=await N.get(K,_);if(P)return P}},()=>{throw new lt.ServerError("Service unavailable, exceeded request queue limit for resolving cache record",503)});Pe.updatedAttributes();let ab=Pe.prototype;return h&&Pe.setTTLExpiration(h/1e3),X&&VE(),Pe;function gu(K,_,T){let N;for(let P in r){let O=r[P],x=O.isIndexing,L=vr[P],A=T&&(L?L(T):T[P]),U=_&&(L?L(_):_[P]);if(A===U&&!x)continue;if(O.customIndex){O.customIndex.index(K,A,U);continue}N=!0;let w=O.indexNulls,D=(0,Cp.getIndexedValues)(A,w),$=(0,Cp.getIndexedValues)(U,w);if($?.length>0){let Y=new Set($);if(D=D?D.filter(j=>{if(Y.has(j))Y.delete(j);else return!0}):[],$=Array.from(Y),($.length>0||D.length>0)&&pG){let j=$.concat(D).map(B=>({key:B,value:K}));O.prefetch(j,gG)}for(let j=0,B=$.length;j<B;j++)O.remove($[j],K)}else D?.length>0&&pG&&O.prefetch(D.map(Y=>({key:Y,value:K})),gG);if(D)for(let Y=0,j=D.length;Y<j;Y++)O.put(D[Y],K)}return N}o(gu,"updateIndices");function Ui(K){switch(typeof K){case"number":return!0;case"string":if(K.length<659)return!0;if(K.length>EG)throw new Error("Primary key size is too large: "+K.length);break;case"object":if(K===null)throw new Error("Invalid primary key of null");break;case"bigint":if(K<2n**64n&&K>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof K)}if((0,Cl.writeKey)(K,Yoe,0)>EG)throw new Error("Primary key size is too large: "+K.length);return!0}o(Ui,"checkValidId");function Os(K){return typeof K=="object"&&K?K.id:K}o(Os,"requestTargetToId");function Jf(K){return typeof K=="object"&&K&&K.isCollection}o(Jf,"isSearchTarget");function Xf(K){}o(Xf,"isRequestTarget");function Io(K,_,T,N,P){if(Pe.getResidencyById&&T.ensureLoaded&&_?.replicateFrom!==!1){let x=Pa(Pe.getResidencyById(K));if(x&&!x.includes(server.hostname)&&C)return C({key:K,residency:x}).then(P)}let O=o(()=>{if(_?.transaction?.stale&&(_.transaction.stale=!1),T.transaction?.isDone)return P(null,K);let x=i.getEntry(K,T);return(c!=="system"||s==="hdb_analytics")&&(bG.default.trace?.("Recording db-read action for",`${c}.${s}`),Ve(x?.size??1,"db-read",s,null)),_?._freezeRecords&&Object.freeze(x?.value),x?.residencyId&&x.metadataFlags&Un&&C&&T.ensureLoaded&&_?.replicateFrom!==!1?C(x).then(L=>P(L,K),L=>(Fe.default.error?.("Error loading remote record",K,x,T,L),P(null,K))):(x&&_&&(x?.version>(_.lastModified||0)&&(_.lastModified=x.version),x?.localTime&&!_.lastRefreshed&&(_.lastRefreshed=x.localTime)),P(x,K))},"whenPrefetched");return N?O():te>0?(te--,O()):new Promise((x,L)=>{te===0?(te--,i.prefetch([K],()=>{A(),U()})):(ue.push(K),ce.push(U),ue.length>qE&&(te--,A()));function A(){if(ue.length>0){let w=ce;i.prefetch(ue,()=>{te===-1?A():te++;for(let D of w)D()}),ue=[],ce=[],ye>2&&ye--}else te=ye,ye<jf&&ye++}o(A,"prefetch");function U(){try{x(O())}catch(w){L(w)}}o(U,"load")})}o(Io,"loadLocalRecord");function On(K,_){let T=_?.checkPermission;if(typeof T!="object"){if(!K?.role)return;T=K.role.permission}if(T.super_user)return Woe;let N=T[c],P,O=N?.tables;if(O)return O[s];if(c==="data"&&(P=T[s])&&!P.tables)return P}o(On,"getTablePermissions");function dn(K,_,T,N){if(I){let P=!1;if(T.noCache?P=!0:(_?(!_.value||_.metadataFlags&(Un|Ha)||_.expiresAt!=null&&_.expiresAt<Date.now())&&(P=!0):P=!0,Zr(!P,"cache-hit",s)),P){let O=Tu(K,_,T).then(x=>(x?.value&&x?.value.getRecord?.()&&Fe.default.error?.("Can not assign a record that is already a resource"),T&&(x?.version>(T.lastModified||0)&&(T.lastModified=x.version),T.lastRefreshed=Date.now()),x));if(T?.onlyIfCached||_?.value&&N?.allowStaleWhileRevalidate?.(_,K)){if(O.catch(x=>Fe.default.warn?.(x)),T?.onlyIfCached&&!N.doesExist())throw new lt.ServerError("Entry is not cached",504);return}else return O}}else if(_?.value&&_.expiresAt!=null&&_.expiresAt<Date.now())return Pe.evict(_.key,_.value,_.version),_.value=null,{then(P){return P(_)}}}o(dn,"ensureLoadedFromSource");function Ur(K){let _=K?.transaction;if(_){if(!_.lmdbDb)return _.lmdbDb=i,_;do{if(_.lmdbDb?.path===i.path)return _;let T=_.next;if(!T)return _=_.next=new No,_.lmdbDb=i,_;_=T}while(!0)}else return new f_}o(Ur,"txnForContext");function Su(K,_,T){if(!K)return;let N=(K.deref?K.deref():K.value)??i.getEntry(K.key)?.value;if(typeof _=="object"){let O=vr,x=N;for(let L=0,A=_.length;L<A;L++){let U=_[L],w=O?.[U];x=w&&x?w(x,T,K):x?.[U],K=null,O=w?.definition?.tableClass?.propertyResolvers}return x}let P=vr[_];return P?P(N,T,K):N[_]}o(Su,"getAttributeValue");function Zf(K,_,T,N,P){let O=P?.length,x={transaction:N,lazy:O>0||typeof _=="string"||_?.length<4,alwaysPrefetch:!0},L;function A(U,w){let D=U?.value;if(!D)return tc.SKIP;for(let $=0;$<O;$++)if(!L?.includes($)&&!P[$](D,U))return tc.SKIP;return w!==void 0&&(U.key=w),U}if(o(A,"processEntry"),O>0||!K.hasEntries){let U=K.map(w=>{if(L=null,typeof w=="object"&&w?.key!==void 0)return O>0?A(w):w;if(w==null)return tc.SKIP;for(let D=0;D<O;D++){let Y=P[D].idFilter;if(Y){if(!Y(w))return tc.SKIP;L||(L=[]),L.push(D)}}return Io(w,T,x,!1,A)});return Array.isArray(K)&&(U=U.filter(w=>w!==tc.SKIP)),U.hasEntries=!0,U}return K}o(Zf,"transformToEntries");function xr(K,_,T=server.replication?.getThisNodeId(l)){if(K<=_?.version){if(_?.version===K&&T!==void 0){let N=server.replication?.exportIdMapping(l),P=_.localTime,O=P&&l.get(P);if(O){let x,L,A=At(O);for(let U in N)N[U]===T&&(x=U),N[U]===A.nodeId&&(L=U);if(x>L)return 1;if(x===L)return 0}}return-1}return 1}o(xr,"precedesExistingVersion");async function Tu(K,_,T){let N=_?.metadataFlags,P=_?.version,O,x;if(!i.attemptLock(K,P,()=>{clearTimeout(x);let w=i.getEntry(K);!w||!w.value||w.metadataFlags&(Un|Ha)?O(Tu(K,i.getEntry(K),T)):O(w)}))return new Promise(w=>{O=w,x=setTimeout(()=>{i.unlock(K,P)},Voe)});let L=_?.value,A={requestContext:T,replacingRecord:L,replacingEntry:_,replacingVersion:P,noCacheStore:!1,source:null,resourceCache:T?.resourceCache,transaction:void 0,expiresAt:void 0,lastModified:void 0},U=T?.responseHeaders;return new Promise((w,D)=>{let $;ks(bt(A,async Y=>{let j=performance.now(),B,Ee,fe;try{B=await $E(K,A,_),fe=N&Un;let ne=A.lastModified||fe&&P;Ee=fe||ne>P||!L,ne||(ne=(0,Cp.getNextMonotonicTime)());let ie=performance.now()-j;if(Ve(ie,"cache-resolution",s,null,"success"),U&&wp(U,"Server-Timing",`cache-resolve;dur=${ie.toFixed(2)}`,!0),Y.timestamp=ne,h&&A.expiresAt==null&&(A.expiresAt=Date.now()+h),B){if(typeof B!="object")throw new Error("Only objects can be cached and stored in tables");if(B.status>0&&B.headers)if(B.status>=300)if(B.status===304)B=L,ne=P;else throw new lt.ServerError(B.body||"Error from source",B.status);else B=B.body;typeof B.toJSON=="function"&&(B=B.toJSON()),t&&B[t]!==K&&(B[t]=K)}$=!0,w({key:K,version:ne,value:B})}catch(ne){ne.message+=` while resolving record ${K} for ${s}`,L&&((ne.code==="ECONNRESET"||ne.code==="ECONNREFUSED"||ne.code==="EAI_AGAIN")&&!T?.mustRevalidate||T?.staleIfError&&(ne.statusCode===500||ne.statusCode===502||ne.statusCode===503||ne.statusCode===504))?(w({key:K,version:P,value:L}),Fe.default.trace?.(ne.message,"(returned stale record)")):D(ne);let ie=performance.now()-j;Ve(ie,"cache-resolution",s,null,"fail"),U&&wp(U,"Server-Timing",`cache-resolve;dur=${ie.toFixed(2)}`,!0),A.transaction.abort();return}if(T?.noCacheStore||A.noCacheStore){A.transaction.abort();return}Ur(A).addWrite({key:K,store:i,entry:_,nodeName:"source",before:yu(B),commit:o((ne,ie)=>{if(ie?.version!==P)return;let xe=gu(K,L,B);if(B){Ye.put?.(A,K,B),ie&&(T.previousResidency=Pe.getResidencyRecord(ie.residencyId));let de,oe=!1,ke,Be=Pa(Pe.getResidency(B,T));if(Be){if(!Be.includes(server.hostname))if(de=B,oe=!0,Pe.getResidencyById)B=void 0;else{B=null;for(let Le in r)B||(B={}),B[Le]=de[Le]}ke=kc(Be)}Fe.default.trace?.(`Writing resolved record from source with id: ${K}, timestamp: ${new Date(ne).toISOString()}`),y(K,B,ie,ne,oe?Un:0,g&&(Ee||oe)||null,{user:A?.user,expiresAt:A.expiresAt,residencyId:ke,tableToTrack:s},"put",!!fe,de)}else ie&&(Ye.delete?.(A,K),Fe.default.trace?.(`Deleting resolved record from source with id: ${K}, timestamp: ${new Date(ne).toISOString()}`),g||R?y(K,null,ie,ne,0,g&&Ee||null,{user:A?.user,tableToTrack:s},"delete",!!fe):nl(i,ie,P))},"commit")})}),()=>{i.unlock(K,P)},Y=>{i.unlock(K,P),$&&Fe.default.error?.("Error committing cache update",Y)})})}o(Tu,"getFromSource");function Ca(K){if(!K||K.user?.role?.permission?.super_user)return!0;if(K.replicateTo)throw new lt.ClientError("Can not specify replication parameters without super user permissions",403);if(K.replicatedConfirmation)throw new lt.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}o(Ca,"checkContextPermissions");function Oa(K){let _=!1;if(K&&(K-Ar>1&&(_=!0),Ar=K),!(qe===tr&&!_)&&(tr=qe,(0,wl.getWorkerIndex)()===(0,wl.getWorkerCount)()-1))return Wr&&clearTimeout(Wr),qe?new Promise(T=>{let N=new Date;N.setMonth(0),N.setDate(1),N.setHours(0),N.setMinutes(0),N.setSeconds(0);let P=qe/(1+Ar),O=_?Date.now():Math.ceil((Date.now()-N.getTime())/P)*P+N.getTime(),x=o(L=>{Fe.default.trace?.(`Scheduled next cleanup scan at ${new Date(L)}`),Wr=setTimeout(()=>J=J.then(async()=>{if(x(Math.max(L+qe,Date.now())),i.rootStore.status!=="open"){clearTimeout(Wr);return}let A=50,U=new Array(A),w=0,D=Math.pow(Ar,8)*(Nl.get(F.STORAGE_RECLAMATION_EVICTIONFACTOR)??1e5),$=E/Math.pow(Math.max(Ar,1),4);Fe.default.debug?.(`Starting cleanup scan for ${s}, evict threshold ${D}, adjusted eviction ${$}ms`);function Y(j,B,Ee,fe){let pe=j+$-Date.now();if(pe<0)return!0;if(Ar){let ne=i.lastSize;return Ee&Jr&&Wc(fe,ie=>{ie.size&&(ne+=ie.size)}),Fe.default.trace?.(`shouldEvict adjusted ${pe} ${ne}, ${pe*(j-B)/ne} < ${D}`),pe*(j-B)/ne<D}return!1}o(Y,"shouldEvict");try{let j=0;for(let B of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let{key:Ee,value:fe,version:pe,expiresAt:ne,metadataFlags:ie}=B,xe;fe===null&&!g&&pe+$oe<Date.now()?xe=nl(i,B,pe):ne!=null&&Y(ne,pe,ie,fe)&&(xe=Pe.evict(Ee,fe,pe),j++),xe&&(await U[w],U[w]=xe.catch(de=>{Fe.default.error?.("Cleanup error",de)}),++w>=A&&(w=0)),await ec()}Fe.default.debug?.(`Finished cleanup scan for ${s}, evicted ${j} entries`)}catch(j){Fe.default.warn?.(`Error in cleanup scan for ${s}:`,j)}T(void 0),Ar=0}),Math.min(L-Date.now(),2147483647)).unref()},"startNextTimer");x(O)}):void 0}o(Oa,"scheduleCleanup");function em(){W=l?.addDeleteRemovalCallback(n,i,(K,_)=>{i.remove(K,_)})}o(em,"addDeleteRemoval");function VE(){(0,wl.getWorkerIndex)()===0&&setInterval(async()=>{if(!Fc){Fc=!0;try{let K=X.name,_=r[K];if(!_)throw new Error(`expiresAt attribute ${X} must be indexed`);for(let T of _.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let N of _.getValues(T)){let P=i.getEntry(N);P?.value?P.value[K]<Date.now()&&Pe.evict(N,P.value,P.version):i.ifVersion(N,P?.version,()=>_.remove(T,N))}await ec()}}catch(K){Fe.default.error?.("Error in evicting old records",K)}finally{Fc=!1}}},qoe).unref()}o(VE,"runRecordExpirationEviction");function Pa(K){if(K!=null){if(Array.isArray(K))return K;if(typeof K=="number"){if(K>=65536)throw new Error(`Shard id ${K} must be below 65536`);let _=server.shards?.get?.(K);if(_)return Fe.default.trace?.(`Shard ${K} mapped to ${_.map(T=>T.name).join(", ")}`),_.map(T=>T.name);throw new Error(`Shard ${K} is not defined`)}throw new Error(`Shard or residency list ${K} is not a valid type, must be a shard number or residency list of node hostnames`)}}o(Pa,"residencyFromFunction");function kc(K){if(K){let _=K.join(","),T=d.get([Symbol.for("residency_by_set"),_]);return T||(d.put([Symbol.for("residency_by_set"),_],T=Math.floor(Math.random()*2147418112)+65535),d.put([Symbol.for("residency_by_id"),T],K),T)}}o(kc,"getResidencyId");function yu(K,_){let T=Zb(K,i.rootStore);if(T){let N=_;return N?async()=>{await N(),await T}:()=>T}return _}o(yu,"preCommitBlobsForRecordBefore")}function tN(e,t){let r=e.attr_object||(e.attr_object={}),n=r[t];if(n)return n;n=r[t]=Object.create(null);for(let s of e)n[s.attribute_name]=s[t];return n}function gG(){}function jg(e,t){let r=t?.type;if(e===null)return e;if(e===""&&r&&r!=="String"&&r!=="Any")return null;try{switch(r){case"Int":case"Long":if(e[0]==="$")return zg(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return zg(+e);case"Float":return e==="null"?null:zg(+e);case"BigInt":return e==="null"?null:BigInt(e);case"Boolean":return e==="true"?!0:e==="false"?!1:e;case"Date":if(isNaN(e)){if(e==="null")return null;zoe.test(e)||(e+="Z");let n=new Date(e);return zg(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,Qg.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function zg(e){if(isNaN(e))throw new SyntaxError;return e}function SG(e,t){if(e==null)return!0;if(!Array.isArray(t))return e===t||t.startsWith?.(e);if(Array.isArray(e)){let r=e.length;if(e[r-1]===null&&r--,t.length>=r){for(let n=0;n<r;n++)if(t[n]!==e[n])return!1;return!0}return!1}else if(t[0]===e)return!0}function ks(e,t,r){return e?.then?e.then(t,r):t(e)}function TG(e){return e!=null}function Hs(e){try{return JSON.stringify(e)}catch{return e}}function joe(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var tc,Cp,yG,RG,Nl,lt,Op,Pp,Fe,Cl,wl,Qg,rN,bG,Foe,koe,Hoe,Goe,qoe,$oe,pG,Voe,hG,Koe,Un,Ha,Yoe,EG,_G,Woe,OMe,zoe,ec,tg=se(()=>{q();tc=require("lmdb"),Cp=b(Dn()),yG=b(require("lodash")),RG=b(hm());Ga();_m();Nl=b(me());HA();lt=b(_e()),Op=b(Ho()),Pp=b(is());we();eg();Fe=b(Zn());zI();va();Cl=require("ordered-binary"),wl=b(nt());Fi();Qg=b(ae());el();ts();h_();Np();rN=b(require("node:fs"));es();D_();bG=b(Q());eN();({sortBy:Foe}=yG.default),{validateAttribute:koe}=RG.default,Hoe=new Uint8Array(9);Hoe[8]=192;Goe=1/0,qoe=6e4,$oe=864e5;Nl.initSync();pG=Nl.get(F.STORAGE_PREFETCHWRITES),Voe=1e4,hG=1,Koe=2,Un=1,Ha=8,Yoe=Buffer.allocUnsafeSlow(8192),EG=1978,_G=100,Woe={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},OMe=(0,Qg.convertToMS)(Nl.get(F.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;o(Jg,"makeTable");o(tN,"attributesAsObject");o(gG,"noop");zoe=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;o(jg,"coerceType");o(zg,"rejectNaN");o(SG,"isDescendantId");ec=o(()=>new Promise(setImmediate),"rest");o(ks,"when");o(TG,"exists");o(Hs,"stringify");o(joe,"hasOtherProcesses")});function Xg(e,t){if(!Array.isArray(e)||!Array.isArray(t))throw new Error("Euclidean distance comparison requires an array");let r=0,n=Math.max(e.length,t.length);for(let s=0;s<n;s++){let i=e[s]||0,a=t[s]||0,c=i-a;r+=c*c}return r}function Zg(e,t){if(!Array.isArray(e)||!Array.isArray(t))throw new Error("Cosine distance comparison requires an array");let r=0,n=0,s=0,i=Math.max(e.length,t.length);for(let a=0;a<i;a++){let c=e[a]||0,l=t[a]||0;r+=c*l,n+=c*c,s+=l*l}return n=Math.sqrt(n),s=Math.sqrt(s),1-r/(n*s||1)}var IG=se(()=>{o(Xg,"euclideanDistance");o(Zg,"cosineDistance")});var wG,NG,hd,no,pd,Qoe,Joe,eS,CG=se(()=>{IG();wG=require("msgpackr"),NG=b(Zn()),hd=b(_e()),no=(0,NG.loggerWithTag)("HNSW"),pd=Symbol.for("entryPoint"),Qoe=Symbol.for("key"),Joe=10,eS=class{static{o(this,"HierarchicalNavigableSmallWorld")}static useObjectStore=!0;indexStore;M=16;efConstruction=100;efConstructionSearch=50;mL=1/Math.log(this.M);optimizeRouting=.5;nodesVisitedCount=0;idIncrementer;distance;constructor(t,r){this.indexStore=t,t&&(this.indexStore.encoder.useFloat32=wG.FLOAT32_OPTIONS.ALWAYS),this.distance=r?.distance==="euclidean"?Xg:Zg,r&&(r.M!==void 0&&(this.M=r.M,this.mL=1/Math.log(this.M)),r.efConstruction!==void 0&&(this.efConstruction=this.efConstructionSearch=r.efConstruction),r.efConstructionSearch!==void 0&&(this.efConstructionSearch=r.efConstructionSearch),r.mL!==void 0&&(this.mL=r.mL),r.optimizeRouting!==void 0&&(this.optimizeRouting=r.optimizeRouting))}index(t,r,n){let s=typeof t=="number"?[Qoe,t]:t,i=this.indexStore.get(s);if(!i){if(!r)return;if(!this.idIncrementer){let f=0;for(let m of this.indexStore.getKeys({reverse:!0,limit:1,start:1/0,end:0}))typeof m=="number"&&(f=m);this.idIncrementer=new BigInt64Array([BigInt(f)+1n]),this.idIncrementer=new BigInt64Array(this.indexStore.getUserSharedBuffer("next-id",this.idIncrementer.buffer))}i=Number(Atomics.add(this.idIncrementer,0,1n)),this.indexStore.put(s,i)}let a=new Map,c,l=this.indexStore.get(pd);if(n?c={...this.indexStore.get(i)}:c={},r){let f=l&&this.indexStore.get(l);if(f===void 0){let E=Math.floor(-Math.log(Math.random())*this.mL),g={vector:r,level:E,primaryKey:t};for(let R=0;R<=E;R++)g[R]=[];if(this.indexStore.put(i,g),typeof i!="number")throw new Error("Invalid nodeId: "+i);no.debug?.("setting entry point to",i),this.indexStore.put(pd,i);return}let m=c.level??Math.min(Math.floor(-Math.log(Math.random())*this.mL),Joe),p=f.level;if(m>=p){if(typeof i!="number")throw new Error("Invalid nodeId: "+i);no.debug?.("setting entry point to",i),this.indexStore.put(pd,i)}for(;p>m;){let E=this.searchLayer(r,l,f,this.efConstruction,p);E.length>0&&(l=E[0].id,f=E[0].node),p--}let h=new Array(m+1);for(let E=0;E<=m;E++)h[E]=[];for(let E=Math.min(m,p);E>=0;E--){let g=this.searchLayer(r,l,f,this.efConstruction,E);g=g.slice(0,this.M<<1),g.length===0&&E===0&&no.info?.("should not have zero connections for",l);let R=h[E];for(let S=0;S<g.length;S++){let{id:y,distance:C,node:I}=g[S];if(y===i)continue;let k=[];if(this.optimizeRouting){let H=!1,X=I[E],W=1+this.optimizeRouting*(1+.5*S/this.M);for(let ue=0;ue<X.length;ue++){let{id:ce,distance:te}=X[ue],ye=1+this.optimizeRouting*(1+.5*ue/this.M);for(let Ae=0;Ae<R.length;Ae++){let{id:Ye,distance:qe}=R[Ae];if(Ye===ce){C*W>qe+te?H=!0:te*ye>C+qe&&(k.push({fromId:Ye,toId:y}),k.push({fromId:y,toId:Ye}));break}}if(H)break}if(H)continue}else if(S>=(E>0?this.M:this.M<<1))continue;R.push({id:y,distance:C});for(let{fromId:H,toId:X}of k){let W=d(H);W||(W=d(H,this.indexStore.get(H)));for(let ue=0;ue<W[E].length;ue++)if(W[E][ue].id===X){Object.isFrozen(W[E])&&(W[E]=W[E].slice()),W[E].splice(ue,1);break}}let J=c[E],G=J?.find(({id:H})=>H===y);if(G){let H=J?.indexOf(G);J.copied||(J=[...J],J.copied=!0,c[E]=J),J.splice(H,1)}else this.addConnection(y,d(y,I),i,E,C,d)}}this.indexStore.put(i,{vector:r,level:m,primaryKey:t,...h})}else{if(l===i){let f=c.level??0;for(let m=f;m>=0&&(l=c[m][0]?.id,l===void 0);m--);if(l===void 0){let m=-1;for(let{key:p,value:h}of this.indexStore.getRange({start:0,end:1/0}))if(h.level>m){if(l=p,h.level===f)break;m=h.level}}if(l===void 0)this.indexStore.remove(pd);else{if(typeof l!="number")throw new Error("Invalid nodeId: "+l);no.debug?.("setting entry point to",l),this.indexStore.put(pd,l)}}this.indexStore.remove(i)}let u=new Map;if(c.level!==void 0)for(let f=0;f<=c.level;f++){let m=c[f];for(let{id:p}of m){let h=d(p,this.indexStore.get(p));for(let E=0;E<=f;E++)h[E]=h[E]?.filter(({id:g})=>g!==i),h[E].length===0&&(no.info?.("node was left orphaned, will reindex",p),u.set(h.primaryKey,h.vector))}}function d(f,m){let p=a.get(f);return!p&&m&&(p={...m},a.set(f,p)),p}o(d,"updateNode");for(let[f,m]of a)this.indexStore.put(f,m);for(let[f,m]of u)this.index(f,m,m);this.checkSymmetry(i,this.indexStore.get(i))}getEntryPoint(){let t=this.indexStore.get(pd);if(t===void 0)return;let r=this.indexStore.get(t);return{id:t,...r}}searchLayer(t,r,n,s,i,a=this.distance){let c=new Set([r]),l=[{id:r,distance:this.distance(t,n.vector),node:n}],u=[...l];for(;l.length>0;){l.sort((p,h)=>p.distance-h.distance);let d=l.shift(),f=u[u.length-1].distance;if(d.distance>f)break;let m=d.node;for(let{id:p}of m[i]||[]){if(c.has(p)||p===void 0)continue;c.add(p);let h=this.indexStore.get(p);if(!h)continue;this.nodesVisitedCount++;let E=a(t,h.vector);if(E<f||u.length<s){let g={id:p,distance:E,node:h};l.push(g),u.push(g)}}u.sort((p,h)=>p.distance-h.distance),u.length>s&&u.splice(s,u.length-s)}return u.visited=c.size,u}search({target:t,value:r,descending:n,distance:s,comparator:i}){let a=0;switch(i){case"lt":case"le":a=r;case"sort":break;default:throw new hd.ClientError(`Can not use "${i}" comparator with HNSW`)}if(n)throw new hd.ClientError("Can not use descending sort order with HNSW");let c;if(s==="cosine")c=Zg;else if(s==="euclidean")c=Xg;else{if(s)throw new hd.ClientError("Unknown distance function");c=this.distance}if(!t)throw new hd.ClientError("A target vector must be provided for an HNSW query");if(!Array.isArray(t))throw new hd.ClientError("The target vector must be an array");let l=this.getEntryPoint();if(!l)return[];let u=l.id,d=[];for(let f=l.level;f>=0;f--)if(d=this.searchLayer(t,u,l,this.efConstructionSearch,f,c),d.length>0){let m=d[0];l=m.node,u=m.id}return a&&(d=d.filter(f=>f.distance<a)),d.map(f=>({key:f.node.primaryKey,distance:f.distance}))}checkSymmetry(t,r){if(!r)return;let n=0,s;for(;(s=r[n])&&s.length!==0;){for(let{id:i}of s){let a=this.indexStore.get(i);if(!a){no.info?.("could not find neighbor node",a);continue}a[n]?.find(({id:l})=>l==t)||no.info?.("asymmetry detected",a[n])}n++}}addConnection(t,r,n,s,i,a){r[s]||(r[s]=[]);let c=s===0?this.M<<1:this.M;if(this.optimizeRouting&&(c<<=2),r[s].length>=c+(c>>2)){no.warn?.("maxConnections reached, removing some connections",c);let l=[...r[s]];l.sort((f,m)=>f.distance-m.distance);let u=l.slice(0,c),d=l.slice(c);r[s]=u;for(let f of d){let m=a(f.id)??this.indexStore.get(f.id);m&&m[s]&&(m=a(f.id,m),m[s]=m[s].filter(({id:p})=>p!==t),s===0&&m[s].length===0&&no.info?.("should not remove last connection",t,n))}}r[s].find(({id:l})=>l===n)?no.debug?.("already connected",t,n):r[s]=[...r[s],{id:n,distance:i}]}validateConnectivity(t=0){let r=this.getEntryPoint(),n=new Set,s=[r.id];n.add(r.id);let i=0;for(;s.length>0;){let a=s.shift(),c=this.indexStore.get(a);for(let l=t;l<=c.level;l++)for(let{id:u}of c[l]||[])i++,n.has(u)||(n.add(u),s.push(u))}return n.size!==this.totalNodes&&console.log("visited",n.size,"total",this.totalNodes),{isFullyConnected:n.size===this.totalNodes,averageConnections:i/n.size}}get totalNodes(){return Array.from(this.indexStore.getKeys({start:0,end:1/0})).length}estimateCountAsSort(){return Math.sqrt(this.indexStore.getStats().entryCount*this.efConstructionSearch)}propertyResolver(t,r,n){let s=r?.sort;if(s){let i=s.vectorDistances;if(i){let l=i.get(n);if(l)return l}else i=r.vectorDistances=s.vectorDistances=new Map;let a=this.distance;s.type&&(a=s.distance==="euclidean"?Xg:Zg);let c=a(s.target,t);return i.set(n,c),c}return t}}});var nN,OG=se(()=>{CG();nN={HNSW:eS}});var ft={};Re(ft,{NON_REPLICATING_SYSTEM_TABLES:()=>tS,database:()=>td,databaseEnvs:()=>Ko,databases:()=>De,dropDatabase:()=>ZI,dropTableMeta:()=>nae,getDatabases:()=>at,getDefaultCompression:()=>cS,getTables:()=>Zoe,onRemovedDB:()=>Bp,onUpdatedTable:()=>Ol,readMetaDb:()=>Lp,resetDatabases:()=>Td,table:()=>Ze,tables:()=>Sn});function xp(e,t){let r=oS.OpenDBIObject??oS.default.OpenDBIObject;return new r(e,t)}function Zoe(){return iS||at(),Sn||{}}function at(){if(iS)return De;iS=!0,gd=new Map;let e=(0,zt.getHdbBasePath)()&&(0,Ht.join)((0,zt.getHdbBasePath)(),qc),t=(0,zt.get)(F.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,zt.get)(F.STORAGE_PATH)||e&&((0,ps.existsSync)(e)?e:(0,Ht.join)((0,zt.getHdbBasePath)(),JE)),!!e){if((0,ps.existsSync)(e))for(let r of(0,ps.readdirSync)(e,{withFileTypes:!0})){let n=(0,Ht.basename)(r.name,".mdb");r.isFile()&&(0,Ht.extname)(r.name).toLowerCase()===".mdb"&&!t[n]?.path&&Lp((0,Ht.join)(e,r.name),null,n)}if((0,ps.existsSync)((0,_d.getBaseSchemaPath)())){for(let r of(0,ps.readdirSync)((0,_d.getBaseSchemaPath)(),{withFileTypes:!0}))if(!r.isFile()){let n=(0,Ht.join)((0,_d.getBaseSchemaPath)(),r.name),s=(0,Ht.join)((0,_d.getTransactionAuditStoreBasePath)(),r.name);for(let i of(0,ps.readdirSync)(n,{withFileTypes:!0}))if(i.isFile()&&(0,Ht.extname)(i.name).toLowerCase()===".mdb"){let a=(0,Ht.join)(s,i.name);Lp((0,Ht.join)(n,i.name),(0,Ht.basename)(i.name,".mdb"),r.name,a,!0)}}}if(t)for(let r in t){let n=t[r],s=n.path;if((0,ps.existsSync)(s))for(let a of(0,ps.readdirSync)(s,{withFileTypes:!0}))a.isFile()&&(0,Ht.extname)(a.name).toLowerCase()===".mdb"&&Lp((0,Ht.join)(s,a.name),(0,Ht.basename)(a.name,".mdb"),r);let i=n.tables;if(i)for(let a in i){let c=i[a],l=(0,Ht.join)(c.path,(0,Ht.basename)(a+".mdb"));(0,ps.existsSync)(l)&&Lp(l,a,r,null,!0)}}for(let r in De){let n=gd.get(r);if(n){let s=De[r];r.includes("delete")&&Cr.trace(`defined tables ${Array.from(n.keys())}`);for(let i in s)n.has(i)||(Cr.trace(`delete table class ${i}`),delete s[i])}else if(delete De[r],r==="data"){for(let s in Sn)delete Sn[s];delete Sn[aS]}}if((0,zt.get)(F.ANALYTICS_REPLICATE)===!1?tS.includes("hdb_analytics")||tS.push("hdb_analytics"):(De.system?.hdb_analytics?.enableAuditing(),De.system?.hdb_analytics_hostname?.enableAuditing()),De.system)for(let r of tS)De.system[r]&&(De.system[r].replicate=!1);return gd=null,De}}function Td(){iS=!1;for(let[,e]of Ko)e.needsDeletion=!0;at();for(let[e,t]of Ko)if(t.needsDeletion&&!e.endsWith("system.mdb")){t.close(),Ko.delete(e);let r=De[t.databaseName];for(let n in r)if(r[n].primaryStore.path===e){delete De[t.databaseName],Mp.forEach(i=>i(t.databaseName));break}}return De}function Lp(e,t,r=oN,n,s){let i=new sN.default(e,!1);try{let a=Ko.get(e);a?a.needsDeletion=!1:(a=(0,Sd.open)(i),Ko.set(e,a));let c=new xp(!1),l=a.dbisDb||(a.dbisDb=a.openDB(rS.INTERNAL_DBIS_NAME,c)),u=a.auditStore;u||(n?(0,ps.existsSync)(n)&&(i.path=n,u=(0,Sd.open)(i),u.isLegacy=!0):u=U_(a));let d=vG(r),f=d[aS],m=new Map;for(let{key:p,value:h}of l.getRange({start:!1})){let[E,g]=p.toString().split("/");g===""?g=h.name:g||(g=E,E=t,h.name||(h.name=g,h.indexed=!h.is_hash_attribute)),f?.add(E);let R=m.get(E);R||m.set(E,R={attributes:[]}),(g==null||h.is_hash_attribute)&&(R.primary=h),g!=null&&R.attributes.push(h),Object.defineProperty(h,"key",{value:p,configurable:!0})}for(let[p,h]of m){let{attributes:E,primary:g}=h;if(!g){for(let te of E)if(te.is_hash_attribute||te.isPrimaryKey){g=te;break}if(!g){Cr.warn(`Unable to find a primary key attribute on table ${p}, with attributes: ${JSON.stringify(E)}`);continue}}let R=d[p],S={},y=[],C,I,k=typeof g.audit=="boolean"?g.audit:(0,zt.get)(F.LOGGING_AUDITLOG),J=g.trackDeletes,G=g.expiration,H=g.eviction,X=g.sealed,W=g.splitSegments,ue=g.replicate;if(R)S=R.indices,y=R.attributes,R.schemaVersion++;else{C=g.tableId,C?C>=(l.get(Ed)||0)&&(l.putSync(Ed,C+1),Cr.info(`Updating next table id (it was out of sync) to ${C+1} for ${p}`)):(g.tableId=C=l.get(Ed),C||(C=1),Cr.debug("Table {tableName} missing an id, assigning {tableId}"),l.putSync(Ed,C+1),l.putSync(g.key,g));let te=new xp(!g.is_hash_attribute,g.is_hash_attribute);if(te.compression=g.compression,te.compression){let ye=(0,zt.get)(F.STORAGE_COMPRESSION_THRESHOLD)||MG;te.compression.threshold=ye}I=Q_(a.openDB(g.key,te),a),a.databaseName=r,I.tableId=C}let ce;for(let te of E){te.attribute=te.name;try{if(!te.is_hash_attribute&&(te.indexed||te.attribute&&!te.name)){if(!S[te.name]){let Ae=xG(te.key,a,te);S[te.name]=Ae,S[te.name].indexNulls=te.indexNulls}let ye=y.find(Ae=>Ae.name===te.name);ye?y.splice(y.indexOf(ye),1,te):y.push(te),ce=!0}}catch(ye){Cr.error("Error trying to update attribute",te,y,S,ye)}}for(let te of y)if(!E.find(Ae=>Ae.name===te.name)){if(te.is_hash_attribute){Cr.error("Unable to remove existing primary key attribute",te);continue}te.indexed&&(y.splice(y.indexOf(te),1),ce=!0)}if(R)ce&&(R.schemaVersion++,R.updatedAttributes());else{R=UG(d,p,Jg({primaryStore:I,auditStore:u,audit:k,sealed:X,splitSegments:W,replicate:ue,expirationMS:G&&G*1e3,evictionMS:H&&H*1e3,trackDeletes:J,tableName:p,tableId:C,primaryKey:g.name,databasePath:s?r+"/"+p:r,databaseName:r,indices:S,attributes:E,schemaDefined:g.schemaDefined,dbisDB:l})),R.schemaVersion=1;for(let te of Dp)te(R)}}return a}catch(a){throw a.message+=` opening database ${e}`,a}}function vG(e){let t=De[e];if(t||(e==="data"?t=De[e]=Sn:e==="system"?Object.defineProperty(De,"system",{value:t=Object.create(null),configurable:!0}):t=De[e]=Object.create(null)),gd&&!gd.has(e)){let r=new Set;t[aS]=r,gd.set(e,r)}return t}function UG(e,t,r){return e[t]=r,r}function td({database:e,table:t}){e||(e=oN),at();let r=vG(e),n=(0,Ht.join)((0,zt.getHdbBasePath)(),qc),s=(0,zt.get)(F.DATABASES)||{};process.env.SCHEMAS_DATA_PATH&&(s.data={path:process.env.SCHEMAS_DATA_PATH});let i=t&&s[e]?.tables?.[t]?.path;n=i||s[e]?.path||process.env.STORAGE_PATH||(0,zt.get)(F.STORAGE_PATH)||((0,ps.existsSync)(n)?n:(0,Ht.join)((0,zt.getHdbBasePath)(),JE));let a=(0,Ht.join)(n,(i?t:e)+".mdb"),c=Ko.get(a);if(!c||c.status==="closed"){let l=new sN.default(a,!1);c=(0,Sd.open)(l),Ko.set(a,c)}return c.auditStore||(c.auditStore=U_(c)),c}async function ZI(e){if(!De[e])throw new Error("Schema does not exist");let t=De[e],r;for(let n in t)r=t[n].primaryStore.rootStore,Ko.delete(r.path),r.status==="open"&&(await r.close(),await vp.remove(r.path));if(r||(r=td({database:e,table:null}),r.status==="open"&&(await r.close(),await vp.remove(r.path))),e==="data"){for(let n in Sn)delete Sn[n];delete Sn[aS]}delete De[e],Mp.forEach(n=>n(e)),await Xb(r)}function xG(e,t,r){let n=r.is_hash_attribute||r.indexed.type&&nN[r.indexed.type]?.useObjectStore,s=new xp(!n,n),i=t.openDB(e,s);if(r.indexed.type){let a=nN[r.indexed.type];a?i.customIndex=new a(i,r.indexed):Cr.error(`The indexing type '${r.indexed.type}' is unknown`)}return i}function Ze(e){let{table:t,database:r,expiration:n,eviction:s,scanInterval:i,attributes:a,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,schemaDefined:m,origin:p}=e;r||(r=oN);let h=td({database:r,table:t}),E=De[r];Cr.trace(`Defining ${t} in ${r}`);let g=E?.[t];if(h.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let R,S,y;m==null&&(m=!0);let C=new xp(!1);for(let W of a)W.attribute&&!W.name?(W.name=W.attribute,W.indexed=!0):W.attribute=W.name,W.expiresAt&&(W.indexed=!0);let I,k;if(g){if(R=g.primaryKey,g.primaryStore.rootStore.status==="closed")throw new Error(`Can not use a closed data store from ${t} class`);u==null&&(u=g.splitSegments),g.attributes.splice(0,g.attributes.length,...a)}else{let W=h.auditStore;S=a.find(ye=>ye.isPrimaryKey)||{},R=S.name,S.is_hash_attribute=S.isPrimaryKey=!0,S.schemaDefined=m,S.compression=cS(),f&&(S.trackDeletes=!0),c=S.audit=typeof c=="boolean"?c:(0,zt.get)(F.LOGGING_AUDITLOG),n&&(S.expiration=n),s&&(S.eviction=s),u??=!1,S.splitSegments=u,typeof l=="boolean"&&(S.sealed=l),typeof d=="boolean"&&(S.replicate=d),p&&(S.origins?S.origins.includes(p)||S.origins.push(p):S.origins=[p]),Cr.trace(`${t} table loading, opening primary store`);let ue=new xp(!1,!0);ue.compression=S.compression;let ce=t+"/";if(y=h.dbisDb=h.openDB(rS.INTERNAL_DBIS_NAME,C),X(),y.get(ce))return k&&k(),Td(),Ze(e);let te=Q_(h.openDB(ce,ue),h);h.databaseName=r,te.tableId=y.get(Ed),Cr.trace(`Assigning new table id ${te.tableId} for ${t}`),te.tableId||(te.tableId=1),y.put(Ed,te.tableId+1),S.tableId=te.tableId,g=UG(E,t,Jg({primaryStore:te,auditStore:W,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:R,tableName:t,tableId:te.tableId,databasePath:r,databaseName:r,indices:{},attributes:a,schemaDefined:m,dbisDB:y})),g.schemaVersion=1,I=!0,y.put(ce,S)}let J=g.indices;y=y||(h.dbisDb=h.openDB(rS.INTERNAL_DBIS_NAME,C)),g.dbisDB=y;let G=[];for(let{key:W,value:ue}of y.getRange({start:!0})){let[ce,te]=W.toString().split("/");if(te===""&&(te=ue.name),te){if(ce!==t)continue}else continue;let ye=a.find(Ye=>Ye.name===te),Ae=!ye?.indexed&&ue.indexed&&!ue.isPrimaryKey;if((!ye||Ae)&&(X(),I=!0,ye||y.remove(W),Ae)){let Ye=g.indices[ce];Ye&&G.push(Ye)}}let H=[];try{for(let W of a||[]){if((W.relationship||W.computed)&&(I=!0,W.relationship))continue;let ue=t+"/"+(W.name||"");Object.defineProperty(W,"key",{value:ue,configurable:!0});let ce=y.get(ue);if(W.isPrimaryKey){if(ce=ce||y.get(ue=t+"/")||{},c!==void 0&&c!==g.audit||l!==void 0&&l!==g.sealed||d!==void 0&&d!==g.replicate||(+n||void 0)!==(+ce.expiration||void 0)||(+s||void 0)!==(+ce.eviction||void 0)||W.type!==ce.type){let ye={...ce};typeof c=="boolean"&&(c&&g.enableAuditing(c),ye.audit=c),n&&(ye.expiration=+n),s&&(ye.eviction=+s),l!==void 0&&(ye.sealed=l),d!==void 0&&(ye.replicate=d),W.type&&(ye.type=W.type),I=!0,X(),y.put(ue,ye)}continue}ce?.attribute&&!ce.name&&(ce.indexed=!0);let te=!ce||ce.type!==W.type||JSON.stringify(ce.indexed)!==JSON.stringify(W.indexed)||ce.nullable!==W.nullable||ce.version!==W.version||JSON.stringify(ce.properties)!==JSON.stringify(W.properties)||JSON.stringify(ce.elements)!==JSON.stringify(W.elements);if(W.indexed){let ye=xG(ue,h,W);(te||ce.indexingPID&&ce.indexingPID!==process.pid||ce.restartNumber<Up.workerData?.restartNumber)&&(I=!0,X(),ce=y.get(ue),(te||ce.indexingPID&&ce.indexingPID!==process.pid||ce.restartNumber<Up.workerData?.restartNumber)&&(I=!0,W.indexNulls===void 0&&(W.indexNulls=!0),g.primaryStore.getStats().entryCount>0&&(W.lastIndexedKey=ce?.lastIndexedKey??void 0,W.indexingPID=process.pid,ye.isIndexing=!0,Object.defineProperty(W,"dbi",{value:ye}),H.push(W))),y.put(ue,W)),ce?.indexNulls&&W.indexNulls===void 0&&(W.indexNulls=!0),ye.indexNulls=W.indexNulls,J[W.name]=ye}else te&&(I=!0,X(),y.put(ue,W))}}finally{k&&k()}if(I&&(g.schemaVersion++,g.updatedAttributes()),Cr.trace(`${t} table loading, running index`),H.length>0||G.length>0?g.indexingOperation=rae(g,H,G):I&&nS.signalSchemaChange(new sS.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=p,I)for(let W of Dp)W(g,p!=="cluster");return(n||s||i)&&g.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),Cr.trace(`${t} table loaded`),g;function X(){k||h.transactionSync(()=>({then(W){k=W}}))}o(X,"startTxn")}async function rae(e,t,r){try{Cr.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await nS.signalSchemaChange(new sS.SchemaEventMsg(process.pid,"schema-change",e.databaseName,e.tableName));let s;for(let u of r)s=u.drop();let i,a={},c=0,l=t.length;if(await new Promise(u=>setImmediate(u)),l>0){let u;for(let f of t)(0,Sd.compareKeys)(f.lastIndexedKey,u)<0&&(u=f.lastIndexedKey),f.lastIndexedKey==null&&f.dbi.clearAsync();let d=0;for(let{key:f,value:m,version:p}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(m){if(d++,s=e.primaryStore.ifVersion(f,p,()=>{for(let h=0;h<l;h++){let E=t[h],g=E.name,R=E.dbi;try{let S=E.resolve,y=m&&(S?S(m):m[g]);if(R.customIndex){R.customIndex.index(f,y);continue}let C=(0,PG.getIndexedValues)(y);if(C)for(let I=0,k=C.length;I<k;I++)R.put(C[I],f)}catch(S){a[g]||(a[g]=!0,Cr.error(`Error indexing attribute ${g}`,S))}}}),s.then(()=>d--,h=>{d--,Cr.error(h)}),Up.workerData&&Up.workerData.restartNumber!==DG.restartNumber&&(i=!0),++c%100===0||i){for(let h of t)h.lastIndexedKey=f,e.dbisDB.put(h.key,h);if(i)return}d>eae?await s:d>tae&&await new Promise(h=>setImmediate(h))}for(let f of t)delete f.lastIndexedKey,delete f.indexingPID,f.dbi.isIndexing=!1,s=e.dbisDB.put(f.key,f)}await s,await nS.signalSchemaChange(new sS.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),Cr.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){Cr.error("Error in indexing",n)}}function nae({table:e,database:t}){let r=td({database:t,table:e}),n=[],s=r.dbisDb;for(let i of s.getKeys({start:e+"/",end:e+"0"}))n.push(s.remove(i));return Promise.all(n)}function Ol(e){return Dp.push(e),{remove(){let t=Dp.indexOf(e);t>-1&&Dp.splice(t,1)}}}function Bp(e){return Mp.push(e),{remove(){let t=Mp.indexOf(e);t>-1&&Mp.splice(t,1)}}}function cS(){let e=(0,zt.get)(F.STORAGE_COMPRESSION),t=(0,zt.get)(F.STORAGE_COMPRESSION_DICTIONARY),r=(0,zt.get)(F.STORAGE_COMPRESSION_THRESHOLD)||MG,n={startingOffset:32};return t&&(n.dictionary=vp.readFileSync(t)),r&&(n.threshold=r),e&&n}var zt,rS,Sd,Ht,ps,_d,sN,vp,iN,PG,nS,sS,Up,LG,DG,oS,Xoe,Cr,oN,aS,MG,tS,Sn,De,Ed,Dp,Mp,iS,Ko,gd,eae,tae,we=se(()=>{zt=b(me()),rS=b(Yt()),Sd=require("lmdb"),Ht=require("path"),ps=require("fs"),_d=b(Rt());tg();sN=b(Vm());q();vp=b(require("fs-extra")),iN=b(ii()),PG=b(Dn()),nS=b(Ho()),sS=b(is()),Up=require("worker_threads"),LG=b(Q()),DG=b(nt());Fi();el();es();OG();oS=b($m()),{forComponent:Xoe}=LG.default;o(xp,"OpenDBIObject");Cr=Xoe("storage"),oN="data",aS=Symbol("defined-tables"),MG=((0,zt.get)(F.STORAGE_PAGESIZE)||4096)-60;(0,zt.initSync)();tS=["hdb_temp","hdb_certificate","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_info"],Sn=Object.create(null),De=Object.create(null);(0,iN._assignPackageExport)("databases",De);(0,iN._assignPackageExport)("tables",Sn);Ed=Symbol.for("next-table-id"),Dp=[],Mp=[],Ko=new Map;o(Zoe,"getTables");o(at,"getDatabases");o(Td,"resetDatabases");o(Lp,"readMetaDb");o(vG,"ensureDB");o(UG,"setTable");o(td,"database");o(ZI,"dropDatabase");o(xG,"openIndex");o(Ze,"table");eae=1e3,tae=10;o(rae,"runIndexing");o(nae,"dropTableMeta");o(Ol,"onUpdatedTable");o(Bp,"onRemovedDB");o(cS,"getDefaultCompression")});var lN={};Re(lN,{loadGQLSchema:()=>oae,start:()=>cN,startOnMainThread:()=>iae});function cN({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r,n,s,i){let{parse:a,Source:c,Kind:l,NamedTypeNode:u,StringValueNode:d}=await import("graphql"),f=a(new c(r.toString(),s)),m=new Map,p=[],h;for(let R of f.definitions)switch(R.kind){case l.OBJECT_TYPE_DEFINITION:let k=function(G){if(G.kind==="NonNullType"){let W=k(G.type);return W.nullable=!1,W}if(G.kind==="ListType")return{type:"array",elements:k(G.type)};let X={type:G.name?.value};return Object.defineProperty(X,"location",{value:G.loc.startToken}),X};o(k,"getProperty");let S=R.name.value,y=[],C={table:null,database:null,properties:y};m.set(S,C),i.allTypes.set(S,C);for(let G of R.directives){if(G.name.value==="table"){for(let X of G.arguments)C[X.name.value]=X.value.value;C.schema&&(C.database=C.schema),C.table||(C.table=S),C.audit&&(C.audit=C.audit!=="false"),C.attributes=C.properties,p.push(C)}if(G.name.value==="sealed"&&(C.sealed=!0),G.name.value==="splitSegments"&&(C.splitSegments=!0),G.name.value==="replicate"&&(C.replicate=!0),G.name.value==="export"){C.export=!0;for(let X of G.arguments)typeof C.export!="object"&&(C.export={}),C.export[X.name.value]=X.value.value}}let I=!1,J={};for(let G of R.fields){let H=k(G.type);H.name=G.name.value,y.push(H),J[H.name]=void 0;for(let X of G.directives){let W=X.name.value;if(W==="primaryKey")I?console.warn("Can not define two attributes as a primary key at",X.loc):(H.isPrimaryKey=!0,I=!0);else if(W==="indexed"){let ue={};for(let ce of X.arguments||[])ue[ce.name.value]=ce.value.value;H.indexed=ue}else if(W==="computed"){for(let ue of X.arguments||[])if(ue.name.value==="from"){let ce=ue.value.value;H.computed={from:g(ce,ue,J)},H.version==null&&(H.version=ce)}else ue.name.value==="version"&&(H.version=ue.value.value);H.computed=H.computed||!0}else if(W==="relationship"){let ue={};for(let ce of X.arguments)ue[ce.name.value]=ce.value.value;H.relationship=ue}else if(W==="createdTime")H.assignCreatedTime=!0;else if(W==="updatedTime")H.assignUpdatedTime=!0;else if(W==="expiresAt")H.expiresAt=!0;else if(W==="allow"){let ue=H.authorizedRoles=[];for(let ce of X.arguments)ce.name.value==="role"&&ue.push(ce.value.value)}else server.knownGraphQLDirectives.includes(W)&&console.warn(`@${W} is an unknown directive, at`,X.loc)}}C.type=S,S==="Query"&&(h=C)}function E(R){let S=m.get(R.type);S?(Object.defineProperty(R,"properties",{value:S.properties}),Object.defineProperty(R,"definition",{value:S})):R.type==="array"?E(R.elements):sae.includes(R.type)||(0,FG.getWorkerIndex)()===0&&console.error(`The type ${R.type} is unknown at line ${R.location.line}, column ${R.location.column}, in ${s}`)}o(E,"connectPropertyType");for(let R of m.values())for(let S of R.properties)E(S);for(let R of p)R.tableClass=e(R),R.export&&(R.export.name===""?i.set((0,aN.dirname)(n),R.tableClass):i.set((0,aN.dirname)(n)+"/"+(R.export.name||R.type),R.tableClass,R.export));function g(R,S,y){return new BG.Script(`function computed(attributes) { return function(record) { with(attributes) { with (record) { return ${R}; } } } } computed;`,{filename:s,lineOffset:S.loc.startToken.line-1,columnOffset:S.loc.startToken.column}).runInThisContext()(y)}o(g,"createComputedFrom")}}var aN,BG,FG,sae,iae,oae,kG=se(()=>{aN=require("path"),BG=require("node:vm");we();FG=b(nt());qa();sae=["ID","Int","Float","Long","String","Boolean","Date","Bytes","Any","BigInt","Blob"];server.knownGraphQLDirectives&&(server.knownGraphQLDirectives=["table","sealed","export","primaryKey","indexed","computed","relationship","createdTime","updatedTime","expiresAt","allow"]);o(cN,"start");iae=cN,oae=o(e=>cN({ensureTable:Ze}).handleFile(e,null,null,new Ku),"loadGQLSchema")});var dN={};Re(dN,{start:()=>hae});function aae(e){if(e.kind!==He.Kind.OPERATION_DEFINITION&&e.kind!==He.Kind.FRAGMENT_DEFINITION)throw new $r(`Unexpected non-executable definition type ${e.kind}.`)}function HG(e){if(typeof e!="object"||e===null)throw new so("Request body must be an object.");if(!("query"in e))throw new so("Request body must contain a `query` field.");if(typeof e.query!="string")throw new so("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new so("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new so("Request body `operationName` field must be a string.")}function uN(e){return parseInt(e.value,10)}function qG(e){return parseFloat(e.value)}function $G(e,t,r){let n=r.get(e.name.value);return VG(n)?KG(n,t):{attribute:t,value:n}}function VG(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function KG(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],VG(n)?KG(n,t):{attribute:t,value:n}))}function cae(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case He.Kind.NULL:return{attribute:t,value:null};case He.Kind.INT:return{attribute:t,value:uN(e.value)};case He.Kind.FLOAT:return{attribute:t,value:qG(e.value)};case He.Kind.BOOLEAN:case He.Kind.STRING:return{attribute:t,value:e.value.value};case He.Kind.VARIABLE:return $G(e.value,t,r);case He.Kind.OBJECT:return YG(e.value,t,r);case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Value type, ${e.value.kind}, is not supported.`)}}function YG(e,t,r){return e.fields.flatMap(n=>cae(n,t,r))}function lae(e,t){switch(e.value.kind){case He.Kind.NULL:return{attribute:e.name.value,value:null};case He.Kind.INT:return{attribute:e.name.value,value:uN(e.value)};case He.Kind.FLOAT:return{attribute:e.name.value,value:qG(e.value)};case He.Kind.BOOLEAN:case He.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case He.Kind.VARIABLE:return $G(e.value,e.name.value,t);case He.Kind.OBJECT:return YG(e.value,[e.name.value],t);case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Argument type, ${e.value.kind}, is not supported.`)}}function uae(e,t){return e.flatMap(r=>lae(r,t))}function lS(e,t){return e.selections.flatMap(r=>{switch(r.kind){case He.Kind.FIELD:return r;case He.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new $r(`Fragment \`${n}\` not found.`);return lS(s.selectionSet,t)}case He.Kind.INLINE_FRAGMENT:return lS(r.selectionSet,t)}})}function WG(e,t){return lS(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:WG(r.selectionSet,t)}:r.name.value)}async function dae(e,t,r,n){let s=vs.getMatch(e.name.value,"graphql");if(s===void 0)throw new $r(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,a={select:WG(e.selectionSet,r),conditions:uae(e.arguments,t)},c=[];n.authorize=!0;for await(let l of i.search(a,n))c.push(l);return[e.name.value,c]}function zG(e){switch(e.kind){case He.Kind.NULL:return null;case He.Kind.INT:return uN(e);case He.Kind.FLOAT:return parseFloat(e.value);case He.Kind.STRING:case He.Kind.BOOLEAN:return e.value;case He.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:zG(r.value),...t}),{});case He.Kind.LIST:case He.Kind.ENUM:default:throw new $r(`Value type, ${e.kind}, is not supported.`)}}function fae(e,t){let r=new Map;for(let n of e){let s=n.variable.name.value,i=t?.[s];if(i===void 0&&n.defaultValue!==void 0&&(i=zG(n.defaultValue)),n.type.kind===He.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new $r(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function mae(e,t,r,n){if(e.operation===He.OperationTypeNode.SUBSCRIPTION)throw new $r("Subscriptions are not supported.");if(e.operation===He.OperationTypeNode.MUTATION)throw new $r("Mutations are not supported yet.");let s=fae(e.variableDefinitions,t),i=await Promise.all(lS(e.selectionSet,r).map(c=>dae(c,s,r,n))),a={data:{}};for(let[c,l]of i)a.data[c]=l;return a}async function GG({query:e,variables:t={},operationName:r},n){let s=He.parse(e),i=new Map,a=new Map;for(let u of s.definitions)if(aae(u),u.kind===He.Kind.FRAGMENT_DEFINITION)a.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new $r("Unnamed operations are only allowed when there is a single operation in the document.");let d=u.name?.value??"Unnamed Query";if(i.has(d))throw new $r(`Duplicate operation definition: ${d}`);i.set(d,u)}let c;if(r==null)if(i.size===1)c=i.entries().next().value[1];else throw new $r("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new $r(`Operation \`${r}\` not found.`);let l=await mae(c,t,a,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function pae(e){switch(e.method){case"GET":{let t=new URLSearchParams(e.url.split("?")[1]),r={};for(let[n,s]of t)r[n]=n==="variables"||n==="extensions"?JSON.parse(s):s;return HG(r),GG(r,e)}case"POST":{let r=await Lo(e.headers.get("content-type"),!0)(e._nodeRequest);return HG(r),GG(r,e)}default:throw new so("Method Not Allowed",405,{Allow:"GET, POST"})}}function hae(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await pae(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof so)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof He.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof $r)return{status:200,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};break}default:logger.info(`Unsupported accept header, ${s}, defaulting to application/graphql-response+json`);case"application/graphql-response+json":{if(n instanceof so)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof He.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof $r)return{status:400,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};break}}throw n}},{port:e.port,securePort:e.securePort})}var He,$r,so,jG=se(()=>{He=b(require("graphql"));Do();qa();o(aae,"assertExecutableDefinitionNode");o(HG,"assertRequestParams");o(uN,"processIntValueNode");o(qG,"processFloatValueNode");o($G,"processVariableNode");o(VG,"isObject");o(KG,"transformObjectIntoQueryCondition");o(cae,"processObjectFieldNode");o(YG,"processObjectValueNode");o(lae,"processArgumentNode");o(uae,"buildConditionsQuery");o(lS,"fillInFragments");o(WG,"buildSelectQuery");o(dae,"processFieldNode");o(zG,"processConstValueNode");o(fae,"resolveVariables");o(mae,"executeOperation");o(GG,"resolver");$r=class extends Error{static{o(this,"GraphQLQueryingError")}},so=class extends Error{static{o(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};o(pae,"graphqlQueryingHandler");o(hae,"start")});var tq=v((JMe,eq)=>{var yd=require("validate.js"),JG=mt(),Rd=(q(),M(z)),{handleHDBError:Eae,hdbErrors:_ae}=_e(),{HDB_ERROR_MSGS:sr,HTTP_STATUS_CODES:gae}=_ae,fN=o(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Sae={STRUCTURE_USER:"structure_user"},QG=Object.values(Rd.ROLE_TYPES_ENUM),Tae="attribute_permissions",yae="attribute_name",{PERMS_CRUD_ENUM:bd}=Rd,Rae=[Tae,...Object.values(bd)],XG=[bd.READ,bd.INSERT,bd.UPDATE],bae=[yae,...XG];function Aae(e){let t=fN();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,ZG(e,t)}o(Aae,"addRoleValidation");function Iae(e){let t=fN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,ZG(e,t)}o(Iae,"alterRoleValidation");function wae(e){let t=fN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,JG.validateObject(e,t)}o(wae,"dropRoleValidation");var Nae=["operation","role","id","permission","hdb_user","access"];function ZG(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let a=0,c=n.length;a<c;a++)Nae.includes(n[a])||s.push(n[a]);s.length>0&&pr(sr.INVALID_ROLE_JSON_KEYS(s),r);let i=JG.validateObject(e,t);if(i&&i.message.split(",").forEach(a=>{pr(a,r)}),e.permission){let a=Cae(e);a&&pr(a,r),QG.forEach(c=>{e.permission[c]&&!yd.isBoolean(e.permission[c])&&pr(sr.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let a in e.permission)if(QG.indexOf(a)<0){if(a===Sae.STRUCTURE_USER){let l=e.permission[a];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,d=l.length;u<d;u++){let f=l[u];global.hdb_schema[f]||pr(sr.SCHEMA_NOT_FOUND(f),r)}continue}pr(sr.STRUCTURE_USER_ROLE_TYPE_ERROR(a),r);continue}let c=e.permission[a];if(!a||!global.hdb_schema[a]){pr(sr.SCHEMA_NOT_FOUND(a),r);continue}if(c.tables)for(let l in c.tables){let u=c.tables[l];if(!l||!global.hdb_schema[a][l]){pr(sr.TABLE_NOT_FOUND(a,l),r);continue}if(Object.keys(u).forEach(d=>{Rae.includes(d)||pr(sr.INVALID_PERM_KEY(d),r,a,l)}),Object.values(bd).forEach(d=>{yd.isDefined(u[d])?yd.isBoolean(u[d])||pr(sr.TABLE_PERM_NOT_BOOLEAN(d),r,a,l):pr(sr.TABLE_PERM_MISSING(d),r,a,l)}),u.attribute_permissions===void 0){pr(sr.ATTR_PERMS_ARRAY_MISSING,r,a,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){pr(sr.ATTR_PERMS_NOT_ARRAY,r,a,l);continue}if(u.attribute_permissions){let d=global.hdb_schema[a][l].attributes.map(({attribute:m})=>m),f={read:!1,insert:!1,update:!1};for(let m in u.attribute_permissions){let p=u.attribute_permissions[m];if(Object.keys(p).forEach(E=>{!bae.includes(E)&&E!==bd.DELETE&&pr(sr.INVALID_ATTR_PERM_KEY(E),r,a,l)}),!yd.isDefined(p.attribute_name)){pr(sr.ATTR_PERM_MISSING_NAME,r,a,l);continue}let h=p.attribute_name;if(!d.includes(h)){pr(sr.INVALID_ATTRIBUTE_IN_PERMS(h),r,a,l);continue}XG.forEach(E=>{yd.isDefined(p[E])?yd.isBoolean(p[E])||pr(sr.ATTR_PERM_NOT_BOOLEAN(E,h),r,a,l):pr(sr.ATTR_PERM_MISSING(E,h),r,a,l)}),!f.read&&p.read===!0&&(f.read=!0),!f.insert&&p.insert===!0&&(f.insert=!0),!f.update&&p.update===!0&&(f.update=!0)}if(u.read===!1&&f.read===!0||u.insert===!1&&f.insert===!0||u.update===!1&&f.update===!0){let m=`${a}.${l}`;pr(sr.MISMATCHED_TABLE_ATTR_PERMS(m),r,a,l)}}}}return Oae(r)}o(ZG,"customValidate");eq.exports={addRoleValidation:Aae,alterRoleValidation:Iae,dropRoleValidation:wae};function Cae(e){let{operation:t,permission:r}=e;if(t===Rd.OPERATIONS_ENUM.ADD_ROLE||t===Rd.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 sr.SU_CU_ROLE_COMBINED_ERROR;{let a=r.super_user?Rd.ROLE_TYPES_ENUM.SUPER_USER:Rd.ROLE_TYPES_ENUM.CLUSTER_USER;return sr.SU_CU_ROLE_NO_PERMS_ALLOWED(a)}}}return null}o(Cae,"validateNoSUPerms");function Oae(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:sr.ROLE_PERMS_ERROR,...e};return Eae(new Error,n,gae.BAD_REQUEST)}else return null}o(Oae,"generateRolePermResponse");function pr(e,t,r,n){if(!r)t.main_permissions.push(e);else{let s=n?r+"_"+n:r;t.schema_permissions[s]?t.schema_permissions[s].push(e):t.schema_permissions[s]=[e]}}o(pr,"addPermError")});var kp=v((eve,iq)=>{"use strict";var rq=Gn(),nq=hn(),Pae=Sl(),pN=tq(),hN=Ho(),ZMe=require("uuid").v4,Lae=require("util"),uS=(q(),M(z)),Dae=ae(),EN=nq.searchByValue,Mae=nq.searchByHash,vae=Lae.promisify(Pae.delete),Uae=ui(),xae=Zu(),{hdbErrors:Bae,handleHDBError:Pl}=_e(),{HDB_ERROR_MSGS:sq,HTTP_STATUS_CODES:Fp}=Bae,{UserEventMsg:_N}=is();iq.exports={addRole:Fae,alterRole:kae,dropRole:Hae,listRoles:Gae};function mN(e){try{e.hdb_auth_header&&delete e.hdb_auth_header,e.HDB_INTERNAL_PATH&&delete e.HDB_INTERNAL_PATH,e.operation&&delete e.operation,e.hdb_user&&delete e.hdb_user}catch{}return e}o(mN,"scrubRoleDetails");async function Fae(e){let t=pN.addRoleValidation(e);if(t)throw t;e=mN(e);let r={schema:"system",table:"hdb_role",attribute:"role",value:e.role,hash_attribute:"id",get_attributes:["*"]},n;try{n=Array.from(await EN(r)||[])}catch(i){throw Pl(i)}if(n&&n.length>0)throw Pl(new Error,sq.ROLE_ALREADY_EXISTS(e.role),Fp.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 rq.insert(s),hN.signalUserChange(new _N(process.pid)),e=mN(e),e}o(Fae,"addRole");async function kae(e){let t=pN.alterRoleValidation(e);if(t)throw t;e=mN(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await rq.update(r)}catch(s){throw Pl(s)}if(n&&n?.message==="updated 0 of 1 records")throw Pl(new Error,"Invalid role id",Fp.BAD_REQUEST,void 0,void 0,!0);return await hN.signalUserChange(new _N(process.pid)),e}o(kae,"alterRole");async function Hae(e){let t=pN.dropRoleValidation(e);if(t)throw Pl(new Error,t,Fp.BAD_REQUEST,void 0,void 0,!0);let r=new xae(uS.SYSTEM_SCHEMA_NAME,uS.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Mae(r));if(n.length===0)throw Pl(new Error,sq.ROLE_NOT_FOUND,Fp.NOT_FOUND,void 0,void 0,!0);let s=new Uae(uS.SYSTEM_SCHEMA_NAME,uS.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await EN(s)),a=!1;if(Dae.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){a=!0;break}}if(a===!0)throw Pl(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,Fp.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await vae(c),hN.signalUserChange(new _N(process.pid)),`${n[0].role} successfully deleted`}o(Hae,"dropRole");async function Gae(){return EN({table:"hdb_role",schema:"system",hash_attribute:"id",attribute:"id",value:"*",get_attributes:["*"]})}o(Gae,"listRoles")});var gN={};Re(gN,{start:()=>cq,startOnMainThread:()=>Vae});function cq({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,oq.parseDocument)(r.toString(),{simpleKeys:!0}).toJSON();for(let s in n){let i=n[s];i.permission||(i={permission:i},i.permission.access&&(i.access=i.permission.access,delete i.permission.access));for(let a in i.permission){if(qae.includes(a))continue;let c=i.permission[a];c.tables||(i.permission[a]=c={tables:c});for(let l in c.tables){let u=c.tables[l];if(u.read=!!u.read,u.insert=!!u.insert,u.update=!!u.update,u.delete=!!u.delete,u.attributes){let d=[];for(let f in u.attributes){let m=u.attributes[f];m.attribute_name=f,d.push(m)}u.attribute_permissions=d,delete u.attributes}if(u.attribute_permissions){if(!Array.isArray(u.attribute_permissions))throw new Error("attribute_permissions must be an array if defined");for(let d of u.attribute_permissions)d.read=!!d.read,d.insert=!!d.insert,d.update=!!d.update}else u.attribute_permissions=null}}i.role=i.id=s,await $ae(i)}}}async function $ae(e){let t=at().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,aq.isEqual)(i,e)?void 0:(e.id=r.id,(0,dS.alterRole)(e))}return(0,dS.addRole)(e)}var dS,oq,aq,qae,Vae,lq=se(()=>{we();dS=b(kp()),oq=require("yaml"),aq=require("lodash"),qae=["super_user","cluster_user","structure_user"];o(cq,"start");o($ae,"ensureRole");Vae=cq});async function fS(e){let t=(0,fq.pathToFileURL)(e).toString();if(Kae)return Hp||(Hp=Yae(zae)),(await(await Hp).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function Yae(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),Hp=new Compartment({console,Math,Date,fetch:Wae,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,dq.extname)(r)||(r+=".js"),r)},importHook:o(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){s.Resource=Hr,s.tables=Sn,s.databases=De}};let n=await(0,uq.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),Hp}function Wae(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 zae(){return{Resource:Hr,tables:Sn}}var uq,dq,fq,Kae,Hp,SN=se(()=>{Ga();we();uq=require("fs/promises"),dq=require("path"),fq=require("url"),Kae=!1;o(fS,"secureImport");o(Yae,"getCompartment");o(Wae,"secureOnlyFetch");o(zae,"getGlobalVars")});var TN={};Re(TN,{handleApplication:()=>jae,suppressHandleApplicationWarning:()=>Qae});function mq(e){return typeof e=="function"&&("get"in e||"put"in e||"post"in e||"delete"in e)}async function jae(e){e.handleEntry(t=>{if(t.entryType!=="file"){e.logger.warn(`jsResource plugin cannot handle entry type ${t.entryType}. Modify the 'files' option in ${e.configFilePath} to only include files.`);return}if(t.eventType!=="add"){e.requestRestart();return}fS(t.absolutePath).then(r=>{let n=(0,mS.dirname)(t.urlPath);mq(r.default)&&(e.resources.set(n,r.default),e.logger.debug(`Registered root resource: ${n}`)),pq(e,r,n)}).catch(r=>{e.logger.error(`Failed to load resource module ${t.absolutePath}: ${r}`),e.requestRestart()})})}function pq(e,t,r){for(let n in t){let s=t[n],i=(0,mS.join)(r,n);mq(s)?(e.resources.set(i,s),e.logger.debug(`Registered resource: ${i}`)):typeof s=="object"&&pq(e,s,i)}}var mS,Qae,hq=se(()=>{SN();mS=require("path");o(mq,"isResource");o(jae,"handleApplication");o(pq,"recurseForResources");Qae=!0});var RN={};Re(RN,{start:()=>Jae});function Jae({resources:e}){e.set("login",yN),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var yN,Eq=se(()=>{Ga();o(Jae,"start");yN=class extends Hr{static{o(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:a}=r;return{data:await n.login(s,i)}}}});function Rq(e){let t={openapi:Xae,info:{title:"HarperDB HTTP REST interface",version:Tq.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}],n=o(s=>{if(s.type&&!t.components.schemas[s.type]){t.components.schemas[s.type]={};let i={},a=[];for(let c of s.properties)pS[c.type]?i[c.name]=new AN(pS[c.type],c.type):c.properties?(i[c.name]=new bq(c.type),n(c)):c.elements?.properties&&(i[c.name]=new sce(c.elements.type),n(c.elements)),c.nullable===!1&&a.push(c.name);t.components.schemas[s.type]=new Sq(i,!s.sealed,a)}},"includeDefinitionInSchema");for(let[,s]of e){if(!s.path||s.Resource.isError)continue;let{path:i}=s,a=i.split("/").pop(),{attributes:c,sealed:l}=s.Resource,{prototype:u,primaryKey:d="id"}=s.Resource;if(!c&&e.allTypes.has(s.path)){let J=e.allTypes.get(s.path);l=J.sealed,c=J.properties}if(!d)continue;let f={},m=[],p=[];if(c)for(let{type:J,name:G,elements:H,relationship:X,definition:W,nullable:ue}of c){let ce=W??H?.definition;ce&&n(ce),ue===!1&&p.push(G),X?J==="array"?f[G]={type:"array",items:{$ref:Gs+H.type}}:f[G]={$ref:Gs+J}:ce?J==="array"?f[G]={type:"array",items:{$ref:Gs+ce.type}}:f[G]={$ref:Gs+ce.type}:J==="array"?H.type==="Any"?f[G]={type:"array",items:{format:H.type}}:f[G]={type:"array",items:new AN(pS[H.type],H.type)}:J==="Any"?f[G]={format:J}:f[G]=new AN(pS[J],J),m.push(new IN(G,"query",f[G]))}let h=Object.keys(f),E=new IN(d,"path",{type:"string",format:"ID"});E.required=!0,E.description="primary key of record";let g=new IN("property","path",{enum:h});g.required=!0,t.components.schemas[a]=new Sq(f,!l,p);let R=u.post!==Resource.prototype.post||u.update,S=typeof u.put=="function",y=typeof u.get=="function",C=typeof u.delete=="function",I=typeof u.patch=="function",k="/"+i+"/";R&&(t.paths[k]={},t.paths[k].post=new Zae(a,r,{200:new Ad({$ref:Gs+a},{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}})},"create a new record auto-assigning a primary key")),y&&(t.paths[k]||(t.paths[k]={}),t.paths[k].get=new bN(m,r,{200:new Ad({type:"array",items:{$ref:Gs+a}})},"search for records by the specified property name and value pairs")),t.paths[k]||(t.paths[k]={}),t.paths[k].options=new ece(m,r,{200:new tce},"retrieve information about the communication options available for a target resource or the server as a whole, without performing any resource action"),C&&(t.paths[k]||(t.paths[k]={}),t.paths[k].delete=new gq(m,r,"delete all the records that match the provided query",{204:new _q})),k="/"+i+"/{"+d+"}",y&&(t.paths[k]={},t.paths[k].get=new bN([E],r,{200:new Ad({$ref:Gs+a})},"retrieve a record by its primary key")),S&&(t.paths[k]||(t.paths[k]={}),t.paths[k].put=new rce([E],r,a,{200:new Ad({$ref:Gs+a})},"create or update the record with the URL path that maps to the record's primary key")),I&&(t.paths[k]||(t.paths[k]={}),t.paths[k].patch=new nce([E],r,a,{200:new Ad({$ref:Gs+a})},"patch the record with the URL path that maps to the record's primary key")),C&&(t.paths[k]||(t.paths[k]={}),t.paths[k].delete=new gq([E],r,"delete a record with the given primary key",{204:new _q})),y&&g.schema.enum.length>0&&(k="/"+i+"/{"+d+"}.{property}",t.paths[k]={},t.paths[k].get=new bN([E,g],r,{200:new Ad({enum:h})},"used to retrieve the specified property of the specified record"))}for(let[,s]of e.allTypes)n(s),s.sealed&&t.components.schemas[s.type].additionalProperties&&(t.components.schemas[s.type].additionalProperties=!1);return t}function Zae(e,t,r,n){this.description=n,this.requestBody={content:{"application/json":{schema:{$ref:Gs+e}}}},this.security=t,this.responses=r}function bN(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function ece(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function tce(){this.description=yq,this.headers={},this.content={}}function Ad(e,t){this.description=yq,this.content={"application/json":{schema:e}},this.headers=t}function _q(){this.description="successfully processed request, no content returned to client"}function rce(e,t,r,n,s){this.description=s,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Gs+r}}}},this.responses=n}function nce(e,t,r,n,s){this.description=s,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Gs+r}}}},this.responses=n}function gq(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function Sq(e,t,r){this.type="object",this.properties=e,this.additionalProperties=t,this.required=r}function AN(e,t){this.type=e,(e==="string"||e==="number"||e==="integer")&&t!=="String"&&(this.format=t)}function bq(e){this.$ref=`#/components/schemas/${e}`}function sce(e){this.type="array",this.items=new bq(e)}function IN(e,t,r){this.name=e,this.in=t,this.schema=r}var Tq,Xae,pS,Gs,yq,Aq=se(()=>{Tq=b(Ct()),Xae="3.0.3",pS={Int:"integer",Float:"number",Long:"integer",ID:"string",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer"},Gs="#/components/schemas/",yq="successful operation";o(Rq,"generateJsonApi");o(Zae,"Post");o(bN,"Get");o(ece,"Options");o(tce,"ResponseOptions200");o(Ad,"Response200");o(_q,"Response204");o(rce,"Put");o(nce,"Patch");o(gq,"Delete");o(Sq,"ResourceSchema");o(AN,"Type");o(bq,"Ref");o(sce,"ArrayRef");o(IN,"Parameter")});var wq={};Re(wq,{Request:()=>rc,createReuseportFd:()=>hS});var Iq,rc,wN,NN,hS,Gp=se(()=>{Iq=require("os"),rc=class{static{o(this,"Request")}#e;#t;_nodeRequest;_nodeResponse;method;url;headers;isWebSocket;user;constructor(t,r){this.method=t.method;let n=t.url;this._nodeRequest=t,this._nodeResponse=r,this.url=n,this.headers=new NN(t.headers)}get absoluteURL(){return this.protocol+"://"+this.host+this.url}get pathname(){let t=this.url.indexOf("?");return t>-1?this.url.slice(0,t):this.url}set pathname(t){let r=this.url.indexOf("?");r>-1?this.url=t+this.url.slice(r):this.url=t}get protocol(){return this._nodeRequest.socket.encrypted?"https":"http"}get ip(){return this._nodeRequest.socket.remoteAddress}get authorized(){return this._nodeRequest.socket.authorized}get peerCertificate(){return this.#t===void 0&&(this.#t=this._nodeRequest.socket.getPeerCertificate?.(!0)||null),this.#t}get mtlsConfig(){return this._nodeRequest.socket.server.mtlsConfig}get body(){return this.#e||(this.#e=new wN(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get httpVersion(){return this._nodeRequest.httpVersion}get isAborted(){return!1}get nodeRequest(){return this._nodeRequest}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},wN=class{static{o(this,"RequestBody")}#e;constructor(t){this.#e=t}on(t,r){return this.#e.on(t,r),this}pipe(t,r){return this.#e.pipe(t,r)}},NN=class{static{o(this,"Headers")}asObject;constructor(t){this.asObject=t}set(t,r){this.asObject[t.toLowerCase()]=r}get(t){return this.asObject[t.toLowerCase()]}has(t){return Object.prototype.hasOwnProperty.call(this.asObject,t.toLowerCase())}[Symbol.iterator](){return Object.entries(this.asObject)[Symbol.iterator]()}keys(){return Object.keys(this.asObject)}values(){return Object.values(this.asObject)}delete(t){delete this.asObject[t.toLowerCase()]}forEach(t){for(let[r,n]of this)t(n,r,this)}};(0,Iq.platform)()!="win32"&&(hS=require("node-unix-socket").createReuseportFd)});var _S={};Re(_S,{parseHeaderValue:()=>ON,start:()=>ace});async function oce(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&Z_(e);let i=new Fs;try{e.responseHeaders=i;let a=e.url.slice(1),c,l;if(a!==Nq){let g=ES.getMatch(a,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new ai(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=ON(g);for(let S of R)switch(S.name){case"max-age":e.expiresAt=S.value*1e3+Date.now();break;case"only-if-cached":e.onlyIfCached=!0;break;case"no-cache":e.noCache=!0;break;case"no-store":e.noCacheStore=!0;break;case"stale-if-error":e.staleIfError=!0;break;case"must-revalidate":e.mustRevalidate=!0;break}}}let u=r["x-replicate-to"];if(u){let g=ON(u).map(R=>(R.next?.name==="confirm"&&R.next.value>=0&&(e.replicatedConfirmation=+R.next.value),R.name));e.replicateTo=g.length===1&&+g[0]>=0?+g[0]:g[0]==="*"?void 0:g}r["x-replicate-from"]==="none"&&(e.replicateFrom=!1);let f=await bt(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=Lo(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new Id.ClientError(g,400)}if(e.authorize=!0,a===Nq&&s==="GET"){if(e?.user?.role?.permission?.super_user)return Rq(ES);throw new Id.ServerError("Forbidden",403)}switch(c.checkPermission=e.user?.role?.permission??{},s){case"GET":case"HEAD":return l.get(c,e);case"POST":return l.post(c,e.data,e);case"PUT":return l.put(c,e.data,e);case"DELETE":return l.delete(c,e);case"PATCH":return l.patch(c,e.data,e);case"OPTIONS":i.setIfNone("Allow","GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE");return;case"CONNECT":return l.connect(c,null,e);case"TRACE":return"HarperDB is the terminating server";case"QUERY":return l.query(c,e.data,e);case"COPY":return l.copy(c,r.destination,e);case"MOVE":return l.move(c,r.destination,e);case"BREW":throw new Id.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Id.ServerError(`Method ${s} is not recognized`,501)}}),m=200,p=e.lastModified;if(f==null)m=s==="GET"||s==="HEAD"?404:204,CN.lastModified&&isFinite(p)&&i.setIfNone("Last-Modified",new Date(p).toUTCString());else if(f.status>0&&f.headers){let g=uG(f.headers,i);return f.headers!==g&&(f.headers=g),f.data!==void 0&&(f.body=bm(f.data,e,f)),f}else if(isFinite(p)){ice[0]=p;let g=String.fromCharCode(34,(rn[0]&63)+62,(rn[0]>>6)+(rn[1]<<2&63)+62,(rn[1]>>4)+(rn[2]<<4&63)+62,(rn[2]>>2)+62,(rn[3]&63)+62,(rn[3]>>6)+(rn[4]<<2&63)+62,(rn[4]>>4)+(rn[5]<<4&63)+62,(rn[5]>>2)+62,(rn[6]&63)+62,(rn[6]>>6)+(rn[7]<<2&63)+62,34),R=r["if-none-match"];R&&g==R?(f?.onDone&&f.onDone(),m=304,f=void 0):i.setIfNone("ETag",g),CN.lastModified&&i.setIfNone("Last-Modified",new Date(p).toUTCString())}e.createdResource&&(m=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let h={status:m,headers:i,body:void 0},E=e.loadedFromSource??f?.wasLoadedFromSource?.();return E!==void 0&&(h.wasCacheMiss=E,!E&&isFinite(p)&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||p))/1e3))),f!==void 0&&(h.body=bm(f,e,h),s==="HEAD"&&(h.body=void 0)),h}catch(a){a.statusCode?a.statusCode===500?hi.warn(a):hi.info(a):hi.error(a),a.statusCode===405&&(a.method&&(a.message+=` to handle HTTP method ${a.method.toUpperCase()||""}`),a.allow&&(a.allow.push("trace","head","options"),i.setIfNone("Allow",a.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:a.statusCode||500,headers:i,body:void 0};return c.body=bm(a.contentType?a:Pq(a),e,c),c}}function ace(e){CN=e,e.includeExpensiveRecordCountEstimates&&(rc.prototype.includeExpensiveRecordCountEstimates=!0),!Cq&&(Cq=!0,ES=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return oce(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{qp++;let s=new Xn;Oq||(Oq=!0,Fm(l=>{qp>0&&l.push({metric:"ws-connections",connections:qp,byThread:!0})}));let i;t.on("error",l=>{i=!0,hi.warn(l)});let a;t.on("message",o(function(u){a||(a=Lo(r.requestedContentType??r.headers.asObject["content-type"],!1));let d=a(u);Ve(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(d)},"message"));let c;t.on("close",()=>{qp--,Zr(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=ES.getMatch(l,"ws");if(Zr(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,Ve(h=>({count:h.count,total:qp}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let d=new ai(u.relativeURL);d.checkPermission=r.user?.role?.permission??{};let f=u.Resource;c=(await bt(r,()=>f.connect(d,s,r)))[Symbol.asyncIterator]();let p;for(;!(p=await c.next()).done;){let h=await Po(p.value,r);t.send(h),Ve(h.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(E=>t._socket.once("drain",E))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?hi.warn(l):hi.info(l):hi.error(l),t.close(cce[l.statusCode]||1011,Pq(l))}t.close()},e))}function ON(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,a]=s.trim().split("=");i=i.trim(),a&&(a=a.trim()),r={name:i.toLowerCase(),value:a,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var hi,Id,Pq,rn,ice,CN,Nq,Cq,ES,Oq,qp,cce,Lq=se(()=>{Do();ts();hi=b(Q()),Id=b(_e());eg();wu();va();Np();Aq();Gp();rg();({errorToString:Pq}=hi),rn=new Uint8Array(8),ice=new Float64Array(rn.buffer,0,1),CN={},Nq="openapi";o(oce,"http");qp=0;o(ace,"start");cce={401:3e3,403:3003};o(ON,"parseHeaderValue")});var PN=v((wve,Mq)=>{var{recordAction:gS,recordActionBinary:Dq}=(ts(),M(K_)),lce=require("fastify-plugin"),uce=200;Mq.exports=lce(function(e,t,r){e.addHook("onResponse",async(n,s)=>{let i=s.elapsedTime}),e.addHook("onSend",async(n,s,i)=>{let a=s.elapsedTime,c=performance.now(),l=s.request.routeOptions,u,d,f;l.config?.isOperation?(u=n.body?.operation,d="operation"):(u=l.url,d="fastify-route",f=l.method),gS(a,"duration",u,f,d),Dq(s.raw.statusCode<400,"success",u,f,d),Dq(1,"response_"+s.raw.statusCode,u,f,d);let m=uce;i?.pipe?(i.on("data",g=>{m+=g.length}),i.on("end",()=>{gS(performance.now()-c,"transfer",u,f,d),gS(m,"bytes-sent",u,f,d)})):(m+=i?.length||0,gS(m,"bytes-sent",u,f,d));let p=a.toFixed(3),h=s.getHeader("Server-Timing"),E=`db;dur=${p}`;s.header("Server-Timing",h?`${h}, ${E}`:E)}),r()},{name:"hdb-request-time"})});var Uq=v((Nve,vq)=>{var dce=mt(),fce={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};vq.exports=function(e){return dce.validateObject(e,fce)}});var SS=v((Cve,xq)=>{"use strict";var mce=(q(),M(z)).OPERATIONS_ENUM,LN=class{static{o(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=mce.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};xq.exports=LN});var Kp={};Re(Kp,{createTokens:()=>vN,getJWTRSAKeys:()=>AS,refreshOperationToken:()=>UN,validateOperationToken:()=>xN,validateRefreshToken:()=>IS});async function AS(){if(TS)return TS;try{let e=$p.default.join(Vp.default.getHdbBasePath(),_b),t=await yS.default.readFile($p.default.join(e,om.JWT_PASSPHRASE_NAME),"utf8"),r=await yS.default.readFile($p.default.join(e,om.JWT_PRIVATE_KEY_NAME),"utf8");return TS={publicKey:await yS.default.readFile($p.default.join(e,om.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},TS}catch(e){throw bS.default.error(e),new Ei.ClientError(Nd.NO_ENCRYPTION_KEYS,wd.INTERNAL_SERVER_ERROR)}}async function vN(e){let t=(0,DN.validateBySchema)(e,io.default.object({username:io.default.string().optional(),password:io.default.string().optional(),role:io.default.string().optional(),expires_in:io.default.alternatives(io.default.string(),io.default.number()).optional()}));if(t)throw new Ei.ClientError(t.message);let r;try{let f=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,f=!1),r=await(0,MN.findAndValidateUser)(e.username,e.password,f)}catch(f){throw bS.default.error(f),new Ei.ClientError(Nd.INVALID_CREDENTIALS,wd.UNAUTHORIZED)}if(!r)throw new Ei.ClientError(Nd.INVALID_CREDENTIALS,wd.UNAUTHORIZED);let n=!1,s=!1;r.role?.permission&&(n=r.role.permission.super_user===!0,s=r.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s};e.role&&(i.role=e.role);let a=await AS(),c=await Cd.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:e.expires_in??Gq,algorithm:RS,subject:Od.OPERATION}),l=await Cd.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:pce,algorithm:RS,subject:Od.REFRESH}),u=dw(l,Gr.SHA256);if((await(0,Bq.update)(new Fq.default(sm,bu.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new Ei.ClientError(Nd.REFRESH_TOKEN_SAVE_FAILED,wd.INTERNAL_SERVER_ERROR);return kq.default.signalUserChange(new Hq.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function UN(e){let t=(0,DN.validateBySchema)(e,io.default.object({refresh_token:io.default.string().required()}).required());if(t)throw new Ei.ClientError(t.message);let{refresh_token:r}=e;await IS(r);let n=await AS(),s=await Cd.default.decode(r);return{operation_token:await Cd.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:Gq,algorithm:RS,subject:Od.OPERATION})}}async function xN(e){return qq(e,Od.OPERATION)}async function IS(e){return qq(e,Od.REFRESH)}async function qq(e,t){try{let r=await AS(),n=await Cd.default.verify(e,r.publicKey,{algorithms:RS,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,MN.findAndValidateUser)(n.username,void 0,!1);if(t===Od.REFRESH&&!fw(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw bS.default.warn(r),r?.name==="TokenExpiredError"?new Ei.ClientError(Nd.TOKEN_EXPIRED,wd.FORBIDDEN):new Ei.ClientError(Nd.INVALID_TOKEN,wd.UNAUTHORIZED)}}var Cd,yS,$p,io,DN,Ei,bS,MN,Bq,Fq,kq,Hq,Vp,wd,Nd,Gq,pce,RS,Od,TS,Pd=se(()=>{Cd=b(require("jsonwebtoken")),yS=b(require("fs-extra")),$p=b(require("node:path")),io=b(require("joi")),DN=b(mt());q();Ei=b(_e()),bS=b(Q());pw();MN=b(fs()),Bq=b(Gn()),Fq=b(SS()),kq=b(Ho()),Hq=b(is()),Vp=b(me()),{HTTP_STATUS_CODES:wd,AUTHENTICATION_ERROR_MSGS:Nd}=Ei.hdbErrors;Vp.default.initSync();Gq=Vp.default.get(F.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",pce=Vp.default.get(F.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",RS="RS256",Od={OPERATION:"operation",REFRESH:"refresh"};o(AS,"getJWTRSAKeys");o(vN,"createTokens");o(UN,"refreshOperationToken");o(xN,"validateOperationToken");o(IS,"validateRefreshToken");o(qq,"validateToken")});var BN=v((Mve,Kq)=>{"use strict";var hce=Uq(),Ld=require("passport"),Ece=require("passport-local").Strategy,_ce=require("passport-http").BasicStrategy,gce=require("util"),Sce=fs(),Vq=gce.callbackify(Sce.findAndValidateUser),Dve=zr(),Tce=(q(),M(z)),$q=(Pd(),M(Kp));Ld.use(new Ece(function(e,t,r){Vq(e,t,r)}));Ld.use(new _ce(function(e,t,r){Vq(e,t,r)}));Ld.serializeUser(function(e,t){t(null,e)});Ld.deserializeUser(function(e,t){t(null,e)});function yce(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let a=e.headers.authorization.split(" ");n=a[0],s=a[1]}function i(a,c){return a?r(a):c?r(null,c):r("Must login")}switch(o(i,"handleResponse"),n){case"Basic":Ld.authenticate("basic",{session:!1},(a,c)=>{i(a,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===Tce.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?$q.validateRefreshToken(s).then(a=>{e.body.refresh_token=s,r(null,a)}).catch(a=>{r(a)}):$q.validateOperationToken(s).then(a=>{r(null,a)}).catch(a=>{r(a)});break;default:Ld.authenticate("local",{session:!1},function(a,c){i(a,c)})(e,t,r);break}}o(yce,"authorize");function Rce(e,t){let r=hce(e);if(r){t(r);return}let n={authorized:!0,messages:[]},s=e.user.role;if(!s?.permission)return t("Invalid role");let i=JSON.parse(s.permission);if(i.super_user)return t(null,n);if(!i[e.schema])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.schema} schema`),t(null,n);if(!i[e.schema].tables[e.table])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.table} table`),t(null,n);if(!i[e.schema].tables[e.table][e.operation])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.operation} on ${e.table} table`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&!e.attributes)return n.authorized=!1,n.messages.push(`${e.schema}.${e.table} has attribute permissions. Missing attributes to validate`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&e.attributes){let a=i[e.schema].tables[e.table].attribute_permissions;for(let c in a)e.attributes.indexOf(a[c].attribute_name)>-1&&!a[c][e.operation]&&(n.authorized=!1,n.messages.push(`Not authorized to ${e.operation} ${a[c].attribute_name} `))}return t(null,n)}o(Rce,"checkPermissions");Kq.exports={authorize:yce,checkPermissions:Rce}});var $N=v((Bve,jq)=>{var OS=require("clone"),PS=mt(),bce=ae(),NS=(q(),M(z)),Uve=Q(),FN=require("fs"),HN=require("joi"),{string:CS}=HN.types(),{hdbErrors:Ace,handleHDBError:wS}=_e(),{HDB_ERROR_MSGS:xve,HTTP_STATUS_CODES:kN}=Ace,{commonValidators:Dd}=Ki(),Yq=" is required",Ice=["insert","update","upsert"],GN={database:{presence:!1,format:Dd.schema_format,length:Dd.schema_length},schema:{presence:!1,format:Dd.schema_format,length:Dd.schema_length},table:{presence:!0,format:Dd.schema_format,length:Dd.schema_length},action:{inclusion:{within:Ice,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},wce={schema:CS.required(),table:CS.required(),action:CS.valid("insert","update","upsert")},{AWS_ACCESS_KEY:Nce,AWS_SECRET:Cce,AWS_BUCKET:Oce,AWS_FILE_KEY:Pce,REGION:Lce}=NS.S3_BUCKET_AUTH_KEYS,Dce={s3:{presence:!0},[`s3.${Nce}`]:{presence:!0,type:"String"},[`s3.${Cce}`]:{presence:!0,type:"String"},[`s3.${Oce}`]:{presence:!0,type:"String"},[`s3.${Pce}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${Lce}`]:{presence:!0,type:"String"}},Wq=OS(GN);Wq.data.presence={message:Yq};var zq=OS(GN);zq.file_path.presence={message:Yq};var Mce=Object.assign(OS(GN),Dce),qN=OS(wce);qN.csv_url=CS.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();qN.passthrough_headers=HN.object();function vce(e){let t=PS.validateObject(e,Wq);return LS(e,t)}o(vce,"dataObject");function Uce(e){let t=PS.validateBySchema(e,HN.object(qN));return LS(e,t)}o(Uce,"urlObject");function xce(e){let t=PS.validateObject(e,zq);return LS(e,t)}o(xce,"fileObject");function Bce(e){let t=PS.validateObject(e,Mce);return LS(e,t)}o(Bce,"s3FileObject");function LS(e,t){if(!t){let r=bce.checkGlobalSchemaTable(e.schema,e.table);if(r)return wS(new Error,r,kN.BAD_REQUEST);if(e.operation===NS.OPERATIONS_ENUM.CSV_FILE_LOAD)try{FN.accessSync(e.file_path,FN.constants.R_OK|FN.constants.F_OK)}catch(n){return n.code===NS.NODE_ERROR_CODES.ENOENT?wS(n,`No such file or directory ${n.path}`,kN.BAD_REQUEST):n.code===NS.NODE_ERROR_CODES.EACCES?wS(n,`Permission denied ${n.path}`,kN.BAD_REQUEST):wS(n)}}return t}o(LS,"postValidateChecks");jq.exports={dataObject:vce,urlObject:Uce,fileObject:xce,s3FileObject:Bce}});var VN=v((kve,Qq)=>{"use strict";var Yp=Q(),DS=(q(),M(z));async function Fce(e,t,r,n=void 0){if(!e||typeof e!="function")throw new Error("Invalid function parameter");let s;try{return s=await e(t),r&&await r(t,s,n),t.operation===DS.OPERATIONS_ENUM.INSERT||t.operation===DS.OPERATIONS_ENUM.UPDATE||t.operation===DS.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===DS.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(Yp.info(i.message),i):i.http_resp_msg?(Yp.error(`Error calling operation: ${e.name}`),Yp.error(i.http_resp_msg),i):(Yp.error(`Error calling operation: ${e.name}`),Yp.error(i),i)}}o(Fce,"callOperationFunctionAsAwait");Qq.exports={callOperationFunctionAsAwait:Fce}});var KN=v((Gve,Xq)=>{"use strict";var{S3:kce,GetObjectCommand:Hce}=require("@aws-sdk/client-s3");Xq.exports={getFileStreamFromS3:Gce,getS3AuthObj:Jq};async function Gce(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await Jq(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new Hce(r))).Body}o(Gce,"getFileStreamFromS3");function Jq(e,t,r){return new kce({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(Jq,"getS3AuthObj")});var e$=v(($ve,Zq)=>{"use strict";var YN=class{static{o(this,"BulkLoadFileObject")}constructor(t,r,n,s,i,a,c=null){this.op=t,this.action=r,this.schema=n,this.table=s,this.file_path=i,this.file_type=a,this.role_perms=c}},WN=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};Zq.exports={BulkLoadFileObject:YN,BulkLoadDataObject:WN}});var r$=v((Kve,t$)=>{"use strict";var zN=class{static{o(this,"PermissionTableResponseObject")}constructor(t,r,n=[],s=[]){this.schema=t,this.table=r,this.required_table_permissions=n,this.required_attribute_permissions=s}};t$.exports=zN});var s$=v((Wve,n$)=>{"use strict";var jN=class{static{o(this,"PermissionAttributeResponseObject")}constructor(t,r=[]){this.attribute_name=t,this.required_permissions=r}};n$.exports=jN});var JN=v((jve,o$)=>{"use strict";var i$=r$(),qce=s$(),{HDB_ERROR_MSGS:$ce}=zr(),QN=class{static{o(this,"PermissionResponseObject")}constructor(){this.error=$ce.OP_AUTH_PERMS_ERROR,this.unauthorized_access={},this.invalid_schema_items=[]}handleUnauthorizedItem(t){return this.invalid_schema_items=[],this.unauthorized_access=[t],this}handleInvalidItem(t){return this.invalid_schema_items=[t],this.unauthorized_access=[],this}addInvalidItem(t,r,n){if(r&&n){let s=`${r}_${n}`;if(this.unauthorized_access[s])return}this.invalid_schema_items.push(t)}addUnauthorizedTable(t,r,n){let s=new i$(t,r,n),i=`${t}_${r}`;this.unauthorized_access[i]=s}addUnauthorizedAttributes(t,r,n,s){let i=[];t.forEach(c=>{let l=new qce(c,s[c]);i.push(l)});let a=`${r}_${n}`;if(this.unauthorized_access[a])this.unauthorized_access[a].required_attribute_permissions=i;else{let c=new i$(r,n,[],i);this.unauthorized_access[a]=c}}getPermsResponse(){let t=Object.values(this.unauthorized_access);return t.length>0||this.invalid_schema_items.length>0?(this.unauthorized_access=t,this):null}};o$.exports=QN});var Ll=v((Xve,u$)=>{"use strict";var Jve=hn(),Wp=Q(),{validateBySchema:a$}=mt(),Yo=require("joi"),Vce=Xi(),MS=ae(),{handleHDBError:vS,hdbErrors:Kce,ClientError:c$}=_e(),{HDB_ERROR_MSGS:US,HTTP_STATUS_CODES:XN}=Kce,l$=me();l$.initSync();var{getDatabases:ZN}=(we(),M(ft)),Yce=require("fs-extra"),Wce=(q(),M(z));u$.exports={describeAll:zce,describeTable:xS,describeSchema:jce};async function zce(e={}){try{let t=MS.isEmptyOrZeroLength(e),r=!!e.bypass_auth,n,s;!t&&!r&&(n=e.hdb_user?.role?.permission,s=n?.super_user||n?.cluster_user);let i=ZN(),a={},c={},l=[],u=e?.exact_count,d=e?.include_computed;for(let m in i){a[m]=!0,!t&&!s&&!r&&(c[m]=e.hdb_user?.role?.permission[m]?.describe);let p=i[m];for(let h in p)try{let E;if(t||s||r)E=await xS({schema:m,table:h,exact_count:u,include_computed:d});else if(n&&n[m].describe&&n[m].tables[h].describe){let g=n[m].tables[h].attribute_permissions;E=await xS({schema:m,table:h,exact_count:u,include_computed:d},g)}E&&l.push(E)}catch(E){Wp.error(E)}}let f={};for(let m in l)t||s||r?(f[l[m].schema]==null&&(f[l[m].schema]={}),f[l[m].schema][l[m].name]=l[m],a[l[m].schema]&&delete a[l[m].schema]):c[l[m].schema]&&(f[l[m].schema]==null&&(f[l[m].schema]={}),f[l[m].schema][l[m].name]=l[m],a[l[m].schema]&&delete a[l[m].schema]);for(let m in a)t||s||r?f[m]={}:c[m]&&(f[m]={});return f}catch(t){return Wp.error("Got an error in describeAll"),Wp.error(t),vS(new Error,US.DESCRIBE_ALL_ERR)}}o(zce,"describeAll");async function xS(e,t){MS.transformReq(e);let{schema:r,table:n}=e;r=r?.toString(),n=n?.toString();let s=t;e.hdb_user&&!e.hdb_user?.role?.permission?.super_user&&(s=e.hdb_user?.role?.permission[r]?.tables[n]?.attribute_permissions);let i=a$(e,Yo.object({database:Yo.string(),table:Yo.string().required(),exact_count:Yo.boolean().strict(),include_computed:Yo.boolean().strict()}));if(i)throw new c$(i.message);let c=ZN()[r];if(!c)throw vS(new Error,US.SCHEMA_NOT_FOUND(e.schema),XN.NOT_FOUND);let l=c[n];if(!l)throw vS(new Error,US.TABLE_NOT_FOUND(e.schema,e.table),XN.NOT_FOUND);function u(p){(!p.computed||e.include_computed)&&d.push({attribute:p.attribute,type:p.type,elements:p.elements?.type,indexed:p.indexed,is_primary_key:p.isPrimaryKey,assigned_created_time:p.assignCreatedTime,assigned_updated_time:p.assignUpdatedTime,nullable:p.nullable,computed:p.computed?!0:void 0,properties:p.properties?p.properties.map(h=>({type:h.type,name:h.name})):void 0})}o(u,"pushAtt");let d=[];if(s){let p={};s.forEach(h=>{h.describe&&(p[h.attribute_name]=!0)}),l.attributes.forEach(h=>{p[h.name]&&u(h)})}else l.attributes?.forEach(p=>u(p));let f;try{f=(await Yce.stat(l.primaryStore.env.path)).size}catch(p){Wp.warn("unable to get database size",p)}let m={schema:r,name:l.tableName,hash_attribute:l.attributes.find(p=>p.isPrimaryKey||p.is_hash_attribute)?.name,audit:l.audit,schema_defined:l.schemaDefined,attributes:d,db_size:f};l.replicate!==void 0&&(m.replicate=l.replicate),l.expirationMS!==void 0&&(m.expiration=l.expirationMS/1e3+"s"),l.sealed!==void 0&&(m.sealed=l.sealed),l.sources?.length>0&&(m.sources=l.sources.map(p=>p.name).filter(p=>p&&p!=="NATSReplicator"&&p!=="Replicator")),l$.get(Wce.CONFIG_PARAMS.CLUSTERING_ENABLED)&&(m.clustering_stream_name=Vce.createNatsTableStreamName(m.schema,m.name));try{let p=await l.getRecordCount({exactCount:!!e.exact_count});m.record_count=p.recordCount,m.table_size=l.getSize(),m.db_audit_size=l.getAuditSize(),m.estimated_record_range=p.estimatedRange;let h=l.auditStore;if(h)for(let E of h.getKeys({reverse:!0,limit:1}))m.last_updated_record=E[0];if(!m.last_updated_record&&l.indices.__updatedtime__)for(let E of l.indices.__updatedtime__.getKeys({reverse:!0,limit:1}))m.last_updated_record=E}catch(p){Wp.warn(`unable to stat table dbi due to ${p}`)}return m}o(xS,"descTable");async function jce(e){MS.transformReq(e);let t=a$(e,Yo.object({database:Yo.string(),exact_count:Yo.boolean().strict(),include_computed:Yo.boolean().strict()}));if(t)throw new c$(t.message);let r;e.hdb_user&&!e.hdb_user?.role?.permission?.super_user&&(r=e.hdb_user?.role?.permission[e.schema]);let n=e.schema.toString(),i=ZN()[n];if(!i)throw vS(new Error,US.SCHEMA_NOT_FOUND(e.schema),XN.NOT_FOUND);let a={};for(let c in i){let l;if(r&&r.tables[c]&&(l=r.tables[c]),MS.isEmpty(l)||l.describe){let u=await xS({schema:e.schema,table:c,exact_count:e.exact_count,include_computed:e.include_computed},l?l.attribute_permissions:null);u&&(a[u.name]=u)}}return a}o(jce,"describeSchema")});var h$=v((eUe,p$)=>{"use strict";var Qce=Ll(),{hdbErrors:d$}=_e(),{getDatabases:f$}=(we(),M(ft));p$.exports={checkSchemaExists:m$,checkSchemaTableExists:Jce,schemaDescribe:Qce};async function m$(e){if(!f$()[e])return d$.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}o(m$,"checkSchemaExists");async function Jce(e,t){let r=await m$(e);if(r)return r;if(!f$()[e][t])return d$.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}o(Jce,"checkSchemaTableExists")});function eC(e){let t=e.get(BS),r=t?(0,Md.unpack)(t):null;r||(r={remoteNameToId:{}});let n=it(),s=!1;r.nodeName=it();let i=r.remoteNameToId;if(i[n]!==0){let a=0,c;for(let l in i){let u=i[l];u===0?c=l:u>a&&(a=u)}if(c){a++,i[c]=a;let l=[Symbol.for("seq"),a];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:jp(e)??1,nodes:[]})})}i[n]=0,e.putSync(BS,(0,Md.pack)(r))}return r}function zp(e){return eC(e).remoteNameToId}function _$(e,t){let r=eC(t),n=r.remoteNameToId,s=new Map,i=!1;for(let a in e){let c=e[a],l=n[a];if(l==null){let u=0;for(let d in n){let f=n[d];f>u&&(u=f)}l=u+1,n[a]=l,i=!0}s.set(c,l)}return i&&t.putSync(BS,(0,Md.pack)(r)),s}function FS(e,t){let r=eC(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let a in n){let c=n[a];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(BS,(0,Md.pack)(r))}return E$.trace?.("The remote node name map",e,n,s),s}var E$,Md,BS,tC=se(()=>{E$=b(Zn());hs();Md=require("msgpackr"),BS=Symbol.for("remote-ids");o(eC,"getIdMappingRecord");o(zp,"exportIdMapping");o(_$,"remoteToLocalNodeId");o(FS,"getIdOfRemoteNode")});var b$={};Re(b$,{commitsAwaitingReplication:()=>Ud,getHDBNodeTable:()=>jt,getReplicationSharedStatus:()=>xd,iterateRoutes:()=>Jp,shouldReplicateToNode:()=>Qp,subscribeToNodeUpdates:()=>Bd});function jt(){return g$||(g$=Ze({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 xd(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(64),n&&{callback:n}))}function Bd(e){jt().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;R$.debug?.("adding node",n,"on node",it()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==it()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of jt().search({}))if(i.shard!=null){let a=s.get(i.shard);a||s.set(i.shard,a=[]),a.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function Qp(e,t){return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&jt().primaryStore.get(it())?.replicates||e.subscriptions?.some(r=>(r.database||r.schema)===t&&r.subscribe)}function Xce(){Bd(e=>{nc({},(t,r)=>{let n=e.name,s=S$.get(n);if(s||S$.set(n,s=new Map),s.has(r))return;let i;for(let a in t)if(i=t[a].auditStore,i)break;if(i){let a=xd(i,r,n,()=>{let c=a[0],l=a.lastTime;for(let{txnTime:u,onConfirm:d}of Ud.get(r)||[])u>l&&u<=c&&d();a.lastTime=c});a.lastTime=0,s.set(r,a)}})})}function*Jp(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=vd.default.get(F.REPLICATION_SECUREPORT)??(!vd.default.get(F.REPLICATION_PORT)&&vd.default.get(F.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||vd.default.get(F.REPLICATION_PORT)||vd.default.get(F.OPERATIONSAPI_NETWORK_PORT);let a=i?.lastIndexOf?.(":");a>0&&(i=+i.slice(a+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){T$.isMainThread&&console.error("Invalid route, must specify a url or host (with port)");continue}yield{replicates:!t.subscriptions,url:r,subscription:t.subscriptions,routes:t.routes,startTime:t.startTime,revoked_certificates:t.revokedCertificates}}}var T$,y$,vd,R$,g$,S$,Ud,Fd=se(()=>{we();hs();_m();T$=require("worker_threads"),y$=b(_e()),vd=b(me());q();R$=b(Zn());server.nodes=[];o(jt,"getHDBNodeTable");o(xd,"getReplicationSharedStatus");o(Bd,"subscribeToNodeUpdates");o(Qp,"shouldReplicateToNode");S$=new Map;sU((e,t,r)=>{if(r>server.nodes.length)throw new y$.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);Ud||(Ud=new Map,Xce());let n=Ud.get(e);return n||(n=[],Ud.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:o(()=>{++i===r&&s()},"onConfirm")})})});o(Xce,"startSubscriptionToReplications");o(Jp,"iterateRoutes")});var C$={};Re(C$,{connectedToNode:()=>Dl,disconnectedFromNode:()=>Hd,ensureNode:()=>Wo,requestClusterStatus:()=>N$,startOnMainThread:()=>rC});async function rC(e){let t=0,r=at();for(let i of Object.getOwnPropertyNames(r)){let a=r[i];for(let c in a){let l=a[c];if(l.auditStore){kS.set(i,jp(l.auditStore));break}}}ao.whenThreadsStarted.then(async()=>{let i=[];for await(let l of r.system.hdb_nodes?.search([])||[])i.push(l);let a=it();function c(){let l=jt().primaryStore.get(a);if(l!==null){let u=e.url??sc();if(l===void 0||l.url!==u||l.shard!==e.shard)return Wo(a,{name:a,url:u,shard:e.shard,replicates:!0})}}o(c,"ensureThisNode"),jt().primaryStore.get(a)&&c();for(let l of Jp(e))try{let u=!l.subscriptions;if(u&&await c(),u&&l.replicates==null&&(l.replicates=!0),i.find(d=>d.url===l.url))continue;s(l)}catch(u){console.error(u)}Bd(s)});let n;function s(i,a=i?.name){let c=it()&&a===it()||sc()&&i?.url===sc();if(c){let f=!!i?.replicates;if(n!==void 0&&n!==f)for(let m of jt().search([]))m.replicates&&m.name!==a&&s(m,m.name);n=f}if(ut.trace("Setting up node replication for",i),!i){for(let[f,m]of oo){let p;for(let[h,{worker:E,nodes:g}]of m){let R=g[0];if(R&&R.name==a){p=!0;for(let[S,{worker:y}]of m)m.delete(S),ut.warn("Node was deleted, unsubscribing from node",a,S,f),y?.postMessage({type:"unsubscribe-from-node",node:a,database:S,url:f});break}}if(p){oo.get(f).iterator.remove(),oo.delete(f);return}}return}if(c)return;if(!i.url){ut.info(`Node ${i.name} is missing url`);return}let l=oo.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(ut.info(`Added node ${i.name} at ${i.url} for process ${it()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[f,m]of kd)if(i.url===m.url){kd.delete(f);break}kd.set(i.name,i)}let u=at();if(l||(l=new Map,oo.set(i.url,l)),l.iterator=nc(e,(f,m,p)=>{p?d(m,!0):d(m,!1)}),i.subscriptions)for(let f of i.subscriptions){let m=f.database||f.schema;u[m]||(ut.warn(`Database ${m} not found for node ${i.name}, making a subscription anyway`),d(m,!1))}function d(f,m){ut.trace("Setting up replication for database",f,"on node",i.name);let p=l.get(f),h,E=[{replicateByDefault:m,...i}];kS.has(f)&&Xp.default.get(F.REPLICATION_FAILOVER)&&(E.push({replicateByDefault:m,name:it(),startTime:kS.get(f),endTime:Date.now(),replicates:!0}),kS.delete(f));let g=Qp(i,f),R=ao.workers.filter(S=>S.name==="http");if(p?(h=p.worker,p.nodes=E):g&&(t=t%R.length,h=R[t++],l.set(f,{worker:h,nodes:E,url:i.url}),h?.on("exit",()=>{l.get(f)?.worker===h&&(l.delete(f),d(f,m))})),g)setTimeout(()=>{let S={type:"subscribe-to-node",database:f,nodes:E};h?h.postMessage(S):Zp(S)},Zce);else{ut.info("Node no longer should be used, unsubscribing from node",{replicates:i.replicates,databaseName:f,node:i,subscriptions:i.subscriptions,hasDatabase:!!u[f],thisReplicates:jt().primaryStore.get(it())?.replicates}),jt().primaryStore.get(it())?.replicates||(n=!1,ut.info("Disabling replication, this node name",it(),jt().primaryStore.get(it()),f));let S={type:"unsubscribe-from-node",database:f,url:i.url,name:i.name};h?h.postMessage(S):GS(S)}}o(d,"onDatabase")}o(s,"onNodeUpdate"),Hd=o(function(i){try{ut.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let a=Array.from(kd.keys()),c=a.sort(),l=c.indexOf(i.name||_i(i.url));if(l===-1){ut.warn("Disconnected node not found in node map",i.name,a);return}let u=oo.get(i.url),d=u?.get(i.database);if(!d){ut.warn("Disconnected node not found in replication map",i.database,u);return}if(d.connected=!1,i.finished||!Xp.default.get(F.REPLICATION_FAILOVER))return;let f=d.nodes[0];if(!(f.replicates===!0||f.replicates?.sends||f.subscriptions?.length))return;let m=f.shard,p=(l+1)%c.length;for(;l!==p;){let h=c[p],E=kd.get(h);u=oo.get(E.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==m){p=(p+1)%c.length;continue}let{worker:R,nodes:S}=g,y=!1;for(let C of d.nodes){if(S.some(I=>I.name===C.name)){ut.info(`Disconnected node is already failing over to ${h} for ${i.database}`);continue}C.endTime<Date.now()||(S.push(C),y=!0)}if(d.nodes=[d.nodes[0]],!y){ut.info(`Disconnected node ${i.name} has no nodes to fail over to ${h}`);return}ut.info(`Failing over ${i.database} from ${i.name} to ${h}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:S}):Zp({database:i.database,nodes:S});return}ut.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(a){ut.error("Error failing over node",a)}},"disconnectedFromNode"),Dl=o(function(i){let a=oo.get(i.url),c=a?.get(i.database);if(!c){ut.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,a);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){ut.warn("Newly connected node has no node subscriptions",i.database,c);return}if(!l.name){ut.debug("Connected node is not named yet",i.database,c);return}if(!Xp.default.get(F.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let d of oo.values()){let f=d.get(i.database);if(!f||f==c)continue;let{worker:m,nodes:p,connected:h}=f;if(p)if(h===!1&&p[0].shard===l.shard)u=!0,c.nodes.push(p[0]);else{let E=p.filter(g=>g&&g.name!==l.name);E.length<p.length&&(f.nodes=E,m.postMessage({type:"subscribe-to-node",database:i.database,nodes:p}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,ao.onMessageByType)("disconnected-from-node",Hd),(0,ao.onMessageByType)("connected-to-node",Dl),(0,ao.onMessageByType)("request-cluster-status",N$)}function N$(e,t){let r=[];for(let[n,s]of kd)try{let i=oo.get(s.url);ut.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let a=[];if(i){for(let[l,{worker:u,connected:d,nodes:f,latency:m}]of i)a.push({database:l,connected:d,latency:m,threadId:u?.threadId,nodes:f.filter(p=>!(p.endTime<Date.now())).map(p=>p.name)});let c=I$(s);c.database_sockets=a,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){ut.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Wo(e,t){let r=jt();e=e??_i(t.url),t.name=e;try{if(t.ca){let s=new w$.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subjectAltName:s.subjectAltName,serialNumber:s.serialNumber,validFrom:s.validFrom,validTo:s.validTo}}}catch(s){ut.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(ut.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!Xp.default.get(F.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],a=I$(n[s]);for(let c of t[s]){let l=!1;for(let u of a)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...a,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}ut.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var ao,HS,ut,A$,Xp,w$,I$,Zce,oo,Hd,Dl,kd,kS,eh=se(()=>{we();ao=b(nt());hs();HS=require("worker_threads");Fd();ut=b(Q()),A$=b(require("lodash")),Xp=b(me());q();w$=require("crypto"),{cloneDeep:I$}=A$.default,Zce=200,oo=new Map,kd=new Map,kS=new Map;o(rC,"startOnMainThread");o(N$,"requestClusterStatus");HS.parentPort&&(Hd=o(e=>{HS.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Dl=o(e=>{HS.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,ao.onMessageByType)("subscribe-to-node",e=>{Zp(e)}),(0,ao.onMessageByType)("unsubscribe-from-node",e=>{GS(e)}));o(Wo,"ensureNode")});var _s=v(Gt=>{"use strict";var hr=require("path"),{watch:ele}=require("chokidar"),Vn=require("fs-extra"),Gd=require("node-forge"),v$=require("net"),{generateKeyPair:nC,X509Certificate:zo,createPrivateKey:U$,randomBytes:tle}=require("node:crypto"),rle=require("util");nC=rle.promisify(nC);var Lt=Gd.pki,gi=require("joi"),{v4:x$}=require("uuid"),{validateBySchema:aC}=mt(),{forComponent:nle}=Q(),Es=me(),qs=(q(),M(z)),{CONFIG_PARAMS:vl}=qs,Si=Nw(),{ClientError:ic}=_e(),$S=require("node:tls"),{relative:B$,join:sle}=require("node:path"),{CERTIFICATE_VALUES:O$}=Si,ile=$c(),sC=St(),{table:ole,getDatabases:ale,databases:qS}=(we(),M(ft)),{getJWTRSAKeys:P$}=(Pd(),M(Kp)),Qe=nle("tls").conditional;Gt.generateKeys=uC;Gt.updateConfigCert=K$;Gt.createCsr=ple;Gt.signCertificate=hle;Gt.setCertTable=qd;Gt.loadCertificates=q$;Gt.reviewSelfSignedCert=fC;Gt.createTLSSelector=W$;Gt.listCertificates=j$;Gt.addCertificate=yle;Gt.removeCertificate=ble;Gt.createNatsCerts=gle;Gt.generateCertsKeys=_le;Gt.getReplicationCert=rh;Gt.getReplicationCertAuth=mle;Gt.renewSelfSigned=Sle;Gt.hostnamesFromCert=pC;Gt.getKey=Ale;Gt.getHostnamesFromCertificate=Ile;Gt.getPrimaryHostName=mC;Gt.generateSerialNumber=YS;var{urlToNodeName:F$,getThisNodeUrl:cle,getThisNodeName:KS,clearThisNodeName:lle}=(hs(),M(jo)),{readFileSync:ule,statSync:k$}=require("node:fs"),_Ue=me(),{getTicketKeys:dle,onMessageFromWorkers:fle}=nt(),{isMainThread:H$}=require("worker_threads"),{TLSSocket:G$,createSecureContext:gUe}=require("node:tls"),cC=3650,th=["127.0.0.1","localhost","::1"],lC=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];function YS(){let e=tle(8);return e[0]=e[0]&127|1,e.toString("hex")}o(YS,"generateSerialNumber");fle(async e=>{e.type===qs.ITC_EVENT_TYPES.RESTART&&(Es.initSync(!0),await fC())});var nn;function ac(){return nn||(nn=ale().system.hdb_certificate,nn||(nn=ole({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__"}]}))),nn}o(ac,"getCertTable");async function rh(){let e=W$("operations-api"),t={secureContexts:null,setSecureContext:o(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(KS());if(!r)return;let n=new zo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}o(rh,"getReplicationCert");async function mle(){ac();let e=(await rh()).options.cert,r=new zo(e).issuer.match(/CN=(.*)/)?.[1];return nn.get(r)}o(mle,"getReplicationCertAuth");var L$,oc=new Map;function q$(){if(L$)return;L$=!0;let e=[{configKey:vl.TLS},{configKey:vl.OPERATIONSAPI_TLS}];ac();let t=hr.dirname(sC.getConfigFilePath()),r;for(let{configKey:n}of e){let s=sC.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let a=i.privateKey,c=a&&B$(sle(t,"keys"),a);c&&D$(a,l=>{oc.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&H$){let d;D$(u,f=>{if(O$.cert===f)return;let m=i.hostname??i.hostnames??i.host??i.hosts;m&&!Array.isArray(m)&&(m=[m]);let p=Y$(u),h=new zo(p),E;try{E=mC(h)}catch(y){Qe.error?.("error extracting host name from certificate",y);return}if(E==null){Qe.error?.("No host name found on certificate");return}if(h.checkIssued(new zo(O$.cert)))return;let g=nn.primaryStore.get(E),R=k$(u).mtimeMs,S=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&R<=S){R<S&&Qe.info?.(`Certificate ${E} at ${u} is older (${new Date(R)}) than the certificate in the database (${S>1?new Date(S):"only self signed certificate available"})`);return}r=nn.put({name:E,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:p,private_key_name:c,is_authority:l,hostnames:m,fileTimestamp:R,details:{issuer:h.issuer.replace(/\n/g," "),subject:h.subject?.replace(/\n/g," "),subject_alt_name:h.subjectAltName,serial_number:h.serialNumber,valid_from:h.validFrom,valid_to:h.validTo}})},l?"certificate authority":"certificate")}}}}}return r}o(q$,"loadCertificates");function D$(e,t,r){let n,s=o((i,a)=>{try{let c=a.mtimeMs;c&&c!==n&&(n&&H$&&Qe.warn?.(`Reloading ${r}:`,i),n=c,t(Y$(i)))}catch(c){Qe.error?.(`Error loading ${r}:`,i,c)}},"loadFile");Vn.existsSync(e)?s(e,k$(e)):Qe.error?.(`${r} file not found:`,e),ele(e,{persistent:!1}).on("change",s)}o(D$,"loadAndWatch");function iC(){let e=cle();if(e==null){let t=th[0];return Qe.info?.("replication url is missing from harperdb-config.yaml, using default host"+t),t}return F$(e)}o(iC,"getHost");function VS(){let e=KS();if(e==null){let t=th[0];return Qe.info?.("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}o(VS,"getCommonName");async function ple(){let e=await rh(),t=Lt.certificateFromPem(e.options.cert),r=Lt.privateKeyFromPem(e.options.key);Qe.info?.("Creating CSR with cert named:",e.name);let n=Lt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:VS()},...lC];Qe.info?.("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:$$()}];return Qe.info?.("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Gd.pki.certificationRequestToPem(n)}o(ple,"createCsr");function $$(){let e=th.includes(VS())?th:[...th,VS()];return e.includes(iC())||e.push(iC()),[{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=>v$.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}o($$,"certExtensions");async function hle(e){let t={},r=hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;ac();for await(let d of nn.search([]))if(d.is_authority&&!d.details.issuer.includes("HarperDB-Certificate-Authority")){if(oc.has(d.private_key_name)){n=oc.get(d.private_key_name),s=d;break}else if(d.private_key_name&&await Vn.exists(hr.join(r,d.private_key_name))){n=Vn.readFile(hr.join(r,d.private_key_name)),s=d;break}}if(!n){let d=await oC();s=d.ca,n=d.private_key}n=Lt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=Lt.certificateFromPem(s.certificate);Qe.info?.("Signing CSR with cert named",s.name);let a=Lt.certificationRequestFromPem(e.csr);try{a.verify()}catch(d){return Qe.error?.(d),new Error("Error verifying CSR: "+d.message)}let c=Gd.pki.createCertificate();c.serialNumber=YS(),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+cC),Qe.info?.("sign cert setting validity:",c.validity),Qe.info?.("sign cert setting subject from CSR:",a.subject.attributes),c.setSubject(a.subject.attributes),Qe.info?.("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=a.getAttribute({name:"extensionRequest"}).extensions;Qe.info?.("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=a.publicKey,c.sign(n,Gd.md.sha256.create()),t.certificate=Lt.certificateToPem(c)}else Qe.info?.("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}o(hle,"signCertificate");async function Ele(e,t){await qd({name:KS(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await qd({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:Lt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}o(Ele,"createCertificateTable");async function qd(e){let t;try{t=new zo(e.certificate)}catch(r){Qe.error?.(`Failed to parse certificate for ${e.name}:`,r.message),Qe.debug?.("Certificate record details:",JSON.stringify(e,null,2));let n=new Error(`Invalid certificate format for ${e.name}: ${r.message}. This may be due to corrupted certificate data during transfer or encoding issues.`);throw n.code="INVALID_CERTIFICATE_FORMAT",n.cause=r,n}e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},ac(),await nn.patch(e)}o(qd,"setCertTable");async function uC(){let e=await nC("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{publicKey:Lt.publicKeyFromPem(e.publicKey),privateKey:Lt.privateKeyFromPem(e.privateKey)}}o(uC,"generateKeys");async function dC(e,t,r){let n=Lt.createCertificate();if(!t){let a=await rh();t=Lt.certificateFromPem(a.options.cert).publicKey}n.publicKey=t,n.serialNumber=YS(),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+cC);let i=[{name:"commonName",value:VS()},...lC];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions($$()),n.sign(e,Gd.md.sha256.create()),Lt.certificateToPem(n)}o(dC,"generateCertificates");async function oC(){let e=await j$(),t;for(let r of e){if(!r.is_authority)continue;let n=await z$(r.private_key_name);if(r.private_key_name&&n&&new zo(r.certificate).checkPrivateKey(U$(n))){Qe.trace?.(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;Qe.trace?.("No CA found with matching private key")}o(oC,"getCertAuthority");async function V$(e,t,r=!0){let n=Lt.createCertificate();n.publicKey=t,n.serialNumber=YS(),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+cC);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${Es.get(vl.REPLICATION_HOSTNAME)??F$(Es.get(vl.REPLICATION_URL))??x$().split("-")[0]}`},...lC];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0},{name:"subjectKeyIdentifier"}]),n.sign(e,Gd.md.sha256.create());let a=hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME),c=hr.join(a,Si.PRIVATEKEY_PEM_NAME);return r&&await Vn.writeFile(c,Lt.privateKeyToPem(e)),n}o(V$,"generateCertAuthority");async function _le(){let{privateKey:e,publicKey:t}=await uC(),r=await V$(e,t),n=await dC(e,t,r);await Ele(n,r),K$()}o(_le,"generateCertsKeys");async function gle(){let e=await dC(Lt.privateKeyFromPem(Si.CERTIFICATE_VALUES.key),void 0,Lt.certificateFromPem(Si.CERTIFICATE_VALUES.cert)),t=hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME),r=hr.join(t,Si.NATS_CERTIFICATE_PEM_NAME);await Vn.exists(r)||await Vn.writeFile(r,e);let n=hr.join(t,Si.NATS_CA_PEM_NAME);await Vn.exists(n)||await Vn.writeFile(n,Si.CERTIFICATE_VALUES.cert)}o(gle,"createNatsCerts");async function Sle(){ac();for await(let e of nn.search([{attribute:"is_self_signed",value:!0}]))await nn.delete(e.name);await fC()}o(Sle,"renewSelfSigned");async function fC(){lle(),await q$(),ac();let e=await oC();if(!e){Qe.notify?.("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=o(u=>{try{return{key:Lt.privateKeyFromPem(Vn.readFileSync(u)),keyPath:u}}catch(d){return Qe.warn?.(`Failed to parse private key from ${u}:`,d.message),{key:null,keyPath:u}}},"tryToParseKey"),n=Es.get(vl.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let d=r(u.privateKey);if(s=d.key,i=d.keyPath,d.key)break}}else{let u=Es.get(vl.TLS_PRIVATEKEY),d=r(u);s=d.key,i=d.keyPath}let a=hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME),c=B$(a,i);s||(Qe.warn?.("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{privateKey:s}=await uC(),Vn.existsSync(hr.join(a,Si.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${x$().split("-")[0]}.pem`),await Vn.writeFile(hr.join(a,c),Lt.privateKeyToPem(s)));let l=await V$(s,Lt.setRsaPublicKey(s.n,s.e),!1);await qd({name:l.subject.getField("CN").value,uses:["https"],certificate:Lt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await rh()){let r=KS();Qe.notify?.(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await oC();let n=Lt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await dC(Lt.privateKeyFromPem(e.private_key),s,n);await qd({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}o(fC,"reviewSelfSignedCert");function K$(){let e=ile(Object.keys(qs.CONFIG_PARAM_MAP),!0),t=hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME),r=hr.join(t,Si.PRIVATEKEY_PEM_NAME),n=hr.join(t,Si.NATS_CERTIFICATE_PEM_NAME),s=hr.join(t,Si.NATS_CA_PEM_NAME),i=qs.CONFIG_PARAMS,a={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(a[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(a[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,a[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,a[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),sC.updateConfigValue(void 0,void 0,a,!1,!0)}o(K$,"updateConfigCert");function Y$(e){return e.startsWith("-----BEGIN")?e:ule(e,"utf8")}o(Y$,"readPEM");var M$=$S.createSecureContext;$S.createSecureContext=function(e){if(!e.cert||!e.key)return M$(e);let t={...e};delete t.key,delete t.cert;let r=M$(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var Tle=G$.prototype._init;G$.prototype._init=function(e,t){Tle.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,a)=>{this.sni_context=a?.context||a,this.certCbDone()})}};var Ml=new Map;function W$(e,t){let r=new Map,n,s=!1;return i.initialize=a=>i.ready?i.ready:(a&&(a.secureContexts=r,a.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),Ml.clear();let d=0;if(qS===void 0){c();return}for await(let f of qS.system.hdb_certificate.search([])){let m=f.certificate,p=new zo(m);f.is_authority&&(p.asString=m,Ml.set(p.subject,m))}for await(let f of qS.system.hdb_certificate.search([]))try{if(f.is_authority)continue;let m=e==="operations-api",p=f.is_self_signed?1:3;m&&f.uses?.includes?.("operations")&&(p+=1);let h=await z$(f.private_key_name),E=f.certificate,g=new zo(E);if(Ml.has(g.issuer)&&(E+=`
17
17
  `+Ml.get(g.issuer)),!h||!E)throw new Error("Missing private key or certificate for secure server");let R={ciphers:f.ciphers,ticketKeys:dle(),availableCAs:Ml,ca:t&&Array.from(Ml.values()),cert:E,key:h,key_file:f.private_key_name,is_self_signed:f.is_self_signed};a&&(R.sessionIdContext=a.sessionIdContext);let S=f.hostnames??pC(g);Array.isArray(S)||(S=[S]);for(let I of S)I===iC()&&(p+=1);let y=$S.createSecureContext(R);y.name=f.name,y.options=R,y.quality=p,y.certificateAuthorities=Array.from(Ml),y.certStart=E.toString().slice(0,100);let C;for(let I of S)if(I){I[0]==="*"&&(s=!0,I=I.slice(1)),v$.isIP(I)&&(C=!0);let k=r.get(I)?.quality??0;Qe.trace?.("Assigning TLS for hostname",I,"if",p,">",k),p>k&&r.set(I,y)}else Qe.error?.("No hostname found for certificate at",$S.certificate);Qe.trace?.("Adding TLS",y.name,"for",a.ports||"client","cert named",f.name,"hostnames",S,"quality",p,"best quality",d),p>d&&(i.defaultContext=n=y,d=p,a&&(a.defaultContext=y))}catch(m){Qe.error?.("Error applying TLS for",f.name,m)}a?.secureContextsListeners.forEach(f=>f()),c(n)}catch(d){l(d)}}o(u,"updateTLS"),qS?.system.hdb_certificate.subscribe({listener:o(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(a,c){Qe.info?.("TLS requested for",a||"(no SNI)");let l=a;for(;;){let d=r.get(l);if(d)return Qe.debug?.("Found certificate for",a,d.certStart),d.updatedContext&&(d=d.updatedContext),c(null,d);if(s&&l){let f=l.indexOf(".",1);f<0?l="":l=l.slice(f)}else break}a?Qe.debug?.("No certificate found to match",a,"using the default certificate"):Qe.debug?.("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):Qe.info?.("No default certificate found"),c(null,u)}o(i,"SNICallback")}o(W$,"createTLSSelector");async function z$(e){let t=oc.get(e);return!t&&e?await Vn.readFile(hr.join(Es.get(vl.ROOTPATH),qs.LICENSE_KEY_DIR_NAME,e),"utf8"):t}o(z$,"getPrivateKeyByName");async function j$(){ac();let e=[];for await(let t of nn.search([]))e.push(t);return e}o(j$,"listCertificates");async function yle(e){let t=aC(e,gi.object({name:gi.string().required(),certificate:gi.string().required(),is_authority:gi.boolean().required(),private_key:gi.string(),hosts:gi.array(),uses:gi.array()}));if(t)throw new ic(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,a=new zo(n),c=!1,l=!1,u;for(let[p,h]of oc)!s&&!c&&a.checkPrivateKey(U$(h))&&(c=!0,u=p),s&&s===h&&(l=!0,u=p);if(!i&&!s&&!c)throw new ic("A suitable private key was not found for this certificate");let d;if(!r){try{d=mC(a)}catch(p){Qe.error?.(p)}if(d==null)throw new ic("Error extracting certificate host name, please provide a name parameter")}let f=Rle(r??d);s&&!c&&!l&&(await Vn.writeFile(hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME,f+".pem"),s),oc.set(f,s));let m={name:r??d,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(m.private_key_name=u??f+".pem"),e.ciphers&&(m.ciphers=e.ciphers),await qd(m),"Successfully added certificate: "+f}o(yle,"addCertificate");function Rle(e){return e.replace(/[^a-z0-9\.]/gi,"-")}o(Rle,"sanitizeName");async function ble(e){let t=aC(e,gi.object({name:gi.string().required()}));if(t)throw new ic(t.message);let{name:r}=e;ac();let n=await nn.get(r);if(!n)throw new ic(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await nn.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(Qe.info?.("Removing private key named",s),await Vn.remove(hr.join(Es.getHdbBasePath(),qs.LICENSE_KEY_DIR_NAME,s)))}return await nn.delete(r),"Successfully removed "+r}o(ble,"removeCertificate");function mC(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||pC(e)[0]}o(mC,"getPrimaryHostName");function pC(e){if(e.subjectAltName)return e.subjectAltName.split(",").map(r=>{let n=r.indexOf(":");if(r=r.slice(n+1),r=r.trim(),r[0]==='"')try{r=JSON.parse(r)}catch{}return r.indexOf("=")>-1?r.match(/CN=([^,]*)/)?.[1]:r}).filter(r=>r);let t=e.subject?.match(/CN=(.*)/)?.[1];return t?[t]:[]}o(pC,"hostnamesFromCert");async function Ale(e){if(e.bypass_auth!==!0)throw new ic("Unauthorized","401");let t=aC(e,gi.object({name:gi.string().required()}));if(t)throw new ic(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await P$()).privateKey;if(r===".jwtPublic")return(await P$()).publicKey;if(oc.get(r))return oc.get(e.name);throw new ic("Key not found")}o(Ale,"getKey");function Ile(e){return[e.subject?.CN,...e.subjectaltname.split(",").filter(t=>t.trim().startsWith("DNS:")).map(t=>t.trim().substring(4))]}o(Ile,"getHostnamesFromCertificate")});var TV={};Re(TV,{BACK_PRESSURE_RATIO_POSITION:()=>_V,CONFIRMATION_STATUS_POSITION:()=>EV,LATENCY_POSITION:()=>ZS,NodeReplicationConnection:()=>Vd,OPERATION_REQUEST:()=>SC,RECEIVED_TIME_POSITION:()=>yC,RECEIVED_VERSION_POSITION:()=>TC,RECEIVING_STATUS_POSITION:()=>RC,RECEIVING_STATUS_RECEIVING:()=>SV,RECEIVING_STATUS_WAITING:()=>gV,SENDING_TIME_POSITION:()=>nh,createWebSocket:()=>eT,databaseSubscriptions:()=>lc,replicateOverWS:()=>sh,tableUpdateListeners:()=>AC});async function eT(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=it(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!_C){let l=(0,dV.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),_C=u.secureContexts}if(i=_C.get(s),i&&le.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let a={};r&&(a.Authorization=r);let c={headers:a,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,mV.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(XS?.caCount!==Qo.size&&(XS=fV.createSecureContext({...i.options,ca:[...Qo,...i.options.availableCAs.values()]}),XS.caCount=Qo.size),c.secureContext=XS),new cV.WebSocket(e,"harperdb-replication-v1",c)}function sh(e,t,r){let n=t.port||t.securePort,s=Ul.pid%1e3+"-"+lV.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3);le.debug?.(s,"Initializing replication connection",r);let i=0,a=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(a.buffer,0,1024),u=t.database,d=t.databaseSubscriptions||lc,f,m,p=!1,h=t.subscription;h?.then&&h.then(A=>{h=A,h.auditStore&&(f=h.auditStore)});let E=t.tables||u&&at()[u],g,R=new Map,S=[];g=r.name,g&&t.connection&&(t.connection.nodeName=g);let y,C,I,k,J,G,H,X=6e4,W,ue=0,ce=0,te=0,ye=aV.default.get(F.REPLICATION_BLOBTIMEOUT)??12e4,Ae=new Map,Ye=[],qe=0,Ar;if(t.url){let A=o(()=>{J&&ce===e._socket?.bytesRead&&te===e._socket?.bytesWritten?e.terminate():(J=performance.now(),e.ping(),ce=e._socket?.bytesRead,te=e._socket?.bytesWritten)},"sendPing");I=setInterval(A,iV).unref(),A()}else tr();e._socket?.setMaxListeners(200);function tr(){clearTimeout(k),ce=e._socket?.bytesRead,te=e._socket?.bytesWritten,k=setTimeout(()=>{ce===e._socket?.bytesRead&&te===e._socket?.bytesWritten&&(le.warn?.(`Timeout waiting for ping from ${g}, terminating connection and reconnecting`),e.terminate())},iV*2).unref()}o(tr,"resetPingTimer");let Wr=0,vr=0,_u=!1,Fc=3e4;function xt(){if(dn?.length>0){let A=performance.now(),U=A-vr;Wr=(Wr*Fc+(_u?U:0))/(Fc+U),m[_V]=Wr,vr=A}}o(xt,"updateBackPressureRatio"),setInterval(xt,Fc).unref();function ri(){if(!(!g||!u))return m||(m=xd(f,u,g)),m}o(ri,"getSharedStatus"),u&&kc(u);let Na,GE,jf=[],qE=[],Qf,Pe=[],$E=[],ab=[],gu=150,Ui=25,Os=0,Jf=0,Xf=!1,Io,On,dn,Ur;e.on("message",Su);async function Su(A){if(r=await r,!r){le.error?.(s,"No authorization provided"),xr(1008,"Unauthorized");return}Zf(A),e.off("message",Su),e.on("message",Zf)}o(Su,"onWSMessageWhenAuthorized");function Zf(A){ue=performance.now();try{let U=A.dataView=new Qc(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let Y=(0,ot.decode)(A),[j,B,Ee]=Y;switch(j){case J$:{if(B){if(g){if(g!==B){le.error?.(s,`Node name mismatch, expecting to connect to ${g}, but peer reported name as ${B}, disconnecting`),e.send((0,ot.encode)([$d])),xr(1008,"Node name mismatch");return}}else if(g=B,t.connection?.tentativeNode){let de=t.connection.tentativeNode;de.name=g,t.connection.tentativeNode=null,Wo(g,de)}if(t.connection&&(t.connection.nodeName=g),le.debug?.(s,"received node name:",g,"db:",u??Y[2]),!u)try{kc(u=Y[2]),u==="system"&&(Na=nc(t,(de,oe)=>{Pa(oe)&&K(oe)}),e.on("close",()=>{Na?.remove()}))}catch(de){le.warn?.(s,"Error setting database",de),e.send((0,ot.encode)([$d])),xr(1008,de.message);return}em()}break}case nV:{le.debug?.(s,"Received table definitions for",B.map(de=>de.table));for(let de of B){let oe=Y[2];de.database=oe;let ke;if(Pa(oe)){if(u==="system")De[oe]?.[de.table]||(ke=L(de,De[oe]?.[de.table]));else{if(oe!=="data"&&!De[oe]){le.warn?.("Database not found",oe);return}ke=L(de,De[oe]?.[de.table])}f||(f=ke?.auditStore),E||(E=at()?.[oe])}}break}case $d:xr();break;case SC:try{let de=r?.replicates||r?.subscribers||r?.name;le.debug?.("Received operation request",B,"from",g),server.operation(B,{user:r},!de).then(oe=>{le.debug?.("Requested request from finished",g,oe),Array.isArray(oe)&&(oe={results:oe}),oe.requestId=B.requestId,e.send((0,ot.encode)([zS,oe]))},oe=>{le.debug?.("Failed requested operation from",g,oe),e.send((0,ot.encode)([zS,{requestId:B.requestId,error:hC(oe)}]))})}catch(de){e.send((0,ot.encode)([zS,{requestId:B.requestId,error:hC(de)}]))}break;case zS:let{resolve:fe,reject:pe}=R.get(B.requestId);le.debug?.("Received completed operation request",g,B),B.error?pe(new Error(B.error)):fe(B),R.delete(B.requestId);break;case EC:let ne=Y[3];if(!E){u?le.error?.(s,"No database found for",u):le.error?.(s,"Database name never received"),xr();return}let ie=E[ne];ie=L({table:ne,database:u,attributes:B.attributes,schemaDefined:B.schemaDefined},ie),jf[Ee]={name:ne,decoder:new ot.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:B.typedStructs,structures:B.structures}),getEntry(de){return ie.primaryStore.getEntry(de)},rootStore:ie.primaryStore.rootStore};break;case X$:Ur=f?_$(B,f):new Map,Qf=Y[2],le.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${Qf}`);break;case Z$:let xe=Ee;ab[xe]=B;break;case rV:ri()[EV]=B,le.trace?.(s,"received and broadcasting committed update",B),ri().buffer.notify();break;case tV:y=B,h.send({type:"end_txn",localTime:y,remoteNodeIds:S});break;case jS:{let de=Y[1],{fileId:oe,size:ke,finished:Be,error:Le}=de,Me=Ae.get(oe);le.debug?.("Received blob",oe,"has stream",!!Me,"connectedToBlob",!!Me?.connectedToBlob,"length",Y[2].length,"finished",Be),Me||(Me=new gC.PassThrough,Me.expectedSize=ke,Ae.set(oe,Me)),Me.lastChunk=Date.now();let pt=Y[2];Ve(pt.byteLength,"bytes-received",`${g}.${u}`,"replication","blob");try{Be?(Le?(Me.on("error",()=>{}),Me.destroy(new Error("Blob error: "+Le+" for record "+(Me.recordId??"unknown")+" from "+remote_node_name))):Me.end(pt),Me.connectedToBlob&&Ae.delete(oe)):Me.write(pt)}catch(wt){le.error?.(`Error receiving blob for ${Me.recordId} from ${g} and streaming to storage`,wt),Ae.delete(oe)}break}case eV:{let de=B,oe;try{let ke=Y[3],Be=qE[Ee]||(qE[Ee]=E[Y[4]]);if(!Be)return le.warn?.("Unknown table id trying to handle record request",Ee);let Le=Be.primaryStore.getBinaryFast(Symbol.for("structures")),Me=Le?.length??0;if(Me>0&&Me!==Jf){Jf=Me;let wt=(0,ot.decode)(Le);e.send((0,ot.encode)([EC,{typedStructs:wt.typed,structures:wt.named},Ee,Be.tableName]))}let pt=Be.primaryStore.getBinaryFast(ke);if(pt){let wt=Be.primaryStore.decoder.decode(pt,{valueAsBuffer:!0}),Et=ct||{};Et.version=(0,pV.getLastVersion)(),ct&&ct[xu]&Jr&&(wt=Buffer.from(wt),Nm(()=>Be.primaryStore.decoder.decode(pt),KE=>Ca(KE,ke),Be.primaryStore.rootStore)),oe=(0,ot.encode)([WS,de,{value:wt,expiresAt:Et.expiresAt,version:Et.version,residencyId:Et.residencyId,nodeId:Et.nodeId,user:Et.user}])}else oe=(0,ot.encode)([WS,de])}catch(ke){oe=(0,ot.encode)([WS,de,{error:ke.message}])}e.send(oe);break}case WS:{let{resolve:de,reject:oe,tableId:ke,key:Be}=R.get(Y[1]),Le=Y[2];if(Le?.error)oe(new Error(Le.error));else if(Le){let Me;N_(()=>{let pt=jf[ke].decoder.decode(Le.value);Le.value=pt,Le.key=Be,de(Le)||Me&&setTimeout(()=>Me.forEach(A_),6e4).unref()},f?.rootStore,pt=>{let wt=Oa(pt,Be);return Me||(Me=[]),Me.push(wt),wt})}else de();R.delete(Y[1]);break}case Q$:{dn=B;let de,oe,ke=!1;if(h){if(u!==h.databaseName&&!h.then){le.error?.("Subscription request for wrong database",u,h.databaseName);return}}else h=d.get(u);if(le.debug?.(s,"received subscription request for",u,"at",dn),!h){let Ce;h=new Promise(Kt=>{le.debug?.("Waiting for subscription to database "+u),Ce=Kt}),h.ready=Ce,lc.set(u,h)}if(r.name)oe=jt().subscribe(r.name),oe.then(async Ce=>{de=Ce;for await(let Kt of de){let Bt=Kt.value;if(!(Bt?.replicates===!0||Bt?.replicates?.receives||Bt?.subscriptions?.some(Br=>(Br.database||Br.schema)===u&&Br.publish!==!1))){ke=!0,e.send((0,ot.encode)([$d])),xr(1008,`Unauthorized database subscription to ${u}`);return}}},Ce=>{le.error?.(s,"Error subscribing to HDB nodes",Ce)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,ot.encode)([$d])),xr(1008,`Unauthorized database subscription to ${u}`);return}if(On&&(le.debug?.(s,"stopping previous subscription",u),On.emit("close")),dn.length===0)return;let Be=dn[0],Le=o(Ce=>{if(Ce&&(Be.replicateByDefault?!Be.tables.includes(Ce.tableName):Be.tables.includes(Ce.tableName)))return{table:Ce}},"tableToTableEntry"),Me={txnTime:0},pt,wt,Et=1/0,KE,YE=o((Ce,Kt)=>{if(Ce.type==="end_txn"){Me.txnTime&&(a[i]!==66&&le.error?.("Invalid encoding of message"),N(9),N(F_),O(KE=Kt),$M()),i=c,Me.txnTime=0;return}let Bt=Ce.nodeId,Br=Ce.tableId,Nt=wt[Br];if(!Nt&&(Nt=wt[Br]=Le(h.tableById[Br]),!Nt))return le.debug?.("Not subscribed to table",Br);let Ps=Nt.table,Ft=Ps.primaryStore,ni=Ft.encoder;(Ce.extendedType&j_||!ni.typedStructs)&&(ni._mergeStructures(ni.getStructures()),ni.typedStructs&&(ni.lastTypedStructuresLength=ni.typedStructs.length));let Ru=pt[Bt];if(!(Ru&&Ru.startTime<Kt&&(!Ru.endTime||Ru.endTime>Kt)))return JS&&le.trace?.(s,"skipping replication update",Ce.recordId,"to:",g,"from:",Bt,"subscribed:",pt),VM();JS&&le.trace?.(s,"sending replication update",Ce.recordId,"to:",g,"from:",Bt,"subscribed:",pt);let cb=Ce.version;Me.txnTime!==cb&&(Me.txnTime&&(JS&&le.trace?.(s,"new txn time, sending queued txn",Me.txnTime),a[i]!==66&&le.error?.("Invalid encoding of message"),$M()),Me.txnTime=cb,i=c,O(cb));let Hc=Ce.residencyId,lb=VE(Hc,Ps),WE;if(lb&&!lb.includes(g)){let xi=VE(Ce.previousResidencyId,Ps);if(xi&&!xi.includes(g)&&(Ce.type==="put"||Ce.type==="patch")||Ps.getResidencyById)return VM();let Gc=Ce.recordId;le.trace?.(s,"sending invalidation",Gc,g,"from",Bt);let tm=0;Hc&&(tm|=Jc),Ce.previousResidencyId&&(tm|=Xc);let fb,zE=null;for(let KM in Ps.indices){if(!zE){if(fb=Ce.getValue(Ft,!0),!fb)break;zE={}}zE[KM]=fb[KM]}WE=Zc(Ce.version,Br,Gc,null,Bt,Ce.user,Ce.type==="put"||Ce.type==="patch"?"invalidate":Ce.type,ni.encode(zE),tm,Hc,Ce.previousResidencyId,Ce.expiresAt)}function VM(){return le.trace?.(s,"skipping audit record",Ce.recordId),G||(G=setTimeout(()=>{G=null,(KE||0)+sV/2<Et&&(JS&&le.trace?.(s,"sending skipped sequence update",Et),e.send((0,ot.encode)([tV,Et])))},sV).unref()),new Promise(setImmediate)}o(VM,"skipAuditRecord");let ub=ni.typedStructs,db=ni.structures;if((ub?.length!=Nt.typed_length||db?.length!=Nt.structure_length)&&(Nt.typed_length=ub?.length,Nt.structure_length=db.length,le.debug?.(s,"send table struct",Nt.typed_length,Nt.structure_length),Nt.sentName||(Nt.sentName=!0),e.send((0,ot.encode)([EC,{typedStructs:ub,structures:db,attributes:Ps.attributes,schemaDefined:Ps.schemaDefined},Br,Nt.table.tableName]))),Hc&&!$E[Hc]&&(e.send((0,ot.encode)([Z$,lb,Hc])),$E[Hc]=!0),WE)N(WE.length),P(WE);else{let xi=Ce.encoded;Ce.extendedType&Jr&&Nm(()=>Ce.getValue(Ft),tm=>Ca(tm,Ce.recordId),Ft.rootStore);let Gc=xi[0]===66?8:0;N(xi.length-Gc),P(xi,Gc),le.trace?.("wrote record",Ce.recordId,"length:",xi.length)}if(e._socket.writableNeedDrain){let xi=performance.now();return _u=!0,xt(),new Promise(Gc=>{le.debug?.(`Waiting for remote node ${g} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",()=>{Gc(),_u=!1,xt()})})}else return qe>Ui?new Promise(xi=>{Ar=xi}):new Promise(setImmediate)},"sendAuditRecord"),$M=o(()=>{c-i>8?(e.send(a.subarray(i,c)),le.debug?.(s,"Sent message, size:",c-i),u!=="system"&&Ve(c-i,"bytes-sent",`${g}.${u}`,"replication","egress")):le.debug?.(s,"skipping empty transaction")},"sendQueuedData");On=new bC.EventEmitter,On.once("close",()=>{ke=!0,de?.end()});for(let{startTime:Ce}of dn)Ce<Et&&(Et=Ce);(oe||Promise.resolve()).then(async()=>{h=await h,f=h.auditStore,wt=h.tableById.map(Le),pt=[];for(let{name:Kt,startTime:Bt,endTime:Br}of dn){let Nt=FS(Kt,f);le.debug?.("subscription to",Kt,"using local id",Nt,"starting",Bt),pt[Nt]={startTime:Bt,endTime:Br}}K(u),Na||(Na=Ol(Kt=>{Kt.databaseName===u&&K(u)}),GE=Bp(Kt=>{Kt===u&&(e.send((0,ot.encode)([$d])),xr())}),e.on("close",()=>{Na?.remove(),GE?.remove()})),e.send((0,ot.encode)([X$,zp(h.auditStore),dn.map(({name:Kt})=>Kt)]));let Ce=!0;do{isFinite(Et)||(le.warn?.("Invalid sequence id "+Et),xr(1008,"Invalid sequence id"+Et));let Kt;if(Ce&&!ke&&(Ce=!1,Et===0)){le.info?.("Replicating all tables to",g);let Bt=Et,Br=tT(f);for(let Nt in E){if(!Le(Nt))continue;let Ps=E[Nt];for(let Ft of Ps.primaryStore.getRange({snapshot:!1,versions:!0})){if(ke)return;if(Ft.localTime>=Et){le.trace?.(s,"Copying record from",u,Nt,Ft.key,Ft.localTime),Bt=Math.max(Ft.localTime,Bt),Kt=!0,ri()[nh]=1;let ni=Zc(Ft.version,Ps.tableId,Ft.key,null,Br,null,"put",Nm(()=>Ps.primaryStore.encoder.encode(Ft.value),Ru=>Ca(Ru,Ft.key)),Ft.metadataFlags&-256,Ft.residencyId,null,Ft.expiresAt);await YE({recordId:Ft.key,tableId:Ps.tableId,type:"put",getValue(){return Ft.value},encoded:ni,version:Ft.version,residencyId:Ft.residencyId,nodeId:Br,extendedType:Ft.metadataFlags},Ft.localTime)}}}Kt&&YE({type:"end_txn"},Et),ri()[nh]=0,Et=Bt}for(let{key:Bt,value:Br}of f.getRange({start:Et||1,exclusiveStart:!0,snapshot:!1})){if(ke)return;let Nt=At(Br);le.debug?.("sending audit record",Bt,Nt.recordId),ri()[nh]=Bt,Et=Bt,await YE(Nt,Bt),On.startTime=Bt,Kt=!0}Kt&&YE({type:"end_txn"},Et),ri()[nh]=0,await r0(f)}while(!ke)}).catch(Ce=>{le.error?.(s,"Error handling subscription to node",Ce),xr(1008,"Error handling subscription to node")});break}}return}U.position=8;let w=!0,D,$;do{ri();let Y=U.readInt();if(Y===9&&U.getUint8(U.position)==F_){U.position++,y=$=U.readFloat64(),m[TC]=y,m[yC]=Date.now(),m[RC]=gV,le.trace?.("received remote sequence update",y,u);break}let j=U.position,B=At(A,j,j+Y),Ee=jf[B.tableId];Ee||le.error?.(`No table found with an id of ${B.tableId}`);let fe;B.residencyId&&(fe=ab[B.residencyId],le.trace?.(s,"received residency list",fe,B.type,B.recordId));try{let pe=B.recordId;N_(()=>{D={table:Ee.name,id:B.recordId,type:B.type,nodeId:Ur.get(B.nodeId),residencyList:fe,timestamp:B.version,value:B.getValue(Ee),user:B.user,beginTxn:w,expiresAt:B.expiresAt}},f?.rootStore,ne=>Oa(ne,pe))}catch(pe){throw pe.message+="typed structures for current decoder"+JSON.stringify(Ee.decoder.typedStructs),pe}w=!1,le.debug?.(s,"received replication message",B.type,"id",D.id,"version",new Date(B.version),"nodeId",D.nodeId),m[TC]=B.version,m[yC]=Date.now(),m[RC]=SV,h.send(D),U.position=j+Y}while(U.position<A.byteLength);Os++,u!=="system"&&Ve(A.byteLength,"bytes-received",`${g}.${u}.${D?.table||"unknown_table"}`,"replication","ingest"),Os>gu&&!Xf&&(Xf=!0,e.pause(),le.debug?.(`Commit backlog causing replication back-pressure, requesting that ${g} pause replication`)),h.send({type:"end_txn",localTime:y,remoteNodeIds:S,async onCommit(){if(D){let Y=Date.now()-D.timestamp;u!=="system"&&Ve(Y,"replication-latency",g+"."+u+"."+D.table,D.type,"ingest")}Os--,Xf&&(Xf=!1,e.resume(),le.debug?.(`Replication resuming ${g}`)),Ye.length>0&&await Promise.all(Ye),le.trace?.("All blobs finished"),!C&&$&&(le.trace?.(s,"queuing confirmation of a commit at",$),setTimeout(()=>{e.send((0,ot.encode)([rV,C])),le.trace?.(s,"sent confirmation of a commit at",C),C=null},Cle)),C=$,le.debug?.("last sequence committed",new Date($),u)}})}catch(U){le.error?.(s,"Error handling incoming replication message",U)}}o(Zf,"onWSMessage"),e.on("ping",tr),e.on("pong",()=>{if(t.connection){let A=performance.now()-J;t.connection.latency=A,ri()&&(m[ZS]=A),t.isSubscriptionConnection&&Dl({name:g,database:u,url:t.url,latency:A})}J=null}),e.on("close",(A,U)=>{clearInterval(I),clearTimeout(k),clearInterval(H),On&&On.emit("close"),Io&&Io.end();for(let[w,{reject:D}]of R)D(new Error(`Connection closed ${U?.toString()} ${A}`));le.debug?.(s,"closed",A,U?.toString())});function xr(A,U){try{e.isFinished=!0,le.debug?.(s,"closing",g,u,A,U),e.close(A,U),t.connection?.emit("finished")}catch(w){le.error?.(s,"Error closing connection",w)}}o(xr,"close");let Tu=new Set;async function Ca(A,U){let w=I_(A);if(Tu.has(w)){le.debug?.("Blob already being sent",w);return}Tu.add(w);try{let D;qe++;for await(let $ of A.stream())D&&(le.debug?.("Sending blob chunk",w,"length",D.length),e.send((0,ot.encode)([jS,{fileId:w,size:A.size},D]))),D=$,e._socket.writableNeedDrain&&(le.debug?.("draining",w),await new Promise(Y=>e._socket.once("drain",Y)),le.debug?.("drained",w)),Ve($.length,"bytes-sent",`${g}.${u}`,"replication","blob");le.debug?.("Sending final blob chunk",w,"length",D.length),e.send((0,ot.encode)([jS,{fileId:w,size:A.size,finished:!0},D]))}catch(D){le.warn?.("Error sending blob",D,"blob id",w,"for record",U),e.send((0,ot.encode)([jS,{fileId:w,finished:!0,error:hC(D)},Buffer.alloc(0)]))}finally{Tu.delete(w),qe--,qe<Ui&&Ar?.()}}o(Ca,"sendBlobs");function Oa(A,U){let w=I_(A),D=Ae.get(w);le.debug?.("Received transaction with blob",w,"has stream",!!D,"ended",!!D?.writableEnded),D?D.writableEnded&&Ae.delete(w):(D=new gC.PassThrough,Ae.set(w,D)),D.connectedToBlob=!0,D.lastChunk=Date.now(),D.recordId=U,A.size===void 0&&D.expectedSize&&(A.size=D.expectedSize);let $=D.blob??createBlob(D,A);D.blob=$;let Y=vo(()=>wm($).saving,h.auditStore?.rootStore);return Y&&(Y.blobId=w,Ye.push(Y),Y.finally(()=>{le.debug?.(`Finished receiving blob stream ${w}`),Ye.splice(Ye.indexOf(Y),1)})),$}o(Oa,"receiveBlobs");function em(){if(p||(p=!0,t.connection?.on("subscriptions-updated",em)),!f&&h&&(f=h.auditStore),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let A=new Map;f||(f=h?.auditStore);try{for(let D of h?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let $ of D.value.nodes||[])$.lastTxnTime>(A.get($.id)??0)&&A.set($.id,$.lastTxnTime)}catch(D){if(!D.message.includes("Can not re"))throw D}let U=t.connection?.nodeSubscriptions?.[0];S=[];let w=t.connection?.nodeSubscriptions.map((D,$)=>{let Y=[],{replicateByDefault:j}=D;if(D.subscriptions){for(let pe of D.subscriptions)if(pe.subscribe&&(pe.schema||pe.database)===u){let ne=pe.table;E?.[ne]?.replicate!==!1&&Y.push(ne)}j=!1}else for(let pe in E)(j?E[pe].replicate===!1:E[pe].replicate)&&Y.push(pe);let B=f&&FS(D.name,f),Ee=h?.dbisDB?.get([Symbol.for("seq"),B])??1,fe=Math.max(Ee?.seqId??1,(typeof D.startTime=="string"?new Date(D.startTime).getTime():D.startTime)??1);if(le.debug?.("Starting time recorded in db",D.name,B,u,Ee?.seqId,"start time:",fe,new Date(fe)),U!==D){let pe=f&&FS(U.name,f),ne=h?.dbisDB?.get([Symbol.for("seq"),pe])??1;for(let ie of ne?.nodes||[])ie.name===D.name&&(fe=ie.seqId,le.debug?.("Using sequence id from proxy node",U.name,fe))}if(B===void 0?le.warn("Starting subscription request from node",D,"but no node id found"):S.push(B),A.get(B)>fe&&(fe=A.get(B),le.debug?.("Updating start time from more recent txn recorded",U.name,fe)),fe===1&&QS)try{new URL(QS).hostname===D.name?(le.warn?.(`Requesting full copy of database ${u} from ${QS}`),fe=0):fe=Date.now()-6e4}catch(pe){le.error?.("Error parsing leader URL",QS,pe)}return le.trace?.(s,"defining subscription request",D.name,u,new Date(fe)),{name:D.name,replicateByDefault:j,tables:Y,startTime:fe,endTime:D.endTime}});if(w)if(le.debug?.(s,"sending subscription request",w,h?.dbisDB?.path),clearTimeout(W),w.length>0)e.send((0,ot.encode)([Q$,w]));else{let D=o(()=>{let $=performance.now();W=setTimeout(()=>{ue<=$?xr(1008,"Connection has no subscriptions and is no longer used"):D()},X).unref()},"scheduleClose");D()}}o(em,"sendSubscriptionRequestUpdate");function VE(A,U){if(!A)return;let w=Pe[A];return w||(w=U.getResidencyRecord(A),Pe[A]=w),w}o(VE,"getResidence");function Pa(A){return!(cc&&cc!="*"&&!cc[A]&&!cc.includes?.(A)&&!cc.some?.(U=>U.name===A))}o(Pa,"checkDatabaseAccess");function kc(A){if(h=h||d.get(A),!Pa(A))throw new Error(`Access to database "${A}" is not permitted`);h||le.warn?.(`No database named "${A}" was declared and registered`),f=h?.auditStore,E||(E=at()?.[A]);let U=it();if(U===g)throw U?new Error("Should not connect to self",U):new Error("Node name not defined");return yu(U,A),!0}o(kc,"setDatabase");function yu(A,U){let w=at()?.[U],D=[];for(let $ in w){let Y=w[$];D.push({table:$,schemaDefined:Y.schemaDefined,attributes:Y.attributes.map(j=>({name:j.name,type:j.type,isPrimaryKey:j.isPrimaryKey}))})}le.trace?.("Sending database info for node",A,"database name",U),e.send((0,ot.encode)([J$,A,U,D]))}o(yu,"sendNodeDBName");function K(A){let U=at()?.[A],w=[];for(let D in U){if(dn&&!dn.some(Y=>Y.replicateByDefault?!Y.tables.includes(D):Y.tables.includes(D)))continue;let $=U[D];w.push({table:D,schemaDefined:$.schemaDefined,attributes:$.attributes.map(Y=>({name:Y.name,type:Y.type,isPrimaryKey:Y.isPrimaryKey}))})}e.send((0,ot.encode)([nV,w,A]))}o(K,"sendDBSchema"),H=setInterval(()=>{for(let[A,U]of Ae)U.lastChunk+ye<Date.now()&&(le.warn?.(`Timeout waiting for blob stream to finish ${A} for record ${U.recordId??"unknown"} from ${g}`),Ae.delete(A),U.end())},ye).unref();let _=1,T=[];return{end(){Io&&Io.end(),On&&On.emit("close")},getRecord(A){let U=_++;return new Promise((w,D)=>{let $=[eV,U,A.table.tableId,A.id];T[A.table.tableId]||($.push(A.table.tableName),T[A.table.tableId]=!0),e.send((0,ot.encode)($)),ue=performance.now(),R.set(U,{tableId:A.table.tableId,key:A.id,resolve(Y){let{table:j,entry:B}=A;if(w(Y),Y)return j._recordRelocate(B,Y)},reject:D})})},sendOperation(A){let U=_++;return A.requestId=U,e.send((0,ot.encode)([SC,A])),new Promise((w,D)=>{R.set(U,{resolve:w,reject:D})})}};function N(A){x(5),A<128?a[c++]=A:A<16384?(l.setUint16(c,A|32768),c+=2):A<1056964608?(l.setUint32(c,A|3221225472),c+=4):(a[c]=255,l.setUint32(c+1,A),c+=5)}function P(A,U=0,w=A.length){let D=w-U;x(D),A.copy(a,c,U,w),c+=D}function O(A){x(8),l.setFloat64(c,A),c+=8}function x(A){if(A+16>a.length-c){let U=Buffer.allocUnsafeSlow(c+A-i+65536>>10<<11);a.copy(U,0,i,c),c=c-i,i=0,a=U,l=new DataView(a.buffer,0,a.length)}}function L(A,U){let w=A.database??"data";U||(U={});let D=U.schemaDefined,$=!1,Y=A.schemaDefined,j=U.attributes||[];for(let B=0;B<A.attributes?.length;B++){let Ee=A.attributes[B],fe=j.find(pe=>pe.name===Ee.name);(!fe||fe.type!==Ee.type)&&(D?le.error?.(`Schema for '${u}.${A.table}' is defined locally, but attribute '${Ee.name}: ${Ee.type}' from '${g}' does not match local attribute ${fe?"'"+fe.name+": "+fe.type+"'":"which does not exist"}`):($=!0,Y||(Ee.indexed=!0),fe?j[j.indexOf(fe)]=Ee:j.push(Ee)))}return $?(le.debug?.("(Re)creating",A),Ze({table:A.table,database:A.database,schemaDefined:A.schemaDefined,attributes:j,...U})):U}}var aV,ot,cV,lV,uV,bC,dV,fV,Ul,mV,gC,pV,hV,wle,hC,le,Q$,J$,X$,$d,Z$,EC,eV,WS,SC,zS,tV,rV,nV,jS,EV,TC,yC,nh,ZS,RC,_V,gV,SV,Nle,QS,AC,lc,JS,sV,Cle,iV,_C,XS,oV,Vd,IC=se(()=>{we();Fi();tC();HA();hs();aV=b(me());q();el();ot=require("msgpackr"),cV=require("ws"),lV=require("worker_threads"),uV=b(Q());eh();bC=require("events"),dV=b(_s()),fV=b(require("node:tls"));Fd();Ul=b(require("node:process")),mV=require("node:net");ts();es();gC=require("node:stream"),pV=require("lmdb"),hV=b(require("minimist")),{forComponent:wle,errorToString:hC}=uV.default,le=wle("replication").conditional,Q$=129,J$=140,X$=141,$d=142,Z$=130,EC=132,eV=133,WS=134,SC=136,zS=137,tV=143,rV=144,nV=145,jS=146,EV=0,TC=1,yC=2,nh=3,ZS=4,RC=5,_V=6,gV=0,SV=1,Nle=(0,hV.default)(Ul.argv),QS=Nle.HDB_LEADER_URL??Ul.env.HDB_LEADER_URL,AC=new Map,lc=new Map,JS=!0,sV=300,Cle=2,iV=3e4;o(eT,"createWebSocket");oV=500,Vd=class extends bC.EventEmitter{static{o(this,"NodeReplicationConnection")}socket;startTime;retryTime=oV;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;url;subscription;databaseName;nodeName;authorization;constructor(t,r,n,s,i){super(),this.url=t,this.subscription=r,this.databaseName=n,this.authorization=i,this.nodeName=this.nodeName??_i(t)}async connect(){this.session||this.resetSession();let t=[];this.socket=await eT(this.url,{serverName:this.nodeName,authorization:this.authorization});let r;le.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${Ul.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),le[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=oV,this.nodeSubscriptions&&Dl({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,r=sh(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(r)}),this.socket.on("error",n=>{n.code==="SELF_SIGNED_CERT_IN_CHAIN"?(le.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),n.isHandled=!0):n.code!=="ECONNREFUSED"&&(n.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?le.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`):le.error?.(`Error in connection to ${this.url} due to ${n.message}`)),this.sessionReject(n)}),this.socket.on("close",(n,s)=>{if(this.isConnected&&(this.nodeSubscriptions&&Hd({name:this.nodeName,database:this.databaseName,url:this.url,finished:this.socket.isFinished}),this.isConnected=!1),this.removeAllListeners("subscriptions-updated"),this.socket.isFinished){this.isFinished=!0,r?.end(),this.emit("finished");return}if(++this.retries%20===1){let i=s?.toString();le.warn?.(`${r?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${i?'"'+i+'" ':""}(code: ${n})`)}r=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((t,r)=>{this.sessionResolve=t,this.sessionReject=r})}subscribe(t,r){this.nodeSubscriptions=t,this.replicateTablesByDefault=r,this.emit("subscriptions-updated",t)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(t){return this.session.then(r=>r.getRecord(t))}};o(sh,"replicateOverWS")});function ih(e){return e===RV||e===Ole}function Ple(e){return e===bV||e===AV}function wC(e){return e===RV?bV:AV}function Lle(){if(yV)return;yV=!0;let e=xl.CryptoEngine.prototype,t=xl.Certificate.prototype,r={getHashAlgorithm:e.getHashAlgorithm,getAlgorithmByOID:e.getAlgorithmByOID,getAlgorithmParameters:e.getAlgorithmParameters,verifyWithPublicKey:e.verifyWithPublicKey,certificateVerify:t.verify,getPublicKey:t.getPublicKey};e.getHashAlgorithm=function(...n){let[s]=n;return ih(s.algorithmId)?"UNUSED-EDDSA-BUILTIN-HASH":r.getHashAlgorithm.call(this,s)},e.getAlgorithmByOID=function(...n){let[s]=n;return ih(s)?{name:wC(s)}:r.getAlgorithmByOID.call(this,...n)},e.getAlgorithmParameters=function(...n){let[s,i]=n;return Ple(s)?{algorithm:{name:s},usages:i==="sign"?["sign"]:["verify"]}:r.getAlgorithmParameters.call(this,...n)},t.getPublicKey=async function(...n){let[,s=xl.getCrypto(!0)]=n,i=this.subjectPublicKeyInfo.algorithm.algorithmId;if(ih(i)){let a=wC(i);return s.importKey("spki",this.subjectPublicKeyInfo.toSchema().toBER(!1),a,!0,["verify"])}return r.getPublicKey.call(this,...n)},t.verify=async function(...n){let[s]=n;if(ih(this.signatureAlgorithm.algorithmId))try{let i=this.toSchema().toBER(!1),a=s.toSchema().toBER(!1),c=new oh.X509Certificate(Buffer.from(i)),l=new oh.X509Certificate(Buffer.from(a));return c.verify(l.publicKey)}catch{return!1}return r.certificateVerify.call(this,...n)},r.verifyWithPublicKey&&(e.verifyWithPublicKey=async function(...n){let[s,i,a]=n,c=a.algorithm.algorithmId;if(ih(c)){let l=wC(c);try{let u=this.crypto?.subtle||this.subtle||xl.getCrypto(!0)?.subtle||oh.webcrypto?.subtle;if(!u)throw new Error("No crypto.subtle available");let d=await u.importKey("spki",a.toSchema().toBER(!1),l,!1,["verify"]),f=i.valueBlock.valueHexView;return i.valueBlock.unusedBits>0&&(f=f.slice(0,f.length-1)),await u.verify(l,d,f,s)}catch{return!1}}return r.verifyWithPublicKey.call(this,...n)})}var xl,oh,RV,Ole,bV,AV,yV,IV=se(()=>{xl=b(require("pkijs")),oh=require("node:crypto"),RV="1.3.101.112",Ole="1.3.101.113",bV="Ed25519",AV="Ed448",yV=!1;o(ih,"isEd25519OrEd448");o(Ple,"isEdDSAAlgorithmName");o(wC,"getEdDSAAlgorithmName");o(Lle,"applyEd25519Patch");Lle()});function Dle(){return rT||(rT=Ze({table:"hdb_certificate_cache",database:"system",attributes:[{name:"certificate_id",isPrimaryKey:!0},{name:"status"},{name:"reason"},{name:"checked_at"},{name:"expiresAt",expiresAt:!0,indexed:!0},{name:"method"}]}),rT.sourcedFrom(NC)),rT}function Mle(e){if(ht.trace?.("getCertificateVerificationConfig called with:",{mtlsConfig:e}),!e)return!1;if(e===!0)return ht.debug?.("mTLS enabled with default certificate verification"),{};let t=e.certificateVerification;return ht.trace?.("Certificate verification config:",{verificationConfig:t}),t==null?{}:t===!1?!1:t===!0?{}:t}async function Kd(e,t){ht.debug?.("verifyCertificate called for:",e.subject?.CN||"unknown");let r=Mle(t);if(r===!1)return ht.debug?.("Certificate verification disabled"),{valid:!0,status:"disabled",method:"disabled"};let n=xle(e);return ht.trace?.("Certificate chain length:",n.length),n.length===1&&!n[0].issuer?(ht.debug?.("Certificate without issuer - cannot perform OCSP check"),{valid:!0,status:"no-issuer-cert",method:"disabled"}):n.length<2||!n[0].issuer?(ht.debug?.("Certificate chain too short for revocation checking"),{valid:!0,status:"insufficient-chain",method:"disabled"}):vle(n[0].cert,n[0].issuer,r)}async function vle(e,t,r){ht.debug?.("verifyOCSP called");try{Buffer.isBuffer(e)&&(e=wV(e,"CERTIFICATE")),Buffer.isBuffer(t)&&(t=wV(t,"CERTIFICATE"));let n={certPem:e,issuerPem:t,method:"ocsp"},i=`ocsp:${(0,NV.createHash)("sha256").update(JSON.stringify(n)).digest("hex")}`;ht.trace?.("OCSP cache key:",i);let c=await Dle().get(i,{certPem:e,issuerPem:t,config:r||{}});if(!c)return(r?.failureMode??Jo.failureMode)==="fail-closed"?{valid:!1,status:"error",error:"Cache fetch failed",method:"ocsp"}:(ht.warn?.("OCSP cache fetch failed, allowing connection (fail-open mode)"),{valid:!0,status:"error-allowed",method:"ocsp"});let l=c,u=c.wasLoadedFromSource?.();if(ht.trace?.(`OCSP ${u?"source fetch":"cache hit"} for certificate`),l.status==="unknown"&&u&&(l.reason==="ocsp-error"||l.reason==="timeout"||l.reason==="OCSP timeout")){let m=(r?.failureMode??Jo.failureMode)==="fail-closed";return m||ht.warn?.("OCSP check failed, allowing connection (fail-open mode)"),{valid:!m,status:m?l.status:"error-allowed",cached:!u,method:l.method||"ocsp"}}return{valid:l.status==="good",status:l.status,cached:!u,method:l.method||"ocsp"}}catch(n){return ht.error?.("OCSP verification error:",n),(r?.failureMode??Jo.failureMode)==="fail-closed"?{valid:!1,status:"error",error:n.message,method:"ocsp"}:(ht.warn?.("OCSP check failed, allowing connection (fail-open mode)"),{valid:!0,status:"error-allowed",method:"ocsp"})}}async function Ule(e,t,r){ht.trace?.("Performing OCSP check with timeout:",r);try{(0,nT.getCertURLs)(e)}catch(n){return ht.debug?.("Certificate does not contain OCSP URL:",n.message),{status:"unknown",reason:"no-ocsp-url"}}try{let n=await(0,nT.getCertStatus)(e,{ca:t,timeout:r});switch(ht.debug?.("OCSP response:",n.status),n.status){case"good":return{status:"good"};case"revoked":return{status:"revoked",reason:n.revocationReason?.toString()||"unspecified"};default:return{status:"unknown",reason:"unknown-status"}}}catch(n){let s=n;return ht.debug?.("OCSP check failed:",s.message),{status:"unknown",reason:s.name==="AbortError"?"timeout":"ocsp-error"}}}function wV(e,t){let r=e.toString("base64"),n=[`-----BEGIN ${t}-----`];for(let s=0;s<r.length;s+=64)n.push(r.substring(s,s+64));return n.push(`-----END ${t}-----`),n.join(`
18
- `)}function xle(e){let t=[],r=e;for(;r?.raw;){let n={cert:r.raw};if(r.issuerCertificate&&r.issuerCertificate!==r&&r.issuerCertificate.raw&&(n.issuer=r.issuerCertificate.raw),t.push(n),r.issuerCertificate&&r.issuerCertificate!==r)r=r.issuerCertificate;else break}return t}var nT,NV,CV,ht,NC,Jo,rT,sT=se(()=>{IV();nT=require("easy-ocsp"),NV=require("node:crypto"),CV=b(Zn());we();Ga();ht=(0,CV.loggerWithTag)("cert-verification"),NC=class extends Hr{static{o(this,"CertificateVerificationSource")}async get(t){ht.debug?.("CertificateVerificationSource.get called for:",t);let r=this.getContext(),n=r?.requestContext;if(!n||!n.certPem||!n.issuerPem)throw new Error(`No certificate data provided for cache key: ${t}`);let{certPem:s,issuerPem:i,config:a}=n;ht.trace?.("Performing OCSP check with config:",a);try{let c=a?.timeout??Jo.timeout,l=await Promise.race([Ule(s,i,c),new Promise((m,p)=>setTimeout(()=>p(new Error("OCSP timeout")),c))]);if(ht.debug?.("OCSP check result:",l),l.status==="unknown"&&(l.reason==="ocsp-error"||l.reason==="timeout"||l.reason==="no-ocsp-url")){let m=a?.failureMode??Jo.failureMode;if(ht.error?.("OCSP check failed:",l.reason),m==="fail-closed"){let p=a?.errorCacheTtl??Jo.errorCacheTtl,h=Date.now()+p;return r&&(r.expiresAt=h),{certificate_id:t,status:l.status,reason:l.reason,checked_at:Date.now(),expiresAt:h,method:"ocsp"}}else return ht.warn?.("OCSP check failed, allowing connection (fail-open mode)"),null}let d=a?.cacheTtl??Jo.cacheTtl,f=Date.now()+d;return r&&(r.expiresAt=f),{certificate_id:t,status:l.status,reason:l.reason,checked_at:Date.now(),expiresAt:f,method:"ocsp"}}catch(c){if(ht.error?.("OCSP verification error:",c),(a?.failureMode??Jo.failureMode)==="fail-closed"){let u=a?.errorCacheTtl??Jo.errorCacheTtl,d=Date.now()+u;return r&&(r.expiresAt=d),{certificate_id:t,status:"unknown",reason:c.message,checked_at:Date.now(),expiresAt:d,method:"ocsp"}}return ht.warn?.("OCSP check failed, allowing connection (fail-open mode)"),null}}},Jo={timeout:5e3,cacheTtl:36e5,errorCacheTtl:3e5,failureMode:"fail-open"};o(Dle,"getCertificateCacheTable");o(Mle,"getCertificateVerificationConfig");o(Kd,"verifyCertificate");o(vle,"verifyOCSP");o(Ule,"performOCSPCheck");o(wV,"bufferToPem");o(xle,"extractCertificateChain")});var jo={};Re(jo,{clearThisNodeName:()=>Kle,disableReplication:()=>Hle,enabledDatabases:()=>cc,forEachReplicatedDatabase:()=>nc,getThisNodeId:()=>tT,getThisNodeName:()=>it,getThisNodeUrl:()=>sc,hostnameToUrl:()=>cT,lastTimeInAuditStore:()=>jp,monitorNodeCAs:()=>BV,replicateOperation:()=>Wle,replicationCertificateAuthorities:()=>Qo,sendOperationToNode:()=>ah,servers:()=>Fle,setReplicator:()=>kV,start:()=>kle,startOnMainThread:()=>rC,subscribeToNode:()=>Zp,unsubscribeFromNode:()=>GS,urlToNodeName:()=>_i});function kle(e){if(!e.port&&!e.securePort&&(e.port=$s.default.get(F.OPERATIONSAPI_NETWORK_PORT),e.securePort=$s.default.get(F.OPERATIONSAPI_NETWORK_SECUREPORT)),!it())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of Jp(e))t.set(_i(s.url),s);Gle(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=ve.ws(async(s,i,a,c)=>{if(It.debug("Incoming WS connection received "+i.url),i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,a);s._socket.unref(),sh(s,e,a.then(()=>i?.user)),s.on("error",l=>{l.code!=="ECONNREFUSED"&&It.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,ve.http(async(s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){It.debug("Incoming replication WS connection received, authorized: "+s.authorized),!s.authorized&&s._nodeRequest.socket.authorizationError&&It.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let a=jt().primaryStore;if(s.authorized&&s.peerCertificate.subjectaltname){let c=(0,UV.getHostnamesFromCertificate)(s.peerCertificate),l;for(let u of c)if(l=u&&(a.get(u)||t.get(u)),l)break;if(l){let u=await Kd(s.peerCertificate,e);if(!u.valid){It.warn("Certificate verification failed:",u.status,"for node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){It.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l}else It.warn(`No node found for certificate common name/SANs: ${c}, available nodes are ${Array.from(a.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=a.get(s.ip)||t.get(s.ip);c?s.user=c:It.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...a.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=o(()=>{let a=new Set(s.secureContexts.values());s.defaultContext&&a.add(s.defaultContext);for(let c of a)try{let l=Array.from(Qo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=aT.createSecureContext(u)}catch(l){It.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),$s.default.get(F.REPLICATION_ENABLEROOTCAS)!==!1&&i()}BV(()=>{for(let s of n)s()})}function BV(e){let t=0;Bd(r=>{r?.ca&&(Qo.add(r.ca),Qo.size!==t&&(t=Qo.size,e?.()))})}function Hle(e=!0){xV=e}function Gle(e){xV||(at(),cc=e.databases,nc(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||lc;for(let[s,i]of oT){let a=i.get(r);a&&(a.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];kV(r,s,e),AC.get(s)?.forEach(i=>i(s))}}))}function kV(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 FV extends Hr{static{o(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||lc,a=i.get(e),c=a?.tableById||[];c[t.tableId]=t;let l=a?.ready;if(It.trace("Setting up replicator subscription to database",e),!a?.auditStore)return this.subscription=a=new Xn,i.set(e,a),a.tableById=c,a.auditStore=t.auditStore,a.dbisDB=t.dbisDB,a.databaseName=e,l&&l(a),a;this.subscription=a}static subscribeOnThisThread(i,a){return!0}static async load(i){if(i){let a=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),a]);if(c){let l,u=new Set;do{let d,f="",m=1/0;for(let h of c){if(u.has(h)||h===ve.hostname)continue;let E=$le(h,FV.subscription,e);if(E?.isConnected){let g=xd(t.auditStore,e,h)[ZS];(!d||g<m)&&(d=E,f=h,m=g)}}if(!d)throw l||new MV.ServerError(`No connection to any other nodes are available: ${c}`,502);let p={requestId:Ble++,table:t,entry:i,id:i.key};u.add(f);try{return await d.getRecord(p)}catch(h){if(d.isConnected)throw h;It.warn("Error in load from node",Bl,h),l||(l=h)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function qle(e,t,r,n,s){let i=oT.get(e);i||oT.set(e,i=new Map);let a=i.get(r);if(a)return a;if(t)return i.set(r,a=new Vd(e,t,r,n,s)),a.connect(),a.once("finished",()=>i.delete(r)),a}function $le(e,t,r){let n=OV.get(Bl);n||(n=new Map,OV.set(Bl,n));let s=n.get(r);if(s)return s;let i=jt().primaryStore.get(e);return i?.url&&(s=new Vd(i.url,t,r,Bl,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function ah(e,t,r){r||(r={}),r.serverName=e.name;let n=await eT(e.url,r),s=sh(n,{},{});return new Promise((i,a)=>{n.on("open",()=>{It.debug("Sending operation connection to "+e.url+" opened",t),i(s.sendOperation(t))}),n.on("error",c=>{a(c)}),n.on("close",c=>{It.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function Zp(e){try{vV.isMainThread&&It.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=lc.get(e.database);if(!t){let n;t=new Promise(s=>{It.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,lc.set(e.database,t)}let r=qle(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=>Qp(n,e.database)),e.replicateByDefault)}catch(t){It.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function GS({name:e,url:t,database:r}){It.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(jt().primaryStore.getRange({})));let n=oT.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Vle(){if(CC!==void 0)return CC;let e=$s.default.get(F.OPERATIONSAPI_TLS_CERTIFICATE)||$s.default.get(F.TLS_CERTIFICATE);if(e)return CC=new LV.X509Certificate((0,DV.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function it(){return Bl||(Bl=$s.default.get("replication_hostname")??_i($s.default.get("replication_url"))??Vle()??PV("operationsapi_network_secureport")??PV("operationsapi_network_port")??"127.0.0.1")}function Kle(){Bl=void 0}function PV(e){let t=$s.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function iT(e){let t=$s.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function tT(e){return zp(e)?.[it()]}function sc(){let e=$s.default.get("replication_url");return e||cT(it())}function cT(e){let t=iT("replication_port");if(t)return`ws://${e}:${t}`;if(t=iT("replication_secureport"),t)return`wss://${e}:${t}`;if(t=iT("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=iT("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function _i(e){if(e)return new URL(e).hostname}function nc(e,t){for(let n of Object.getOwnPropertyNames(De))r(n);return Bp(n=>{r(n)}),Ol((n,s)=>{r(n.databaseName)});function r(n){let s=De[n];It.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):Yle(n)&&t(s,n,!1)}o(r,"forDatabase")}function Yle(e){let t=De[e];for(let r in t)if(t[r].replicate)return!0}function jp(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function Wle(e){let t={message:""};if(e.replicated){e.replicated=!1,It.trace?.("Replicating operation",e.operation,"to nodes",ve.nodes.map(n=>n.name));let r=await Promise.allSettled(ve.nodes.map(n=>ah(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=ve.nodes[s]?.name,i})}return t}var $s,It,LV,DV,aT,MV,vV,UV,xV,Ble,Fle,Qo,cc,oT,OV,CC,Bl,hs=se(()=>{we();Ga();wu();IC();Fr();$s=b(me()),It=b(Q()),LV=require("crypto");sT();DV=require("fs");eh();Fd();q();tC();aT=b(require("node:tls")),MV=b(_e()),vV=require("worker_threads"),UV=b(_s()),Ble=1,Fle=[],Qo=$s.default.get(F.REPLICATION_ENABLEROOTCAS)!==!1?new Set(aT.rootCertificates):new Set;o(kle,"start");o(BV,"monitorNodeCAs");o(Hle,"disableReplication");o(Gle,"assignReplicationSource");o(kV,"setReplicator");oT=new Map;o(qle,"getSubscriptionConnection");OV=new Map;o($le,"getRetrievalConnectionByName");o(ah,"sendOperationToNode");o(Zp,"subscribeToNode");o(GS,"unsubscribeFromNode");o(Vle,"getCommonNameFromCert");o(it,"getThisNodeName");o(Kle,"clearThisNodeName");Object.defineProperty(ve,"hostname",{get(){return it()}});o(PV,"getHostFromListeningPort");o(iT,"getPortFromListeningPort");o(tT,"getThisNodeId");ve.replication={getThisNodeId:tT,exportIdMapping:zp};o(sc,"getThisNodeUrl");o(cT,"hostnameToUrl");o(_i,"urlToNodeName");o(nc,"forEachReplicatedDatabase");o(Yle,"hasExplicitlyReplicatedTable");o(jp,"lastTimeInAuditStore");o(Wle,"replicateOperation")});var mT=v((JUe,VV)=>{"use strict";var Yd=h$(),{validateBySchema:ch}=mt(),{commonValidators:Wd,schemaRegex:OC}=Ki(),Er=require("joi"),zle=Q(),jle=require("uuid").v4,dT=Ho(),zd=(q(),M(z)),Qle=require("util"),uc=cs(),{handleHDBError:Xo,hdbErrors:Jle,ClientError:Fl}=_e(),{HDB_ERROR_MSGS:lT,HTTP_STATUS_CODES:Zo}=Jle,{SchemaEventMsg:fT}=is(),HV=_r(),{getDatabases:Xle}=(we(),M(ft)),{transformReq:jd}=ae(),{replicateOperation:GV}=(hs(),M(jo)),{cleanupOrphans:Zle}=(es(),M(C_)),uT=Er.string().min(1).max(Wd.schema_length.maximum).pattern(OC).messages({"string.pattern.base":"{:#label} "+Wd.schema_format.message}),eue=Er.string().min(1).max(Wd.schema_length.maximum).pattern(OC).messages({"string.pattern.base":"{:#label} "+Wd.schema_format.message}).required(),tue=Er.string().min(1).max(Wd.schema_length.maximum).pattern(OC).messages({"string.pattern.base":"{:#label} "+Wd.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();VV.exports={createSchema:rue,createSchemaStructure:qV,createTable:nue,createTableStructure:$V,createAttribute:cue,dropSchema:sue,dropTable:iue,dropAttribute:oue,getBackup:lue,cleanupOrphanBlobs:uue};async function rue(e){let t=await qV(e);return dT.signalSchemaChange(new fT(process.pid,e.operation,e.schema)),t}o(rue,"createSchema");async function qV(e){let t=ch(e,Er.object({database:uT,schema:uT}));if(t)throw new Fl(t.message);if(jd(e),!await Yd.checkSchemaExists(e.schema))throw Xo(new Error,lT.SCHEMA_EXISTS_ERR(e.schema),Zo.BAD_REQUEST,zd.LOG_LEVELS.ERROR,lT.SCHEMA_EXISTS_ERR(e.schema),!0);return await uc.createSchema(e),`database '${e.schema}' successfully created`}o(qV,"createSchemaStructure");async function nue(e){return jd(e),e.hash_attribute=e.primary_key??e.hash_attribute,await $V(e)}o(nue,"createTable");async function $V(e){let t=ch(e,Er.object({database:uT,schema:uT,table:eue,residence:Er.array().items(Er.string().min(1)).optional(),hash_attribute:tue}));if(t)throw new Fl(t.message);if(!await Yd.checkSchemaTableExists(e.schema,e.table))throw Xo(new Error,lT.TABLE_EXISTS_ERR(e.schema,e.table),Zo.BAD_REQUEST,zd.LOG_LEVELS.ERROR,lT.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:jle(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await uc.createTable(n,e);else throw Xo(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Zo.BAD_REQUEST);else await uc.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}o($V,"createTableStructure");async function sue(e){let t=ch(e,Er.object({database:Er.string(),schema:Er.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Fl(t.message);jd(e);let r=await Yd.checkSchemaExists(e.schema);if(r)throw Xo(new Error,r,Zo.NOT_FOUND,zd.LOG_LEVELS.ERROR,r,!0);let n=await Yd.schemaDescribe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await uc.dropSchema(e),dT.signalSchemaChange(new fT(process.pid,e.operation,e.schema)),await HV.purgeSchemaTableStreams(e.schema,s);let i=await GV(e);return i.message=`successfully deleted '${e.schema}'`,i}o(sue,"dropSchema");async function iue(e){let t=ch(e,Er.object({database:Er.string(),schema:Er.string(),table:Er.string().required()}));if(t)throw new Fl(t.message);jd(e);let r=await Yd.checkSchemaTableExists(e.schema,e.table);if(r)throw Xo(new Error,r,Zo.NOT_FOUND,zd.LOG_LEVELS.ERROR,r,!0);await uc.dropTable(e),await HV.purgeTableStream(e.schema,e.table);let n=await GV(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}o(iue,"dropTable");async function oue(e){let t=ch(e,Er.object({database:Er.string(),schema:Er.string(),table:Er.string().required(),attribute:Er.string().required()}));if(t)throw new Fl(t.message);jd(e);let r=await Yd.checkSchemaTableExists(e.schema,e.table);if(r)throw Xo(new Error,r,Zo.NOT_FOUND,zd.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Xo(new Error,"You cannot drop a hash attribute",Zo.BAD_REQUEST,void 0,void 0,!0);if(zd.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Xo(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Zo.BAD_REQUEST,void 0,void 0,!0);try{return await uc.dropAttribute(e),aue(e),dT.signalSchemaChange(new fT(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw zle.error(`Got an error deleting attribute ${Qle.inspect(e)}.`),n}}o(oue,"dropAttribute");function aue(e){let t=Object.values(global.hdb_schema[e.schema][e.table].attributes);for(let r=0;r<t.length;r++)t[r].attribute===e.attribute&&global.hdb_schema[e.schema][e.table].attributes.splice(r,1)}o(aue,"dropAttributeFromGlobal");async function cue(e){jd(e);let t=Xle()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Xo(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Zo.BAD_REQUEST,void 0,void 0,!0);return await uc.createAttribute(e),dT.signalSchemaChange(new fT(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}o(cue,"createAttribute");function lue(e){return uc.getBackup(e)}o(lue,"getBackup");function uue(e){if(!e.database)throw new Fl('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new Fl(`Unknown database '${e.database}'`);return Zle(databases[e.database]),{message:"Orphaned blobs cleanup started, check logs for progress"}}o(uue,"cleanupOrphanBlobs")});var YV=v((ZUe,KV)=>{"use strict";var{OPERATIONS_ENUM:due}=(q(),M(z)),PC=class{static{o(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=due.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};KV.exports=PC});var LC=v((rxe,JV)=>{"use strict";var fue=cs(),txe=YV(),pT=ae(),hT=(q(),M(z)),mue=me(),{handleHDBError:WV,hdbErrors:pue}=_e(),{HDB_ERROR_MSGS:zV,HTTP_STATUS_CODES:jV}=pue,hue=Object.values(hT.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),QV="To use this operation audit log must be enabled in harperdb-config.yaml";JV.exports=Eue;async function Eue(e){if(pT.isEmpty(e.schema))throw new Error(zV.SCHEMA_REQUIRED_ERR);if(pT.isEmpty(e.table))throw new Error(zV.TABLE_REQUIRED_ERR);if(!mue.get(hT.CONFIG_PARAMS.LOGGING_AUDITLOG))throw WV(new Error,QV,jV.BAD_REQUEST,hT.LOG_LEVELS.ERROR,QV,!0);let t=pT.checkSchemaTableExist(e.schema,e.table);if(t)throw WV(new Error,t,jV.NOT_FOUND,hT.LOG_LEVELS.ERROR,t,!0);if(!pT.isEmpty(e.search_type)&&hue.indexOf(e.search_type)<0)throw new Error(`Invalid searchType '${read_audit_log_object.search_type}'`);return await fue.readAuditLog(e)}o(Eue,"readAuditLog")});var ZV=v((sxe,XV)=>{"use strict";var{OPERATIONS_ENUM:_ue}=(q(),M(z)),DC=class{static{o(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=_ue.GET_BACKUP,this.schema=t,this.table=r}};XV.exports=DC});var r1=v((cxe,t1)=>{"use strict";var gue=cs(),oxe=ZV(),MC=ae(),Sue=(q(),M(z)),axe=me(),{handleHDBError:Tue,hdbErrors:yue}=_e(),{HDB_ERROR_MSGS:e1,HTTP_STATUS_CODES:Rue}=yue;t1.exports=bue;async function bue(e){if(MC.isEmpty(e.schema))throw new Error(e1.SCHEMA_REQUIRED_ERR);if(MC.isEmpty(e.table))throw new Error(e1.TABLE_REQUIRED_ERR);let t=MC.checkSchemaTableExist(e.schema,e.table);if(t)throw Tue(new Error,t,Rue.NOT_FOUND,Sue.LOG_LEVELS.ERROR,t,!0);return await gue.getBackup(readAuditLogObject)}o(bue,"getBackup")});var o1=v((uxe,i1)=>{"use strict";var Aue=me(),dc=require("joi"),Iue=mt(),n1=require("moment"),wue=require("fs-extra"),vC=require("path"),Nue=require("lodash"),lh=(q(),M(z)),{LOG_LEVELS:kl}=(q(),M(z)),Cue="YYYY-MM-DD hh:mm:ss",Oue=vC.resolve(__dirname,"../logs");i1.exports=function(e){return Iue.validateBySchema(e,Pue)};var Pue=dc.object({from:dc.custom(s1),until:dc.custom(s1),level:dc.valid(kl.NOTIFY,kl.FATAL,kl.ERROR,kl.WARN,kl.INFO,kl.DEBUG,kl.TRACE),order:dc.valid("asc","desc"),limit:dc.number().min(1),start:dc.number().min(0),log_name:dc.custom(Lue)});function s1(e,t){if(n1(e,n1.ISO_8601).format(Cue)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}o(s1,"validateDatetime");function Lue(e,t){if(Nue.invert(lh.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Aue.get(lh.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?lh.LOG_NAMES.HDB:e,i=s===lh.LOG_NAMES.INSTALL?vC.join(Oue,lh.LOG_NAMES.INSTALL):vC.join(n,s);return wue.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}o(Lue,"validateReadLogPath")});var xC=v((fxe,c1)=>{"use strict";var ET=(q(),M(z)),Due=Q(),Mue=me(),vue=o1(),UC=require("path"),a1=require("fs-extra"),{once:Uue}=require("events"),{handleHDBError:xue,hdbErrors:Bue}=_e(),{PACKAGE_ROOT:Fue}=Ct(),{replicateOperation:kue}=(hs(),M(jo)),Hue=UC.join(Fue,"logs"),Gue=1e3,que=200;c1.exports=$ue;async function $ue(e){let t=vue(e);if(t)throw xue(t,t.message,Bue.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=kue(e),n=Mue.get(ET.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e.log_name===void 0?ET.LOG_NAMES.HDB:e.log_name,i=s===ET.LOG_NAMES.INSTALL?UC.join(Hue,ET.LOG_NAMES.INSTALL):UC.join(n,s),a=e.level!==void 0,c=a?e.level:void 0,l=e.from!==void 0,u=l?new Date(e.from):void 0,d=e.until!==void 0,f=d?new Date(e.until):void 0,m=e.limit===void 0?Gue:e.limit,p=e.order===void 0?void 0:e.order,h=e.start===void 0?0:e.start,E=h+m,g=0;p==="desc"&&!u&&!f&&(g=Math.max(a1.statSync(i).size-(E+5)*que,0));let R=a1.createReadStream(i,{start:g});R.on("error",G=>{Due.error(G)});let S=0,y=[],C="",I;R.on("data",G=>{let H=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;G=C+G;let X=0,W;for(;(W=H.exec(G))&&!R.destroyed;){I&&(I.message=G.slice(X,W.index),k(I));let[ue,ce,te]=W,ye=te.split("] ["),Ae=ye[0],Ye=ye[1];ye.splice(0,2),I={timestamp:ce,thread:Ae,level:Ye,tags:ye,message:""},X=W.index+ue.length}C=G.slice(X)}),R.on("end",G=>{R.destroyed||I&&(I.message=C.trim(),k(I))}),R.resume();function k(G){let H,X,W;switch(!0){case(a&&l&&d):H=new Date(G.timestamp),X=new Date(u),W=new Date(f),G.level===c&&H>=X&&H<=W&&S<h?S++:G.level===c&&H>=X&&H<=W&&(co(G,p,y),S++,S===E&&R.destroy());break;case(a&&l):H=new Date(G.timestamp),X=new Date(u),G.level===c&&H>=X&&S<h?S++:G.level===c&&H>=X&&(co(G,p,y),S++,S===E&&R.destroy());break;case(a&&d):H=new Date(G.timestamp),W=new Date(f),G.level===c&&H<=W&&S<h?S++:G.level===c&&H<=W&&(co(G,p,y),S++,S===E&&R.destroy());break;case(l&&d):H=new Date(G.timestamp),X=new Date(u),W=new Date(f),H>=X&&H<=W&&S<h?S++:H>=X&&H<=W&&(co(G,p,y),S++,S===E&&R.destroy());break;case a:G.level===c&&S<h?S++:G.level===c&&(co(G,p,y),S++,S===E&&R.destroy());break;case l:H=new Date(G.timestamp),X=new Date(u),H>=X&&S<h?S++:H>=X&&S>=h&&(co(G,p,y),S++,S===E&&R.destroy());break;case d:H=new Date(G.timestamp),W=new Date(f),H<=W&&S<h?S++:H<=W&&S>=h&&(co(G,p,y),S++,S===E&&R.destroy());break;default:S<h?S++:(co(G,p,y),S++,S===E&&R.destroy())}}o(k,"onLogMessage"),await Uue(R,"close");let J=await r;if(J.replicated){for(let G of y)G.node=server.hostname;for(let G of J.replicated){let H=G.node;if(G.status==="failed")co({timestamp:new Date().toISOString(),level:"error",node:H,message:`Error retrieving logs: ${G.reason}`},p,y);else for(let X of G.results)X.node=H,co(X,p,y)}}return y}o($ue,"readLog");function co(e,t,r){t==="desc"?Vue(e,r):t==="asc"?Kue(e,r):r.push(e)}o(co,"pushLineToResult");function Vue(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)>r?n=i+1:s=i}t.splice(n,0,e)}o(Vue,"insertDescending");function Kue(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)<r?n=i+1:s=i}t.splice(n,0,e)}o(Kue,"insertAscending")});var _T=v((gxe,f1)=>{"use strict";var BC=require("joi"),{string:Qd,boolean:l1,date:Yue}=BC.types(),Wue=mt(),{validateSchemaExists:pxe,validateTableExists:hxe,validateSchemaName:Exe}=Ki(),zue=(q(),M(z)),jue=Ot(),u1=me();u1.initSync();var _xe=Qd.invalid(u1.get(zue.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(jue.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),d1={operation:Qd.valid("add_node","update_node","set_node_replication"),node_name:Qd.optional(),subscriptions:BC.array().items({table:Qd.optional(),schema:Qd.optional(),database:Qd.optional(),subscribe:l1.required(),publish:l1.required().custom(Jue),start_time:Yue.iso()})};function Que(e){return Wue.validateBySchema(e,BC.object(d1))}o(Que,"addUpdateNodeValidator");function Jue(e,t){if(t.state.ancestors[2].operation==="add_node"&&e===!1&&t.state.ancestors[0].subscribe===!1)return t.message(`'subscriptions[${t.state.path[1]}]' subscribe and/or publish must be set to true when adding a node`)}o(Jue,"checkForFalsy");f1.exports={addUpdateNodeValidator:Que,validationSchema:d1}});var Jd=v((Txe,m1)=>{"use strict";var FC=class{static{o(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},kC=class{static{o(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};m1.exports={Node:FC,NodeSubscription:kC}});var h1=v((Rxe,p1)=>{"use strict";var Xue=(q(),M(z)).OPERATIONS_ENUM,HC=class{static{o(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Xue.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};p1.exports=HC});var uh=v((Axe,E1)=>{"use strict";var GC=class{static{o(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},qC=class{static{o(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,a,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=a,c!==void 0&&(this.attributes=c)}};E1.exports={RemotePayloadObject:GC,RemotePayloadSubscription:qC}});var g1=v((wxe,_1)=>{"use strict";var $C=class{static{o(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,a=0){this.schema=t,this.table=r,this.table_size=n,this.record_count=s,this.transaction_log_size=i,this.transaction_log_record_count=a}};_1.exports=$C});var T1=v((Dxe,S1)=>{"use strict";var Zue=g1(),Cxe=Yt(),Oxe=_t(),ede=Q(),{getSchemaPath:Pxe,getTransactionAuditStorePath:Lxe}=Rt(),{getDatabases:tde}=(we(),M(ft));S1.exports=rde;async function rde(e){let t=new Zue;try{let r=tde()[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){ede.warn(`unable to stat table dbi due to ${r}`)}return t}o(rde,"lmdbGetTableSize")});var R1=v((vxe,y1)=>{"use strict";var VC=class{static{o(this,"SystemInformationObject")}constructor(t,r,n,s,i,a,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=a,this.harperdb_processes=c}};y1.exports=VC});var fh=v((Hxe,w1)=>{"use strict";var nde=require("fs-extra"),sde=require("path"),Tn=require("systeminformation"),fc=Q(),b1=_r(),xxe=Ot(),Xd=(q(),M(z)),ide=T1(),ode=Ll(),{getThreadInfo:A1}=nt(),dh=me();dh.initSync();var ade=R1(),{openEnvironment:Bxe}=_t(),{getSchemaPath:Fxe}=Rt(),{database:kxe,databases:KC}=(we(),M(ft)),gT;w1.exports={getHDBProcessInfo:jC,getNetworkInfo:JC,getDiskInfo:QC,getMemoryInfo:zC,getCPUInfo:WC,getTimeInfo:YC,getSystemInformation:XC,systemInformation:cde,getTableSize:ZC,getMetrics:eO};function YC(){return Tn.time()}o(YC,"getTimeInfo");async function WC(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:a,governor:c,socket:l,cache:u,...d}=await Tn.cpu();d.cpu_speed=await Tn.cpuCurrentSpeed();let{rawCurrentload:f,rawCurrentloadIdle:m,rawCurrentloadIrq:p,rawCurrentloadNice:h,rawCurrentloadSystem:E,rawCurrentloadUser:g,cpus:R,...S}=await Tn.currentLoad();return S.cpus=[],R.forEach(y=>{let{rawLoad:C,rawLoadIdle:I,rawLoadIrq:k,rawLoadNice:J,rawLoadSystem:G,rawLoadUser:H,...X}=y;S.cpus.push(X)}),d.current_load=S,d}catch(e){return fc.error(`error in getCPUInfo: ${e}`),{}}}o(WC,"getCPUInfo");async function zC(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await Tn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return fc.error(`error in getMemoryInfo: ${e}`),{}}}o(zC,"getMemoryInfo");async function jC(){let e={core:[],clustering:[]};try{let t=await Tn.processes(),r;try{r=Number.parseInt(await nde.readFile(sde.join(dh.get(Xd.CONFIG_PARAMS.ROOTPATH),Xd.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===Xd.NODE_ERROR_CODES.ENOENT)fc.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 fc.error(`error in getHDBProcessInfo: ${t}`),e}}o(jC,"getHDBProcessInfo");async function QC(){let e={};try{if(!dh.get(Xd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await Tn.disksIO();e.io=i;let{rxSec:a,txSec:c,wxSec:l,...u}=await Tn.fsStats();return e.read_write=u,e.size=await Tn.fsSize(),e}catch(t){return fc.error(`error in getDiskInfo: ${t}`),e}}o(QC,"getDiskInfo");async function JC(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return dh.get(Xd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await Tn.networkInterfaceDefault(),e.latency=await Tn.inetChecksite("google.com"),(await Tn.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:a,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrierChanges:f,...m}=n;e.interfaces.push(m)}),(await Tn.networkStats()).forEach(n=>{let{rxSec:s,txSec:i,ms:a,...c}=n;e.stats.push(c)})),e}catch(t){return fc.error(`error in getNetworkInfo: ${t}`),e}}o(JC,"getNetworkInfo");async function XC(){if(gT!==void 0)return gT;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:a,...c}=await Tn.osInfo();e=c;let l=await Tn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,gT=e,gT}catch(t){return fc.error(`error in getSystemInformation: ${t}`),e}}o(XC,"getSystemInformation");async function ZC(){let e=[],t=await ode.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await ide(n));return e}o(ZC,"getTableSize");async function eO(){let e={};for(let t in KC){let r=e[t]={},n=r.tables={};for(let s in KC[t])try{let i=KC[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,d,f]=l.trim().split(" ");return{pid:u,thread:d,txnid:f}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}}let a=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=a[l];n[s]=c}catch(i){fc.notify(`Error getting stats for table ${s}: ${i}`)}}return e}o(eO,"getMetrics");async function I1(){if(dh.get(Xd.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await b1.getNATSReferences(),t=await b1.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let a={stream_name:n.config.name,database:n.config.subjects[0].split(".")[1],table:n.config.subjects[0].split(".")[2],state:n.state,consumers:s};r.push(a)}return r}}o(I1,"getNatsStreamInfo");async function cde(e){let t=new ade;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await XC(),t.time=YC(),t.cpu=await WC(),t.memory=await zC(),t.disk=await QC(),t.network=await JC(),t.harperdb_processes=await jC(),t.table_size=await ZC(),t.metrics=await eO(),t.threads=await A1(),t.replication=await I1(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await XC();break;case"time":t.time=YC();break;case"cpu":t.cpu=await WC();break;case"memory":t.memory=await zC();break;case"disk":t.disk=await QC();break;case"network":t.network=await JC();break;case"harperdb_processes":t.harperdb_processes=await jC();break;case"table_size":t.table_size=await ZC();break;case"database_metrics":case"metrics":t.metrics=await eO();break;case"threads":t.threads=await A1();break;case"replication":t.replication=await I1();break;default:break}return t}o(cde,"systemInformation")});var ea=v((Kxe,P1)=>{"use strict";var lde=Gn(),tO=ae(),ude=require("util"),Hl=(q(),M(z)),N1=me();N1.initSync();var dde=BN(),C1=hn(),{Node:qxe,NodeSubscription:$xe}=Jd(),fde=Zu(),mde=h1(),{RemotePayloadObject:pde,RemotePayloadSubscription:hde}=uh(),{handleHDBError:Ede,hdbErrors:_de}=_e(),{HTTP_STATUS_CODES:gde,HDB_ERROR_MSGS:Sde}=_de,Tde=ui(),yde=fh(),{packageJson:Rde}=Ct(),{getDatabases:bde}=(we(),M(ft)),Vxe=ude.promisify(dde.authorize),Ade=C1.searchByHash,Ide=C1.searchByValue;P1.exports={isEmpty:wde,getNodeRecord:Nde,upsertNodeRecord:Cde,buildNodePayloads:Ode,checkClusteringEnabled:Pde,getAllNodeRecords:Lde,getSystemInfo:Dde,reverseSubscription:O1};function wde(e){return e==null}o(wde,"isEmpty");async function Nde(e){let t=new fde(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Ade(t)}o(Nde,"getNodeRecord");async function Cde(e){let t=new mde(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return lde.upsert(t)}o(Cde,"upsertNodeRecord");function O1(e){if(tO.isEmpty(e.subscribe)||tO.isEmpty(e.publish))throw new Error("Received invalid subscription object");let{schema:t,table:r,hash_attribute:n}=e,s={schema:t,table:r,hash_attribute:n};return e.subscribe===!0&&e.publish===!1?(s.subscribe=!1,s.publish=!0):e.subscribe===!1&&e.publish===!0?(s.subscribe=!0,s.publish=!1):(s.subscribe=e.subscribe,s.publish=e.publish),s}o(O1,"reverseSubscription");function Ode(e,t,r,n){let s=[];for(let i=0,a=e.length;i<a;i++){let c=e[i],{schema:l,table:u}=c,d=tO.getTableHashAttribute(l,u),{subscribe:f,publish:m}=O1(c),p=bde()[l]?.[u],h=new hde(l,u,d,m,f,c.start_time,p.schemaDefined?p.attributes:void 0);s.push(h)}return new pde(r,t,s,n)}o(Ode,"buildNodePayloads");function Pde(){if(!N1.get(Hl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw Ede(new Error,Sde.CLUSTERING_NOT_ENABLED,gde.BAD_REQUEST,void 0,void 0,!0)}o(Pde,"checkClusteringEnabled");async function Lde(){let e=new Tde(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await Ide(e))}o(Lde,"getAllNodeRecords");async function Dde(){let e=await yde.getSystemInformation();return{hdb_version:Rde.version,node_version:e.node_version,platform:e.platform}}o(Dde,"getSystemInfo")});var rO=v((Wxe,F1)=>{"use strict";var ST=_r(),L1=ae(),D1=Ot(),M1=(q(),M(z)),TT=Q(),v1=mT(),Mde=np(),{RemotePayloadObject:vde}=uh(),{handleHDBError:U1,hdbErrors:Ude}=_e(),{HTTP_STATUS_CODES:x1}=Ude,{NodeSubscription:B1}=Jd();F1.exports=xde;async function xde(e,t){let r;try{r=await ST.request(`${t}.${D1.REQUEST_SUFFIX}`,new vde(M1.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),TT.trace("Response from remote describe all request:",r)}catch(a){TT.error(`addNode received error from describe all request to remote node: ${a}`);let c=ST.requestErrorHandler(a,"add_node",t);throw U1(new Error,c,x1.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===D1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let a=`Error returned from remote node ${t}: ${r.message}`;throw U1(new Error,a,x1.INTERNAL_SERVER_ERROR,"error",a)}let n=r.message,s=[],i=[];for(let a of e){let{table:c}=a,l=a.database??a.schema??"data";if(l===M1.SYSTEM_SCHEMA_NAME){await ST.createLocalTableStream(l,c);let h=new B1(l,c,a.publish,a.subscribe);h.start_time=a.start_time,i.push(h);continue}let u=L1.doesSchemaExist(l),d=n[l]!==void 0,f=c?L1.doesTableExist(l,c):!0,m=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!f&&!m){s.push(a);continue}if(!u&&d&&(TT.trace(`addNode creating schema: ${l}`),await v1.createSchema({operation:"create_schema",schema:l})),!f&&m){TT.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let h=new Mde(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(h.attributes=n[l][c].attributes),await v1.createTable(h)}await ST.createLocalTableStream(l,c);let p=new B1(l,c,a.publish,a.subscribe);p.start_time=a.start_time,i.push(p)}return{added:i,skipped:s}}o(xde,"reviewSubscriptions")});var Zd={};Re(Zd,{addNodeBack:()=>nO,removeNodeBack:()=>sO,setNode:()=>Hde});async function Hde(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=_i(t)):t=cT(r);let n=(0,H1.validateBySchema)(e,kde);if(n)throw(0,ta.handleHDBError)(n,n.message,Fde.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new ta.ClientError("url or hostname is required for remove_node operation");let p=r,h=jt(),E=await h.get(p);if(!E)throw new ta.ClientError(p+" does not exist");try{await ah({url:E.url},{operation:V.REMOVE_NODE_BACK,name:E?.subscriptions?.length>0?it():p},void 0)}catch(g){gs.warn(`Error removing node from target node ${p}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,g)}return await h.delete(p),`Successfully removed '${p}' from cluster`}if(!t)throw new ta.ClientError("url required for this operation");let s=sc();if(s==null)throw new ta.ClientError("replication url is missing from harperdb-config.yaml");let i,a,c;if(t?.startsWith("wss:")){i=await(0,Vs.getReplicationCert)();let p=await(0,Vs.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(a=await(0,Vs.createCsr)(),gs.info("Sending CSR to target node:",t)):p&&(c=p.certificate,gs.info("Sending CA named",p.name,"to target node",t))}let l={operation:V.ADD_NODE_BACK,hostname:(0,pc.get)(F.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:a,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,pc.get)(F.REPLICATION_SHARD)!==void 0&&(l.shard=(0,pc.get)(F.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(k1):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let p=k1(e);l.subscribe=p.subscribe,l.publish=p.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,d;try{u=await ah({url:t},l,e)}catch(p){p.message=`Error returned from ${t}: `+p.message,gs.warn("Error adding node:",t,"to cluster:",p),d=p}if(a&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw d?(d.message+=" and connection was required to sign certificate",d):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);a&&(gs.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Vs.setCertTable)({name:Bde.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Vs.setCertTable)({name:it(),uses:["https","operations","wss"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let f={url:t,ca:u?.usingCA};if(e.hostname&&(f.name=e.hostname),e.subscriptions?f.subscriptions=e.subscriptions:f.replicates=!0,e.start_time&&(f.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(f.authorization=e.authorization),e.revoked_certificates&&(f.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?f.shard=u.shard:e.shard!==void 0&&(f.shard=e.shard),f.replicates){let p={url:s,ca:c,replicates:!0,subscriptions:null};(0,pc.get)(F.REPLICATION_SHARD)!==void 0&&(p.shard=(0,pc.get)(F.REPLICATION_SHARD)),e.retain_authorization&&(p.authorization=e.authorization),e.start_time&&(p.start_time=e.start_time),await Wo(it(),p)}await Wo(u?u.nodeName:f.name??_i(t),f);let m;return e.operation==="update_node"?m=`Successfully updated '${t}'`:m=`Successfully added '${t}' to cluster`,d&&(m+=" but there was an error updating target node: "+d.message),m}async function nO(e){gs.trace("addNodeBack received request:",e);let t=await(0,Vs.signCertificate)(e),r;e.csr?(r=t.signingCA,gs.info("addNodeBack received CSR from node:",e.url,"this node will use and respond with CA that was used to issue CSR")):(r=e?.cert_auth,gs.info("addNodeBack received CA from node:",e.url));let n={url:e.url,ca:r};e.subscriptions?n.subscriptions=e.subscriptions:(n.replicates=!0,n.subscriptions=null),e.start_time&&(n.start_time=e.start_time),e.authorization&&(n.authorization=e.authorization),e.shard!==void 0&&(n.shard=e.shard);let s=await(0,Vs.getReplicationCertAuth)();if(n.replicates){let i={url:sc(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,pc.get)(F.REPLICATION_SHARD)!==void 0&&(i.shard=(0,pc.get)(F.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Wo(it(),i)}return await Wo(e.hostname,n),t.nodeName=it(),t.usingCA=s?.certificate,gs.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function sO(e){gs.trace("removeNodeBack received request:",e),await jt().delete(e.name)}function k1(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Vs,H1,mc,pc,gs,ta,Bde,Fde,kde,ef=se(()=>{Vs=b(_s()),H1=b(mt()),mc=b(require("joi")),pc=b(me());q();eh();Fd();hs();gs=b(Q()),ta=b(_e()),{pki:Bde}=require("node-forge"),{HTTP_STATUS_CODES:Fde}=ta.hdbErrors,kde=mc.default.object({hostname:mc.default.string(),verify_tls:mc.default.boolean(),replicates:mc.default.boolean(),subscriptions:mc.default.array(),revoked_certificates:mc.default.array(),shard:mc.default.number()});o(Hde,"setNode");o(nO,"addNodeBack");o(sO,"removeNodeBack");o(k1,"reverseSubscription")});var IT=v((r0e,q1)=>{"use strict";var{handleHDBError:yT,hdbErrors:Gde}=_e(),{HTTP_STATUS_CODES:RT}=Gde,{addUpdateNodeValidator:qde}=_T(),bT=Q(),AT=(q(),M(z)),G1=Ot(),$de=ae(),mh=_r(),ph=ea(),iO=me(),Vde=rO(),{Node:Kde,NodeSubscription:Yde}=Jd(),{broadcast:Wde}=nt(),{setNode:zde}=(ef(),M(Zd)),e0e=me(),t0e=(q(),M(z)),jde="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Qde="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Jde=iO.get(AT.CONFIG_PARAMS.CLUSTERING_NODENAME);q1.exports=Xde;async function Xde(e,t=!1){if(bT.trace("addNode called with:",e),iO.get(AT.CONFIG_PARAMS.REPLICATION_URL)||iO.get(AT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return zde(e);ph.checkClusteringEnabled();let r=qde(e);if(r)throw yT(r,r.message,RT.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let f=await ph.getNodeRecord(n);if(!$de.isEmptyOrZeroLength(f))throw yT(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,RT.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Vde(e.subscriptions,n),a={message:void 0,added:s,skipped:i};if(s.length===0)return a.message=jde,a;let c=ph.buildNodePayloads(s,Jde,AT.OPERATIONS_ENUM.ADD_NODE,await ph.getSystemInfo()),l=[];for(let f=0,m=s.length;f<m;f++){let p=s[f];s[f].start_time===void 0&&delete s[f].start_time,l.push(new Yde(p.schema,p.table,p.publish,p.subscribe))}bT.trace("addNode sending remote payload:",c);let u;try{u=await mh.request(`${n}.${G1.REQUEST_SUFFIX}`,c)}catch(f){bT.error(`addNode received error from request: ${f}`);for(let p=0,h=s.length;p<h;p++){let E=s[p];E.publish=!1,E.subscribe=!1,await mh.updateRemoteConsumer(E,n)}let m=mh.requestErrorHandler(f,"add_node",n);throw yT(new Error,m,RT.INTERNAL_SERVER_ERROR,"error",m)}if(u.status===G1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${n}: ${u.message}`;throw yT(new Error,f,RT.INTERNAL_SERVER_ERROR,"error",f)}bT.trace(u);for(let f=0,m=s.length;f<m;f++){let p=s[f];await mh.updateRemoteConsumer(p,n),p.subscribe===!0&&await mh.updateConsumerIterator(p.schema,p.table,n,"start")}let d=new Kde(n,l,u.system_info);return await ph.upsertNodeRecord(d),Wde({type:"nats_update"}),i.length>0?a.message=Qde:a.message=`Successfully added '${n}' to manifest`,a}o(Xde,"addNode")});var lO=v((i0e,V1)=>{"use strict";var{handleHDBError:oO,hdbErrors:Zde}=_e(),{HTTP_STATUS_CODES:aO}=Zde,{addUpdateNodeValidator:efe}=_T(),hh=Q(),wT=(q(),M(z)),$1=Ot(),s0e=ae(),Eh=_r(),_h=ea(),cO=me(),{cloneDeep:tfe}=require("lodash"),rfe=rO(),{Node:nfe,NodeSubscription:sfe}=Jd(),{broadcast:ife}=nt(),{setNode:ofe}=(ef(),M(Zd)),afe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",cfe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",lfe=cO.get(wT.CONFIG_PARAMS.CLUSTERING_NODENAME);V1.exports=ufe;async function ufe(e){if(hh.trace("updateNode called with:",e),cO.get(wT.CONFIG_PARAMS.REPLICATION_URL)??cO.get(wT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return ofe(e);_h.checkClusteringEnabled();let t=efe(e);if(t)throw oO(t,t.message,aO.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await _h.getNodeRecord(r);s.length>0&&(n=tfe(s));let{added:i,skipped:a}=await rfe(e.subscriptions,r),c={message:void 0,updated:i,skipped:a};if(i.length===0)return c.message=afe,c;let l=_h.buildNodePayloads(i,lfe,wT.OPERATIONS_ENUM.UPDATE_NODE,await _h.getSystemInfo());for(let d=0,f=i.length;d<f;d++){let m=i[d];hh.trace(`updateNode updating work stream for node: ${r} subscription:`,m),i[d].start_time===void 0&&delete i[d].start_time}hh.trace("updateNode sending remote payload:",l);let u;try{u=await Eh.request(`${r}.${$1.REQUEST_SUFFIX}`,l)}catch(d){hh.error(`updateNode received error from request: ${d}`);let f=Eh.requestErrorHandler(d,"update_node",r);throw oO(new Error,f,aO.INTERNAL_SERVER_ERROR,"error",f)}if(u.status===$1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw oO(new Error,d,aO.INTERNAL_SERVER_ERROR,"error",d)}hh.trace(u);for(let d=0,f=i.length;d<f;d++){let m=i[d];await Eh.updateRemoteConsumer(m,r),m.subscribe===!0?await Eh.updateConsumerIterator(m.schema,m.table,r,"start"):await Eh.updateConsumerIterator(m.schema,m.table,r,"stop")}return n||(n=[new nfe(r,[],u.system_info)]),await dfe(n[0],i,u.system_info),a.length>0?c.message=cfe:c.message=`Successfully updated '${r}'`,c}o(ufe,"updateNode");async function dfe(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let a=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let d=n.subscriptions[l];if(d.schema===a.schema&&d.table===a.table){d.publish=a.publish,d.subscribe=a.subscribe,c=!0;break}}c||n.subscriptions.push(new sfe(a.schema,a.table,a.publish,a.subscribe))}n.system_info=r,await _h.upsertNodeRecord(n),ife({type:"nats_update"})}o(dfe,"updateNodeTable")});var j1=v((a0e,z1)=>{"use strict";var W1=require("joi"),{string:K1}=W1.types(),ffe=mt(),Y1=(q(),M(z)),mfe=me(),pfe=Ot();z1.exports=hfe;function hfe(e){let t=K1.invalid(mfe.get(Y1.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(pfe.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=W1.object({operation:K1.valid(Y1.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return ffe.validateBySchema(e,r)}o(hfe,"removeNodeValidator")});var NT=v((l0e,eK)=>{"use strict";var{handleHDBError:Q1,hdbErrors:Efe}=_e(),{HTTP_STATUS_CODES:J1}=Efe,_fe=j1(),gh=Q(),X1=ea(),gfe=ae(),tf=(q(),M(z)),Z1=Ot(),uO=_r(),dO=me(),{RemotePayloadObject:Sfe}=uh(),{NodeSubscription:Tfe}=Jd(),yfe=rp(),Rfe=Sl(),{broadcast:bfe}=nt(),{setNode:Afe}=(ef(),M(Zd)),Ife=dO.get(tf.CONFIG_PARAMS.CLUSTERING_NODENAME);eK.exports=wfe;async function wfe(e){if(gh.trace("removeNode called with:",e),dO.get(tf.CONFIG_PARAMS.REPLICATION_URL)??dO.get(tf.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Afe(e);X1.checkClusteringEnabled();let t=_fe(e);if(t)throw Q1(t,t.message,J1.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await X1.getNodeRecord(r);if(gfe.isEmptyOrZeroLength(n))throw Q1(new Error,`Node '${r}' was not found.`,J1.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new Sfe(tf.OPERATIONS_ENUM.REMOVE_NODE,Ife,[]),i,a=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await uO.updateConsumerIterator(d.schema,d.table,r,"stop");try{await uO.updateRemoteConsumer(new Tfe(d.schema,d.table,!1,!1),r)}catch(f){gh.error(f)}}try{i=await uO.request(`${r}.${Z1.REQUEST_SUFFIX}`,s),gh.trace("Remove node reply from remote node:",r,i)}catch(l){gh.error("removeNode received error from request:",l),a=!0}let c=new yfe(tf.SYSTEM_SCHEMA_NAME,tf.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await Rfe.deleteRecord(c),bfe({type:"nats_update"}),i?.status===Z1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||a?(gh.error("Error returned from remote node:",r,i?.message),`Successfully removed '${r}' from local manifest, however there was an error reaching remote node. Check the logs for more details.`):`Successfully removed '${r}' from manifest`}o(wfe,"removeNode")});var nK=v((d0e,rK)=>{"use strict";var tK=require("joi"),{string:Nfe,array:Cfe}=tK.types(),Ofe=mt(),Pfe=_T();rK.exports=Lfe;function Lfe(e){let t=tK.object({operation:Nfe.valid("configure_cluster").required(),connections:Cfe.items(Pfe.validationSchema).required()});return Ofe.validateBySchema(e,t)}o(Lfe,"configureClusterValidator")});var fO=v((m0e,cK)=>{"use strict";var sK=(q(),M(z)),CT=Q(),Dfe=ae(),Mfe=me(),vfe=NT(),Ufe=IT(),xfe=ea(),Bfe=nK(),{handleHDBError:iK,hdbErrors:Ffe}=_e(),{HTTP_STATUS_CODES:oK}=Ffe,kfe="Configure cluster complete.",Hfe="Failed to configure the cluster. Check the logs for more details.",Gfe="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";cK.exports=qfe;async function qfe(e){CT.trace("configure cluster called with:",e);let t=Bfe(e);if(t)throw iK(t,t.message,oK.BAD_REQUEST,void 0,void 0,!0);let r=await xfe.getAllNodeRecords(),n=[];if(Mfe.get(sK.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,f=r.length;d<f;d++){let m=await aK(vfe,{operation:sK.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(m)}CT.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let f=e.connections[d],m=await aK(Ufe,f,f.node_name);s.push(m)}CT.trace("All results from configure_cluster add node:",s);let a=[],c=[],l=!1,u=n.concat(s);for(let d=0,f=u.length;d<f;d++){let m=u[d];m.status==="rejected"&&(CT.error(m.node_name,m?.error?.message,m?.error?.stack),a.includes(m.node_name)||a.push(m.node_name)),(m?.result?.message?.includes?.("Successfully")||m?.result?.includes?.("Successfully"))&&(l=!0),!(typeof m.result=="string"&&m.result.includes("Successfully removed")||m.status==="rejected")&&c.push({node_name:m?.node_name,response:m?.result})}if(Dfe.isEmptyOrZeroLength(a))return{message:kfe,connections:c};if(l)return{message:Gfe,failed_nodes:a,connections:c};throw iK(new Error,Hfe,oK.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}o(qfe,"configureCluster");async function aK(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}o(aK,"functionWrapper")});var fK=v((h0e,dK)=>{"use strict";var Sh=require("joi"),$fe=mt(),{validateSchemaExists:lK,validateTableExists:Vfe,validateSchemaName:uK}=Ki(),Kfe=Sh.object({operation:Sh.string().valid("purge_stream"),schema:Sh.string().custom(lK).custom(uK).optional(),database:Sh.string().custom(lK).custom(uK).optional(),table:Sh.string().custom(Vfe).required()});function Yfe(e){return $fe.validateBySchema(e,Kfe)}o(Yfe,"purgeStreamValidator");dK.exports=Yfe});var mO=v((_0e,mK)=>{"use strict";var{handleHDBError:Wfe,hdbErrors:zfe}=_e(),{HTTP_STATUS_CODES:jfe}=zfe,Qfe=fK(),Jfe=_r(),Xfe=ea();mK.exports=Zfe;async function Zfe(e){e.schema=e.schema??e.database;let t=Qfe(e);if(t)throw Wfe(t,t.message,jfe.BAD_REQUEST,void 0,void 0,!0);Xfe.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Jfe.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}o(Zfe,"purgeStream")});var EO=v((S0e,yK)=>{"use strict";var hO=ea(),eme=_r(),PT=me(),rf=(q(),M(z)),Gl=Ot(),tme=ae(),pO=Q(),{RemotePayloadObject:rme}=uh(),{ErrorCode:pK}=require("nats"),{parentPort:hK}=require("worker_threads"),{onMessageByType:nme}=nt(),{getThisNodeName:sme}=(hs(),M(jo)),{requestClusterStatus:ime}=(eh(),M(C$)),{getReplicationSharedStatus:ome,getHDBNodeTable:ame}=(Fd(),M(b$)),{CONFIRMATION_STATUS_POSITION:cme,RECEIVED_VERSION_POSITION:EK,RECEIVED_TIME_POSITION:lme,SENDING_TIME_POSITION:ume,RECEIVING_STATUS_POSITION:dme,RECEIVING_STATUS_RECEIVING:fme,BACK_PRESSURE_RATIO_POSITION:mme}=(IC(),M(TV)),_K=PT.get(rf.CONFIG_PARAMS.CLUSTERING_ENABLED),gK=PT.get(rf.CONFIG_PARAMS.CLUSTERING_NODENAME);yK.exports={clusterStatus:pme,buildNodeStatus:TK};var SK;nme("cluster-status",async e=>{SK(e)});async function pme(){if(PT.get(rf.CONFIG_PARAMS.REPLICATION_URL)||PT.get(rf.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(hK){hK.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{SK=i});for(let i of n.connections){let a=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let f of Object.values(databases[l]||{}))if(u=f.auditStore,u)break;if(!u)continue;let d=ome(u,l,a);c.lastCommitConfirmed=OT(d[cme]),c.lastReceivedRemoteTime=OT(d[EK]),c.lastReceivedLocalTime=OT(d[lme]),c.lastReceivedVersion=d[EK],c.sendingMessage=OT(d[ume]),c.backPressurePercent=d[mme]*100,c.lastReceivedStatus=d[dme]===fme?"Receiving":"Waiting"}}}else n=ime();n.node_name=sme();let s=ame().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:gK,is_enabled:_K,connections:[]};if(!_K)return e;let t=await hO.getAllNodeRecords();if(tme.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(TK(t[n],e.connections));return await Promise.allSettled(r),e}o(pme,"clusterStatus");function OT(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}o(OT,"asDate");async function TK(e,t){let r=e.name,n=new rme(rf.OPERATIONS_ENUM.CLUSTER_STATUS,gK,void 0,await hO.getSystemInfo()),s,i,a=Gl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await eme.request(Gl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Gl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(a=Gl.CLUSTER_STATUS_STATUSES.CLOSED,pO.error(`Error getting node status from ${r} `,s))}catch(l){pO.warn(`Error getting node status from ${r}`,l),l.code===pK.NoResponders?a=Gl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===pK.Timeout?a=Gl.CLUSTER_STATUS_STATUSES.TIMEOUT:a=Gl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new hme(r,a,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==rf.PRE_4_0_0_VERSION&&await hO.upsertNodeRecord(l)}catch(l){pO.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}o(TK,"buildNodeStatus");function hme(e,t,r,n,s,i,a,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=a,this.system_info=c}o(hme,"NodeStatusObject")});var gO=v((y0e,RK)=>{"use strict";var{handleHDBError:Eme,hdbErrors:_me}=_e(),{HTTP_STATUS_CODES:gme}=_me,Sme=_r(),Tme=ea(),_O=ae(),LT=require("joi"),yme=mt(),Rme=2e3,bme=LT.object({timeout:LT.number().min(1),connected_nodes:LT.boolean(),routes:LT.boolean()});RK.exports=Ame;async function Ame(e){Tme.checkClusteringEnabled();let t=yme.validateBySchema(e,bme);if(t)throw Eme(t,t.message,gme.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||_O.autoCastBoolean(n),a=s===void 0||_O.autoCastBoolean(s),c={nodes:[]},l=await Sme.getServerList(r??Rme),u={};if(i)for(let d=0,f=l.length;d<f;d++){let m=l[d].statsz;m&&(u[l[d].server.name]=m.routes)}for(let d=0,f=l.length;d<f;d++){if(l[d].statsz)continue;let m=l[d].server,p=l[d].data;if(m.name.endsWith("-hub")){let h={name:m.name.slice(0,-4),response_time:l[d].response_time};i&&(h.connected_nodes=[],u[m.name]&&u[m.name].forEach(E=>{h.connected_nodes.includes(E.name.slice(0,-4))||h.connected_nodes.push(E.name.slice(0,-4))})),a&&(h.routes=p.cluster?.urls?p.cluster?.urls.map(E=>({host:E.split(":")[0],port:_O.autoCast(E.split(":")[1])})):[]),c.nodes.push(h)}}return c}o(Ame,"clusterNetwork")});var wK=v((b0e,IK)=>{"use strict";var SO=require("joi"),bK=mt(),{routeConstraints:AK}=Ow();IK.exports={setRoutesValidator:Ime,deleteRoutesValidator:wme};function Ime(e){let t=SO.object({server:SO.valid("hub","leaf"),routes:AK.required()});return bK.validateBySchema(e,t)}o(Ime,"setRoutesValidator");function wme(e){let t=SO.object({routes:AK.required()});return bK.validateBySchema(e,t)}o(wme,"deleteRoutesValidator")});var DT=v((I0e,MK)=>{"use strict";var ra=St(),TO=ae(),Ks=(q(),M(z)),nf=me(),NK=wK(),{handleHDBError:CK,hdbErrors:Nme}=_e(),{HTTP_STATUS_CODES:OK}=Nme,PK="cluster routes successfully set",LK="cluster routes successfully deleted";MK.exports={setRoutes:Ome,getRoutes:Pme,deleteRoutes:Lme};function Cme(e){let t=ra.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let a=0,c=e.routes.length;a<c;a++){let l=e.routes[a];l.port=TO.autoCast(l.port);let u=r.some(f=>f.host===l.host&&f.port===l.port),d=n.some(f=>f.host===l.host&&f.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?ra.updateConfigValue(Ks.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):ra.updateConfigValue(Ks.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:PK,set:i,skipped:s}}o(Cme,"setRoutesNats");function Ome(e){let t=NK.setRoutesValidator(e);if(t)throw CK(t,t.message,OK.BAD_REQUEST,void 0,void 0,!0);if(nf.get(Ks.CONFIG_PARAMS.CLUSTERING_ENABLED))return Cme(e);let r=[],n=[],s=nf.get(Ks.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{DK(s,i)?n.push(i):(s.push(i),r.push(i))}),ra.updateConfigValue(Ks.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:PK,set:r,skipped:n}}o(Ome,"setRoutes");function DK(e,t){return typeof t=="string"?e.includes(t):typeof t=="object"&&t!==null?e.some(r=>(r.host===t.host||r.hostname===t.hostname)&&r.port===t.port):!1}o(DK,"existsInArray");function Pme(){if(nf.get(Ks.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=ra.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return nf.get(Ks.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}o(Pme,"getRoutes");function Lme(e){let t=NK.deleteRoutesValidator(e);if(t)throw CK(t,t.message,OK.BAD_REQUEST,void 0,void 0,!0);if(nf.get(Ks.CONFIG_PARAMS.CLUSTERING_ENABLED))return Dme(e);let r=[],n=[],s=nf.get(Ks.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(a=>{DK(e.routes,a)?r.push(a):(i.push(a),n.push(a))}),ra.updateConfigValue(Ks.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:LK,deleted:r,skipped:n}}o(Lme,"deleteRoutes");function Dme(e){let t=ra.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],a=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let d=e.routes[l],f=!1;for(let m=0,p=r.length;m<p;m++){let h=r[m];if(d.host===h.host&&d.port===h.port){r.splice(m,1),f=!0,a=!0,s.push(d);break}}if(!f){let m=!0;for(let p=0,h=n.length;p<h;p++){let E=n[p];if(d.host===E.host&&d.port===E.port){n.splice(p,1),c=!0,m=!1,s.push(d);break}}m&&i.push(d)}}return a&&(r=TO.isEmptyOrZeroLength(r)?null:r,ra.updateConfigValue(Ks.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=TO.isEmptyOrZeroLength(n)?null:n,ra.updateConfigValue(Ks.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:LK,deleted:s,skipped:i}}o(Dme,"deleteRoutesNats")});var UK=v((N0e,vK)=>{"use strict";var Mme=Ot(),yO=class{static{o(this,"HubConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f,m,p,h){this.port=t,a===null&&(a=void 0),this.server_name=r+Mme.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c}},this.cluster={name:d,port:f,routes:m,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l}},this.accounts={SYS:{users:p},HDB:{users:h}},this.system_account="SYS"}};vK.exports=yO});var FK=v((O0e,BK)=>{"use strict";var xK=Ot(),RO=class{static{o(this,"LeafConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f){this.port=t,f===null&&(f=void 0),this.server_name=r+xK.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+xK.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:d,ca_file:f,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:f,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:f,insecure:!0},urls:a,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};BK.exports=RO});var HK=v((L0e,kK)=>{"use strict";var bO=class{static{o(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};kK.exports=bO});var qK=v((M0e,GK)=>{"use strict";var vme=Ot(),AO=class{static{o(this,"SysUserObject")}constructor(t,r){this.user=t+vme.SERVER_SUFFIX.ADMIN,this.password=r}};GK.exports=AO});var xT=v((U0e,KK)=>{"use strict";var ql=require("path"),$l=require("fs-extra"),Ume=UK(),xme=FK(),Bme=HK(),Fme=qK(),IO=fs(),of=ae(),Kn=St(),vT=(q(),M(z)),Th=Ot(),{CONFIG_PARAMS:ir}=vT,af=Q(),yh=me(),$K=Xi(),wO=_r(),kme=_s(),sf="clustering",Hme=1e4,VK=50;KK.exports={generateNatsConfig:qme,removeNatsConfig:$me,getHubConfigPath:Gme};function Gme(){let e=yh.get(ir.ROOTPATH);return ql.join(e,sf,Th.NATS_CONFIG_FILES.HUB_SERVER)}o(Gme,"getHubConfigPath");async function qme(e=!1,t=void 0){console.error("Warning: NATS replication is deprecated and will be removed in version 5.0 of Harper");let r=yh.get(ir.ROOTPATH);$l.ensureDirSync(ql.join(r,"clustering","leaf")),yh.initSync();let n=Kn.getConfigFromFile(ir.CLUSTERING_TLS_CERT_AUTH),s=Kn.getConfigFromFile(ir.CLUSTERING_TLS_PRIVATEKEY),i=Kn.getConfigFromFile(ir.CLUSTERING_TLS_CERTIFICATE);!await $l.exists(i)&&!await $l.exists(!n)&&await kme.createNatsCerts();let a=ql.join(r,sf,Th.PID_FILES.HUB),c=ql.join(r,sf,Th.PID_FILES.LEAF),l=Kn.getConfigFromFile(ir.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=ql.join(r,sf,Th.NATS_CONFIG_FILES.HUB_SERVER),d=ql.join(r,sf,Th.NATS_CONFIG_FILES.LEAF_SERVER),f=Kn.getConfigFromFile(ir.CLUSTERING_TLS_INSECURE),m=Kn.getConfigFromFile(ir.CLUSTERING_TLS_VERIFY),p=Kn.getConfigFromFile(ir.CLUSTERING_NODENAME),h=Kn.getConfigFromFile(ir.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await wO.checkNATSServerInstalled()||UT("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let E=await IO.listUsers(),g=Kn.getConfigFromFile(ir.CLUSTERING_USER),R=await IO.getClusterUser();(of.isEmpty(R)||R.active!==!0)&&UT(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await MT(ir.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await MT(ir.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await MT(ir.CLUSTERING_HUBSERVER_NETWORK_PORT),await MT(ir.CLUSTERING_LEAFSERVER_NETWORK_PORT));let S=[],y=[];for(let[X,W]of E.entries())W.role?.role===vT.ROLE_TYPES_ENUM.CLUSTER_USER&&W.active&&(S.push(new Fme(W.username,$K.decrypt(W.hash))),y.push(new Bme(W.username,$K.decrypt(W.hash))));let C=[],{hub_routes:I}=Kn.getClusteringRoutes();if(!of.isEmptyOrZeroLength(I))for(let X of I)C.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${X.host}:${X.port}`);let k=new Ume(Kn.getConfigFromFile(ir.CLUSTERING_HUBSERVER_NETWORK_PORT),p,a,i,s,n,f,m,h,Kn.getConfigFromFile(ir.CLUSTERING_HUBSERVER_CLUSTER_NAME),Kn.getConfigFromFile(ir.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),C,S,y);n==null&&(delete k.tls.ca_file,delete k.leafnodes.tls.ca_file),t=of.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===vT.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await $l.writeJson(u,k),af.trace(`Hub server config written to ${u}`));let J=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,G=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,H=new xme(Kn.getConfigFromFile(ir.CLUSTERING_LEAFSERVER_NETWORK_PORT),p,c,l,[J],[G],S,y,i,s,n,f);n==null&&delete H.tls.ca_file,(t===void 0||t===vT.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await $l.writeJson(d,H),af.trace(`Leaf server config written to ${d}`))}o(qme,"generateNatsConfig");async function MT(e){let t=yh.get(e);return of.isEmpty(t)&&UT(`port undefined for '${e}'`),await of.isPortTaken(t)&&UT(`'${e}' port '${t}' is is in use by another process, check to see if HarperDB is already running or another process is using this port.`),!0}o(MT,"isPortAvailable");function UT(e){let t=`Error generating clustering config: ${e}`;af.error(t),console.error(t),process.exit(1)}o(UT,"generateNatsConfigError");async function $me(e){let{port:t,config_file:r}=wO.getServerConfig(e),{username:n,decrypt_hash:s}=await IO.getClusterUser(),i=0,a=2e3;for(;i<VK;){try{let d=await wO.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){af.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=VK)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=a*(i*2);u>3e4&&af.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await of.asyncSetTimeout(u)}let c="0".repeat(Hme),l=ql.join(yh.get(ir.ROOTPATH),sf,r);await $l.writeFile(l,c),await $l.remove(l),af.notify(e,"started.")}o($me,"removeNatsConfig")});var JK=v((B0e,QK)=>{"use strict";var Ss=me(),Xe=(q(),M(z)),Rh=Ot(),na=require("path"),{PACKAGE_ROOT:FT}=Ct(),YK=me(),BT=ae(),cf="/dev/null",Vme=na.join(FT,"launchServiceScripts"),WK=na.join(FT,"utility/scripts"),Kme=na.join(WK,Xe.HDB_RESTART_SCRIPT),zK=na.resolve(FT,"dependencies",`${process.platform}-${process.arch}`,Rh.NATS_BINARY_NAME);function jK(){let e={[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0,...process.env};return BT.noBootFile()&&(e[Xe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=BT.getEnvCliRootPath()),{name:Xe.PROCESS_DESCRIPTORS.HDB,script:Xe.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:e,execArgv:process.execArgv,cwd:FT}}o(jK,"generateMainServerConfig");var Yme=9930;function Wme(){Ss.initSync(!0);let e=Ss.get(Xe.CONFIG_PARAMS.ROOTPATH),t=na.join(e,"clustering",Rh.NATS_CONFIG_FILES.HUB_SERVER),r=na.join(Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Xe.LOG_NAMES.HDB),n=YK.get(Xe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Rh.LOG_LEVEL_FLAGS[Ss.get(Xe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Yme?"-"+n:""),binFile:zK,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=cf,i.error_file=cf),i}o(Wme,"generateNatsHubServerConfig");var zme=9940;function jme(){Ss.initSync(!0);let e=Ss.get(Xe.CONFIG_PARAMS.ROOTPATH),t=na.join(e,"clustering",Rh.NATS_CONFIG_FILES.LEAF_SERVER),r=na.join(Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Xe.LOG_NAMES.HDB),n=YK.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Rh.LOG_LEVEL_FLAGS[Ss.get(Xe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==zme?"-"+n:""),binFile:zK,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=cf,i.error_file=cf),i}o(jme,"generateNatsLeafServerConfig");function Qme(){Ss.initSync();let e=na.join(Ss.get(Xe.CONFIG_PARAMS.LOGGING_ROOT),Xe.LOG_NAMES.HDB),t={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,binFile:Xe.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:Vme,autorestart:!1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=cf,t.error_file=cf),t}o(Qme,"generateClusteringUpgradeV4ServiceConfig");function Jme(){let e={[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.RESTART_HDB};return BT.noBootFile()&&(e[Xe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=BT.getEnvCliRootPath()),{...{name:Xe.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:WK},script:Kme}}o(Jme,"generateRestart");function Xme(){return{apps:[jK()]}}o(Xme,"generateAllServiceConfigs");QK.exports={generateAllServiceConfigs:Xme,generateMainServerConfig:jK,generateRestart:Jme,generateNatsHubServerConfig:Wme,generateNatsLeafServerConfig:jme,generateClusteringUpgradeV4ServiceConfig:Qme}});var lf=v((H0e,sY)=>{"use strict";var Or=(q(),M(z)),k0e=ae(),ia=xT(),kT=_r(),sa=Ot(),hc=JK(),CO=me(),Ec=Q(),Zme=ea(),{startWorker:XK,onMessageFromWorkers:epe}=nt(),ZK=require("fs"),tpe=require("node:path"),rpe=(q(),M(z)),{setTimeout:npe}=require("node:timers/promises"),{execFile:spe,fork:ipe}=require("node:child_process");sY.exports={start:_c,restart:ape,kill:dpe,startAllServices:fpe,startService:tY,restartHdb:cpe,startClusteringProcesses:rY,startClusteringThreads:nY,isHdbRestartRunning:lpe,getHdbPid:upe,cleanupChildrenProcesses:bh,reloadClustering:ppe,expectedRestartOfChildren:eY};epe(e=>{e.type==="restart"&&CO.initSync(!0)});var lo=[],ope=10,NO;function _c(e,t=!1){let r=typeof e.args=="string"?e.args.split(" "):e.args;e.silent=!0,e.detached=!0;let n=e.script?ipe(e.script,r,e):spe(e.binFile,r,e);n.name=e.name,n.config=e,n.on("error",(a,c)=>{console.error(a,c)}),n.on("exit",async a=>{let c=lo.indexOf(n);c>-1&&lo.splice(c,1),!NO&&a!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<ope&&(ZK.existsSync(ia.getHubConfigPath())?_c(e):(await ia.generateNatsConfig(!0),_c(e),await new Promise(l=>setTimeout(l,3e3)),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let s={serviceName:e.name.replace(/ /g,"-")};function i(a){let c=CO.get(Or.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),l=/\[\d+][^\[]+\[(\w+)]/g,u,d=0,f;for(;u=l.exec(a);){if(u.index&&sa.LOG_LEVEL_HIERARCHY[c]>=sa.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===sa.LOG_LEVELS.ERR||f===sa.LOG_LEVELS.WRN?Ec.OUTPUTS.STDERR:Ec.OUTPUTS.STDOUT;Ec.logCustomLevel(f||"info",h,s,a.slice(d,u.index).trim())}let[m,p]=u;d=u.index+m.length,f=sa.LOG_LEVELS[p]}if(sa.LOG_LEVEL_HIERARCHY[c]>=sa.LOG_LEVEL_HIERARCHY[f||"info"]){let m=f===sa.LOG_LEVELS.ERR||f===sa.LOG_LEVELS.WRN?Ec.OUTPUTS.STDERR:Ec.OUTPUTS.STDOUT;Ec.logCustomLevel(f||"info",m,s,a.toString().slice(d).trim())}}o(i,"extractMessages"),n.stdout.on("data",i),n.stderr.on("data",i),n.unref(),lo.length===0&&(t||(process.on("exit",bh),process.on("SIGINT",bh),process.on("SIGQUIT",bh),process.on("SIGTERM",bh))),lo.push(n)}o(_c,"start");function bh(e=!0){if(!NO&&(NO=!0,lo.length!==0))if(Ec.info("Killing child processes..."),lo.map(t=>t.kill()),e)process.exit(0);else return npe(2e3)}o(bh,"cleanupChildrenProcesses");function ape(e){eY();for(let t of lo)t.name===e&&t.kill()}o(ape,"restart");function eY(){for(let e of lo)e.config&&(e.config.restarts=0)}o(eY,"expectedRestartOfChildren");async function cpe(){await _c(hc.generateRestart())}o(cpe,"restartHdb");async function lpe(){let e=await list();for(let t in e)if(e[t].name===Or.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}o(lpe,"isHdbRestartRunning");function upe(){let e=CO.getHdbBasePath();if(!e)return;let t=tpe.join(e,rpe.HDB_PID_FILE),r=hpe(t);if(!(!r||r===process.pid)&&Epe(r))return r}o(upe,"getHdbPid");function dpe(){for(let e of lo)e.kill();lo=[]}o(dpe,"kill");async function fpe(){await rY(),await nY(),await _c(hc.generateAllServiceConfigs())}o(fpe,"startAllServices");async function tY(e,t=!1){let r;switch(e=e.toLowerCase(),e){case Or.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=hc.generateMainServerConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=hc.generateNatsIngestServiceConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=hc.generateNatsReplyServiceConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=hc.generateNatsHubServerConfig(),await _c(r,t),await ia.removeNatsConfig(e);return;case Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=hc.generateNatsLeafServerConfig(),await _c(r,t),await ia.removeNatsConfig(e);return;case Or.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=hc.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}_c(r,t)}o(tY,"startService");var mpe;async function rY(e=!1){for(let t in Or.CLUSTERING_PROCESSES){let r=Or.CLUSTERING_PROCESSES[t];await tY(r,e)}}o(rY,"startClusteringProcesses");async function nY(){mpe=XK(Or.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:Or.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await kT.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await kT.updateLocalStreams();let e=await Zme.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===Or.PRE_4_0_0_VERSION){Ec.info("Starting clustering upgrade 4.0.0 process"),XK(Or.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}o(nY,"startClusteringThreads");async function ppe(){await ia.generateNatsConfig(!0),await kT.reloadNATSHub(),await kT.reloadNATSLeaf(),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}o(ppe,"reloadClustering");function hpe(e){try{return Number.parseInt(ZK.readFileSync(e,"utf8"),10)}catch{return null}}o(hpe,"readPidFile");function Epe(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(Epe,"isProcessRunning")});var LO={};Re(LO,{compactOnStart:()=>_pe,copyDb:()=>uY});async function _pe(){gc.notify("Running compact on start"),console.log("Running compact on start");let e=(0,OO.get)(F.ROOTPATH),t=new Map,r=at();(0,PO.updateConfigValue)(F.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,HT.join)(e,"backup",n+".mdb"),a=(0,HT.join)(e,qc,n+"-copy.mdb"),c=0;try{c=await iY(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){gc.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{dbPath:s,copyDest:a,backupDest:i,recordCount:c}),await uY(n,a),console.log("Backing up",n,"to",i);try{await(0,Vl.move)(s,i,{overwrite:!0})}catch(l){console.log("Error moving database",s,"to",i,l)}}try{Td()}catch(n){gc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}for(let[n,{dbPath:s,copyDest:i}]of t)console.log("Moving copy compacted",n,"to",s),await(0,Vl.move)(i,s,{overwrite:!0}),await(0,Vl.remove)((0,HT.join)(e,qc,`${n}-copy.mdb-lock`));try{Td()}catch(n){gc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){gc.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,PO.updateConfigValue)(F.STORAGE_COMPACTONSTART,!1);for(let[s,{dbPath:i,backupDest:a}]of t){console.error("Moving backup database",a,"back to",i);try{await(0,Vl.move)(a,i,{overwrite:!0})}catch(c){console.error(c)}}throw Td(),n}for(let[n,{backupDest:s,recordCount:i}]of t){let a=!0,c=await iY(n);if(console.log("Database",n,"after compact has a total record count of",c),i!==c){a=!1;let l=`There is a discrepancy between pre and post compact record count for database ${n}.
18
+ `)}function xle(e){let t=[],r=e;for(;r?.raw;){let n={cert:r.raw};if(r.issuerCertificate&&r.issuerCertificate!==r&&r.issuerCertificate.raw&&(n.issuer=r.issuerCertificate.raw),t.push(n),r.issuerCertificate&&r.issuerCertificate!==r)r=r.issuerCertificate;else break}return t}var nT,NV,CV,ht,NC,Jo,rT,sT=se(()=>{IV();nT=require("easy-ocsp"),NV=require("node:crypto"),CV=b(Zn());we();Ga();ht=(0,CV.loggerWithTag)("cert-verification"),NC=class extends Hr{static{o(this,"CertificateVerificationSource")}async get(t){ht.debug?.("CertificateVerificationSource.get called for:",t);let r=this.getContext(),n=r?.requestContext;if(!n||!n.certPem||!n.issuerPem)throw new Error(`No certificate data provided for cache key: ${t}`);let{certPem:s,issuerPem:i,config:a}=n;ht.trace?.("Performing OCSP check with config:",a);try{let c=a?.timeout??Jo.timeout,l=await Promise.race([Ule(s,i,c),new Promise((m,p)=>setTimeout(()=>p(new Error("OCSP timeout")),c))]);if(ht.debug?.("OCSP check result:",l),l.status==="unknown"&&(l.reason==="ocsp-error"||l.reason==="timeout"||l.reason==="no-ocsp-url")){let m=a?.failureMode??Jo.failureMode;if(ht.error?.("OCSP check failed:",l.reason),m==="fail-closed"){let p=a?.errorCacheTtl??Jo.errorCacheTtl,h=Date.now()+p;return r&&(r.expiresAt=h),{certificate_id:t,status:l.status,reason:l.reason,checked_at:Date.now(),expiresAt:h,method:"ocsp"}}else return ht.warn?.("OCSP check failed, allowing connection (fail-open mode)"),null}let d=a?.cacheTtl??Jo.cacheTtl,f=Date.now()+d;return r&&(r.expiresAt=f),{certificate_id:t,status:l.status,reason:l.reason,checked_at:Date.now(),expiresAt:f,method:"ocsp"}}catch(c){if(ht.error?.("OCSP verification error:",c),(a?.failureMode??Jo.failureMode)==="fail-closed"){let u=a?.errorCacheTtl??Jo.errorCacheTtl,d=Date.now()+u;return r&&(r.expiresAt=d),{certificate_id:t,status:"unknown",reason:c.message,checked_at:Date.now(),expiresAt:d,method:"ocsp"}}return ht.warn?.("OCSP check failed, allowing connection (fail-open mode)"),null}}},Jo={timeout:5e3,cacheTtl:36e5,errorCacheTtl:3e5,failureMode:"fail-open"};o(Dle,"getCertificateCacheTable");o(Mle,"getCertificateVerificationConfig");o(Kd,"verifyCertificate");o(vle,"verifyOCSP");o(Ule,"performOCSPCheck");o(wV,"bufferToPem");o(xle,"extractCertificateChain")});var jo={};Re(jo,{clearThisNodeName:()=>Kle,disableReplication:()=>Hle,enabledDatabases:()=>cc,forEachReplicatedDatabase:()=>nc,getThisNodeId:()=>tT,getThisNodeName:()=>it,getThisNodeUrl:()=>sc,hostnameToUrl:()=>cT,lastTimeInAuditStore:()=>jp,monitorNodeCAs:()=>BV,replicateOperation:()=>Wle,replicationCertificateAuthorities:()=>Qo,sendOperationToNode:()=>ah,servers:()=>Fle,setReplicator:()=>kV,start:()=>kle,startOnMainThread:()=>rC,subscribeToNode:()=>Zp,unsubscribeFromNode:()=>GS,urlToNodeName:()=>_i});function kle(e){if(!e.port&&!e.securePort&&(e.port=$s.default.get(F.OPERATIONSAPI_NETWORK_PORT),e.securePort=$s.default.get(F.OPERATIONSAPI_NETWORK_SECUREPORT)),!it())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of Jp(e))t.set(_i(s.url),s);Gle(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=ve.ws(async(s,i,a,c)=>{if(It.debug("Incoming WS connection received "+i.url),i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,a);s._socket.unref(),sh(s,e,a.then(()=>i?.user)),s.on("error",l=>{l.code!=="ECONNREFUSED"&&It.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,ve.http(async(s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){It.debug("Incoming replication WS connection received, authorized: "+s.authorized),!s.authorized&&s._nodeRequest.socket.authorizationError&&It.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let a=jt().primaryStore;if(s.authorized&&s.peerCertificate.subjectaltname){let c=(0,UV.getHostnamesFromCertificate)(s.peerCertificate),l;for(let u of c)if(l=u&&(a.get(u)||t.get(u)),l)break;if(l){let u=await Kd(s.peerCertificate,e);if(!u.valid){It.warn("Certificate verification failed:",u.status,"for node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){It.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l}else It.warn(`No node found for certificate common name/SANs: ${c}, available nodes are ${Array.from(a.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=a.get(s.ip)||t.get(s.ip);c?s.user=c:It.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...a.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=o(()=>{let a=new Set(s.secureContexts.values());s.defaultContext&&a.add(s.defaultContext);for(let c of a)try{let l=Array.from(Qo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=aT.createSecureContext(u)}catch(l){It.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),$s.default.get(F.REPLICATION_ENABLEROOTCAS)!==!1&&i()}BV(()=>{for(let s of n)s()})}function BV(e){let t=0;Bd(r=>{r?.ca&&(Qo.add(r.ca),Qo.size!==t&&(t=Qo.size,e?.()))})}function Hle(e=!0){xV=e}function Gle(e){xV||(at(),cc=e.databases,nc(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||lc;for(let[s,i]of oT){let a=i.get(r);a&&(a.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];kV(r,s,e),AC.get(s)?.forEach(i=>i(s))}}))}function kV(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 FV extends Hr{static{o(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||lc,a=i.get(e),c=a?.tableById||[];c[t.tableId]=t;let l=a?.ready;if(It.trace("Setting up replicator subscription to database",e),!a?.auditStore)return this.subscription=a=new Xn,i.set(e,a),a.tableById=c,a.auditStore=t.auditStore,a.dbisDB=t.dbisDB,a.databaseName=e,l&&l(a),a;this.subscription=a}static subscribeOnThisThread(i,a){return!0}static async load(i){if(i){let a=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),a]);if(c){let l,u=new Set;do{let d,f="",m=1/0;for(let h of c){if(u.has(h)||h===ve.hostname)continue;let E=$le(h,FV.subscription,e);if(E?.isConnected){let g=xd(t.auditStore,e,h)[ZS];(!d||g<m)&&(d=E,f=h,m=g)}}if(!d)throw l||new MV.ServerError(`No connection to any other nodes are available: ${c}`,502);let p={requestId:Ble++,table:t,entry:i,id:i.key};u.add(f);try{return await d.getRecord(p)}catch(h){if(d.isConnected)throw h;It.warn("Error in load from node",Bl,h),l||(l=h)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function qle(e,t,r,n,s){let i=oT.get(e);i||oT.set(e,i=new Map);let a=i.get(r);if(a)return a;if(t)return i.set(r,a=new Vd(e,t,r,n,s)),a.connect(),a.once("finished",()=>i.delete(r)),a}function $le(e,t,r){let n=OV.get(Bl);n||(n=new Map,OV.set(Bl,n));let s=n.get(r);if(s)return s;let i=jt().primaryStore.get(e);return i?.url&&(s=new Vd(i.url,t,r,Bl,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function ah(e,t,r){r||(r={}),r.serverName=e.name;let n=await eT(e.url,r),s=sh(n,{},{});return new Promise((i,a)=>{n.on("open",()=>{It.debug("Sending operation connection to "+e.url+" opened",t),i(s.sendOperation(t))}),n.on("error",c=>{a(c)}),n.on("close",c=>{It.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function Zp(e){try{vV.isMainThread&&It.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=lc.get(e.database);if(!t){let n;t=new Promise(s=>{It.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,lc.set(e.database,t)}let r=qle(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=>Qp(n,e.database)),e.replicateByDefault)}catch(t){It.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function GS({name:e,url:t,database:r}){It.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(jt().primaryStore.getRange({})));let n=oT.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Vle(){if(CC!==void 0)return CC;let e=$s.default.get(F.OPERATIONSAPI_TLS_CERTIFICATE)||$s.default.get(F.TLS_CERTIFICATE);if(e)return CC=new LV.X509Certificate((0,DV.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function it(){return Bl||(Bl=$s.default.get("replication_hostname")??_i($s.default.get("replication_url"))??Vle()??PV("operationsapi_network_secureport")??PV("operationsapi_network_port")??"127.0.0.1")}function Kle(){Bl=void 0}function PV(e){let t=$s.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function iT(e){let t=$s.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function tT(e){return zp(e)?.[it()]}function sc(){let e=$s.default.get("replication_url");return e||cT(it())}function cT(e){let t=iT("replication_port");if(t)return`ws://${e}:${t}`;if(t=iT("replication_secureport"),t)return`wss://${e}:${t}`;if(t=iT("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=iT("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function _i(e){if(e)return new URL(e).hostname}function nc(e,t){for(let n of Object.getOwnPropertyNames(De))r(n);return Bp(n=>{r(n)}),Ol((n,s)=>{r(n.databaseName)});function r(n){let s=De[n];It.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):Yle(n)&&t(s,n,!1)}o(r,"forDatabase")}function Yle(e){let t=De[e];for(let r in t)if(t[r].replicate)return!0}function jp(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function Wle(e){let t={message:""};if(e.replicated){e.replicated=!1,It.trace?.("Replicating operation",e.operation,"to nodes",ve.nodes.map(n=>n.name));let r=await Promise.allSettled(ve.nodes.map(n=>ah(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=ve.nodes[s]?.name,i})}return t}var $s,It,LV,DV,aT,MV,vV,UV,xV,Ble,Fle,Qo,cc,oT,OV,CC,Bl,hs=se(()=>{we();Ga();wu();IC();Fr();$s=b(me()),It=b(Q()),LV=require("crypto");sT();DV=require("fs");eh();Fd();q();tC();aT=b(require("node:tls")),MV=b(_e()),vV=require("worker_threads"),UV=b(_s()),Ble=1,Fle=[],Qo=$s.default.get(F.REPLICATION_ENABLEROOTCAS)!==!1?new Set(aT.rootCertificates):new Set;o(kle,"start");o(BV,"monitorNodeCAs");o(Hle,"disableReplication");o(Gle,"assignReplicationSource");o(kV,"setReplicator");oT=new Map;o(qle,"getSubscriptionConnection");OV=new Map;o($le,"getRetrievalConnectionByName");o(ah,"sendOperationToNode");o(Zp,"subscribeToNode");o(GS,"unsubscribeFromNode");o(Vle,"getCommonNameFromCert");o(it,"getThisNodeName");o(Kle,"clearThisNodeName");Object.defineProperty(ve,"hostname",{get(){return it()}});o(PV,"getHostFromListeningPort");o(iT,"getPortFromListeningPort");o(tT,"getThisNodeId");ve.replication={getThisNodeId:tT,exportIdMapping:zp};o(sc,"getThisNodeUrl");o(cT,"hostnameToUrl");o(_i,"urlToNodeName");o(nc,"forEachReplicatedDatabase");o(Yle,"hasExplicitlyReplicatedTable");o(jp,"lastTimeInAuditStore");o(Wle,"replicateOperation")});var mT=v((JUe,VV)=>{"use strict";var Yd=h$(),{validateBySchema:ch}=mt(),{commonValidators:Wd,schemaRegex:OC}=Ki(),Er=require("joi"),zle=Q(),jle=require("uuid").v4,dT=Ho(),zd=(q(),M(z)),Qle=require("util"),uc=cs(),{handleHDBError:Xo,hdbErrors:Jle,ClientError:Fl}=_e(),{HDB_ERROR_MSGS:lT,HTTP_STATUS_CODES:Zo}=Jle,{SchemaEventMsg:fT}=is(),HV=_r(),{getDatabases:Xle}=(we(),M(ft)),{transformReq:jd}=ae(),{replicateOperation:GV}=(hs(),M(jo)),{cleanupOrphans:Zle}=(es(),M(C_)),uT=Er.string().min(1).max(Wd.schema_length.maximum).pattern(OC).messages({"string.pattern.base":"{:#label} "+Wd.schema_format.message}),eue=Er.string().min(1).max(Wd.schema_length.maximum).pattern(OC).messages({"string.pattern.base":"{:#label} "+Wd.schema_format.message}).required(),tue=Er.string().min(1).max(Wd.schema_length.maximum).pattern(OC).messages({"string.pattern.base":"{:#label} "+Wd.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();VV.exports={createSchema:rue,createSchemaStructure:qV,createTable:nue,createTableStructure:$V,createAttribute:cue,dropSchema:sue,dropTable:iue,dropAttribute:oue,getBackup:lue,cleanupOrphanBlobs:uue};async function rue(e){let t=await qV(e);return dT.signalSchemaChange(new fT(process.pid,e.operation,e.schema)),t}o(rue,"createSchema");async function qV(e){let t=ch(e,Er.object({database:uT,schema:uT}));if(t)throw new Fl(t.message);if(jd(e),!await Yd.checkSchemaExists(e.schema))throw Xo(new Error,lT.SCHEMA_EXISTS_ERR(e.schema),Zo.BAD_REQUEST,zd.LOG_LEVELS.ERROR,lT.SCHEMA_EXISTS_ERR(e.schema),!0);return await uc.createSchema(e),`database '${e.schema}' successfully created`}o(qV,"createSchemaStructure");async function nue(e){return jd(e),e.hash_attribute=e.primary_key??e.hash_attribute,await $V(e)}o(nue,"createTable");async function $V(e){let t=ch(e,Er.object({database:uT,schema:uT,table:eue,residence:Er.array().items(Er.string().min(1)).optional(),hash_attribute:tue}));if(t)throw new Fl(t.message);if(!await Yd.checkSchemaTableExists(e.schema,e.table))throw Xo(new Error,lT.TABLE_EXISTS_ERR(e.schema,e.table),Zo.BAD_REQUEST,zd.LOG_LEVELS.ERROR,lT.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:jle(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await uc.createTable(n,e);else throw Xo(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Zo.BAD_REQUEST);else await uc.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}o($V,"createTableStructure");async function sue(e){let t=ch(e,Er.object({database:Er.string(),schema:Er.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Fl(t.message);jd(e);let r=await Yd.checkSchemaExists(e.schema);if(r)throw Xo(new Error,r,Zo.NOT_FOUND,zd.LOG_LEVELS.ERROR,r,!0);let n=await Yd.schemaDescribe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await uc.dropSchema(e),dT.signalSchemaChange(new fT(process.pid,e.operation,e.schema)),await HV.purgeSchemaTableStreams(e.schema,s);let i=await GV(e);return i.message=`successfully deleted '${e.schema}'`,i}o(sue,"dropSchema");async function iue(e){let t=ch(e,Er.object({database:Er.string(),schema:Er.string(),table:Er.string().required()}));if(t)throw new Fl(t.message);jd(e);let r=await Yd.checkSchemaTableExists(e.schema,e.table);if(r)throw Xo(new Error,r,Zo.NOT_FOUND,zd.LOG_LEVELS.ERROR,r,!0);await uc.dropTable(e),await HV.purgeTableStream(e.schema,e.table);let n=await GV(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}o(iue,"dropTable");async function oue(e){let t=ch(e,Er.object({database:Er.string(),schema:Er.string(),table:Er.string().required(),attribute:Er.string().required()}));if(t)throw new Fl(t.message);jd(e);let r=await Yd.checkSchemaTableExists(e.schema,e.table);if(r)throw Xo(new Error,r,Zo.NOT_FOUND,zd.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Xo(new Error,"You cannot drop a hash attribute",Zo.BAD_REQUEST,void 0,void 0,!0);if(zd.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Xo(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Zo.BAD_REQUEST,void 0,void 0,!0);try{return await uc.dropAttribute(e),aue(e),dT.signalSchemaChange(new fT(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw zle.error(`Got an error deleting attribute ${Qle.inspect(e)}.`),n}}o(oue,"dropAttribute");function aue(e){let t=Object.values(global.hdb_schema[e.schema][e.table].attributes);for(let r=0;r<t.length;r++)t[r].attribute===e.attribute&&global.hdb_schema[e.schema][e.table].attributes.splice(r,1)}o(aue,"dropAttributeFromGlobal");async function cue(e){jd(e);let t=Xle()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Xo(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Zo.BAD_REQUEST,void 0,void 0,!0);return await uc.createAttribute(e),dT.signalSchemaChange(new fT(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}o(cue,"createAttribute");function lue(e){return uc.getBackup(e)}o(lue,"getBackup");function uue(e){if(!e.database)throw new Fl('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new Fl(`Unknown database '${e.database}'`);return Zle(databases[e.database]),{message:"Orphaned blobs cleanup started, check logs for progress"}}o(uue,"cleanupOrphanBlobs")});var YV=v((ZUe,KV)=>{"use strict";var{OPERATIONS_ENUM:due}=(q(),M(z)),PC=class{static{o(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=due.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};KV.exports=PC});var LC=v((rxe,JV)=>{"use strict";var fue=cs(),txe=YV(),pT=ae(),hT=(q(),M(z)),mue=me(),{handleHDBError:WV,hdbErrors:pue}=_e(),{HDB_ERROR_MSGS:zV,HTTP_STATUS_CODES:jV}=pue,hue=Object.values(hT.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),QV="To use this operation audit log must be enabled in harperdb-config.yaml";JV.exports=Eue;async function Eue(e){if(pT.isEmpty(e.schema))throw new Error(zV.SCHEMA_REQUIRED_ERR);if(pT.isEmpty(e.table))throw new Error(zV.TABLE_REQUIRED_ERR);if(!mue.get(hT.CONFIG_PARAMS.LOGGING_AUDITLOG))throw WV(new Error,QV,jV.BAD_REQUEST,hT.LOG_LEVELS.ERROR,QV,!0);let t=pT.checkSchemaTableExist(e.schema,e.table);if(t)throw WV(new Error,t,jV.NOT_FOUND,hT.LOG_LEVELS.ERROR,t,!0);if(!pT.isEmpty(e.search_type)&&hue.indexOf(e.search_type)<0)throw new Error(`Invalid searchType '${read_audit_log_object.search_type}'`);return await fue.readAuditLog(e)}o(Eue,"readAuditLog")});var ZV=v((sxe,XV)=>{"use strict";var{OPERATIONS_ENUM:_ue}=(q(),M(z)),DC=class{static{o(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=_ue.GET_BACKUP,this.schema=t,this.table=r}};XV.exports=DC});var r1=v((cxe,t1)=>{"use strict";var gue=cs(),oxe=ZV(),MC=ae(),Sue=(q(),M(z)),axe=me(),{handleHDBError:Tue,hdbErrors:yue}=_e(),{HDB_ERROR_MSGS:e1,HTTP_STATUS_CODES:Rue}=yue;t1.exports=bue;async function bue(e){if(MC.isEmpty(e.schema))throw new Error(e1.SCHEMA_REQUIRED_ERR);if(MC.isEmpty(e.table))throw new Error(e1.TABLE_REQUIRED_ERR);let t=MC.checkSchemaTableExist(e.schema,e.table);if(t)throw Tue(new Error,t,Rue.NOT_FOUND,Sue.LOG_LEVELS.ERROR,t,!0);return await gue.getBackup(readAuditLogObject)}o(bue,"getBackup")});var o1=v((uxe,i1)=>{"use strict";var Aue=me(),dc=require("joi"),Iue=mt(),n1=require("moment"),wue=require("fs-extra"),vC=require("path"),Nue=require("lodash"),lh=(q(),M(z)),{LOG_LEVELS:kl}=(q(),M(z)),Cue="YYYY-MM-DD hh:mm:ss",Oue=vC.resolve(__dirname,"../logs");i1.exports=function(e){return Iue.validateBySchema(e,Pue)};var Pue=dc.object({from:dc.custom(s1),until:dc.custom(s1),level:dc.valid(kl.NOTIFY,kl.FATAL,kl.ERROR,kl.WARN,kl.INFO,kl.DEBUG,kl.TRACE),order:dc.valid("asc","desc"),limit:dc.number().min(1),start:dc.number().min(0),log_name:dc.custom(Lue)});function s1(e,t){if(n1(e,n1.ISO_8601).format(Cue)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}o(s1,"validateDatetime");function Lue(e,t){if(Nue.invert(lh.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Aue.get(lh.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?lh.LOG_NAMES.HDB:e,i=s===lh.LOG_NAMES.INSTALL?vC.join(Oue,lh.LOG_NAMES.INSTALL):vC.join(n,s);return wue.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}o(Lue,"validateReadLogPath")});var xC=v((fxe,c1)=>{"use strict";var ET=(q(),M(z)),Due=Q(),Mue=me(),vue=o1(),UC=require("path"),a1=require("fs-extra"),{once:Uue}=require("events"),{handleHDBError:xue,hdbErrors:Bue}=_e(),{PACKAGE_ROOT:Fue}=Ct(),{replicateOperation:kue}=(hs(),M(jo)),Hue=UC.join(Fue,"logs"),Gue=1e3,que=200;c1.exports=$ue;async function $ue(e){let t=vue(e);if(t)throw xue(t,t.message,Bue.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=kue(e),n=Mue.get(ET.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e.log_name===void 0?ET.LOG_NAMES.HDB:e.log_name,i=s===ET.LOG_NAMES.INSTALL?UC.join(Hue,ET.LOG_NAMES.INSTALL):UC.join(n,s),a=e.level!==void 0,c=a?e.level:void 0,l=e.from!==void 0,u=l?new Date(e.from):void 0,d=e.until!==void 0,f=d?new Date(e.until):void 0,m=e.limit===void 0?Gue:e.limit,p=e.order===void 0?void 0:e.order,h=e.start===void 0?0:e.start,E=h+m,g=0;p==="desc"&&!u&&!f&&(g=Math.max(a1.statSync(i).size-(E+5)*que,0));let R=a1.createReadStream(i,{start:g});R.on("error",G=>{Due.error(G)});let S=0,y=[],C="",I;R.on("data",G=>{let H=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;G=C+G;let X=0,W;for(;(W=H.exec(G))&&!R.destroyed;){I&&(I.message=G.slice(X,W.index),k(I));let[ue,ce,te]=W,ye=te.split("] ["),Ae=ye[0],Ye=ye[1];ye.splice(0,2),I={timestamp:ce,thread:Ae,level:Ye,tags:ye,message:""},X=W.index+ue.length}C=G.slice(X)}),R.on("end",G=>{R.destroyed||I&&(I.message=C.trim(),k(I))}),R.resume();function k(G){let H,X,W;switch(!0){case(a&&l&&d):H=new Date(G.timestamp),X=new Date(u),W=new Date(f),G.level===c&&H>=X&&H<=W&&S<h?S++:G.level===c&&H>=X&&H<=W&&(co(G,p,y),S++,S===E&&R.destroy());break;case(a&&l):H=new Date(G.timestamp),X=new Date(u),G.level===c&&H>=X&&S<h?S++:G.level===c&&H>=X&&(co(G,p,y),S++,S===E&&R.destroy());break;case(a&&d):H=new Date(G.timestamp),W=new Date(f),G.level===c&&H<=W&&S<h?S++:G.level===c&&H<=W&&(co(G,p,y),S++,S===E&&R.destroy());break;case(l&&d):H=new Date(G.timestamp),X=new Date(u),W=new Date(f),H>=X&&H<=W&&S<h?S++:H>=X&&H<=W&&(co(G,p,y),S++,S===E&&R.destroy());break;case a:G.level===c&&S<h?S++:G.level===c&&(co(G,p,y),S++,S===E&&R.destroy());break;case l:H=new Date(G.timestamp),X=new Date(u),H>=X&&S<h?S++:H>=X&&S>=h&&(co(G,p,y),S++,S===E&&R.destroy());break;case d:H=new Date(G.timestamp),W=new Date(f),H<=W&&S<h?S++:H<=W&&S>=h&&(co(G,p,y),S++,S===E&&R.destroy());break;default:S<h?S++:(co(G,p,y),S++,S===E&&R.destroy())}}o(k,"onLogMessage"),await Uue(R,"close");let J=await r;if(J.replicated){for(let G of y)G.node=server.hostname;for(let G of J.replicated){let H=G.node;if(G.status==="failed")co({timestamp:new Date().toISOString(),level:"error",node:H,message:`Error retrieving logs: ${G.reason}`},p,y);else for(let X of G.results)X.node=H,co(X,p,y)}}return y}o($ue,"readLog");function co(e,t,r){t==="desc"?Vue(e,r):t==="asc"?Kue(e,r):r.push(e)}o(co,"pushLineToResult");function Vue(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)>r?n=i+1:s=i}t.splice(n,0,e)}o(Vue,"insertDescending");function Kue(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)<r?n=i+1:s=i}t.splice(n,0,e)}o(Kue,"insertAscending")});var _T=v((gxe,f1)=>{"use strict";var BC=require("joi"),{string:Qd,boolean:l1,date:Yue}=BC.types(),Wue=mt(),{validateSchemaExists:pxe,validateTableExists:hxe,validateSchemaName:Exe}=Ki(),zue=(q(),M(z)),jue=Ot(),u1=me();u1.initSync();var _xe=Qd.invalid(u1.get(zue.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(jue.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),d1={operation:Qd.valid("add_node","update_node","set_node_replication"),node_name:Qd.optional(),subscriptions:BC.array().items({table:Qd.optional(),schema:Qd.optional(),database:Qd.optional(),subscribe:l1.required(),publish:l1.required().custom(Jue),start_time:Yue.iso()})};function Que(e){return Wue.validateBySchema(e,BC.object(d1))}o(Que,"addUpdateNodeValidator");function Jue(e,t){if(t.state.ancestors[2].operation==="add_node"&&e===!1&&t.state.ancestors[0].subscribe===!1)return t.message(`'subscriptions[${t.state.path[1]}]' subscribe and/or publish must be set to true when adding a node`)}o(Jue,"checkForFalsy");f1.exports={addUpdateNodeValidator:Que,validationSchema:d1}});var Jd=v((Txe,m1)=>{"use strict";var FC=class{static{o(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},kC=class{static{o(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};m1.exports={Node:FC,NodeSubscription:kC}});var h1=v((Rxe,p1)=>{"use strict";var Xue=(q(),M(z)).OPERATIONS_ENUM,HC=class{static{o(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Xue.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};p1.exports=HC});var uh=v((Axe,E1)=>{"use strict";var GC=class{static{o(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},qC=class{static{o(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,a,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=a,c!==void 0&&(this.attributes=c)}};E1.exports={RemotePayloadObject:GC,RemotePayloadSubscription:qC}});var g1=v((wxe,_1)=>{"use strict";var $C=class{static{o(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,a=0){this.schema=t,this.table=r,this.table_size=n,this.record_count=s,this.transaction_log_size=i,this.transaction_log_record_count=a}};_1.exports=$C});var T1=v((Dxe,S1)=>{"use strict";var Zue=g1(),Cxe=Yt(),Oxe=_t(),ede=Q(),{getSchemaPath:Pxe,getTransactionAuditStorePath:Lxe}=Rt(),{getDatabases:tde}=(we(),M(ft));S1.exports=rde;async function rde(e){let t=new Zue;try{let r=tde()[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){ede.warn(`unable to stat table dbi due to ${r}`)}return t}o(rde,"lmdbGetTableSize")});var R1=v((vxe,y1)=>{"use strict";var VC=class{static{o(this,"SystemInformationObject")}constructor(t,r,n,s,i,a,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=a,this.harperdb_processes=c}};y1.exports=VC});var fh=v((Hxe,w1)=>{"use strict";var nde=require("fs-extra"),sde=require("path"),Tn=require("systeminformation"),fc=Q(),b1=_r(),xxe=Ot(),Xd=(q(),M(z)),ide=T1(),ode=Ll(),{getThreadInfo:A1}=nt(),dh=me();dh.initSync();var ade=R1(),{openEnvironment:Bxe}=_t(),{getSchemaPath:Fxe}=Rt(),{database:kxe,databases:KC}=(we(),M(ft)),gT;w1.exports={getHDBProcessInfo:jC,getNetworkInfo:JC,getDiskInfo:QC,getMemoryInfo:zC,getCPUInfo:WC,getTimeInfo:YC,getSystemInformation:XC,systemInformation:cde,getTableSize:ZC,getMetrics:eO};function YC(){return Tn.time()}o(YC,"getTimeInfo");async function WC(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:a,governor:c,socket:l,cache:u,...d}=await Tn.cpu();d.cpu_speed=await Tn.cpuCurrentSpeed();let{rawCurrentload:f,rawCurrentloadIdle:m,rawCurrentloadIrq:p,rawCurrentloadNice:h,rawCurrentloadSystem:E,rawCurrentloadUser:g,cpus:R,...S}=await Tn.currentLoad();return S.cpus=[],R.forEach(y=>{let{rawLoad:C,rawLoadIdle:I,rawLoadIrq:k,rawLoadNice:J,rawLoadSystem:G,rawLoadUser:H,...X}=y;S.cpus.push(X)}),d.current_load=S,d}catch(e){return fc.error(`error in getCPUInfo: ${e}`),{}}}o(WC,"getCPUInfo");async function zC(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await Tn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return fc.error(`error in getMemoryInfo: ${e}`),{}}}o(zC,"getMemoryInfo");async function jC(){let e={core:[],clustering:[]};try{let t=await Tn.processes(),r;try{r=Number.parseInt(await nde.readFile(sde.join(dh.get(Xd.CONFIG_PARAMS.ROOTPATH),Xd.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===Xd.NODE_ERROR_CODES.ENOENT)fc.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 fc.error(`error in getHDBProcessInfo: ${t}`),e}}o(jC,"getHDBProcessInfo");async function QC(){let e={};try{if(!dh.get(Xd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await Tn.disksIO();e.io=i;let{rxSec:a,txSec:c,wxSec:l,...u}=await Tn.fsStats();return e.read_write=u,e.size=await Tn.fsSize(),e}catch(t){return fc.error(`error in getDiskInfo: ${t}`),e}}o(QC,"getDiskInfo");async function JC(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return dh.get(Xd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await Tn.networkInterfaceDefault(),e.latency=await Tn.inetChecksite("google.com"),(await Tn.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:a,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrierChanges:f,...m}=n;e.interfaces.push(m)}),(await Tn.networkStats()).forEach(n=>{let{rxSec:s,txSec:i,ms:a,...c}=n;e.stats.push(c)})),e}catch(t){return fc.error(`error in getNetworkInfo: ${t}`),e}}o(JC,"getNetworkInfo");async function XC(){if(gT!==void 0)return gT;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:a,...c}=await Tn.osInfo();e=c;let l=await Tn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,gT=e,gT}catch(t){return fc.error(`error in getSystemInformation: ${t}`),e}}o(XC,"getSystemInformation");async function ZC(){let e=[],t=await ode.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await ide(n));return e}o(ZC,"getTableSize");async function eO(){let e={};for(let t in KC){let r=e[t]={},n=r.tables={};for(let s in KC[t])try{let i=KC[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,d,f]=l.trim().split(" ");return{pid:u,thread:d,txnid:f}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}}let a=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=a[l];n[s]=c}catch(i){fc.notify(`Error getting stats for table ${s}: ${i}`)}}return e}o(eO,"getMetrics");async function I1(){if(dh.get(Xd.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await b1.getNATSReferences(),t=await b1.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let a={stream_name:n.config.name,database:n.config.subjects[0].split(".")[1],table:n.config.subjects[0].split(".")[2],state:n.state,consumers:s};r.push(a)}return r}}o(I1,"getNatsStreamInfo");async function cde(e){let t=new ade;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await XC(),t.time=YC(),t.cpu=await WC(),t.memory=await zC(),t.disk=await QC(),t.network=await JC(),t.harperdb_processes=await jC(),t.table_size=await ZC(),t.metrics=await eO(),t.threads=await A1(),t.replication=await I1(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await XC();break;case"time":t.time=YC();break;case"cpu":t.cpu=await WC();break;case"memory":t.memory=await zC();break;case"disk":t.disk=await QC();break;case"network":t.network=await JC();break;case"harperdb_processes":t.harperdb_processes=await jC();break;case"table_size":t.table_size=await ZC();break;case"database_metrics":case"metrics":t.metrics=await eO();break;case"threads":t.threads=await A1();break;case"replication":t.replication=await I1();break;default:break}return t}o(cde,"systemInformation")});var ea=v((Kxe,P1)=>{"use strict";var lde=Gn(),tO=ae(),ude=require("util"),Hl=(q(),M(z)),N1=me();N1.initSync();var dde=BN(),C1=hn(),{Node:qxe,NodeSubscription:$xe}=Jd(),fde=Zu(),mde=h1(),{RemotePayloadObject:pde,RemotePayloadSubscription:hde}=uh(),{handleHDBError:Ede,hdbErrors:_de}=_e(),{HTTP_STATUS_CODES:gde,HDB_ERROR_MSGS:Sde}=_de,Tde=ui(),yde=fh(),{packageJson:Rde}=Ct(),{getDatabases:bde}=(we(),M(ft)),Vxe=ude.promisify(dde.authorize),Ade=C1.searchByHash,Ide=C1.searchByValue;P1.exports={isEmpty:wde,getNodeRecord:Nde,upsertNodeRecord:Cde,buildNodePayloads:Ode,checkClusteringEnabled:Pde,getAllNodeRecords:Lde,getSystemInfo:Dde,reverseSubscription:O1};function wde(e){return e==null}o(wde,"isEmpty");async function Nde(e){let t=new fde(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Ade(t)}o(Nde,"getNodeRecord");async function Cde(e){let t=new mde(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return lde.upsert(t)}o(Cde,"upsertNodeRecord");function O1(e){if(tO.isEmpty(e.subscribe)||tO.isEmpty(e.publish))throw new Error("Received invalid subscription object");let{schema:t,table:r,hash_attribute:n}=e,s={schema:t,table:r,hash_attribute:n};return e.subscribe===!0&&e.publish===!1?(s.subscribe=!1,s.publish=!0):e.subscribe===!1&&e.publish===!0?(s.subscribe=!0,s.publish=!1):(s.subscribe=e.subscribe,s.publish=e.publish),s}o(O1,"reverseSubscription");function Ode(e,t,r,n){let s=[];for(let i=0,a=e.length;i<a;i++){let c=e[i],{schema:l,table:u}=c,d=tO.getTableHashAttribute(l,u),{subscribe:f,publish:m}=O1(c),p=bde()[l]?.[u],h=new hde(l,u,d,m,f,c.start_time,p.schemaDefined?p.attributes:void 0);s.push(h)}return new pde(r,t,s,n)}o(Ode,"buildNodePayloads");function Pde(){if(!N1.get(Hl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw Ede(new Error,Sde.CLUSTERING_NOT_ENABLED,gde.BAD_REQUEST,void 0,void 0,!0)}o(Pde,"checkClusteringEnabled");async function Lde(){let e=new Tde(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await Ide(e))}o(Lde,"getAllNodeRecords");async function Dde(){let e=await yde.getSystemInformation();return{hdb_version:Rde.version,node_version:e.node_version,platform:e.platform}}o(Dde,"getSystemInfo")});var rO=v((Wxe,F1)=>{"use strict";var ST=_r(),L1=ae(),D1=Ot(),M1=(q(),M(z)),TT=Q(),v1=mT(),Mde=np(),{RemotePayloadObject:vde}=uh(),{handleHDBError:U1,hdbErrors:Ude}=_e(),{HTTP_STATUS_CODES:x1}=Ude,{NodeSubscription:B1}=Jd();F1.exports=xde;async function xde(e,t){let r;try{r=await ST.request(`${t}.${D1.REQUEST_SUFFIX}`,new vde(M1.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),TT.trace("Response from remote describe all request:",r)}catch(a){TT.error(`addNode received error from describe all request to remote node: ${a}`);let c=ST.requestErrorHandler(a,"add_node",t);throw U1(new Error,c,x1.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===D1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let a=`Error returned from remote node ${t}: ${r.message}`;throw U1(new Error,a,x1.INTERNAL_SERVER_ERROR,"error",a)}let n=r.message,s=[],i=[];for(let a of e){let{table:c}=a,l=a.database??a.schema??"data";if(l===M1.SYSTEM_SCHEMA_NAME){await ST.createLocalTableStream(l,c);let h=new B1(l,c,a.publish,a.subscribe);h.start_time=a.start_time,i.push(h);continue}let u=L1.doesSchemaExist(l),d=n[l]!==void 0,f=c?L1.doesTableExist(l,c):!0,m=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!f&&!m){s.push(a);continue}if(!u&&d&&(TT.trace(`addNode creating schema: ${l}`),await v1.createSchema({operation:"create_schema",schema:l})),!f&&m){TT.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let h=new Mde(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(h.attributes=n[l][c].attributes),await v1.createTable(h)}await ST.createLocalTableStream(l,c);let p=new B1(l,c,a.publish,a.subscribe);p.start_time=a.start_time,i.push(p)}return{added:i,skipped:s}}o(xde,"reviewSubscriptions")});var Zd={};Re(Zd,{addNodeBack:()=>nO,removeNodeBack:()=>sO,setNode:()=>Hde});async function Hde(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=_i(t)):t=cT(r);let n=(0,H1.validateBySchema)(e,kde);if(n)throw(0,ta.handleHDBError)(n,n.message,Fde.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new ta.ClientError("url or hostname is required for remove_node operation");let p=r,h=jt(),E=await h.get(p);if(!E)throw new ta.ClientError(p+" does not exist");try{await ah({url:E.url},{operation:V.REMOVE_NODE_BACK,name:E?.subscriptions?.length>0?it():p},void 0)}catch(g){gs.warn(`Error removing node from target node ${p}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,g)}return await h.delete(p),`Successfully removed '${p}' from cluster`}if(!t)throw new ta.ClientError("url required for this operation");let s=sc();if(s==null)throw new ta.ClientError("replication url is missing from harperdb-config.yaml");let i,a,c;if(t?.startsWith("wss:")){i=await(0,Vs.getReplicationCert)();let p=await(0,Vs.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(a=await(0,Vs.createCsr)(),gs.info("Sending CSR to target node:",t)):p&&(c=p.certificate,gs.info("Sending CA named",p.name,"to target node",t))}let l={operation:V.ADD_NODE_BACK,hostname:(0,pc.get)(F.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:a,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,pc.get)(F.REPLICATION_SHARD)!==void 0&&(l.shard=(0,pc.get)(F.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(k1):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let p=k1(e);l.subscribe=p.subscribe,l.publish=p.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,d;try{u=await ah({url:t},l,e)}catch(p){p.message=`Error returned from ${t}: `+p.message,gs.warn("Error adding node:",t,"to cluster:",p),d=p}if(a&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw d?(d.message+=" and connection was required to sign certificate",d):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);a&&(gs.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Vs.setCertTable)({name:Bde.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Vs.setCertTable)({name:it(),uses:["https","operations","wss"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let f={url:t,ca:u?.usingCA};if(e.hostname&&(f.name=e.hostname),e.subscriptions?f.subscriptions=e.subscriptions:f.replicates=!0,e.start_time&&(f.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(f.authorization=e.authorization),e.revoked_certificates&&(f.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?f.shard=u.shard:e.shard!==void 0&&(f.shard=e.shard),f.replicates){let p={url:s,ca:c,replicates:!0,subscriptions:null};(0,pc.get)(F.REPLICATION_SHARD)!==void 0&&(p.shard=(0,pc.get)(F.REPLICATION_SHARD)),e.retain_authorization&&(p.authorization=e.authorization),e.start_time&&(p.start_time=e.start_time),await Wo(it(),p)}await Wo(u?u.nodeName:f.name??_i(t),f);let m;return e.operation==="update_node"?m=`Successfully updated '${t}'`:m=`Successfully added '${t}' to cluster`,d&&(m+=" but there was an error updating target node: "+d.message),m}async function nO(e){gs.trace("addNodeBack received request:",e);let t=await(0,Vs.signCertificate)(e),r;e.csr?(r=t.signingCA,gs.info("addNodeBack received CSR from node:",e.url,"this node will use and respond with CA that was used to issue CSR")):(r=e?.cert_auth,gs.info("addNodeBack received CA from node:",e.url));let n={url:e.url,ca:r};e.subscriptions?n.subscriptions=e.subscriptions:(n.replicates=!0,n.subscriptions=null),e.start_time&&(n.start_time=e.start_time),e.authorization&&(n.authorization=e.authorization),e.shard!==void 0&&(n.shard=e.shard);let s=await(0,Vs.getReplicationCertAuth)();if(n.replicates){let i={url:sc(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,pc.get)(F.REPLICATION_SHARD)!==void 0&&(i.shard=(0,pc.get)(F.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Wo(it(),i)}return await Wo(e.hostname,n),t.nodeName=it(),t.usingCA=s?.certificate,gs.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function sO(e){gs.trace("removeNodeBack received request:",e),await jt().delete(e.name)}function k1(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Vs,H1,mc,pc,gs,ta,Bde,Fde,kde,ef=se(()=>{Vs=b(_s()),H1=b(mt()),mc=b(require("joi")),pc=b(me());q();eh();Fd();hs();gs=b(Q()),ta=b(_e()),{pki:Bde}=require("node-forge"),{HTTP_STATUS_CODES:Fde}=ta.hdbErrors,kde=mc.default.object({hostname:mc.default.string(),verify_tls:mc.default.boolean(),replicates:mc.default.boolean(),subscriptions:mc.default.array(),revoked_certificates:mc.default.array(),shard:mc.default.number()});o(Hde,"setNode");o(nO,"addNodeBack");o(sO,"removeNodeBack");o(k1,"reverseSubscription")});var IT=v((r0e,q1)=>{"use strict";var{handleHDBError:yT,hdbErrors:Gde}=_e(),{HTTP_STATUS_CODES:RT}=Gde,{addUpdateNodeValidator:qde}=_T(),bT=Q(),AT=(q(),M(z)),G1=Ot(),$de=ae(),mh=_r(),ph=ea(),iO=me(),Vde=rO(),{Node:Kde,NodeSubscription:Yde}=Jd(),{broadcast:Wde}=nt(),{setNode:zde}=(ef(),M(Zd)),e0e=me(),t0e=(q(),M(z)),jde="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Qde="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Jde=iO.get(AT.CONFIG_PARAMS.CLUSTERING_NODENAME);q1.exports=Xde;async function Xde(e,t=!1){if(bT.trace("addNode called with:",e),iO.get(AT.CONFIG_PARAMS.REPLICATION_URL)||iO.get(AT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return zde(e);ph.checkClusteringEnabled();let r=qde(e);if(r)throw yT(r,r.message,RT.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let f=await ph.getNodeRecord(n);if(!$de.isEmptyOrZeroLength(f))throw yT(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,RT.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Vde(e.subscriptions,n),a={message:void 0,added:s,skipped:i};if(s.length===0)return a.message=jde,a;let c=ph.buildNodePayloads(s,Jde,AT.OPERATIONS_ENUM.ADD_NODE,await ph.getSystemInfo()),l=[];for(let f=0,m=s.length;f<m;f++){let p=s[f];s[f].start_time===void 0&&delete s[f].start_time,l.push(new Yde(p.schema,p.table,p.publish,p.subscribe))}bT.trace("addNode sending remote payload:",c);let u;try{u=await mh.request(`${n}.${G1.REQUEST_SUFFIX}`,c)}catch(f){bT.error(`addNode received error from request: ${f}`);for(let p=0,h=s.length;p<h;p++){let E=s[p];E.publish=!1,E.subscribe=!1,await mh.updateRemoteConsumer(E,n)}let m=mh.requestErrorHandler(f,"add_node",n);throw yT(new Error,m,RT.INTERNAL_SERVER_ERROR,"error",m)}if(u.status===G1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${n}: ${u.message}`;throw yT(new Error,f,RT.INTERNAL_SERVER_ERROR,"error",f)}bT.trace(u);for(let f=0,m=s.length;f<m;f++){let p=s[f];await mh.updateRemoteConsumer(p,n),p.subscribe===!0&&await mh.updateConsumerIterator(p.schema,p.table,n,"start")}let d=new Kde(n,l,u.system_info);return await ph.upsertNodeRecord(d),Wde({type:"nats_update"}),i.length>0?a.message=Qde:a.message=`Successfully added '${n}' to manifest`,a}o(Xde,"addNode")});var lO=v((i0e,V1)=>{"use strict";var{handleHDBError:oO,hdbErrors:Zde}=_e(),{HTTP_STATUS_CODES:aO}=Zde,{addUpdateNodeValidator:efe}=_T(),hh=Q(),wT=(q(),M(z)),$1=Ot(),s0e=ae(),Eh=_r(),_h=ea(),cO=me(),{cloneDeep:tfe}=require("lodash"),rfe=rO(),{Node:nfe,NodeSubscription:sfe}=Jd(),{broadcast:ife}=nt(),{setNode:ofe}=(ef(),M(Zd)),afe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",cfe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",lfe=cO.get(wT.CONFIG_PARAMS.CLUSTERING_NODENAME);V1.exports=ufe;async function ufe(e){if(hh.trace("updateNode called with:",e),cO.get(wT.CONFIG_PARAMS.REPLICATION_URL)??cO.get(wT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return ofe(e);_h.checkClusteringEnabled();let t=efe(e);if(t)throw oO(t,t.message,aO.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await _h.getNodeRecord(r);s.length>0&&(n=tfe(s));let{added:i,skipped:a}=await rfe(e.subscriptions,r),c={message:void 0,updated:i,skipped:a};if(i.length===0)return c.message=afe,c;let l=_h.buildNodePayloads(i,lfe,wT.OPERATIONS_ENUM.UPDATE_NODE,await _h.getSystemInfo());for(let d=0,f=i.length;d<f;d++){let m=i[d];hh.trace(`updateNode updating work stream for node: ${r} subscription:`,m),i[d].start_time===void 0&&delete i[d].start_time}hh.trace("updateNode sending remote payload:",l);let u;try{u=await Eh.request(`${r}.${$1.REQUEST_SUFFIX}`,l)}catch(d){hh.error(`updateNode received error from request: ${d}`);let f=Eh.requestErrorHandler(d,"update_node",r);throw oO(new Error,f,aO.INTERNAL_SERVER_ERROR,"error",f)}if(u.status===$1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw oO(new Error,d,aO.INTERNAL_SERVER_ERROR,"error",d)}hh.trace(u);for(let d=0,f=i.length;d<f;d++){let m=i[d];await Eh.updateRemoteConsumer(m,r),m.subscribe===!0?await Eh.updateConsumerIterator(m.schema,m.table,r,"start"):await Eh.updateConsumerIterator(m.schema,m.table,r,"stop")}return n||(n=[new nfe(r,[],u.system_info)]),await dfe(n[0],i,u.system_info),a.length>0?c.message=cfe:c.message=`Successfully updated '${r}'`,c}o(ufe,"updateNode");async function dfe(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let a=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let d=n.subscriptions[l];if(d.schema===a.schema&&d.table===a.table){d.publish=a.publish,d.subscribe=a.subscribe,c=!0;break}}c||n.subscriptions.push(new sfe(a.schema,a.table,a.publish,a.subscribe))}n.system_info=r,await _h.upsertNodeRecord(n),ife({type:"nats_update"})}o(dfe,"updateNodeTable")});var j1=v((a0e,z1)=>{"use strict";var W1=require("joi"),{string:K1}=W1.types(),ffe=mt(),Y1=(q(),M(z)),mfe=me(),pfe=Ot();z1.exports=hfe;function hfe(e){let t=K1.invalid(mfe.get(Y1.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(pfe.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=W1.object({operation:K1.valid(Y1.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return ffe.validateBySchema(e,r)}o(hfe,"removeNodeValidator")});var NT=v((l0e,eK)=>{"use strict";var{handleHDBError:Q1,hdbErrors:Efe}=_e(),{HTTP_STATUS_CODES:J1}=Efe,_fe=j1(),gh=Q(),X1=ea(),gfe=ae(),tf=(q(),M(z)),Z1=Ot(),uO=_r(),dO=me(),{RemotePayloadObject:Sfe}=uh(),{NodeSubscription:Tfe}=Jd(),yfe=rp(),Rfe=Sl(),{broadcast:bfe}=nt(),{setNode:Afe}=(ef(),M(Zd)),Ife=dO.get(tf.CONFIG_PARAMS.CLUSTERING_NODENAME);eK.exports=wfe;async function wfe(e){if(gh.trace("removeNode called with:",e),dO.get(tf.CONFIG_PARAMS.REPLICATION_URL)??dO.get(tf.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Afe(e);X1.checkClusteringEnabled();let t=_fe(e);if(t)throw Q1(t,t.message,J1.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await X1.getNodeRecord(r);if(gfe.isEmptyOrZeroLength(n))throw Q1(new Error,`Node '${r}' was not found.`,J1.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new Sfe(tf.OPERATIONS_ENUM.REMOVE_NODE,Ife,[]),i,a=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await uO.updateConsumerIterator(d.schema,d.table,r,"stop");try{await uO.updateRemoteConsumer(new Tfe(d.schema,d.table,!1,!1),r)}catch(f){gh.error(f)}}try{i=await uO.request(`${r}.${Z1.REQUEST_SUFFIX}`,s),gh.trace("Remove node reply from remote node:",r,i)}catch(l){gh.error("removeNode received error from request:",l),a=!0}let c=new yfe(tf.SYSTEM_SCHEMA_NAME,tf.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await Rfe.deleteRecord(c),bfe({type:"nats_update"}),i?.status===Z1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||a?(gh.error("Error returned from remote node:",r,i?.message),`Successfully removed '${r}' from local manifest, however there was an error reaching remote node. Check the logs for more details.`):`Successfully removed '${r}' from manifest`}o(wfe,"removeNode")});var nK=v((d0e,rK)=>{"use strict";var tK=require("joi"),{string:Nfe,array:Cfe}=tK.types(),Ofe=mt(),Pfe=_T();rK.exports=Lfe;function Lfe(e){let t=tK.object({operation:Nfe.valid("configure_cluster").required(),connections:Cfe.items(Pfe.validationSchema).required()});return Ofe.validateBySchema(e,t)}o(Lfe,"configureClusterValidator")});var fO=v((m0e,cK)=>{"use strict";var sK=(q(),M(z)),CT=Q(),Dfe=ae(),Mfe=me(),vfe=NT(),Ufe=IT(),xfe=ea(),Bfe=nK(),{handleHDBError:iK,hdbErrors:Ffe}=_e(),{HTTP_STATUS_CODES:oK}=Ffe,kfe="Configure cluster complete.",Hfe="Failed to configure the cluster. Check the logs for more details.",Gfe="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";cK.exports=qfe;async function qfe(e){CT.trace("configure cluster called with:",e);let t=Bfe(e);if(t)throw iK(t,t.message,oK.BAD_REQUEST,void 0,void 0,!0);let r=await xfe.getAllNodeRecords(),n=[];if(Mfe.get(sK.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,f=r.length;d<f;d++){let m=await aK(vfe,{operation:sK.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(m)}CT.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let f=e.connections[d],m=await aK(Ufe,f,f.node_name);s.push(m)}CT.trace("All results from configure_cluster add node:",s);let a=[],c=[],l=!1,u=n.concat(s);for(let d=0,f=u.length;d<f;d++){let m=u[d];m.status==="rejected"&&(CT.error(m.node_name,m?.error?.message,m?.error?.stack),a.includes(m.node_name)||a.push(m.node_name)),(m?.result?.message?.includes?.("Successfully")||m?.result?.includes?.("Successfully"))&&(l=!0),!(typeof m.result=="string"&&m.result.includes("Successfully removed")||m.status==="rejected")&&c.push({node_name:m?.node_name,response:m?.result})}if(Dfe.isEmptyOrZeroLength(a))return{message:kfe,connections:c};if(l)return{message:Gfe,failed_nodes:a,connections:c};throw iK(new Error,Hfe,oK.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}o(qfe,"configureCluster");async function aK(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}o(aK,"functionWrapper")});var fK=v((h0e,dK)=>{"use strict";var Sh=require("joi"),$fe=mt(),{validateSchemaExists:lK,validateTableExists:Vfe,validateSchemaName:uK}=Ki(),Kfe=Sh.object({operation:Sh.string().valid("purge_stream"),schema:Sh.string().custom(lK).custom(uK).optional(),database:Sh.string().custom(lK).custom(uK).optional(),table:Sh.string().custom(Vfe).required()});function Yfe(e){return $fe.validateBySchema(e,Kfe)}o(Yfe,"purgeStreamValidator");dK.exports=Yfe});var mO=v((_0e,mK)=>{"use strict";var{handleHDBError:Wfe,hdbErrors:zfe}=_e(),{HTTP_STATUS_CODES:jfe}=zfe,Qfe=fK(),Jfe=_r(),Xfe=ea();mK.exports=Zfe;async function Zfe(e){e.schema=e.schema??e.database;let t=Qfe(e);if(t)throw Wfe(t,t.message,jfe.BAD_REQUEST,void 0,void 0,!0);Xfe.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Jfe.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}o(Zfe,"purgeStream")});var EO=v((S0e,yK)=>{"use strict";var hO=ea(),eme=_r(),PT=me(),rf=(q(),M(z)),Gl=Ot(),tme=ae(),pO=Q(),{RemotePayloadObject:rme}=uh(),{ErrorCode:pK}=require("nats"),{parentPort:hK}=require("worker_threads"),{onMessageByType:nme}=nt(),{getThisNodeName:sme}=(hs(),M(jo)),{requestClusterStatus:ime}=(eh(),M(C$)),{getReplicationSharedStatus:ome,getHDBNodeTable:ame}=(Fd(),M(b$)),{CONFIRMATION_STATUS_POSITION:cme,RECEIVED_VERSION_POSITION:EK,RECEIVED_TIME_POSITION:lme,SENDING_TIME_POSITION:ume,RECEIVING_STATUS_POSITION:dme,RECEIVING_STATUS_RECEIVING:fme,BACK_PRESSURE_RATIO_POSITION:mme}=(IC(),M(TV)),_K=PT.get(rf.CONFIG_PARAMS.CLUSTERING_ENABLED),gK=PT.get(rf.CONFIG_PARAMS.CLUSTERING_NODENAME);yK.exports={clusterStatus:pme,buildNodeStatus:TK};var SK;nme("cluster-status",async e=>{SK(e)});async function pme(){if(PT.get(rf.CONFIG_PARAMS.REPLICATION_URL)||PT.get(rf.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;hK?(hK.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{SK=i})):n=ime();for(let i of n.connections){let a=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let f of Object.values(databases[l]||{}))if(u=f.auditStore,u)break;if(!u)continue;let d=ome(u,l,a);c.lastCommitConfirmed=OT(d[cme]),c.lastReceivedRemoteTime=OT(d[EK]),c.lastReceivedLocalTime=OT(d[lme]),c.lastReceivedVersion=d[EK],c.sendingMessage=OT(d[ume]),c.backPressurePercent=d[mme]*100,c.lastReceivedStatus=d[dme]===fme?"Receiving":"Waiting"}}n.node_name=sme();let s=ame().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:gK,is_enabled:_K,connections:[]};if(!_K)return e;let t=await hO.getAllNodeRecords();if(tme.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(TK(t[n],e.connections));return await Promise.allSettled(r),e}o(pme,"clusterStatus");function OT(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}o(OT,"asDate");async function TK(e,t){let r=e.name,n=new rme(rf.OPERATIONS_ENUM.CLUSTER_STATUS,gK,void 0,await hO.getSystemInfo()),s,i,a=Gl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await eme.request(Gl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Gl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(a=Gl.CLUSTER_STATUS_STATUSES.CLOSED,pO.error(`Error getting node status from ${r} `,s))}catch(l){pO.warn(`Error getting node status from ${r}`,l),l.code===pK.NoResponders?a=Gl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===pK.Timeout?a=Gl.CLUSTER_STATUS_STATUSES.TIMEOUT:a=Gl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new hme(r,a,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==rf.PRE_4_0_0_VERSION&&await hO.upsertNodeRecord(l)}catch(l){pO.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}o(TK,"buildNodeStatus");function hme(e,t,r,n,s,i,a,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=a,this.system_info=c}o(hme,"NodeStatusObject")});var gO=v((y0e,RK)=>{"use strict";var{handleHDBError:Eme,hdbErrors:_me}=_e(),{HTTP_STATUS_CODES:gme}=_me,Sme=_r(),Tme=ea(),_O=ae(),LT=require("joi"),yme=mt(),Rme=2e3,bme=LT.object({timeout:LT.number().min(1),connected_nodes:LT.boolean(),routes:LT.boolean()});RK.exports=Ame;async function Ame(e){Tme.checkClusteringEnabled();let t=yme.validateBySchema(e,bme);if(t)throw Eme(t,t.message,gme.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||_O.autoCastBoolean(n),a=s===void 0||_O.autoCastBoolean(s),c={nodes:[]},l=await Sme.getServerList(r??Rme),u={};if(i)for(let d=0,f=l.length;d<f;d++){let m=l[d].statsz;m&&(u[l[d].server.name]=m.routes)}for(let d=0,f=l.length;d<f;d++){if(l[d].statsz)continue;let m=l[d].server,p=l[d].data;if(m.name.endsWith("-hub")){let h={name:m.name.slice(0,-4),response_time:l[d].response_time};i&&(h.connected_nodes=[],u[m.name]&&u[m.name].forEach(E=>{h.connected_nodes.includes(E.name.slice(0,-4))||h.connected_nodes.push(E.name.slice(0,-4))})),a&&(h.routes=p.cluster?.urls?p.cluster?.urls.map(E=>({host:E.split(":")[0],port:_O.autoCast(E.split(":")[1])})):[]),c.nodes.push(h)}}return c}o(Ame,"clusterNetwork")});var wK=v((b0e,IK)=>{"use strict";var SO=require("joi"),bK=mt(),{routeConstraints:AK}=Ow();IK.exports={setRoutesValidator:Ime,deleteRoutesValidator:wme};function Ime(e){let t=SO.object({server:SO.valid("hub","leaf"),routes:AK.required()});return bK.validateBySchema(e,t)}o(Ime,"setRoutesValidator");function wme(e){let t=SO.object({routes:AK.required()});return bK.validateBySchema(e,t)}o(wme,"deleteRoutesValidator")});var DT=v((I0e,MK)=>{"use strict";var ra=St(),TO=ae(),Ks=(q(),M(z)),nf=me(),NK=wK(),{handleHDBError:CK,hdbErrors:Nme}=_e(),{HTTP_STATUS_CODES:OK}=Nme,PK="cluster routes successfully set",LK="cluster routes successfully deleted";MK.exports={setRoutes:Ome,getRoutes:Pme,deleteRoutes:Lme};function Cme(e){let t=ra.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let a=0,c=e.routes.length;a<c;a++){let l=e.routes[a];l.port=TO.autoCast(l.port);let u=r.some(f=>f.host===l.host&&f.port===l.port),d=n.some(f=>f.host===l.host&&f.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?ra.updateConfigValue(Ks.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):ra.updateConfigValue(Ks.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:PK,set:i,skipped:s}}o(Cme,"setRoutesNats");function Ome(e){let t=NK.setRoutesValidator(e);if(t)throw CK(t,t.message,OK.BAD_REQUEST,void 0,void 0,!0);if(nf.get(Ks.CONFIG_PARAMS.CLUSTERING_ENABLED))return Cme(e);let r=[],n=[],s=nf.get(Ks.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{DK(s,i)?n.push(i):(s.push(i),r.push(i))}),ra.updateConfigValue(Ks.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:PK,set:r,skipped:n}}o(Ome,"setRoutes");function DK(e,t){return typeof t=="string"?e.includes(t):typeof t=="object"&&t!==null?e.some(r=>(r.host===t.host||r.hostname===t.hostname)&&r.port===t.port):!1}o(DK,"existsInArray");function Pme(){if(nf.get(Ks.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=ra.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return nf.get(Ks.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}o(Pme,"getRoutes");function Lme(e){let t=NK.deleteRoutesValidator(e);if(t)throw CK(t,t.message,OK.BAD_REQUEST,void 0,void 0,!0);if(nf.get(Ks.CONFIG_PARAMS.CLUSTERING_ENABLED))return Dme(e);let r=[],n=[],s=nf.get(Ks.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(a=>{DK(e.routes,a)?r.push(a):(i.push(a),n.push(a))}),ra.updateConfigValue(Ks.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:LK,deleted:r,skipped:n}}o(Lme,"deleteRoutes");function Dme(e){let t=ra.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],a=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let d=e.routes[l],f=!1;for(let m=0,p=r.length;m<p;m++){let h=r[m];if(d.host===h.host&&d.port===h.port){r.splice(m,1),f=!0,a=!0,s.push(d);break}}if(!f){let m=!0;for(let p=0,h=n.length;p<h;p++){let E=n[p];if(d.host===E.host&&d.port===E.port){n.splice(p,1),c=!0,m=!1,s.push(d);break}}m&&i.push(d)}}return a&&(r=TO.isEmptyOrZeroLength(r)?null:r,ra.updateConfigValue(Ks.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=TO.isEmptyOrZeroLength(n)?null:n,ra.updateConfigValue(Ks.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:LK,deleted:s,skipped:i}}o(Dme,"deleteRoutesNats")});var UK=v((N0e,vK)=>{"use strict";var Mme=Ot(),yO=class{static{o(this,"HubConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f,m,p,h){this.port=t,a===null&&(a=void 0),this.server_name=r+Mme.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c}},this.cluster={name:d,port:f,routes:m,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l}},this.accounts={SYS:{users:p},HDB:{users:h}},this.system_account="SYS"}};vK.exports=yO});var FK=v((O0e,BK)=>{"use strict";var xK=Ot(),RO=class{static{o(this,"LeafConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f){this.port=t,f===null&&(f=void 0),this.server_name=r+xK.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+xK.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:d,ca_file:f,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:f,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:f,insecure:!0},urls:a,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};BK.exports=RO});var HK=v((L0e,kK)=>{"use strict";var bO=class{static{o(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};kK.exports=bO});var qK=v((M0e,GK)=>{"use strict";var vme=Ot(),AO=class{static{o(this,"SysUserObject")}constructor(t,r){this.user=t+vme.SERVER_SUFFIX.ADMIN,this.password=r}};GK.exports=AO});var xT=v((U0e,KK)=>{"use strict";var ql=require("path"),$l=require("fs-extra"),Ume=UK(),xme=FK(),Bme=HK(),Fme=qK(),IO=fs(),of=ae(),Kn=St(),vT=(q(),M(z)),Th=Ot(),{CONFIG_PARAMS:ir}=vT,af=Q(),yh=me(),$K=Xi(),wO=_r(),kme=_s(),sf="clustering",Hme=1e4,VK=50;KK.exports={generateNatsConfig:qme,removeNatsConfig:$me,getHubConfigPath:Gme};function Gme(){let e=yh.get(ir.ROOTPATH);return ql.join(e,sf,Th.NATS_CONFIG_FILES.HUB_SERVER)}o(Gme,"getHubConfigPath");async function qme(e=!1,t=void 0){console.error("Warning: NATS replication is deprecated and will be removed in version 5.0 of Harper");let r=yh.get(ir.ROOTPATH);$l.ensureDirSync(ql.join(r,"clustering","leaf")),yh.initSync();let n=Kn.getConfigFromFile(ir.CLUSTERING_TLS_CERT_AUTH),s=Kn.getConfigFromFile(ir.CLUSTERING_TLS_PRIVATEKEY),i=Kn.getConfigFromFile(ir.CLUSTERING_TLS_CERTIFICATE);!await $l.exists(i)&&!await $l.exists(!n)&&await kme.createNatsCerts();let a=ql.join(r,sf,Th.PID_FILES.HUB),c=ql.join(r,sf,Th.PID_FILES.LEAF),l=Kn.getConfigFromFile(ir.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=ql.join(r,sf,Th.NATS_CONFIG_FILES.HUB_SERVER),d=ql.join(r,sf,Th.NATS_CONFIG_FILES.LEAF_SERVER),f=Kn.getConfigFromFile(ir.CLUSTERING_TLS_INSECURE),m=Kn.getConfigFromFile(ir.CLUSTERING_TLS_VERIFY),p=Kn.getConfigFromFile(ir.CLUSTERING_NODENAME),h=Kn.getConfigFromFile(ir.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await wO.checkNATSServerInstalled()||UT("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let E=await IO.listUsers(),g=Kn.getConfigFromFile(ir.CLUSTERING_USER),R=await IO.getClusterUser();(of.isEmpty(R)||R.active!==!0)&&UT(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await MT(ir.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await MT(ir.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await MT(ir.CLUSTERING_HUBSERVER_NETWORK_PORT),await MT(ir.CLUSTERING_LEAFSERVER_NETWORK_PORT));let S=[],y=[];for(let[X,W]of E.entries())W.role?.role===vT.ROLE_TYPES_ENUM.CLUSTER_USER&&W.active&&(S.push(new Fme(W.username,$K.decrypt(W.hash))),y.push(new Bme(W.username,$K.decrypt(W.hash))));let C=[],{hub_routes:I}=Kn.getClusteringRoutes();if(!of.isEmptyOrZeroLength(I))for(let X of I)C.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${X.host}:${X.port}`);let k=new Ume(Kn.getConfigFromFile(ir.CLUSTERING_HUBSERVER_NETWORK_PORT),p,a,i,s,n,f,m,h,Kn.getConfigFromFile(ir.CLUSTERING_HUBSERVER_CLUSTER_NAME),Kn.getConfigFromFile(ir.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),C,S,y);n==null&&(delete k.tls.ca_file,delete k.leafnodes.tls.ca_file),t=of.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===vT.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await $l.writeJson(u,k),af.trace(`Hub server config written to ${u}`));let J=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,G=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,H=new xme(Kn.getConfigFromFile(ir.CLUSTERING_LEAFSERVER_NETWORK_PORT),p,c,l,[J],[G],S,y,i,s,n,f);n==null&&delete H.tls.ca_file,(t===void 0||t===vT.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await $l.writeJson(d,H),af.trace(`Leaf server config written to ${d}`))}o(qme,"generateNatsConfig");async function MT(e){let t=yh.get(e);return of.isEmpty(t)&&UT(`port undefined for '${e}'`),await of.isPortTaken(t)&&UT(`'${e}' port '${t}' is is in use by another process, check to see if HarperDB is already running or another process is using this port.`),!0}o(MT,"isPortAvailable");function UT(e){let t=`Error generating clustering config: ${e}`;af.error(t),console.error(t),process.exit(1)}o(UT,"generateNatsConfigError");async function $me(e){let{port:t,config_file:r}=wO.getServerConfig(e),{username:n,decrypt_hash:s}=await IO.getClusterUser(),i=0,a=2e3;for(;i<VK;){try{let d=await wO.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){af.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=VK)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=a*(i*2);u>3e4&&af.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await of.asyncSetTimeout(u)}let c="0".repeat(Hme),l=ql.join(yh.get(ir.ROOTPATH),sf,r);await $l.writeFile(l,c),await $l.remove(l),af.notify(e,"started.")}o($me,"removeNatsConfig")});var JK=v((B0e,QK)=>{"use strict";var Ss=me(),Xe=(q(),M(z)),Rh=Ot(),na=require("path"),{PACKAGE_ROOT:FT}=Ct(),YK=me(),BT=ae(),cf="/dev/null",Vme=na.join(FT,"launchServiceScripts"),WK=na.join(FT,"utility/scripts"),Kme=na.join(WK,Xe.HDB_RESTART_SCRIPT),zK=na.resolve(FT,"dependencies",`${process.platform}-${process.arch}`,Rh.NATS_BINARY_NAME);function jK(){let e={[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0,...process.env};return BT.noBootFile()&&(e[Xe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=BT.getEnvCliRootPath()),{name:Xe.PROCESS_DESCRIPTORS.HDB,script:Xe.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:e,execArgv:process.execArgv,cwd:FT}}o(jK,"generateMainServerConfig");var Yme=9930;function Wme(){Ss.initSync(!0);let e=Ss.get(Xe.CONFIG_PARAMS.ROOTPATH),t=na.join(e,"clustering",Rh.NATS_CONFIG_FILES.HUB_SERVER),r=na.join(Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Xe.LOG_NAMES.HDB),n=YK.get(Xe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Rh.LOG_LEVEL_FLAGS[Ss.get(Xe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Yme?"-"+n:""),binFile:zK,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=cf,i.error_file=cf),i}o(Wme,"generateNatsHubServerConfig");var zme=9940;function jme(){Ss.initSync(!0);let e=Ss.get(Xe.CONFIG_PARAMS.ROOTPATH),t=na.join(e,"clustering",Rh.NATS_CONFIG_FILES.LEAF_SERVER),r=na.join(Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Xe.LOG_NAMES.HDB),n=YK.get(Xe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Rh.LOG_LEVEL_FLAGS[Ss.get(Xe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==zme?"-"+n:""),binFile:zK,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=cf,i.error_file=cf),i}o(jme,"generateNatsLeafServerConfig");function Qme(){Ss.initSync();let e=na.join(Ss.get(Xe.CONFIG_PARAMS.LOGGING_ROOT),Xe.LOG_NAMES.HDB),t={name:Xe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,binFile:Xe.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:Vme,autorestart:!1};return Ss.get(Xe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=cf,t.error_file=cf),t}o(Qme,"generateClusteringUpgradeV4ServiceConfig");function Jme(){let e={[Xe.PROCESS_NAME_ENV_PROP]:Xe.PROCESS_DESCRIPTORS.RESTART_HDB};return BT.noBootFile()&&(e[Xe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=BT.getEnvCliRootPath()),{...{name:Xe.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:WK},script:Kme}}o(Jme,"generateRestart");function Xme(){return{apps:[jK()]}}o(Xme,"generateAllServiceConfigs");QK.exports={generateAllServiceConfigs:Xme,generateMainServerConfig:jK,generateRestart:Jme,generateNatsHubServerConfig:Wme,generateNatsLeafServerConfig:jme,generateClusteringUpgradeV4ServiceConfig:Qme}});var lf=v((H0e,sY)=>{"use strict";var Or=(q(),M(z)),k0e=ae(),ia=xT(),kT=_r(),sa=Ot(),hc=JK(),CO=me(),Ec=Q(),Zme=ea(),{startWorker:XK,onMessageFromWorkers:epe}=nt(),ZK=require("fs"),tpe=require("node:path"),rpe=(q(),M(z)),{setTimeout:npe}=require("node:timers/promises"),{execFile:spe,fork:ipe}=require("node:child_process");sY.exports={start:_c,restart:ape,kill:dpe,startAllServices:fpe,startService:tY,restartHdb:cpe,startClusteringProcesses:rY,startClusteringThreads:nY,isHdbRestartRunning:lpe,getHdbPid:upe,cleanupChildrenProcesses:bh,reloadClustering:ppe,expectedRestartOfChildren:eY};epe(e=>{e.type==="restart"&&CO.initSync(!0)});var lo=[],ope=10,NO;function _c(e,t=!1){let r=typeof e.args=="string"?e.args.split(" "):e.args;e.silent=!0,e.detached=!0;let n=e.script?ipe(e.script,r,e):spe(e.binFile,r,e);n.name=e.name,n.config=e,n.on("error",(a,c)=>{console.error(a,c)}),n.on("exit",async a=>{let c=lo.indexOf(n);c>-1&&lo.splice(c,1),!NO&&a!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<ope&&(ZK.existsSync(ia.getHubConfigPath())?_c(e):(await ia.generateNatsConfig(!0),_c(e),await new Promise(l=>setTimeout(l,3e3)),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let s={serviceName:e.name.replace(/ /g,"-")};function i(a){let c=CO.get(Or.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),l=/\[\d+][^\[]+\[(\w+)]/g,u,d=0,f;for(;u=l.exec(a);){if(u.index&&sa.LOG_LEVEL_HIERARCHY[c]>=sa.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===sa.LOG_LEVELS.ERR||f===sa.LOG_LEVELS.WRN?Ec.OUTPUTS.STDERR:Ec.OUTPUTS.STDOUT;Ec.logCustomLevel(f||"info",h,s,a.slice(d,u.index).trim())}let[m,p]=u;d=u.index+m.length,f=sa.LOG_LEVELS[p]}if(sa.LOG_LEVEL_HIERARCHY[c]>=sa.LOG_LEVEL_HIERARCHY[f||"info"]){let m=f===sa.LOG_LEVELS.ERR||f===sa.LOG_LEVELS.WRN?Ec.OUTPUTS.STDERR:Ec.OUTPUTS.STDOUT;Ec.logCustomLevel(f||"info",m,s,a.toString().slice(d).trim())}}o(i,"extractMessages"),n.stdout.on("data",i),n.stderr.on("data",i),n.unref(),lo.length===0&&(t||(process.on("exit",bh),process.on("SIGINT",bh),process.on("SIGQUIT",bh),process.on("SIGTERM",bh))),lo.push(n)}o(_c,"start");function bh(e=!0){if(!NO&&(NO=!0,lo.length!==0))if(Ec.info("Killing child processes..."),lo.map(t=>t.kill()),e)process.exit(0);else return npe(2e3)}o(bh,"cleanupChildrenProcesses");function ape(e){eY();for(let t of lo)t.name===e&&t.kill()}o(ape,"restart");function eY(){for(let e of lo)e.config&&(e.config.restarts=0)}o(eY,"expectedRestartOfChildren");async function cpe(){await _c(hc.generateRestart())}o(cpe,"restartHdb");async function lpe(){let e=await list();for(let t in e)if(e[t].name===Or.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}o(lpe,"isHdbRestartRunning");function upe(){let e=CO.getHdbBasePath();if(!e)return;let t=tpe.join(e,rpe.HDB_PID_FILE),r=hpe(t);if(!(!r||r===process.pid)&&Epe(r))return r}o(upe,"getHdbPid");function dpe(){for(let e of lo)e.kill();lo=[]}o(dpe,"kill");async function fpe(){await rY(),await nY(),await _c(hc.generateAllServiceConfigs())}o(fpe,"startAllServices");async function tY(e,t=!1){let r;switch(e=e.toLowerCase(),e){case Or.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=hc.generateMainServerConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=hc.generateNatsIngestServiceConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=hc.generateNatsReplyServiceConfig();break;case Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=hc.generateNatsHubServerConfig(),await _c(r,t),await ia.removeNatsConfig(e);return;case Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=hc.generateNatsLeafServerConfig(),await _c(r,t),await ia.removeNatsConfig(e);return;case Or.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=hc.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}_c(r,t)}o(tY,"startService");var mpe;async function rY(e=!1){for(let t in Or.CLUSTERING_PROCESSES){let r=Or.CLUSTERING_PROCESSES[t];await tY(r,e)}}o(rY,"startClusteringProcesses");async function nY(){mpe=XK(Or.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:Or.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await kT.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await kT.updateLocalStreams();let e=await Zme.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===Or.PRE_4_0_0_VERSION){Ec.info("Starting clustering upgrade 4.0.0 process"),XK(Or.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}o(nY,"startClusteringThreads");async function ppe(){await ia.generateNatsConfig(!0),await kT.reloadNATSHub(),await kT.reloadNATSLeaf(),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await ia.removeNatsConfig(Or.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}o(ppe,"reloadClustering");function hpe(e){try{return Number.parseInt(ZK.readFileSync(e,"utf8"),10)}catch{return null}}o(hpe,"readPidFile");function Epe(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(Epe,"isProcessRunning")});var LO={};Re(LO,{compactOnStart:()=>_pe,copyDb:()=>uY});async function _pe(){gc.notify("Running compact on start"),console.log("Running compact on start");let e=(0,OO.get)(F.ROOTPATH),t=new Map,r=at();(0,PO.updateConfigValue)(F.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,HT.join)(e,"backup",n+".mdb"),a=(0,HT.join)(e,qc,n+"-copy.mdb"),c=0;try{c=await iY(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){gc.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{dbPath:s,copyDest:a,backupDest:i,recordCount:c}),await uY(n,a),console.log("Backing up",n,"to",i);try{await(0,Vl.move)(s,i,{overwrite:!0})}catch(l){console.log("Error moving database",s,"to",i,l)}}try{Td()}catch(n){gc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}for(let[n,{dbPath:s,copyDest:i}]of t)console.log("Moving copy compacted",n,"to",s),await(0,Vl.move)(i,s,{overwrite:!0}),await(0,Vl.remove)((0,HT.join)(e,qc,`${n}-copy.mdb-lock`));try{Td()}catch(n){gc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){gc.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,PO.updateConfigValue)(F.STORAGE_COMPACTONSTART,!1);for(let[s,{dbPath:i,backupDest:a}]of t){console.error("Moving backup database",a,"back to",i);try{await(0,Vl.move)(a,i,{overwrite:!0})}catch(c){console.error(c)}}throw Td(),n}for(let[n,{backupDest:s,recordCount:i}]of t){let a=!0,c=await iY(n);if(console.log("Database",n,"after compact has a total record count of",c),i!==c){a=!1;let l=`There is a discrepancy between pre and post compact record count for database ${n}.
19
19
  Total record count before compaction: ${i}, total after: ${c}.
20
20
  Database backup has not been removed and can be found here: ${s}`;gc.error(l),console.error(l)}(0,OO.get)(F.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||a===!1||(console.log("Removing backup",s),await(0,Vl.remove)(s))}}async function iY(e){let t=await(0,lY.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}function uf(){}async function uY(e,t){console.log(`Copying database ${e} to ${t}`);let r=at()[e];if(!r)throw new Error(`Source database not found: ${e}`);let n;for(let f in r){let m=r[f];m.primaryStore.put=uf,m.primaryStore.remove=uf;for(let p in m.indices){let h=m.indices[p];h.put=uf,h.remove=uf}m.auditStore&&(m.auditStore.put=uf,m.auditStore.remove=uf),n=m.primaryStore.rootStore}if(!n)throw new Error(`Source database does not have any tables: ${e}`);let s=n.dbisDb,i=n.auditStore,a=(0,oY.open)(new aY.default(t)),c=a.openDB(GT.INTERNAL_DBIS_NAME),l,u=0,d=s.useReadTransaction();try{for(let{key:m,value:p}of s.getRange({transaction:d})){let h=p.is_hash_attribute||p.isPrimaryKey,E,g;if(h&&(E=p.compression,g=cS(),g?p.compression=g:delete p.compression,E?.dictionary?.toString()===g?.dictionary?.toString()&&(E=null,g=null)),c.put(m,p),!(h||p.indexed))continue;let R=new cY.OpenDBIObject(!h,h);R.encoding="binary",R.compression=E;let S=n.openDB(m,R);S.decoder=null,S.decoderCopies=!1,S.encoding="binary",R.compression=g;let y=a.openDB(m,R);y.encoder=null,console.log("copying",m,"from",e,"to",t),await f(S,y,h,d)}if(i){let m=n.openDB(GT.AUDIT_STORE_NAME,Lm);console.log("copying audit log for",e,"to",t),f(i,m,!1,d)}async function f(m,p,h,E){let g=0,R=0,S=1e7,y=null;for(;S-- >0;)try{for(let C of m.getKeys({start:y,transaction:E}))try{y=C;let{value:I,version:k}=m.getEntry(C,{transaction:E});l=p.put(C,I,h?k:void 0),g++,E.openTimer&&(E.openTimer=0),R+=(C?.length||10)+I.length,u++>5e3&&(await l,console.log("copied",g,"entries",R,"bytes"),u=0)}catch(I){console.error("Error copying record",typeof C=="symbol"?"symbol":C,"from",e,"to",t,I)}console.log("finish copying, copied",g,"entries",R,"bytes");return}catch{if(typeof y=="string"){if(y==="z")return console.error("Reached end of dbi",y,"for",e,"to",t);y=y.slice(0,-2)+"z"}else if(typeof y=="number")y++;else return console.error("Unknown key type",y,"for",e,"to",t)}}o(f,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{d.done(),a.close()}}var oY,HT,Vl,OO,aY,cY,GT,lY,PO,gc,DO=se(()=>{we();oY=require("lmdb"),HT=require("path"),Vl=require("fs-extra"),OO=b(me()),aY=b(Vm()),cY=b($m()),GT=b(Yt());q();Fi();lY=b(Ll()),PO=b(St()),gc=b(Q());o(_pe,"compactOnStart");o(iY,"getTotalDBRecordCount");o(uf,"noop");o(uY,"copyDb")});var vO=v((Y0e,dY)=>{"use strict";var Ah=me();Ah.initSync();var df=require("fs-extra"),MO=require("path"),ff=(q(),M(z)),gpe=require("crypto"),Spe=require("uuid").v4;dY.exports=Tpe;function Tpe(){if(Ah.getHdbBasePath()!==void 0){let e=MO.join(Ah.getHdbBasePath(),ff.LICENSE_KEY_DIR_NAME,ff.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=MO.join(Ah.getHdbBasePath(),ff.LICENSE_KEY_DIR_NAME,ff.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=MO.join(Ah.getHdbBasePath(),ff.LICENSE_KEY_DIR_NAME,ff.JWT_ENUM.JWT_PASSPHRASE_NAME);try{df.accessSync(r),df.accessSync(e),df.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=Spe(),i=gpe.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});df.writeFileSync(r,s),df.writeFileSync(e,i.privateKey),df.writeFileSync(t,i.publicKey)}else throw n}}}o(Tpe,"checkJWTTokenExist")});var mY=v((z0e,fY)=>{"use strict";var UO=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};fY.exports={HdbInfoInsertObject:UO}});var EY=v((Q0e,hY)=>{"use strict";var pY=(q(),M(z)),xO=class{static{o(this,"UpgradeObject")}constructor(t,r){this[pY.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[pY.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};hY.exports={UpgradeObject:xO}});var qT=v((X0e,gY)=>{"use strict";var Ys=require("prompt"),mf=require("chalk"),_Y=Q(),Ti=require("os"),BO=$c(),FO=["yes","y"];async function ype(e){let t=`${Ti.EOL}`+mf.bold.green("Your current HarperDB version requires that we complete an update process.")+`${Ti.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ti.EOL}${Ti.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${Ti.EOL}`;Ys.override=BO(["CONFIRM_UPGRADE"]),Ys.start(),Ys.message=t;let r={properties:{CONFIRM_UPGRADE:{description:mf.magenta(`${Ti.EOL}[CONFIRM_UPGRADE] Do you want to upgrade your HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n;try{n=await Ys.get([r])}catch(s){return _Y.error("There was an error when prompting user about an upgrade."),_Y.error(s),!1}return FO.includes(n.CONFIRM_UPGRADE)}o(ype,"forceUpdatePrompt");async function Rpe(e){let t=`${Ti.EOL}`+mf.bold.green(`Your installed HarperDB version is older than the version used to create your data. Downgrading is not recommended as it is not tested and guaranteed to work. However, if you need to downgrade, and a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ti.EOL}`);Ys.override=BO(["CONFIRM_DOWNGRADE"]),Ys.start(),Ys.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:mf.magenta(`${Ti.EOL}[CONFIRM_DOWNGRADE] Do you want to proceed with using your downgraded HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n=await Ys.get([r]);return FO.includes(n.CONFIRM_DOWNGRADE)}o(Rpe,"forceDowngradePrompt");async function bpe(){let e=`${Ti.EOL}`+mf.bold.green("We now require a Certifacte Authority certificate. HarperDB can generate all new certificates for you (your existing certificates will be backed up) or you can keep any existing certificates and add your own CA certificate. To add your own CA certificate set the <certificateAuthority> parameter in harperdb-config.yaml");Ys.override=BO(["GENERATE_CERTS"]),Ys.start(),Ys.message=e;let t={properties:{GENERATE_CERTS:{description:mf.magenta(`${Ti.EOL}[GENERATE_CERTS] Do you want HarperDB to generate all new certificates? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"yes",required:!0}}},r=await Ys.get([t]);return FO.includes(r.GENERATE_CERTS)}o(bpe,"upgradeCertsPrompt");gY.exports={forceUpdatePrompt:ype,forceDowngradePrompt:Rpe,upgradeCertsPrompt:bpe}});var $T=v((eBe,SY)=>{"use strict";var kO=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};SY.exports=kO});var yY=v((oBe,TY)=>{"use strict";var Ape=ae(),Ipe=St(),rBe=Q(),nBe=require("path"),sBe=require("fs"),iBe=(q(),M(z));TY.exports={getOldPropsValue:wpe};function wpe(e,t,r=!1){let n=t.getRaw(e);return Ape.isNotEmptyAndHasValue(n)?n:r?Ipe.getDefaultConfig(e):""}o(wpe,"getOldPropsValue")});var IY=v((cBe,AY)=>{"use strict";var Sc=require("path"),Tc=require("fs-extra"),Npe=require("properties-reader"),Cpe=$T(),gr=Q(),{getOldPropsValue:Tt}=yY(),{HDB_SETTINGS_NAMES:Se,CONFIG_PARAMS:Kl}=(q(),M(z)),Yl=St(),VT=me(),RY=ae(),uo=(q(),M(z)),HO=new Cpe("3.1.0"),bY=[];function Ope(){let e=Npe(VT.get(Se.SETTINGS_PATH_KEY)),t="Updating settings file for version 3.1.0";console.log(t),gr.info(t);let r=` ;Settings for the HarperDB process.
21
21
 
@@ -128,7 +128,7 @@ Host ${s}
128
128
  `)}catch{d=". Unable to get known hosts from github.com. Set your known hosts manually using set_ssh_known_hosts."}a&&await Oe.appendFile(ha,a);let f=await Ii(e);return f.message=`Added ssh key: ${r}${d}`,f}o(_Se,"addSSHKey");async function gSe(e){let t=Wn.updateSSHKeyValidator(e);if(t)throw Jt(t,t.message,Xt.BAD_REQUEST);let{name:r,key:n}=e;Qt.trace("updating ssh key",r);let s=$e.join(Lc,r+".key");if(!await Oe.pathExists(s))throw new Error("Key does not exist. Use add_ssh_key");await Oe.outputFile(s,n);let i=await Ii(e);return i.message=`Updated ssh key: ${r}`,i}o(gSe,"updateSSHKey");async function SSe(e){let t=Wn.deleteSSHKeyValidator(e);if(t)throw Jt(t,t.message,Xt.BAD_REQUEST);let{name:r}=e;Qt.trace("deleting ssh key",r);let n=$e.join(Lc,r+".key"),s=$e.join(Lc,"config");if(!await Oe.pathExists(n))throw new Error("Key does not exist");let i=await Oe.readFile(s,"utf8"),a=new RegExp(`#${r}[\\S\\s]*?IdentitiesOnly yes`,"g");i=i.replace(a,""),await Oe.outputFile(s,i),Oe.removeSync(n);let c=await Ii(e);return c.message=`Deleted ssh key: ${r}`,c}o(SSe,"deleteSSHKey");async function TSe(e){let t=[];return await Oe.pathExists(Lc)&&(await Oe.readdir(Lc)).forEach(r=>{r!="known_hosts"&&r!="config"&&t.push({name:r.split(".")[0]})}),t}o(TSe,"listSSHKeys");async function ySe(e){let t=Wn.setSSHKnownHostsValidator(e);if(t)throw Jt(t,t.message,Xt.BAD_REQUEST);let{known_hosts:r}=e;await Oe.outputFile(ha,r);let n=await Ii(e);return n.message="Known hosts successfully set",n}o(ySe,"setSSHKnownHosts");async function RSe(e){return await Oe.pathExists(ha)?{known_hosts:await Oe.readFile(ha,"utf8")}:{known_hosts:null}}o(RSe,"getSSHKnownHosts");ar.customFunctionsStatus=nSe;ar.getCustomFunctions=sSe;ar.getCustomFunction=iSe;ar.setCustomFunction=oSe;ar.dropCustomFunction=aSe;ar.addComponent=cSe;ar.dropCustomFunctionProject=lSe;ar.packageComponent=uSe;ar.deployComponent=dSe;ar.getComponents=mSe;ar.getComponentFile=pSe;ar.setComponentFile=hSe;ar.dropComponent=ESe;ar.addSSHKey=_Se;ar.updateSSHKey=gSe;ar.deleteSSHKey=SSe;ar.listSSHKeys=TSe;ar.setSSHKnownHosts=ySe;ar.getSSHKnownHosts=RSe});var tL=v((BFe,Ej)=>{"use strict";var Qs=require("joi"),hj=mt();Ej.exports={readTransactionLogValidator:bSe,deleteTransactionLogsBeforeValidator:ASe};function bSe(e){let t=Qs.object({schema:Qs.string(),database:Qs.string(),table:Qs.string().required(),from:Qs.date().timestamp(),to:Qs.date().timestamp(),limit:Qs.number().min(1)});return hj.validateBySchema(e,t)}o(bSe,"readTransactionLogValidator");function ASe(e){let t=Qs.object({schema:Qs.string(),database:Qs.string(),table:Qs.string().required(),timestamp:Qs.date().timestamp().required()});return hj.validateBySchema(e,t)}o(ASe,"deleteTransactionLogsBeforeValidator")});var Uy=v((kFe,Rj)=>{"use strict";var rL=(q(),M(z)),Qh=_r(),_j=ae(),gj=me(),Sj=Xi(),Tj=Q(),{handleHDBError:My,hdbErrors:ISe}=_e(),{HTTP_STATUS_CODES:vy}=ISe,{readTransactionLogValidator:wSe,deleteTransactionLogsBeforeValidator:NSe}=tL(),yj=cs(),CSe="Logs successfully deleted from transaction log.",OSe="All logs successfully deleted from transaction log.";Rj.exports={readTransactionLog:PSe,deleteTransactionLogsBefore:DSe};async function PSe(e){let t=wSe(e);if(t)throw My(t,t.message,vy.BAD_REQUEST,void 0,void 0,!0);e.database=e.database??e.schema??"data";let r=_j.checkSchemaTableExist(e.database,e.table);if(r)throw My(new Error,r,vy.NOT_FOUND,void 0,void 0,!0);return gj.get(rL.CONFIG_PARAMS.CLUSTERING_ENABLED)?await LSe(e):(Tj.info("Reading HarperDB logs used by Plexus"),(e.from||e.to)&&(e.search_type="timestamp",e.search_values=[e.from??0],e.to&&(e.search_values[1]=e.to)),yj.readAuditLog(e))}o(PSe,"readTransactionLog");async function*LSe(e){let t=Sj.createNatsTableStreamName(e.database,e.table),r=await Qh.viewStreamIterator(t,parseInt(e.from),e.limit);for await(let n of r){let s=Math.floor(n?.nats_timestamp/1e6);if(e.to&&s>e.to)break;let i={operation:n?.entry?.operation,user:n?.entry?.__origin?.user,timestamp:s,records:n?.entry?.records,attributes:n?.entry?.attributes};n?.entry?.operation===rL.OPERATIONS_ENUM.DELETE&&(i.hash_values=n?.entry?.hash_values),yield i}}o(LSe,"readTransactionLogNats");async function DSe(e){let t=NSe(e);if(t)throw My(t,t.message,vy.BAD_REQUEST,void 0,void 0,!0);if(e.database=e.database??e.schema??"data",!gj.get(rL.CONFIG_PARAMS.CLUSTERING_ENABLED))return Tj.info("Delete transaction logs called for Plexus"),yj.deleteAuditLogsBefore(e);let{database:r,table:n,timestamp:s}=e,i=_j.checkSchemaTableExist(r,n);if(i)throw My(new Error,i,vy.NOT_FOUND,void 0,void 0,!0);let a=Sj.createNatsTableStreamName(r,n),{jsm:c}=await Qh.getNATSReferences(),l=await Qh.getStreamInfo(a),u=new Date(l.state.first_ts).getTime();if(s<=u)return`No transactions exist before: ${s}`;let d=CSe,f,m=new Date(l.state.last_ts).getTime();return s>m?(f=l.state.last_seq+1,d=OSe):f=(await Qh.viewStream(a,parseInt(s),1))[0].nats_sequence,await Qh.purgeTableStream(r,n,{seq:f}),d}o(DSe,"deleteTransactionLogsBefore")});var nL=v((GFe,Aj)=>{"use strict";var xy=require("joi"),MSe=require("path"),{handleHDBError:vSe,hdbErrors:USe}=_e(),{HTTP_STATUS_CODES:xSe}=USe,BSe=mt(),bj=Q();Aj.exports={installModules:GSe};var{CONFIG_PARAMS:FSe}=(q(),M(z)),{getConfigValue:kSe}=St(),{nonInteractiveSpawn:HSe}=(Ly(),M(Py));async function GSe(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";bj.warn(t,e.projects);let r=$Se(e);if(r)throw vSe(r,r.message,xSe.BAD_REQUEST);let{projects:n,dryRun:s}=e,i=kSe(FSe.COMPONENTSROOT),a={},c=["install","--force","--omit=dev","--json"];s&&c.push("--dry-run");for(let l of n){a[l]={npm_output:null,npm_error:null};let u=MSe.join(i,l);try{let{stdout:d,stderr:f}=HSe(l,"npm",c,u);d=d?d.replace(`
129
129
  `,""):null,f=f?f.replace(`
130
130
  `,""):null;try{a[l].npm_output=JSON.parse(d)}catch{a[l].npm_output=d}try{a[l].npm_error=JSON.parse(f)}catch{a[l].npm_error=f}}catch(d){d.stderr?a[l].npm_error=qSe(d.stderr):a[l].npm_error=d.message;continue}}return bj.info(`finished installModules with response ${a}`),a.warning=t,a}o(GSe,"installModules");function qSe(e){let t='"error": {',r=e.indexOf('"error": {'),n=e.indexOf(`}
131
- `);return r>-1&&n>-1?JSON.parse(e.substring(r+t.length-1,n+1)):e}o(qSe,"parseNPMStdErr");function $Se(e){let t=xy.object({projects:xy.array().min(1).items(xy.string()).required(),dry_run:xy.boolean().default(!1)});return BSe.validateBySchema(e,t)}o($Se,"modulesValidator")});var aL={};Re(aL,{describeMetric:()=>Pj,describeMetricOp:()=>oL,get:()=>Cj,getOp:()=>sL,listMetrics:()=>Oj,listMetricsOp:()=>iL});async function KSe(e){return(await k_().get(e)).hostname}function Ij(e,t){return e.length===0||e.includes(t)}function sL(e){return Jh.trace?.("get_analytics request:",e),Cj(e.metric,e.get_attributes,e.start_time,e.end_time,e.conditions)}function Nj(e){return"conditions"in e?{...e,conditions:e.conditions.map(Nj)}:{attribute:e.search_attribute??e.attribute,comparator:e.search_type??e.comparator,value:e.search_value??e.value}}async function Cj(e,t,r,n,s){let i=[{attribute:"metric",comparator:"equals",value:e}];s&&i.push(...s.map(Nj));let a=t??[];Ij(a,"id")||a.push("id"),r&&i.push({attribute:"id",comparator:"greater_than_equal",value:r}),n&&i.push({attribute:"id",comparator:"less_than",value:n});let c={conditions:i};return a.length>0&&(c.select=a),Jh.trace?.("get_analytics hdb_analytics.search request:",JSON.stringify(c)),(await databases.system.hdb_analytics.search(c)).map(async u=>{let d=u.id[1];return u.id=u.id[0],Ij(a,"node")&&(Jh.trace?.(`get_analytics lookup hostname for nodeId: ${d}`),u.node=await KSe(d)),Jh.trace?.("get_analytics result:",JSON.stringify(u)),u})}function iL(e){return Oj(e.metric_types)}async function Oj(e=["builtin"]){let t=[],r=Object.values(Uo);if(e.includes("builtin")&&(t=r),e.includes("custom")){let n=r.map(c=>({attribute:"metric",comparator:"not_equal",value:c})),s={select:["metric"],conditions:n},i=new Set,a=await databases.system.hdb_analytics.search(s);for await(let c of a)i.add(c.metric);t.push(...Array.from(i.values()))}return t}function oL(e){return Pj(e.metric)}async function Pj(e){let t={conditions:[{attribute:"metric",comparator:"equals",value:e}],sort:{attribute:"id",descending:!0},limit:1},r=databases.system.hdb_analytics.search(t),n=[{name:"node",type:"string"}];for await(let s of r){for(let a in s)n.push({name:a,type:typeof s[a]});let i={attributes:n};return Jh.trace?.("describe_metric result:",JSON.stringify(i)),i}return{}}var wj,VSe,Jh,cL=se(()=>{wj=b(Q());mA();pA();({forComponent:VSe}=wj.default),Jh=VSe("analytics").conditional;o(KSe,"lookupHostname");o(Ij,"isSelected");o(sL,"getOp");o(Nj,"conformCondition");o(Cj,"get");o(iL,"listMetricsOp");o(Oj,"listMetrics");o(oL,"describeMetricOp");o(Pj,"describeMetric")});var By,Fy,Xh,ky=se(()=>{By={primary:{allowedValues:null},maintenance:{allowedValues:null},availability:{allowedValues:["Available","Unavailable"]}},Fy=Object.keys(By),Xh="primary"});function Dj(e){return Lj.validateBySchema(e,jSe)}var Zh,Lj,YSe,WSe,zSe,jSe,Mj=se(()=>{Zh=b(require("joi")),Lj=b(mt());ky();YSe=Fy,WSe=Object.entries(By).reduce((e,[t,r])=>(r.allowedValues&&(e[t]=`Status "${t}" only accepts these values: ${r.allowedValues.join(", ")}`),e),{}),zSe=o(()=>{let e=Zh.default.string().min(1).max(512);return Object.entries(By).forEach(([t,r])=>{r.allowedValues&&(e=e.when("id",{is:t,then:Zh.default.string().valid(...r.allowedValues).messages({"any.only":WSe[t]})}))}),e.required()},"createStatusValidationSchema"),jSe=Zh.default.object({id:Zh.default.string().valid(...YSe).required(),status:zSe()});o(Dj,"validateStatus")});function vj(){lL||(lL=Ea.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),uL=new Uint8Array(lL))}function Uj(){vj(),uL[0]=1}function xj(){return vj(),uL[0]===1}var lL,uL,dL=se(()=>{eE();o(vj,"ensureInitialized");o(Uj,"requestRestart");o(xj,"restartNeeded")});var EL={};Re(EL,{DEFAULT_STATUS_ID:()=>Xh,STATUS_IDS:()=>Fy,Status:()=>Ea,clear:()=>mL,get:()=>pL,set:()=>hL});function rE(){return fL||(fL=Ze({database:"system",table:"hdb_status",replicate:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"status"},{name:"__createdtime__"},{name:"__updatedtime__"}]})),fL}function mL({id:e}){return tE.debug?.("clearStatus",e),rE().delete(e)}async function JSe(){tE.debug?.("getAllStatus");let e=rE().get({}),t=await yp.query.allThreads(),r=Array.from(t.entries()).map(([s,i])=>({name:s,...i})),n=xj();return{systemStatus:e,componentStatus:r,restartRequired:n}}function pL({id:e}){return e?(tE.debug?.("getStatus",e),rE().get(e)):(tE.debug?.("getStatus","all"),JSe())}function hL({status:e,id:t=Xh}){let r=Dj({status:e,id:t});if(r)throw(0,Hy.handleHDBError)(r,r.message,QSe.BAD_REQUEST);return tE.debug?.("setStatus",t,e),rE().put(t,{status:e})}var Hy,Bj,QSe,fL,Ea,tE,eE=se(()=>{we();Hy=b(_e()),Bj=b(Zn());Mj();ky();Rp();dL();ky();({HTTP_STATUS_CODES:QSe}=Hy.hdbErrors);o(rE,"getStatusTable");Ea={get primaryStore(){return rE().primaryStore}},tE=(0,Bj.loggerWithTag)("status");o(mL,"clearStatus");o(JSe,"getAllStatus");o(pL,"getStatus");o(hL,"setStatus")});var TL={};Re(TL,{getFingerprint:()=>gL,getRegistrationInfo:()=>_L,setLicense:()=>SL});function _L(){return{version:Fj.packageJson.version,deprecated:!0}}function gL(){return{message:"this-is-deprecated",deprecated:!0}}function SL(){return{deprecated:!0}}var Fj,yL=se(()=>{Fj=b(Ct());o(_L,"getRegistrationInfo");o(gL,"getFingerprint");o(SL,"setLicense")});var Hj=v((ake,kj)=>{"use strict";var nE=require("alasql"),ru=require("recursive-iterator"),wi=Q(),XSe=ae(),sE=(q(),M(z)),RL=class{static{o(this,"sqlStatementBucket")}constructor(t){this.ast=t,this.affected_attributes=new Map,this.table_lookup=new Map,this.schema_lookup=new Map,this.table_to_schema_lookup=new Map,eTe(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=>sE.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=>!sE.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,a=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[a]&&t[i].tables[a][sE.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[a].attribute_permissions.length>0?c=ZSe(t[i].tables[a].attribute_permissions):c=global.hdb_schema[i][a].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(a).filter(u=>!sE.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new nE.yy.Column({columnid:u});s.tableid&&(d.tableid=s.tableid),this.ast.columns.push(d),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(a,l)}}),this.ast}};function ZSe(e){return e.filter(t=>t[sE.PERMS_CRUD_ENUM.READ])}o(ZSe,"filterReadRestrictedAttrs");function eTe(e,t,r,n,s){tTe(e,t,r,n,s)}o(eTe,"interpretAST");function iE(e,t,r,n,s){if(!(!e||!e.databaseid)&&(t.has(e.databaseid)||t.set(e.databaseid,new Map),t.get(e.databaseid).has(e.tableid)||t.get(e.databaseid).set(e.tableid,[]),e.as&&(r.has(e.as)||r.set(e.as,e.tableid),n&&!n.has(e.as)&&n.set(e.as,e.databaseid)),s)){let i=e.databaseid,a=e.tableid;e.as&&(a=e.as),s.set(a,i)}}o(iE,"addSchemaTableToMap");function tTe(e,t,r,n,s){if(!e){wi.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof nE.yy.Insert?iTe(e,t,r):e instanceof nE.yy.Select?rTe(e,t,r,n,s):e instanceof nE.yy.Update?nTe(e,t,r):e instanceof nE.yy.Delete?sTe(e,t,r):wi.error("AST in getRecordAttributesAST() is not a valid SQL type.")}o(tTe,"getRecordAttributesAST");function rTe(e,t,r,n,s){if(!e){wi.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(XSe.isEmptyOrZeroLength(i)){wi.error("No schema specified");return}e.from.forEach(c=>{iE(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),iE(c.table,t,r,n,s)});let a=new ru(e.columns);for(let{node:c}of a)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{wi.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 ru(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let d=u.tableid?u.tableid:l;if(!t.get(i).has(d))if(r.has(d))d=r.get(d);else{wi.info(`table specified as ${d} not found.`);continue}t.get(i).get(d).indexOf(u.columnid)<0&&t.get(i).get(d).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new ru(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,f=s.get(d);if(!t.get(f).has(d))if(r.has(d))d=r.get(d);else{wi.info(`table specified as ${d} not found.`);continue}t.get(f).get(d).indexOf(u.columnid)<0&&t.get(f).get(d).push(u.columnid)}}),e.order){let c=new ru(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,d=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(d).has(u))if(r.has(u))u=r.get(u);else{wi.info(`table specified as ${u} not found.`);return}t.get(d).get(u).indexOf(l.columnid)<0&&t.get(d).get(u).push(l.columnid)}}}o(rTe,"getSelectAttributes");function nTe(e,t,r){if(!e){wi.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new ru(e.columns),s=e.table.databaseid;iE(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&bL(e.table.tableid,s,i.columnid,t,r)}o(nTe,"getUpdateAttributes");function sTe(e,t,r){if(!e){wi.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new ru(e.where),s=e.table.databaseid;iE(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&bL(e.table.tableid,s,i.columnid,t,r)}o(sTe,"getDeleteAttributes");function iTe(e,t,r){if(!e){wi.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new ru(e.columns),s=e.into.databaseid;iE(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&bL(e.into.tableid,s,i.columnid,t,r)}o(iTe,"getInsertAttributes");function bL(e,t,r,n,s){if(!n.get(t))return;let i=e;n.get(t).has(i)||(i=s.get(i)),n.get(t).get(i).push(r)}o(bL,"pushAttribute");kj.exports=RL});var Vy=v((lke,n4)=>{"use strict";var AL=Gn(),Gy=hn(),Is=mT(),cE=Ll(),IL=Sl(),oTe=LC(),aTe=r1(),lE=fs(),qy=kp(),Lr=Q(),cTe=xC(),lTe=IT(),uTe=lO(),dTe=NT(),fTe=fO(),mTe=mO(),pTe=EO(),hTe=gO(),wL=DT(),_a=ae(),$j=Cf(),An=(q(),M(z)),Vj=Bz(),ETe=fh(),Kj=(Pd(),M(Kp)),Yj=(Ny(),M(Kh)),Wj=St(),yr=XP(),zj=Uy(),_Te=nL(),Pf=_s(),jj=(ef(),M(Zd)),NL=(cL(),M(aL)),CL=(eE(),M(EL)),Qj=(vh(),M(ay)),OL=(yL(),M(TL)),Jj=JN(),{handleHDBError:zn,hdbErrors:Xj}=_e(),{HDB_ERROR_MSGS:cn,HTTP_STATUS_CODES:oE}=Xj,ee=new Map,Zj="delete",Dc="insert",Js="read",nu="update",aE="describe",Gj=cE.describeSchema.name,qj=cE.describeTable.name,e4={delete:!0,deleteRecord:!0,update:!0,updateData:!0,dropAttribute:!0,dropTable:!0,dropSchema:!0,upsert:!0,upsertData:!0},gTe={insert:!0,delete:!0,deleteRecord:!0,update:!0,updateData:!0,upsert:!0,upsertData:!0},STe="catchup",TTe="handleGetJob",yTe="handleGetJobsByStartDate",$y={CSV_DATA_LOAD:"csvDataLoad",CSV_URL_LOAD:"csvURLLoad",CSV_FILE_LOAD:"csvFileLoad",IMPORT_FROM_S3:"importFromS3"},RTe=[Is.createTable.name,Is.createAttribute.name,Is.dropTable.name,Is.dropAttribute.name],t4={EXPORT_TO_S3:"export_to_s3",EXPORT_LOCAL:"export_local"},re=class{static{o(this,"permission")}constructor(t,r){this.requires_su=t,this.perms=r}};ee.set(AL.insert.name,new re(!1,[Dc]));ee.set(AL.update.name,new re(!1,[nu]));ee.set(AL.upsert.name,new re(!1,[Dc,nu]));ee.set(Gy.searchByConditions.name,new re(!1,[Js]));ee.set(Gy.searchByHash.name,new re(!1,[Js]));ee.set(Gy.searchByValue.name,new re(!1,[Js]));ee.set(Gy.search.name,new re(!1,[Js]));ee.set(Is.createSchema.name,new re(!0,[]));ee.set(Is.createTable.name,new re(!0,[]));ee.set(Is.createAttribute.name,new re(!1,[Dc]));ee.set(Is.dropSchema.name,new re(!0,[]));ee.set(Is.dropTable.name,new re(!0,[]));ee.set(Is.dropAttribute.name,new re(!0,[]));ee.set(cE.describeSchema.name,new re(!1,[Js]));ee.set(cE.describeTable.name,new re(!1,[Js]));ee.set(IL.deleteRecord.name,new re(!1,[Zj]));ee.set(lE.addUser.name,new re(!0,[]));ee.set(lE.alterUser.name,new re(!0,[]));ee.set(lE.dropUser.name,new re(!0,[]));ee.set(lE.listUsersExternal.name,new re(!0,[]));ee.set(qy.listRoles.name,new re(!0,[]));ee.set(qy.addRole.name,new re(!0,[]));ee.set(qy.alterRole.name,new re(!0,[]));ee.set(qy.dropRole.name,new re(!0,[]));ee.set(cTe.name,new re(!0,[]));ee.set(lTe.name,new re(!0,[]));ee.set(uTe.name,new re(!0,[]));ee.set(dTe.name,new re(!0,[]));ee.set(fTe.name,new re(!0,[]));ee.set(mTe.name,new re(!0,[]));ee.set(wL.setRoutes.name,new re(!0,[]));ee.set(wL.getRoutes.name,new re(!0,[]));ee.set(wL.deleteRoutes.name,new re(!0,[]));ee.set(Wj.setConfiguration.name,new re(!0,[]));ee.set(pTe.clusterStatus.name,new re(!0,[]));ee.set(hTe.name,new re(!0,[]));ee.set(IL.deleteFilesBefore.name,new re(!0,[]));ee.set(IL.deleteAuditLogsBefore.name,new re(!0,[]));ee.set($j.restart.name,new re(!0,[]));ee.set($j.restartService.name,new re(!0,[]));ee.set(oTe.name,new re(!0,[]));ee.set(aTe.name,new re(!0,[Js]));ee.set(Is.cleanupOrphanBlobs.name,new re(!0,[]));ee.set(ETe.systemInformation.name,new re(!0,[]));ee.set(Wj.getConfiguration.name,new re(!0,[]));ee.set(zj.readTransactionLog.name,new re(!0,[]));ee.set(zj.deleteTransactionLogsBefore.name,new re(!0,[]));ee.set(_Te.installModules.name,new re(!0,[]));ee.set(Pf.createCsr.name,new re(!0,[]));ee.set(Pf.signCertificate.name,new re(!0,[]));ee.set(Pf.listCertificates.name,new re(!0,[]));ee.set(Pf.addCertificate.name,new re(!0,[]));ee.set(Pf.removeCertificate.name,new re(!0,[]));ee.set(Pf.getKey.name,new re(!0,[]));ee.set(jj.addNodeBack.name,new re(!0,[]));ee.set(jj.removeNodeBack.name,new re(!0,[]));ee.set(NL.getOp.name,new re(!1,[Js]));ee.set(NL.listMetricsOp.name,new re(!1,[Js]));ee.set(NL.describeMetricOp.name,new re(!1,[Js]));ee.set(CL.clear.name,new re(!0,[]));ee.set(CL.get.name,new re(!0,[]));ee.set(CL.set.name,new re(!0,[]));ee.set(Qj.installUsageLicenseOp.name,new re(!0,[]));ee.set(Qj.getUsageLicensesOp.name,new re(!0,[]));ee.set(OL.getFingerprint.name,new re(!0,[]));ee.set(OL.setLicense.name,new re(!0,[]));ee.set(Kj.createTokens.name,new re(!1,[]));ee.set(Kj.refreshOperationToken.name,new re(!1,[]));ee.set(Yj.login.name,new re(!1,[]));ee.set(Yj.logout.name,new re(!1,[]));ee.set(yr.customFunctionsStatus.name,new re(!0,[]));ee.set(yr.getCustomFunctions.name,new re(!0,[]));ee.set(yr.getComponents.name,new re(!0,[]));ee.set(yr.getComponentFile.name,new re(!0,[]));ee.set(yr.setComponentFile.name,new re(!0,[]));ee.set(yr.dropComponent.name,new re(!0,[]));ee.set(yr.getCustomFunction.name,new re(!0,[]));ee.set(yr.setCustomFunction.name,new re(!0,[]));ee.set(yr.dropCustomFunction.name,new re(!0,[]));ee.set(yr.addComponent.name,new re(!0,[]));ee.set(yr.dropCustomFunctionProject.name,new re(!0,[]));ee.set(yr.packageComponent.name,new re(!0,[]));ee.set(yr.deployComponent.name,new re(!0,[]));ee.set(yr.addSSHKey.name,new re(!0,[]));ee.set(yr.updateSSHKey.name,new re(!0,[]));ee.set(yr.deleteSSHKey.name,new re(!0,[]));ee.set(yr.listSSHKeys.name,new re(!0,[]));ee.set(yr.setSSHKnownHosts.name,new re(!0,[]));ee.set(yr.getSSHKnownHosts.name,new re(!0,[]));ee.set(OL.getRegistrationInfo.name,new re(!1,[]));ee.set(lE.userInfo.name,new re(!1,[]));ee.set(cE.describeAll.name,new re(!1,[]));ee.set(TTe,new re(!1,[]));ee.set(yTe,new re(!0,[]));ee.set(STe,new re(!0,[]));ee.set($y.CSV_DATA_LOAD,new re(!1,[Dc,nu]));ee.set($y.CSV_URL_LOAD,new re(!1,[Dc,nu]));ee.set($y.CSV_FILE_LOAD,new re(!1,[Dc,nu]));ee.set($y.IMPORT_FROM_S3,new re(!1,[Dc,nu]));ee.set(t4.EXPORT_TO_S3,new re(!0,[]));ee.set(t4.EXPORT_LOCAL,new re(!0,[]));ee.set(An.VALID_SQL_OPS_ENUM.DELETE,new re(!1,[Zj]));ee.set(An.VALID_SQL_OPS_ENUM.SELECT,new re(!1,[Js]));ee.set(An.VALID_SQL_OPS_ENUM.INSERT,new re(!1,[Dc]));ee.set(An.VALID_SQL_OPS_ENUM.UPDATE,new re(!1,[nu]));n4.exports={verifyPerms:ATe,verifyPermsAst:bTe,verifyBulkLoadAttributePerms:wTe};function bTe(e,t,r){if(_a.isEmptyOrZeroLength(e))throw Lr.info("verify_perms_ast has an empty user parameter"),zn(new Error);if(_a.isEmptyOrZeroLength(t))throw Lr.info("verify_perms_ast has an empty user parameter"),zn(new Error);if(_a.isEmptyOrZeroLength(r))throw Lr.info("verify_perms_ast has a null operation parameter"),zn(new Error);try{let n=Hj(),s=require("alasql"),i=new Jj,a=new n(e),c=a.getSchemas(),l=new Map;if((!c||c.length===0)&&a.affected_attributes&&a.affected_attributes.size>0)throw Lr.info("No schemas defined in verifyPermsAst(), will not continue."),zn(new Error);let u=!!t.role.permission.super_user,d=c.includes("system");if(d&&e4[r])throw zn(new Error,cn.DROP_SYSTEM,oE.FORBIDDEN);if(u&&!d)return null;let f=Vj.getRolePermissions(t.role);t.role.permission=f,!u&&e instanceof s.yy.Select&&(e=a.updateAttributeWildcardsForRolePerms(f));for(let p=0;p<c.length;p++){let h=a.getTablesBySchemaName(c[p]);h&&l.set(c[p],h)}let m=r4(t,r,l,i);return m||(l.forEach((p,h)=>{for(let E=0;E<p.length;E++){let g=a.getAttributesBySchemaTableName(h,p[E]),R=LL(t.role.permission,h,p[E]);PL(g,R,r,p[E],h,i)}}),i.getPermsResponse())}catch(n){throw zn(n)}}o(bTe,"verifyPermsAst");function ATe(e,t){if(e===null||t===null||e.hdb_user===void 0||e.hdb_user===null)throw Lr.info("null required parameter in verifyPerms"),zn(new Error,cn.DEFAULT_INVALID_REQUEST,oE.BAD_REQUEST);let r;t instanceof Function?r=t.name:r=t;let n=e.action,s=e.schema??e.database,i=e.table,a=new Map;s&&i&&a.set(s,[i]);let c=new Jj;if(_a.isEmptyOrZeroLength(e.hdb_user?.role)||_a.isEmptyOrZeroLength(e.hdb_user?.role?.permission))return Lr.info(`User ${e.hdb_user?.username} has no role or permissions. Please assign the user a valid role.`),c.handleUnauthorizedItem(cn.USER_HAS_NO_PERMS(e.hdb_user?.username));let l=!!e.hdb_user?.role?.permission?.super_user,u=e.hdb_user?.role?.permission?.structure_user,d=a.has(An.SYSTEM_SCHEMA_NAME)||s===An.SYSTEM_SCHEMA_NAME;if(l&&d&&gTe[e.operation]&&(i===An.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME||i===An.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||i===An.SYSTEM_TABLE_NAMES.USER_TABLE_NAME))return null;if(d&&e4[r])throw zn(new Error,cn.DROP_SYSTEM,oE.FORBIDDEN);if(l&&!d||u===!0&&(r===Is.createSchema.name||r===Is.dropSchema.name))return null;if(RTe.indexOf(r)>=0&&(u===!0||Array.isArray(u)))return u===!0||u.indexOf(s)>=0?null:c.handleUnauthorizedItem(`User does not have access to perform '${e.operation}' against schema '${s}'`);let f=Vj.getRolePermissions(e.hdb_user?.role);if(e.hdb_user?.role&&(e.hdb_user.role.permission=f),(r===Gj||r===qj)&&!f.super_user){if(s===An.SYSTEM_SCHEMA_NAME)return c.handleUnauthorizedItem(cn.SCHEMA_PERM_ERROR(s));if(r===Gj&&(!f[s]||!f[s][aE]))return c.handleInvalidItem(cn.SCHEMA_NOT_FOUND(s));if(r===qj&&(!f[s]||!f[s].tables[i]||!f[s].tables[i][aE]))return c.handleInvalidItem(cn.TABLE_NOT_FOUND(s,i))}let m=r4(e.hdb_user,r,a,c,n);if(m)return m;if(ee.get(r)&&ee.get(r).perms.length===0)return null;if(!l&&e.get_attributes&&An.SEARCH_WILDCARDS.includes(e.get_attributes[0])){let E=[],g=f[s].tables[i];g[An.PERMS_CRUD_ENUM.READ]&&(g.attribute_permissions.length>0?g.attribute_permissions.filter(S=>S[An.PERMS_CRUD_ENUM.READ]).forEach(S=>{E.push(S.attribute_name)}):E=global.hdb_schema[s][i].attributes.map(R=>R.attribute),e.get_attributes=E)}let p=ITe(e),h=LL(e.hdb_user?.role?.permission,s,i);return PL(p,h,r,i,s,c,n),c.getPermsResponse()}o(ATe,"verifyPerms");function r4(e,t,r,n,s){if(_a.arrayHasEmptyValues([e,t,r]))throw Lr.info("hasPermissions has an invalid parameter"),zn(new Error);let i=r.has("system"),a=e.role.permission;if(a.super_user&&(!i||ee.get(t).requires_su))return null;if(!ee.get(t))throw Lr.info(`operation ${t} not found.`),zn(new Error,cn.OP_NOT_FOUND(t),oE.BAD_REQUEST);if(ee.get(t)&&ee.get(t).requires_su)return Lr.info(`operation ${t} requires SU permissions.`),n.handleUnauthorizedItem(cn.OP_IS_SU_ONLY(t));let c=r.keys();for(let l of c){try{if(l&&!a[l]||a[l][aE]===!1){n.addInvalidItem(cn.SCHEMA_NOT_FOUND(l));continue}}catch{n.addInvalidItem(cn.SCHEMA_NOT_FOUND(l));continue}let u=r.get(l);for(let d of u){let f=a[l].tables[d];if(!f||f[aE]===!1)n.addInvalidItem(cn.TABLE_NOT_FOUND(l,d));else try{let m=[],p=ee.get(t).perms;!_a.isEmpty(s)&&p.includes(s)&&(p=[s]);for(let h=0;h<p.length;h++){let E=p[h],g=f[E];(g==null||g===!1)&&(Lr.info(`Required ${E} permission not found for ${t} ${s?`${s} `:""}operation in role ${e.role.id}`),m.push(E))}m.length>0&&n.addUnauthorizedTable(l,d,m)}catch(m){let p=cn.UNKNOWN_OP_AUTH_ERROR(t,l,d);throw Lr.error(p),Lr.error(m),zn(Xj.CHECK_LOGS_WRAPPER(p))}}}return r.size<2?n.getPermsResponse():null}o(r4,"hasPermissions");function PL(e,t,r,n,s,i,a){if(!e||!t)throw Lr.info("no attributes specified in checkAttributePerms."),zn(new Error);let c=ee.get(r).perms;if(!c||c==="")throw Lr.info(`no permissions found for ${r} in checkAttributePerms().`),zn(new Error);if(_a.isEmptyOrZeroLength(t))return Lr.info("No role permissions set (this is OK)."),null;a&&c.includes(a)&&(c=[a]);let l={};for(let d of e){let f=t.get(d);if(f){if(f[aE]===!1){i.addInvalidItem(cn.ATTR_NOT_FOUND(s,n,d),s,n);continue}if(c)for(let m of c){if(An.TIME_STAMP_NAMES.includes(f.attribute_name)&&m!==Js)throw zn(new Error,cn.SYSTEM_TIMESTAMP_PERMS_ERR,oE.FORBIDDEN);f[m]===!1&&(l[f.attribute_name]?l[f.attribute_name].push(m):l[f.attribute_name]=[m])}}else i.addInvalidItem(cn.ATTR_NOT_FOUND(s,n,d),s,n)}let u=Object.keys(l);u.length>0&&i.addUnauthorizedAttributes(u,s,n,l)}o(PL,"checkAttributePerms");function ITe(e){let t=new Set;try{if(e.action)return t;if(e.operation===An.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS&&e.conditions.forEach(r=>{let n=r.attribute;r.search_attribute!==void 0&&(n=r.search_attribute),t.add(n)}),e&&(e.attribute||e.search_attribute)){let r=e.attribute;e.search_attribute!==void 0&&(r=e.search_attribute),t.add(r)}if(!e.records||e.records.length===0){if(!e.get_attributes||e.get_attributes.length===0)return t;for(let r of e.get_attributes)t.add(r)}else for(let r of e.records){let n=Object.keys(r);for(let s of n)t.add(s)}}catch(r){Lr.info(r)}return t}o(ITe,"getRecordAttributes");function LL(e,t,r){let n=new Map;if(_a.isEmpty(e))return Lr.info("no hdb_user specified in getAttributePermissions"),n;if(e.super_user||!t||!r)return n;try{e[t].tables[r].attribute_permissions.forEach(s=>{n.has(s.attribute_name)||n.set(s.attribute_name,s)})}catch{Lr.info(`No attribute permissions found for schema ${t} and table ${r}.`)}return n}o(LL,"getAttributePermissions");function wTe(e,t,r,n,s,i,a){let c=new Set(i),l=LL(e,n,s);PL(c,l,t,s,n,a,r)}o(wTe,"verifyBulkLoadAttributePerms")});var ML=v((dke,s4)=>{"use strict";var DL=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};s4.exports=DL});var kL=v((_ke,y4)=>{"use strict";var Ky=Gn(),Wy=$N(),NTe=require("needle"),Ni=(q(),M(z)),mke=Ot(),Lf=ae(),{handleHDBError:Zt,hdbErrors:m4}=_e(),{HTTP_STATUS_CODES:ln,HDB_ERROR_MSGS:Dr,CHECK_LOGS_WRAPPER:iu}=m4,Df=Q(),vL=require("papaparse");Lf.promisifyPapaParse();var Ci=require("fs-extra"),CTe=require("path"),{chain:i4}=require("stream-chain"),o4=require("stream-json/streamers/StreamArray"),a4=require("stream-json/utils/Batch"),c4=require("stream-chain/utils/comp"),{finished:l4}=require("stream"),OTe=me(),p4=VN(),PTe=KN(),{BulkLoadFileObject:xL,BulkLoadDataObject:LTe}=e$(),BL=JN(),{verifyBulkLoadAttributePerms:h4}=Vy(),pke=ML(),hke=_r(),Eke=Xi(),{databases:DTe}=(we(),M(ft)),{coerceType:MTe}=(tg(),M(AG)),u4="No records parsed from csv file.",su=`${OTe.get("HDB_ROOT")}/tmp`,{schemaRegex:vTe}=Ki(),d4=1024*1024*2,f4=5e3,UTe={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};y4.exports={csvDataLoad:xTe,csvURLLoad:BTe,csvFileLoad:FTe,importFromS3:kTe};async function xTe(e,t){let r=Wy.dataObject(e);if(r)throw Zt(r,r.message,ln.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=g4(e.schema,e.table),i=vL.parse(e.data,{header:!0,skipEmptyLines:!0,transform:UL.bind(null,s),dynamicTyping:!1}),a=new BL;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&h4(e.hdb_user?.role?.permission,this.job_operation_function.name,e.action,e.schema,e.table,i.meta.fields,a);let c=a.getPermsResponse();if(c)throw Zt(new Error,c,ln.BAD_REQUEST,void 0,void 0,!0);let l=new LTe(e.action,e.schema,e.table,i.data);return n=await p4.callOperationFunctionAsAwait(S4,l,null),n.message===u4?u4:T4(n.records,n.number_written)}catch(s){throw ou(s)}}o(xTe,"csvDataLoad");async function BTe(e){let t=Wy.urlObject(e);if(t)throw Zt(t,t.message,ln.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${su}/${r}`;try{await HTe(e,r)}catch(s){throw Df.error(Dr.DOWNLOAD_FILE_ERR(r)+" - "+s),Zt(s,iu(Dr.DOWNLOAD_FILE_ERR(r)))}try{let s=new xL(this.job_operation_function.name,e.action,e.schema,e.table,n,Ni.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await FL(s);return await Yy(n),i}catch(s){throw await Yy(n),ou(s)}}o(BTe,"csvURLLoad");async function FTe(e){let t=Wy.fileObject(e);if(t)throw Zt(t,t.message,ln.BAD_REQUEST,void 0,void 0,!0);let r=new xL(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Ni.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await FL(r)}catch(n){throw ou(n)}}o(FTe,"csvFileLoad");async function kTe(e){let t=Wy.s3FileObject(e);if(t)throw Zt(t,t.message,ln.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=CTe.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${su}/${s}`;let i=new xL(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await GTe(s,e);let a=await FL(i);return await Yy(r),a}catch(n){throw await Yy(r),ou(n)}}o(kTe,"importFromS3");async function HTe(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await NTe("get",e.csv_url,n)}catch(n){let s=`Error downloading CSV file from ${e.csv_url}, status code: ${n.statusCode}. Check the log for more information.`;throw Zt(n,s,n.statusCode,Ni.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}$Te(r,e.csv_url),await qTe(t,r.raw)}o(HTe,"downloadCSVFile");async function GTe(e,t){try{let r=`${su}/${e}`;await Ci.mkdirp(su),await Ci.writeFile(`${su}/${e}`,"",{flag:"a+"});let n=await Ci.createWriteStream(r),s=await PTe.getFileStreamFromS3(t);await new Promise((i,a)=>{s.on("error",function(c){a(c)}),s.pipe(n).on("error",function(c){a(c)}).on("close",function(){Df.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw Df.error(Dr.S3_DOWNLOAD_ERR+" - "+r),Zt(r,iu(Dr.S3_DOWNLOAD_ERR))}}o(GTe,"downloadFileFromS3");async function qTe(e,t){try{await Ci.mkdirp(su),await Ci.writeFile(`${su}/${e}`,t)}catch(r){throw Df.error(Dr.WRITE_TEMP_FILE_ERR),Zt(r,iu(Dr.DEFAULT_BULK_LOAD_ERR))}}o(qTe,"writeFileToTempFolder");async function Yy(e){if(e)try{await Ci.access(e),await Ci.unlink(e)}catch{Df.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(Yy,"deleteTempFile");function $Te(e,t){if(e.statusCode!==m4.HTTP_STATUS_CODES.OK)throw Zt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,ln.BAD_REQUEST);if(!UTe[e.headers["content-type"]])throw Zt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,ln.BAD_REQUEST);if(!e.raw)throw Zt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,ln.BAD_REQUEST)}o($Te,"validateURLResponse");async function FL(e){try{let t;switch(e.file_type){case Ni.VALID_S3_FILE_TYPES.CSV:t=await VTe(e);break;case Ni.VALID_S3_FILE_TYPES.JSON:t=await KTe(e);break;default:throw Zt(new Error,Dr.DEFAULT_BULK_LOAD_ERR,ln.BAD_REQUEST,Ni.LOG_LEVELS.ERROR,Dr.INVALID_FILE_EXT_ERR(e))}return T4(t.records,t.number_written)}catch(t){throw ou(t)}}o(FL,"fileLoad");async function E4(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;s&&s.pause();let a={operation:e.action,schema:e.schema,table:e.table,records:i};try{let{attributes:c}=await Ky.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&h4(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=Zt(c);r(l)}}o(E4,"validateChunk");async function _4(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;Lf.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!Lf.isEmpty(c)&&!Lf.isEmpty(c.__parsed_extra)&&delete c.__parsed_extra});else{let c=new Set;i.forEach(l=>{Object.keys(l).forEach(u=>c.add(u))}),a=[...c]}try{let c={schema:e.schema,table:e.table,action:e.action,data:i},l=await p4.callOperationFunctionAsAwait(S4,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=Zt(c,iu(Dr.INSERT_CSV_ERR),ln.INTERNAL_SERVER_ERROR,Ni.LOG_LEVELS.ERROR,Dr.INSERT_CSV_ERR+" - "+c);r(l)}}o(_4,"insertChunk");async function VTe(e){let t={records:0,number_written:0},r=g4(e.schema,e.table);try{let n=new BL,s=Ci.createReadStream(e.file_path,{highWaterMark:d4});s.setEncoding("utf8"),await vL.parsePromise(s,E4.bind(null,e,n),UL.bind(null,r));let i=n.getPermsResponse();if(i)throw Zt(new Error,i,ln.BAD_REQUEST);return s=Ci.createReadStream(e.file_path,{highWaterMark:d4}),s.setEncoding("utf8"),await vL.parsePromise(s,_4.bind(null,e,t),UL.bind(null,r)),s.destroy(),t}catch(n){throw Zt(n,iu(Dr.PAPA_PARSE_ERR),ln.INTERNAL_SERVER_ERROR,Ni.LOG_LEVELS.ERROR,Dr.PAPA_PARSE_ERR+n)}}o(VTe,"callPapaParse");function g4(e,t){let r=DTe[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>MTe(i,s));return n}o(g4,"createTransformMap");function UL(e,t,r){let n=e.get(r);return n?n(t):Lf.autoCast(t)}o(UL,"typeFunction");async function KTe(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new BL,s=i4([Ci.createReadStream(e.file_path,{encoding:"utf-8"}),o4.withParser(),c=>c.value,new a4({batchSize:f4}),c4(async c=>{await E4(e,n,r,c)})]);await new Promise((c,l)=>{l4(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw Zt(new Error,i,ln.BAD_REQUEST);let a=i4([Ci.createReadStream(e.file_path,{encoding:"utf-8"}),o4.withParser(),c=>c.value,new a4({batchSize:f4}),c4(async c=>{await _4(e,t,r,c)})]);return await new Promise((c,l)=>{l4(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw Zt(n,iu(Dr.INSERT_JSON_ERR),ln.INTERNAL_SERVER_ERROR,Ni.LOG_LEVELS.ERROR,Dr.INSERT_JSON_ERR+n)}}o(KTe,"insertJson");async function S4(e){let t={};try{e.data&&e.data.length>0&&YTe(e.data[0])?t=await WTe(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",Df.info(t.message))}catch(r){throw ou(r)}return t}o(S4,"callBulkFileLoad");function YTe(e){let t=Object.keys(e);for(let r of t)if(!vTe.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(YTe,"validateColumnNames");async function WTe(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=Ky.insert;break;case"update":i=Ky.update;break;case"upsert":i=Ky.upsert;break;default:throw Zt(new Error,Dr.INVALID_ACTION_PARAM_ERR(n),ln.BAD_REQUEST,Ni.LOG_LEVELS.ERROR,Dr.INVALID_ACTION_PARAM_ERR(n))}try{let a=await i(s),c;switch(n){case"insert":c=a.inserted_hashes;break;case"update":c=a.update_hashes;break;case"upsert":c=a.upserted_hashes;break;default:break}if(Array.isArray(a.skipped_hashes)&&a.skipped_hashes.length>0){let d=global.hdb_schema[t][r].hash_attribute,f=e.length;for(;f--;)a.skipped_hashes.indexOf(e[f][d])>=0&&e.splice(f,1)}let l=Lf.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw ou(a)}}o(WTe,"bulkFileLoad");function T4(e,t){return`successfully loaded ${t} of ${e} records`}o(T4,"buildResponseMsg");function ou(e){return Zt(e,iu(Dr.DEFAULT_BULK_LOAD_ERR),ln.INTERNAL_SERVER_ERROR,Ni.LOG_LEVELS.ERROR,Dr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(ou,"buildTopLevelErrMsg")});var zy=v((Ske,R4)=>{"use strict";var zTe=cs();R4.exports={writeTransaction:jTe};function jTe(e,t,r){return zTe.writeTransaction(e,t,r)}o(jTe,"writeTransaction")});var w4=v((Rke,I4)=>{"use strict";var QTe=hn(),JTe=Qi(),b4=Q(),XTe=Gn(),yke=zy(),ZTe=require("clone"),GL=require("alasql"),eye=Mg(),A4=require("util"),tye=A4.promisify(JTe.getTableSchema),rye=A4.promisify(QTe.search),nye=(q(),M(z)),HL=ae();eye(GL);I4.exports={update:iye};var sye="There was a problem performing this update. Please check the logs and try again.";async function iye({statement:e,hdb_user:t}){let r=await tye(e.table.databaseid,e.table.tableid),n=oye(e.columns);HL.backtickASTSchemaItems(e);let{table:s,where:i}=e,a=ZTe(s),c=HL.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=GL.parse(l).statements[0],d=await rye(u),f=aye(n,d);return cye(a,f,t)}o(iye,"update");function oye(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=GL.compile(`SELECT ${r.expression.toString()} AS [${nye.FUNC_VAL}] FROM ?`)}),t}catch(t){throw b4.error(t),new Error(sye)}}o(oye,"createUpdateRecord");function aye(e,t){return HL.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}o(aye,"buildUpdateRecords");async function cye(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await XTe.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){b4.error(`Error delete new_attributes from update response: ${i}`)}return s}o(cye,"updateRecords")});var C4=v((wke,N4)=>{var lye=require("alasql"),uye=hn(),dye=Q(),fye=cs(),$L=require("util"),qL=ae(),mye=(q(),M(z)),pye=Qi(),Ake=zy(),Ike=Gn(),hye="record",Eye="successfully deleted",_ye=$L.callbackify(yye),gye=$L.promisify(uye.search),Sye=$L.promisify(pye.getTableSchema);N4.exports={convertDelete:_ye};function Tye(e){return`${e.deleted_hashes.length} ${hye}${e.deleted_hashes.length===1?"":"s"} ${Eye}`}o(Tye,"generateReturnMessage");async function yye({statement:e,hdb_user:t}){let r=await Sye(e.table.databaseid,e.table.tableid);qL.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=qL.isEmpty(s)?"":` WHERE ${s.toString()}`,a=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=lye.parse(a).statements[0],l={operation:mye.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await gye(c);let u=await fye.deleteRecords(l);return qL.isEmptyOrZeroLength(u.message)&&(u.message=Tye(u)),delete u.txn_time,u}catch(u){throw dye.error(u),u.hdb_code?u.message:u}}o(yye,"convertDelete")});var dE=v((Cke,M4)=>{"use strict";M4.exports={evaluateSQL:vye,processAST:D4,convertSQLToAST:L4,checkASTPermissions:P4};var Rye=Gn(),O4=require("util"),bye=O4.callbackify(Rye.insert),Aye=hn().search,Iye=w4().update,wye=O4.callbackify(Iye),Nye=C4().convertDelete,Mc=require("alasql"),Cye=Vy(),jy=Q(),Oye=Mg(),Pye=ae(),uE=(q(),M(z)),{hdbErrors:Lye,handleHDBError:VL}=_e(),{HTTP_STATUS_CODES:KL}=Lye;Oye(Mc);var Dye=403,Mye="There was a problem performing this insert. Please check the logs and try again.",YL=class{static{o(this,"ParsedSQLObject")}constructor(){this.ast=void 0,this.variant=void 0,this.permissions_checked=!1}};function vye(e,t){let r=e.parsed_sql_object;if(!r){r=L4(e.sql);let n,s=r.ast.statements[0];if(s instanceof Mc.yy.Insert?n=s.into.databaseid:s instanceof Mc.yy.Select?n=s.from?s.from[0].databaseid:null:s instanceof Mc.yy.Update||s instanceof Mc.yy.Delete?n=s.table.databaseid:jy.error("AST in evaluateSQL is not a valid SQL type."),!(s instanceof Mc.yy.Select)&&Pye.isEmptyOrZeroLength(n))return t("No schema specified",null)}D4(e,r,(n,s)=>{if(n)return t(n);t(null,s)})}o(vye,"evaluateSQL");function P4(e,t){let r;try{r=Cye.verifyPermsAst(t.ast.statements[0],e.hdb_user,t.variant),t.permissions_checked=!0}catch(n){throw n}return r||null}o(P4,"checkASTPermissions");function L4(e){let t=new YL;if(!e)throw VL(new Error,"The 'sql' parameter is missing from the request body",KL.BAD_REQUEST);try{let r=e.trim(),n=Mc.parse(r),s=r.split(" ")[0].toLowerCase();t.ast=n,t.variant=s}catch(r){let n=r.message.split(`
131
+ `);return r>-1&&n>-1?JSON.parse(e.substring(r+t.length-1,n+1)):e}o(qSe,"parseNPMStdErr");function $Se(e){let t=xy.object({projects:xy.array().min(1).items(xy.string()).required(),dry_run:xy.boolean().default(!1)});return BSe.validateBySchema(e,t)}o($Se,"modulesValidator")});var aL={};Re(aL,{describeMetric:()=>Pj,describeMetricOp:()=>oL,get:()=>Cj,getOp:()=>sL,listMetrics:()=>Oj,listMetricsOp:()=>iL});async function KSe(e){return(await k_().get(e)).hostname}function Ij(e,t){return e.length===0||e.includes(t)}function sL(e){return Jh.trace?.("get_analytics request:",e),Cj(e.metric,e.get_attributes,e.start_time,e.end_time,e.conditions)}function Nj(e){return"conditions"in e?{...e,conditions:e.conditions.map(Nj)}:{attribute:e.search_attribute??e.attribute,comparator:e.search_type??e.comparator,value:e.search_value??e.value}}async function Cj(e,t,r,n,s){let i=[{attribute:"metric",comparator:"equals",value:e}];s&&i.push(...s.map(Nj));let a=t??[];Ij(a,"id")||a.push("id"),r&&i.push({attribute:"id",comparator:"greater_than_equal",value:r}),n&&i.push({attribute:"id",comparator:"less_than",value:n});let c={conditions:i,allowConditionsOnDynamicAttributes:!0};return a.length>0&&(c.select=a),Jh.trace?.("get_analytics hdb_analytics.search request:",JSON.stringify(c)),(await databases.system.hdb_analytics.search(c)).map(async u=>{let d=u.id[1];return u.id=u.id[0],Ij(a,"node")&&(Jh.trace?.(`get_analytics lookup hostname for nodeId: ${d}`),u.node=await KSe(d)),Jh.trace?.("get_analytics result:",JSON.stringify(u)),u})}function iL(e){return Oj(e.metric_types)}async function Oj(e=["builtin"]){let t=[],r=Object.values(Uo);if(e.includes("builtin")&&(t=r),e.includes("custom")){let n=r.map(c=>({attribute:"metric",comparator:"not_equal",value:c})),s={select:["metric"],conditions:n},i=new Set,a=await databases.system.hdb_analytics.search(s);for await(let c of a)i.add(c.metric);t.push(...Array.from(i.values()))}return t}function oL(e){return Pj(e.metric)}async function Pj(e){let t={conditions:[{attribute:"metric",comparator:"equals",value:e}],sort:{attribute:"id",descending:!0},limit:1},r=databases.system.hdb_analytics.search(t),n=[{name:"node",type:"string"}];for await(let s of r){for(let a in s)n.push({name:a,type:typeof s[a]});let i={attributes:n};return Jh.trace?.("describe_metric result:",JSON.stringify(i)),i}return{}}var wj,VSe,Jh,cL=se(()=>{wj=b(Q());mA();pA();({forComponent:VSe}=wj.default),Jh=VSe("analytics").conditional;o(KSe,"lookupHostname");o(Ij,"isSelected");o(sL,"getOp");o(Nj,"conformCondition");o(Cj,"get");o(iL,"listMetricsOp");o(Oj,"listMetrics");o(oL,"describeMetricOp");o(Pj,"describeMetric")});var By,Fy,Xh,ky=se(()=>{By={primary:{allowedValues:null},maintenance:{allowedValues:null},availability:{allowedValues:["Available","Unavailable"]}},Fy=Object.keys(By),Xh="primary"});function Dj(e){return Lj.validateBySchema(e,jSe)}var Zh,Lj,YSe,WSe,zSe,jSe,Mj=se(()=>{Zh=b(require("joi")),Lj=b(mt());ky();YSe=Fy,WSe=Object.entries(By).reduce((e,[t,r])=>(r.allowedValues&&(e[t]=`Status "${t}" only accepts these values: ${r.allowedValues.join(", ")}`),e),{}),zSe=o(()=>{let e=Zh.default.string().min(1).max(512);return Object.entries(By).forEach(([t,r])=>{r.allowedValues&&(e=e.when("id",{is:t,then:Zh.default.string().valid(...r.allowedValues).messages({"any.only":WSe[t]})}))}),e.required()},"createStatusValidationSchema"),jSe=Zh.default.object({id:Zh.default.string().valid(...YSe).required(),status:zSe()});o(Dj,"validateStatus")});function vj(){lL||(lL=Ea.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),uL=new Uint8Array(lL))}function Uj(){vj(),uL[0]=1}function xj(){return vj(),uL[0]===1}var lL,uL,dL=se(()=>{eE();o(vj,"ensureInitialized");o(Uj,"requestRestart");o(xj,"restartNeeded")});var EL={};Re(EL,{DEFAULT_STATUS_ID:()=>Xh,STATUS_IDS:()=>Fy,Status:()=>Ea,clear:()=>mL,get:()=>pL,set:()=>hL});function rE(){return fL||(fL=Ze({database:"system",table:"hdb_status",replicate:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"status"},{name:"__createdtime__"},{name:"__updatedtime__"}]})),fL}function mL({id:e}){return tE.debug?.("clearStatus",e),rE().delete(e)}async function JSe(){tE.debug?.("getAllStatus");let e=rE().get({}),t=await yp.query.allThreads(),r=Array.from(t.entries()).map(([s,i])=>({name:s,...i})),n=xj();return{systemStatus:e,componentStatus:r,restartRequired:n}}function pL({id:e}){return e?(tE.debug?.("getStatus",e),rE().get(e)):(tE.debug?.("getStatus","all"),JSe())}function hL({status:e,id:t=Xh}){let r=Dj({status:e,id:t});if(r)throw(0,Hy.handleHDBError)(r,r.message,QSe.BAD_REQUEST);return tE.debug?.("setStatus",t,e),rE().put(t,{status:e})}var Hy,Bj,QSe,fL,Ea,tE,eE=se(()=>{we();Hy=b(_e()),Bj=b(Zn());Mj();ky();Rp();dL();ky();({HTTP_STATUS_CODES:QSe}=Hy.hdbErrors);o(rE,"getStatusTable");Ea={get primaryStore(){return rE().primaryStore}},tE=(0,Bj.loggerWithTag)("status");o(mL,"clearStatus");o(JSe,"getAllStatus");o(pL,"getStatus");o(hL,"setStatus")});var TL={};Re(TL,{getFingerprint:()=>gL,getRegistrationInfo:()=>_L,setLicense:()=>SL});function _L(){return{version:Fj.packageJson.version,deprecated:!0}}function gL(){return{message:"this-is-deprecated",deprecated:!0}}function SL(){return{deprecated:!0}}var Fj,yL=se(()=>{Fj=b(Ct());o(_L,"getRegistrationInfo");o(gL,"getFingerprint");o(SL,"setLicense")});var Hj=v((ake,kj)=>{"use strict";var nE=require("alasql"),ru=require("recursive-iterator"),wi=Q(),XSe=ae(),sE=(q(),M(z)),RL=class{static{o(this,"sqlStatementBucket")}constructor(t){this.ast=t,this.affected_attributes=new Map,this.table_lookup=new Map,this.schema_lookup=new Map,this.table_to_schema_lookup=new Map,eTe(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=>sE.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=>!sE.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,a=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[a]&&t[i].tables[a][sE.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[a].attribute_permissions.length>0?c=ZSe(t[i].tables[a].attribute_permissions):c=global.hdb_schema[i][a].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(a).filter(u=>!sE.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new nE.yy.Column({columnid:u});s.tableid&&(d.tableid=s.tableid),this.ast.columns.push(d),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(a,l)}}),this.ast}};function ZSe(e){return e.filter(t=>t[sE.PERMS_CRUD_ENUM.READ])}o(ZSe,"filterReadRestrictedAttrs");function eTe(e,t,r,n,s){tTe(e,t,r,n,s)}o(eTe,"interpretAST");function iE(e,t,r,n,s){if(!(!e||!e.databaseid)&&(t.has(e.databaseid)||t.set(e.databaseid,new Map),t.get(e.databaseid).has(e.tableid)||t.get(e.databaseid).set(e.tableid,[]),e.as&&(r.has(e.as)||r.set(e.as,e.tableid),n&&!n.has(e.as)&&n.set(e.as,e.databaseid)),s)){let i=e.databaseid,a=e.tableid;e.as&&(a=e.as),s.set(a,i)}}o(iE,"addSchemaTableToMap");function tTe(e,t,r,n,s){if(!e){wi.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof nE.yy.Insert?iTe(e,t,r):e instanceof nE.yy.Select?rTe(e,t,r,n,s):e instanceof nE.yy.Update?nTe(e,t,r):e instanceof nE.yy.Delete?sTe(e,t,r):wi.error("AST in getRecordAttributesAST() is not a valid SQL type.")}o(tTe,"getRecordAttributesAST");function rTe(e,t,r,n,s){if(!e){wi.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(XSe.isEmptyOrZeroLength(i)){wi.error("No schema specified");return}e.from.forEach(c=>{iE(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),iE(c.table,t,r,n,s)});let a=new ru(e.columns);for(let{node:c}of a)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{wi.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 ru(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let d=u.tableid?u.tableid:l;if(!t.get(i).has(d))if(r.has(d))d=r.get(d);else{wi.info(`table specified as ${d} not found.`);continue}t.get(i).get(d).indexOf(u.columnid)<0&&t.get(i).get(d).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new ru(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,f=s.get(d);if(!t.get(f).has(d))if(r.has(d))d=r.get(d);else{wi.info(`table specified as ${d} not found.`);continue}t.get(f).get(d).indexOf(u.columnid)<0&&t.get(f).get(d).push(u.columnid)}}),e.order){let c=new ru(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,d=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(d).has(u))if(r.has(u))u=r.get(u);else{wi.info(`table specified as ${u} not found.`);return}t.get(d).get(u).indexOf(l.columnid)<0&&t.get(d).get(u).push(l.columnid)}}}o(rTe,"getSelectAttributes");function nTe(e,t,r){if(!e){wi.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new ru(e.columns),s=e.table.databaseid;iE(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&bL(e.table.tableid,s,i.columnid,t,r)}o(nTe,"getUpdateAttributes");function sTe(e,t,r){if(!e){wi.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new ru(e.where),s=e.table.databaseid;iE(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&bL(e.table.tableid,s,i.columnid,t,r)}o(sTe,"getDeleteAttributes");function iTe(e,t,r){if(!e){wi.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new ru(e.columns),s=e.into.databaseid;iE(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&bL(e.into.tableid,s,i.columnid,t,r)}o(iTe,"getInsertAttributes");function bL(e,t,r,n,s){if(!n.get(t))return;let i=e;n.get(t).has(i)||(i=s.get(i)),n.get(t).get(i).push(r)}o(bL,"pushAttribute");kj.exports=RL});var Vy=v((lke,n4)=>{"use strict";var AL=Gn(),Gy=hn(),Is=mT(),cE=Ll(),IL=Sl(),oTe=LC(),aTe=r1(),lE=fs(),qy=kp(),Lr=Q(),cTe=xC(),lTe=IT(),uTe=lO(),dTe=NT(),fTe=fO(),mTe=mO(),pTe=EO(),hTe=gO(),wL=DT(),_a=ae(),$j=Cf(),An=(q(),M(z)),Vj=Bz(),ETe=fh(),Kj=(Pd(),M(Kp)),Yj=(Ny(),M(Kh)),Wj=St(),yr=XP(),zj=Uy(),_Te=nL(),Pf=_s(),jj=(ef(),M(Zd)),NL=(cL(),M(aL)),CL=(eE(),M(EL)),Qj=(vh(),M(ay)),OL=(yL(),M(TL)),Jj=JN(),{handleHDBError:zn,hdbErrors:Xj}=_e(),{HDB_ERROR_MSGS:cn,HTTP_STATUS_CODES:oE}=Xj,ee=new Map,Zj="delete",Dc="insert",Js="read",nu="update",aE="describe",Gj=cE.describeSchema.name,qj=cE.describeTable.name,e4={delete:!0,deleteRecord:!0,update:!0,updateData:!0,dropAttribute:!0,dropTable:!0,dropSchema:!0,upsert:!0,upsertData:!0},gTe={insert:!0,delete:!0,deleteRecord:!0,update:!0,updateData:!0,upsert:!0,upsertData:!0},STe="catchup",TTe="handleGetJob",yTe="handleGetJobsByStartDate",$y={CSV_DATA_LOAD:"csvDataLoad",CSV_URL_LOAD:"csvURLLoad",CSV_FILE_LOAD:"csvFileLoad",IMPORT_FROM_S3:"importFromS3"},RTe=[Is.createTable.name,Is.createAttribute.name,Is.dropTable.name,Is.dropAttribute.name],t4={EXPORT_TO_S3:"export_to_s3",EXPORT_LOCAL:"export_local"},re=class{static{o(this,"permission")}constructor(t,r){this.requires_su=t,this.perms=r}};ee.set(AL.insert.name,new re(!1,[Dc]));ee.set(AL.update.name,new re(!1,[nu]));ee.set(AL.upsert.name,new re(!1,[Dc,nu]));ee.set(Gy.searchByConditions.name,new re(!1,[Js]));ee.set(Gy.searchByHash.name,new re(!1,[Js]));ee.set(Gy.searchByValue.name,new re(!1,[Js]));ee.set(Gy.search.name,new re(!1,[Js]));ee.set(Is.createSchema.name,new re(!0,[]));ee.set(Is.createTable.name,new re(!0,[]));ee.set(Is.createAttribute.name,new re(!1,[Dc]));ee.set(Is.dropSchema.name,new re(!0,[]));ee.set(Is.dropTable.name,new re(!0,[]));ee.set(Is.dropAttribute.name,new re(!0,[]));ee.set(cE.describeSchema.name,new re(!1,[Js]));ee.set(cE.describeTable.name,new re(!1,[Js]));ee.set(IL.deleteRecord.name,new re(!1,[Zj]));ee.set(lE.addUser.name,new re(!0,[]));ee.set(lE.alterUser.name,new re(!0,[]));ee.set(lE.dropUser.name,new re(!0,[]));ee.set(lE.listUsersExternal.name,new re(!0,[]));ee.set(qy.listRoles.name,new re(!0,[]));ee.set(qy.addRole.name,new re(!0,[]));ee.set(qy.alterRole.name,new re(!0,[]));ee.set(qy.dropRole.name,new re(!0,[]));ee.set(cTe.name,new re(!0,[]));ee.set(lTe.name,new re(!0,[]));ee.set(uTe.name,new re(!0,[]));ee.set(dTe.name,new re(!0,[]));ee.set(fTe.name,new re(!0,[]));ee.set(mTe.name,new re(!0,[]));ee.set(wL.setRoutes.name,new re(!0,[]));ee.set(wL.getRoutes.name,new re(!0,[]));ee.set(wL.deleteRoutes.name,new re(!0,[]));ee.set(Wj.setConfiguration.name,new re(!0,[]));ee.set(pTe.clusterStatus.name,new re(!0,[]));ee.set(hTe.name,new re(!0,[]));ee.set(IL.deleteFilesBefore.name,new re(!0,[]));ee.set(IL.deleteAuditLogsBefore.name,new re(!0,[]));ee.set($j.restart.name,new re(!0,[]));ee.set($j.restartService.name,new re(!0,[]));ee.set(oTe.name,new re(!0,[]));ee.set(aTe.name,new re(!0,[Js]));ee.set(Is.cleanupOrphanBlobs.name,new re(!0,[]));ee.set(ETe.systemInformation.name,new re(!0,[]));ee.set(Wj.getConfiguration.name,new re(!0,[]));ee.set(zj.readTransactionLog.name,new re(!0,[]));ee.set(zj.deleteTransactionLogsBefore.name,new re(!0,[]));ee.set(_Te.installModules.name,new re(!0,[]));ee.set(Pf.createCsr.name,new re(!0,[]));ee.set(Pf.signCertificate.name,new re(!0,[]));ee.set(Pf.listCertificates.name,new re(!0,[]));ee.set(Pf.addCertificate.name,new re(!0,[]));ee.set(Pf.removeCertificate.name,new re(!0,[]));ee.set(Pf.getKey.name,new re(!0,[]));ee.set(jj.addNodeBack.name,new re(!0,[]));ee.set(jj.removeNodeBack.name,new re(!0,[]));ee.set(NL.getOp.name,new re(!1,[Js]));ee.set(NL.listMetricsOp.name,new re(!1,[Js]));ee.set(NL.describeMetricOp.name,new re(!1,[Js]));ee.set(CL.clear.name,new re(!0,[]));ee.set(CL.get.name,new re(!0,[]));ee.set(CL.set.name,new re(!0,[]));ee.set(Qj.installUsageLicenseOp.name,new re(!0,[]));ee.set(Qj.getUsageLicensesOp.name,new re(!0,[]));ee.set(OL.getFingerprint.name,new re(!0,[]));ee.set(OL.setLicense.name,new re(!0,[]));ee.set(Kj.createTokens.name,new re(!1,[]));ee.set(Kj.refreshOperationToken.name,new re(!1,[]));ee.set(Yj.login.name,new re(!1,[]));ee.set(Yj.logout.name,new re(!1,[]));ee.set(yr.customFunctionsStatus.name,new re(!0,[]));ee.set(yr.getCustomFunctions.name,new re(!0,[]));ee.set(yr.getComponents.name,new re(!0,[]));ee.set(yr.getComponentFile.name,new re(!0,[]));ee.set(yr.setComponentFile.name,new re(!0,[]));ee.set(yr.dropComponent.name,new re(!0,[]));ee.set(yr.getCustomFunction.name,new re(!0,[]));ee.set(yr.setCustomFunction.name,new re(!0,[]));ee.set(yr.dropCustomFunction.name,new re(!0,[]));ee.set(yr.addComponent.name,new re(!0,[]));ee.set(yr.dropCustomFunctionProject.name,new re(!0,[]));ee.set(yr.packageComponent.name,new re(!0,[]));ee.set(yr.deployComponent.name,new re(!0,[]));ee.set(yr.addSSHKey.name,new re(!0,[]));ee.set(yr.updateSSHKey.name,new re(!0,[]));ee.set(yr.deleteSSHKey.name,new re(!0,[]));ee.set(yr.listSSHKeys.name,new re(!0,[]));ee.set(yr.setSSHKnownHosts.name,new re(!0,[]));ee.set(yr.getSSHKnownHosts.name,new re(!0,[]));ee.set(OL.getRegistrationInfo.name,new re(!1,[]));ee.set(lE.userInfo.name,new re(!1,[]));ee.set(cE.describeAll.name,new re(!1,[]));ee.set(TTe,new re(!1,[]));ee.set(yTe,new re(!0,[]));ee.set(STe,new re(!0,[]));ee.set($y.CSV_DATA_LOAD,new re(!1,[Dc,nu]));ee.set($y.CSV_URL_LOAD,new re(!1,[Dc,nu]));ee.set($y.CSV_FILE_LOAD,new re(!1,[Dc,nu]));ee.set($y.IMPORT_FROM_S3,new re(!1,[Dc,nu]));ee.set(t4.EXPORT_TO_S3,new re(!0,[]));ee.set(t4.EXPORT_LOCAL,new re(!0,[]));ee.set(An.VALID_SQL_OPS_ENUM.DELETE,new re(!1,[Zj]));ee.set(An.VALID_SQL_OPS_ENUM.SELECT,new re(!1,[Js]));ee.set(An.VALID_SQL_OPS_ENUM.INSERT,new re(!1,[Dc]));ee.set(An.VALID_SQL_OPS_ENUM.UPDATE,new re(!1,[nu]));n4.exports={verifyPerms:ATe,verifyPermsAst:bTe,verifyBulkLoadAttributePerms:wTe};function bTe(e,t,r){if(_a.isEmptyOrZeroLength(e))throw Lr.info("verify_perms_ast has an empty user parameter"),zn(new Error);if(_a.isEmptyOrZeroLength(t))throw Lr.info("verify_perms_ast has an empty user parameter"),zn(new Error);if(_a.isEmptyOrZeroLength(r))throw Lr.info("verify_perms_ast has a null operation parameter"),zn(new Error);try{let n=Hj(),s=require("alasql"),i=new Jj,a=new n(e),c=a.getSchemas(),l=new Map;if((!c||c.length===0)&&a.affected_attributes&&a.affected_attributes.size>0)throw Lr.info("No schemas defined in verifyPermsAst(), will not continue."),zn(new Error);let u=!!t.role.permission.super_user,d=c.includes("system");if(d&&e4[r])throw zn(new Error,cn.DROP_SYSTEM,oE.FORBIDDEN);if(u&&!d)return null;let f=Vj.getRolePermissions(t.role);t.role.permission=f,!u&&e instanceof s.yy.Select&&(e=a.updateAttributeWildcardsForRolePerms(f));for(let p=0;p<c.length;p++){let h=a.getTablesBySchemaName(c[p]);h&&l.set(c[p],h)}let m=r4(t,r,l,i);return m||(l.forEach((p,h)=>{for(let E=0;E<p.length;E++){let g=a.getAttributesBySchemaTableName(h,p[E]),R=LL(t.role.permission,h,p[E]);PL(g,R,r,p[E],h,i)}}),i.getPermsResponse())}catch(n){throw zn(n)}}o(bTe,"verifyPermsAst");function ATe(e,t){if(e===null||t===null||e.hdb_user===void 0||e.hdb_user===null)throw Lr.info("null required parameter in verifyPerms"),zn(new Error,cn.DEFAULT_INVALID_REQUEST,oE.BAD_REQUEST);let r;t instanceof Function?r=t.name:r=t;let n=e.action,s=e.schema??e.database,i=e.table,a=new Map;s&&i&&a.set(s,[i]);let c=new Jj;if(_a.isEmptyOrZeroLength(e.hdb_user?.role)||_a.isEmptyOrZeroLength(e.hdb_user?.role?.permission))return Lr.info(`User ${e.hdb_user?.username} has no role or permissions. Please assign the user a valid role.`),c.handleUnauthorizedItem(cn.USER_HAS_NO_PERMS(e.hdb_user?.username));let l=!!e.hdb_user?.role?.permission?.super_user,u=e.hdb_user?.role?.permission?.structure_user,d=a.has(An.SYSTEM_SCHEMA_NAME)||s===An.SYSTEM_SCHEMA_NAME;if(l&&d&&gTe[e.operation]&&(i===An.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME||i===An.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||i===An.SYSTEM_TABLE_NAMES.USER_TABLE_NAME))return null;if(d&&e4[r])throw zn(new Error,cn.DROP_SYSTEM,oE.FORBIDDEN);if(l&&!d||u===!0&&(r===Is.createSchema.name||r===Is.dropSchema.name))return null;if(RTe.indexOf(r)>=0&&(u===!0||Array.isArray(u)))return u===!0||u.indexOf(s)>=0?null:c.handleUnauthorizedItem(`User does not have access to perform '${e.operation}' against schema '${s}'`);let f=Vj.getRolePermissions(e.hdb_user?.role);if(e.hdb_user?.role&&(e.hdb_user.role.permission=f),(r===Gj||r===qj)&&!f.super_user){if(s===An.SYSTEM_SCHEMA_NAME)return c.handleUnauthorizedItem(cn.SCHEMA_PERM_ERROR(s));if(r===Gj&&(!f[s]||!f[s][aE]))return c.handleInvalidItem(cn.SCHEMA_NOT_FOUND(s));if(r===qj&&(!f[s]||!f[s].tables[i]||!f[s].tables[i][aE]))return c.handleInvalidItem(cn.TABLE_NOT_FOUND(s,i))}let m=r4(e.hdb_user,r,a,c,n);if(m)return m;if(ee.get(r)&&ee.get(r).perms.length===0)return null;if(!l&&e.get_attributes&&An.SEARCH_WILDCARDS.includes(e.get_attributes[0])){let E=[],g=f[s].tables[i];g[An.PERMS_CRUD_ENUM.READ]&&(g.attribute_permissions.length>0?g.attribute_permissions.filter(S=>S[An.PERMS_CRUD_ENUM.READ]).forEach(S=>{E.push(S.attribute_name)}):E=global.hdb_schema[s][i].attributes.map(R=>R.attribute),e.get_attributes=E)}let p=ITe(e),h=LL(e.hdb_user?.role?.permission,s,i);return PL(p,h,r,i,s,c,n),c.getPermsResponse()}o(ATe,"verifyPerms");function r4(e,t,r,n,s){if(_a.arrayHasEmptyValues([e,t,r]))throw Lr.info("hasPermissions has an invalid parameter"),zn(new Error);let i=r.has("system"),a=e.role.permission;if(a.super_user&&(!i||ee.get(t).requires_su))return null;if(!ee.get(t))throw Lr.info(`operation ${t} not found.`),zn(new Error,cn.OP_NOT_FOUND(t),oE.BAD_REQUEST);if(ee.get(t)&&ee.get(t).requires_su)return Lr.info(`operation ${t} requires SU permissions.`),n.handleUnauthorizedItem(cn.OP_IS_SU_ONLY(t));let c=r.keys();for(let l of c){try{if(l&&!a[l]||a[l][aE]===!1){n.addInvalidItem(cn.SCHEMA_NOT_FOUND(l));continue}}catch{n.addInvalidItem(cn.SCHEMA_NOT_FOUND(l));continue}let u=r.get(l);for(let d of u){let f=a[l].tables[d];if(!f||f[aE]===!1)n.addInvalidItem(cn.TABLE_NOT_FOUND(l,d));else try{let m=[],p=ee.get(t).perms;!_a.isEmpty(s)&&p.includes(s)&&(p=[s]);for(let h=0;h<p.length;h++){let E=p[h],g=f[E];(g==null||g===!1)&&(Lr.info(`Required ${E} permission not found for ${t} ${s?`${s} `:""}operation in role ${e.role.id}`),m.push(E))}m.length>0&&n.addUnauthorizedTable(l,d,m)}catch(m){let p=cn.UNKNOWN_OP_AUTH_ERROR(t,l,d);throw Lr.error(p),Lr.error(m),zn(Xj.CHECK_LOGS_WRAPPER(p))}}}return r.size<2?n.getPermsResponse():null}o(r4,"hasPermissions");function PL(e,t,r,n,s,i,a){if(!e||!t)throw Lr.info("no attributes specified in checkAttributePerms."),zn(new Error);let c=ee.get(r).perms;if(!c||c==="")throw Lr.info(`no permissions found for ${r} in checkAttributePerms().`),zn(new Error);if(_a.isEmptyOrZeroLength(t))return Lr.info("No role permissions set (this is OK)."),null;a&&c.includes(a)&&(c=[a]);let l={};for(let d of e){let f=t.get(d);if(f){if(f[aE]===!1){i.addInvalidItem(cn.ATTR_NOT_FOUND(s,n,d),s,n);continue}if(c)for(let m of c){if(An.TIME_STAMP_NAMES.includes(f.attribute_name)&&m!==Js)throw zn(new Error,cn.SYSTEM_TIMESTAMP_PERMS_ERR,oE.FORBIDDEN);f[m]===!1&&(l[f.attribute_name]?l[f.attribute_name].push(m):l[f.attribute_name]=[m])}}else i.addInvalidItem(cn.ATTR_NOT_FOUND(s,n,d),s,n)}let u=Object.keys(l);u.length>0&&i.addUnauthorizedAttributes(u,s,n,l)}o(PL,"checkAttributePerms");function ITe(e){let t=new Set;try{if(e.action)return t;if(e.operation===An.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS&&e.conditions.forEach(r=>{let n=r.attribute;r.search_attribute!==void 0&&(n=r.search_attribute),t.add(n)}),e&&(e.attribute||e.search_attribute)){let r=e.attribute;e.search_attribute!==void 0&&(r=e.search_attribute),t.add(r)}if(!e.records||e.records.length===0){if(!e.get_attributes||e.get_attributes.length===0)return t;for(let r of e.get_attributes)t.add(r)}else for(let r of e.records){let n=Object.keys(r);for(let s of n)t.add(s)}}catch(r){Lr.info(r)}return t}o(ITe,"getRecordAttributes");function LL(e,t,r){let n=new Map;if(_a.isEmpty(e))return Lr.info("no hdb_user specified in getAttributePermissions"),n;if(e.super_user||!t||!r)return n;try{e[t].tables[r].attribute_permissions.forEach(s=>{n.has(s.attribute_name)||n.set(s.attribute_name,s)})}catch{Lr.info(`No attribute permissions found for schema ${t} and table ${r}.`)}return n}o(LL,"getAttributePermissions");function wTe(e,t,r,n,s,i,a){let c=new Set(i),l=LL(e,n,s);PL(c,l,t,s,n,a,r)}o(wTe,"verifyBulkLoadAttributePerms")});var ML=v((dke,s4)=>{"use strict";var DL=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};s4.exports=DL});var kL=v((_ke,y4)=>{"use strict";var Ky=Gn(),Wy=$N(),NTe=require("needle"),Ni=(q(),M(z)),mke=Ot(),Lf=ae(),{handleHDBError:Zt,hdbErrors:m4}=_e(),{HTTP_STATUS_CODES:ln,HDB_ERROR_MSGS:Dr,CHECK_LOGS_WRAPPER:iu}=m4,Df=Q(),vL=require("papaparse");Lf.promisifyPapaParse();var Ci=require("fs-extra"),CTe=require("path"),{chain:i4}=require("stream-chain"),o4=require("stream-json/streamers/StreamArray"),a4=require("stream-json/utils/Batch"),c4=require("stream-chain/utils/comp"),{finished:l4}=require("stream"),OTe=me(),p4=VN(),PTe=KN(),{BulkLoadFileObject:xL,BulkLoadDataObject:LTe}=e$(),BL=JN(),{verifyBulkLoadAttributePerms:h4}=Vy(),pke=ML(),hke=_r(),Eke=Xi(),{databases:DTe}=(we(),M(ft)),{coerceType:MTe}=(tg(),M(AG)),u4="No records parsed from csv file.",su=`${OTe.get("HDB_ROOT")}/tmp`,{schemaRegex:vTe}=Ki(),d4=1024*1024*2,f4=5e3,UTe={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};y4.exports={csvDataLoad:xTe,csvURLLoad:BTe,csvFileLoad:FTe,importFromS3:kTe};async function xTe(e,t){let r=Wy.dataObject(e);if(r)throw Zt(r,r.message,ln.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=g4(e.schema,e.table),i=vL.parse(e.data,{header:!0,skipEmptyLines:!0,transform:UL.bind(null,s),dynamicTyping:!1}),a=new BL;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&h4(e.hdb_user?.role?.permission,this.job_operation_function.name,e.action,e.schema,e.table,i.meta.fields,a);let c=a.getPermsResponse();if(c)throw Zt(new Error,c,ln.BAD_REQUEST,void 0,void 0,!0);let l=new LTe(e.action,e.schema,e.table,i.data);return n=await p4.callOperationFunctionAsAwait(S4,l,null),n.message===u4?u4:T4(n.records,n.number_written)}catch(s){throw ou(s)}}o(xTe,"csvDataLoad");async function BTe(e){let t=Wy.urlObject(e);if(t)throw Zt(t,t.message,ln.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${su}/${r}`;try{await HTe(e,r)}catch(s){throw Df.error(Dr.DOWNLOAD_FILE_ERR(r)+" - "+s),Zt(s,iu(Dr.DOWNLOAD_FILE_ERR(r)))}try{let s=new xL(this.job_operation_function.name,e.action,e.schema,e.table,n,Ni.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await FL(s);return await Yy(n),i}catch(s){throw await Yy(n),ou(s)}}o(BTe,"csvURLLoad");async function FTe(e){let t=Wy.fileObject(e);if(t)throw Zt(t,t.message,ln.BAD_REQUEST,void 0,void 0,!0);let r=new xL(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Ni.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await FL(r)}catch(n){throw ou(n)}}o(FTe,"csvFileLoad");async function kTe(e){let t=Wy.s3FileObject(e);if(t)throw Zt(t,t.message,ln.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=CTe.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${su}/${s}`;let i=new xL(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await GTe(s,e);let a=await FL(i);return await Yy(r),a}catch(n){throw await Yy(r),ou(n)}}o(kTe,"importFromS3");async function HTe(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await NTe("get",e.csv_url,n)}catch(n){let s=`Error downloading CSV file from ${e.csv_url}, status code: ${n.statusCode}. Check the log for more information.`;throw Zt(n,s,n.statusCode,Ni.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}$Te(r,e.csv_url),await qTe(t,r.raw)}o(HTe,"downloadCSVFile");async function GTe(e,t){try{let r=`${su}/${e}`;await Ci.mkdirp(su),await Ci.writeFile(`${su}/${e}`,"",{flag:"a+"});let n=await Ci.createWriteStream(r),s=await PTe.getFileStreamFromS3(t);await new Promise((i,a)=>{s.on("error",function(c){a(c)}),s.pipe(n).on("error",function(c){a(c)}).on("close",function(){Df.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw Df.error(Dr.S3_DOWNLOAD_ERR+" - "+r),Zt(r,iu(Dr.S3_DOWNLOAD_ERR))}}o(GTe,"downloadFileFromS3");async function qTe(e,t){try{await Ci.mkdirp(su),await Ci.writeFile(`${su}/${e}`,t)}catch(r){throw Df.error(Dr.WRITE_TEMP_FILE_ERR),Zt(r,iu(Dr.DEFAULT_BULK_LOAD_ERR))}}o(qTe,"writeFileToTempFolder");async function Yy(e){if(e)try{await Ci.access(e),await Ci.unlink(e)}catch{Df.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(Yy,"deleteTempFile");function $Te(e,t){if(e.statusCode!==m4.HTTP_STATUS_CODES.OK)throw Zt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,ln.BAD_REQUEST);if(!UTe[e.headers["content-type"]])throw Zt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,ln.BAD_REQUEST);if(!e.raw)throw Zt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,ln.BAD_REQUEST)}o($Te,"validateURLResponse");async function FL(e){try{let t;switch(e.file_type){case Ni.VALID_S3_FILE_TYPES.CSV:t=await VTe(e);break;case Ni.VALID_S3_FILE_TYPES.JSON:t=await KTe(e);break;default:throw Zt(new Error,Dr.DEFAULT_BULK_LOAD_ERR,ln.BAD_REQUEST,Ni.LOG_LEVELS.ERROR,Dr.INVALID_FILE_EXT_ERR(e))}return T4(t.records,t.number_written)}catch(t){throw ou(t)}}o(FL,"fileLoad");async function E4(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;s&&s.pause();let a={operation:e.action,schema:e.schema,table:e.table,records:i};try{let{attributes:c}=await Ky.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&h4(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=Zt(c);r(l)}}o(E4,"validateChunk");async function _4(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;Lf.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!Lf.isEmpty(c)&&!Lf.isEmpty(c.__parsed_extra)&&delete c.__parsed_extra});else{let c=new Set;i.forEach(l=>{Object.keys(l).forEach(u=>c.add(u))}),a=[...c]}try{let c={schema:e.schema,table:e.table,action:e.action,data:i},l=await p4.callOperationFunctionAsAwait(S4,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=Zt(c,iu(Dr.INSERT_CSV_ERR),ln.INTERNAL_SERVER_ERROR,Ni.LOG_LEVELS.ERROR,Dr.INSERT_CSV_ERR+" - "+c);r(l)}}o(_4,"insertChunk");async function VTe(e){let t={records:0,number_written:0},r=g4(e.schema,e.table);try{let n=new BL,s=Ci.createReadStream(e.file_path,{highWaterMark:d4});s.setEncoding("utf8"),await vL.parsePromise(s,E4.bind(null,e,n),UL.bind(null,r));let i=n.getPermsResponse();if(i)throw Zt(new Error,i,ln.BAD_REQUEST);return s=Ci.createReadStream(e.file_path,{highWaterMark:d4}),s.setEncoding("utf8"),await vL.parsePromise(s,_4.bind(null,e,t),UL.bind(null,r)),s.destroy(),t}catch(n){throw Zt(n,iu(Dr.PAPA_PARSE_ERR),ln.INTERNAL_SERVER_ERROR,Ni.LOG_LEVELS.ERROR,Dr.PAPA_PARSE_ERR+n)}}o(VTe,"callPapaParse");function g4(e,t){let r=DTe[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>MTe(i,s));return n}o(g4,"createTransformMap");function UL(e,t,r){let n=e.get(r);return n?n(t):Lf.autoCast(t)}o(UL,"typeFunction");async function KTe(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new BL,s=i4([Ci.createReadStream(e.file_path,{encoding:"utf-8"}),o4.withParser(),c=>c.value,new a4({batchSize:f4}),c4(async c=>{await E4(e,n,r,c)})]);await new Promise((c,l)=>{l4(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw Zt(new Error,i,ln.BAD_REQUEST);let a=i4([Ci.createReadStream(e.file_path,{encoding:"utf-8"}),o4.withParser(),c=>c.value,new a4({batchSize:f4}),c4(async c=>{await _4(e,t,r,c)})]);return await new Promise((c,l)=>{l4(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw Zt(n,iu(Dr.INSERT_JSON_ERR),ln.INTERNAL_SERVER_ERROR,Ni.LOG_LEVELS.ERROR,Dr.INSERT_JSON_ERR+n)}}o(KTe,"insertJson");async function S4(e){let t={};try{e.data&&e.data.length>0&&YTe(e.data[0])?t=await WTe(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",Df.info(t.message))}catch(r){throw ou(r)}return t}o(S4,"callBulkFileLoad");function YTe(e){let t=Object.keys(e);for(let r of t)if(!vTe.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(YTe,"validateColumnNames");async function WTe(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=Ky.insert;break;case"update":i=Ky.update;break;case"upsert":i=Ky.upsert;break;default:throw Zt(new Error,Dr.INVALID_ACTION_PARAM_ERR(n),ln.BAD_REQUEST,Ni.LOG_LEVELS.ERROR,Dr.INVALID_ACTION_PARAM_ERR(n))}try{let a=await i(s),c;switch(n){case"insert":c=a.inserted_hashes;break;case"update":c=a.update_hashes;break;case"upsert":c=a.upserted_hashes;break;default:break}if(Array.isArray(a.skipped_hashes)&&a.skipped_hashes.length>0){let d=global.hdb_schema[t][r].hash_attribute,f=e.length;for(;f--;)a.skipped_hashes.indexOf(e[f][d])>=0&&e.splice(f,1)}let l=Lf.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw ou(a)}}o(WTe,"bulkFileLoad");function T4(e,t){return`successfully loaded ${t} of ${e} records`}o(T4,"buildResponseMsg");function ou(e){return Zt(e,iu(Dr.DEFAULT_BULK_LOAD_ERR),ln.INTERNAL_SERVER_ERROR,Ni.LOG_LEVELS.ERROR,Dr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(ou,"buildTopLevelErrMsg")});var zy=v((Ske,R4)=>{"use strict";var zTe=cs();R4.exports={writeTransaction:jTe};function jTe(e,t,r){return zTe.writeTransaction(e,t,r)}o(jTe,"writeTransaction")});var w4=v((Rke,I4)=>{"use strict";var QTe=hn(),JTe=Qi(),b4=Q(),XTe=Gn(),yke=zy(),ZTe=require("clone"),GL=require("alasql"),eye=Mg(),A4=require("util"),tye=A4.promisify(JTe.getTableSchema),rye=A4.promisify(QTe.search),nye=(q(),M(z)),HL=ae();eye(GL);I4.exports={update:iye};var sye="There was a problem performing this update. Please check the logs and try again.";async function iye({statement:e,hdb_user:t}){let r=await tye(e.table.databaseid,e.table.tableid),n=oye(e.columns);HL.backtickASTSchemaItems(e);let{table:s,where:i}=e,a=ZTe(s),c=HL.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=GL.parse(l).statements[0],d=await rye(u),f=aye(n,d);return cye(a,f,t)}o(iye,"update");function oye(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=GL.compile(`SELECT ${r.expression.toString()} AS [${nye.FUNC_VAL}] FROM ?`)}),t}catch(t){throw b4.error(t),new Error(sye)}}o(oye,"createUpdateRecord");function aye(e,t){return HL.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}o(aye,"buildUpdateRecords");async function cye(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await XTe.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){b4.error(`Error delete new_attributes from update response: ${i}`)}return s}o(cye,"updateRecords")});var C4=v((wke,N4)=>{var lye=require("alasql"),uye=hn(),dye=Q(),fye=cs(),$L=require("util"),qL=ae(),mye=(q(),M(z)),pye=Qi(),Ake=zy(),Ike=Gn(),hye="record",Eye="successfully deleted",_ye=$L.callbackify(yye),gye=$L.promisify(uye.search),Sye=$L.promisify(pye.getTableSchema);N4.exports={convertDelete:_ye};function Tye(e){return`${e.deleted_hashes.length} ${hye}${e.deleted_hashes.length===1?"":"s"} ${Eye}`}o(Tye,"generateReturnMessage");async function yye({statement:e,hdb_user:t}){let r=await Sye(e.table.databaseid,e.table.tableid);qL.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=qL.isEmpty(s)?"":` WHERE ${s.toString()}`,a=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=lye.parse(a).statements[0],l={operation:mye.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await gye(c);let u=await fye.deleteRecords(l);return qL.isEmptyOrZeroLength(u.message)&&(u.message=Tye(u)),delete u.txn_time,u}catch(u){throw dye.error(u),u.hdb_code?u.message:u}}o(yye,"convertDelete")});var dE=v((Cke,M4)=>{"use strict";M4.exports={evaluateSQL:vye,processAST:D4,convertSQLToAST:L4,checkASTPermissions:P4};var Rye=Gn(),O4=require("util"),bye=O4.callbackify(Rye.insert),Aye=hn().search,Iye=w4().update,wye=O4.callbackify(Iye),Nye=C4().convertDelete,Mc=require("alasql"),Cye=Vy(),jy=Q(),Oye=Mg(),Pye=ae(),uE=(q(),M(z)),{hdbErrors:Lye,handleHDBError:VL}=_e(),{HTTP_STATUS_CODES:KL}=Lye;Oye(Mc);var Dye=403,Mye="There was a problem performing this insert. Please check the logs and try again.",YL=class{static{o(this,"ParsedSQLObject")}constructor(){this.ast=void 0,this.variant=void 0,this.permissions_checked=!1}};function vye(e,t){let r=e.parsed_sql_object;if(!r){r=L4(e.sql);let n,s=r.ast.statements[0];if(s instanceof Mc.yy.Insert?n=s.into.databaseid:s instanceof Mc.yy.Select?n=s.from?s.from[0].databaseid:null:s instanceof Mc.yy.Update||s instanceof Mc.yy.Delete?n=s.table.databaseid:jy.error("AST in evaluateSQL is not a valid SQL type."),!(s instanceof Mc.yy.Select)&&Pye.isEmptyOrZeroLength(n))return t("No schema specified",null)}D4(e,r,(n,s)=>{if(n)return t(n);t(null,s)})}o(vye,"evaluateSQL");function P4(e,t){let r;try{r=Cye.verifyPermsAst(t.ast.statements[0],e.hdb_user,t.variant),t.permissions_checked=!0}catch(n){throw n}return r||null}o(P4,"checkASTPermissions");function L4(e){let t=new YL;if(!e)throw VL(new Error,"The 'sql' parameter is missing from the request body",KL.BAD_REQUEST);try{let r=e.trim(),n=Mc.parse(r),s=r.split(" ")[0].toLowerCase();t.ast=n,t.variant=s}catch(r){let n=r.message.split(`
132
132
  `);throw n[1]?VL(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,KL.BAD_REQUEST):VL(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",KL.BAD_REQUEST)}return t}o(L4,"convertSQLToAST");function D4(e,t,r){try{let n=Uye;if(!e.bypass_auth&&!t.permissions_checked){let i=P4(e,t);if(i&&i.length>0)return r(Dye,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case uE.VALID_SQL_OPS_ENUM.SELECT:n=Aye,s=t.ast.statements[0];break;case uE.VALID_SQL_OPS_ENUM.INSERT:n=xye;break;case uE.VALID_SQL_OPS_ENUM.UPDATE:n=wye;break;case uE.VALID_SQL_OPS_ENUM.DELETE:n=Nye;break;default:throw new Error(`unsupported SQL type ${t.variant} in SQL: ${e}`)}n(s,(i,a)=>{if(i){r(i);return}r(null,a)})}catch(n){return r(n)}}o(D4,"processAST");function Uye(e,t){jy.info(e),t("unknown sql statement")}o(Uye,"nullFunction");function xye({statement:e,hdb_user:t},r){let n=e.into,s={schema:n.databaseid,table:n.tableid,operation:"insert",hdb_user:t},i=e.columns.map(a=>a.columnid);try{s.records=Bye(i,e.values)}catch(a){return r(a)}bye(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){jy.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(xye,"convertInsert");function Bye(e,t){try{return t.map(r=>{if(e.length!==r.length)throw"number of values do not match number of columns in insert";let n={};return r.forEach((s,i)=>{if(s.columnid)throw"cannot use a column in insert value";"value"in s?n[e[i]]=s.value:n[e[i]]=Mc.compile(`SELECT ${s.toString()} AS [${uE.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw jy.error(r),new Error(Mye)}}o(Bye,"createDataObjects")});var jL=v((Pke,G4)=>{"use strict";var zL=hn(),Fye=KN(),{AsyncParser:kye}=require("json2csv"),Qy=require("stream"),ws=ae(),WL=require("fs-extra"),Hye=require("path"),Xs=Q(),{promisify:x4}=require("util"),fE=ae(),{handleHDBError:Rr,hdbErrors:Gye}=_e(),{HDB_ERROR_MSGS:jn,HTTP_STATUS_CODES:br}=Gye,{streamAsJSON:qye}=(Gb(),M(hU)),{Upload:$ye}=require("@aws-sdk/lib-storage"),{toCsvStream:Vye}=(Do(),M(IU)),v4=["search_by_value","search_by_hash","sql","search_by_conditions"],U4=["json","csv"],B4="json",F4="csv",Kye="Successfully exported JSON locally.",Yye="Successfully exported CSV locally.",Wye=1e3,zye=zL.searchByHash,jye=zL.searchByValue,Qye=x4(Qy.finished);G4.exports={export_to_s3:eRe,export_local:Jye};async function Jye(e){Xs.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=k4(e);if(!ws.isEmpty(t))throw Xs.error(t),Rr(new Error,t,br.BAD_REQUEST,void 0,void 0,!0);if(ws.isEmpty(e.path))throw Xs.error(jn.MISSING_VALUE("path")),Rr(new Error,jn.MISSING_VALUE("path"),br.BAD_REQUEST,void 0,void 0,!0);let r=(ws.isEmpty(e.filename)?new Date().getTime():e.filename)+"."+e.format;e.path.endsWith(Hye.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=ws.buildFolderPath(e.path,r);await Xye(e.path);let s=await H4(e);return await Zye(n,e.format,s)}o(Jye,"export_local");async function Xye(e){if(Xs.trace("in confirmPath"),ws.isEmptyOrZeroLength(e))throw Rr(new Error,`Invalid path: ${e}`,br.BAD_REQUEST,void 0,void 0,!0);let t;try{t=await WL.stat(e)}catch(r){let n;throw r.code==="ENOENT"?n=`path '${directory_path}' does not exist`:r.code==="EACCES"?n=`access to path '${directory_path}' is denied`:n=r.message,Xs.error(n),Rr(new Error,n,br.BAD_REQUEST,void 0,void 0,!0)}if(!t.isDirectory()){let r=`path '${directory_path}' is not a directory, please supply a valid folder path`;throw Xs.error(r),Rr(new Error,r,br.BAD_REQUEST,void 0,void 0,!0)}return!0}o(Xye,"confirmPath");async function Zye(e,t,r){if(Xs.trace("in saveToLocal"),fE.isEmptyOrZeroLength(e))throw Rr(new Error,jn.INVALID_VALUE("file_path"),br.BAD_REQUEST,void 0,void 0,!0);if(fE.isEmptyOrZeroLength(t))throw Rr(new Error,jn.INVALID_VALUE("Source format"),br.BAD_REQUEST,void 0,void 0,!0);if(fE.isEmpty(r))throw Rr(new Error,jn.NOT_FOUND("Data"),br.BAD_REQUEST,void 0,void 0,!0);if(t===B4){let n=WL.createWriteStream(e);return qye(r).pipe(n),await Qye(n),{message:Kye,path:e}}else if(t===F4){let n=WL.createWriteStream(e),s=Qy.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new kye(i,c).fromInput(s).toOutput(n).promise(!1),{message:Yye,path:e}}throw Rr(new Error,jn.INVALID_VALUE("format"),br.BAD_REQUEST)}o(Zye,"saveToLocal");async function eRe(e){if(!e.s3||Object.keys(e.s3).length===0)throw Rr(new Error,jn.MISSING_VALUE("S3 object"),br.BAD_REQUEST);if(ws.isEmptyOrZeroLength(e.s3.aws_access_key_id))throw Rr(new Error,jn.MISSING_VALUE("aws_access_key_id"),br.BAD_REQUEST);if(ws.isEmptyOrZeroLength(e.s3.aws_secret_access_key))throw Rr(new Error,jn.MISSING_VALUE("aws_secret_access_key"),br.BAD_REQUEST);if(ws.isEmptyOrZeroLength(e.s3.bucket))throw Rr(new Error,jn.MISSING_VALUE("bucket"),br.BAD_REQUEST);if(ws.isEmptyOrZeroLength(e.s3.key))throw Rr(new Error,jn.MISSING_VALUE("key"),br.BAD_REQUEST);if(ws.isEmptyOrZeroLength(e.s3.region))throw Rr(new Error,jn.MISSING_VALUE("region"),br.BAD_REQUEST);let t=k4(e);if(!ws.isEmpty(t))throw Rr(new Error,t,br.BAD_REQUEST);Xs.trace(`called export_to_s3 to bucket: ${e.s3.bucket} and query ${e.search_operation.sql}`);let r;try{r=await H4(e)}catch(l){throw Xs.error(l),l}let n,s=await Fye.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new Qy.PassThrough;if(e.format===F4){i=e.s3.key+".csv";let l=Vye(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===B4){i=e.s3.key+".json";let l=new Qy.Readable;l.pipe(a),l.on("error",f=>{throw f}),l.push("[");let u=r.length,d="";for(let[f,m]of r.entries()){let p=f===u-1?JSON.stringify(m):JSON.stringify(m)+",";d+=p,f!==0&&f%Wye===0&&(l.push(d),d="")}d.length!==0&&l.push(d),l.push("]"),l.push(null)}else throw Rr(new Error,jn.INVALID_VALUE("format"),br.BAD_REQUEST);return new $ye({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(eRe,"export_to_s3");function k4(e){if(Xs.trace("in exportCoreValidation"),ws.isEmpty(e.format))return"format missing";if(U4.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${U4.join(", ")}`;let t=e.search_operation.operation;if(ws.isEmpty(t))return"search_operation.operation missing";if(v4.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${v4.join(", ")}`}o(k4,"exportCoreValidation");async function H4(e){Xs.trace("in getRecords");let t,r;if(fE.isEmpty(e.search_operation)||fE.isEmptyOrZeroLength(e.search_operation.operation))throw Rr(new Error,jn.INVALID_VALUE("Search operation"),br.BAD_REQUEST);switch(e.search_operation.operation){case"search_by_value":t=jye;break;case"search_by_hash":t=zye;break;case"search_by_conditions":t=zL.searchByConditions;break;case"sql":{let n=dE();t=x4(n.evaluateSQL);break}default:throw r=`Operation ${e.search_operation.operation} is not support by export.`,Xs.error(r),Rr(new Error,r,br.BAD_REQUEST)}return e.search_operation.hdb_user=e.hdb_user,t(e.search_operation)}o(H4,"getRecords")});var $4=v((Dke,q4)=>{"use strict";var QL=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};q4.exports=QL});var Y4=v((vke,K4)=>{"use strict";var tRe=(q(),M(z)),V4=require("moment"),rRe=require("uuid").v4,JL=class{static{o(this,"JobObject")}constructor(){this.id=rRe(),this.type=void 0,this.start_datetime=V4().valueOf(),this.created_datetime=V4().valueOf(),this.end_datetime=void 0,this.status=tRe.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};K4.exports=JL});var ZL=v((xke,eQ)=>{"use strict";var nRe=require("uuid").v4,J4=Gn(),X4=hn(),sRe=ui(),iRe=Zu(),oRe=$4(),Mt=(q(),M(z)),aRe=Y4(),cRe=SS(),Oi=Q(),lRe=pm(),Mf=ae(),{promisify:uRe}=require("util"),au=require("moment"),Jy=$N(),W4=tw(),{deleteTransactionLogsBeforeValidator:dRe}=tL(),{handleHDBError:z4,hdbErrors:fRe,ClientError:mRe}=_e(),{HTTP_STATUS_CODES:j4}=fRe,Q4=X4.searchByValue,pRe=X4.searchByHash,hRe=J4.insert,ERe=J4.update,XL;eQ.exports={addJob:SRe,updateJob:yRe,handleGetJob:_Re,handleGetJobsByStartDate:gRe,getJobById:Z4};async function _Re(e){if(e.id===void 0)throw new mRe("'id' is required");let t=await Z4(e.id);return Mf.isEmptyOrZeroLength(t)||(t[0]={...t[0]},t[0].request!==void 0&&delete t[0].request,delete t[0].__createdtime__,delete t[0].__updatedtime__),t}o(_Re,"handleGetJob");async function gRe(e){try{let t=await TRe(e);if(Oi.trace(`Searching for jobs from ${e.from_date} to ${e.to_date}`),t&&t.length>0)for(let r of t)r.start_datetime&&(r.start_datetime_converted=au(r.start_datetime)),r.end_datetime&&(r.end_datetime_converted=au(r.end_datetime)),r.request!==void 0&&delete r.request,delete r.__createdtime__,delete r.__updatedtime__;return t}catch(t){let r=`There was an error searching jobs by date: ${t}`;throw Oi.error(r),new Error(r)}}o(gRe,"handleGetJobsByStartDate");async function SRe(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||Mf.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return Oi.info(d),t.error=d,t}if(!Mt.JOB_TYPE_ENUM[e.operation])return Oi.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Mt.OPERATIONS_ENUM.CSV_FILE_LOAD:n=Jy.fileObject(e);break;case Mt.OPERATIONS_ENUM.CSV_URL_LOAD:n=Jy.urlObject(e);break;case Mt.OPERATIONS_ENUM.CSV_DATA_LOAD:n=Jy.dataObject(e);break;case Mt.OPERATIONS_ENUM.IMPORT_FROM_S3:n=Jy.s3FileObject(e);break;case Mt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Mt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=W4(e,"date");break;case Mt.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=W4(e,"timestamp");break;case Mt.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=dRe(e);break;case Mt.OPERATIONS_ENUM.RESTART_SERVICE:if(Mt.HDB_PROCESS_SERVICES[e.service]===void 0)throw z4(new Error,"Invalid service",j4.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw z4(n,n.message,j4.BAD_REQUEST,void 0,void 0,!0);let s=new aRe;s.type=e.operation===Mt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE?Mt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:e.operation,s.type=e.operation,s.user=e.hdb_user?.username;let i=new sRe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await Q4(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return Oi.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=nRe();try{a=await Q4(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return Oi.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return Oi.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new lRe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await hRe(l)}catch(d){return Oi.error(`There was an error inserting a job for job type: ${e.operation} -- ${d}`),t.success=!1,t}if(u.inserted_hashes.length===0)t.message=`Had a problem creating a job with type ${s.operation} and id ${s.id}`;else{let d=`Created a job with type ${s.type} and id ${s.id}`;t.message=d,t.createdJob=s,t.success=!0,Oi.trace(d)}return t}o(SRe,"addJob");async function TRe(e){let t=au(e.from_date,au.ISO_8601),r=au(e.to_date,au.ISO_8601);if(!t.isValid())throw new Error("Invalid 'from' date, must be in ISO-8601 format (YYYY-MM-DD).");if(!r.isValid())throw new Error("Invalid 'to' date, must be in ISO-8601 format (YYYY-MM-DD)");let n=`select * from system.hdb_job where start_datetime > '${t.valueOf()}' and start_datetime < '${r.valueOf()}'`,s=new oRe(n,e.hdb_user);try{if(!XL){let i=dE();XL=uRe(i.evaluateSQL)}return await XL(s)}catch(i){throw Oi.error(`there was a problem searching for jobs from date ${e.from_date} to date ${e.to_date} ${i}`),new Error("there was an error searching for jobs. Please check the log for details.")}}o(TRe,"getJobsInDateRange");async function Z4(e){if(Mf.isEmptyOrZeroLength(e))return Mf.errorizeMessage("Invalid job ID specified.");let t=new iRe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await pRe(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return Oi.error(n),Mf.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(Z4,"getJobById");async function yRe(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(Mf.isEmptyOrZeroLength(e.id))throw new Error("invalid ID passed to updateJob");(e.status===Mt.JOB_STATUS_ENUM.COMPLETE||e.status===Mt.JOB_STATUS_ENUM.ERROR)&&(e.end_datetime=au().valueOf());let t=new cRe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await ERe(t),r}o(yRe,"updateJob")});var cQ=v((Fke,aQ)=>{"use strict";var tQ=ae(),Mr=(q(),M(z)),RRe=require("moment"),Xy=kL(),mE=Q(),rQ=ZL(),nQ=jL(),sQ=Sl(),iQ=nt(),bRe=Uy(),ARe=Cf(),{parentPort:IRe,isMainThread:oQ}=require("worker_threads"),{onMessageByType:wRe}=nt(),eD=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function NRe(e){if(!e||Object.keys(e).length===0)throw new Error("Empty runner passed to parseMessage");if(!e.json||Object.keys(e.json).length===0)throw new Error("Empty JSON passed to parseMessage");if(!e.job||Object.keys(e.job).length===0)throw new Error("Empty job passed to parseMessage");if(tQ.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(tQ.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case Mr.JOB_TYPE_ENUM.csv_file_load:await _o(e,Xy.csvFileLoad);break;case Mr.JOB_TYPE_ENUM.csv_url_load:await _o(e,Xy.csvURLLoad);break;case Mr.JOB_TYPE_ENUM.csv_data_load:await _o(e,Xy.csvDataLoad);break;case Mr.JOB_TYPE_ENUM.import_from_s3:await _o(e,Xy.importFromS3);break;case Mr.JOB_TYPE_ENUM.empty_trash:break;case Mr.JOB_TYPE_ENUM.export_local:await _o(e,nQ.export_local);break;case Mr.JOB_TYPE_ENUM.export_to_s3:await _o(e,nQ.export_to_s3);break;case Mr.JOB_TYPE_ENUM.delete_files_before:case Mr.JOB_TYPE_ENUM.delete_records_before:await _o(e,sQ.deleteFilesBefore);break;case Mr.JOB_TYPE_ENUM.delete_audit_logs_before:await _o(e,sQ.deleteAuditLogsBefore);break;case Mr.JOB_TYPE_ENUM.delete_transaction_logs_before:await _o(e,bRe.deleteTransactionLogsBefore);break;case Mr.JOB_TYPE_ENUM.restart_service:return await _o(e,ARe.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(NRe,"parseMessage");async function _o(e,t){try{e.job.status=Mr.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=RRe().valueOf(),await rQ.updateJob(e.job),await CRe(e.job.id)}catch(r){let n=r.message!==void 0?r.message:r;typeof n=="string"?(n=`There was an error running ${t.name} job with id ${e.job.id} - ${n}`,r.message=n):mE.error(`There was an error running ${t.name} job with id ${e.job.id}`),mE.error(n),e.job.message=n,e.job.status=Mr.JOB_STATUS_ENUM.ERROR;try{await rQ.updateJob(e.job)}catch(s){throw mE.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(_o,"runJob");async function CRe(e){mE.trace("launching job thread:",e),oQ?iQ.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Mr.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):IRe.postMessage({type:Mr.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(CRe,"launchJobThread");oQ&&wRe(Mr.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{iQ.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Mr.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){mE.error(r)}});aQ.exports={parseMessage:NRe,RunnerMessage:eD}});var uQ=v((Hke,lQ)=>{"use strict";var ORe=ae(),tD=me(),vc=(q(),M(z)),PRe=Ot(),LRe=_r(),go=Q(),DRe=ML(),MRe=Xi();tD.initSync();lQ.exports={postOperationHandler:URe,sendOperationTransaction:pE};async function pE(e,t,r,n){if(e.schema===vc.SYSTEM_SCHEMA_NAME)return;let s=vRe(e,t,r);s&&(go.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await LRe.publishToStream(`${PRe.SUBJECT_PREFIXES.TXN}.${e.schema}`,MRe.createNatsTableStreamName(e.schema,e.table),n,s))}o(pE,"sendOperationTransaction");function vRe(e,t,r){if(ORe.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===vc.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(vRe,"convertCRUDOperationToTransaction");async function URe(e,t,r){if(!tD.get(vc.CONFIG_PARAMS.CLUSTERING_ENABLED))return;go.trace(`postOperationHandler called for operation ${e.operation} on schema.table: ${e.schema}.${e.table}`);let n=e.hdb_user?.username,s=tD.get(vc.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new DRe(t.txn_time,n,s);switch(e.operation){case vc.OPERATIONS_ENUM.INSERT:try{await pE(e,t.inserted_hashes,i,r)}catch(a){go.error("There was an error calling clustering postOperationHandler for insert."),go.error(a)}break;case vc.OPERATIONS_ENUM.DELETE:try{await pE(e,t.deleted_hashes,i,r)}catch(a){go.error("There was an error calling clustering postOperationHandler for delete."),go.error(a)}break;case vc.OPERATIONS_ENUM.UPDATE:try{await pE(e,t.update_hashes,i,r)}catch(a){go.error("There was an error calling clustering postOperationHandler for update."),go.error(a)}break;case vc.OPERATIONS_ENUM.UPSERT:try{await pE(e,t.upserted_hashes,i,r)}catch(a){go.error("There was an error calling clustering postOperationHandler for upsert."),go.error(a)}break;default:break}return t}o(URe,"postOperationHandler")});var Z,dQ=se(()=>{Z=class{static{o(this,"OperationFunctionObject")}operation_function;job_operation_function;constructor(t,r=void 0){this.operation_function=t,this.job_operation_function=r}}});var ZP={};Re(ZP,{chooseOperation:()=>LQ,executeJob:()=>Zs,getOperationFunction:()=>DQ,operation:()=>uD,processLocalTransaction:()=>PQ});function FRe(e){if(!rD){let t=dE();rD=lD.promisify(t.evaluateSQL)}return rD(e)}async function PQ(e,t){try{if(e.body.operation!=="read_log"&&(gE.default.log_level===nm.INFO||gE.default.log_level===nm.DEBUG||gE.default.log_level===nm.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;In.info(c)}}catch(n){In.error(n)}let r=await CQ.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return kRe[e.body.operation]&&bQ.default.setSchemaDataToGlobal(n=>{n&&In.error(n)}),r}function LQ(e){let t;try{t=DQ(e)}catch(s){throw In.error(`Error when selecting operation function - ${s}`),s}let{operation_function:r,job_operation_function:n}=t;try{if(e.operation==="sql"||e.search_operation&&e.search_operation.operation==="sql"){let s=dE(),i=e.operation==="sql"?e.sql:e.search_operation.sql,a=s.convertSQLToAST(i);if(e.parsed_sql_object=a,!e.bypass_auth){let c=s.checkASTPermissions(e,a);if(c)throw In.error(`${fQ.FORBIDDEN} from operation ${e.operation}`),In.warn(`User '${e.hdb_user?.username}' is not permitted to ${e.operation}`),(0,ei.handleHDBError)(new Error,c,ei.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,void 0,!0)}}else if(!e.bypass_auth&&e.operation!==V.CREATE_AUTHENTICATION_TOKENS&&e.operation!==V.LOGIN&&e.operation!==V.LOGOUT){let s=n===void 0?r:n,i=e.search_operation?e.search_operation:e;i.hdb_user||(i.hdb_user=e.hdb_user);let a=RQ.default.verifyPerms(i,s);if(a)throw In.error(`${fQ.FORBIDDEN} from operation ${e.operation}`),In.warn(`User '${i.hdb_user?.username}' is not permitted to ${i.operation}`),(0,ei.handleHDBError)(new Error,a,ei.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,!1,!0)}}catch(s){throw(0,ei.handleHDBError)(s,"There was an error when trying to choose an operation path")}return r}function DQ(e){if(In.trace(`getOperationFunction with operation: ${e.operation}`),mQ.has(e.operation))return mQ.get(e.operation);throw(0,ei.handleHDBError)(new Error,ei.hdbErrors.HDB_ERROR_MSGS.OP_NOT_FOUND(e.operation),ei.hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}function uD(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=LQ(e);return PQ({body:e},n)}async function HRe(e){In.trace("In serverUtils.catchup");let t=e.transaction,r=t.channel.split(":"),n=r[0],s=r[1];for(let i of t.transactions)try{i.schema=n,i.table=s,i[Sb]=!0;let a;switch(i.operation){case V.INSERT:a=await lu.default.insert(i);break;case V.UPDATE:a=await lu.default.update(i);break;case V.UPSERT:a=await lu.default.upsert(i);break;case V.DELETE:a=await xf.default.deleteRecord(i);break;default:In.warn("invalid operation in catchup");break}await xRe.postOperationHandler(i,a,e)}catch(a){In.info("Invalid operation in transaction"),In.error(a)}}async function Zs(e){(0,NQ.transformReq)(e);let t,r;try{if(r=await eR.default.addJob(e),r){t=r.createdJob,In.info("addJob result",r);let n=new oD.default.RunnerMessage(t,e);return{message:await oD.default.parseMessage(n)??`Starting job with id ${t.id}`,job_id:t.id}}}catch(n){let s=n instanceof Error?n:null,i=`There was an error executing job: ${s&&"http_resp_msg"in s?s.http_resp_msg:n}`;throw In.error(i),(0,ei.handleHDBError)(n,i)}}function GRe(){let e=new Map;return e.set(V.INSERT,new Z(lu.default.insert)),e.set(V.UPDATE,new Z(lu.default.update)),e.set(V.UPSERT,new Z(lu.default.upsert)),e.set(V.SEARCH_BY_CONDITIONS,new Z(Uf.default.searchByConditions)),e.set(V.SEARCH_BY_HASH,new Z(Uf.default.searchByHash)),e.set(V.SEARCH_BY_ID,new Z(Uf.default.searchByHash)),e.set(V.SEARCH_BY_VALUE,new Z(Uf.default.searchByValue)),e.set(V.SEARCH,new Z(BRe)),e.set(V.SQL,new Z(FRe)),e.set(V.CSV_DATA_LOAD,new Z(Zs,hE.default.csvDataLoad)),e.set(V.CSV_FILE_LOAD,new Z(Zs,hE.default.csvFileLoad)),e.set(V.CSV_URL_LOAD,new Z(Zs,hE.default.csvURLLoad)),e.set(V.IMPORT_FROM_S3,new Z(Zs,hE.default.importFromS3)),e.set(V.CREATE_SCHEMA,new Z(Pi.default.createSchema)),e.set(V.CREATE_DATABASE,new Z(Pi.default.createSchema)),e.set(V.CREATE_TABLE,new Z(Pi.default.createTable)),e.set(V.CREATE_ATTRIBUTE,new Z(Pi.default.createAttribute)),e.set(V.DROP_SCHEMA,new Z(Pi.default.dropSchema)),e.set(V.DROP_DATABASE,new Z(Pi.default.dropSchema)),e.set(V.DROP_TABLE,new Z(Pi.default.dropTable)),e.set(V.DROP_ATTRIBUTE,new Z(Pi.default.dropAttribute)),e.set(V.DESCRIBE_SCHEMA,new Z(EE.default.describeSchema)),e.set(V.DESCRIBE_DATABASE,new Z(EE.default.describeSchema)),e.set(V.DESCRIBE_TABLE,new Z(EE.default.describeTable)),e.set(V.DESCRIBE_ALL,new Z(EE.default.describeAll)),e.set(V.DELETE,new Z(xf.default.deleteRecord)),e.set(V.ADD_USER,new Z(vf.default.addUser)),e.set(V.ALTER_USER,new Z(vf.default.alterUser)),e.set(V.DROP_USER,new Z(vf.default.dropUser)),e.set(V.LIST_USERS,new Z(vf.default.listUsersExternal)),e.set(V.LIST_ROLES,new Z(_E.default.listRoles)),e.set(V.ADD_ROLE,new Z(_E.default.addRole)),e.set(V.ALTER_ROLE,new Z(_E.default.alterRole)),e.set(V.DROP_ROLE,new Z(_E.default.dropRole)),e.set(V.USER_INFO,new Z(vf.default.userInfo)),e.set(V.READ_LOG,new Z(hQ.default)),e.set(V.ADD_NODE,new Z(EQ.default)),e.set(V.UPDATE_NODE,new Z(nD.default)),e.set(V.SET_NODE_REPLICATION,new Z(nD.default)),e.set(V.REMOVE_NODE,new Z(_Q.default)),e.set(V.CONFIGURE_CLUSTER,new Z(gQ.default)),e.set(V.PURGE_STREAM,new Z(SQ.default)),e.set(V.SET_CONFIGURATION,new Z(aD.default.setConfiguration)),e.set(V.CLUSTER_STATUS,new Z(TQ.default.clusterStatus)),e.set(V.CLUSTER_NETWORK,new Z(yQ.default)),e.set(V.CLUSTER_SET_ROUTES,new Z(Zy.default.setRoutes)),e.set(V.CLUSTER_GET_ROUTES,new Z(Zy.default.getRoutes)),e.set(V.CLUSTER_DELETE_ROUTES,new Z(Zy.default.deleteRoutes)),e.set(V.EXPORT_TO_S3,new Z(Zs,sD.default.export_to_s3)),e.set(V.CREATE_CSR,new Z(cu.default.createCsr)),e.set(V.SIGN_CERTIFICATE,new Z(cu.default.signCertificate)),e.set(V.LIST_CERTIFICATES,new Z(cu.default.listCertificates)),e.set(V.ADD_CERTIFICATES,new Z(cu.default.addCertificate)),e.set(V.REMOVE_CERTIFICATE,new Z(cu.default.removeCertificate)),e.set(V.GET_KEY,new Z(cu.default.getKey)),e.set(V.ADD_NODE_BACK,new Z(nO)),e.set(V.REMOVE_NODE_BACK,new Z(sO)),e.set(V.DELETE_FILES_BEFORE,new Z(Zs,xf.default.deleteFilesBefore)),e.set(V.DELETE_RECORDS_BEFORE,new Z(Zs,xf.default.deleteFilesBefore)),e.set(V.EXPORT_LOCAL,new Z(Zs,sD.default.export_local)),e.set(V.SEARCH_JOBS_BY_START_DATE,new Z(eR.default.handleGetJobsByStartDate)),e.set(V.GET_JOB,new Z(eR.default.handleGetJob)),e.set(V.GET_REGISTRATION_INFO,new Z(_L)),e.set(V.GET_FINGERPRINT,new Z(gL)),e.set(V.SET_LICENSE,new Z(SL)),e.set(V.RESTART,new Z(iD.default.restart)),e.set(V.RESTART_SERVICE,new Z(Zs,iD.default.restartService)),e.set(V.CATCHUP,new Z(HRe)),e.set(V.SYSTEM_INFORMATION,new Z(AQ.default.systemInformation)),e.set(V.DELETE_AUDIT_LOGS_BEFORE,new Z(Zs,xf.default.deleteAuditLogsBefore)),e.set(V.READ_AUDIT_LOG,new Z(pQ.default)),e.set(V.CREATE_AUTHENTICATION_TOKENS,new Z(vN)),e.set(V.REFRESH_OPERATION_TOKEN,new Z(UN)),e.set(V.LOGIN,new Z(zP)),e.set(V.LOGOUT,new Z(jP)),e.set(V.GET_CONFIGURATION,new Z(aD.default.getConfiguration)),e.set(V.CUSTOM_FUNCTIONS_STATUS,new Z(vt.default.customFunctionsStatus)),e.set(V.GET_CUSTOM_FUNCTIONS,new Z(vt.default.getCustomFunctions)),e.set(V.GET_COMPONENT_FILE,new Z(vt.default.getComponentFile)),e.set(V.GET_COMPONENTS,new Z(vt.default.getComponents)),e.set(V.SET_COMPONENT_FILE,new Z(vt.default.setComponentFile)),e.set(V.DROP_COMPONENT,new Z(vt.default.dropComponent)),e.set(V.GET_CUSTOM_FUNCTION,new Z(vt.default.getCustomFunction)),e.set(V.SET_CUSTOM_FUNCTION,new Z(vt.default.setCustomFunction)),e.set(V.DROP_CUSTOM_FUNCTION,new Z(vt.default.dropCustomFunction)),e.set(V.ADD_CUSTOM_FUNCTION_PROJECT,new Z(vt.default.addComponent)),e.set(V.ADD_COMPONENT,new Z(vt.default.addComponent)),e.set(V.DROP_CUSTOM_FUNCTION_PROJECT,new Z(vt.default.dropCustomFunctionProject)),e.set(V.PACKAGE_CUSTOM_FUNCTION_PROJECT,new Z(vt.default.packageComponent)),e.set(V.PACKAGE_COMPONENT,new Z(vt.default.packageComponent)),e.set(V.DEPLOY_CUSTOM_FUNCTION_PROJECT,new Z(vt.default.deployComponent)),e.set(V.DEPLOY_COMPONENT,new Z(vt.default.deployComponent)),e.set(V.READ_TRANSACTION_LOG,new Z(cD.default.readTransactionLog)),e.set(V.DELETE_TRANSACTION_LOGS_BEFORE,new Z(Zs,cD.default.deleteTransactionLogsBefore)),e.set(V.INSTALL_NODE_MODULES,new Z(IQ.default.installModules)),e.set(V.GET_BACKUP,new Z(Pi.default.getBackup)),e.set(V.CLEANUP_ORPHAN_BLOBS,new Z(Pi.default.cleanupOrphanBlobs)),e.set(V.ADD_SSH_KEY,new Z(vt.default.addSSHKey)),e.set(V.UPDATE_SSH_KEY,new Z(vt.default.updateSSHKey)),e.set(V.DELETE_SSH_KEY,new Z(vt.default.deleteSSHKey)),e.set(V.LIST_SSH_KEYS,new Z(vt.default.listSSHKeys)),e.set(V.SET_SSH_KNOWN_HOSTS,new Z(vt.default.setSSHKnownHosts)),e.set(V.GET_SSH_KNOWN_HOSTS,new Z(vt.default.getSSHKnownHosts)),e.set(V.GET_ANALYTICS,new Z(sL)),e.set(V.LIST_METRICS,new Z(iL)),e.set(V.DESCRIBE_METRIC,new Z(oL)),e.set(V.GET_STATUS,new Z(pL)),e.set(V.SET_STATUS,new Z(hL)),e.set(V.CLEAR_STATUS,new Z(mL)),e.set(V.INSTALL_USAGE_LICENSE,new Z(pP)),e.set(V.GET_USAGE_LICENSES,new Z(gP)),e}var Uf,hE,Pi,EE,xf,pQ,vf,_E,vt,gE,hQ,EQ,nD,_Q,gQ,SQ,TQ,yQ,Zy,sD,RQ,eR,ei,iD,lD,lu,bQ,AQ,oD,aD,cD,IQ,wQ,NQ,cu,CQ,OQ,fQ,In,xRe,BRe,rD,kRe,mQ,eL=se(()=>{Uf=b(hn()),hE=b(kL()),Pi=b(mT()),EE=b(Ll()),xf=b(Sl()),pQ=b(LC()),vf=b(fs()),_E=b(kp()),vt=b(XP()),gE=b(Q()),hQ=b(xC()),EQ=b(IT()),nD=b(lO()),_Q=b(NT()),gQ=b(fO()),SQ=b(mO()),TQ=b(EO()),yQ=b(gO()),Zy=b(DT()),sD=b(jL()),RQ=b(Vy()),eR=b(ZL());q();ei=b(_e()),iD=b(Cf()),lD=b(require("util")),lu=b(Gn()),bQ=b(Qi()),AQ=b(fh()),oD=b(cQ());Pd();Ny();aD=b(St()),cD=b(Uy()),IQ=b(nL()),wQ=b(ii()),NQ=b(ae());Fr();cu=b(_s());ef();cL();CQ=b(VN()),OQ=b(uQ());eE();vh();yL();dQ();({HTTP_STATUS_CODES:fQ}=ei.hdbErrors),In=gE.default.loggerWithTag("operation"),{transactToClusteringUtils:xRe}=OQ.default,BRe=lD.promisify(Uf.default.search);o(FRe,"evaluateSQL");kRe={[V.CREATE_ATTRIBUTE]:!0,[V.CREATE_TABLE]:!0,[V.CREATE_SCHEMA]:!0,[V.DROP_ATTRIBUTE]:!0,[V.DROP_TABLE]:!0,[V.DROP_SCHEMA]:!0};o(PQ,"processLocalTransaction");mQ=GRe();ve.operation=uD;o(LQ,"chooseOperation");o(DQ,"getOperationFunction");(0,wQ._assignPackageExport)("operation",uD);o(uD,"operation");o(HRe,"catchup");o(Zs,"executeJob");o(GRe,"initializeOperationFunctionMap")});var nR=v((Wke,UQ)=>{"use strict";var tR=(q(),M(z)),qRe=ae(),SE=Q(),{handleHDBError:dD,hdbErrors:rR}=_e(),{isMainThread:$Re}=require("worker_threads"),{Readable:VRe}=require("stream"),MQ=require("os"),KRe=require("util"),YRe=BN(),WRe=KRe.promisify(YRe.authorize),vQ=(eL(),M(ZP)),{createGzip:zRe,constants:jRe}=require("zlib"),QRe=[tR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,tR.OPERATIONS_ENUM.LOGIN,tR.OPERATIONS_ENUM.LOGOUT];function JRe(e){let t=`Found an uncaught exception with message: ${e.message}. ${MQ.EOL}Stack: ${e.stack} ${MQ.EOL}Terminating ${$Re?"HDB":"thread"}.`;console.error(t),SE.fatal(t),process.exit(1)}o(JRe,"handleServerUncaughtException");function XRe(e,t,r){if(SE[e.logLevel||"error"](e),e.statusCode)return typeof e.http_resp_msg!="object"?r.code(e.statusCode).send({error:e.http_resp_msg||e.message}):r.code(e.statusCode).send(e.http_resp_msg);let n=e.statusCode?e.statusCode:rR.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR;return typeof e=="string"?r.code(n).send({error:e}):r.code(n).send(e.message?{error:e.message}:e)}o(XRe,"serverErrorHandler");function ZRe(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=dD(new Error,"Invalid JSON.",rR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(qRe.isEmpty(e.body.operation)){let n=dD(new Error,"Request body must include an 'operation' property.",rR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(ZRe,"reqBodyValidationHandler");function ebe(e,t,r){let n;!QRe.includes(e.body.operation)||e.body.operation===tR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?WRe(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{SE.warn(i),SE.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(dD(i,a,rR.HTTP_STATUS_CODES.UNAUTHORIZED),null)}):(e.body.hdb_user=null,e.body.baseRequest=e.raw?.baseRequest,e.body.baseResponse=t.raw?.baseResponse,e.body.fastifyResponse=t,r())}o(ebe,"authHandler");async function tbe(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=vQ.chooseOperation(e.body);let s=await vQ.processLocalTransaction(e,n);if(s instanceof VRe&&s.headers){for(let[i,a]of s.headers)t.header(i,a);e.headers["accept-encoding"]?.includes("gzip")&&(t.header("content-encoding","gzip"),s=s.pipe(zRe({level:jRe.Z_BEST_SPEED})))}return s}catch(s){throw SE.error(s),s}}o(tbe,"handlePostRequest");UQ.exports={authHandler:ebe,handlePostRequest:tbe,handleServerUncaughtException:JRe,serverErrorHandler:XRe,reqBodyValidationHandler:ZRe}});var kQ=v((jke,FQ)=>{"use strict";var rbe=require("fastify-plugin"),{handlePostRequest:xQ,authHandler:nbe,reqBodyValidationHandler:sbe}=nR();async function ibe(e){e.decorate("hdbCore",{preValidation:[sbe,nbe],request:o(t=>BQ(xQ(t,response)),"request"),requestWithoutAuthentication:o((t,r)=>BQ(xQ(t,r,!0)),"requestWithoutAuthentication")})}o(ibe,"hdbCore");async function BQ(e){if(e=await e,e?.[Symbol.asyncIterator]&&!e[Symbol.iterator]){let t=[];for await(let r of e)t.push(r);return t}return e}o(BQ,"convertAsyncIterators");FQ.exports=rbe(ibe)});var GQ=v((Xke,HQ)=>{"use strict";var Jke=require("fs"),sR=me();sR.initSync();var{CONFIG_PARAMS:fD}=(q(),M(z)),obe=1024*1024*1024;function abe(e){let t=sR.get(fD.HTTP_TIMEOUT),r=sR.get(fD.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:obe,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:sR.get(fD.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(abe,"getServerOptions");HQ.exports=abe});var VQ=v((eHe,$Q)=>{"use strict";var mD=me();mD.initSync();var{CONFIG_PARAMS:qQ}=(q(),M(z));function cbe(){let e=mD.get(qQ.HTTP_CORSACCESSLIST),t=mD.get(qQ.HTTP_CORS),r;return t&&(r={origin:!0,allowedHeaders:["Content-Type","Authorization","Accept"],credentials:!1},e&&e.length>0&&e[0]!==null&&e[0]!=="*"&&(r.origin=(n,s)=>s(null,e.indexOf(n)!==-1))),r}o(cbe,"getCORSOptions");$Q.exports=cbe});var WQ=v((rHe,YQ)=>{"use strict";var KQ=me();KQ.initSync();var lbe=(q(),M(z));function ube(){return KQ.get(lbe.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(ube,"getHeaderTimeoutConfig");YQ.exports=ube});var hD={};Re(hD,{customFunctionsServer:()=>mbe,ready:()=>a2,start:()=>fbe});function fbe(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){ga||(ga=o2(t),ve.http((await ga).server));let a=await ga,c=(0,pD.dirname)(s),l=(0,pD.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!zQ.has(c)){zQ.add(c);try{a.register(hbe(c,l))}catch(u){if(u.message==="Root plugin has already booted")yt.warn(`Could not load root fastify route for ${s}, this may require a restart to install properly`);else throw u}}},ready:a2}}async function mbe(){try{yt.info("In Custom Functions Fastify server"+process.cwd()),yt.info(`Custom Functions Running with NODE_ENV set as: ${process.env.NODE_ENV}`),yt.debug(`Custom Functions server process ${process.pid} starting up.`),await pbe();let e=e2.get(F.HTTP_SECUREPORT)>0,t;try{t=ga=await o2(e)}catch(r){throw yt.error(`Custom Functions buildServer error: ${r}`),r}try{await t.ready()}catch(r){throw yt.error(`Custom Functions server.ready() error: ${r}`),r}t.server.cantCleanupProperly=!0}catch(e){yt.error(`Custom Functions ${process.pid} Error: ${e}`),yt.error(e),process.exit(1)}}async function pbe(){try{yt.info("Custom Functions starting configuration."),await t2.setUsersWithRolesCache(),yt.info("Custom Functions completed configuration.")}catch(e){yt.error(e)}}function hbe(e,t){return async function(r){try{yt.info("Custom Functions starting buildRoutes"),yt.trace("Loading fastify routes folder "+e),(0,jQ.existsSync)(e)&&r.register(ZQ.default,s=>({dir:e,dirNameRoutePrefix:!1,options:{hdbCore:s.hdbCore,logger:yt.loggerWithTag("custom-function"),prefix:`/${t}`}})).after((s,i,a)=>{s?.message?yt.error(s.message):s&&yt.error(s),a()})}catch(n){yt.error(`Custom Functions errored buildRoutes: ${n}`)}}}async function o2(e){yt.info("Custom Functions starting buildServer.");let t=(0,r2.default)(e),r=(0,QQ.default)(t);r.server.headersTimeout=(0,s2.default)(),r.setErrorHandler(i2.serverErrorHandler);let n=(0,n2.default)();return n&&r.register(JQ.default,n),r.register(function(s,i,a){s.setNotFoundHandler(function(c,l){r.server.emit("unhandled",c.raw,l.raw)}),a()}),r.register(XQ.default),await r.register(dbe),await r.after(),Rm(r),yt.info("Custom Functions completed buildServer."),r}function a2(){if(ga)return ga.then?ga.then(e=>e.ready()):ga.ready()}var pD,jQ,QQ,JQ,XQ,ZQ,e2,yt,dbe,t2,r2,n2,s2,i2,ga,zQ,c2=se(()=>{pD=require("path"),jQ=require("fs"),QQ=b(require("fastify")),JQ=b(require("@fastify/cors")),XQ=b(PN()),ZQ=b(require("@fastify/autoload")),e2=b(me());q();yt=b(Q()),dbe=b(kQ()),t2=b(fs()),r2=b(GQ()),n2=b(VQ()),s2=b(WQ()),i2=b(nR());Do();Fr();zQ=new Set;o(fbe,"start");o(mbe,"customFunctionsServer");o(pbe,"setUp");o(hbe,"buildRouteFolder");o(o2,"buildServer");o(a2,"ready")});var _D={};Re(_D,{handleApplication:()=>Ebe,suppressHandleApplicationWarning:()=>_be});function Ebe(e){let t=new Map,r=new Map;e.options.on("change",(n,s)=>{if(n[0]==="files"||n[0]==="urlPath"){t.clear(),r.clear(),e.logger.info(`Static files reinitialized due to change in ${n.join(".")}`);return}}),e.handleEntry(n=>{switch(n.eventType){case"addDir":case"unlinkDir":let s=(0,Ff.join)(n.absolutePath,"index.html");(0,Bf.existsSync)(s)&&r[n.eventType==="addDir"?"set":"delete"](n.urlPath,s);break;case"add":t.set(n.urlPath,n.absolutePath),n.urlPath.endsWith("index.html")&&r.set((0,Ff.dirname)(n.urlPath),n.absolutePath);break;case"unlink":t.delete(n.urlPath),n.urlPath.endsWith("index.html")&&r.delete((0,Ff.dirname)(n.urlPath));break}}),e.server.http((n,s)=>{if(n.method!=="GET"||n.isWebSocket)return s(n);let i=e.options.get(["fallthrough"])??!0;if(typeof i!="boolean")throw new Error(`Invalid fallthrough option: ${i}. Must be a boolean.`);let a=t.get(n.pathname);if(!a){let d=e.options.get(["index"])??!1;if(typeof d!="boolean")throw new Error(`Invalid index option: ${d}. Must be a boolean.`);d&&(a=r.get(n.pathname))}if(!a){let d=e.options.get(["extensions"])??[];if(!Array.isArray(d)||d.some(f=>typeof f!="string"))throw new Error(`Invalid extensions option: ${d}. Must be an array of strings.`);for(let f of d)if(a=t.get(`${n.pathname}.${f}`),a)break}if(a)return{handlesHeaders:!0,body:(0,ED.default)(n,(0,Bf.realpathSync)(a))};if(i)return s(n);let c=e.options.get(["notFound"]);if(gbe(c),!c)return{status:404,body:"File not found"};let l=(0,Ff.join)(e.directory,typeof c=="string"?c:c.file),u=typeof c=="object"?c.statusCode:404;if(!(0,Bf.existsSync)(l))throw new Error(`Not found file does not exist: ${l}`);return{status:u,handlesHeaders:!0,body:(0,ED.default)(n,(0,Bf.realpathSync)(l))}},{runFirst:!0})}function gbe(e){if(!(e===void 0||typeof e=="string")){if(typeof e=="object"&&e!==null&&!Array.isArray(e)){if(!("file"in e)||typeof e.file!="string")throw new Error(`Invalid \`notFound.file\` option: ${e.file}. Must be a string.`);if(!("statusCode"in e)||typeof e.statusCode!="number")throw new Error(`Invalid \`notFound.statusCode\` option: ${e.statusCode}. Must be a number.`);return}throw new Error(`Invalid notFound option: ${e}. Must be a string or an object with file and statusCode properties.`)}}var Bf,Ff,ED,_be,l2=se(()=>{Bf=require("node:fs"),Ff=require("node:path"),ED=b(require("send"));o(Ebe,"handleApplication");_be=!0;o(gbe,"validateNotFoundOption")});var gD={};Re(gD,{start:()=>Sbe});function Sbe({override:e}){return{handleFile:o((t,r,n)=>{iR.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,u2.parse)(t))){if(process.env[s]!==void 0)if(iR.default.warn(`Environment variable conflict: ${s} from ${n} is already set on process.env`),e)iR.default.debug(`override option enabled. overriding environment variable: ${s}`);else continue;process.env[s]=i}},"handleFile")}}var u2,iR,d2=se(()=>{u2=require("dotenv"),iR=b(Q());o(Sbe,"start")});var SD={};Re(SD,{DataLoaderError:()=>Ns,DataLoaderResult:()=>kf,EmptyFileError:()=>cR,FileParseError:()=>aR,InvalidPropertyTypeError:()=>lR,MissingRequiredPropertyError:()=>TE,RecordProcessingError:()=>yE,SystemDatabaseError:()=>uR,UnsupportedFileExtensionError:()=>oR,handleApplication:()=>ybe,loadDataFile:()=>E2,suppressHandleApplicationWarning:()=>Tbe});function ybe(e){if((0,m2.getWorkerIndex)()!==0){So.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||E2(t,Sn,De).then(r=>{So.debug?.("Data loader processed file: %s: %s",(0,Sa.basename)(t.absolutePath),r.message)})})}async function E2({contents:e,absolutePath:t,stats:r},n,s){let i=(0,Sa.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,f2.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new oR(t,i);a.mtime=r.mtimeMs}catch(f){throw f instanceof Ns?f:new aR(t,f)}if(!a)throw new cR(t);let{database:c,table:l,records:u}=a;if(!l)throw new TE(t,"table");if(!u)throw new TE(t,"records");if(!Array.isArray(u))throw new lR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new uR(c,l);try{let f;if(c&&s[c]&&s[c][l])So.debug?.(`Using existing table ${d} from database tables`),f=s[c][l];else if(n&&n[l])So.debug?.(`Using existing table ${d} from global tables`),f=n[l];else{So.debug?.(`Table ${d} not found, creating new table`);let R=[];if(u.length>0){let S=u[0];Object.keys(S).map(y=>{let C={name:y,type:typeof S[y]};return y==="id"&&(C.isPrimaryKey=!0),C}).forEach(y=>{R.push(y)})}f=await Ze({database:c,table:l,attributes:R})}let m=u.length,p=0,h=0,E=0,g=100;for(let R=0;R<u.length;R+=g){let S=u.slice(R,R+g),y=[];for(let C of S)y.push(async()=>{try{let I=null,k=C.id;if(k!==void 0&&(I=await f.get(k)),!I)return p++,f.put(C);let J=I.getUpdatedTime();return a.mtime>J?(h++,f.put(C)):(E++,Promise.resolve({inserted:0,updated:0}))}catch(I){if(I instanceof Ns)So.error?.(`Record processing error: ${I.message}`);else{let k=new yE(d,I);So.error?.(`Record processing error: ${k.message}`)}return Promise.resolve({inserted:0,updated:0,error:I.message})}});await Promise.all(y.map(C=>C()))}if(p>0||h>0){let R=`Loaded ${p} new and updated ${h} records in ${d}`;return E>0&&(R+=` (${E} records skipped)`),So.info?.(R),new kf(t,c,l,"success",p+h,R)}else if(E>0){let R=`All ${E} records in ${d} already up-to-date`;return So.info?.(R),new kf(t,c,l,"skipped",m,R)}else{let R=`No records to process in ${d}`;return So.info?.(R),new kf(t,c,l,"success",0,R)}}catch(f){throw f instanceof Ns?f:new yE(d,f)}}var Sa,f2,m2,Ta,p2,h2,So,Tbe,Ns,oR,aR,cR,TE,lR,uR,yE,kf,_2=se(()=>{Sa=require("node:path"),f2=require("yaml");we();m2=b(nt()),Ta=b(zr()),p2=b(_e()),h2=b(Q()),So=h2.default.forComponent("dataLoader"),Tbe=!0;o(ybe,"handleApplication");o(E2,"loadDataFile");Ns=class extends p2.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=Ta.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},oR=class extends Ns{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,Sa.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,Ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="UnsupportedFileExtensionError"}},aR=class extends Ns{static{o(this,"FileParseError")}constructor(t,r){super(`Failed to parse data file ${(0,Sa.basename)(t)}: ${r.message}`,Ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},cR=class extends Ns{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,Sa.basename)(t)} is empty or invalid`,Ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},TE=class extends Ns{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,Sa.basename)(t)} is missing required "${r}" property`,Ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},lR=class extends Ns{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,Sa.basename)(t)} has invalid "${r}" property, expected ${n}`,Ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},uR=class extends Ns{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,Ta.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},yE=class extends Ns{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,Ta.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},kf=class{static{o(this,"DataLoaderResult")}#e;#t;#r;#n;#s;#i;constructor(t,r,n,s,i,a){this.#e=t,this.#t=r||"unknown",this.#r=n||"unknown",this.#n=s,this.#s=i,this.#i=a}get filePath(){return this.#e}get database(){return this.#t}get table(){return this.#r}get status(){return this.#n}get count(){return this.#s}get message(){return this.#i}toJSON(){return{filePath:this.#e,database:this.#t,table:this.#r,status:this.#n,count:this.#s,message:this.#i}}}});var TD={};Re(TD,{hdbServer:()=>Ibe,start:()=>Ibe});async function Ibe(e){try{To.default.debug("In Fastify server"+process.cwd()),To.default.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),To.default.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=g2.default.isMaster,await wbe();let t=e.securePort>0;Hf=Nbe(t),await Hf.ready(),e||(e={}),e.isOperationsServer=!0;try{ve.http(Hf.server,e),Hf.server.closeIdleConnections||await Hf.listen({port:0,host:"::"})}catch(r){throw Hf.close(),To.default.error(r),To.default.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),To.default.fatal(t),process.exit(1)}}async function wbe(){return To.default.trace("Configuring HarperDB process."),w2.default.setSchemaDataToGlobal(),C2.default.setUsersWithRolesCache()}function Nbe(e){To.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=Cbe(e),r=(0,S2.default)(t);r.server.headersTimeout=Pbe(),r.setErrorHandler(Uc.serverErrorHandler);let n=Obe();n&&r.register(T2.default,n),r.register(function(i,a,c){i.setNotFoundHandler(function(l,u){r.server.emit("unhandled",l.raw,u.raw)}),c()}),r.register(b2.default),r.register(y2.default),r.register(R2.default,{root:A2.default.join(I2.PACKAGE_ROOT,"studio/web")}),Rm(r);let s=ya.default.get(im.LOCAL_STUDIO_ON);return r.get("/",function(i,a){return!N2.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?a.sendFile("index.html"):a.sendFile("running.html")}),r.post("/",{preValidation:[Uc.reqBodyValidationHandler,Uc.authHandler],config:{isOperation:!0}},async function(i,a){return i.body?.operation?.startsWith("restart")&&a.header("Connection","close"),(0,Uc.handlePostRequest)(i,a)}),r.get("/health",()=>"HarperDB is running."),To.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}function Cbe(e){let t=ya.default.get(Gf.OPERATIONSAPI_NETWORK_TIMEOUT),r=ya.default.get(Gf.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:bbe,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,http2:ya.default.get(Gf.OPERATIONSAPI_NETWORK_HTTP2),https:e}}function Obe(){let e=ya.default.get(Gf.OPERATIONSAPI_NETWORK_CORS),t=ya.default.get(Gf.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===Abe)&&(r={origin:!0,allowedHeaders:["Content-Type","Authorization","Accept"],credentials:!1},t&&t.length>0&&t[0]!==null&&t[0]!=="*"&&(r.origin=(n,s)=>s(null,t.indexOf(n)!==-1))),r}function Pbe(){return ya.default.get(Gf.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??Rbe}var g2,ya,To,S2,T2,y2,R2,b2,A2,I2,w2,N2,C2,Uc,Rbe,bbe,Abe,Gf,Hf,O2=se(()=>{g2=b(require("cluster")),ya=b(me());q();To=b(Q()),S2=b(require("fastify")),T2=b(require("@fastify/cors")),y2=b(require("@fastify/compress")),R2=b(require("@fastify/static")),b2=b(PN()),A2=b(require("path")),I2=b(Ct()),w2=b(Qi()),N2=b(ae()),C2=b(fs());Fr();Uc=b(nR());Do();ya.default.initSync();Rbe=6e4,bbe=1024*1024*1024,Abe="TRUE",{CONFIG_PARAMS:Gf}=z;o(Ibe,"operationsServer");o(wbe,"setUp");o(Nbe,"buildServer");o(Cbe,"getServerOptions");o(Obe,"getCORSOpts");o(Pbe,"getHeaderTimeoutConfig")});var wD={};Re(wD,{disableNATS:()=>Dbe,publishToStream:()=>mR,setNATSReplicator:()=>yD,setPublishToStream:()=>Mbe,setSubscription:()=>ID,start:()=>Lbe});function Lbe(){RE.default.get(F.CLUSTERING_ENABLED)&&Ube()}function Dbe(e=!0){v2=e}function Mbe(e,t){mR=e,ID=t}function Ube(){if(v2||process.env._DISABLE_NATS)return;let e=at(),t=Object.keys(e);t.push("system");for(let r of t){let n=e[r];for(let s in n){let i=n[s];yD(s,r,i)}}Ol((r,n)=>{yD(r.tableName,r.databaseName,r),n&&x2(r)}),!P2&&(P2=!0)}function yD(e,t,r){if(t==="system"&&xbe.includes(e))return;if(!r)return console.error(`Attempt to replicate non-existent table ${e} from database ${t}`);if(r.sources.some(s=>s?.isNATSReplicator))return;r.sourcedFrom(class extends Hr{static{o(this,"NATSReplicator")}put(i){return n(this.getContext()).addWrite(t,{operation:"put",table:e,id:this.getId(),record:i})}delete(){return n(this.getContext()).addWrite(t,{operation:"delete",table:e,id:this.getId()})}publish(i){return n(this.getContext()).addWrite(t,{operation:"publish",table:e,id:this.getId(),record:i})}patch(i){return n(this.getContext()).addWrite(t,{operation:"patch",table:e,id:this.getId(),record:i})}invalidate(){n(this.getContext()).addWrite(t,{operation:"invalidate",table:e,id:this.getId()})}static defineSchema(i){x2(i)}static subscribe(){let i=new Xn;return ID(t,e,i),i}static subscribeOnThisThread(i){return i<(RE.default.get(F.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??vbe)}static isEqual(i){return i.isNATSReplicator}static isNATSReplicator=!0;static shouldReceiveInvalidations=!0},{intermediateSource:!0});function n(s){let i=s?.transaction?.nats;if(!i)if(s?.transaction){s.transaction.nats=i=new dR(s.transaction,s);let a=s.transaction;for(;a.next;)a=a.next;a.next=s.transaction.nats,i.user=s.user,i.context=s}else i=U2;return i}o(n,"getNATSTransaction")}function x2(e){let t=RE.default.get(F.CLUSTERING_NODENAME);mR(`${bD.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,AD.createNatsTableStreamName)(e.databaseName,e.tableName),void 0,{operation:"define_schema",schema:e.databaseName,table:e.tableName,attributes:e.attributes,__origin:{timestamp:Date.now(),node_name:t}})}var L2,bD,AD,D2,M2,RE,fR,v2,mR,ID,vbe,U2,P2,xbe,dR,RD,B2=se(()=>{we();Ga();L2=b(_r()),bD=b(Ot()),AD=b(Xi());wu();D2=b(pR()),M2=b(Dn()),RE=b(me());q();fR=b(Q());o(Lbe,"start");o(Dbe,"disableNATS");mR=L2.publishToStream,ID=D2.setSubscription;o(Mbe,"setPublishToStream");vbe=2;o(Ube,"assignReplicationSource");xbe=["hdb_job","hdb_raw_analytics","hdb_info"];o(yD,"setNATSReplicator");o(x2,"publishSchema");dR=class{constructor(t,r){this.transaction=t;this.options=r}static{o(this,"NATSTransaction")}user;writesByDb=new Map;addWrite(t,r){r.expiresAt=this.context?.expiresAt;let n=this.writesByDb.get(t);n||this.writesByDb.set(t,n=[]),n.push(r)}commit({timestamp:t}){let r=RE.default.get(F.CLUSTERING_NODENAME),n=[];for(let[s,i]of this.writesByDb){let a=[],c=[],l,u;for(let d of i){let f=d.table,m=d.operation=="put"?"upsert":d.operation;l||(fR.trace(`Sending transaction event ${m}`),u=l={operation:m,schema:s,table:f,__origin:{user:this.user?.username,timestamp:t,node_name:r}},l.hash_values=c,m!=="delete"&&m!=="invalidate"&&(l.records=a)),l.table===f&&l.operation===m?(a.push(d.record),c.push(d.id)):u=u.next={operation:m,table:f,id:d.id,record:d.record},d.expiresAt&&(u.expiresAt=d.expiresAt)}l&&n.push(mR(`${bD.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,AD.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw fR.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},RD=class extends dR{static{o(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,M2.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};U2=new RD});async function q2({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let a=await ND.get(e,{returnNonexistent:!0});i=new PD(e,t,a),a&&(i.sessionWasPresent=!0)}else{if(e){let a=await ND.get(e);a&&a.delete()}i=new ER(e,t)}return n&&(n.id=e,n.user={username:t?.username},bE.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function CD(){return hR++,hR>65500&&(hR=1),hR}function OD(e,t,r){let{topic:n,retain:s}=e;e.data=t,e.async=!0,r.authorize=!0;let i=vs.getMatch(n,"mqtt");if(!i)throw new Error(`Can not publish to topic ${n} as it does not exist, no resource has been defined to handle this topic`);e.url=i.relativeURL;let a=new ai(i.relativeURL);a.checkPermission=r.user?.role?.permission??{};let c=i.Resource;return bt(r,()=>s?t===void 0?c.delete(a,r):c.put(a,e.data,r):c.publish(a,e.data,r))}var k2,xc,H2,G2,F2,ND,bE,hR,ER,PD,$2=se(()=>{we();qa();k2=b(Dn()),xc=b(Q());va();H2=b(nt()),G2=b(OP());Fr();rg();F2=100,ND=Ze({database:"system",table:"hdb_durable_session",attributes:[{name:"id",isPrimaryKey:!0},{name:"subscriptions",type:"array",elements:{attributes:[{name:"topic"},{name:"qos"},{name:"startTime"},{name:"acks"}]}}]}),bE=Ze({database:"system",table:"hdb_session_will",attributes:[{name:"id",isPrimaryKey:!0},{name:"topic",type:"string"},{name:"data"},{name:"qos",type:"number"},{name:"retain",type:"boolean"},{name:"user",type:"any"}]});(0,H2.getWorkerIndex)()===0&&(async()=>{await G2.whenComponentsLoaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of bE.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await ve.getUser(r.user.username));try{await OD(r,t,r)}catch{(0,xc.warn)("Failed to publish will",t)}bE.delete(e.id)}})();o(q2,"getSession");hR=1;o(CD,"getNextMessageId");ER=class{static{o(this,"SubscriptionsSession")}listener;sessionId;user;request;socket;subscriptions=[];awaitingAcks;sessionWasPresent;keepalive;keepaliveTimer;constructor(t,r){this.sessionId=t,this.user=r}async addSubscription(t,r,n){let{topic:s,rh:i,startTime:a}=t,c=s.indexOf("?"),l,u;if(c>-1?(l=s.slice(c),u=s.slice(0,c)):u=s,!u)throw new Error("No topic provided");if(u.indexOf(".")>-1)throw new Error("Dots are not allowed in topic names");let d=this.subscriptions.find(S=>S.topic===s),f;d?(f=i>0,d.end(),this.subscriptions.splice(this.subscriptions.indexOf(d),1)):f=i===2;let m={search:l,async:!0,user:this.user,startTime:a,omitCurrent:f,target:"",checkPermission:this.user?.role?.permission??{}};a&&(0,xc.trace)("Resuming subscription from",s,"from",a);let p=vs.getMatch(u,"mqtt");if(!p){let S=new Error(`The topic ${s} does not exist, no resource has been defined to handle this topic`);throw S.statusCode=404,S}m.url=p.relativeURL;let h;if(m.url.indexOf("+")>-1||(h=m.url.indexOf("#"))>-1){let S=m.url.slice(1);if(h--,h>-1&&h!==S.length-1)throw new Error("Multi-level wildcards can only be used at the end of a topic");if(m.isCollection=!0,S.indexOf("+")===S.length-1)m.onlyChildren=!0,m.url="/"+S.slice(0,S.length-1);else{let y=S.split("/"),C;for(let J=0;J<y.length;J++)if(y[J].indexOf("+")>-1)if(y[J]==="+")C=!0;else throw new Error("Single-level wildcards can only be used as a topic level (between or after slashes)");if(n&&C)throw new Error("Filters can not be combined");let I=!0;y[y.length-1]==="#"&&(y.length--,I=!1),C&&(n=o(J=>{let G=J.id;if(!Array.isArray(G))if(G?.indexOf?.("/")>-1)G=G.split("/");else return!1;if(I&&G.length!==y.length)return!1;for(let H=0;H<y.length;H++)if(y[H]!=="+"&&y[H]!==G[H])return!1;return!0},"filter"));let k=y.indexOf("+");m.url="/"+(k>-1?y.slice(0,k):y).concat("").join("/")}}else m.isCollection=!1;let E=p.path,g=p.Resource,R=await bt(m,async()=>{let S=this.createContext();S.topic=s,S.retainHandling=i,S.isCollection=m.isCollection;let y=await g.subscribe(m,S);if(!y)return;if(!y[Symbol.asyncIterator])throw new Error(`Subscription is not (async) iterable for topic ${s}`);let C=(async()=>{for await(let I of y)try{let k;if(I.type&&I.type!=="put"&&I.type!=="delete"&&I.type!=="message"&&I.type!=="patch"||n&&!n(I))continue;r?(I.topic=s,k=this.needsAcknowledge(I)):(I.acknowledge?.(),k=CD());let J=I.id;if(Array.isArray(J)&&(J=Yu(J)),J==null&&(J=""),await this.listener(E+"/"+J,I.value,k,t)===!1)break;this.awaitingAcks?.size>F2?await new Promise(H=>setTimeout(H,this.awaitingAcks.size-F2)):await new Promise(setImmediate)}catch(k){(0,xc.warn)(k)}})();return y});if(R)return R.topic=s,R.qos=t.qos,this.subscriptions.push(R),R}resume(){}needsAcknowledge(t){let r=CD();return t.acknowledge&&(this.awaitingAcks||(this.awaitingAcks=new Map),this.awaitingAcks.set(r,{acknowledge:t.acknowledge})),r}acknowledge(t){let r=this.awaitingAcks?.get(t);r&&(this.awaitingAcks.delete(t),r.acknowledge())}async removeSubscription(t){let r=this.subscriptions.find(n=>n.topic===t);if(r)return r.end(),this.subscriptions.splice(this.subscriptions.indexOf(r),1),!0}async publish(t,r){return OD(t,r,this.createContext())}createContext(){let t={session:this,socket:this.socket,user:this.user,authorize:!0};return this.request&&(t.request=this.request,t.url=this.request.url,t.headers=this.request.headers),t}setListener(t){this.listener=t}disconnect(t){this.keepaliveTimer&&clearTimeout(this.keepaliveTimer);let r=this.createContext();bt(r,async()=>{try{if(!t){let n=await bE.get(this.sessionId);n?.doesExist()&&await OD(n,n.data,r)}}finally{await bE.delete(this.sessionId)}}).catch(n=>{(0,xc.warn)(`Error publishing MQTT will for ${this.sessionId}`,n)});for(let n of this.subscriptions)n.end();this.subscriptions=[]}receivedPacket(){this.keepalive&&(clearTimeout(this.keepaliveTimer),this.keepaliveTimer=setTimeout(()=>{this.socket?.destroy?this.socket.destroy(new Error("Keepalive timeout")):this.socket?.terminate()},this.keepalive*1500))}};o(OD,"publish");PD=class extends ER{static{o(this,"DurableSubscriptionsSession")}sessionRecord;constructor(t,r,n){super(t,r),this.sessionRecord=n||{id:t,subscriptions:[]}}async resume(){for(let t of this.sessionRecord.subscriptions||[])await this.resumeSubscription({omitCurrent:!0,topic:t.topic,qos:t.qos,startTime:t.startTime},!0,t.acks?r=>!t.acks.includes(r.localTime):null)}resumeSubscription(t,r,n){return super.addSubscription(t,r,n)}needsAcknowledge(t){this.awaitingAcks||(this.awaitingAcks=new Map);let r=CD(),n={topic:t.topic,timestamp:t.localTime};return t.acknowledge&&(n.acknowledge=t.acknowledge),this.awaitingAcks.set(r,n),r}acknowledge(t){let r=this.awaitingAcks?.get(t);if(!r)return;this.awaitingAcks?.delete(t),r.acknowledge?.();let n=r.topic;for(let[,s]of this.awaitingAcks)if(s.topic===n&&s.timestamp<r.timestamp){for(let i of this.sessionRecord.subscriptions)if(i.topic===n){i.acks||(i.acks=[]),i.acks.push(r.timestamp),(0,xc.trace)("Received ack",n,r.timestamp),this.sessionRecord.update();return}}for(let s of this.sessionRecord.subscriptions)s.topic===n&&(s.startTime=r.timestamp);this.sessionRecord.update()}async addSubscription(t,r){await this.resumeSubscription(t,r);let{qos:n,startTime:s}=t;return n>0&&!s&&this.saveSubscriptions(),t.qos}removeSubscription(t){let r=this.subscriptions.find(s=>s.topic===t),n=super.removeSubscription(t);return r.qos>0&&this.saveSubscriptions(),n}saveSubscriptions(){this.sessionRecord.subscriptions=this.subscriptions.map(t=>{let r=t.startTime;return r||(r=t.startTime=(0,k2.getNextMonotonicTime)()),(0,xc.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),ND.put(this.sessionRecord)}}});var LD={};Re(LD,{bypassAuth:()=>Bbe,start:()=>kbe});function Bbe(){Q2=!0}function kbe({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new j2.EventEmitter},e.mqtt.events.on("error",()=>{}));let a=e.mqtt,c=[],l=r?.mtls;return n&&(c=e.ws((u,d,f,m)=>{if(d.headers.get("sec-websocket-protocol")!=="mqtt")return m(u,d,f);a.events.emit("connection",u),er.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:p,onClose:h}=K2(u,E=>{u.send(E)},d,Promise.resolve(f).then(()=>d?.user),a);u.on("message",p),u.on("close",h),u.on("error",E=>{er.info?.("WebSocket error",E)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(a.events.emit("connection",u),er.debug?.(`Received ${u.getCertificate?"SSL":"TCP"} connection for MQTT from ${u.remoteAddress}`),l){if(u.authorized)try{let p=u.getPeerCertificate(!0);if(p?.subject){let E=await Kd(p,l);if(!E.valid)throw er.error?.("Certificate verification failed:",E.status,"for",p.subject.CN),new Error("Certificate revoked or verification failed")}let h=l.user;if(h!==null){(h===void 0||h==="Common Name"||h==="CN")&&(h=u.getPeerCertificate().subject.CN);try{d=await e.getUser(h,null,null),(0,qf.get)(F.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&gR.notify?.({username:d?.username,status:si.SUCCESS,type:La.AUTHENTICATION,authStrategy:"MQTT mTLS",remoteAddress:u.remoteAddress})}catch(E){throw(0,qf.get)(F.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&gR.error?.({username:h,status:si.FAILURE,type:La.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:u.remoteAddress}),E}}else er.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(p){a.events.emit("error",p,u),er.error?.(p)}else if(l.required)return er.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&Fbe(u.remoteAddress)&&(d=await(0,Y2.getSuperUser)(),er.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:f,onClose:m}=K2(u,p=>u.write(p),null,d,a);u.on("data",f),u.on("close",m),u.on("error",p=>{er.info?.("Socket error",p)})},{port:t,securePort:s,mtls:l})),c}function K2(e,t,r,n,s){V2||(V2=!0,Fm(f=>{_R>0&&f.push({metric:"mqtt-connections",connections:_R,byThread:!0})}));let i;_R++;let a,c={protocolVersion:4},l=(0,SR.parser)({protocolVersion:5});function u(f){l.parse(f)}o(u,"onMessage");function d(){_R--,i||(i=!0,a?.disconnect?.(),s.events.emit("disconnected",a,e),s.sessions.delete(a),Zr(!1,"connection","mqtt","disconnect"),er.debug?.("MQTT connection was closed",e.remoteAddress))}return o(d,"onClose"),l.on("packet",async f=>{try{n?.then&&(n=await n)}catch(y){e.close?.(1008,"Unauthorized"),er.info?.(y);return}let m=f.cmd;if(a)a.then&&await a;else if(m!=="connect"){er.info?.("Received packet before connection was established, closing connection"),e?.destroy?e.destroy():e?.terminate();return}let p=f.topic,h=p?.indexOf("/",1),E=h>0?p.slice(0,h):p;Ve(f.length,"bytes-received",E,R(f),"mqtt");try{switch(a?.receivedPacket?.(),m){case"connect":if(c.protocolVersion=f.protocolVersion,f.username)try{n=await ve.getUser(f.username,f.password.toString(),r),(0,qf.get)(F.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&gR.notify?.({username:n?.username,status:si.SUCCESS,type:La.AUTHENTICATION,authStrategy:"MQTT",remoteAddress:e.remoteAddress})}catch(X){return(0,qf.get)(F.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&gR.error?.({username:f.username,status:si.FAILURE,type:La.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:e.remoteAddress}),s.events.emit("auth-failed",f,e,X),Zr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:4,returnCode:134})}if(!n&&s.requireAuthentication)return s.events.emit("auth-failed",f,e),Zr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:4,returnCode:134});try{if(s.authorizeClient?.(f,n),f.will){let X=e.deserialize||(e.deserialize=Lo(r?.headers.get?.("content-type")));f.will.data=f.will.payload?.length>0?X(f.will.payload):void 0,delete f.will.payload}a=q2({user:n,...f}),a=await a,a.socket=e,r&&(a.request=r),s.sessions.add(a)}catch(X){return er.error?.(X),s.events.emit("auth-failed",f,e,X),Zr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:X.code||5,returnCode:X.code||128})}s.events.emit("connected",a,e),Zr(!0,"connection","mqtt","connect"),g({cmd:"connack",sessionPresent:a.sessionWasPresent,reasonCode:0,returnCode:0});let y=o(async(X,W,ue,ce)=>{try{if(i)throw new Error("Session disconnected while trying to send message to",X);let te=X.indexOf("/",1),ye=te>0?X.slice(0,te):X;g({cmd:"publish",topic:X,payload:await S(W),messageId:ue||Math.floor(Math.random()*1e8),qos:ce.qos},ye);let Ae=e._socket??e;return Ae.writableNeedDrain?new Promise(Ye=>Ae.once("drain",Ye)):!Ae.closed}catch(te){return er.error?.(te),a?.disconnect(),s.sessions.delete(a),!1}},"listener");a.setListener(y),a.sessionWasPresent&&await a.resume();break;case"subscribe":let C=[];for(let X of f.subscriptions){let W;try{let ue=await a.addSubscription(X,X.qos>=1);W=ue?ue.qos||0:c.protocolVersion<5?128:143}catch(ue){s.events.emit("error",ue,e,X,a),ue.statusCode?ue.statusCode===500?er.warn?.(ue):er.info?.(ue):er.error?.(ue),W=c.protocolVersion<5?128:ue.statusCode===403?135:ue.statusCode===404?143:128}C.push(W)}await a.committed,g({cmd:"suback",granted:C,messageId:f.messageId});break;case"unsubscribe":{let X=[];for(let W of f.unsubscriptions)X.push(a.removeSubscription(W)?0:17);g({cmd:"unsuback",granted:X,messageId:f.messageId});break}case"pubrel":g({cmd:"pubcomp",messageId:f.messageId,reasonCode:0});return;case"publish":let I=f.qos===2?"pubrec":"puback",k=e.deserialize||(e.deserialize=Lo(r?.headers.get?.("content-type"))),G=(f.payload?.length||0)>0?k(f.payload):void 0,H;try{H=await a.publish(f,G)}catch(X){s.events.emit("error",X,e,f,a),er.warn?.(X),f.qos>0&&g({cmd:I,messageId:f.messageId,reasonCode:128},f.topic);break}f.qos>0&&g({cmd:I,messageId:f.messageId,reasonCode:H===!1?144:0},f.topic);break;case"pubrec":g({cmd:"pubrel",messageId:f.messageId,reasonCode:0});break;case"pubcomp":case"puback":a.acknowledge(f.messageId);break;case"pingreq":g({cmd:"pingresp"});break;case"disconnect":i=!0,a?.disconnect(!0),s.events.emit("disconnected",a,e),s.sessions.delete(a),Zr(!0,"connection","mqtt","disconnect"),er.debug?.("Received disconnect command, closing MQTT session",e.remoteAddress),e.close?e.close():e.end();break}}catch(y){s.events.emit("error",y,e,f,a),er.error?.(y),g({cmd:"disconnect"})}function g(y,C){let I=(0,SR.generate)(y,c);t(I),Ve(I.length,"bytes-sent",C,R(y),"mqtt")}o(g,"sendPacket");function R(y){return y.qos>0?y.cmd+",qos="+y.qos:y.cmd}o(R,"packetMethodName");function S(y){return Po(y,r)}o(S,"serialize")}),l.on("error",f=>{er.warn("MQTT parsing error, closing connection:",f.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var SR,Y2,qf,W2,z2,j2,gR,er,Q2,Fbe,V2,_R,J2=se(()=>{SR=require("mqtt-packet");$2();Y2=b(fs());Do();ts();Fr();qf=b(me());q();W2=b(Zn()),z2=b(Q()),j2=require("events");sT();gR=(0,W2.loggerWithTag)("auth-event"),er=(0,z2.forComponent)("mqtt"),Q2=(0,qf.get)(F.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;o(Bbe,"bypassAuth");Fbe=o(e=>Q2&&(e.includes("127.0.0.")||e==="::1"),"authorizeLocal");o(kbe,"start");_R=0;o(K2,"onSocket")});function TR(e,t){if(t?.includes(".."))throw new DD(t);let r=t||"/";return(r==="."||r.startsWith("./"))&&(r=`/${e}${r.slice(1)}`),r.startsWith("/")||(r=`/${r}`),r.endsWith("/")||(r=`${r}/`),r}var DD,MD=se(()=>{DD=class extends Error{static{o(this,"InvalidBaseURLPathError")}constructor(t){super(`urlPath must not contain '..'. Received: '${t}'`)}};o(TR,"resolveBaseURLPath")});function X2(e){if(e.length===0)return".";if(e.length===1)return e[0];let t=e.map(s=>s.split("/")),r=Math.min(...t.map(s=>s.length)),n=[];for(let s=0;s<r;s++){let i=t[0][s];if(t.every(a=>a[s]===i))n.push(i);else break}return n.length===0?".":n.join("/")}var Z2=se(()=>{o(X2,"deriveCommonPatternBase")});function yR(e){let t={source:[],onlyFiles:!1,onlyDirectories:!1,ignore:[]},r=o((n,s)=>{typeof s=="string"?n.push(s):Array.isArray(s)&&n.push(...s)},"addToArray");return typeof e=="string"||Array.isArray(e)?r(t.source,e):(r(t.source,e.source),r(t.ignore,e.ignore),t.onlyFiles=e.only==="files",t.onlyDirectories=e.only==="directories"),t}var vD=se(()=>{o(yR,"deriveGlobOptions")});var eJ,UD,AE,tJ=se(()=>{MD();Z2();vD();eJ=require("micromatch"),UD=class extends Error{static{o(this,"ComponentInvalidPatternError")}constructor(t){super(`Config 'files' option glob pattern must not contain '..' or start with '/'. Received: '${t}'`),this.name="ComponentInvalidPatternError"}},AE=class{static{o(this,"Component")}globOptions;baseURLPath;patternBases;directory;name;config;commonPatternBase;constructor(t,r,n){this.name=t,this.directory=r,this.config=n,this.baseURLPath=TR(this.name,this.config.urlPath),this.globOptions=yR(this.config.files),this.globOptions.source=this.globOptions.source.map(s=>{if(s.includes("..")||s.startsWith("/"))throw new UD(s);return s==="."||s==="./"?"**/*":s}),this.patternBases=this.globOptions.source.map(s=>(0,eJ.scan)(s).base),this.commonPatternBase=X2(this.patternBases)}}});function rJ(e,t){return new RegExp(`^${e}(/|$)`).test(t)}function uu(e,t,r){t.startsWith("./")&&(t=t.slice(2));for(let n of e.patternBases)if(n.startsWith("./")&&(n=n.slice(2)),n!==""){if(r==="file"){if(t===n){let s=t.split("/");t=s[s.length-1];break}else if(rJ(n,t)){t=t.slice(n.length+1);break}}if(r==="directory"){if(t===n){t="";break}else if(rJ(n,t)){t=t.slice(n.length+1);break}}}return(0,nJ.join)(e.baseURLPath,t)}var nJ,xD=se(()=>{nJ=require("node:path");o(rJ,"pathStartsWithBase");o(uu,"deriveURLPath")});function sJ(e){return typeof e=="string"||Array.isArray(e)||!("files"in e)?{files:e}:e}var bR,iJ,oJ,BD,aJ,cJ,RR,lJ=se(()=>{bR=require("node:events");tJ();iJ=b(Q()),oJ=b(require("chokidar")),BD=require("node:path"),aJ=require("node:fs/promises");xD();cJ=require("micromatch"),RR=class extends bR.EventEmitter{static{o(this,"EntryHandler")}#e;#t;#r;ready;constructor(t,r,n,s){super(),this.#e=new AE(t,r,sJ(n)),this.#r=s||iJ.default.loggerWithTag(t),this.ready=(0,bR.once)(this,"ready"),this.#a()}get name(){return this.#e.name}get directory(){return this.#e.directory}#n(...[t,r,n]){if(r===""&&(r="/"),!(0,cJ.isMatch)(r,this.#e.globOptions.source,{ignore:this.#e.globOptions.ignore}))return;let s=(0,BD.join)(this.directory,r);switch(t){case"add":case"change":{let i=uu(this.#e,r,"file");(0,aJ.readFile)(s).then(a=>{let c={eventType:t,entryType:"file",contents:a,stats:n,absolutePath:s,urlPath:i};this.emit("all",c),this.emit(t,c)});break}case"unlink":{let i=uu(this.#e,r,"file"),a={eventType:t,entryType:"file",stats:n,absolutePath:s,urlPath:i};this.emit("all",a),this.emit(t,a);break}case"addDir":case"unlinkDir":{let i=uu(this.#e,r,"directory"),a={eventType:t,entryType:"directory",stats:n,absolutePath:s,urlPath:i};this.emit("all",a),this.emit(t,a);break}}}#s(t){this.emit("error",t)}#i(){this.emit("ready")}async#a(){await this.#t?.close(),this.#t=void 0;let t=this.#e.patternBases.map(r=>(0,BD.join)(this.#e.directory,r));return this.#t=oJ.default.watch(this.#e.commonPatternBase,{cwd:this.#e.directory,persistent:!1,ignored:o(r=>r!==this.#e.directory&&t.every(n=>!r.startsWith(n)),"ignored")}).on("all",this.#n.bind(this)).on("error",this.#s.bind(this)).on("ready",this.#i.bind(this)),this.ready}close(){return this.#t?.close(),this.#t=void 0,this.emit("close"),this.removeAllListeners(),this}update(t){return this.#e=new AE(this.name,this.directory,sJ(t)),this.#a()}};o(sJ,"castConfig")});var AR,FD=se(()=>{AR={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js"},static:{files:"web/**"}}});var wR,uJ,dJ,fJ,mJ,pJ,kD,HD,GD,qD,$D,IR,hJ=se(()=>{wR=require("events"),uJ=b(require("yaml")),dJ=b(require("chokidar")),fJ=require("node:fs/promises"),mJ=require("util"),pJ=b(Q());FD();kD=class extends Error{static{o(this,"OptionsWatcherConfigFileError")}constructor(t,r){super(`Error watching config file ${t}: ${typeof r=="object"&&r!==null&&"message"in r?r.message:r}`),this.name="OptionsWatcherConfigFileError"}},HD=class extends Error{static{o(this,"InvariantUninitializedOptionsWatcherError")}constructor(){super("Invariant: OptionsWatcher has not been initialized yet. This should never happen."),this.name="InvariantUninitializedOptionsWatcherError"}},GD=class extends Error{static{o(this,"InvalidValueTypeError")}constructor(t,r){super(`Invalid value type for key ${t.join(".")}. Expected object, string, array, number, boolean, or undefined. Received ${typeof r}.`),this.name="InvalidValueTypeError"}},qD=class extends Error{static{o(this,"KeyDoesNotExistError")}constructor(t,r){super(`Cannot set property ${t.join(".")} as ${r} does not exist.`),this.name="KeyDoesNotExistError"}},$D=class extends Error{static{o(this,"CannotSetPropertyError")}constructor(t){super(`Cannot set property ${t.join(".")} as parent is not an object.`),this.name="CannotSetPropertyError"}},IR=class extends wR.EventEmitter{static{o(this,"OptionsWatcher")}#e;#t;#r;#n;#s;#i;ready;constructor(t,r,n){super(),this.#s=t,this.#e=r,this.#i=n||pJ.default.loggerWithTag(t),this.ready=(0,wR.once)(this,"ready"),this.#t=dJ.default.watch(r,{persistent:!1}).on("add",this.#a.bind(this)).on("change",this.#a.bind(this)).on("error",this.#d.bind(this)).on("unlink",this.#c.bind(this)).on("ready",this.#a.bind(this))}#a(){(0,fJ.readFile)(this.#e,"utf-8").then(t=>{this.#n=uJ.default.parse(t),this.#n&&this.#s in this.#n?this.#r?this.#f(this.#n[this.#s],this.#r):(this.#r=this.#n[this.#s],this.emit("ready",this.#r)):this.#r&&(this.#r=void 0,this.emit("remove"))}).catch(t=>{if(t instanceof Error&&"code"in t&&t.code==="ENOENT"){this.#n?(this.#o(),this.emit("remove")):(this.#o(),this.emit("ready"));return}this.emit("error",t)})}#d(t){this.emit("error",new kD(this.#e,t))}#c(t){this.#i.warn(`Configuration file ${t} was deleted. Reverting to default configuration. Recreate it to restore the options watcher.`),this.#o(),this.emit("remove")}#o(){this.#n=AR,this.#r=this.#n[this.#s]}#f(t,r,n=[]){if(!this.#l(r)||!this.#l(t)){this.#u(n,t);return}for(let s of Object.keys(r))s in t||this.#u(n.concat(s),void 0);for(let[s,i]of Object.entries(t)){let a=n.concat(s),c=this.#m(a);if(typeof i!=typeof c||Array.isArray(i)&&!Array.isArray(c)||!Array.isArray(i)&&Array.isArray(c)){this.#u(a,i);continue}if(!Array.isArray(i)&&typeof i=="object"&&i!==null){this.#l(c)?this.#f(i,c,a):this.#u(a,i);continue}(0,mJ.isDeepStrictEqual)(i,c)||this.#u(a,i)}}#l(t){return typeof t=="object"&&t!==null&&t!==void 0&&!Array.isArray(t)}#m(t){let r=this.#r;for(let n of t){if(r==null||typeof r!="object"||!(n in r))return;r=r[n]}return structuredClone(r)}#u(t,r){if(!this.#r)throw new HD;if(!["object","string","array","number","boolean","undefined"].includes(typeof r))throw new GD(t,r);let n=this.#r;for(let s of t.slice(0,-1)){if(n==null||typeof n!="object"||!(s in n))throw new qD(t,s);n=n[s]}if(n==null||typeof n!="object")throw new $D(t);n[t[t.length-1]]=r,this.emit("change",t,r,this.#r)}close(){return this.#t.close(),this.emit("close"),this.removeAllListeners(),this}get(t){return this.#r?this.#m(t):void 0}getAll(){return structuredClone(this.#r)}getRoot(){return this.#n}}});var OR,EJ,NR,CR,_J=se(()=>{OR=require("node:events");lJ();hJ();EJ=b(Q());dL();NR=class extends Error{static{o(this,"MissingDefaultFilesOptionError")}constructor(){super("No default files option exists. Ensure `files` is specified in config.yaml"),this.name="MissingDefaultFilesOptionError"}},CR=class extends OR.EventEmitter{static{o(this,"Scope")}#e;#t;#r;#n;#s;#i;options;resources;server;ready;constructor(t,r,n,s,i){super(),this.#r=t,this.#t=r,this.#e=n,this.#i=(0,EJ.loggerWithTag)(this.#r),this.resources=s,this.server=i,this.#s=[],this.ready=(0,OR.once)(this,"ready"),this.options=new IR(t,n,this.#i).on("error",this.#d.bind(this)).on("change",this.#f.bind(this)()).on("ready",this.#a.bind(this))}get logger(){return this.#i}get name(){return this.#r}get directory(){return this.#t}#a(){this.emit("ready")}#d(t){this.emit("error",t)}close(){for(let t of this.#s)t.close();return this.options.close(),this.emit("close"),this.removeAllListeners(),this}#c(t){let r=new RR(this.#r,this.#t,t,this.#i).on("error",this.#d.bind(this)).on("add",this.#o("add")).on("change",this.#o("change")).on("unlink",this.#o("unlink")).on("addDir",this.#o("addDir")).on("unlinkDir",this.#o("unlinkDir"));return this.#s.push(r),r}#o(t){let r=this;return function(){this.listenerCount("all")>0||this.listenerCount(t)>1||r.requestRestart()}}#f(){let t=this;return o(function(...[n,s,i]){if(n[0]==="files"||n[0]==="urlPath"){if(!t.#n){t.#n=t.#c(i);return}t.#n.update(i);return}this.listenerCount("change")>1||(t.#i.debug(`Options changed: ${n.join(".")}, requesting restart`),t.requestRestart())},"handleOptionsWatcherChange")}#l(){let t=this.options.getAll();if(t&&typeof t=="object"&&t!==null&&!Array.isArray(t)&&"files"in t)return t.files}handleEntry(t,r){if(t===void 0){if(this.#n)return this.#n;let s=this.#l();if(s)return this.#n=this.#c(s),this.#n;this.emit("error",new NR);return}if(typeof t=="function"){if(this.#n)return this.#n.on("all",t);let s=this.#l();if(s)return this.#n=this.#c(s),this.#n.on("all",t);this.emit("error",new NR);return}let n=this.#c(t);return r?n.on("all",r):n}requestRestart(){this.#i.debug(`Restart requested from ${this.name} scope for ${this.directory}`),Uj()}}});function du(e){return typeof e=="string"&&e.trim()!==""}function VD(e){return Array.isArray(e)&&e.length!==0&&e.every(t=>du(t))}function yJ(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Hbe(e){e.config.root&&IE.default.warn("Resource extension 'root' option is deprecated. Due to backwards compatibility reasons it does not act as assumed. The glob pattern will always be evaluated from the component directory root. The option is only used for the initial root directory handling. Please remove and modify the 'files' glob pattern instead.");let t=[];if(e.config.root&&typeof e.config.files!="string")throw new JD(e);let r=e.config.root;r&&(r.startsWith("/")&&(r=r.slice(1)),r.endsWith("/")||(r+="/"));let n=e.config.files;if(typeof n=="string"&&!n.includes("**/*")&&(n.indexOf("/*")>-1?r=n.slice(0,n.indexOf("/*")+1):n.indexOf("/")>-1&&(r=n.slice(0,n.lastIndexOf("/")+1))),r&&t.push(r),t.length===0){if(yJ(e.config.files)&&e.config.files.only==="files")return!1;t=e.patternBases}let s=!1;for(let i of t){let a=(0,wE.join)(e.directory,i);PR.isMainThread&&e.module.setupDirectory&&(s=await e.module.setupDirectory(e.baseURLPath,a,e.resources)),e.resources.isWorker&&e.module.handleDirectory&&(s=await e.module.handleDirectory(e.baseURLPath,a,e.resources))}return s}async function RJ(e){let t=!1;if(t=await Hbe(e),t)return t;let r=await(0,gJ.default)(e.globOptions.source,{cwd:e.directory,objectMode:!0,onlyFiles:e.globOptions.onlyFiles,onlyDirectories:e.globOptions.onlyDirectories,ignore:e.globOptions.ignore});for(let n of r){let s=(0,wE.join)(e.directory,n.path);if(n.dirent.isDirectory()){let i=uu(e,n.path,"directory");PR.isMainThread&&e.module.setupDirectory&&(await e.module.setupDirectory(i,s,e.resources),t=!0),e.resources.isWorker&&e.module.handleDirectory&&(await e.module.handleDirectory(i,s,e.resources),t=!0)}else if(n.dirent.isFile()){let i=uu(e,n.path,"file"),a=await(0,SJ.readFile)(s);PR.isMainThread&&e.module.setupFile?(await e.module.setupFile(a,i,s,e.resources),t=!0):e.resources.isWorker&&e.module.handleFile&&(await e.module.handleFile(a,i,s,e.resources),t=!0)}else IE.default.error(`Entry received from glob pattern match for component ${e.name} is neither a file nor a directory:`,n)}return t}var PR,gJ,IE,wE,SJ,TJ,LR,Li,KD,YD,WD,zD,jD,QD,JD,XD,ZD,bJ=se(()=>{PR=require("node:worker_threads"),gJ=b(require("fast-glob")),IE=b(Q());MD();vD();wE=require("node:path"),SJ=require("node:fs/promises");xD();TJ=require("micromatch"),LR=class{static{o(this,"ComponentV1")}config;name;directory;module;resources;globOptions;patternBases;baseURLPath;constructor(t){if(this.config=t.config,this.name=t.name,this.directory=t.directory,this.module=t.module,this.resources=t.resources,!du(this.config.files)&&!VD(this.config.files)&&!yJ(this.config.files))throw new KD(this);if(typeof this.config.files=="object"&&!Array.isArray(this.config.files)){if(this.config.files.source===void 0||!VD(this.config.files.source)&&!du(this.config.files.source))throw new YD(this);if(this.config.files.only!==void 0&&(typeof this.config.files.only!="string"||!["all","files","directories"].includes(this.config.files.only)))throw new WD(this);if(this.config.files.ignore!==void 0&&!VD(this.config.files.ignore)&&!du(this.config.files.ignore))throw new zD(this)}if(this.config.root!==void 0&&!du(this.config.root))throw new QD(this);if(this.config.path!==void 0&&!du(this.config.path))throw new XD(this);if(this.config.path&&(IE.default.warn("Resource extension 'path' option is deprecated. Please replace with 'urlPath'."),this.config.urlPath=this.config.path),this.config.urlPath!==void 0&&(!du(this.config.urlPath)||typeof this.config.urlPath=="string"&&this.config.urlPath.includes("..")))throw new ZD(this);this.globOptions=yR(this.config.files),this.globOptions.source=this.globOptions.source.map(r=>{if(r.includes(".."))throw new jD(this,r);return r.startsWith("/")&&(IE.default.warn("Leading '/' in 'files' glob pattern is deprecated. For backwards compatibility purposes, it is currently transformed to the relative path of the component, but in the future will result in an error. Paths are automatically derived from the root of the component directory. Please remove (e.g. '/web/*' -> 'web/*')."),r=r==="/"?".":r.slice(1)),r}),this.patternBases=this.globOptions.source.map(r=>(0,TJ.scan)(r).base),this.baseURLPath=TR(this.name,this.config.urlPath)}},Li=class extends Error{static{o(this,"ComponentV1ProcessingError")}constructor(t,r){super(`Component ${r.name} (from ${(0,wE.basename)(r.directory)}) ${t}`)}},KD=class extends Li{static{o(this,"InvalidFilesOptionError")}constructor(t){super("'files' option must be a non-empty string, an array of non-empty strings, or an object.",t)}},YD=class extends Li{static{o(this,"InvalidFilesSourceOptionError")}constructor(t){super("'files' object must have a non-empty 'source' property.",t)}},WD=class extends Li{static{o(this,"InvalidFilesOnlyOptionError")}constructor(t){super("'files.only' option must be one of 'all', 'files', or 'directories'.",t)}},zD=class extends Li{static{o(this,"InvalidFileIgnoreOptionError")}constructor(t){super("'files.ignore' option must be a non-empty string or an array of non-empty strings.",t)}},jD=class extends Li{static{o(this,"InvalidGlobPattern")}constructor(t,r){super(`'files' glob pattern must not contain '..'. Received: '${r}'`,t)}},QD=class extends Li{static{o(this,"InvalidRootOptionError")}constructor(t){super("deprecated 'root' option must be a non-empty string. Consider removing and updating 'files' glob pattern instead.",t)}},JD=class extends Li{static{o(this,"InvalidRootOptionUseError")}constructor(t){super("the 'root' option is deprecated and only supported if 'files' is a singular, non-empty string. Please remove the 'root' option and modify the 'files' glob pattern instead.",t)}},XD=class extends Li{static{o(this,"InvalidPathOptionError")}constructor(t){super("deprecated 'path' option must be a non-empty string. Consider replacing with 'urlPath'.",t)}},ZD=class extends Li{static{o(this,"InvalidURLPathOptionError")}constructor(t){super("'urlPath' option must be a non-empty string that must not contain '..'.",t)}};o(du,"isNonEmptyString");o(VD,"isArrayOfNonEmptyStrings");o(yJ,"isObject");o(Hbe,"handleRoots");o(RJ,"processResourceExtensionComponent")});var _y={};Re(_y,{getComponentName:()=>py,loadComponent:()=>UR,loadComponentDirectories:()=>NJ,setErrorReporter:()=>qbe});function NJ(e,t){t&&(tM=t),e&&(iM=e);let r=[];if((0,Vt.existsSync)(eM)){let s=(0,Vt.readdirSync)(eM,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let a=i.name,c=(0,Vr.join)(eM,a);r.push(UR(c,tM,pb,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(UR(n,tM,n,!1,void 0,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{wJ=!0})}function qbe(e){MR=e}function $be(e){return new Promise((t,r)=>{let n=setTimeout(()=>{Ea.primaryStore.unlock(e,0),r(new Error("symlinking harperdb module timed out"))},1e4);if(Ea.primaryStore.attemptLock(e,0,()=>{clearTimeout(n),t()}))try{let s=(0,Vr.join)(e,"node_modules");(0,Vt.existsSync)(s)||(0,Vt.mkdirSync)(s);let i=(0,Vr.join)(s,"harperdb");if((0,Vt.existsSync)(i)){if((0,Vt.realpathSync)(i)===(0,Vt.realpathSync)(sM.PACKAGE_ROOT))return t();(0,Vt.rmSync)(i,{recursive:!0,force:!0})}(0,Vt.symlinkSync)(sM.PACKAGE_ROOT,i,"dir"),t()}finally{Ea.primaryStore.unlock(e,0)}})}function CJ(e,t){return e.ready.then(()=>{let r=e.options.get(["timeout"])||t.defaultTimeout||3e4;if(typeof r!="number")throw new Error(`Invalid timeout value for ${e.name}. Expected a number, received: ${typeof r}`);let n,s;return Ea.primaryStore.attemptLock(e.name,0,()=>{clearTimeout(s),n(CJ(e,t))})?Promise.race([t.handleApplication(e),new Promise((i,a)=>setTimeout(()=>a(new Error(`handleApplication timed out after ${r}ms for ${e.name}`)),r))]).finally(()=>{Ea.primaryStore.unlock(e.name,0)}):new Promise((i,a)=>{n=i,s=setTimeout(()=>{a(new Error(`Timeout waiting for lock on ${e.name}`))},r+5e3)})})}async function UR(e,t,r,n,s,i){let a=(0,Vt.realpathSync)(e);if(DR.has(a))return DR.get(a);DR.set(a,!0),s&&(iM=s);try{let c,l=(0,Vr.join)(e,"harperdb-config.yaml");if((0,Vt.existsSync)(l)?c=n?(0,xR.getConfigObj)():(0,nM.parseDocument)((0,Vt.readFileSync)(l,"utf8")).toJSON():!n&&(0,Vt.existsSync)(l=(0,Vr.join)(e,"config.yaml"))?c=(0,nM.parseDocument)((0,Vt.readFileSync)(l,"utf8")).toJSON():c=AR,!n)try{await $be(e)}catch(m){Ra.default.error("Error symlinking harperdb module",m),m.code=="EPERM"&&process.platform==="win32"&&Ra.default.error('You may need to enable developer mode in "Settings" / "System" (or "Update & Security") / "For developers", in order to enable symlinks so components can use `import from "harperdb"`')}let u=vR,d={};for(let m in c){let p=n?m:`${(0,Vr.basename)(e)}.${m}`;vR=m;let h=c[m];if(!h)continue;ro.loading(p);let E,g=h.package;try{if(g){let I=null;if(n)I=(0,Vr.join)(e,"components",m);else{let k=e;for(I=(0,Vr.join)(k,"node_modules",m);!(0,Vt.existsSync)(I);){if(k=(0,Vr.dirname)(k),k.length<(0,IJ.getHdbBasePath)().length){I=null;break}I=(0,Vr.join)(k,"node_modules",m)}}if(I)E=await UR(I,t,r,!1),d[m]=!0;else throw new Error(`Unable to find package ${m}:${g}`)}else E=Gbe[m];if(!E){ro.loaded(p,`Application component '${p}' processed`);continue}let R=o(I=>(I.origin=r,Ze(I)),"ensureTable"),S=h.network||(h.port||h.securePort)&&h,y=S?.securePort||S?.https&&S.port,C=!S?.https&&S?.port;if("handleApplication"in E&&("start"in E||"startOnMainThread"in E||"handleFile"in E||"handleDirectory"in E||"setupFile"in E||"setupDirectory"in E)){let I=new Error(`Plugin ${m} is exporting old extension APIs. Remove them.`);throw ro.failed(p,I,`Component '${p}' failed to load`),I}if(t.isWorker&&E.handleApplication){E.suppressHandleApplicationWarning!==!0&&Ra.default.warn(`Plugin ${m} is using the experimental handleApplication API`);let I=new CR(m,e,l,t,ve);await CJ(I,E),ro.loaded(p,`Component '${p}' loaded successfully`);continue}if(rM.isMainThread&&(E=await E.startOnMainThread?.({server:ve,ensureTable:R,port:C,securePort:y,resources:t,...h})||E,n&&S))for(let I of[C,y])try{if(+I&&!AJ.includes(I)){let k=oM.get(F.HTTP_SESSIONAFFINITY);k&&Ra.default.warn("Session affinity is not recommended and may cause memory leaks"),(k||!hS)&&(AJ.push(I),MP(I,k))}}catch(k){console.error("Error listening on socket",I,k,m)}if(t.isWorker&&(E=await E.start?.({server:ve,ensureTable:R,port:C,securePort:y,resources:t,...h})||E),iM.set(E,!0),(E.handleFile||E.handleDirectory||E.setupFile||E.setupDirectory)&&h.files!=null){let I=new LR({config:h,name:m,directory:e,module:E,resources:t});d[m]=await RJ(I)}ro.loaded(p,`Component '${p}' loaded successfully`)}catch(R){R.message=`Could not load component '${m}' for application '${(0,Vr.basename)(e)}' due to: ${R.message}`,MR?.(R),((0,NE.getWorkerIndex)()===0?console:Ra.default).error(R),t.set(h.path||"/",new il(R),null,!0),ro.failed(p,R,`Could not load component '${p}'`)}}if(vR=u,rM.isMainThread&&!wJ&&i&&(0,NE.watchDir)(e,async()=>NJ()),c.extensionModule||c.pluginModule){let m=await fS((0,Vr.join)(e,c.extensionModule||c.pluginModule));return DR.set(a,m),m}let f=Object.values(d);if(f.length>0&&f.every(m=>!m)&&t.isWorker){let m=`${e} did not load any modules, resources, or files, is this a valid component?`;MR?.(new Error(m)),((0,NE.getWorkerIndex)()===0?console:Ra.default).error(m),ro.failed((0,Vr.basename)(e),m)}for(let[m,p]of Object.entries(d))p||Ra.default.warn(`Component ${m} from (${(0,Vr.basename)(e)}) did not load any functionality.`)}catch(c){console.error(`Could not load application directory ${e}`,c),c.message=`Could not load application due to ${c.message}`,MR?.(c),t.set("",new il(c))}}var Vt,Vr,rM,nM,oM,sM,Ra,NE,IJ,xR,eM,iM,wJ,tM,Gbe,AJ,DR,MR,vR,py,kh=se(()=>{Vt=require("node:fs"),Vr=require("node:path"),rM=require("node:worker_threads"),nM=require("yaml"),oM=b(me()),sM=b(Ct());q();kG();jG();lq();hq();Eq();Lq();c2();l2();d2();Ra=b(Q());_2();NE=b(nt());SN();Fr();we();UP();IJ=b(me());O2();Ny();B2();hs();J2();xR=b(St());Gp();UA();_J();bJ();NP();eE();Rp();FD();eM=(0,xR.resolvePath)(oM.get(F.COMPONENTSROOT)),iM=new Map;o(NJ,"loadComponentDirectories");Gbe={REST:_S,rest:_S,graphql:dN,graphqlSchema:lN,roles:gN,jsResource:TN,fastifyRoutes:hD,login:RN,static:_D,operationsApi:TD,customFunctions:{},http:my,clustering:wD,replication:jo,authentication:Kh,mqtt:LD,loadEnv:gD,logging:Ra.default,dataLoader:SD},AJ=[],DR=new Map;o(qbe,"setErrorReporter");py=o(()=>vR,"getComponentName");o($be,"symlinkHarperModule");o(CJ,"sequentiallyHandleApplication");o(UR,"loadComponent")});var gy=v((xGe,OJ)=>{var{isMainThread:aM}=require("worker_threads"),{getTables:Vbe}=(we(),M(ft)),{loadComponentDirectories:Kbe,loadComponent:Ybe}=(kh(),M(_y)),{resetResources:Wbe}=(qa(),M(xA)),zbe=St(),{dirname:jbe}=require("path"),{getConnection:Qbe}=_r(),Jbe=me(),{CONFIG_PARAMS:Xbe}=(q(),M(z)),{loadCertificates:Zbe}=_s(),{installApplications:eAe}=(Ly(),M(Py)),{loadAndWatchLicensesDir:tAe}=(vh(),M(ay)),cM=new Map;async function rAe(e=!1){!aM&&Jbe.get(Xbe.CLUSTERING_ENABLED)&&Qbe();try{aM&&await eAe()}catch(n){console.error(n)}let t=Wbe();Vbe(),t.isWorker=e,aM&&tAe(),await Zbe(),await Ybe(jbe(zbe.getConfigFilePath()),t,"hdb",!0,cM),await Kbe(cM,t);let r=[];for(let[n]of cM)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}o(rAe,"loadRootComponents");OJ.exports.loadRootComponents=rAe});var nt=v((FGe,Mi)=>{"use strict";Rb();var{Worker:nAe,MessageChannel:sAe,parentPort:yo,isMainThread:mM,threadId:iAe,workerData:Ro}=require("worker_threads"),{PACKAGE_ROOT:oAe}=Ct(),{join:MJ,isAbsolute:aAe,extname:cAe}=require("path"),{server:vJ}=(Fr(),M(am)),{watch:lAe,readdir:uAe}=require("fs/promises"),{totalmem:PJ}=require("os"),$f=(q(),M(z)),UJ=me(),Di=Q(),{randomBytes:dAe}=require("crypto"),{_assignPackageExport:fAe}=ii(),LJ=1024*1024,ba=[],ti=[],mAe=50,pM=1e4,pAe="restart",xJ="request_thread_info",BJ="resource_report",FJ="thread_info",kJ="added-port",hAe="ack",lM;fAe("threads",ti);Mi.exports={startWorker:uM,restartWorkers:EM,shutdownWorkers:KJ,shutdownWorkersNow:TAe,workers:ba,setMonitorListener:CAe,onMessageFromWorkers:yAe,onMessageByType:WJ,broadcast:bAe,broadcastWithAcknowledgement:IAe,setChildListenerByType:SAe,getWorkerIndex:HJ,getWorkerCount:GJ,getTicketKeys:$J,setMainIsWorker:_Ae,setTerminateTimeout:EAe,restartNumber:Ro?.restartNumber||1};ti.onMessageByType=WJ;ti.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=ti.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};Mi.exports.whenThreadsStarted=new Promise(e=>{Mi.exports.threadsHaveStarted=e});var hM;function EAe(e){pM=e}o(EAe,"setTerminateTimeout");function HJ(){return Ro?Ro.workerIndex:hM?0:void 0}o(HJ,"getWorkerIndex");function GJ(){return Ro?Ro.workerCount:hM?1:void 0}o(GJ,"getWorkerCount");function _Ae(e){hM=e,Mi.exports.threadsHaveStarted()}o(_Ae,"setMainIsWorker");var qJ=1,BR;function $J(){return BR||(BR=mM?dAe(48):Ro.ticketKeys,BR)}o($J,"getTicketKeys");Object.defineProperty(vJ,"workerIndex",{get(){return HJ()}});Object.defineProperty(vJ,"workerCount",{get(){return GJ()}});var VJ={[xJ](e,t){wAe(t)},[BJ](e,t){NAe(t,e)}};function uM(e,t={}){let r=process.constrainedMemory?.()||PJ();r=Math.min(r,PJ(),2e4*LJ);let n=UJ.get($f.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/LJ/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],a=[];for(let l of ti){let u=new sAe;u.existingPort=l,i.push(u),a.push(u.port2)}cAe(e)||(e+=".js");let c=new nAe(aAe(e)?e:MJ(oAe,e),{resourceLimits:{maxOldGenerationSizeMb:n,maxYoungGenerationSizeMb:s},execArgv:["--enable-source-maps","--expose-internals"],argv:process.argv.slice(2),workerData:{addPorts:a,addThreadIds:i.map(l=>l.existingPort.threadId),workerIndex:t.workerIndex,workerCount:qJ=t.threadCount,name:t.name,restartNumber:Mi.exports.restartNumber,ticketKeys:$J()},transferList:a,...t});for(let{port1:l,existingPort:u}of i)u.postMessage({type:kJ,port:l,threadId:c.threadId},[l]);return kR(c,!0),c.unexpectedRestarts=t.unexpectedRestarts||0,c.startCopy=()=>uM(e,t),c.on("error",l=>{Di.error(`Worker index ${t.workerIndex} error:`,l)}),c.on("exit",l=>{ba.splice(ba.indexOf(c),1),!c.wasShutdown&&t.autoRestart!==!1&&(c.unexpectedRestarts<mAe?(t.unexpectedRestarts=c.unexpectedRestarts+1,uM(e,t)):Di.error(`Thread has been restarted ${c.restarts} times and will not be restarted`))}),c.on("message",l=>{VJ[l.type]?.(l,c)}),ba.push(c),PAe(),t.onStarted&&t.onStarted(c),c.name=t.name,c}o(uM,"startWorker");var gAe=[$f.THREAD_TYPES.HTTP];async function EM(e=null,t=Math.max(qJ>3,1),r=!0){if(mM){try{process.chdir(process.cwd())}catch(a){Di.error("Unable to reestablish current working directory",a)}if(r){let{loadRootComponents:a}=gy();await a()}Mi.exports.restartNumber++,t<1&&(t=t*ba.length);let n=[],s=[];for(let a of ba.slice(0)){if(e&&a.name!==e||a.wasShutdown)continue;Di.trace("sending shutdown request to ",a.threadId),a.postMessage({restartNumber:Mi.exports.restartNumber,type:$f.ITC_EVENT_TYPES.SHUTDOWN}),a.wasShutdown=!0,a.emit("shutdown",{});let c=gAe.indexOf(a.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{Di.warn("Thread did not voluntarily terminate, terminating from the outside",a.threadId),a.terminate()},pM*2).unref();a.on("exit",()=>{clearTimeout(d),n.splice(n.indexOf(l)),!c&&r&&a.startCopy(),u()})});if(n.push(l),c&&r){let u=a.startCopy(),d=new Promise(f=>{let m=o(p=>{p.type===$f.ITC_EVENT_TYPES.CHILD_STARTED&&(Di.trace("Worker has started",u.threadId),f(),s.splice(s.indexOf(d)),u.off("message",m))},"startListener");Di.trace("Waiting for worker to start",u.threadId),u.on("message",m)});s.push(d),n.length>=t&&await Promise.race(n),s.length>=t&&await Promise.race(s)}}await Promise.all(n),await Promise.all(s);let{restartService:i}=Cf();r&&(e==="http"||!e)&&UJ.get($f.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else yo.postMessage({type:pAe,workerType:e})}o(EM,"restartWorkers");function SAe(e,t){VJ[e]=t}o(SAe,"setChildListenerByType");function KJ(e){return EM(e,1/0,!1)}o(KJ,"shutdownWorkers");function TAe(e){return KJ(e),Promise.all(ba.map(t=>t.terminate()))}o(TAe,"shutdownWorkersNow");var YJ=[];function yAe(e){YJ.push(e)}o(yAe,"onMessageFromWorkers");var dM=new Map;function WJ(e,t){let r=dM.get(e);r||dM.set(e,r=[]),r.push(t)}o(WJ,"onMessageByType");var RAe=10;async function bAe(e,t){let r=0;for(let n of ti)try{n.postMessage(e),r++>RAe&&(r=0,await new Promise(setImmediate))}catch(s){Di.error("Unable to send message to worker",s)}t&&jJ(e,null)}o(bAe,"broadcast");var FR=new Map,AAe=1;function IAe(e){return new Promise(t=>{let r=0;for(let n of ti)try{let s=AAe++,i=o(()=>{FR.delete(s),--r===0&&t(),n!==yo&&--n.refCount===0&&n.unref()},"ackHandler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,FR.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,a]of FR)a.port===n&&a()})),n.postMessage(e),r++}catch(s){Di.error("Unable to send message to worker",s)}r===0&&t()})}o(IAe,"broadcastWithAcknowledgement");function wAe(e){e.postMessage({type:FJ,workers:zJ()})}o(wAe,"sendThreadInfo");function zJ(){let e=Date.now();return ba.map(t=>({threadId:t.threadId,name:t.name,heapTotal:t.resources?.heapTotal,heapUsed:t.resources?.heapUsed,externalMemory:t.resources?.external,arrayBuffers:t.resources?.arrayBuffers,sinceLastUpdate:e-t.resources?.updated,...t.recentELU}))}o(zJ,"getChildWorkerInfo");function NAe(e,t){e.resources=t,e.resources.updated=Date.now()}o(NAe,"recordResourceReport");var fM;function CAe(e){fM=e}o(CAe,"setMonitorListener");var OAe=1e3,DJ=!1;function PAe(){DJ||(DJ=!0,setInterval(()=>{for(let e of ba){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}fM&&fM()},OAe).unref())}o(PAe,"startMonitoring");var LAe=1e3;if(yo&&Ro?.addPorts){kR(yo);for(let e=0,t=Ro.addPorts.length;e<t;e++){let r=Ro.addPorts[e];r.threadId=Ro.addThreadIds[e],kR(r)}setInterval(()=>{let e=process.memoryUsage();yo.postMessage({type:BJ,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},LAe).unref(),lM=o(()=>new Promise((e,t)=>{yo.on("message",r),yo.postMessage({type:xJ});function r(n){n.type===FJ&&(yo.off("message",r),e(n.workers))}o(r,"receiveThreadInfo")}),"getThreadInfo")}else lM=zJ;Mi.exports.getThreadInfo=lM;function kR(e,t){ti.push(e),e.on("message",r=>{if(r.type===kJ)r.port.threadId=r.threadId,kR(r.port);else if(r.type===hAe){let n=FR.get(r.id);n&&n()}else jJ(r,e)}).on("close",()=>{ti.splice(ti.indexOf(e),1)}).on("exit",()=>{ti.splice(ti.indexOf(e),1)}),t?e.refCount=100:e.unref()}o(kR,"addPort");function jJ(e,t){for(let n of YJ)n(e,t);let r=dM.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){Di.error(s)}}o(jJ,"notifyMessageListeners");if(mM){let e,t,r=new Set,n=o(async(s,i)=>{i&&(e=i);for(let a of await uAe(s,{withFileTypes:!0}))a.isDirectory()&&a.name!=="node_modules"&&n(MJ(s,a.name));try{for await(let{filename:a}of lAe(s,{persistent:!1}))r.add(a),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await EM(),console.log("Reloaded HarperDB components, changed files:",Array.from(r)),r.clear()},100)}catch(a){console.warn("Error trying to watch component directory",s,a)}},"watchDir");Mi.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else yo.on("message",async e=>{let{type:t}=e;t===$f.ITC_EVENT_TYPES.SHUTDOWN&&(Mi.exports.restartNumber=e.restartNumber,yo.unref(),setTimeout(()=>{Di.warn("Thread did not voluntarily terminate",iAe),process.exit(0)},pM).unref())})});var t3=v((qGe,e3)=>{"use strict";var{promises:Vf,createReadStream:DAe,createWriteStream:MAe}=require("fs"),{createGzip:vAe}=require("zlib"),{promisify:UAe}=require("util"),{pipeline:xAe}=require("stream"),BAe=UAe(xAe),gM=require("path"),ZJ=me();ZJ.initSync();var HR=Q(),{CONFIG_PARAMS:FAe,ITC_EVENT_TYPES:HGe}=(q(),M(z)),{onMessageFromWorkers:GGe}=nt(),{convertToMS:QJ}=ae(),{onStorageReclamation:kAe}=(D_(),M(GU)),HAe=6e4,GAe="'interval' and 'maxSize' are both undefined, to enable logging rotation at least one of these values must be defined in harperdb-config.yaml",qAe="'logging.rotation.path' is undefined, to enable logging rotation set this value in harperdb-config.yaml",_M,JJ;e3.exports=$Ae;function $Ae({logger:e,maxSize:t,interval:r,retention:n,enabled:s,path:i,auditInterval:a}){if(s===!1)return;let c=0;if(kAe(e.path,f=>{c=f},!0),!t&&!r)throw new Error(GAe);if(!i)throw new Error(qAe);let l;if(t){let f=t.slice(-1),m=t.slice(0,-1);f==="G"?l=m*1e9:f==="M"?l=m*1e6:l=m*1e3}let u;r&&(u=QJ(r));let d;return _M=Date.now(),HR.trace("Log rotate enabled, maxSize:",t,"interval:",r),JJ=setInterval(async()=>{if(l){let f;f=await Vf.stat(e.path),f.size>=l&&(d=await XJ(e.path,i))}if(u&&Date.now()-_M>=u&&(d=await XJ(e.path,i),_M=Date.now()),n||c){let f=QJ(n??"1M")/(1+c);c=0;let m=await Vf.readdir(i);for(let p of m)try{let h=await Vf.stat(gM.join(i,p));Date.now()-h.mtimeMs>f&&await Vf.unlink(gM.join(i,p))}catch(h){HR.error("Error trying to remove log",p,h)}}},a??HAe).unref(),{end(){clearInterval(JJ)},getLastRotatedLogPath(){return d}}}o($Ae,"logRotator");async function XJ(e,t){let r=ZJ.get(FAe.LOGGING_ROTATION_COMPRESS),n=gM.join(t,`HDB-${new Date(Date.now()).toISOString().replaceAll(":","-")}.log`);return await Vf.rename(e,n),r&&(e=n,n+=".gz",await BAe(DAe(e),vAe(),MAe(n)),await Vf.unlink(e)),HR.closeLogFile(),HR.notify(`hdb.log rotated, old log moved to ${n}`),n}o(XJ,"moveLogFile")});var o3={};Re(o3,{RootConfigWatcher:()=>SM});var r3,n3,s3,GR,i3,SM,a3=se(()=>{r3=b(require("chokidar")),n3=require("node:fs/promises"),s3=b(St()),GR=require("node:stream"),i3=require("yaml"),SM=class extends GR.EventEmitter{static{o(this,"RootConfigWatcher")}#e;#t;#r;ready;constructor(){super(),this.#e=(0,s3.getConfigFilePath)(),this.ready=(0,GR.once)(this,"ready"),this.#t=r3.default.watch(this.#e,{persistent:!1}).on("add",this.handleChange.bind(this)).on("change",this.handleChange.bind(this)).on("error",this.handleError.bind(this))}handleError(t){this.emit("error",t)}handleChange(){(0,n3.readFile)(this.#e,"utf-8").then(t=>{if(!t)return;let r=(0,i3.parse)(t);if(!this.#r){this.#r=r,this.emit("ready",this.#r);return}this.emit("change",this.#r=r)}).catch(t=>{})}close(){return this.#t.close(),this.#r=void 0,this.emit("close"),this.removeAllListeners(),this}get config(){return this.#r}}});var Q=v((WGe,jR)=>{"use strict";var Aa=require("fs-extra"),{workerData:VAe,threadId:KAe,isMainThread:m3}=require("worker_threads"),PE=require("path"),p3=require("yaml"),h3=require("properties-reader"),Kr=(q(),M(z)),c3=$c(),YAe=require("os"),{PACKAGE_ROOT:NM}=Ct(),{_assignPackageExport:WAe}=ii(),{Console:zAe}=require("console"),yM=process.env.IS_SCRIPTED_SERVICE?function(){}:process.stdout.nativeWrite||(process.stdout.nativeWrite=process.stdout.write),l3=new Map,{join:Ia}=PE,u3=1e4,cr={notify:7,fatal:6,error:5,warn:4,info:3,debug:2,trace:1},jAe={STDOUT:"stdOut",STDERR:"stdErr"},YGe=Ia(NM,"logs"),QAe=Ia(NM,"config/yaml/",Kr.HDB_DEFAULT_CONFIG_FILE),JAe=1e4,LE,DE,qR,bo,RM,TM,VR,Ut,Cs,KR,YR,Kf,OE,CE;function $R(e,t,r){e.rotation=t.rotation;let n=t.path;n?t.root||(t.root=PE.dirname(n)):t.root?n=Ia(t.root,RM):(n=Ut.path,t.root||(t.root=PE.dirname(n))),n?e.path=n:console.error("No path for logger",t),e.level=cr[t.level]??Ut?.level??cr.info,E3(e),e.logToStdstreams=t.stdStreams??!1,e.tag=t.tag??(Ut.path===e.path&&r)}o($R,"updateLogger");function E3(e){let t=e.conditional??(e.conditional={});t.notify=cr.notify>=e.level?e.notify.bind(e):void 0,t.fatal=cr.fatal>=e.level?e.fatal.bind(e):void 0,t.error=cr.error>=e.level?e.error.bind(e):void 0,t.warn=cr.warn>=e.level?e.warn.bind(e):void 0,t.info=cr.info>=e.level?e.info.bind(e):void 0,t.debug=cr.debug>=e.level?e.debug.bind(e):void 0,t.trace=cr.trace>=e.level?e.trace.bind(e):void 0}o(E3,"updateConditional");async function bM(){CE||(CE=new _Ie,await CE.ready,CE.on("change",bM));let e=CE.config,t=e.logging??{};$R(Ut,t),VR=Ut.path,LE=t.console??!1,t.external&&$R(Cs,t.external);for(let r in e){let n=e[r];n.logging?$R(Ut.forComponent(r),n.logging,r):Ut.hasComponent(r)&&$R(Ut.forComponent(r),t,r)}}o(bM,"updateLogSettings");var AM=class extends zAe{static{o(this,"HarperLogger")}constructor(t,r){t.stdout.removeListener=()=>{},t.stderr.removeListener=()=>{},t.stdout.listenerCount=()=>{},t.stderr.listenerCount=()=>{},super(t),this.level=r}trace(...t){wn="trace",this.level<=cr.trace&&super.info(...t),wn="info"}debug(...t){wn="debug",this.level<=cr.debug&&super.info(...t),wn="info"}info(...t){wn="info",this.level<=cr.info&&super.info(...t),wn="info"}warn(...t){wn="warn",this.level<=cr.warn&&super.warn(...t),wn="info"}error(...t){wn="error",this.level<=cr.error&&super.error(...t),wn="info"}fatal(...t){Kf=!0;try{wn="fatal",this.level<=cr.fatal&&super.error(...t),wn="info"}finally{Kf=!1}}notify(...t){Kf=!0;try{wn="notify",this.level<=cr.notify&&super.info(...t),wn="info"}finally{Kf=!1}}withTag(t){return g3(t,!0,this)}forComponent(t){return this}hasComponent(t){return!1}};OE===void 0&&_3();jR.exports={notify:oIe,fatal:aIe,error:wM,warn:cIe,info:nIe,debug:iIe,trace:sIe,logLevel:bo,loggerWithTag:g3,suppressLogging:tIe,initLogSettings:_3,logCustomLevel:lIe,closeLogFile:S3,createLogger:zR,logsAtLevel:ZAe,getLogFilePath:o(()=>VR,"getLogFilePath"),forComponent:o(e=>Ut.forComponent(e),"forComponent"),setMainLogger:hIe,setLogLevel:dIe,OUTPUTS:jAe,AuthAuditLog:EIe,start:bM,startOnMainThread:bM,errorToString:pIe,disableStdio:XAe};function XAe(){yM=o(function(){},"nativeStdWrite")}o(XAe,"disableStdio");jR.exports.externalLogger={notify(...e){Cs.notify(...e)},fatal(...e){Cs.fatal(...e)},error(...e){Cs.error(...e)},warn(...e){Cs.warn(...e)},info(...e){Cs.info(...e)},debug(...e){Cs.debug(...e)},trace(...e){Cs.trace(...e)},withTag(e){return Cs.withTag(e)}};WAe("logger",jR.exports.externalLogger);function ZAe(e){return cr[bo]<=cr[e]}o(ZAe,"logsAtLevel");function _3(e=!1){try{if(OE===void 0||e){S3();let t=uIe(),r=c3(["ROOTPATH"]);try{OE=h3(t)}catch(s){if(!r.ROOTPATH||r.ROOTPATH&&!Aa.pathExistsSync(Ia(r.ROOTPATH,Kr.HDB_CONFIG_FILE)))throw s}let n;if({level:bo,configLogPath:TM,toFile:DE,logConsole:LE,rotation:n,toStream:qR}=fIe(r.ROOTPATH?Ia(r.ROOTPATH,Kr.HDB_CONFIG_FILE):OE.get("settings_path")),RM=Kr.LOG_NAMES.HDB,VR=Ia(TM,RM),Ut=zR({path:VR,level:bo,stdStreams:qR,rotation:n}),Cs=Ut.forComponent("external"),Cs.tag=null,m3)try{require("segfault-handler").registerHandler(Ia(TM,"crash.log"))}catch{}}}catch(t){if(OE=void 0,t.code===Kr.NODE_ERROR_CODES.ENOENT||t.code===Kr.NODE_ERROR_CODES.ERR_INVALID_ARG_TYPE){let r=c3(Object.keys(Kr.CONFIG_PARAM_MAP),!0);for(let s in r){let i=Kr.CONFIG_PARAM_MAP[s];i&&i.toLowerCase();let a=r[s];if(i===Kr.CONFIG_PARAMS.LOGGING_LEVEL){bo=a;continue}i===Kr.CONFIG_PARAMS.LOGGING_CONSOLE&&(LE=i)}let{defaultLevel:n}=mIe();DE=!1,qR=!0,bo=bo===void 0?n:bo,Ut=zR({level:bo}),Cs=Ut.forComponent("external"),Cs.tag=null;return}throw wM("Error initializing log settings"),wM(t),t}process.env.DEV_MODE&&(qR=!0),eIe()}o(_3,"initLogSettings");var Bc=!0;function eIe(){DE&&(process.stdout.write=function(e){return typeof e=="string"&&Bc&&LE&&(e=e.toString(),e[e.length-1]===`
133
133
  `&&(e=e.slice(0,-1)),YR(e)),yM.apply(process.stdout,arguments)},process.stderr.write=function(e){return typeof e=="string"&&Bc&&LE&&(e[e.length-1]===`
134
134
  `&&(e=e.slice(0,-1)),YR(e)),yM.apply(process.stderr,arguments)})}o(eIe,"stdioLogging");function g3(e,t,r=Ut){return e=e.replace(/ /g,"-"),{notify:n(r.notify,"notify"),fatal:n(r.fatal,"fatal"),error:n(r.error,"error"),warn:n(r.warn,"warn"),info:n(r.info,"info"),debug:n(r.debug,"debug"),trace:n(r.trace,"trace")};function n(s,i){return!t||r.level<=cr[i]?function(...a){WR=e;try{return s.call(r,...a)}finally{WR=void 0}}:null}o(n,"logWithTag")}o(g3,"loggerWithTag");function tIe(e){try{Bc=!1,e()}finally{Bc=!0}}o(tIe,"suppressLogging");var rIe=VAe?.name?.replace(/ /g,"-")||"main",wn="info",IM,WR;function zR({path:e,level:t,stdStreams:r,rotation:n,isExternalInstance:s,writeToLog:i,component:a}){t||(t="info");let c=cr[t],l;function u(p){if(DE)if(l.logToStdstreams){f(p.replace(/\x1b\[[0-9;]*m/g,"")),Bc=!1;try{process.stdout.write(p)}finally{Bc=!0}}else f(p);else r&&process.stdout.write(p)}o(u,"logStdOut");function d(p){if(DE){if(f(p),r){Bc=!1;try{process.stderr.write(p)}finally{Bc=!0}}}else r&&process.stderr.write(p)}o(d,"logStdErr");let f=e&&f3(e,n,s);function m(p){return{write(h){let E=[wn];E.unshift(IM||rIe+"/"+KAe),WR&&E.push(WR),l.tag&&E.push(l.tag),p(`[${E.join("] [")}]: ${h}`)}}}if(o(m,"logPrepend"),s&&(YR=f),l=new AM({stdout:m(i??u),stderr:m(i??d),colorMode:r??!1},c),E3(l),l.path=e,Object.defineProperty(l,"path",{get(){return e},set(p){e=p,f=f3(e,l.rotation,s),s&&(YR=f)},enumerable:!0}),l.closeLogFile=f?.closeLogFile,l.logToStdstreams=r,!a){let p=new Map;l.forComponent=function(h){let E=p.get(h);return E||(E=zR({path:e,level:t,stdStreams:r,isExternalInstance:h==="external",rotation:n,writeToLog:i,component:!0}),p.set(h,E)),E},l.hasComponent=function(h){return p.has(h)}}return l}o(zR,"createLogger");var d3=100;function f3(e,t,r){let n=l3.get(e),s,i,a,c,l=0;n||(n=d,n.closeLogFile=m,n.path=e,l3.set(e,n)),m3&&JSON.stringify(t)!==JSON.stringify(n.rotation)&&(n.rotation=t,setTimeout(()=>{if(n.rotator?.end(),!t)return;let h=t3();try{n.rotator=h({logger:n,...t})}catch(E){n("Error initializing log rotator",E)}},100));let u=0;return n;function d(h){u++;let E=`${new Date().toISOString()} ${h}${h.endsWith(`