harperdb 4.5.40 → 4.5.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/harperdb.js +1 -1
- package/bin/lite.js +1 -1
- package/launchServiceScripts/launchNatsIngestService.js +1 -1
- package/launchServiceScripts/launchNatsReplyService.js +1 -1
- package/launchServiceScripts/launchUpdateNodes4-0-0.js +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/server/jobs/jobProcess.js +1 -1
- package/server/threads/threadServer.js +1 -1
- package/studio/build-local/asset-manifest.json +2 -2
- package/studio/build-local/index.html +1 -1
- package/studio/build-local/static/js/{main.e3c003ec.js → main.e5420fc4.js} +2 -2
- package/utility/scripts/restartHdb.js +1 -1
- /package/studio/build-local/static/js/{main.e3c003ec.js.LICENSE.txt → main.e5420fc4.js.LICENSE.txt} +0 -0
package/bin/harperdb.js
CHANGED
|
@@ -20,7 +20,7 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
|
|
|
20
20
|
This can occur during early stages of install where the config file has not yet been created`);return}else throw sr.error(i),new Error(`Error reading HarperDB config file at ${r}`)}XZ(n,r),hb(n);let s=n.toJSON();if($Z.config=s,Lt=Gu(s),Lt.logging_rotation_rotate)for(let i in JU)Lt[i]&&sr.error(`Config ${JU[i]} has been deprecated. Please check https://docs.harperdb.io/docs/ for further details.`);sr.trace(KZ)}}a(CE,"initConfig");function XZ(e,t){let r=e.getIn(["rootPath"]),n=!1;if(e.hasIn(["storage","path"])||(e.setIn(["storage","path"],Xn.join(r,"database")),n=!0),e.hasIn(["logging","rotation","path"])||(e.setIn(["logging","rotation","path"],Xn.join(r,"log")),n=!0),e.hasIn(["authentication"])||(e.addIn(["authentication"],{cacheTTL:3e4,enableSessions:!0,operationTokenTimeout:e.getIn(["operationsApi","authentication","operationTokenTimeout"])??"1d",refreshTokenTimeout:e.getIn(["operationsApi","authentication","refreshTokenTimeout"])??"30d"}),n=!0),e.hasIn(["analytics"])||(e.addIn(["analytics"],{aggregatePeriod:60}),n=!0),n){if(sr.trace("Updating config file with missing config params"),e.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${e.errors}`);Xr.writeFileSync(t,String(e))}}a(XZ,"checkForUpdatedConfig");function hb(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 Fu.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 Fu.CONFIG_VALIDATION("operationsApi.network.port and operationsApi.network.securePort cannot be the same value");let n=HZ(r,t);if(n.error)throw Fu.CONFIG_VALIDATION(n.error.message);typeof n.value.threads=="object"?e.setIn(["threads","count"],n.value.threads.count):e.setIn(["threads"],n.value.threads),e.setIn(["componentsRoot"],n.value.componentsRoot),e.setIn(["logging","root"],n.value.logging.root),e.setIn(["storage","path"],n.value.storage.path),e.setIn(["logging","rotation","path"],n.value.logging.rotation.path),e.setIn(["operationsApi","network","domainSocket"],n.value?.operationsApi?.network?.domainSocket),r?.clustering?.enabled&&e.setIn(["clustering","leafServer","streams","path"],n.value.clustering.leafServer.streams?.path)}a(hb,"validateConfig");function ZZ(e,t){Lt===void 0&&(Lt={});let r=si[e.toLowerCase()];if(r===void 0){sr.trace(`Unable to update config object because config param '${e}' does not exist`);return}Lt[r.toLowerCase()]=t}a(ZZ,"updateConfigObject");function n0(e,t,r=void 0,n=!1,s=!1,i=!1){Lt===void 0&&CE();let o=r0(si.hdb_root),c=Xn.join(o,Is.HDB_CONFIG_FILE),l=Ma(c),u;if(r&&Lt){let _=!1;for(let p in r)if(r[p]!=Lt[p.toLowerCase()]){_=!0;break}if(!_){sr.trace("No changes detected in config parameters, skipping update");return}}if(r===void 0&&e.toLowerCase()===Qn.DATABASES)u=t;else if(r===void 0){let _;if(i)_=e;else if(_=si[e.toLowerCase()],_===void 0)throw new Error(`Unable to update config, unrecognized config parameter: ${e}`);let p=_.split("_"),h=pb(_,t);l.setIn([...p],h)}else for(let _ in r){let p=si[_.toLowerCase()];if(p===Qn.HTTP_SECUREPORT&&r[_]===Lt[Qn.HTTP_PORT]?.toString()&&l.setIn(["http","port"],null),p===Qn.OPERATIONSAPI_NETWORK_SECUREPORT&&r[_]===Lt[Qn.OPERATIONSAPI_NETWORK_PORT.toLowerCase()]?.toString()&&l.setIn(["operationsApi","network","port"],null),p===Qn.DATABASES){u=r[_];continue}if(p?.startsWith("threads_")){let h=l.getIn(["threads"]);h>=0&&(l.deleteIn(["threads"]),l.setIn(["threads","count"],h))}if(!p&&(_.endsWith("_package")||_.endsWith("_port"))&&(p=_),p!==void 0){let h=p.split("_"),S=Is.LEGACY_CONFIG_PARAMS[_.toUpperCase()];S&&S.startsWith("customFunctions")&&l.hasIn(S.split("_"))&&(p=S,h=S.split("_"));let g=pb(p,r[_]);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){sr.error(R)}}}u&&t0(l,u),hb(l);let f=l.getIn(["rootPath"]),d=Xn.join(f,Is.HDB_CONFIG_FILE);if(n===!0&&e5(c,f),l.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${l.errors}`);Xr.writeFileSync(d,String(l)),s&&(Lt=Gu(l.toJSON())),sr.trace(`Config parameter: ${e} updated with value: ${t}`)}a(n0,"updateConfigValue");function e5(e,t){try{let r=Xn.join(t,"backup",`${new Date(Date.now()).toISOString().replaceAll(":","-")}-${Is.HDB_CONFIG_FILE}.bak`);Xr.copySync(e,r),sr.trace(`Config file: ${e} backed up to: ${r}`)}catch(r){sr.error(YZ),sr.error(r)}}a(e5,"backupConfigFile");var t5=["databases"];function Gu(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}),IE=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])&&!t5.includes(i)){let o=r(n[i]);for(let c in o){if(!o.hasOwnProperty(c))continue;c!=="package"&&(i=i.toLowerCase());let l=i+"_"+c;!Qn[l.toUpperCase()]&&si[l]&&(s[si[l].toLowerCase()]=o[c]),s[l]=o[c]}}n[i]!==void 0&&(s[i.toLowerCase()]=n[i])}return s}a(r,"squashObj")}a(Gu,"flattenConfig");function pb(e,t){if(e===Qn.CLUSTERING_NODENAME||e===Qn.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(kZ(t))return parseFloat(t);if(t===!0||t===!1||Array.isArray(t)||Sr.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 Sr.autoCast(t)}a(pb,"castConfigValue");function r5(){let e=Sr.getPropsFilePath(),t=ll(e);return Ma(t).toJSON()}a(r5,"getConfiguration");async function n5(e){let{operation:t,hdb_user:r,hdb_auth_header:n,...s}=e;try{return n0(void 0,void 0,s,!0),jZ}catch(i){throw typeof i=="string"||i instanceof String?GZ(i,i,qZ.BAD_REQUEST,void 0,void 0,!0):i}}a(n5,"setConfiguration");function mb(){let e=Sr.getPropsFilePath();try{Xr.accessSync(e,Xr.constants.F_OK|Xr.constants.R_OK)}catch(n){if(!Sr.noBootFile())throw sr.error(n),new Error(`HarperDB properties file at path ${e} does not exist`)}let t=ll(e);return Ma(t).toJSON()}a(mb,"readConfigFile");function Ma(e){return QU.parseDocument(Xr.readFileSync(e,"utf8"),{simpleKeys:!0})}a(Ma,"parseYamlDoc");function s5(){let e=mb(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=Sr.isEmptyOrZeroLength(t)?[]:t;let r=jU(t);if(r)throw Fu.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=Sr.isEmptyOrZeroLength(n)?[]:n;let s=jU(n);if(s)throw Fu.CONFIG_VALIDATION(s.message);if(!Sr.isEmptyOrZeroLength(n)&&!Sr.isEmptyOrZeroLength(t)){let i=t.filter(o=>n.some(c=>c.host===o.host&&c.port===o.port));if(!Sr.isEmptyOrZeroLength(i)){let o=`Duplicate hub and leaf routes found ${JSON.stringify(i)}`;throw Fu.CONFIG_VALIDATION(o)}}return{hub_routes:t,leaf_routes:n}}a(s5,"getClusteringRoutes");function s0(e){let t=XU(e);Lt={};for(let r in si){let n=t.get(r.toUpperCase());if(Sr.isEmpty(n)||typeof n=="string"&&n.trim().length===0)continue;let s=si[r].toLowerCase();s===Qn.LOGGING_ROOT?Lt[s]=Xn.dirname(n):Lt[s]=n}return Lt}a(s0,"initOldConfig");function i5(e){let t=mb();return FZ.get(t,e.replaceAll("_","."))}a(i5,"getConfigFromFile");async function o5(e,t){let r=Ma(ll());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 Xr.writeFile(ll(),String(r))}a(o5,"addConfig");function a5(e){let t=ll(Sr.getPropsFilePath()),r=Ma(t);r.deleteIn(e);let n=r.getIn(["rootPath"]),s=Xn.join(n,Is.HDB_CONFIG_FILE);Xr.writeFileSync(s,String(r))}a(a5,"deleteConfigFromFile");function c5(){return IE||(CE(),IE)}a(c5,"getConfigObj");function l5(){return Lt||CE(),Lt}a(l5,"getFlatConfigObj")});var wn=P((uwe,Ir)=>{"use strict";var c0="username is required",l0="nothing to update, must supply active, role or password to update",u0="password cannot be an empty string",d0="If role is specified, it cannot be empty.",f0="active must be true or false";Ir.exports.addUser=g5;Ir.exports.alterUser=S5;Ir.exports.dropUser=A5;Ir.exports.getSuperUser=N5;Ir.exports.userInfo=R5;Ir.exports.listUsers=DE;Ir.exports.listUsersExternal=y5;Ir.exports.setUsersWithRolesCache=ul;Ir.exports.findAndValidateUser=Ob;Ir.exports.getClusterUser=w5;Ir.exports.getUsersWithRolesCache=O5;Ir.exports.USERNAME_REQUIRED=c0;Ir.exports.ALTERUSER_NOTHING_TO_UPDATE=l0;Ir.exports.EMPTY_PASSWORD=u0;Ir.exports.EMPTY_ROLE=d0;Ir.exports.ACTIVE_BOOLEAN=f0;var _0=In(),u5=al(),U_=(OE(),C(bE)),p0=kU(),x_=Jr(),Ab=Co(),Gi=ie(),h0=require("validate.js"),Rb=J(),{promisify:d5}=require("util"),yb=No(),gb=(k(),C(G)),o0=Rt(),f5=bt(),_5=ce(),p5=yo(),{hdb_errors:h5,ClientError:ii}=pe(),{HTTP_STATUS_CODES:Io,AUTHENTICATION_ERROR_MSGS:Eb,HDB_ERROR_MSGS:qu}=h5,{UserEventMsg:bb}=oi(),Sb=require("lodash"),{server:PE}=(Ur(),C(Nu)),m5=J();PE.getUser=(e,t)=>Ob(e,t,t!=null);PE.authenticateUser=(e,t)=>Ob(e,t);var m0={username:!0,active:!0,role:!0,password:!0},a0=new Map,E5=d5(u5.delete),Tb=_5.get(gb.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??U_.HASH_FUNCTION.SHA256,qi;async function g5(e){let t=h0.cleanAttributes(e,m0),r=p0.addUserValidation(t);if(r)throw new ii(r.message);let n=await x_.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["id","permission","role"]});if(!n||n.length<1)throw new ii(qu.ROLE_NAME_NOT_FOUND(t.role),Io.NOT_FOUND);if(n.length>1)throw new ii(qu.DUP_ROLES_FOUND(t.role),Io.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=yb.encrypt(t.password)),t.password=await U_.hash(t.password,Tb),t.hash_function=Tb,t.role=n[0].id;let s=await _0.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(Rb.debug(s),await ul(),s.skipped_hashes.length===1)throw new ii(qu.USER_ALREADY_EXISTS(t.username),Io.CONFLICT);return Ab.signalUserChange(new bb(process.pid)),`${t.username} successfully added`}a(g5,"addUser");async function S5(e){let t=h0.cleanAttributes(e,m0);if(Gi.isEmptyOrZeroLength(t.username))throw new Error(c0);if(Gi.isEmptyOrZeroLength(t.password)&&Gi.isEmptyOrZeroLength(t.role)&&Gi.isEmptyOrZeroLength(t.active))throw new Error(l0);if(!Gi.isEmpty(t.password)&&Gi.isEmptyOrZeroLength(t.password.trim()))throw new Error(u0);if(!Gi.isEmpty(t.active)&&!Gi.isBoolean(t.active))throw new Error(f0);if(!Gi.isEmpty(t.password)&&!Gi.isEmptyOrZeroLength(t.password.trim())&&(T5(t.username)&&(t.hash=yb.encrypt(t.password)),t.password=await U_.hash(t.password,Tb)),t.role==="")throw new Error(d0);if(t.role){let n=await x_.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["*"]});if(!n||n.length===0)throw new ii(qu.ALTER_USER_ROLE_NOT_FOUND(t.role),Io.NOT_FOUND);if(n.length>1)throw new ii(qu.DUP_ROLES_FOUND(t.role),Io.CONFLICT);t.role=n[0].id}let r=await _0.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await ul(),Ab.signalUserChange(new bb(process.pid)),r}a(S5,"alterUser");function T5(e){let t=!1,r=qi.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}a(T5,"isClusterUser");async function A5(e){let t=p0.dropUserValidation(e);if(t)throw new ii(t.message);if(qi.get(e.username)===void 0)throw new ii(qu.USER_NOT_EXIST(e.username),Io.NOT_FOUND);let r=await E5({table:"hdb_user",schema:"system",hash_values:[e.username]});return Rb.debug(r),await ul(),Ab.signalUserChange(new bb(process.pid)),`${e.username} successfully deleted`}a(A5,"dropUser");async function R5(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=Sb.cloneDeep(e.hdb_user);let r=await x_.searchByHash({schema:"system",table:"hdb_role",hash_values:[t.role.id],get_attributes:["*"]});return t.role=r[0],delete t.password,delete t.refresh_token,delete t.hash,delete t.hash_function,t}a(R5,"userInfo");async function y5(){let e=await DE();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}a(y5,"listUsersExternal");async function DE(){let e=await x_.searchByValue({schema:"system",table:"hdb_role",search_value:"*",search_attribute:"role",get_attributes:["*"]}),t={};for(let s of e)t[s.id]=Sb.cloneDeep(s);if(Object.keys(t).length===0)return null;let r=await x_.searchByValue({schema:"system",table:"hdb_user",search_value:"*",search_attribute:"username",get_attributes:["*"]}),n=new Map;for(let s of r)s=Sb.cloneDeep(s),s.role=t[s.role],b5(s.role),n.set(s.username,s);return n}a(DE,"listUsers");function b5(e){if(!e){Rb.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(p5)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}a(b5,"appendSystemTablesToRole");async function ul(e=void 0){e?qi=e:qi=await DE()}a(ul,"setUsersWithRolesCache");async function O5(){return qi||await ul(),qi}a(O5,"getUsersWithRolesCache");async function Ob(e,t,r=!0){qi||await ul();let n=qi.get(e);if(!n){if(!r)return{username:e};throw new ii(Eb.GENERIC_AUTH_FAIL,Io.UNAUTHORIZED)}if(n&&!n.active)throw new ii(Eb.USER_INACTIVE,Io.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(a0.get(t)===n.password)return s;{let i=U_.validate(n.password,t,n.hash_function||U_.HASH_FUNCTION.MD5);if(i?.then&&(i=await i),i===!0)a0.set(t,n.password);else throw new ii(Eb.GENERIC_AUTH_FAIL,Io.UNAUTHORIZED)}}return s}a(Ob,"findAndValidateUser");async function N5(){qi||await ul();for(let[,e]of qi)if(e.role.role==="super_user")return e}a(N5,"getSuperUser");async function w5(){let e=await DE(),t=f5.getConfigFromFile(gb.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==gb.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=yb.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+o0.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+o0.SERVER_SUFFIX.ADMIN,r}a(w5,"getClusterUser");var E0=[];PE.invalidateUser=function(e){for(let t of E0)try{t(e)}catch(r){m5.error("Error invalidating user",r)}};PE.onInvalidatedUser=function(e){E0.push(e)}});var H_=P((pwe,A0)=>{"use strict";var dl=J(),Zn=(k(),C(G)),I5=vv(),fwe=ws(),_we=wo(),C5=wn(),{validateEvent:g0}=oi(),B_=Jn(),P5=require("process"),{resetDatabases:D5}=(Le(),C(st)),L5={[Zn.ITC_EVENT_TYPES.SCHEMA]:M5,[Zn.ITC_EVENT_TYPES.USER]:T0};async function M5(e){let t=g0(e);if(t){dl.error(t);return}dl.trace("ITC schemaHandler received schema event:",e),await I5(e.message),await v5(e.message)}a(M5,"schemaHandler");async function v5(e){try{B_.resetReadTxn(Zn.SYSTEM_SCHEMA_NAME,Zn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),B_.resetReadTxn(Zn.SYSTEM_SCHEMA_NAME,Zn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),B_.resetReadTxn(Zn.SYSTEM_SCHEMA_NAME,Zn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=D5();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){dl.error(t)}}a(v5,"syncSchemaMetadata");var S0=[];async function T0(e){try{try{B_.resetReadTxn(Zn.SYSTEM_SCHEMA_NAME,Zn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),B_.resetReadTxn(Zn.SYSTEM_SCHEMA_NAME,Zn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){dl.warn(r)}let t=g0(e);if(t){dl.error(t);return}dl.trace(`ITC userHandler ${Zn.HDB_ITC_CLIENT_PREFIX}${P5.pid} received user event:`,e),await C5.setUsersWithRolesCache();for(let r of S0)r()}catch(t){dl.error(t)}}a(T0,"userHandler");T0.addListener=function(e){S0.push(e)};A0.exports=L5});var oi=P((Twe,y0)=>{"use strict";var mwe=J(),Nb=ie(),U5=(k(),C(G)),{ITC_ERRORS:k_}=$n(),{parentPort:Ewe,threadId:x5,isMainThread:B5,workerData:gwe}=require("worker_threads"),{onMessageFromWorkers:H5,broadcast:Swe,broadcastWithAcknowledgement:k5}=nt();y0.exports={sendItcEvent:F5,validateEvent:R0,SchemaEventMsg:G5,UserEventMsg:q5};var LE;H5(async(e,t)=>{LE=LE||H_(),R0(e),LE[e.type]&&await LE[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function F5(e){return!B5&&e.message&&(e.message.originator=x5),k5(e)}a(F5,"sendItcEvent");function R0(e){if(typeof e!="object")return k_.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||Nb.isEmpty(e.type))return k_.MISSING_TYPE;if(!e.hasOwnProperty("message")||Nb.isEmpty(e.message))return k_.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||Nb.isEmpty(e.message.originator))return k_.MISSING_ORIGIN;if(U5.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return k_.INVALID_EVENT(e.type)}a(R0,"validateEvent");function G5(e,t,r,n=void 0,s=void 0){this.originator=e,this.operation=t,this.schema=r,this.table=n,this.attribute=s}a(G5,"SchemaEventMsg");function q5(e){this.originator=e}a(q5,"UserEventMsg")});var Co=P((ywe,w0)=>{"use strict";var b0=(k(),C(G)),Rwe=ie(),ME=J(),O0=Dv(),$u,{sendItcEvent:N0}=oi();function $5(e){try{ME.info("signalSchemaChange called with message:",e),$u=$u||H_();let t=new O0(b0.ITC_EVENT_TYPES.SCHEMA,e);return $u.schema(t),N0(t)}catch(t){ME.error(t)}}a($5,"signalSchemaChange");function V5(e){try{ME.trace("signalUserChange called with message:",e),$u=$u||H_();let t=new O0(b0.ITC_EVENT_TYPES.USER,e);return $u.user(t),N0(t)}catch(t){ME.error(t)}}a(V5,"signalUserChange");w0.exports={signalSchemaChange:$5,signalUserChange:V5}});var vE=P((Owe,C0)=>{"use strict";var I0=ie(),K5=(k(),C(G)),Y5=J(),W5=hE(),z5=pE(),j5=Co(),{SchemaEventMsg:J5}=oi(),Q5="already exists in";C0.exports=X5;async function X5(e,t,r){if(I0.isEmptyOrZeroLength(r))return r;let n=[];I0.isEmptyOrZeroLength(t.attributes)||t.attributes.forEach(i=>{n.push(i.attribute)});let s=r.filter(i=>n.indexOf(i)<0);return s.length===0||await Promise.all(s.map(async i=>{await Z5(e,t.schema,t.name,i)})),s}a(X5,"lmdbCheckForNewAttributes");async function Z5(e,t,r,n){let s=new z5(t,r,n,void 0,!0);e&&(s.hdb_auth_header=e);try{await e9(s)}catch(i){if(typeof i=="object"&&i.message!==void 0&&i.message.includes(Q5))Y5.warn(`attribute ${t}.${r}.${n} already exists`);else throw i}}a(Z5,"createNewAttribute");async function e9(e){let t;return t=await W5(e),j5.signalSchemaChange(new J5(process.pid,K5.OPERATIONS_ENUM.CREATE_ATTRIBUTE,e.schema,e.table,e.attribute)),t}a(e9,"createAttribute")});var Vu=P((wwe,P0)=>{"use strict";var wb=class{static{a(this,"LMDBTransactionObject")}constructor(t,r,n,s,i=void 0){this.operation=t,this.user_name=r,this.timestamp=n,this.hash_values=s,this.origin=i}};P0.exports=wb});var L0=P((Cwe,D0)=>{"use strict";var t9=Vu(),r9=(k(),C(G)).OPERATIONS_ENUM,Ib=class extends t9{static{a(this,"LMDBInsertTransactionObject")}constructor(t,r,n,s,i=void 0){super(r9.INSERT,r,n,s,i),this.records=t}};D0.exports=Ib});var v0=P((Dwe,M0)=>{"use strict";var n9=Vu(),s9=(k(),C(G)).OPERATIONS_ENUM,Cb=class extends n9{static{a(this,"LMDBUpdateTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(s9.UPDATE,n,s,i,o),this.records=t,this.original_records=r}};M0.exports=Cb});var x0=P((Mwe,U0)=>{"use strict";var i9=Vu(),o9=(k(),C(G)).OPERATIONS_ENUM,Pb=class extends i9{static{a(this,"LMDBUpsertTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(o9.UPSERT,n,s,i,o),this.records=t,this.original_records=r}};U0.exports=Pb});var H0=P((Uwe,B0)=>{"use strict";var a9=Vu(),c9=(k(),C(G)).OPERATIONS_ENUM,Db=class extends a9{static{a(this,"LMDBDeleteTransactionObject")}constructor(t,r,n,s,i=void 0){super(c9.DELETE,n,s,t,i),this.original_records=r}};B0.exports=Db});var F_=P((Hwe,q0)=>{"use strict";var Bwe=require("path"),k0=pt(),l9=L0(),u9=v0(),d9=x0(),f9=H0(),Ku=Gt(),F0=ie(),{CONFIG_PARAMS:_9}=(k(),C(G)),G0=ce();G0.initSync();var UE=(k(),C(G)).OPERATIONS_ENUM,{getTransactionAuditStorePath:p9}=gt();q0.exports=h9;async function h9(e,t){if(G0.get(_9.LOGGING_AUDITLOG)===!1)return;let r=p9(e.schema,e.table),n=await k0.openEnvironment(r,e.table,!0),s=m9(e,t);if(!(s===void 0||s.hash_values.length===0)&&n!==void 0){k0.initializeDBIs(n,Ku.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,Ku.TRANSACTIONS_DBIS);let i=s.timestamp;return await n.dbis[Ku.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].ifNoExists(i,()=>{n.dbis[Ku.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].put(i,s),F0.isEmpty(s.user_name)||n.dbis[Ku.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].put(s.user_name,i);for(let o=0;o<s.hash_values.length;o++)n.dbis[Ku.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].put(s.hash_values[o],i)})}}a(h9,"writeTransaction");function m9(e,t){let r=F0.isEmpty(e.hdb_user)?void 0:e.hdb_user?.username;if(e.operation===UE.INSERT)return new l9(e.records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===UE.UPDATE)return new u9(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===UE.UPSERT)return new d9(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===UE.DELETE)return new f9(t.deleted,t.original_records,r,t.txn_time,e.__origin)}a(m9,"createTransactionObject")});var Lb=P((Gwe,$0)=>{"use strict";var E9=y_(),Fwe=jf(),G_=(k(),C(G)),g9=Jf(),S9=tl().insertRecords,T9=pt(),A9=J(),R9=vE(),{getSchemaPath:y9}=gt(),b9=F_();$0.exports=O9;async function O9(e){try{let{schema_table:t,attributes:r}=E9(e);g9(e,r,t.hash_attribute),e.schema!==G_.SYSTEM_SCHEMA_NAME&&(r.includes(G_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(G_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(G_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(G_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await R9(e.hdb_auth_header,t,r),s=y9(e.schema,e.table),i=await T9.openEnvironment(s,e.table),o=await S9(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await b9(e,o)}catch(c){A9.error(`unable to write transaction due to ${c.message}`)}return{written_hashes:o.written_hashes,skipped_hashes:o.skipped_hashes,schema_table:t,new_attributes:n,txn_time:o.txn_time}}catch(t){throw t}}a(O9,"lmdbCreateRecords")});var Y0=P(($we,K0)=>{"use strict";var V0=(k(),C(G)),N9=Lb(),w9=jf(),I9=require("fs-extra"),{getSchemaPath:C9}=gt();K0.exports=P9;async function P9(e){let t=[{name:e.schema,createddate:Date.now()}],r=new w9(V0.SYSTEM_SCHEMA_NAME,V0.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,void 0,t);await N9(r),await I9.mkdirp(C9(e.schema))}a(P9,"lmdbCreateSchema")});var z0=P((Kwe,W0)=>{"use strict";var Mb=class{static{a(this,"DeleteRecordsResponseObject")}constructor(t=[],r=[],n=void 0,s=[]){this.deleted=t,this.skipped=r,this.txn_time=n,this.original_records=s}};W0.exports=Mb});var X0=P((Jwe,Q0)=>{"use strict";var j0=pt(),vb=mn(),Ub=$n().LMDB_ERRORS_ENUM,D9=Gt(),J0=J(),Wwe=ie(),L9=require("lmdb"),M9=z0(),v9=(k(),C(G)),{OVERFLOW_MARKER:zwe,MAX_SEARCH_KEY_LENGTH:jwe}=D9,U9=v9.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function x9(e,t,r,n){if(vb.validateEnv(e),t===void 0)throw new Error(Ub.HASH_ATTRIBUTE_REQUIRED);if(!Array.isArray(r))throw r===void 0?new Error(Ub.IDS_REQUIRED):new Error(Ub.IDS_MUST_BE_ITERABLE);try{let s=j0.listDBIs(e);j0.initializeDBIs(e,t,s);let i=new M9,o,c=[],l=[];for(let _=0,p=r.length;_<p;_++)try{o=r[_];let h=e.dbis[t].get(o);if(!h||n&&h[U9]>n){i.skipped.push(o);continue}let S=e.dbis[t].ifVersion(o,L9.IF_EXISTS,()=>{e.dbis[t].remove(o);for(let g=0;g<s.length;g++){let R=s[g];if(!h.hasOwnProperty(R)||R===t)continue;let E=e.dbis[R],T=h[R];if(T!=null)try{let N=vb.getIndexedValues(T);if(N)for(let M=0,H=N.length;M<H;M++)E.remove(N[M],o)}catch{J0.warn(`cannot delete from attribute: ${R}, ${T}:${o}`)}}});c.push(S),l.push(o),i.original_records.push(h)}catch(h){J0.warn(h),i.skipped.push(o)}let u=[],f=await Promise.all(c);for(let _=0,p=f.length;_<p;_++)f[_]===!0?i.deleted.push(l[_]):(i.skipped.push(l[_]),u.push(_));let d=0;for(let _=0;_<u.length;_++){let p=u[_];i.original_records.splice(p-d,1),d++}return i.txn_time=vb.getNextMonotonicTime(),i}catch(s){throw s}}a(x9,"deleteRecords");Q0.exports={deleteRecords:x9}});var q_=P((Xwe,ex)=>{"use strict";var Yu=ie(),B9=X0(),H9=pt(),{getSchemaPath:k9}=gt(),F9=F_(),G9=J();ex.exports=q9;async function q9(e,t=!0){let n=global.hdb_schema[e.schema][e.table].hash_attribute;if(Yu.isEmpty(n))throw new Error(`could not retrieve hash attribute for schema:${e.schema} and table ${e.table}`);try{if(Yu.isEmptyOrZeroLength(e.hash_values)&&!Yu.isEmptyOrZeroLength(e.records)){e.hash_values=[];for(let c=0;c<e.records.length;c++){let l=e.records[c][n];Yu.isEmpty(l)||e.hash_values.push(l)}}if(Yu.isEmptyOrZeroLength(e.hash_values))return Z0([],[]);if(!Array.isArray(e.hash_values))throw new Error("hash_values must be an array");if(Yu.isEmptyOrZeroLength(e.records)){e.records=[];for(let c=0;c<e.hash_values.length;c++)e.records[c]={[n]:e.hash_values[c]}}let s=k9(e.schema,e.table),i=await H9.openEnvironment(s,e.table),o=await B9.deleteRecords(i,n,e.hash_values,e.__origin?.timestamp);try{t===!0&&await F9(e,o)}catch(c){G9.error(`unable to write transaction due to ${c.message}`)}return Z0(o.deleted,o.skipped,o.txn_time)}catch(s){throw s}}a(q9,"lmdbDeleteRecords");function Z0(e,t,r){let n=e.length+t.length,s=n===1?"record":"records";return{message:`${e.length} of ${n} ${s} successfully deleted`,deleted_hashes:e,skipped_hashes:t,txn_time:r}}a(Z0,"createDeleteResponse")});var Bb=P((tIe,tx)=>{"use strict";var $9=(k(),C(G)),eIe=mn();function xb(e,t){let r=Object.create(null);if(t.length===1&&$9.SEARCH_WILDCARDS.indexOf(t[0])>=0)Object.assign(r,e);else for(let n=0;n<t.length;n++){let s=t[n],i=e[s];r[s]=i===void 0?null:i}return r}a(xb,"parseRow");function V9(e,t,r,n){let s=xb(r,e);n.push(s)}a(V9,"searchAll");function K9(e,t,r,n){let s=xb(r,e);n[t]=s}a(K9,"searchAllToMap");function Y9(e,t,r){r[e]===void 0&&(r[e]=[]),r[e].push(t)}a(Y9,"iterateDBI");function fl(e,t,r,n,s){let i=Object.create(null);i[s]=e;let o;n===s?o=e:(o=t,n!==void 0&&(i[n]=o)),r[0].push(o),r[1].push(i)}a(fl,"pushResults");function W9(e,t,r,n,s,i){t.toString().endsWith(e)&&fl(t,r,n,s,i)}a(W9,"endsWith");function z9(e,t,r,n,s,i){t.toString().includes(e)&&fl(t,r,n,s,i)}a(z9,"contains");function j9(e,t,r,n,s,i){t>e&&fl(t,r,n,s,i)}a(j9,"greaterThanCompare");function J9(e,t,r,n,s,i){t>=e&&fl(t,r,n,s,i)}a(J9,"greaterThanEqualCompare");function Q9(e,t,r,n,s,i){t<e&&fl(t,r,n,s,i)}a(Q9,"lessThanCompare");function X9(e,t,r,n,s,i){t<=e&&fl(t,r,n,s,i)}a(X9,"lessThanEqualCompare");tx.exports={parseRow:xb,searchAll:V9,searchAllToMap:K9,iterateDBI:Y9,endsWith:W9,contains:z9,greaterThanCompare:j9,greaterThanEqualCompare:J9,lessThanCompare:Q9,lessThanEqualCompare:X9,pushResults:fl}});var Wu=P((oIe,cx)=>{"use strict";var va=pt(),nIe=J(),es=mn(),xE=Gt(),Jt=$n().LMDB_ERRORS_ENUM,sIe=ie(),Z9=(k(),C(G)),BE=Bb(),{parseRow:e7}=BE,iIe=require("lmdb"),{OVERFLOW_MARKER:rx,MAX_SEARCH_KEY_LENGTH:t7}=xE;function nx(e,t,r,n=!1,s=void 0,i=void 0){return _l(e,t,r,(o,c)=>c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}))}a(nx,"iterateFullIndex");function $_(e,t,r,n,s,i=!1,o=void 0,c=void 0,l=!1,u=!1){return _l(e,t,r,(f,d,_,p)=>{let E={transaction:f,start:i===!0?s:n,end:i===!0?n:s,reverse:i,limit:o,offset:c,inclusiveEnd:i===!0?!l:!u,exclusiveStart:i===!0?u:l};return p===r?(E.values=!1,d.getRange(E).map(T=>({value:T}))):d.getRange(E)})}a($_,"iterateRangeBetween");function _l(e,t,r,n){let s=e.database||e,i=va.openDBI(s,r);i[xE.DBI_DEFINITION_NAME].is_hash_attribute?t=r:t&&va.openDBI(s,t);let o;e.database?o=e:(o=e.useReadTransaction(),o.database=e);let c=n(o,i,s,t);return c.transaction=o,e.database||(c.onDone=()=>{o.done()}),c}a(_l,"setupTransaction");function sx(e,t,r,n){let s;return function(i,o){if(typeof i=="string"&&i.endsWith(rx)){if(!s)if(r)s=va.openDBI(e,r);else{let l=va.listDBIs(e);for(let u=0,f=l.length;u<f&&(s=va.openDBI(e,l[u]),!s[xE.DBI_DEFINITION_NAME].is_hash_attribute);u++);}i=s.get(o,{transaction:t,lazy:!0})[n]}return i}}a(sx,"getOverflowCheck");function r7(e,t,r,n=!1,s=void 0,i=void 0){if(es.validateEnv(e),t===void 0)throw new Error(Jt.HASH_ATTRIBUTE_REQUIRED);return _l(e,t,t,(o,c,l)=>(HE(r),r=V_(l,r),c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}).map(u=>e7(u.value,r))))}a(r7,"searchAll");function n7(e,t,r,n=!1,s=void 0,i=void 0){if(es.validateEnv(e),t===void 0)throw new Error(Jt.HASH_ATTRIBUTE_REQUIRED);HE(r),r=V_(e.database||e,r);let o=new Map;for(let{key:c,value:l}of nx(e,t,t,n,s,i))o.set(c,BE.parseRow(l,r));return o}a(n7,"searchAllToMap");function s7(e,t,r=!1,n=void 0,s=void 0){if(es.validateEnv(e),t===void 0)throw new Error(Jt.ATTRIBUTE_REQUIRED);let i=Object.create(null),o=nx(e,void 0,t,r,n,s),c=o.transaction,l=sx(c.database,c,void 0,t);for(let{key:u,value:f}of o){let d=l(u,f);i[d]===void 0&&(i[d]=[]),i[d].push(f)}return i}a(s7,"iterateDBI");function i7(e,t){if(es.validateEnv(e),t===void 0)throw new Error(Jt.HASH_ATTRIBUTE_REQUIRED);return va.statDBI(e,t).entryCount}a(i7,"countAll");function o7(e,t,r,n,s=!1,i=void 0,o=void 0){return Ua(e,r,n),_l(e,t,r,(c,l,u,f)=>(n=es.convertKeyValueToWrite(n),f===r?l.get(n,{transaction:c,lazy:!0})===void 0?[]:[{key:n,value:n}]:l.getValues(n,{transaction:c,reverse:s,limit:i,offset:o}).map(d=>({key:n,value:d}))))}a(o7,"equals");function a7(e,t,r){return Ua(e,t,r),va.openDBI(e,t).getValuesCount(r)}a(a7,"count");function c7(e,t,r,n,s=!1,i=void 0,o=void 0){return Ua(e,r,n),_l(e,null,r,(c,l)=>{n=es.convertKeyValueToWrite(n);let u=!0;typeof n=="number"&&(u=!1);let f;if(s===!0){let d;for(let _ of l.getKeys({transaction:c,start:n}))if(!_.startsWith(n)){d=_;break}return d!==void 0&&(Number.isInteger(o)?o++:i++),f=l.getRange({transaction:c,start:d,end:void 0,reverse:s,limit:i,offset:o}).map(_=>{let{key:p}=_;if(p!==d){if(p.toString().startsWith(n))return _;if(u===!0)return f.DONE}}),f.filter(_=>_)}else return f=l.getRange({transaction:c,start:n,reverse:s,limit:i,offset:o}).map(d=>{if(d.key.toString().startsWith(n))return d;if(u===!0)return f.DONE}),u?f:f.filter(d=>d)})}a(c7,"startsWith");function l7(e,t,r,n,s=!1,i=void 0,o=void 0){return ix(e,t,r,n,s,i,o,!0)}a(l7,"endsWith");function ix(e,t,r,n,s=!1,i=void 0,o=void 0,c=!1){return Ua(e,r,n),_l(e,null,r,(l,u,f,d)=>{let _=sx(f,l,d,r);return o=Number.isInteger(o)?o:0,u.getKeys({transaction:l,end:s?!1:void 0,reverse:s}).flatMap(p=>{let h=p.toString();return h.endsWith(rx)?u.getValues(p,{transaction:l}).map(S=>{let g=_(p,S);if(c?g.endsWith(n):g.includes(n))return{key:g,value:S}}).filter(S=>S):(c?h.endsWith(n):h.includes(n))?u[xE.DBI_DEFINITION_NAME].is_hash_attribute?{key:p,value:p}:u.getValues(p,{transaction:l}).map(S=>({key:p,value:S})):[]}).slice(o,i===void 0?void 0:i+(o||0))})}a(ix,"contains");function u7(e,t,r,n,s=!1,i=void 0,o=void 0){Ua(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),$_(e,t,r,n,l,s,i,o,!0,!1)}a(u7,"greaterThan");function d7(e,t,r,n,s=!1,i=void 0,o=void 0){Ua(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),$_(e,t,r,n,l,s,i,o,!1,!1)}a(d7,"greaterThanEqual");function f7(e,t,r,n,s=!1,i=void 0,o=void 0){Ua(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),$_(e,t,r,l,n,s,i,o,!1,!0)}a(f7,"lessThan");function _7(e,t,r,n,s=!1,i=void 0,o=void 0){Ua(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),$_(e,t,r,l,n,s,i,o,!1,!1)}a(_7,"lessThanEqual");function p7(e,t,r,n,s,i=!1,o=void 0,c=void 0){if(es.validateEnv(e),r===void 0)throw new Error(Jt.ATTRIBUTE_REQUIRED);if(n===void 0)throw new Error(Jt.START_VALUE_REQUIRED);if(s===void 0)throw new Error(Jt.END_VALUE_REQUIRED);if(n=es.convertKeyValueToWrite(n),s=es.convertKeyValueToWrite(s),n>s)throw new Error(Jt.END_VALUE_MUST_BE_GREATER_THAN_START_VALUE);return $_(e,t,r,n,s,i,o,c)}a(p7,"between");function h7(e,t,r,n){es.validateEnv(e);let s=e.database||e,i=e.database?e:null;if(t===void 0)throw new Error(Jt.HASH_ATTRIBUTE_REQUIRED);if(HE(r),r=V_(s,r),n===void 0)throw new Error(Jt.ID_REQUIRED);let o=null,c=s.dbis[t].get(n,{transaction:i,lazy:r.length<3});return c&&(o=BE.parseRow(c,r)),o}a(h7,"searchByHash");function m7(e,t,r){es.validateEnv(e);let n=e.database||e,s=e.database?e:null;if(t===void 0)throw new Error(Jt.HASH_ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(Jt.ID_REQUIRED);let i=!0;return n.dbis[t].get(r,{transaction:s,lazy:!0})===void 0&&(i=!1),i}a(m7,"checkHashExists");function E7(e,t,r,n,s=[]){return ax(e,t,r,n,s),ox(e,t,r,n,s).map(i=>i[1])}a(E7,"batchSearchByHash");function g7(e,t,r,n,s=[]){ax(e,t,r,n,s);let i=new Map;for(let[o,c]of ox(e,t,r,n,s))i.set(o,c);return i}a(g7,"batchSearchByHashToMap");function ox(e,t,r,n,s=[]){return _l(e,t,t,(i,o,c)=>{r=V_(c,r);let l=r.length<3;return n.map(u=>{let f=c.dbis[t].get(u,{transaction:i,lazy:l});if(f)return[u,BE.parseRow(f,r)];s.push(u)}).filter(u=>u)})}a(ox,"batchHashSearch");function ax(e,t,r,n,s){if(es.validateEnv(e),t===void 0)throw new Error(Jt.HASH_ATTRIBUTE_REQUIRED);if(HE(r),n==null)throw new Error(Jt.IDS_REQUIRED);if(!n[Symbol.iterator])throw new Error(Jt.IDS_MUST_BE_ITERABLE)}a(ax,"initializeBatchSearchByHash");function HE(e){if(!Array.isArray(e))throw e===void 0?new Error(Jt.FETCH_ATTRIBUTES_REQUIRED):new Error(Jt.FETCH_ATTRIBUTES_MUST_BE_ARRAY)}a(HE,"validateFetchAttributes");function Ua(e,t,r){if(es.validateEnv(e),t===void 0)throw new Error(Jt.ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(Jt.SEARCH_VALUE_REQUIRED);if(r?.length>t7)throw new Error(Jt.SEARCH_VALUE_TOO_LARGE)}a(Ua,"validateComparisonFunctions");function V_(e,t){return t.length===1&&Z9.SEARCH_WILDCARDS.indexOf(t[0])>=0&&(t=va.listDBIs(e)),t}a(V_,"setGetWholeRowAttributes");cx.exports={searchAll:r7,searchAllToMap:n7,count:a7,countAll:i7,equals:o7,startsWith:c7,endsWith:l7,contains:ix,searchByHash:h7,setGetWholeRowAttributes:V_,batchSearchByHash:E7,batchSearchByHashToMap:g7,checkHashExists:m7,iterateDBI:s7,greaterThan:u7,greaterThanEqual:d7,lessThan:f7,lessThanEqual:_7,between:p7}});var zu=P((cIe,_x)=>{var lx=require("lodash"),ux=ct(),qe=require("joi"),S7=ie(),{hdb_schema_table:K_,checkValidTable:dx,hdb_table:fx,hdb_database:kE}=Bi(),{handleHDBError:T7,hdb_errors:A7}=pe(),{getDatabases:R7}=(Le(),C(st)),{HTTP_STATUS_CODES:y7}=A7,b7=qe.object({database:kE,schema:kE,table:fx,search_attribute:K_,search_value:qe.any().required(),get_attributes:qe.array().min(1).items(qe.alternatives(K_,qe.object())).optional(),desc:qe.bool(),limit:qe.number().integer().min(1),offset:qe.number().integer().min(0)}),O7=qe.object({database:kE,schema:kE,table:fx,operator:qe.string().valid("and","or").default("and").lowercase(),offset:qe.number().integer().min(0),limit:qe.number().integer().min(1),get_attributes:qe.array().min(1).items(qe.alternatives(K_,qe.object())).optional(),sort:qe.object({attribute:qe.alternatives(K_,qe.array().min(1)),descending:qe.bool().optional()}).optional(),conditions:qe.array().min(1).items(qe.alternatives(qe.object({operator:qe.string().valid("and","or").default("and").lowercase(),conditions:qe.array()}),qe.object({search_attribute:qe.alternatives(K_,qe.array().min(1)),search_type:qe.string().valid("equals","contains","starts_with","ends_with","greater_than","greater_than_equal","less_than","less_than_equal","between","not_equal").optional(),search_value:qe.when("search_type",{switch:[{is:"equals",then:qe.any()},{is:"between",then:qe.array().items(qe.alternatives([qe.string(),qe.number()])).length(2)}],otherwise:qe.alternatives(qe.string(),qe.number())}).required()}))).required()});_x.exports=function(e,t){let r=null;switch(t){case"value":r=ux.validateBySchema(e,b7);break;case"hashes":let i=function(o){s?s+=". "+o:s=o};var n=i;a(i,"addError");let s;i(dx("database",e.schema)),i(dx("table",e.table)),e.hash_values?Array.isArray(e.hash_values)?e.hash_values.every(o=>typeof o=="string"||typeof o=="number")||i("'hash_values' must be strings or numbers"):i("'hash_values' must be an array"):i("'hash_values' is required"),e.get_attributes?Array.isArray(e.get_attributes)?e.get_attributes.length===0?i("'get_attributes' must contain at least 1 item"):e.get_attributes.every(o=>typeof o=="string"||typeof o=="number")||i("'get_attributes' must be strings or numbers"):i("'get_attributes' must be an array"):i("'get_attributes' is required"),s&&(r=new Error(s.trim()));break;case"conditions":r=ux.validateBySchema(e,O7);break;default:throw new Error(`Error validating search, unknown type: ${t}`)}if(!r&&e.schema!=="system"){let s=S7.checkGlobalSchemaTable(e.schema,e.table);if(s)return T7(new Error,s,y7.NOT_FOUND);let o=R7()[e.schema][e.table].attributes,c=e.get_attributes?[...e.get_attributes]:[];t==="value"&&c.push(e.search_attribute);let l=a(f=>{for(let d=0,_=f.conditions.length;d<_;d++){let p=f.conditions[d];p.conditions?l(p):c.push(p.search_attribute)}},"addConditions");t==="conditions"&&l(e);let u=lx.filter(c,f=>f!=="*"&&!f.startsWith?.("$")&&f.attribute!=="*"&&!Array.isArray(f)&&!f.name&&!lx.some(o,d=>d===f||d.attribute===f||d.attribute===f.attribute));if(u&&u.length>0){let f=u.join(", ");return f=f.replace(/,([^,]*)$/," and$1"),new Error(`unknown attribute '${f}'`)}}return r}});var Hb=P((uIe,px)=>{"use strict";var N7=pt(),w7=zu(),{getSchemaPath:I7}=gt();px.exports=C7;function C7(e){let t=w7(e,"hashes");if(t)throw t;let r=I7(e.schema,e.table);return N7.openEnvironment(r,e.table)}a(C7,"initialize")});var kb=P((fIe,hx)=>{"use strict";var P7=Wu(),D7=Hb();hx.exports=L7;async function L7(e){let t=await D7(e),r=t.useReadTransaction();r.database=t;let n=global.hdb_schema[e.schema][e.table];try{return P7.batchSearchByHashToMap(r,n.hash_attribute,e.get_attributes,e.hash_values)}finally{r.done()}}a(L7,"lmdbGetDataByHash")});var ju=P((pIe,mx)=>{"use strict";var Fb=class{static{a(this,"SearchByHashObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.hash_values=n,this.get_attributes=s}};mx.exports=Fb});var gx=P((EIe,Ex)=>{"use strict";var mIe=ju(),M7=Wu(),v7=Hb();Ex.exports=U7;async function U7(e){let t=await v7(e),r=global.hdb_schema[e.schema][e.table];return M7.batchSearchByHash(t,r.hash_attribute,e.get_attributes,e.hash_values)}a(U7,"lmdbSearchByHash")});var ai=P((SIe,Sx)=>{"use strict";var Gb=class{static{a(this,"SearchObject")}constructor(t,r,n,s,i,o,c,l=!1,u=void 0,f=void 0){this.schema=t,this.table=r,this.search_attribute=n,this.search_value=s,this.hash_attribute=i,this.get_attributes=o,this.end_value=c,this.reverse=l,this.limit=u,this.offset=f}};Sx.exports=Gb});var FE=P((AIe,Ox)=>{"use strict";var Zr=Wu(),x7=pt(),B7=ie(),$e=Gt(),pl=(k(),C(G)),H7=yo(),Tx=$n().LMDB_ERRORS_ENUM,{getSchemaPath:k7}=gt(),Po=pl.SEARCH_WILDCARDS;async function F7(e,t,r){let n;e.schema===pl.SYSTEM_SCHEMA_NAME?n=H7[e.table]:n=global.hdb_schema[e.schema][e.table];let s=bx(e,n.hash_attribute,r,t);return Rx(e,s,n.hash_attribute,r)}a(F7,"prepSearch");async function Rx(e,t,r,n){let s=k7(e.schema,e.table),i=await x7.openEnvironment(s,e.table),o=yx(i,e,t,r),c=o.transaction||i;if([$e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH,$e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP,$e.SEARCH_TYPES.SEARCH_ALL,$e.SEARCH_TYPES.SEARCH_ALL_TO_MAP].indexOf(t)>=0)return o;if(G7(e,r)===!1){let f=e.search_attribute;if(f===r)return n?Ax(o,()=>!0):o.map(_=>({[r]:_.key}));let d=a(_=>({[r]:_.value,[f]:_.key}),"toObject");return n?Ax(o,d):o.map(d)}let u=e.search_attribute===r?o.map(f=>f.key):o.map(f=>f.value);return n===!0?Zr.batchSearchByHashToMap(c,r,e.get_attributes,u):Zr.batchSearchByHash(c,r,e.get_attributes,u)}a(Rx,"executeSearch");function yx(e,t,r,n){let s,i=n;t.get_attributes.indexOf(n)<0&&(i=void 0);let{reverse:o,limit:c,offset:l}=t;switch(o=typeof o=="boolean"?o:!1,c=Number.isInteger(c)?c:void 0,l=Number.isInteger(l)?l:void 0,r){case $e.SEARCH_TYPES.EQUALS:s=Zr.equals(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.CONTAINS:s=Zr.contains(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.ENDS_WITH:case $e.SEARCH_TYPES._ENDS_WITH:s=Zr.endsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.STARTS_WITH:case $e.SEARCH_TYPES._STARTS_WITH:s=Zr.startsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:return Zr.batchSearchByHash(e,t.search_attribute,t.get_attributes,[t.search_value]);case $e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:return Zr.batchSearchByHashToMap(e,t.search_attribute,t.get_attributes,[t.search_value]);case $e.SEARCH_TYPES.SEARCH_ALL:return Zr.searchAll(e,n,t.get_attributes,o,c,l);case $e.SEARCH_TYPES.SEARCH_ALL_TO_MAP:return Zr.searchAllToMap(e,n,t.get_attributes,o,c,l);case $e.SEARCH_TYPES.BETWEEN:s=Zr.between(e,i,t.search_attribute,t.search_value,t.end_value,o,c,l);break;case $e.SEARCH_TYPES.GREATER_THAN:case $e.SEARCH_TYPES._GREATER_THAN:s=Zr.greaterThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.GREATER_THAN_EQUAL:case $e.SEARCH_TYPES._GREATER_THAN_EQUAL:s=Zr.greaterThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.LESS_THAN:case $e.SEARCH_TYPES._LESS_THAN:s=Zr.lessThan(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.LESS_THAN_EQUAL:case $e.SEARCH_TYPES._LESS_THAN_EQUAL:s=Zr.lessThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;default:return Object.create(null)}return s}a(yx,"searchByType");function Ax(e,t){let r=new Map;for(let n of e)r.set(n.value,t(n));return r}a(Ax,"createMapFromIterable");function G7(e,t){if(e.get_attributes.length===1&&e.get_attributes[0]==="*")return!0;let r=[e.search_attribute];e.get_attributes.indexOf(t)>=0&&r.push(t);let n=!1;for(let s=0;s<e.get_attributes.length;s++)if(r.indexOf(e.get_attributes[s])<0){n=!0;break}return n}a(G7,"checkToFetchMore");function bx(e,t,r,n){if(B7.isEmpty(n)){let s=e.search_value;typeof s=="object"?s=JSON.stringify(s):s=s.toString();let i=s.charAt(0),o=s.charAt(s.length-1),c=!1;if(e.search_attribute===t&&(c=!0),Po.indexOf(s)>-1)return r===!0?$e.SEARCH_TYPES.SEARCH_ALL_TO_MAP:$e.SEARCH_TYPES.SEARCH_ALL;if(s.indexOf(Po[0])<0&&s.indexOf(Po[1])<0)return c===!0?r===!0?$e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:$e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:$e.SEARCH_TYPES.EQUALS;if(Po.indexOf(i)>=0&&Po.indexOf(o)>=0)return e.search_value=e.search_value.slice(1,-1),$e.SEARCH_TYPES.CONTAINS;if(Po.indexOf(i)>=0)return e.search_value=e.search_value.substr(1),$e.SEARCH_TYPES.ENDS_WITH;if(Po.indexOf(o)>=0)return e.search_value=e.search_value.slice(0,-1),$e.SEARCH_TYPES.STARTS_WITH;if(s.includes(Po[0])||s.includes(Po[1]))return $e.SEARCH_TYPES.EQUALS;throw new Error(Tx.UNKNOWN_SEARCH_TYPE)}else switch(n){case pl.VALUE_SEARCH_COMPARATORS.BETWEEN:return $e.SEARCH_TYPES.BETWEEN;case pl.VALUE_SEARCH_COMPARATORS.GREATER:return $e.SEARCH_TYPES.GREATER_THAN;case pl.VALUE_SEARCH_COMPARATORS.GREATER_OR_EQ:return $e.SEARCH_TYPES.GREATER_THAN_EQUAL;case pl.VALUE_SEARCH_COMPARATORS.LESS:return $e.SEARCH_TYPES.LESS_THAN;case pl.VALUE_SEARCH_COMPARATORS.LESS_OR_EQ:return $e.SEARCH_TYPES.LESS_THAN_EQUAL;default:throw new Error(Tx.UNKNOWN_SEARCH_TYPE)}}a(bx,"createSearchTypeFromSearchObject");Ox.exports={executeSearch:Rx,createSearchTypeFromSearchObject:bx,prepSearch:F7,searchByType:yx}});var wx=P((bIe,Nx)=>{"use strict";var yIe=ai(),q7=zu(),$7=ie(),V7=(k(),C(G)),K7=FE();Nx.exports=Y7;function Y7(e,t){if(!$7.isEmpty(t)&&V7.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=q7(e,"value");if(n)throw n;return K7.prepSearch(e,t,!0)}a(Y7,"lmdbGetDataByValue")});var Y_=P((wIe,Ix)=>{"use strict";var NIe=ai(),W7=zu(),z7=ie(),j7=(k(),C(G)),J7=FE();Ix.exports=Q7;async function Q7(e,t){if(!z7.isEmpty(t)&&j7.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=W7(e,"value");if(n)throw n;return J7.prepSearch(e,t,!1)}a(Q7,"lmdbSearchByValue")});var Px=P((PIe,Cx)=>{"use strict";var CIe=Gt(),qb=class{static{a(this,"SearchByConditionsObject")}constructor(t,r,n,s,i=void 0,o=void 0,c="and"){this.schema=t,this.table=r,this.get_attributes=n,this.limit=i,this.offset=o,this.conditions=s,this.operator=c}},$b=class{static{a(this,"SearchCondition")}constructor(t,r,n){this.search_attribute=t,this.search_type=r,this.search_value=n}},Vb=class{static{a(this,"SortAttribute")}constructor(t,r){this.attribute=t,this.desc=r}};Cx.exports={SearchByConditionsObject:qb,SearchCondition:$b,SortAttribute:Vb}});var Ux=P((vIe,vx)=>{"use strict";var LIe=Px().SearchByConditionsObject,X7=ai(),Z7=zu(),Kb=Wu(),GE=Gt(),{Resource:MIe}=(ya(),C(HR)),Mx=FE(),eee=Bb(),tee=require("lodash"),{getSchemaPath:ree}=gt(),Dx=pt(),{handleHDBError:nee,hdb_errors:see}=pe(),{HTTP_STATUS_CODES:iee}=see,oee=1e8;vx.exports=aee;async function aee(e){let t=Z7(e,"conditions");if(t)throw nee(t,t.message,iee.BAD_REQUEST,void 0,void 0,!0);e.operator=e.operator?e.operator.toLowerCase():void 0,e.offset=Number.isInteger(e.offset)?e.offset:0;let r=ree(e.schema,e.table),n=await Dx.openEnvironment(r,e.table),s=global.hdb_schema[e.schema][e.table];for(let u of e.conditions)Dx.openDBI(n,u.search_attribute);let i=tee.sortBy(e.conditions,u=>{if(u.estimated_count===void 0){let f=u.search_type;f===GE.SEARCH_TYPES.EQUALS?u.estimated_count=Kb.count(n,u.search_attribute,u.search_value):f===GE.SEARCH_TYPES.CONTAINS||f===GE.SEARCH_TYPES.ENDS_WITH?u.estimated_count=1/0:u.estimated_count=oee}return u.estimated_count}),o=n.useReadTransaction();o.database=n;let c=await Lx(o,e,i[0],s.hash_attribute),l;if(!e.operator||e.operator.toLowerCase()==="and"){let u=n.dbis[s.hash_attribute],f=i.slice(1).map(Mx.filterByType),d=f.length,_=Kb.setGetWholeRowAttributes(n,e.get_attributes);l=c.map(p=>u.get(p,{transaction:o,lazy:!0})),d>0&&(l=l.filter(p=>{for(let h=0;h<d;h++)if(!f[h](p))return!1;return!0})),(e.offset||e.limit!==void 0)&&(l=l.slice(e.offset,e.limit!==void 0?(e.offset||0)+e.limit:void 0)),l=l.map(p=>eee.parseRow(p,_))}else{for(let d=1;d<i.length;d++){let _=i[d],p=await Lx(o,e,_,s.hash_attribute);c=c.concat(p)}let u=new Set,f=e.offset||0;c=c.filter(d=>u.has(d)?!1:(u.add(d),!0)).slice(f,e.limit&&e.limit+f),l=Kb.batchSearchByHash(o,s.hash_attribute,e.get_attributes,c)}return l.onDone=()=>{o.done()},l}a(aee,"lmdbSearchByConditions");async function Lx(e,t,r,n){let s=new X7(t.schema,t.table,void 0,void 0,n,t.get_attributes),i=r.search_type;return s.search_attribute=r.search_attribute,i===GE.SEARCH_TYPES.BETWEEN?(s.search_value=r.search_value[0],s.end_value=r.search_value[1]):s.search_value=r.search_value,Mx.searchByType(e,s,i,n).map(o=>o.value)}a(Lx,"executeConditionSearch")});var W_=P((xIe,xx)=>{"use strict";var cee=(k(),C(G)).OPERATIONS_ENUM,Yb=class{static{a(this,"DeleteObject")}constructor(t,r,n,s=void 0){this.operation=cee.DELETE,this.schema=t,this.table=r,this.hash_values=n,this.__origin=s}};xx.exports=Yb});var Wb=P((HIe,Vx)=>{"use strict";var Fx=ai(),Gx=W_(),qx=Y_(),$x=q_(),Cn=(k(),C(G)),Bx=ie(),Hx=pt(),{getTransactionAuditStorePath:lee,getSchemaPath:uee}=gt(),kx=J();Vx.exports=dee;async function dee(e){try{if(Bx.isEmpty(global.hdb_schema[e.schema])||Bx.isEmpty(global.hdb_schema[e.schema][e.table]))throw new Error(`unknown schema:${e.schema} and table ${e.table}`);await fee(e),await _ee(e);let t=uee(e.schema,e.table);try{await Hx.deleteEnvironment(t,e.table)}catch(r){if(r.message==="invalid environment")kx.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}try{let r=lee(e.schema,e.table);await Hx.deleteEnvironment(r,e.table,!0)}catch(r){if(r.message==="invalid environment")kx.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}}catch(t){throw t}}a(dee,"lmdbDropTable");async function fee(e){let t=new Fx(Cn.SYSTEM_SCHEMA_NAME,Cn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,Cn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[Cn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r=Array.from(await qx(t)),n=[];for(let i=0;i<r.length;i++){let o=r[i];n.push(o.id)}if(n.length===0)return;let s=new Gx(Cn.SYSTEM_SCHEMA_NAME,Cn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,n);await $x(s)}a(fee,"deleteAttributesFromSystem");async function _ee(e){let t=new Fx(Cn.SYSTEM_SCHEMA_NAME,Cn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,Cn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,e.table,void 0,[Cn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,Cn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,Cn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r,n;try{r=Array.from(await qx(t))}catch(i){throw i}for(let i=0;i<r.length;i++){let o=r[i];o.name===e.table&&o.schema===e.schema&&(n=o)}if(!n)throw new Error(`${e.schema}.${e.table} was not found`);let s=new Gx(Cn.SYSTEM_SCHEMA_NAME,Cn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,[n.id]);try{await $x(s)}catch(i){throw i}}a(_ee,"dropTableFromSystem")});var Yx=P((FIe,Kx)=>{"use strict";var pee=require("fs-extra"),hee=ai(),mee=ju(),Eee=W_(),gee=Wb(),See=q_(),Tee=kb(),Aee=Y_(),Do=(k(),C(G)),{getSchemaPath:Ree}=gt(),{handleHDBError:yee,hdb_errors:bee}=pe(),{HDB_ERROR_MSGS:Oee,HTTP_STATUS_CODES:Nee}=bee;Kx.exports=wee;async function wee(e){let t;try{t=await Iee(e.schema);let r=new hee(Do.SYSTEM_SCHEMA_NAME,Do.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,Do.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,t,void 0,[Do.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),n=Array.from(await Aee(r));for(let o=0;o<n.length;o++){let c={schema:t,table:n[o].name};try{await gee(c)}catch(l){if(l.message!=="invalid environment")throw l}}let s=new Eee(Do.SYSTEM_SCHEMA_NAME,Do.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[t]);await See(s);let i=Ree(t);await pee.remove(i)}catch(r){throw r}}a(wee,"lmdbDropSchema");async function Iee(e){let t=new mee(Do.SYSTEM_SCHEMA_NAME,Do.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[e],[Do.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),r,n;try{r=Array.from(await Tee(t))}catch(s){throw s}for(let[,s]of r)s.name===e&&(n=e);if(!n)throw yee(new Error,Oee.SCHEMA_NOT_FOUND(e),Nee.NOT_FOUND,void 0,void 0,!0);return n}a(Iee,"validateDropSchema")});var z_=P((qIe,Wx)=>{"use strict";var zb=class{static{a(this,"CreateTableObject")}constructor(t,r,n){this.schema=t,this.table=r,this.hash_attribute=n}};Wx.exports=zb});var Jb=P((KIe,zx)=>{"use strict";var Cee=require("fs-extra"),qE=pt(),{getTransactionAuditStorePath:Pee}=gt(),jb=Gt(),VIe=z_();zx.exports=Dee;async function Dee(e){let t;try{let r=Pee(e.schema,e.table);await Cee.mkdirp(r),t=await qE.createEnvironment(r,e.table,!0)}catch(r){throw r.message=`unable to create transactions audit environment for ${e.schema}.${e.table} due to: ${r.message}`,r}try{qE.createDBI(t,jb.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,!1,!0),qE.createDBI(t,jb.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,!0,!1),qE.createDBI(t,jb.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME,!0,!1)}catch(r){throw r.message=`unable to create dbi for ${e.schema}.${e.table} due to: ${r.message}`,r}return t}a(Dee,"createTransactionsAuditEnvironment")});var Qx=P((zIe,Jx)=>{"use strict";var Qb=(k(),C(G)),jx=pt(),Lee=tl(),{getSystemSchemaPath:Mee,getSchemaPath:vee}=gt(),WIe=yo(),Uee=hE(),Xb=pE(),xee=J(),Bee=Jb();Jx.exports=Hee;async function Hee(e,t){let r=vee(t.schema,t.table),n=new Xb(t.schema,t.table,Qb.TIME_STAMP_NAMES_ENUM.CREATED_TIME,void 0,!0),s=new Xb(t.schema,t.table,Qb.TIME_STAMP_NAMES_ENUM.UPDATED_TIME,void 0,!0),i=new Xb(t.schema,t.table,t.hash_attribute,void 0,!1,!0);try{if(await jx.createEnvironment(r,t.table),e!==void 0){let o=await jx.openEnvironment(Mee(),Qb.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME);await Lee.insertRecords(o,HDB_TABLE_INFO.hash_attribute,hdb_table_attributes,[e]),n.skip_table_check=!0,s.skip_table_check=!0,i.skip_table_check=!0,await Zb(n),await Zb(s),await Zb(i)}await Bee(t)}catch(o){throw o}}a(Hee,"lmdbCreateTable");async function Zb(e){try{await Uee(e)}catch(t){xee.warn(`failed to create attribute ${e.attribute} due to ${t.message}`)}}a(Zb,"createAttribute")});var Zx=P((JIe,Xx)=>{"use strict";var kee=y_(),Fee=Jf(),Gee=vE(),j_=(k(),C(G)),qee=tl().updateRecords,$ee=pt(),{getSchemaPath:Vee}=gt(),Kee=F_(),Yee=J();Xx.exports=Wee;async function Wee(e){try{let{schema_table:t,attributes:r}=kee(e);Fee(e,r,t.hash_attribute),e.schema!==j_.SYSTEM_SCHEMA_NAME&&(r.includes(j_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(j_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(j_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(j_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await Gee(e.hdb_auth_header,t,r),s=Vee(e.schema,e.table),i=await $ee.openEnvironment(s,e.table),o=await qee(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await Kee(e,o)}catch(c){Yee.error(`unable to write transaction due to ${c.message}`)}return{written_hashes:o.written_hashes,skipped_hashes:o.skipped_hashes,schema_table:t,new_attributes:n,txn_time:o.txn_time}}catch(t){throw t}}a(Wee,"lmdbUpdateRecords")});var tB=P((XIe,eB)=>{"use strict";var zee=(k(),C(G)).OPERATIONS_ENUM,eO=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=zee.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};eB.exports=eO});var nB=P((tCe,rB)=>{"use strict";var eCe=tB(),jee=y_(),Jee=Jf(),Qee=vE(),J_=(k(),C(G)),Xee=tl().upsertRecords,Zee=pt(),{getSchemaPath:ete}=gt(),tte=F_(),rte=J(),{handleHDBError:nte,hdb_errors:ste}=pe();rB.exports=ite;async function ite(e){let t;try{t=jee(e)}catch(l){throw nte(l,l.message,ste.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}let{schema_table:r,attributes:n}=t;Jee(e,n,r.hash_attribute),e.schema!==J_.SYSTEM_SCHEMA_NAME&&(n.includes(J_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||n.push(J_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),n.includes(J_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||n.push(J_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let s=await Qee(e.hdb_auth_header,r,n),i=ete(e.schema,e.table),o=await Zee.openEnvironment(i,e.table),c=await Xee(o,r.hash_attribute,n,e.records,e.__origin?.timestamp);try{await tte(e,c)}catch(l){rte.error(`unable to write transaction due to ${l.message}`)}return{written_hashes:c.written_hashes,schema_table:r,new_attributes:s,txn_time:c.txn_time}}a(ite,"lmdbUpsertRecords")});var iB=P((nCe,sB)=>{"use strict";var tO=class{static{a(this,"DeleteBeforeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.timestamp=n}};sB.exports=tO});var aB=P((iCe,oB)=>{"use strict";var rO=class{static{a(this,"DeleteAuditLogsBeforeResults")}constructor(t=void 0,r=void 0,n=0){this.start_timestamp=t,this.end_timestamp=r,this.transactions_deleted=n}};oB.exports=rO});var uB=P((cCe,lB)=>{"use strict";var nO=pt(),{getTransactionAuditStorePath:ote}=gt(),aCe=iB(),Q_=Gt(),ate=ie(),cB=aB(),cte=require("util").promisify,lte=cte(setTimeout),ute=1e4,dte=100;lB.exports=fte;async function fte(e){let t=ote(e.schema,e.table),r=await nO.openEnvironment(t,e.table,!0),n=nO.listDBIs(r);nO.initializeDBIs(r,Q_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s,i=new cB;do s=await _te(r,e.timestamp),i.start_timestamp===void 0&&(i.start_timestamp=s.start_timestamp),s.end_timestamp!==void 0&&(i.end_timestamp=s.end_timestamp),i.transactions_deleted+=s.transactions_deleted,await lte(dte);while(s.transactions_deleted>0);return i}a(fte,"deleteAuditLogsBefore");async function _te(e,t){let r=new cB;try{let n=e.dbis[Q_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP],s;for(let{key:i,value:o}of n.getRange({start:!1})){if(i>=t)break;r.start_timestamp===void 0&&(r.start_timestamp=i),s=n.remove(i);let c=o[Q_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME];ate.isEmpty(c)||(s=e.dbis[Q_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].remove(c,i));for(let l=0;l<o.hash_values.length;l++)s=e.dbis[Q_.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].remove(o.hash_values[l],i);if(r.transactions_deleted++,r.end_timestamp=i,r.transactions_deleted>ute)break}return await s,r}catch(n){throw n}}a(_te,"deleteTransactions")});var fB=P((uCe,dB)=>{"use strict";var sO=class{static{a(this,"DropAttributeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.attribute=n}};dB.exports=sO});var pB=P((_Ce,_B)=>{"use strict";var pte=ai(),hte=W_(),fCe=fB(),$i=(k(),C(G)),mte=ie(),iO=pt(),Ete=yo(),gte=Y_(),Ste=q_(),{getSchemaPath:Tte}=gt();_B.exports=Ate;async function Ate(e,t=!0){let r;e.schema===$i.SYSTEM_SCHEMA_NAME?r=Ete[e.table]:r=global.hdb_schema[e.schema][e.table];let n=await yte(e),s=Tte(e.schema,e.table),i=await iO.openEnvironment(s,e.table);return t===!0&&await Rte(e,i,r.hash_attribute),iO.dropDBI(i,e.attribute),n}a(Ate,"lmdbDropAttribute");async function Rte(e,t,r){let n=iO.openDBI(t,r),s,i=e.attribute;for(let{key:o,value:c,version:l}of n.getRange({start:!1,versions:!0})){let u={};for(let f in c)f!==i&&(u[f]=c[f]);s=t.dbis[r].put(o,u,l)}await s}a(Rte,"removeAttributeFromAllObjects");async function yte(e){let t=new pte($i.SYSTEM_SCHEMA_NAME,$i.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,$i.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[$i.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY,$i.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]),n=Array.from(await gte(t)).filter(o=>o[$i.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]===e.attribute);if(mte.isEmptyOrZeroLength(n))throw new Error(`Attribute '${e.attribute}' was not found in '${e.schema}.${e.table}'`);let s=n.map(o=>o[$i.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),i=new hte($i.SYSTEM_SCHEMA_NAME,$i.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,s);return Ste(i)}a(yte,"dropAttributeFromSystem")});var TB=P((mCe,SB)=>{"use strict";var oO=pt(),Ju=Gt(),hCe=mn(),aO=(k(),C(G)),hB=ie(),{getTransactionAuditStorePath:bte}=gt(),Ote=Wu(),$E=Vu(),Nte=J();SB.exports=wte;async function wte(e){let t=bte(e.schema,e.table),r=await oO.openEnvironment(t,e.table,!0),n=oO.listDBIs(r);oO.initializeDBIs(r,Ju.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s;switch(e.search_type){case aO.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.TIMESTAMP:return mB(r,e.search_values);case aO.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:return s=global.hdb_schema[e.schema][e.table].hash_attribute,Cte(r,e.search_values,s);case aO.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME:return Ite(r,e.search_values);default:return mB(r)}}a(wte,"readAuditLog");function mB(e,t=[0,Date.now()]){hB.isEmpty(t[0])&&(t[0]=0),hB.isEmpty(t[1])&&(t[1]=Date.now());let r=e.dbis[Ju.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP],n;for(let s of r.getKeys({start:t[1]}))if(s!==t[1]){n=s;break}return r.getRange({start:t[0],end:n}).map(({value:s})=>Object.assign(new $E,s))}a(mB,"searchTransactionsByTimestamp");function Ite(e,t=[]){let r=new Map;for(let n=0;n<t.length;n++){let s=t[n],i=[];for(let o of e.dbis[Ju.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].getValues(s))i.push(o);r.set(s,gB(e,i))}return Object.fromEntries(r)}a(Ite,"searchTransactionsByUsername");function Cte(e,t,r){let n=new Map;for(let c=0,l=t.length;c<l;c++){let u=t[c],f=Ote.equals(e,Ju.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,Ju.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,u);for(let{value:d}of f){let _=Number(d);n.has(_)?n.get(_).push(u.toString()):n.set(_,[u.toString()])}}let s=Array.from(n.keys()),i=gB(e,s),o=new Map;for(let c=0;c<i.length;c++){let l=i[c],u=l.timestamp,f=n.get(u);EB(l,"records",r,f,o),EB(l,"original_records",r,f,o)}return Object.fromEntries(o)}a(Cte,"searchTransactionsByHashValues");function EB(e,t,r,n,s){let i=e.timestamp;if(e[t])for(let o=0;o<e[t].length;o++){let c=e[t][o],l=c[r].toString();if(n.indexOf(l)>=0)if(s.has(l)){let u=s.get(l),f=u[u.length-1];if(f.timestamp===i)f[t]=[c];else{let d=new $E(e.operation,e.user_name,i,void 0);d[t]=[c],u.push(d)}}else{let u=new $E(e.operation,e.user_name,i,void 0);u[t]=[c],s.set(l,[u])}}}a(EB,"loopRecords");function gB(e,t){let r=[];try{let n=e.dbis[Ju.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP];for(let s=0;s<t.length;s++)try{let i=n.get(t[s]);if(i){let o=Object.assign(new $E,i);r.push(o)}}catch(i){Nte.warn(i)}return r}catch(n){throw n}}a(gB,"batchSearchTransactions")});var RB=P((TCe,AB)=>{"use strict";var{getSchemaPath:gCe}=gt(),SCe=pt(),{database:Pte}=(Le(),C(st));AB.exports={writeTransaction:Dte};async function Dte(e,t,r){return Pte({database:e,table:t}).transaction(r)}a(Dte,"writeTransaction")});var NB=P((RCe,OB)=>{"use strict";var{getSchemaPath:yB}=gt(),bB=pt();OB.exports={flush:Lte,resetReadTxn:Mte};async function Lte(e,t){return(await bB.openEnvironment(yB(e,t),t.toString())).flushed}a(Lte,"flush");async function Mte(e,t){try{(await bB.openEnvironment(yB(e,t),t.toString())).resetReadTxn()}catch{}}a(Mte,"resetReadTxn")});var PB=P((bCe,CB)=>{"use strict";var{Readable:vte}=require("stream"),{getDatabases:Ute}=(Le(),C(st)),{readSync:xte,openSync:Bte,createReadStream:wB}=require("fs"),{open:Hte}=require("lmdb"),IB=g_(),kte=S_(),{AUDIT_STORE_OPTIONS:Fte}=(Mi(),C(DB)),{INTERNAL_DBIS_NAME:Gte,AUDIT_STORE_NAME:qte}=Gt();CB.exports=Vte;var cO=32768,$te=100;async function Vte(e){let t=e.database||e.schema||"data",r=Ute()[t],n=new Date().toISOString(),s=e.tables||e.table&&[e.table];if(s){let u=r[s[0]];if(!u)throw new Error(`Can not find table ${s[0]}`);let f=u.dbisDB,d=Hte({noSync:!0,maxDbs:kte.MAX_DBS}),_,p=d.openDB(Gte,new IB(!1)),h=f.useReadTransaction(),S=0,g=a(async function(E,T){T.encoding="binary",T.encoder=void 0;let N=d.openDB(E,T),M=f.openDB(E,T);for(let{key:H,version:Z,value:W}of M.getRange({start:null,transaction:h,versions:M.useVersions}))_=N.put(H,W,Z),S++%$te===0&&(await new Promise($=>setTimeout($,20)),h.openTimer&&(h.openTimer=0))},"copyDatabase");for(let{key:E,value:T}of f.getRange({transaction:h,start:!1}))if(s.some(N=>E.startsWith?.(N+"/"))){p.put(E,T);let[,N]=E.split("/"),M=!N,H=new IB(!M,M);await g(E,H)}e.include_audit&&await g(qte,{...Fte}),await _;let R=wB(d.path);return R.headers=l(),R.on("close",()=>{h.done(),d.close()}),R}let o=r[Object.keys(r)[0]].primaryStore,c=Bte(o.path);return o.transaction(()=>{let u=Buffer.alloc(cO);xte(c,u,0,cO),o.resetReadTxn();let f=o.useReadTransaction();f.renew();let d=wB(null,{fd:c,start:cO}),_=new vte.from(async function*(){yield u;for await(let p of d)f.openTimer&&(f.openTimer=0),yield p;f.done()}());return _.headers=l(),_});function l(){let u=new Map;return u.set("content-type","application/octet-stream"),u.set("content-disposition",`attachment; filename="${t}"`),u.set("date",n),u}}a(Vte,"getBackup")});var vB=P((NCe,MB)=>{"use strict";var Kte=J(),{handleHDBError:Yte}=pe(),Wte=KM(),zte=hE(),jte=Lb(),Jte=Y0(),Qte=q_(),Xte=kb(),Zte=gx(),ere=wx(),tre=Y_(),rre=Ux(),nre=Yx(),sre=Qx(),ire=Zx(),ore=nB(),are=uB(),cre=Wb(),lre=pB(),ure=TB(),dre=RB(),LB=NB(),fre=PB(),lO=class extends Wte{static{a(this,"LMDBBridge")}async searchByConditions(t){return rre(t)}async getDataByHash(t){return await Xte(t)}async searchByHash(t){return await Zte(t)}async getDataByValue(t,r){return await ere(t,r)}async searchByValue(t){return await tre(t)}async createSchema(t){return await Jte(t)}async dropSchema(t){return await nre(t)}async createTable(t,r){return await sre(t,r)}async dropTable(t){return await cre(t)}async createAttribute(t){return await zte(t)}async createRecords(t){return await jte(t)}async updateRecords(t){return await ire(t)}async upsertRecords(t){try{return await ore(t)}catch(r){throw Yte(r,null,null,Kte.ERR,r)}}async deleteRecords(t){return await Qte(t)}async dropAttribute(t){return await lre(t)}async deleteAuditLogsBefore(t){return await are(t)}async readAuditLog(t){return await ure(t)}writeTransaction(t,r,n){return dre.writeTransaction(t,r,n)}flush(t,r){return LB.flush(t,r)}resetReadTxn(t,r){return LB.resetReadTxn(t,r)}getBackup(t){return fre(t)}};MB.exports=lO});var dO={};xe(dO,{add:()=>VE,applyReverse:()=>UB,getRecordAtTime:()=>uO,rebuildUpdateBefore:()=>KE});function VE(e,t,r){let n=e[t];typeof n=="bigint"?e[t]=n+BigInt(r.value):isNaN(e[t])?e[t]=r.value:e[t]=n+r.value}function KE(e,t,r){let n=null;for(let s in e)if(s in t){let i=t[s];if(i?.__op__){let o=e[s];if(o?.__op__)if(o.__op__===i.__op__)n||(n={}),n[s]=o;else throw new Error("Can not merge updates with different operations");else n||(n={}),n[s]=o,VE(n,s,i)}else r&&(n||(n={}),n[s]=i)}else n||(n={}),n[s]=e[s];return n}function UB(e,t){for(let r in t){let n=t[r];if(n?.__op__){let s=_re[n.__op__]?.reverse;if(s)s(e,r,{value:n.value});else throw new Error(`Unsupported operation ${n.__op__}`)}else e[r]=xB}}function uO(e,t,r){let n=r.rootStore.auditStore,s={...e.value},i=e.localTime;for(;i>t;){let l=n.get(i),u=St(l);switch(u.type){case"put":s=u.getValue(r);break;case"patch":UB(s,u.getValue(r));break;case"delete":s=null}i=u.previousLocalTime}let o={},c=0;for(let l in s)s[l]===xB&&(o[l]=!0,c++);for(;c>0&&i>0;){let l=n.get(i),u=St(l),f;switch(u.type){case"put":f=u.getValue(r);break;case"patch":f=u.getValue(r);break}for(let d in f)o[d]&&(s[d]=f[d],o[d]=!1,c--);i=u.previousLocalTime}if(c>0)for(let l in o)s[l]=null;return s}var _re,xB,YE=Re(()=>{Mi();a(VE,"add");VE.reverse=function(e,t,r){let n=e[t];typeof n=="bigint"?e[t]=n-BigInt(r.value):isNaN(e[t])||(e[t]=n-r.value)};_re={add:VE};a(KE,"rebuildUpdateBefore");a(UB,"applyReverse");xB={};a(uO,"getRecordAtTime")});function Pn(e){let t=e.getChanges();return t||(t=Object.create(null),e._setChanges(t)),t}function JE(e,t){let r=e.prototype,n={},s=t.attributes||t.properties||[];for(let c of s){let l=c.name,u,f;if(c.resolve)f={get(){return c.resolve(this,this.getContext?.())},set(d){return c.set(this,d)},configurable:!0};else{switch(c.type){case"String":u=a(function(d){if(!(typeof d=="string"||d==null&&c.nullable!==!1))throw new ts.ClientError(`${l} must be a string, attempt to assign ${d}`);Pn(this)[l]=d},"set");break;case"ID":u=a(function(d){if(!(typeof d=="string"||d?.length>0&&d.every?.(_=>typeof _=="string")||d==null&&c.nullable!==!1))throw new ts.ClientError(`${l} must be a string, attempt to assign ${d}`);Pn(this)[l]=d},"set");break;case"Float":case"Number":u=a(function(d){let _=d?.__op__?d.value:d;if(!(typeof _=="number"||d==null&&c.nullable!==!1))throw new ts.ClientError(`${l} must be a number, attempt to assign ${_}`);Pn(this)[l]=d},"set");break;case"Int":u=a(function(d){let _=d?.__op__?d.value:d;if(!(_>>0===_||d==null&&c.nullable!==!1))if(typeof _=="number"&&Math.abs((_>>0)-_)<=1)_=Math.round(_),d?.__op__?d.value=_:d=_;else throw new ts.ClientError(`${l} must be an integer between -2147483648 and 2147483647, attempt to assign ${d}`);Pn(this)[l]=d},"set");break;case"Long":u=a(function(d){let _=d?.__op__?d.value:d;if(!(Math.round(_)===d&&Math.abs(_)<=9007199254740992||d==null&&c.nullable!==!1))if(typeof _=="number"&&Math.abs(_)<=9007199254740992)_=Math.round(_),d?.__op__?d.value=_:d=_;else throw new ts.ClientError(`${l} must be an integer between -9007199254740992 and 9007199254740992, attempt to assign ${d}`);Pn(this)[l]=d},"set");break;case"BigInt":u=a(function(d){let _=d?.__op__?d.value:d;if(!(typeof _=="bigint"||d==null&&c.nullable!==!1))if(typeof _=="string"||typeof _=="number")_=BigInt(_),d?.__op__?d.value=_:d=_;else throw new ts.ClientError(`${l} must be a number, attempt to assign ${d}`);Pn(this)[l]=d},"set");break;case"Boolean":u=a(function(d){if(!(typeof d=="boolean"||d==null&&c.nullable!==!1))throw new ts.ClientError(`${l} must be a boolean, attempt to assign ${d}`);Pn(this)[l]=d},"set");break;case"Date":u=a(function(d){if(!(d instanceof Date||d==null&&c.nullable!==!1))if(typeof d=="string"||typeof d=="number")d=new Date(d);else throw new ts.ClientError(`${l} must be a Date, attempt to assign ${d}`);Pn(this)[l]=d},"set");break;case"Bytes":u=a(function(d){if(!(d instanceof Uint8Array||d==null&&c.nullable!==!1))throw new ts.ClientError(`${l} must be a Buffer or Uint8Array, attempt to assign ${d}`);Pn(this)[l]=d},"set");break;case"Blob":u=a(function(d){if(!(d instanceof Li||d==null&&c.nullable!==!1))throw new ts.ClientError(`${l} must be a Blob, attempt to assign ${d}`);Pn(this)[l]=d},"set");break;case"Any":case void 0:u=a(function(d){Pn(this)[l]=d},"set");break;default:u=a(function(d){if(!(typeof d=="object"||d==null&&c.nullable!==!1))throw new ts.ClientError(`${l} must be an object, attempt to assign ${d}`);Pn(this)[l]=d},"set")}f={get(){let d=this.getChanges?.();if(d&&l in d){let p=d[l];if(p?.__op__){let h=this.getRecord()?.[l];return p.update(h)}return p}let _=this.getRecord()?.[l];if(_&&typeof _=="object"){let p=fO(_,c);if(p)return d||this._setChanges(d=Object.create(null)),d[l]=p}return _},set:u,enumerable:!0,configurable:!0}}f.get.isAttribute=!0,n[l]=f,(!(l in r)||Object.getOwnPropertyDescriptor(r,l)?.get?.isAttribute)&&Object.defineProperty(r,l,f)}i("getProperty",function(c){let l=n[c];if(l)return l.get.call(this);let u=this.getChanges();return u?.[c]!==void 0?u[c]:this.getRecord()?.[c]}),i("set",function(c,l){let u=n[c];if(u)return u.set.call(this,l);if(t.sealed)throw new ts.ClientError("Can not add a property to a sealed table schema");Pn(this)[c]=l}),i("deleteProperty",function(c){Pn(this)[c]=void 0}),i("toJSON",function(){let c=this.getChanges?.(),l;for(let f in c){l||(l={...this.getRecord()});let d=c[f];if(d?.__op__){let _=l[f];d=d.update(_)}l[f]=d}return Object.keys(this).length>0&&(l||(l={...this.getRecord()}),Object.assign(l,this)),l||this.getRecord()}),r.get||i("get",r.getProperty),r.delete||i("delete",r.deleteProperty),r.then||i("then",null);function i(c,l){Object.defineProperty(r,c,{value:l,configurable:!0})}a(i,"setMethod");let o=r;do{let c=Object.getPrototypeOf(o);if(c===Object.prototype){Object.setPrototypeOf(o,HB);break}o=c}while(o&&o!==HB)}function fO(e,t){let r;switch(e.constructor){case Object:return t?(r=t.TrackedObject,r||(t.TrackedObject=r=class extends X_{static{a(this,"TrackedObject")}},JE(r,t)),new r(e)):new X_(e);case Array:let n=new zE(e.length,e);for(let s=0,i=e.length;s<i;s++){let o=e[s];o&&typeof o=="object"&&(o=fO(o,t?.elements)),n[s]=o}return n;default:return e}}function QE(e){let t=e.getChanges?.(),r;for(let s in t){r||(r=e.getRecord?{...e.getRecord()}:{});let i=t[s];if(i&&typeof i=="object")if(i.__op__){let o=r[s];i=i.update(o)}else i=QE(i);r[s]=i}return Object.keys(e).length>0&&(r||(r=e.getRecord?{...e.getRecord()}:{}),Object.assign(r,e)),r||e.getRecord?.()||e}function Qu(e,t=e.getChanges?.()){let r;if(e.getRecord&&e.constructor===Array&&!Object.isFrozen(e)){r=e;for(let n=0,s=e.length;n<s;n++){let i=e[n];if(i&&typeof i=="object"){let o=Qu(i);o!==i&&r===e&&(r=e.slice(0)),i=o}r[n]=i}return Object.freeze(r)}for(let n in t){r||(r={...e.getRecord?.()});let s=t[n];if(s&&typeof s=="object")if(s.__op__){let i=dO[s?.__op__];if(i)i(r,n,s);else throw new Error("Invalid CRDT operation "+s.__op__);continue}else s=Qu(s);r[n]=s}if(!Array.isArray(e))for(let n in e)pre.call(e,n)&&(r||(r={...e.getRecord?.()}),r[n]=e[n]);return r?Object.freeze(r):e.getRecord?.()??e}function WE(e){let t=e.getRecord?.();if(t===void 0)return!0;if(e.constructor===Array){if(!t||e[hl]||e.length!==t.length)return!0;for(let r=0,n=e.length;r<n;r++){let s=t[r],i=e[r];if(s&&i?.getRecord?.()===s){if(WE(i))return!0}else return!0}}else{let r=e.getChanges?.();if(r&&!t)return!0;for(let n in r){let s=r[n];if(s&&typeof s=="object"){let i=t[n];if(i&&s.getRecord?.()===i){if(WE(s))return!0}else return!0}else return!0}}return!1}var ts,BB,HB,X_,pre,hl,zE,jE,_O=Re(()=>{ts=v(pe());YE();Rn();a(Pn,"getChanges");a(JE,"assignTrackedAccessors");BB=Object.prototype,HB=new Proxy({},{get(e,t,r){if(typeof t=="string"){if(t==="then"||t==="getRecord"||t==="getChanges")return;if(BB[t])return BB[t];let n=r.getChanges?.();if(n&&t in n)return n[t];let s=r.getRecord?.()?.[t];if(s&&typeof s=="object"){let i=fO(s);if(i)return n||(n=Object.create(null),r._setChanges(n)),n[t]=i,i}return s}}});a(fO,"trackObject");X_=class{static{a(this,"GenericTrackedObject")}#e;#t;constructor(t){if(t?.getRecord)throw new Error("Can not track an already tracked object, check for circular references");this.#e=t}getRecord(){return this.#e}setRecord(t){this.#e=t}getChanges(){return this.#t}_setChanges(t){this.#t=t}};JE(X_,{});a(QE,"collapseData");pre=Object.prototype.hasOwnProperty;a(Qu,"updateAndFreeze");a(WE,"hasChanges");hl=Symbol.for("has-array-changes"),zE=class extends Array{static{a(this,"TrackedArray")}#e;[hl];constructor(t,r){super(t),this.#e=r}getRecord(){return this.#e}splice(...t){return this[hl]=!0,super.splice(...t)}push(...t){return this[hl]=!0,super.push(...t)}pop(){return this[hl]=!0,super.pop()}unshift(...t){return this[hl]=!0,super.unshift(...t)}shift(){return this[hl]=!0,super.shift()}};zE.prototype.constructor=Array;jE=class{constructor(t){this.value=t}static{a(this,"Addition")}__op__="add";update(t){return(+t||0)+this.value}}});var YB={};xe(YB,{ResourceBridge:()=>mO});function EO({get_attributes:e},t){if(e){if(e[0]==="*"){if(t.schemaDefined)return;e=t.attributes.map(r=>r.name)}return e.forceNulls=!0,e}}function FB(e,t){let r=Vi(e),n=EO(e,r);if(!r)throw new ci.ClientError(`Table ${e.table} not found`);let s;n&&r.attributes.length-n.length>2&&n.length<5&&(s=!0);let i={user:e.hdb_user,onlyIfCached:e.onlyIfCached,noCacheStore:e.noCacheStore,noCache:e.noCache,replicateFrom:e.replicateFrom},o;Pt(i,()=>new Promise(u=>o=u));let c=e.ids||e.hash_values,l=0;return{[Symbol.asyncIterator](){return{async next(){if(l<c.length){let u=c[l++],f;try{f=await r.get({id:u,lazy:s,select:n},i),f=f&&QE(f)}catch(d){f={message:d.toString()}}return t?{value:{key:u,value:f}}:{value:f}}else return o(),{done:!0}},return(u){return o(),{value:u,done:!0}},throw(u){return o(),{done:!0}}}}}}function Vi(e){let t=e.database||e.schema||mre,r=Xe()[t];if(!r)throw(0,ci.handleHDBError)(new Error,hre.SCHEMA_NOT_FOUND(t),404);return r[e.table]}function GB(e,t,r){let n=e.length+t.length,s=n===1?"record":"records";return{message:`${e.length} of ${n} ${s} successfully deleted`,deleted_hashes:e,skipped_hashes:t,txn_time:r}}async function*qB(e,t,r,n){let s,i=0;for await(let o of e.getHistory(t,r)){let c=o.operation??o.type;c==="put"&&(c="upsert");let{id:l,version:u,value:f}=o;if(s?.timestamp===u)s.hash_values.push(l),s.records.push(f);else{if(s&&(yield s,i++,n&&n<=i)){s=void 0;break}s={operation:c,user_name:o.user,timestamp:u,hash_values:[l],records:[f]}}}s&&(yield s)}var $B,XE,ci,VB,pO,hO,KB,hre,mre,Ere,gre,kB,mO,WB=Re(()=>{"use strict";$B=v(vB()),XE=v(zu()),ci=v(pe());Le();VB=v(y_());k();pO=v(Co()),hO=v(oi()),KB=v(ie());Hc();_O();({HDB_ERROR_MSGS:hre}=ci.hdb_errors),mre="data",Ere=1e4,gre=10,mO=class extends $B.default{static{a(this,"ResourceBridge")}constructor(t){super(t),kB=this}async searchByConditions(t){t.select!==void 0&&(t.get_attributes=t.select);for(let o of t.conditions||[])o?.attribute!==void 0&&(o.search_attribute=o.attribute),o?.comparator!==void 0&&(o.search_type=o.comparator),o?.value!==void 0&&(o.search_value=o.value);let r=(0,XE.default)(t,"conditions");if(r)throw(0,ci.handleHDBError)(r,r.message,400,void 0,void 0,!0);let n=Vi(t);if(!n)throw new ci.ClientError(`Table ${t.table} not found`);let s=t.conditions.map(i);function i(o){return o.conditions?(o.conditions=o.conditions.map(i),o):{attribute:o.search_attribute??o.attribute,comparator:o.search_type??o.comparator,value:o.search_value!==void 0?o.search_value:o.value}}return a(i,"mapCondition"),n.search({conditions:s,operator:t.operator?t.operator.toLowerCase():void 0,limit:t.limit,offset:t.offset,reverse:t.reverse,select:EO(t,n),sort:t.sort,allowFullScan:!0},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async createTable(t,r){let n=r.attributes,s=!!n,i=r.primary_key||r.hash_attribute;if(n)for(let o of n)o.is_primary_key?(o.isPrimaryKey=!0,delete o.is_primary_key):o.name===i&&i&&(o.isPrimaryKey=!0);else{if(!i)throw new ci.ClientError("A primary key must be specified with a `primary_key` property or with `attributes`");n=[{name:i,isPrimaryKey:!0},{name:"__createdtime__",indexed:!0},{name:"__updatedtime__",indexed:!0}]}_t({database:r.database??r.schema,table:r.table,attributes:n,schemaDefined:s,expiration:r.expiration,audit:r.audit})}async createAttribute(t){return await Vi(t).addAttributes([{name:t.attribute,indexed:t.indexed??!0}]),`attribute ${t.schema}.${t.table}.${t.attribute} successfully created.`}async dropAttribute(t){let r=Vi(t);if(await r.removeAttributes([t.attribute]),!r.schemaDefined){let n=t.attribute,s,i=a((o,c,l)=>(c={...c},delete c[n],r.primaryStore.ifVersion(o,l,()=>r.primaryStore.put(o,c,l)).then(u=>{if(!u){let{value:f,version:d}=r.primaryStore.getEntry(o);return i(o,f,d)}})),"deleteRecord");for(let{key:o,value:c,version:l}of r.primaryStore.getRange({start:!0,versions:!0}))s=i(o,c,l),await new Promise(u=>setImmediate(u));await s}return`successfully deleted ${t.schema}.${t.table}.${t.attribute}`}dropTable(t){Vi(t).dropTable()}createSchema(t){return Xu({database:t.schema,table:null}),pO.signalSchemaChange(new hO.SchemaEventMsg(process.pid,zt.CREATE_SCHEMA,t.schema))}async dropSchema(t){await gO(t.schema),pO.signalSchemaChange(new hO.SchemaEventMsg(process.pid,zt.DROP_SCHEMA,t.schema))}async updateRecords(t){return t.requires_existing=!0,this.upsertRecords(t)}async createRecords(t){return t.requires_no_existing=!0,kB.upsertRecords(t)}async upsertRecords(t){let{schema_table:r,attributes:n}=(0,VB.default)(t),s,i=Xe()[t.schema][t.table],o={user:t.hdb_user,expiresAt:t.expiresAt,originatingOperation:t.operation};return t.replicateTo&&(o.replicateTo=t.replicateTo),t.replicatedConfirmation&&(o.replicatedConfirmation=t.replicatedConfirmation),Pt(o,async c=>{if(!i.schemaDefined){s=[];for(let f of n)i.attributes.find(_=>_.name==f)||s.push(f);s.length>0&&await i.addAttributes(s.map(f=>({name:f,indexed:!0})))}let l=[],u=[];for(let f of t.records){let d=f[i.primaryKey],_=d!=null&&await i.get(d,o);if(t.requires_existing&&!_||t.requires_no_existing&&_){u.push(f[i.primaryKey]);continue}_&&(_=QE(_));for(let p in f)if(Object.prototype.hasOwnProperty.call(f,p)){let h=f[p];if(typeof h=="function")try{let S=h([[_]]);Array.isArray(S)&&(h=S[0].func_val,f[p]=h)}catch(S){throw S.message+="Trying to set key "+p+" on object"+JSON.stringify(f),S}}if(_)for(let p in _)Object.prototype.hasOwnProperty.call(f,p)||(f[p]=_[p]);await(d==null?i.create(f,o):i.put(f,o)),l.push(f[i.primaryKey])}return{txn_time:c.timestamp,written_hashes:l,new_attributes:s,skipped_hashes:u}})}async deleteRecords(t){let r=Xe()[t.schema][t.table],n={user:t.hdb_user};return t.replicateTo&&(n.replicateTo=t.replicateTo),t.replicatedConfirmation&&(n.replicatedConfirmation=t.replicatedConfirmation),Pt(n,async s=>{let i=t.hash_values||t.records.map(l=>l[r.primaryKey]),o=[],c=[];for(let l of i)await r.delete(l,n)?o.push(l):c.push(l);return GB(o,c,s.timestamp)})}async deleteRecordsBefore(t){let r=Xe()[t.schema][t.table];if(!r.createdTimeProperty)throw new ci.ClientError("Table must have a '__createdtime__' attribute or @createdTime timestamp defined to perform this operation");let n=await r.search({conditions:[{attribute:r.createdTimeProperty.name,value:Date.parse(t.date),comparator:Sm.LESS}]}),s=!1,i=[],o=[],c=0,l=[],u=a(async()=>{let f=await this.deleteRecords({schema:t.schema,table:t.table,hash_values:l});i.push(...f.deleted_hashes),o.push(...f.skipped_hashes),await(0,KB.async_set_timeout)(gre),l=[],s=!0},"chunkDelete");for await(let f of n)l.push(f[r.primaryKey]),c++,c%Ere===0&&await u();return l.length>0&&await u(),s?GB(i,o,void 0):{message:"No records found to delete"}}searchByHash(t){t.select!==void 0&&(t.get_attributes=t.select);let r=(0,XE.default)(t,"hashes");if(r)throw r;return FB(t)}async getDataByHash(t){let r=new Map;t._returnKeyValue=!0;for await(let{key:n,value:s}of FB(t,!0))r.set(n,s);return r}searchByValue(t,r){if(r&&ER[r]===void 0)throw new Error(`Value search comparator - ${r} - is not valid`);t.select!==void 0&&(t.get_attributes=t.select),t.attribute!==void 0&&(t.search_attribute=condition.attribute),t.value!==void 0&&(t.search_value=condition.value);let n=(0,XE.default)(t,"value");if(n)throw n;let s=Vi(t);if(!s)throw new ci.ClientError(`Table ${t.table} not found`);let i=t.search_value;i.includes?.("*")&&(i.startsWith("*")?i.endsWith("*")?i!=="*"&&(r="contains",i=i.slice(1,-1)):(r="ends_with",i=i.slice(1)):i.endsWith("*")&&(r="starts_with",i=i.slice(0,-1))),r===Sm.BETWEEN&&(i=[i,t.end_value]);let o=i==="*"?[]:[{attribute:t.search_attribute,value:i,comparator:r}];return s.search({conditions:o,allowFullScan:!0,limit:t.limit,offset:t.offset,reverse:t.reverse,sort:t.sort,select:EO(t,s)},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async getDataByValue(t,r){let n=new Map,s=Vi(t);t.get_attributes&&!t.get_attributes.includes(s.primaryKey)&&t.get_attributes[0]!=="*"&&t.get_attributes.push(s.primaryKey);for await(let i of this.searchByValue(t,r))n.set(i[s.primaryKey],i);return n}resetReadTxn(t,r){Vi({schema:t,table:r})?.primaryStore.resetReadTxn()}async deleteAuditLogsBefore(t){return Vi(t).deleteHistory(t.timestamp,t.cleanup_deleted_records)}async readAuditLog(t){let r=Vi(t),n={};switch(t.search_type){case Tm.HASH_VALUE:for(let i of t.search_values)n[i]=(await r.getHistoryOfRecord(i)).map(o=>{let c=o.operation??o.type;return c==="put"&&(c="upsert"),{operation:c,timestamp:o.version,user_name:o.user,hash_values:[i],records:[o.value]}});return n;case Tm.USERNAME:let s=t.search_values;for await(let i of qB(r))s.includes(i.user_name)&&(n[i.user_name]||(n[i.user_name]=[])).push(i);return n;default:return qB(r,t.search_values?.[0],t.search_values?.[1],t.limit)}}};a(EO,"getSelect");a(FB,"getRecords");a(Vi,"getTable");a(GB,"createDeleteResponse");a(qB,"groupRecordsInHistory")});var Jn=P((kCe,zB)=>{"use strict";var{ResourceBridge:Sre}=(WB(),C(YB)),Tre=ce();Tre.initSync();var ZE;function Are(){return ZE||(ZE=new Sre,ZE)}a(Are,"getBridge");zB.exports=Are()});var In=P((GCe,XB)=>{"use strict";var tg=ay(),Hr=ie(),Rre=require("util"),rg=Jn(),yre=ws(),jB=J(),{handleHDBError:ml,hdb_errors:bre}=pe(),{HTTP_STATUS_CODES:El}=bre,Ore=Rre.promisify(yre.getTableSchema),Nre="updated",JB="inserted",QB="upserted";XB.exports={insert:Ire,update:Cre,upsert:Pre,validation:wre,flush:Dre};async function wre(e){if(Hr.isEmpty(e))throw new Error("invalid update parameters defined.");if(Hr.isEmptyOrZeroLength(e.schema))throw new Error("invalid database specified.");if(Hr.isEmptyOrZeroLength(e.table))throw new Error("invalid table specified.");let t=await Ore(e.schema,e.table),r=tg(e);if(r)throw r;if(!Array.isArray(e.records))throw new Error("records must be an array");let n=t.hash_attribute,s=new Set,i={},o=!1;return e.operation==="update"&&(o=!0),e.records.forEach(c=>{if(o&&Hr.isEmptyOrZeroLength(c[n]))throw jB.error("a valid hash attribute must be provided with update record:",c),new Error("a valid hash attribute must be provided with update record");if(!Hr.isEmptyOrZeroLength(c[n])&&(c[n]==="null"||c[n]==="undefined"))throw jB.error(`a valid hash value must be provided with ${e.operation} record:`,c),new Error(`"${c[n]}" is not a valid hash attribute value`);!Hr.isEmpty(c[n])&&c[n]!==""&&s.has(Hr.autoCast(c[n]))&&(c.skip=!0),s.add(Hr.autoCast(c[n]));for(let l in c)i[l]=1}),i[n]=1,{schema_table:t,hashes:Array.from(s),attributes:Object.keys(i)}}a(wre,"validation");async function Ire(e){if(e.operation!=="insert")throw new Error("invalid operation, must be insert");let t=tg(e);if(t)throw ml(new Error,t.message,El.BAD_REQUEST);Hr.transformReq(e);let r=Hr.checkSchemaTableExist(e.schema,e.table);if(r)throw ml(new Error,r,El.BAD_REQUEST);let n=await rg.createRecords(e);return eg(JB,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time)}a(Ire,"insertData");async function Cre(e){if(e.operation!=="update")throw new Error("invalid operation, must be update");let t=tg(e);if(t)throw ml(new Error,t.message,El.BAD_REQUEST);Hr.transformReq(e);let r=Hr.checkSchemaTableExist(e.schema,e.table);if(r)throw ml(new Error,r,El.BAD_REQUEST);let n=await rg.updateRecords(e);return Hr.isEmpty(n.existing_rows)?eg(Nre,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time):eg(n.update_action,[],e,n.hashes,void 0,n.txn_time)}a(Cre,"updateData");async function Pre(e){if(e.operation!=="upsert")throw ml(new Error,"invalid operation, must be upsert",El.INTERNAL_SERVER_ERROR);let t=tg(e);if(t)throw ml(new Error,t.message,El.BAD_REQUEST);Hr.transformReq(e);let r=Hr.checkSchemaTableExist(e.schema,e.table);if(r)throw ml(new Error,r,El.BAD_REQUEST);let n=await rg.upsertRecords(e);return eg(QB,n.written_hashes,e,[],n.new_attributes,n.txn_time)}a(Pre,"upsertData");function eg(e,t,r,n,s,i){let o={message:`${e} ${t.length} of ${t.length+n.length} records`,new_attributes:s,txn_time:i};return e===JB?(o.inserted_hashes=t,o.skipped_hashes=n,o):e===QB?(o.upserted_hashes=t,o):(o.update_hashes=t,o.skipped_hashes=n,o)}a(eg,"returnObject");function Dre(e){return Hr.transformReq(e),rg.flush(e.schema,e.table)}a(Dre,"flush")});var sH=P(($Ce,nH)=>{var Zu=require("validate.js"),eH=ct(),ed=(k(),C(G)),{handleHDBError:Lre,hdb_errors:Mre}=pe(),{HDB_ERROR_MSGS:Qt,HTTP_STATUS_CODES:vre}=Mre,SO=a(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Ure={STRUCTURE_USER:"structure_user"},ZB=Object.values(ed.ROLE_TYPES_ENUM),xre="attribute_permissions",Bre="attribute_name",{PERMS_CRUD_ENUM:td}=ed,Hre=[xre,...Object.values(td)],tH=[td.READ,td.INSERT,td.UPDATE],kre=[Bre,...tH];function Fre(e){let t=SO();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,rH(e,t)}a(Fre,"addRoleValidation");function Gre(e){let t=SO();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,rH(e,t)}a(Gre,"alterRoleValidation");function qre(e){let t=SO();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,eH.validateObject(e,t)}a(qre,"dropRoleValidation");var $re=["operation","role","id","permission","hdb_user","access"];function rH(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let o=0,c=n.length;o<c;o++)$re.includes(n[o])||s.push(n[o]);s.length>0&&ir(Qt.INVALID_ROLE_JSON_KEYS(s),r);let i=eH.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{ir(o,r)}),e.permission){let o=Vre(e);o&&ir(o,r),ZB.forEach(c=>{e.permission[c]&&!Zu.isBoolean(e.permission[c])&&ir(Qt.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let o in e.permission)if(ZB.indexOf(o)<0){if(o===Ure.STRUCTURE_USER){let l=e.permission[o];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,f=l.length;u<f;u++){let d=l[u];global.hdb_schema[d]||ir(Qt.SCHEMA_NOT_FOUND(d),r)}continue}ir(Qt.STRUCTURE_USER_ROLE_TYPE_ERROR(o),r);continue}let c=e.permission[o];if(!o||!global.hdb_schema[o]){ir(Qt.SCHEMA_NOT_FOUND(o),r);continue}if(c.tables)for(let l in c.tables){let u=c.tables[l];if(!l||!global.hdb_schema[o][l]){ir(Qt.TABLE_NOT_FOUND(o,l),r);continue}if(Object.keys(u).forEach(f=>{Hre.includes(f)||ir(Qt.INVALID_PERM_KEY(f),r,o,l)}),Object.values(td).forEach(f=>{Zu.isDefined(u[f])?Zu.isBoolean(u[f])||ir(Qt.TABLE_PERM_NOT_BOOLEAN(f),r,o,l):ir(Qt.TABLE_PERM_MISSING(f),r,o,l)}),u.attribute_permissions===void 0){ir(Qt.ATTR_PERMS_ARRAY_MISSING,r,o,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){ir(Qt.ATTR_PERMS_NOT_ARRAY,r,o,l);continue}if(u.attribute_permissions){let f=global.hdb_schema[o][l].attributes.map(({attribute:_})=>_),d={read:!1,insert:!1,update:!1};for(let _ in u.attribute_permissions){let p=u.attribute_permissions[_];if(Object.keys(p).forEach(S=>{!kre.includes(S)&&S!==td.DELETE&&ir(Qt.INVALID_ATTR_PERM_KEY(S),r,o,l)}),!Zu.isDefined(p.attribute_name)){ir(Qt.ATTR_PERM_MISSING_NAME,r,o,l);continue}let h=p.attribute_name;if(!f.includes(h)){ir(Qt.INVALID_ATTRIBUTE_IN_PERMS(h),r,o,l);continue}tH.forEach(S=>{Zu.isDefined(p[S])?Zu.isBoolean(p[S])||ir(Qt.ATTR_PERM_NOT_BOOLEAN(S,h),r,o,l):ir(Qt.ATTR_PERM_MISSING(S,h),r,o,l)}),!d.read&&p.read===!0&&(d.read=!0),!d.insert&&p.insert===!0&&(d.insert=!0),!d.update&&p.update===!0&&(d.update=!0)}if(u.read===!1&&d.read===!0||u.insert===!1&&d.insert===!0||u.update===!1&&d.update===!0){let _=`${o}.${l}`;ir(Qt.MISMATCHED_TABLE_ATTR_PERMS(_),r,o,l)}}}}return Kre(r)}a(rH,"customValidate");nH.exports={addRoleValidation:Fre,alterRoleValidation:Gre,dropRoleValidation:qre};function Vre(e){let{operation:t,permission:r}=e;if(t===ed.OPERATIONS_ENUM.ADD_ROLE||t===ed.OPERATIONS_ENUM.ALTER_ROLE){let n=r.super_user===!0,s=r.cluster_user===!0;if(Object.keys(r).length>1&&(n||s)){if(s&&n)return Qt.SU_CU_ROLE_COMBINED_ERROR;{let o=r.super_user?ed.ROLE_TYPES_ENUM.SUPER_USER:ed.ROLE_TYPES_ENUM.CLUSTER_USER;return Qt.SU_CU_ROLE_NO_PERMS_ALLOWED(o)}}}return null}a(Vre,"validateNoSUPerms");function Kre(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:Qt.ROLE_PERMS_ERROR,...e};return Lre(new Error,n,vre.BAD_REQUEST)}else return null}a(Kre,"generateRolePermResponse");function ir(e,t,r,n){if(!r)t.main_permissions.push(e);else{let s=n?r+"_"+n:r;t.schema_permissions[s]?t.schema_permissions[s].push(e):t.schema_permissions[s]=[e]}}a(ir,"addPermError")});var ep=P((YCe,cH)=>{"use strict";var iH=In(),oH=Jr(),Yre=al(),AO=sH(),RO=Co(),KCe=require("uuid").v4,Wre=require("util"),ng=(k(),C(G)),zre=ie(),yO=oH.searchByValue,jre=oH.searchByHash,Jre=Wre.promisify(Yre.delete),Qre=ai(),Xre=ju(),{hdb_errors:Zre,handleHDBError:gl}=pe(),{HDB_ERROR_MSGS:aH,HTTP_STATUS_CODES:Z_}=Zre,{UserEventMsg:bO}=oi();cH.exports={addRole:ene,alterRole:tne,dropRole:rne,listRoles:nne};function TO(e){try{e.hdb_auth_header&&delete e.hdb_auth_header,e.HDB_INTERNAL_PATH&&delete e.HDB_INTERNAL_PATH,e.operation&&delete e.operation,e.hdb_user&&delete e.hdb_user}catch{}return e}a(TO,"scrubRoleDetails");async function ene(e){let t=AO.addRoleValidation(e);if(t)throw t;e=TO(e);let r={schema:"system",table:"hdb_role",search_attribute:"role",search_value:e.role,hash_attribute:"id",get_attributes:["*"]},n;try{n=Array.from(await yO(r)||[])}catch(i){throw gl(i)}if(n&&n.length>0)throw gl(new Error,aH.ROLE_ALREADY_EXISTS(e.role),Z_.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 iH.insert(s),RO.signalUserChange(new bO(process.pid)),e=TO(e),e}a(ene,"addRole");async function tne(e){let t=AO.alterRoleValidation(e);if(t)throw t;e=TO(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await iH.update(r)}catch(s){throw gl(s)}if(n&&n?.message==="updated 0 of 1 records")throw gl(new Error,"Invalid role id",Z_.BAD_REQUEST,void 0,void 0,!0);return await RO.signalUserChange(new bO(process.pid)),e}a(tne,"alterRole");async function rne(e){let t=AO.dropRoleValidation(e);if(t)throw gl(new Error,t,Z_.BAD_REQUEST,void 0,void 0,!0);let r=new Xre(ng.SYSTEM_SCHEMA_NAME,ng.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await jre(r));if(n.length===0)throw gl(new Error,aH.ROLE_NOT_FOUND,Z_.NOT_FOUND,void 0,void 0,!0);let s=new Qre(ng.SYSTEM_SCHEMA_NAME,ng.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await yO(s)),o=!1;if(zre.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){o=!0;break}}if(o===!0)throw gl(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,Z_.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Jre(c),RO.signalUserChange(new bO(process.pid)),`${n[0].role} successfully deleted`}a(rne,"dropRole");async function nne(){return yO({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}a(nne,"listRoles")});var OO={};xe(OO,{start:()=>dH,startOnMainThread:()=>one});function dH({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,lH.parseDocument)(r.toString(),{simpleKeys:!0}).toJSON();for(let s in n){let i=n[s];i.permission||(i={permission:i},i.permission.access&&(i.access=i.permission.access,delete i.permission.access));for(let o in i.permission){if(sne.includes(o))continue;let c=i.permission[o];c.tables||(i.permission[o]=c={tables:c});for(let l in c.tables){let u=c.tables[l];if(u.read=!!u.read,u.insert=!!u.insert,u.update=!!u.update,u.delete=!!u.delete,u.attributes){let f=[];for(let d in u.attributes){let _=u.attributes[d];_.attribute_name=d,f.push(_)}u.attribute_permissions=f,delete u.attributes}if(u.attribute_permissions){if(!Array.isArray(u.attribute_permissions))throw new Error("attribute_permissions must be an array if defined");for(let f of u.attribute_permissions)f.read=!!f.read,f.insert=!!f.insert,f.update=!!f.update}else u.attribute_permissions=null}}i.role=i.id=s,await ine(i)}}}async function ine(e){let t=Xe().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,uH.isEqual)(i,e)?void 0:(e.id=r.id,(0,sg.alterRole)(e))}return(0,sg.addRole)(e)}var sg,lH,uH,sne,one,fH=Re(()=>{Le();sg=v(ep()),lH=require("yaml"),uH=require("lodash"),sne=["super_user","cluster_user","structure_user"];a(dH,"start");a(ine,"ensureRole");one=dH});async function ig(e){let t=(0,hH.pathToFileURL)(e).toString();if(ane)return tp||(tp=cne(une)),(await(await tp).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function cne(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),tp=new Compartment({console,Math,Date,fetch:lne,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,pH.extname)(r)||(r+=".js"),r)},importHook:a(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){Object.assign(s,{Resource:zr,tables:rs,databases:We})}};let n=await(0,_H.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),tp}function lne(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 une(){return{Resource:zr,tables:rs}}var _H,pH,hH,ane,tp,NO=Re(()=>{ya();Le();_H=require("fs/promises"),pH=require("path"),hH=require("url"),ane=!1;a(ig,"secureImport");a(cne,"getCompartment");a(lne,"secureOnlyFetch");a(une,"getGlobalVars")});var IO={};xe(IO,{handleFile:()=>dne});async function dne(e,t,r,n){let s=new Map,i=await ig(r);c(i.default)&&n.set((0,wO.dirname)(t),i.default),o(i,(0,wO.dirname)(t));function o(l,u){for(let f in l){let d=l[f];c(d)?n.set(u+"/"+f,d):typeof d=="object"&&o(d,u+"/"+f)}}a(o,"recurseForResources");function c(l){return typeof l=="function"&&(l.get||l.put||l.post||l.delete)}return a(c,"isResource"),s}var wO,mH=Re(()=>{NO();wO=require("path");a(dne,"handleFile")});var PO={};xe(PO,{start:()=>fne});function fne({resources:e}){e.set("login",CO),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var CO,EH=Re(()=>{ya();a(fne,"start");CO=class extends zr{static{a(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:o}=r;return{data:await n.login(s,i)}}}});var ap={};xe(ap,{addAnalyticsListener:()=>op,calculateCPUUtilization:()=>xH,diffResourceUsage:()=>BH,recordAction:()=>Mt,recordActionBinary:()=>ns,setAnalyticsEnabled:()=>_ne});function _ne(e){DH=e}function pne(e,t){if(typeof e=="number"){let r=t.values,n=r.index++;if(n>=r.length){let s=r;t.values=r=new Float32Array(n*2),r.set(s),r.index=n+1}r[n]=e,t.total+=e}else if(typeof e=="boolean")e&&t.total++,t.count++;else if(typeof e=="function")t.count++;else throw new TypeError("Invalid metric value type "+typeof e)}function hne(e,t,r,n,s,i){let o={};if(typeof t=="number")o.total=t,o.values=new Float32Array(4),o.values.index=1,o.values[0]=t,o.total=t;else if(typeof t=="boolean")o.total=t?1:0,o.count=1;else if(typeof t=="function")o.count=1,o.callback=t;else throw new TypeError("Invalid metric value type "+typeof t);o.description={metric:r,path:n,method:s,type:i},ag.set(e,o)}function Mt(e,t,r,n,s){if(!DH)return;let i=t+(r?"-"+r:"");n!==void 0&&(i+="-"+n),s!==void 0&&(i+="-"+s);let o=ag.get(i);o?pne(e,o):hne(i,e,t,r,n,s),og||mne()}function ns(e,t,r,n,s){Mt(!!e,t,r,n,s)}function op(e){vH.push(e)}function mne(){og=performance.now(),setTimeout(async()=>{let e=performance.now()-og;og=0;let t=[],r={time:Date.now(),period:e,threadId:Sl.threadId,metrics:t};for(let[s,i]of ag){if(i.values){let o=i.values.subarray(0,i.values.index);o.sort();let c=o.length,l=0,u=[],f;for(let d of UH){let _=Math.floor(c*d),p=o[_-1];if(_>l){let h=_-l;if(p===f){let S=u[u.length-1];typeof S=="number"?u[u.length-1]={value:S,count:1+h}:S.count+=h}else u.push(h>1?{value:p,count:h}:p),f=p;l=_}}t.push(Object.assign(i.description,{mean:i.total/c,distribution:u,count:c}))}else i.callback?t.push(Object.assign(i.description,i.callback(i))):t.push(Object.assign(i.description,{total:i.total,count:i.count}));await HH()}let n=process.memoryUsage();t.push({metric:"memory",threadId:Sl.threadId,byThread:!0,...n});for(let s of vH)s(t);ag=new Map,Sl.parentPort?Sl.parentPort.postMessage({type:MH,report:r}):GH({report:r})},LH).unref()}function cg(e,t,r){let n={id:(0,sp.getNextMonotonicTime)(),metric:t,...r};e.primaryStore.put(n.id,n,{append:!0}).then(s=>{s||e.primaryStore.put(n.id,n)})}function xH(e,t){let r=e.userCPUTime+e.systemCPUTime;return Math.round(r/t*100)/100}function BH(e,t){return{userCPUTime:t.userCPUTime/1e3-(e?.userCPUTime??0),systemCPUTime:t.systemCPUTime/1e3-(e?.systemCPUTime??0),minorPageFault:t.minorPageFault-(e?.minorPageFault??0),majorPageFault:t.majorPageFault-(e?.majorPageFault??0),fsRead:t.fsRead-(e?.fsRead??0),fsWrite:t.fsWrite-(e?.fsWrite??0),voluntaryContextSwitches:t.voluntaryContextSwitches-(e?.voluntaryContextSwitches??0),involuntaryContextSwitches:t.involuntaryContextSwitches-(e?.involuntaryContextSwitches??0)}}function Ene(e,t,r){let n=0;for(let[s,i]of Object.entries(r)){let o=`${t}.${s}`,c=i.getSize(),l={database:t,table:s,size:c};cg(e,"table-size",l),Tl.trace?.(`table ${o} size metric: ${JSON.stringify(l)}`),n+=c}return n}function gH(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getAuditSize();if(!i)return;let o=PH.default.statSync(s.primaryStore.env.path).size,c=Ene(e,r,n),l=o-c,u={database:r,size:o,used:c,free:l,audit:i};cg(e,"database-size",u),Tl.trace?.(`database ${r} size metric: ${JSON.stringify(u)}`)}catch(s){Tl.warn?.("Error getting DB size metrics",s)}}function SH(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getStorageStats();if(!i)return;let o={database:r,...i};cg(e,"storage-volume",o),Tl.trace?.(`db ${r} storage volume metrics: ${JSON.stringify(o)}`)}catch(s){Tl.warn?.("Error getting DB volume metrics",s)}}async function gne(e,t=6e4){let r=LO(),n=kH(),s=new Promise(E=>{let T=performance.now();setImmediate(()=>{let N=performance.now();N-T>5e3&&Tl.warn?.("Unusually high event queue latency on the main thread of "+Math.round(N-T)+"ms"),T=performance.now()}),n.primaryStore.prefetch([1],()=>{let N=performance.now();N-T>5e3&&Tl.warn?.("Unusually high task queue latency on the main thread of "+Math.round(N-T)+"ms"),E(N-T)})}),i;for(let E of n.primaryStore.getRange({start:1/0,end:!1,reverse:!0}))if(E.value?.time){i=E.value.time;break}if(Date.now()-t<i)return;let o,c=new Map,l=new Map,u=[],f;for(let{key:E,value:T}of r.primaryStore.getRange({start:i||!1,exclusiveStart:!0,end:1/0})){if(!T)continue;if(o){if(E>o+t)break}else o=E;f=E;let{metrics:N,threadId:M}=T;for(let H of N||[]){let{path:Z,method:W,type:$,metric:se,count:z,total:fe,distribution:ue,threads:ee,...Ae}=H;z||(z=1);let he=se+(Z?"-"+Z:"");W!==void 0&&(he+="-"+W),$!==void 0&&(he+="-"+$);let ye=c.get(he);if(ye){if(ye.threads){let ft=ye.threads[M];if(ft)ye=ft;else{ye.threads[M]={...Ae};continue}}ye.count||(ye.count=1);let kt=ye.count;for(let ft in Ae){let Fn=Ae[ft];typeof Fn=="number"&&(ye[ft]=(ye[ft]*kt+Fn*z)/(kt+z))}ye.count+=z,fe>=0&&(ye.total+=fe,ye.ratio=ye.total/ye.count)}else ye={period:t,...H},delete ye.distribution,c.set(he,ye),ye.byThread&&(ye.threads=[],ye.threads[M]={...Ae},u.push(ye));if(ue){ue=ue.map(ft=>typeof ft=="number"?{value:ft,count:1}:ft);let kt=l.get(he);kt?kt.push(...ue):l.set(he,ue)}}await HH()}for(let E of u){let{path:T,method:N,type:M,metric:H,count:Z,total:W,distribution:$,threads:se,...z}=E;se=se.filter(fe=>fe);for(let fe in z){if(typeof E[fe]!="number")continue;let ue=0;for(let ee of se){let Ae=ee[fe];typeof Ae=="number"&&(ue+=Ae)}E[fe]=ue}E.count=se.length,delete E.threads,delete E.byThread}for(let[E,T]of l){let N=c.get(E);T.sort((ft,Fn)=>ft.value>Fn.value?1:-1);let M=N.count-1,H=[],Z=0,W=0,$;for(let ft of UH){let Fn=M*ft;for(;Z<Fn;)$=T[W++],Z+=$.count,W===1&&Z--;let Wr=T[W>1?W-2:0];$||($=T[0]),H.push($.value-($.value-Wr.value)*(Z-Fn)/$.count)}let[se,z,fe,ue,ee,Ae,he,ye,kt]=H;Object.assign(N,{p1:se,p10:z,p25:fe,median:ue,p75:ee,p90:Ae,p95:he,p99:ye,p999:kt})}let d;for(let[E,T]of c)T.id=(0,sp.getNextMonotonicTime)(),T.time=f,n.primaryStore.put(T.id,T,{append:!0}).then(N=>{N||n.primaryStore.put(T.id,T)}),d=!0;let _=Date.now(),{idle:p,active:h}=performance.eventLoopUtilization();if(d||h*10>p){let E=(0,sp.getNextMonotonicTime)(),T={id:E,metric:"main-thread-utilization",idle:p-TH,active:h-AH,taskQueueLatency:await s,time:_,...process.memoryUsage()};n.primaryStore.put(E,T,{append:!0}).then(N=>{N||n.primaryStore.put(E,T)})}TH=p,AH=h;let S=process.resourceUsage(),g=BH(rp,S);g.time=_,g.period=rp.time?_-rp.time:t,g.cpuUtilization=xH(rp,g.period),cg(n,"resource-usage",g),rp=g;let R=Xe();gH(n,R),gH(n,{system:R.system}),SH(n,R),SH(n,{system:R.system})}async function RH(e,t){let r=Date.now()-t;for(let n of e.primaryStore.getKeys({start:!1,end:r}))e.primaryStore.remove(n)}function LO(){return yH||(yH=_t({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function kH(){return bH||(bH=_t({table:"hdb_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]}))}function Ane(){FH=!0;let e=(0,ip.get)(x.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await gne(LH,e),await RH(LO(),Sne),await RH(kH(),Tne)},Math.min(e/2,2147483647)).unref()}function GH(e,t){let r=e.report;r.threadId=t?.threadId||Sl.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(OH+=n.mean*n.count);r.totalBytesProcessed=OH,t&&(r.metrics.push({metric:"utilization",...t.performance.eventLoopUtilization(NH.get(t))}),NH.set(t,t.performance.eventLoopUtilization())),r.id=(0,sp.getNextMonotonicTime)(),LO().primaryStore.put(r.id,r),FH||Ane(),Rne&&(qH=bne(r))}async function bne(e){if(await qH,!xa){let r=(0,np.dirname)((0,IH.getLogFilePath)());try{xa=await(0,DO.open)((0,np.join)(r,"analytics.log"),"r+")}catch{xa=await(0,DO.open)((0,np.join)(r,"analytics.log"),"w+")}}let t=(await xa.stat()).size;if(t>yne){let r=Buffer.alloc(t);await xa.read(r,{position:0}),r=r.subarray(r.indexOf(10,r.length/2)+1),await xa.write(r,{position:0}),await xa.truncate(r.length),t=r.length}await xa.write(JSON.stringify(e)+`
|
|
21
21
|
`,t)}var Sl,wH,IH,CH,np,DO,sp,ip,PH,Tl,ag,DH,og,LH,MH,vH,UH,TH,AH,rp,HH,Sne,Tne,yH,bH,FH,OH,NH,Rne,qH,xa,yne,Ki=Re(()=>{Sl=require("worker_threads"),wH=v(nt());Le();IH=v(J()),CH=v(ei()),np=require("path"),DO=require("fs/promises"),sp=v(mn()),ip=v(ce());k();Ur();PH=v(require("node:fs")),Tl=(0,CH.loggerWithTag)("analytics");(0,ip.initSync)();ag=new Map,DH=(0,ip.get)(x.ANALYTICS_AGGREGATEPERIOD)>-1;a(_ne,"setAnalyticsEnabled");a(pne,"recordExistingAction");a(hne,"recordNewAction");a(Mt,"recordAction");Ye.recordAnalytics=Mt;a(ns,"recordActionBinary");og=0,LH=1e3,MH="analytics-report",vH=[];a(op,"addAnalyticsListener");UH=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(mne,"sendAnalytics");a(cg,"storeMetric");a(xH,"calculateCPUUtilization");a(BH,"diffResourceUsage");a(Ene,"storeTableSizeMetrics");a(gH,"storeDBSizeMetrics");a(SH,"storeVolumeMetrics");a(gne,"aggregation");TH=0,AH=0,rp={},HH=a(()=>new Promise(setImmediate),"rest");a(RH,"cleanup");Sne=36e5,Tne=31536e6;a(LO,"getRawAnalyticsTable");a(kH,"getAnalyticsTable");(0,wH.setChildListenerByType)(MH,GH);a(Ane,"startScheduledTasks");OH=0,NH=new Map,Rne=!1;a(GH,"recordAnalytics");yne=1e6;a(bne,"logAnalytics")});var $H={};xe($H,{Headers:()=>Lo,appendHeader:()=>lg,mergeHeaders:()=>MO});function lg(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 MO(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new Lo(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 Lo,cp=Re(()=>{Lo=class extends Map{static{a(this,"Headers")}constructor(t){if(t)if(t[Symbol.iterator])super(t);else{super();for(let r in t)this.set(r,t[r])}else super()}set(t,r){return typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r),super.set(t.toLowerCase(),[t,r])}get(t){return typeof t!="string"&&(t=""+t),super.get(t.toLowerCase())?.[1]}has(t){return typeof t!="string"&&(t=""+t),super.has(t.toLowerCase())}setIfNone(t,r){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let n=t.toLowerCase();if(!super.has(n))return super.set(n,[t,r])}append(t,r,n){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let s=t.toLowerCase(),i=super.get(s);if(i){let o=i[1];if(n)r=(typeof o=="string"?o:o.join(", "))+", "+r;else if(typeof o=="string")r=[o,r];else{o.push(r);return}}return super.set(s,[t,r])}[Symbol.iterator](){return super.values()[Symbol.iterator]()}};a(lg,"appendHeader");a(MO,"mergeHeaders")});function zH(e){let t={openapi:One,info:{title:"HarperDB HTTP REST interface",version:WH.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}];for(let[,n]of e){if(!n.path||n.Resource.isError)continue;let{path:s}=n,i=s.split("/").slice(-1),{attributes:o,primaryKey:c,prototype:l}=n.Resource;if(c=c??"id",!c)continue;let u={},f=[];if(o)for(let{type:T,name:N,elements:M,relationship:H,definition:Z}of o){if(H)T==="array"?u[N]={type:"array",items:{$ref:Ba+M.type}}:u[N]={$ref:Ba+T};else{let W=Z??M?.definition;if(W){if(!t.components.schemas[W.type]){let $={};W.properties.forEach(se=>{$[se.name]=new BO(vO[se.type],se.type)}),t.components.schemas[W.type]=new YH($)}T==="array"?u[N]={type:"array",items:{$ref:Ba+W.type}}:u[N]={$ref:Ba+W.type}}else T==="array"?M.type==="Any"||M.type=="ID"?u[N]={type:"array",items:{format:M.type}}:u[N]={type:"array",items:new BO(vO[M.type],M.type)}:T==="Any"||T=="ID"?u[N]={format:T}:u[N]=new BO(vO[T],T)}f.push(new HO(N,"query",u[N]))}let d=Object.keys(u),_=new HO(c,"path",{format:"ID"});_.required=!0,_.description="primary key of record";let p=new HO("property","path",{enum:d});p.required=!0,t.components.schemas[i]=new YH(u);let h=l.post!==Resource.prototype.post||l.update,S=typeof l.put=="function",g=typeof l.get=="function",R=typeof l.delete=="function",E="/"+s+"/";h&&(t.paths[E]={},t.paths[E].post=new Nne(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[E]||(t.paths[E]={}),t.paths[E].get=new UO(f,r,{200:new xO({$ref:Ba+i})},"search for records by the specified property name and value pairs")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new KH(f,r,"delete all the records that match the provided query",{204:new VH})),E="/"+s+"/{"+c+"}",g&&(t.paths[E]={},t.paths[E].get=new UO([_],r,{200:new xO({$ref:Ba+i})},"retrieve a record by its primary key")),S&&(t.paths[E]||(t.paths[E]={}),t.paths[E].put=new wne([_],r,i,"create or update the record with the URL path that maps to the record's primary key")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new KH([_],r,"delete a record with the given primary key",{204:new VH})),g&&p.schema.enum.length>0&&(E="/"+s+"/{"+c+"}.{property}",t.paths[E]={},t.paths[E].get=new UO([_,p],r,{200:new xO({enum:d})},"used to retrieve the specified property of the specified record"))}return t}function Nne(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:Ba+e}}}},this.security=t,this.responses={200:{description:kO,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function UO(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function xO(e){this.description=kO,this.content={"application/json":{schema:e}}}function VH(){this.description="successfully processed request, no content returned to client"}function wne(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Ba+r}}}},this.responses={200:{description:kO}}}function KH(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function YH(e){this.type="object",this.properties=e}function BO(e,t){this.type=e,this.format=t}function HO(e,t,r){this.name=e,this.in=t,this.schema=r}var WH,One,vO,Ba,kO,jH=Re(()=>{WH=v(at()),One="3.0.3",vO={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},Ba="#/components/schemas/",kO="successful operation";a(zH,"generateJsonApi");a(Nne,"Post");a(UO,"Get");a(xO,"Response200");a(VH,"Response204");a(wne,"Put");a(KH,"Delete");a(YH,"ResourceSchema");a(BO,"Type");a(HO,"Parameter")});var QH={};xe(QH,{Request:()=>lp,createReuseportFd:()=>ug});var JH,lp,FO,GO,ug,dg=Re(()=>{JH=require("os"),lp=class{static{a(this,"Request")}#e;constructor(t,r){this.method=t.method;let n=t.url;this._nodeRequest=t,this._nodeResponse=r,this.url=n,this.headers=new GO(t.headers)}get absoluteURL(){return this.protocol+"://"+this.host+this.url}get pathname(){let t=this.url.indexOf("?");return t>-1?this.url.slice(0,t):this.url}set pathname(t){let r=this.url.indexOf("?");r>-1?this.url=t+this.url.slice(r):this.url=t}get protocol(){return this._nodeRequest.socket.encrypted?"https":"http"}get ip(){return this._nodeRequest.socket.remoteAddress}get authorized(){return this._nodeRequest.socket.authorized}get peerCertificate(){return this._nodeRequest.socket.getPeerCertificate()}get mtlsConfig(){return this._nodeRequest.socket.server.mtlsConfig}get body(){return this.#e||(this.#e=new FO(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get isAborted(){return!1}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},FO=class{static{a(this,"RequestBody")}#e;constructor(t){this.#e=t}on(t,r){return this.#e.on(t,r),this}pipe(t,r){return this.#e.pipe(t,r)}},GO=class{constructor(t){this.asObject=t}static{a(this,"Headers")}set(t,r){this.asObject[t.toLowerCase()]=r}get(t){return this.asObject[t.toLowerCase()]}has(t){return this.asObject.hasOwnProperty(t.toLowerCase())}[Symbol.iterator](){return Object.entries(this.asObject)[Symbol.iterator]()}keys(){return Object.keys(this.asObject)}values(){return Object.values(this.asObject)}delete(t){delete this.asObject[t.toLowerCase()]}forEach(t){for(let[r,n]of this)t(n,r,this)}};(0,JH.platform)()!="win32"&&(ug=require("node-unix-socket").createReuseportFd)});var _g={};xe(_g,{parseHeaderValue:()=>$O,start:()=>Pne});async function Cne(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&Bm(e);let i=new Lo;try{e.responseHeaders=i;let o=e.url.slice(1),c,l;if(o!==XH){let g=fg.getMatch(o,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new kc(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=$O(g);for(let E of R)switch(E.name){case"max-age":e.expiresAt=E.value*1e3+Date.now();break;case"only-if-cached":e.onlyIfCached=!0;break;case"no-cache":e.noCache=!0;break;case"no-store":e.noCacheStore=!0;break;case"stale-if-error":e.staleIfError=!0;break;case"must-revalidate":e.mustRevalidate=!0;break}}}let u=r["x-replicate-to"];if(u){let g=$O(u).map(R=>(R.next?.name==="confirm"&&R.next.value>=0&&(e.replicatedConfirmation=+R.next.value),R.name));e.replicateTo=g.length===1&&+g[0]>=0?+g[0]:g[0]==="*"?void 0:g}r["x-replicate-from"]==="none"&&(e.replicateFrom=!1);let d=await Pt(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=Ao(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new rd.ClientError(g,400)}if(e.authorize=!0,o===XH&&s==="GET"){if(e?.user?.role?.permission?.super_user)return zH(fg);throw new rd.ServerError("Forbidden",403)}switch(s){case"GET":case"HEAD":return l.get(c,e);case"POST":return l.post(c,e.data,e);case"PUT":return l.put(c,e.data,e);case"DELETE":return l.delete(c,e);case"PATCH":return l.patch(c,e.data,e);case"OPTIONS":i.setIfNone("Allow","GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE");return;case"CONNECT":return l.connect(c,null,e);case"TRACE":return"HarperDB is the terminating server";case"QUERY":return l.query(c,e.data,e);case"COPY":return l.copy(c,r.destination,e);case"MOVE":return l.move(c,r.destination,e);case"BREW":throw new rd.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new rd.ServerError(`Method ${s} is not recognized`,501)}}),_=200,p;if(d==null)_=s==="GET"||s==="HEAD"?404:204,qO.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(d.status>0&&d.headers){let g=MO(d.headers,i);return d.headers!==g&&(d.headers=g),d.data!==void 0&&(d.body=d_(d.data,e,d)),d}else if(p=e.lastModified){Ine[0]=p;let g=String.fromCharCode(34,(kr[0]&63)+62,(kr[0]>>6)+(kr[1]<<2&63)+62,(kr[1]>>4)+(kr[2]<<4&63)+62,(kr[2]>>2)+62,(kr[3]&63)+62,(kr[3]>>6)+(kr[4]<<2&63)+62,(kr[4]>>4)+(kr[5]<<4&63)+62,(kr[5]>>2)+62,(kr[6]&63)+62,(kr[6]>>6)+(kr[7]<<2&63)+62,34),R=r["if-none-match"];R&&g==R?(d?.onDone&&d.onDone(),_=304,d=void 0):i.setIfNone("ETag",g),qO.lastModified&&i.setIfNone("Last-Modified",new Date(p).toUTCString())}e.createdResource&&(_=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let h={status:_,headers:i,body:void 0},S=d?.wasLoadedFromSource?.();return S!==void 0&&(h.wasCacheMiss=S,!S&&p&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||p))/1e3))),d!==void 0&&(h.body=d_(d,e,h),s==="HEAD"&&(h.body=void 0)),h}catch(o){o.statusCode?o.statusCode===500?Yi.warn(o):Yi.info(o):Yi.error(o),o.statusCode===405&&(o.method&&(o.message+=` to handle HTTP method ${o.method.toUpperCase()||""}`),o.allow&&(o.allow.push("trace","head","options"),i.setIfNone("Allow",o.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:o.statusCode||500,headers:i,body:void 0};return c.body=d_(o.contentType?o:o.toString(),e,c),c}}function Pne(e){qO=e,e.includeExpensiveRecordCountEstimates&&(lp.prototype.includeExpensiveRecordCountEstimates=!0),!ZH&&(ZH=!0,fg=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return Cne(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{up++;let s=new Vn;ek||(ek=!0,op(l=>{up>0&&l.push({metric:"ws-connections",connections:up,byThread:!0})}));let i;t.on("error",l=>{i=!0,Yi.warn(l)});let o;t.on("message",a(function(u){o||(o=Ao(r.requestedContentType??r.headers.asObject["content-type"],!1));let f=o(u);Mt(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(f)},"message"));let c;t.on("close",()=>{up--,ns(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=fg.getMatch(l,"ws");if(ns(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,Mt(h=>({count:h.count,total:up}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let f=new kc(u.relativeURL),d=u.Resource;c=(await Pt(r,()=>d.connect(f,s,r)))[Symbol.asyncIterator]();let p;for(;!(p=await c.next()).done;){let h=await wa(p.value,r);t.send(h),Mt(h.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(S=>t._socket.once("drain",S))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?Yi.warn(l):Yi.info(l):Yi.error(l),t.close(Dne[l.statusCode]||1011,l.toString())}t.close()},e))}function $O(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,o]=s.trim().split("=");i=i.trim(),o&&(o=o.trim()),r={name:i.toLowerCase(),value:o,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var Yi,rd,kr,Ine,qO,XH,ZH,fg,ek,up,Dne,tk=Re(()=>{go();Ki();Yi=v(J()),rd=v(pe());t_();Au();Hc();cp();jH();t_();dg();kr=new Uint8Array(8),Ine=new Float64Array(kr.buffer,0,1),qO={},XH="openapi";a(Cne,"http");up=0;a(Pne,"start");Dne={401:3e3,403:3003};a($O,"parseHeaderValue")});var VO=P((yPe,nk)=>{var{recordAction:pg,recordActionBinary:rk}=(Ki(),C(ap)),Lne=require("fastify-plugin"),Mne=200;nk.exports=Lne(function(e,t,r){e.addHook("onResponse",async(n,s)=>{let i=s.elapsedTime}),e.addHook("onSend",async(n,s,i)=>{let o=s.elapsedTime,c=performance.now(),l=s.request.routeOptions,u,f,d;l.config?.isOperation?(u=n.body?.operation,f="operation"):(u=l.url,f="fastify-route",d=l.method),pg(o,"duration",u,d,f),rk(s.raw.statusCode<400,"success",u,d,f),rk(1,"response_"+s.raw.statusCode,u,d,f);let _=Mne;i?.pipe?(i.on("data",g=>{_+=g.length}),i.on("end",()=>{pg(performance.now()-c,"transfer",u,d,f),pg(_,"bytes-sent",u,d,f)})):(_+=i?.length||0,pg(_,"bytes-sent",u,d,f));let p=o.toFixed(3),h=s.getHeader("Server-Timing"),S=`db;dur=${p}`;s.header("Server-Timing",h?`${h}, ${S}`:S)}),r()},{name:"hdb-request-time"})});var ik=P((bPe,sk)=>{var vne=ct(),Une={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};sk.exports=function(e){return vne.validateObject(e,Une)}});var hg=P((OPe,ok)=>{"use strict";var xne=(k(),C(G)).OPERATIONS_ENUM,KO=class{static{a(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=xne.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};ok.exports=KO});var _p={};xe(_p,{createTokens:()=>Hne,getJWTRSAKeys:()=>Tg,refreshOperationToken:()=>kne,validateOperationToken:()=>zO,validateRefreshToken:()=>Ag});async function Tg(){if(mg)return mg;try{let e=dp.default.join(fp.default.getHdbBasePath(),pR),t=await Eg.default.readFile(dp.default.join(e,kf.JWT_PASSPHRASE_NAME),"utf8"),r=await Eg.default.readFile(dp.default.join(e,kf.JWT_PRIVATE_KEY_NAME),"utf8");return mg={publicKey:await Eg.default.readFile(dp.default.join(e,kf.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},mg}catch(e){throw Sg.default.error(e),new li.ClientError(sd.NO_ENCRYPTION_KEYS,nd.INTERNAL_SERVER_ERROR)}}async function Hne(e){let t=(0,YO.validateBySchema)(e,Wi.default.object({username:Wi.default.string().optional(),password:Wi.default.string().optional(),role:Wi.default.string().optional(),expires_in:Wi.default.alternatives(Wi.default.string(),Wi.default.number()).optional()}));if(t)throw new li.ClientError(t.message);let r;try{let d=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,d=!1),r=await(0,WO.findAndValidateUser)(e.username,e.password,d)}catch(d){throw Sg.default.error(d),new li.ClientError(sd.INVALID_CREDENTIALS,nd.UNAUTHORIZED)}if(!r)throw new li.ClientError(sd.INVALID_CREDENTIALS,nd.UNAUTHORIZED);let n=!1,s=!1;r.role?.permission&&(n=r.role.permission.super_user===!0,s=r.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s};e.role&&(i.role=e.role);let o=await Tg(),c=await id.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:e.expires_in??dk,algorithm:gg,subject:"operation"}),l=await id.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:Bne,algorithm:gg,subject:"refresh"}),u=ob(l,"sha256");if((await(0,ak.update)(new ck.default(Hf,Su.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new li.ClientError(sd.REFRESH_TOKEN_SAVE_FAILED,nd.INTERNAL_SERVER_ERROR);return lk.default.signalUserChange(new uk.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function kne(e){let t=(0,YO.validateBySchema)(e,Wi.default.object({refresh_token:Wi.default.string().required()}).required());if(t)throw new li.ClientError(t.message);let{refresh_token:r}=e;await Ag(r);let n=await Tg(),s=await id.default.decode(r);return{operation_token:await id.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:dk,algorithm:gg,subject:"operation"})}}async function zO(e){return fk(e,"operation")}async function Ag(e){return fk(e,"refresh")}async function fk(e,t){try{let r=await Tg(),n=await id.default.verify(e,r.publicKey,{algorithms:gg,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,WO.findAndValidateUser)(n.username,void 0,!1);if(t==="refresh"&&!ab(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw Sg.default.warn(r),r?.name==="TokenExpiredError"?new li.ClientError(sd.TOKEN_EXPIRED,nd.FORBIDDEN):new li.ClientError(sd.INVALID_TOKEN,nd.UNAUTHORIZED)}}var id,Eg,dp,Wi,YO,li,Sg,WO,ak,ck,lk,uk,fp,nd,sd,dk,Bne,gg,mg,od=Re(()=>{id=v(require("jsonwebtoken")),Eg=v(require("fs-extra")),dp=v(require("node:path")),Wi=v(require("joi")),YO=v(ct());k();li=v(pe()),Sg=v(J());OE();WO=v(wn()),ak=v(In()),ck=v(hg()),lk=v(Co()),uk=v(oi()),fp=v(ce()),{HTTP_STATUS_CODES:nd,AUTHENTICATION_ERROR_MSGS:sd}=li.hdb_errors;fp.default.initSync();dk=fp.default.get(x.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",Bne=fp.default.get(x.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",gg="RS256";a(Tg,"getJWTRSAKeys");a(Hne,"createTokens");a(kne,"refreshOperationToken");a(zO,"validateOperationToken");a(Ag,"validateRefreshToken");a(fk,"validateToken")});var jO=P((PPe,hk)=>{"use strict";var Fne=ik(),ad=require("passport"),Gne=require("passport-local").Strategy,qne=require("passport-http").BasicStrategy,$ne=require("util"),Vne=wn(),pk=$ne.callbackify(Vne.findAndValidateUser),CPe=$n(),Kne=(k(),C(G)),_k=(od(),C(_p));ad.use(new Gne(function(e,t,r){pk(e,t,r)}));ad.use(new qne(function(e,t,r){pk(e,t,r)}));ad.serializeUser(function(e,t){t(null,e)});ad.deserializeUser(function(e,t){t(null,e)});function Yne(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let o=e.headers.authorization.split(" ");n=o[0],s=o[1]}function i(o,c){return o?r(o):c?r(null,c):r("Must login")}switch(a(i,"handleResponse"),n){case"Basic":ad.authenticate("basic",{session:!1},(o,c)=>{i(o,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===Kne.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?_k.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):_k.validateOperationToken(s).then(o=>{r(null,o)}).catch(o=>{r(o)});break;default:ad.authenticate("local",{session:!1},function(o,c){i(o,c)})(e,t,r);break}}a(Yne,"authorize");function Wne(e,t){let r=Fne(e);if(r){t(r);return}let n={authorized:!0,messages:[]},s=e.user.role;if(!s?.permission)return t("Invalid role");let i=JSON.parse(s.permission);if(i.super_user)return t(null,n);if(!i[e.schema])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.schema} schema`),t(null,n);if(!i[e.schema].tables[e.table])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.table} table`),t(null,n);if(!i[e.schema].tables[e.table][e.operation])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.operation} on ${e.table} table`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&!e.attributes)return n.authorized=!1,n.messages.push(`${e.schema}.${e.table} has attribute permissions. Missing attributes to validate`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&e.attributes){let o=i[e.schema].tables[e.table].attribute_permissions;for(let c in o)e.attributes.indexOf(o[c].attribute_name)>-1&&!o[c][e.operation]&&(n.authorized=!1,n.messages.push(`Not authorized to ${e.operation} ${o[c].attribute_name} `))}return t(null,n)}a(Wne,"checkPermissions");hk.exports={authorize:Yne,checkPermissions:Wne}});var Rg=P((LPe,mk)=>{"use strict";var zne=Jn();mk.exports={writeTransaction:jne};function jne(e,t,r){return zne.writeTransaction(e,t,r)}a(jne,"writeTransaction")});var Tk=P((UPe,Sk)=>{"use strict";var Jne=Jr(),Qne=ws(),Ek=J(),Xne=In(),vPe=Rg(),Zne=require("clone"),QO=require("alasql"),ese=EE(),gk=require("util"),tse=gk.promisify(Qne.getTableSchema),rse=gk.promisify(Jne.search),nse=(k(),C(G)),JO=ie();ese(QO);Sk.exports={update:ise};var sse="There was a problem performing this update. Please check the logs and try again.";async function ise({statement:e,hdb_user:t}){let r=await tse(e.table.databaseid,e.table.tableid),n=ose(e.columns);JO.backtickASTSchemaItems(e);let{table:s,where:i}=e,o=Zne(s),c=JO.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=QO.parse(l).statements[0],f=await rse(u),d=ase(n,f);return cse(o,d,t)}a(ise,"update");function ose(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=QO.compile(`SELECT ${r.expression.toString()} AS [${nse.FUNC_VAL}] FROM ?`)}),t}catch(t){throw Ek.error(t),new Error(sse)}}a(ose,"createUpdateRecord");function ase(e,t){return JO.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}a(ase,"buildUpdateRecords");async function cse(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await Xne.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){Ek.error(`Error delete new_attributes from update response: ${i}`)}return s}a(cse,"updateRecords")});var Rk=P((kPe,Ak)=>{var lse=require("alasql"),use=Jr(),dse=J(),fse=Jn(),ZO=require("util"),XO=ie(),_se=(k(),C(G)),pse=ws(),BPe=Rg(),HPe=In(),hse="record",mse="successfully deleted",Ese=ZO.callbackify(Ase),gse=ZO.promisify(use.search),Sse=ZO.promisify(pse.getTableSchema);Ak.exports={convertDelete:Ese};function Tse(e){return`${e.deleted_hashes.length} ${hse}${e.deleted_hashes.length===1?"":"s"} ${mse}`}a(Tse,"generateReturnMessage");async function Ase({statement:e,hdb_user:t}){let r=await Sse(e.table.databaseid,e.table.tableid);XO.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=XO.isEmpty(s)?"":` WHERE ${s.toString()}`,o=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=lse.parse(o).statements[0],l={operation:_se.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await gse(c);let u=await fse.deleteRecords(l);return XO.isEmptyOrZeroLength(u.message)&&(u.message=Tse(u)),delete u.txn_time,u}catch(u){throw dse.error(u),u.hdb_code?u.message:u}}a(Ase,"convertDelete")});var wk=P((GPe,Nk)=>{"use strict";var Rse=wo(),{hdb_errors:yk}=pe(),{getDatabases:bk}=(Le(),C(st));Nk.exports={checkSchemaExists:Ok,checkSchemaTableExists:yse,schema_describe:Rse};async function Ok(e){if(!bk()[e])return yk.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(Ok,"checkSchemaExists");async function yse(e,t){let r=await Ok(e);if(r)return r;if(!bk()[e][t])return yk.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(yse,"checkSchemaTableExists")});var sN=P((YPe,kk)=>{"use strict";var{decode:bse}=require("msgpackr"),{isMainThread:$Pe,parentPort:VPe,threadId:KPe}=require("worker_threads"),Og=or(),cd=Rt(),rN=(k(),C(G)),en=J(),tN=ce(),Ose=(k(),C(G)),{onMessageByType:Nse}=nt(),Dk=No(),{recordAction:Ik,recordActionBinary:wse}=(Ki(),C(ap)),{publishToStream:Ise}=Og,{ConsumerEvents:Ck}=require("nats"),Cse=Jr(),{promisify:Pse}=require("util"),{decodeBlobsWithWrites:Dse}=(Rn(),C(vu)),Lk=Pse(setTimeout),Ng=1e4,wg,bg,Lse,Mse,Mk,pp=new Map,ld=new Map;kk.exports={initialize:vk,ingestConsumer:nN,setSubscription:vse,setIgnoreOrigin:Bse,getDatabaseSubscriptions:xse,updateConsumer:Uk};async function vk(){Nse(rN.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,async n=>{await Uk(n)}),Mk=!0,en.notify("Initializing clustering ingest service.");let{connection:e,jsm:t,js:r}=await Og.getNATSReferences();wg=e,bg=e.info.server_name,Lse=t,Mse=r}a(vk,"initialize");async function Uk(e){if(e.status==="start"){let{js:t,jsm:r}=await xk(e.node_domain_name);nN(e.stream_name,t,r,e.node_domain_name)}else if(e.status==="stop"){let t=pp.get(e.stream_name+e.node_domain_name);t&&(en.notify("Closing ingest consumer for node:",e.node_domain_name,"stream:",e.stream_name),await t.close?.(),pp.set(e.stream_name+e.node_domain_name,"close")),ld.get(e.node_domain_name)==="failed"&&ld.set(e.node_domain_name,"close")}}a(Uk,"updateConsumer");var Ig=new Map;function vse(e,t,r){let n=Ig.get(e);n||Ig.set(e,n=new Map),n.set(t,r),Mk||vk().then(Use)}a(vse,"setSubscription");async function Use(){let e=await Cse.searchByValue({database:"system",table:"hdb_nodes",search_attribute:"name",search_value:"*"});for await(let t of e){let r=t.name+cd.SERVER_SUFFIX.LEAF,n,s;for(let i of t.subscriptions||[])if(i.subscribe===!0){if(!n&&({js:n,jsm:s}=await xk(r),!n))break;let{schema:o,table:c}=i,l=Dk.createNatsTableStreamName(o,c);nN(l,n,s,r)}}}a(Use,"accessConsumers");async function xk(e){let t,r,n=1;for(;!r;)try{t=await wg.jetstream({domain:e}),r=await wg.jetstreamManager({domain:e,checkAPI:!1})}catch(s){if(ld.get(e)==="close")break;ld.set(e,"failed"),n%10===1&&en.warn("Nats ingest attempting to connect to:",e,"Nats error:",s.message);let i=n++*100<Ng?n++*100:Ng;await Lk(i)}return{js:t,jsm:r}}a(xk,"connectToRemoteJS");function xse(){return Ig}a(xse,"getDatabaseSubscriptions");var Bk;function Bse(e){Bk=e}a(Bse,"setIgnoreOrigin");var Hk=100,Pk=new Array(Hk),yg=0;async function nN(e,t,r,n){let{connection:s}=await Og.getNATSReferences();wg=s,bg=s.info.server_name;let i,o=1;for(;!i;)try{i=await t.consumers.get(e,bg),en.notify("Initializing ingest consumer for node:",n,"stream:",e)}catch(u){if(ld.get(n)==="close")break;o%10===1&&en.warn("Nats ingest error getting consumer:",n,"stream:",e,"Nats error:",u.message),u.code==="404"&&(en.notify("Nats ingest creating consumer for node:",n,"stream:",e),i=await Og.createConsumer(r,e,bg,new Date(Date.now()).toISOString()));let f=o++*100<Ng?o++*100:Ng;await Lk(f)}let c=!1,l;for(;!c;){if(pp.get(e+n)==="close"||ld.get(n)==="close"){pp.delete(e+n),c=!0;continue}l=await i.consume({max_messages:tN.get(rN.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXCONSUMEMSGS)??100,bind:!0}),pp.set(e+n,l);let u=!1;(async()=>{for await(let f of await l.status())if(f.type===Ck.ConsumerDeleted&&(await l.close(),c=!0),f.type===Ck.HeartbeatsMissed){let d=f.data;en.trace(`${d} clustering ingest consumer heartbeats missed, node: ${n} stream: ${l.consumer.stream}`),d===100&&(en.warn(`Restarting clustering ingest consumer due to missed heartbeat threshold being met, node: ${n} stream: ${l.consumer.stream}`),l.stop(),u=!0)}})();try{for await(let f of l)await Pk[yg],Pk[yg]=Hse(f).catch(d=>{en.error(d)}),++yg>=Hk&&(yg=0)}catch(f){f.message==="consumer deleted"?(en.notify("Nats consumer deleted, closing messages for node:",n,"stream:",l.consumer.stream),await l.close(),c=!0):en.error("Error consuming clustering ingest, restarting consumer",f)}}}a(nN,"ingestConsumer");async function Hse(e){let t;await Dse(()=>{t=bse(e.data)}),Ik(e.data.length,"bytes-received",e.subject,t.operation,"ingest"),en.trace("Nats message processor message size:",e?.msg?._msg?.size,"bytes");let r=e.headers,n=!1,s=tN.get(rN.CONFIG_PARAMS.CLUSTERING_NODENAME);r.has(cd.MSG_HEADERS.TRANSACTED_NODES)&&r.values(cd.MSG_HEADERS.TRANSACTED_NODES).indexOf(s)>-1&&(n=!0);let i=r.get(cd.MSG_HEADERS.ORIGIN);if(n||(n=i===s&&!Bk),wse(n,"echo",e.subject,t.operation,"ingest"),n){e.ack();return}r.append(cd.MSG_HEADERS.TRANSACTED_NODES,s);try{let{operation:o,schema:c,next:l,table:u,records:f,hash_values:d,__origin:_,expiresAt:p}=t;en.trace("processing message:",o,c,u,(f?"records: "+f.map(M=>M?.id):"")+(d?"ids: "+d:""),"with sequence:",e.seq),en.trace(`messageProcessor nats msg id: ${e.headers.get(cd.MSG_HEADERS.NATS_MSG_ID)}`);let h;f||(f=d);let S=new Promise(M=>h=M),{timestamp:g,user:R,node_name:E}=_||{},T=Ig.get(c)?.get(u);if(!T)throw new Error(`Missing table for replication message: ${u}`);if(o==="define_schema")t.type=o,t.onCommit=h,T.send(t);else if(f.length===1&&!l)T.send({type:eN(o),value:f[0],id:d?.[0],expiresAt:p,timestamp:g,table:u,onCommit:h,user:R,nodeName:E});else{let M=f.map((H,Z)=>({type:eN(o),value:H,expiresAt:p,id:d?.[Z],table:u}));for(;l;)M.push({type:eN(l.operation),value:l.record,expiresAt:l.expiresAt,id:l.id,table:l.table}),l=l.next;T.send({type:"transaction",writes:M,table:u,timestamp:g,onCommit:h,user:R,nodeName:E})}tN.get(Ose.CONFIG_PARAMS.CLUSTERING_REPUBLISHMESSAGES)!==!1&&Ise(e.subject.split(".").slice(0,-1).join("."),Dk.createNatsTableStreamName(c,u),e.headers,e.data),await S;let N=Date.now()-g;g&&Ik(N,"replication-latency",e.subject,o,"ingest")}catch(o){en.error(o)}e.ack()}a(Hse,"messageProcessor");function eN(e){switch(e){case"insert":case"upsert":case"update":return"put"}return e}a(eN,"convertOperation")});var or=P((ZPe,rF)=>{"use strict";var Cr=ce();Cr.initSync();var kse=require("fs-extra"),Fse=require("semver"),Ep=require("path"),{monotonicFactory:Gse}=require("ulidx"),Gk=Gse(),qse=require("util"),qk=require("child_process"),$se=qse.promisify(qk.exec),Vse=qk.spawn,Fr=Rt(),ze=(k(),C(G)),{packageJson:Kse,PACKAGE_ROOT:Yse}=at(),Cg=ie(),ui=J(),Pg=No(),Wse=Rg(),hp=bt(),{broadcast:zse,onMessageByType:jse,getWorkerIndex:Jse}=nt(),{isMainThread:$k}=require("worker_threads"),{Encoder:Qse,decode:cN}=require("msgpackr"),Vk=new Qse,{isEmpty:bl}=Cg,Kk=wn(),zPe=48*36e11;$k&&jse(ze.ITC_EVENT_TYPES.RESTART,()=>{tn=void 0,yl=void 0});var{connect:Xse,StorageType:Zse,RetentionPolicy:eie,AckPolicy:lN,DeliverPolicy:uN,DiscardPolicy:tie,NatsConnection:jPe,JetStreamManager:JPe,JetStreamClient:QPe,StringCodec:XPe,JSONCodec:rie,createInbox:dN,headers:nie,ErrorCode:Fk}=require("nats"),{recordAction:sie}=(Ki(),C(ap)),{encodeBlobsAsBuffers:iie}=(Rn(),C(vu)),Yk=rie(),oie="clustering",aie=Kse.engines[Fr.NATS_SERVER_NAME],cie=Ep.join(Yse,"dependencies"),aN=Ep.join(cie,`${process.platform}-${process.arch}`,Fr.NATS_BINARY_NAME),iN,oN,mp,Al,Rl;rF.exports={runCommand:Wk,checkNATSServerInstalled:lie,createConnection:fN,getConnection:gp,getJetStreamManager:Sp,getJetStream:jk,getNATSReferences:zi,getServerList:die,createLocalStream:_N,listStreams:Jk,deleteLocalStream:fie,getServerConfig:ud,listRemoteStreams:_ie,viewStream:pie,viewStreamIterator:hie,publishToStream:mie,request:Sie,reloadNATS:pN,reloadNATSHub:Tie,reloadNATSLeaf:Aie,extractServerName:gie,requestErrorHandler:Rie,createLocalTableStream:eF,createTableStreams:Oie,purgeTableStream:tF,purgeSchemaTableStreams:Nie,getStreamInfo:wie,updateLocalStreams:Cie,closeConnection:uie,getJsmServerName:Dg,addNatsMsgHeader:Qk,clearClientCache:zk,updateRemoteConsumer:yie,createConsumer:Xk,updateConsumerIterator:bie};async function Wk(e,t=void 0){let{stdout:r,stderr:n}=await $se(e,{cwd:t});if(n)throw new Error(n.replace(`
|
|
22
22
|
`,""));return r.replace(`
|
|
23
|
-
`,"")}a(Wk,"runCommand");async function lie(){try{await kse.access(aN)}catch{return!1}let e=await Wk(`${aN} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return Fse.eq(t,aie)}a(lie,"checkNATSServerInstalled");async function fN(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await Kk.getClusterUser();if(bl(o))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=o.username,r=o.decrypt_hash}ui.trace("create nats connection called");let i=await Xse({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:Cr.get(ze.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:Cr.get(ze.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:Cr.get(ze.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),ui.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(o=>{o&&ui.error("Error with Nats client connection, connection closed",o),i===tn&&zk()}),i}a(fN,"createConnection");function zk(){tn=void 0,Al=void 0,Rl=void 0,yl=void 0}a(zk,"clearClientCache");async function uie(){tn&&(await tn.drain(),tn=void 0,Al=void 0,Rl=void 0,yl=void 0)}a(uie,"closeConnection");var tn,yl;async function gp(){return yl||(yl=fN(Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),tn=await yl),tn||yl}a(gp,"getConnection");async function Sp(){if(Al)return Al;bl(tn)&&await gp();let{domain:e}=ud(ze.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(bl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Al=await tn.jetstreamManager({domain:e,timeout:6e4}),Al}a(Sp,"getJetStreamManager");async function jk(){if(Rl)return Rl;bl(tn)&&await gp();let{domain:e}=ud(ze.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(bl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Rl=tn.jetstream({domain:e,timeout:6e4}),Rl}a(jk,"getJetStream");async function zi(){let e=tn||await gp(),t=Al||await Sp(),r=Rl||await jk();return{connection:e,jsm:t,js:r}}a(zi,"getNATSReferences");async function die(e){let t=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await Kk.getClusterUser(),s=await fN(t,r,n),i=dN(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=Yk.decode(f.data);d.response_time=Date.now()-l,c.push(d)}})();return l=Date.now(),await s.publish("$SYS.REQ.SERVER.PING.VARZ",void 0,{reply:i}),await s.publish("$SYS.REQ.SERVER.PING",void 0,{reply:i}),await s.flush(),await Cg.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(die,"getServerList");async function _N(e,t){let{jsm:r}=await zi(),n=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:Zse.File,retention:eie.Limits,subjects:t,discard:tie.Old,max_msgs:s,max_bytes:i,max_age:n})}a(_N,"createLocalStream");async function Jk(){let{jsm:e}=await zi(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(Jk,"listStreams");async function fie(e){let{jsm:t}=await zi();await t.streams.delete(e)}a(fie,"deleteLocalStream");async function _ie(e){let{connection:t}=await zi(),r=[],n=dN(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(Yk.decode(o.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}a(_ie,"listRemoteStreams");async function pie(e,t=void 0,r=void 0){let{jsm:n,js:s}=await zi(),i=Gk(),o={durable_name:i,ack_policy:lN.Explicit};t&&(o.deliver_policy=uN.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];let u=[];for await(let f of l){let d=cN(f.data),_={nats_timestamp:f.info.timestampNanos,nats_sequence:f.info.streamSequence,entry:d};if(f.headers&&(_.origin=f.headers.get(Fr.MSG_HEADERS.ORIGIN)),u.push(_),f.ack(),f.info.pending===0)break}return await c.delete(),u}a(pie,"viewStream");async function*hie(e,t=void 0,r=void 0){let{jsm:n,js:s}=await zi(),i=Gk(),o={durable_name:i,ack_policy:lN.Explicit};t&&(o.deliver_policy=uN.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];for await(let u of l){let f=cN(u.data);f[0]||(f=[f]);for(let d of f){let _={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:d};u.headers&&(_.origin=u.headers.get(Fr.MSG_HEADERS.ORIGIN)),yield _}if(u.ack(),u.info.pending===0)break}await c.delete()}a(hie,"viewStreamIterator");async function mie(e,t,r,n){ui.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=Qk(n,r);let{js:s}=await zi(),i=await Dg(),o=`${e}.${i}`,c=await iie(()=>n instanceof Uint8Array?n:Vk.encode(n));try{ui.trace(`publishToStream publishing to subject: ${o}`),sie(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(o,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return Zk(async()=>{try{await s.publish(o,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){ui.trace(`publishToStream creating stream: ${t}`);let f=o.split(".");f[2]="*",await _N(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(mie,"publishToStream");function Qk(e,t){t===void 0&&(t=nie());let r=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(Fr.MSG_HEADERS.ORIGIN)&&r&&t.append(Fr.MSG_HEADERS.ORIGIN,r),t}a(Qk,"addNatsMsgHeader");function ud(e){e=e.toLowerCase();let t=Ep.join(Cr.get(ze.CONFIG_PARAMS.ROOTPATH),oie);if(e===ze.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return bl(oN)&&(oN={port:hp.getConfigFromFile(ze.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:hp.getConfigFromFile(ze.CONFIG_PARAMS.CLUSTERING_NODENAME)+Fr.SERVER_SUFFIX.HUB,config_file:Fr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:Ep.join(t,Fr.PID_FILES.HUB),hdb_nats_path:t}),oN;if(e===ze.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return bl(iN)&&(iN={port:hp.getConfigFromFile(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:hp.getConfigFromFile(ze.CONFIG_PARAMS.CLUSTERING_NODENAME)+Fr.SERVER_SUFFIX.LEAF,config_file:Fr.NATS_CONFIG_FILES.LEAF_SERVER,domain:hp.getConfigFromFile(ze.CONFIG_PARAMS.CLUSTERING_NODENAME)+Fr.SERVER_SUFFIX.LEAF,pid_file_path:Ep.join(t,Fr.PID_FILES.LEAF),hdb_nats_path:t}),iN;ui.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a(ud,"getServerConfig");async function Xk(e,t,r,n){try{await e.consumers.add(t,{ack_policy:lN.Explicit,durable_name:r,deliver_policy:uN.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a(Xk,"createConsumer");async function Eie(e,t,r){await e.consumers.delete(t,r)}a(Eie,"removeConsumer");function gie(e){return e.split(".")[1]}a(gie,"extractServerName");async function Sie(e,t,r=6e4,n=dN()){if(!Cg.isObject(t))throw new Error("data param must be an object");let s=Vk.encode(t),{connection:i}=await zi(),o={timeout:r};n&&(o.reply=n,o.noMux=!0);let c=await i.request(e,s,o);return cN(c.data)}a(Sie,"request");function pN(e){return new Promise(async(t,r)=>{let n=Vse(aN,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",o=>{r(o)}),n.stdout.on("data",o=>{i+=o.toString()}),n.stderr.on("data",o=>{s+=o.toString()}),n.stderr.on("close",o=>{s&&r(s),t(i)})})}a(pN,"reloadNATS");async function Tie(){let{pid_file_path:e}=ud(ze.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await pN(e)}a(Tie,"reloadNATSHub");async function Aie(){let{pid_file_path:e}=ud(ze.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await pN(e)}a(Aie,"reloadNATSLeaf");function Rie(e,t,r){let n;switch(e.code){case Fk.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case Fk.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(Rie,"requestErrorHandler");async function yie(e,t){let r=t+Fr.SERVER_SUFFIX.LEAF,{connection:n}=await zi(),{jsm:s}=await Die(r),{schema:i,table:o}=e,c=Pg.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await Zk(async()=>{if(e.subscribe===!0)await Xk(s,c,n.info.server_name,l);else try{await Eie(s,c,n.info.server_name)}catch(u){ui.trace(u)}})}a(yie,"updateRemoteConsumer");async function bie(e,t,r,n){let s=Pg.createNatsTableStreamName(e,t),i=r+Fr.SERVER_SUFFIX.LEAF,o={type:ze.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!$k&&Jse()<Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=sN();await c(o)}await zse(o),n==="stop"&&await Cg.async_set_timeout(1e3)}a(bie,"updateConsumerIterator");function Zk(e){return Wse.writeTransaction(ze.SYSTEM_SCHEMA_NAME,ze.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(Zk,"exclusiveLock");async function eF(e,t){let r=Pg.createNatsTableStreamName(e,t),n=await Dg(),s=Iie(e,t,n);await _N(r,[s])}a(eF,"createLocalTableStream");async function Oie(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await eF(n,s)}}a(Oie,"createTableStreams");async function tF(e,t,r=void 0){if(Cr.get(ze.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=Pg.createNatsTableStreamName(e,t),{domain:s}=ud(ze.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await gp()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")ui.warn(n);else throw n}}a(tF,"purgeTableStream");async function Nie(e,t){if(Cr.get(ze.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await tF(e,t[r])}a(Nie,"purgeSchemaTableStreams");async function wie(e){return(await Sp()).streams.info(e)}a(wie,"getStreamInfo");function Iie(e,t,r){return`${Fr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(Iie,"createSubjectName");async function Dg(){if(mp)return mp;if(mp=(await Sp())?.nc?.info?.server_name,mp===void 0)throw new Error("Unable to get jetstream manager server name");return mp}a(Dg,"getJsmServerName");async function Cie(){let e=await Sp(),t=await Dg(),r=await Jk();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=Pie(n),c=i.split(".");if(c[c.length-1]===t&&!o||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let f=u.join(".");ui.trace(`Updating stream subject name from: ${i} to: ${f}`),s.subjects[0]=f,await e.streams.update(s.name,s)}}a(Cie,"updateLocalStreams");function Pie(e){let{config:t}=e,r=!1,n=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);return i=i===null?-1:i,n!==t.max_age&&(t.max_age=n,r=!0),s!==t.max_bytes&&(t.max_bytes=s,r=!0),i!==t.max_msgs&&(t.max_msgs=i,r=!0),r}a(Pie,"updateStreamLimits");async function Die(e){let t,r;try{t=await tn.jetstream({domain:e}),r=await tn.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw ui.error("Unable to connect to:",e),n}return{js:t,jsm:r}}a(Die,"connectToRemoteJS")});function hN(e){let t=e.get(Lg),r=t?(0,dd.unpack)(t):null;r||(r={remoteNameToId:{}});let n=et(),s=!1;r.nodeName=et();let i=r.remoteNameToId;if(i[n]!==0){let o=0,c;for(let l in i){let u=i[l];u===0?c=l:u>o&&(o=u)}if(c){o++,i[c]=o;let l=[Symbol.for("seq"),o];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:Ap(e)??1,nodes:[]})})}i[n]=0,e.putSync(Lg,(0,dd.pack)(r))}return r}function Tp(e){return hN(e).remoteNameToId}function sF(e,t){let r=hN(t),n=r.remoteNameToId,s=new Map,i=!1;for(let o in e){let c=e[o],l=n[o];if(l==null){let u=0;for(let f in n){let d=n[f];d>u&&(u=d)}l=u+1,n[o]=l,i=!0}s.set(c,l)}return i&&t.putSync(Lg,(0,dd.pack)(r)),s}function Mg(e,t){let r=hN(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let o in n){let c=n[o];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(Lg,(0,dd.pack)(r))}return nF.trace?.("The remote node name map",e,n,s),s}var nF,dd,Lg,mN=Re(()=>{nF=v(ei());ss();dd=require("msgpackr"),Lg=Symbol.for("remote-ids");a(hN,"getIdMappingRecord");a(Tp,"exportIdMapping");a(sF,"remoteToLocalNodeId");a(Mg,"getIdOfRemoteNode")});var EN={};xe(EN,{commits_awaiting_replication:()=>fd,getHDBNodeTable:()=>ar,getReplicationSharedStatus:()=>vg,iterateRoutes:()=>yp,shouldReplicateToNode:()=>Rp,subscribeToNodeUpdates:()=>_d});function ar(){return iF||(iF=_t({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 vg(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function _d(e){ar().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;lF.debug?.("adding node",n,"on node",et()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==et()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of ar().search({}))if(i.shard!=null){let o=s.get(i.shard);o||s.set(i.shard,o=[]),o.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function Rp(e,t){let r=Ha.default.get(x.REPLICATION_DATABASES);return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&(r==="*"||r?.find?.(n=>(typeof n=="string"?n:n.name)===t&&(!n.sharded||e.shard===Ha.default.get(x.REPLICATION_SHARD))))&&ar().primaryStore.get(et())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function Lie(){_d(e=>{ka({},(t,r)=>{let n=e.name,s=oF.get(n);if(s||oF.set(n,s=new Map),s.has(r))return;let i;for(let o in t)if(i=t[o].auditStore,i)break;if(i){let o=vg(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of fd.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*yp(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=Ha.default.get(x.REPLICATION_SECUREPORT)??(!Ha.default.get(x.REPLICATION_PORT)&&Ha.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||Ha.default.get(x.REPLICATION_PORT)||Ha.default.get(x.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){aF.isMainThread&&console.error("Invalid route, must specify a url or host (with port)");continue}yield{replicates:!t.subscriptions,url:r,subscription:t.subscriptions,routes:t.routes,start_time:t.startTime,revoked_certificates:t.revokedCertificates}}}var aF,cF,Ha,lF,iF,oF,fd,Ol=Re(()=>{Le();ss();vm();aF=require("worker_threads"),cF=v(pe()),Ha=v(ce());k();lF=v(ei());server.nodes=[];a(ar,"getHDBNodeTable");a(vg,"getReplicationSharedStatus");a(_d,"subscribeToNodeUpdates");a(Rp,"shouldReplicateToNode");oF=new Map;FL((e,t,r)=>{if(r>server.nodes.length)throw new cF.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);fd||(fd=new Map,Lie());let n=fd.get(e);return n||(n=[],fd.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(Lie,"startSubscriptionToReplications");a(yp,"iterateRoutes")});var fF={};xe(fF,{connectedToNode:()=>Nl,disconnectedFromNode:()=>hd,ensureNode:()=>Mo,requestClusterStatus:()=>dF,startOnMainThread:()=>SN});async function SN(e){let t=0,r=Xe();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){Ug.set(i,Ap(l.auditStore));break}}}Ji.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes?.search([])||[])i.push(o);for(let o of yp(e))try{let c=!o.subscriptions;if(c){let u=et(),f=ar().primaryStore.get(u);if(f!==null){let d=e.url??Fa();(f===void 0||f.url!==d||f.shard!==e.shard)&&await Mo(u,{name:u,url:d,shard:e.shard,replicates:!0})}}let l=o.trusted!==!1;if(c&&o.replicates==null&&(o.replicates=!0),i.find(u=>u.url===o.url))continue;s(o)}catch(c){console.error(c)}_d(s)});let n;function s(i,o=i?.name){let c=et()&&o===et()||Fa()&&i?.url===Fa();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let _ of ar().search([]))_.replicates&&_.name!==o&&s(_,_.name);n=d}if(it.trace("Setting up node replication for",i),!i){for(let[d,_]of ji){let p;for(let[h,{worker:S,nodes:g}]of _){let R=g[0];if(R&&R.name==o){p=!0;for(let[E,{worker:T}]of _)_.delete(E),it.warn("Node was deleted, unsubscribing from node",o,E,d),T?.postMessage({type:"unsubscribe-from-node",node:o,database:E,url:d});break}}if(p){ji.get(d).iterator.remove(),ji.delete(d);return}}return}if(c)return;if(!i.url){it.info(`Node ${i.name} is missing url`);return}let l=ji.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(it.info(`Added node ${i.name} at ${i.url} for process ${et()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[d,_]of pd)if(i.url===_.url){pd.delete(d);break}pd.set(i.name,i)}let u=Xe();if(l||(l=new Map,ji.set(i.url,l)),l.iterator=ka(e,(d,_,p)=>{p?f(_,!0):f(_,!1)}),i.subscriptions)for(let d of i.subscriptions){let _=d.database||d.schema;u[_]||(it.warn(`Database ${_} not found for node ${i.name}, making a subscription anyway`),f(_,!1))}function f(d,_){it.trace("Setting up replication for database",d,"on node",i.name);let p=l.get(d),h,S=[{replicateByDefault:_,...i}];Ug.has(d)&&bp.default.get(x.REPLICATION_FAILOVER)&&(S.push({replicateByDefault:_,name:et(),start_time:Ug.get(d),end_time:Date.now(),replicates:!0}),Ug.delete(d));let g=Rp(i,d),R=Ji.workers.filter(E=>E.name==="http");if(p?(h=p.worker,p.nodes=S):g&&(t=t%R.length,h=R[t++],l.set(d,{worker:h,nodes:S,url:i.url}),h?.on("exit",()=>{l.get(d)?.worker===h&&(l.delete(d),f(d,_))})),g)setTimeout(()=>{let E={type:"subscribe-to-node",database:d,nodes:S};h?h.postMessage(E):Op(E)},Mie);else{it.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],ar().primaryStore.get(et())?.replicates),ar().primaryStore.get(et())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};h?h.postMessage(E):Bg(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),hd=a(function(i){try{it.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(pd.keys()),c=o.sort(),l=c.indexOf(i.name||di(i.url));if(l===-1){it.warn("Disconnected node not found in node map",i.name,o);return}let u=ji.get(i.url),f=u?.get(i.database);if(!f){it.warn("Disconnected node not found in replication map",i.database,u);return}if(f.connected=!1,i.finished||!bp.default.get(x.REPLICATION_FAILOVER))return;let d=f.nodes[0];if(!(d.replicates===!0||d.replicates?.sends||d.subscriptions?.length))return;let _=d.shard,p=(l+1)%c.length;for(;l!==p;){let h=c[p],S=pd.get(h);u=ji.get(S.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==_){p=(p+1)%c.length;continue}let{worker:R,nodes:E}=g,T=!1;for(let N of f.nodes){if(E.some(M=>M.name===N.name)){it.info(`Disconnected node is already failing over to ${h} for ${i.database}`);continue}N.end_time<Date.now()||(E.push(N),T=!0)}if(f.nodes=[f.nodes[0]],!T){it.info(`Disconnected node ${i.name} has no nodes to fail over to ${h}`);return}it.info(`Failing over ${i.database} from ${i.name} to ${h}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:E}):Op({database:i.database,nodes:E});return}it.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){it.error("Error failing over node",o)}},"disconnectedFromNode"),Nl=a(function(i){let o=ji.get(i.url),c=o?.get(i.database);if(!c){it.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){it.info("Connected node has no nodes",i.database,c);return}if(!l.name){it.debug("Connected node is not named yet",i.database,c);return}if(!bp.default.get(x.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let f of ji.values()){let d=f.get(i.database);if(!d||d==c)continue;let{worker:_,nodes:p,connected:h}=d;if(p)if(h===!1&&p[0].shard===l.shard)u=!0,c.nodes.push(p[0]);else{let S=p.filter(g=>g.name!==l.name);S.length<p.length&&(d.nodes=S,_.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,Ji.onMessageByType)("disconnected-from-node",hd),(0,Ji.onMessageByType)("connected-to-node",Nl),(0,Ji.onMessageByType)("request-cluster-status",dF)}function dF(e,t){let r=[];for(let[n,s]of pd)try{let i=ji.get(s.url);it.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let o=[];if(i){for(let[l,{worker:u,connected:f,nodes:d,latency:_}]of i)o.push({database:l,connected:f,latency:_,thread_id:u?.threadId,nodes:d.filter(p=>!(p.end_time<Date.now())).map(p=>p.name)});let c=(0,gN.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){it.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Mo(e,t){let r=ar();e=e??di(t.url),t.name=e;try{if(t.ca){let s=new uF.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subject_alt_name:s.subjectAltName,serial_number:s.serialNumber,valid_from:s.validFrom,valid_to:s.validTo}}}catch(s){it.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(it.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!bp.default.get(x.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],o=(0,gN.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of o)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...o,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}it.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var Ji,xg,it,gN,bp,uF,Mie,ji,hd,Nl,pd,Ug,Np=Re(()=>{Le();Ji=v(nt());ss();xg=require("worker_threads");Ol();it=v(J()),gN=require("lodash"),bp=v(ce());k();uF=require("crypto"),Mie=200,ji=new Map,pd=new Map,Ug=new Map;a(SN,"startOnMainThread");a(dF,"requestClusterStatus");xg.parentPort&&(hd=a(e=>{xg.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Nl=a(e=>{xg.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Ji.onMessageByType)("subscribe-to-node",e=>{Op(e)}),(0,Ji.onMessageByType)("unsubscribe-from-node",e=>{Bg(e)}));a(Mo,"ensureNode")});var os=P(vF=>{"use strict";var cr=require("path"),{watch:gF}=require("chokidar"),Dn=require("fs-extra"),md=require("node-forge"),SF=require("net"),{generateKeyPair:AN,X509Certificate:vo,createPrivateKey:TF}=require("crypto"),vie=require("util");AN=vie.promisify(AN);var Nt=md.pki,fi=require("joi"),{v4:AF}=require("uuid"),{validateBySchema:ON}=ct(),Ot=J(),is=ce(),Cs=(k(),C(G)),{CONFIG_PARAMS:Il}=Cs,_i=ub(),{ClientError:qa}=pe(),kg=require("node:tls"),{relative:RF,join:Uie}=require("node:path"),{CERT_PREFERENCE_APP:mDe,CERTIFICATE_VALUES:_F}=_i,xie=Ea(),Hg=bt(),{table:Bie,getDatabases:Hie,databases:TN}=(Le(),C(st)),{getJWTRSAKeys:pF}=(od(),C(_p));Object.assign(vF,{generateKeys:CN,updateConfigCert:IF,createCsr:Yie,signCertificate:Wie,setCertTable:Ed,loadCertificates:IN,reviewSelfSignedCert:DN,createTLSSelector:PF,listCertificates:LF,addCertificate:Zie,removeCertificate:toe,createNatsCerts:Jie,generateCertsKeys:jie,getReplicationCert:Ip,getReplicationCertAuth:Vie,renewSelfSigned:Qie,hostnamesFromCert:LN,getKey:roe});var{urlToNodeName:yF,getThisNodeUrl:kie,getThisNodeName:$g,clearThisNodeName:Fie}=(ss(),C(Uo)),{readFileSync:Gie,statSync:bF}=require("node:fs"),EDe=ce(),{getTicketKeys:qie,onMessageFromWorkers:$ie}=nt(),Ga=J(),{isMainThread:RN}=require("worker_threads"),{TLSSocket:OF,createSecureContext:gDe}=require("node:tls"),NN=3650,wp=["127.0.0.1","localhost","::1"],wN=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];$ie(async e=>{e.type===Cs.ITC_EVENT_TYPES.RESTART&&(is.initSync(!0),await DN())});var Gr;function Va(){return Gr||(Gr=Hie().system.hdb_certificate,Gr||(Gr=Bie({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__"}]}))),Gr}a(Va,"getCertTable");async function Ip(){let e=PF("replication"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get($g());if(!r)return;let n=new vo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(Ip,"getReplicationCert");async function Vie(){Va();let e=(await Ip()).options.cert,r=new vo(e).issuer.match(/CN=(.*)/)?.[1];return Gr.get(r)}a(Vie,"getReplicationCertAuth");var yN,$a=new Map,Fg=[],hF;function IN(){if(yN)return;if(yN=!0,!hF&&RN){let n=Hg.getConfigFilePath();hF=gF(n,{persistent:!1}).on("change",()=>{logger.warn?.("Config file changed, reloading certificates"),Kie()})}let e=[{configKey:Il.TLS},{configKey:Il.OPERATIONSAPI_TLS}];Va();let t=cr.dirname(Hg.getConfigFilePath()),r;for(let{configKey:n}of e){let s=Hg.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&RF(Uie(t,"keys"),o);if(c){let l=mF(o,u=>{$a.set(c,u)},"private key");l&&Fg.push(l)}for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&RN){let f=mF(u,d=>{if(_F.cert===d)return;let _=i.hostname??i.hostnames??i.host??i.hosts;_&&!Array.isArray(_)&&(_=[_]);let p=CF(u),h=new vo(p),S;try{S=!l&&i.name||MF(x509Cert)}catch(M){logger.error("error extracting host name from certificate",M);return}if(S==null){logger.error("No host name found on certificate");return}if(h.checkIssued(new vo(_F.cert)))return;let g=Gr.primaryStore.get(S),R=bF(u).mtimeMs,E=!g||g.is_self_signed?1:g.fileTimestamp??g.__updatedtime__,T=i.uses??["https",...n.includes("operations")?["operations"]:[]],N=g&&R===E&&(JSON.stringify(g.uses)!==JSON.stringify(T)||g.ciphers!==i.ciphers||JSON.stringify(g.hostnames)!==JSON.stringify(_));if(E&&R<=E&&!N){R<E&&logger.info?.(`Certificate ${S} at ${u} is older (${new Date(R)}) than the certificate in the database (${E>1?new Date(E):"only self signed certificate available"})`);return}N&&logger.info?.(`Config values changed for certificate ${S}, updating record`),r=Gr.put({name:S,uses:i.uses??["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:p,private_key_name:c,is_authority:l,hostnames:_,file_timestamp: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");f&&Fg.push(f)}}}}}return r}a(IN,"loadCertificates");function Kie(){for(let e of Fg)e.close();Fg.length=0,yN=!1,IN()}a(Kie,"reloadCertificates");function mF(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&RN&&Ot.warn(`Reloading ${r}:`,i),n=c,t(CF(i)))}catch(c){Ot.error(`Error loading ${r}:`,i,c)}},"loadFile");return Dn.existsSync(e)?s(e,bF(e)):Ot.error?.(`${r} file not found:`,e),gF(e,{persistent:!1}).on("change",s)}a(mF,"loadAndWatch");function Gg(){let e=kie();if(e==null){let t=wp[0];return Ot.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return yF(e)}a(Gg,"getHost");function qg(){let e=$g();if(e==null){let t=wp[0];return Ot.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(qg,"getCommonName");async function Yie(){let e=await Ip(),t=Nt.certificateFromPem(e.options.cert),r=Nt.privateKeyFromPem(e.options.key);Ot.info("Creating CSR with cert named:",e.name);let n=Nt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:qg()},...wN];Ot.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:NF()}];return Ot.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),md.pki.certificationRequestToPem(n)}a(Yie,"createCsr");function NF(){let e=wp.includes(qg())?wp:[...wp,qg()];return e.includes(Gg())||e.push(Gg()),[{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=>SF.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(NF,"certExtensions");async function Wie(e){let t={},r=cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Va();for await(let f of Gr.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if($a.has(f.private_key_name)){n=$a.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await Dn.exists(cr.join(r,f.private_key_name))){n=Dn.readFile(cr.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await bN();s=f.ca,n=f.private_key}n=Nt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=Nt.certificateFromPem(s.certificate);Ot.info("Signing CSR with cert named",s.name);let o=Nt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return Ot.error(f),new Error("Error verifying CSR: "+f.message)}let c=md.pki.createCertificate();c.serialNumber=Math.random().toString().slice(2,10),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+NN),Ot.info("sign cert setting validity:",c.validity),Ot.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),Ot.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;Ot.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,md.md.sha256.create()),t.certificate=Nt.certificateToPem(c)}else Ot.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(Wie,"signCertificate");async function zie(e,t){await Ed({name:$g(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Ed({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:Nt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}a(zie,"createCertificateTable");async function Ed(e){let t=new vo(e.certificate);e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},Va(),await Gr.patch(e)}a(Ed,"setCertTable");async function CN(){let e=await AN("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{public_key:Nt.publicKeyFromPem(e.publicKey),private_key:Nt.privateKeyFromPem(e.privateKey)}}a(CN,"generateKeys");async function PN(e,t,r){let n=Nt.createCertificate();if(!t){let o=await Ip();t=Nt.certificateFromPem(o.options.cert).publicKey}n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+NN);let i=[{name:"commonName",value:qg()},...wN];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(NF()),n.sign(e,md.md.sha256.create()),Nt.certificateToPem(n)}a(PN,"generateCertificates");async function bN(){let e=await LF(),t;for(let r of e){if(!r.is_authority)continue;let n=await DF(r.private_key_name);if(r.private_key_name&&n&&new vo(r.certificate).checkPrivateKey(TF(n))){Ot.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;Ot.trace("No CA found with matching private key")}a(bN,"getCertAuthority");async function wF(e,t,r=!0){let n=Nt.createCertificate();n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+NN);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${is.get(Il.REPLICATION_HOSTNAME)??yF(is.get(Il.REPLICATION_URL))??AF().split("-")[0]}`},...wN];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,md.md.sha256.create());let o=cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME),c=cr.join(o,_i.PRIVATEKEY_PEM_NAME);return r&&await Dn.writeFile(c,Nt.privateKeyToPem(e)),n}a(wF,"generateCertAuthority");async function jie(){let{private_key:e,public_key:t}=await CN(),r=await wF(e,t),n=await PN(e,t,r);await zie(n,r),IF()}a(jie,"generateCertsKeys");async function Jie(){let e=await PN(Nt.privateKeyFromPem(_i.CERTIFICATE_VALUES.key),void 0,Nt.certificateFromPem(_i.CERTIFICATE_VALUES.cert)),t=cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME),r=cr.join(t,_i.NATS_CERTIFICATE_PEM_NAME);await Dn.exists(r)||await Dn.writeFile(r,e);let n=cr.join(t,_i.NATS_CA_PEM_NAME);await Dn.exists(n)||await Dn.writeFile(n,_i.CERTIFICATE_VALUES.cert)}a(Jie,"createNatsCerts");async function Qie(){Va();for await(let e of Gr.search([{attribute:"is_self_signed",value:!0}]))await Gr.delete(e.name);await DN()}a(Qie,"renewSelfSigned");async function DN(){Fie(),await IN(),Va();let e=await bN();if(!e){Ot.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=a(u=>{try{return{key:Nt.privateKeyFromPem(Dn.readFileSync(u)),keyPath:u}}catch(f){return Ot.warn(`Failed to parse private key from ${u}:`,f.message),{key:null,keyPath:u}}},"tryToParseKey"),n=is.get(Il.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let f=r(u.privateKey);if(s=f.key,i=f.keyPath,f.key)break}}else{let u=is.get(Il.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME),c=RF(o,i);s||(Ot.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{private_key:s}=await CN(),Dn.existsSync(cr.join(o,_i.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${AF().split("-")[0]}.pem`),await Dn.writeFile(cr.join(o,c),Nt.privateKeyToPem(s)));let l=await wF(s,Nt.setRsaPublicKey(s.n,s.e),!1);await Ed({name:l.subject.getField("CN").value,uses:["https"],certificate:Nt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await Ip()){let r=$g();Ot.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await bN();let n=Nt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await PN(Nt.privateKeyFromPem(e.private_key),s,n);await Ed({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(DN,"reviewSelfSignedCert");function IF(){let e=xie(Object.keys(Cs.CONFIG_PARAM_MAP),!0),t=cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME),r=cr.join(t,_i.PRIVATEKEY_PEM_NAME),n=cr.join(t,_i.NATS_CERTIFICATE_PEM_NAME),s=cr.join(t,_i.NATS_CA_PEM_NAME),i=Cs.CONFIG_PARAMS,o={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(o[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(o[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,o[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,o[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),Hg.updateConfigValue(void 0,void 0,o,!1,!0)}a(IF,"updateConfigCert");function CF(e){return e.startsWith("-----BEGIN")?e:Gie(e,"utf8")}a(CF,"readPEM");var EF=kg.createSecureContext;kg.createSecureContext=function(e){if(!e.cert||!e.key)return EF(e);let t={...e};delete t.key,delete t.cert;let r=EF(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var Xie=OF.prototype._init;OF.prototype._init=function(e,t){Xie.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,o)=>{this.sni_context=o?.context||o,this.certCbDone()})}};var wl=new Map;function PF(e,t){let r=new Map,n,s=!1;return i.initialize=o=>i.ready?i.ready:(o&&(o.secureContexts=r,o.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),wl.clear();let f=0;for await(let d of TN.system.hdb_certificate.search([])){let _=d.certificate,p=new vo(_);d.is_authority&&(p.asString=_,wl.set(p.subject,_))}for await(let d of TN.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let _=e==="operations-api",p=d.is_self_signed?1:2;d.uses?.includes(e)&&(p+=1);let h=await DF(d.private_key_name),S=d.certificate,g=new vo(S);if(wl.has(g.issuer)&&(S+=`
|
|
23
|
+
`,"")}a(Wk,"runCommand");async function lie(){try{await kse.access(aN)}catch{return!1}let e=await Wk(`${aN} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return Fse.eq(t,aie)}a(lie,"checkNATSServerInstalled");async function fN(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await Kk.getClusterUser();if(bl(o))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=o.username,r=o.decrypt_hash}ui.trace("create nats connection called");let i=await Xse({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:Cr.get(ze.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:Cr.get(ze.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:Cr.get(ze.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),ui.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(o=>{o&&ui.error("Error with Nats client connection, connection closed",o),i===tn&&zk()}),i}a(fN,"createConnection");function zk(){tn=void 0,Al=void 0,Rl=void 0,yl=void 0}a(zk,"clearClientCache");async function uie(){tn&&(await tn.drain(),tn=void 0,Al=void 0,Rl=void 0,yl=void 0)}a(uie,"closeConnection");var tn,yl;async function gp(){return yl||(yl=fN(Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),tn=await yl),tn||yl}a(gp,"getConnection");async function Sp(){if(Al)return Al;bl(tn)&&await gp();let{domain:e}=ud(ze.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(bl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Al=await tn.jetstreamManager({domain:e,timeout:6e4}),Al}a(Sp,"getJetStreamManager");async function jk(){if(Rl)return Rl;bl(tn)&&await gp();let{domain:e}=ud(ze.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(bl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Rl=tn.jetstream({domain:e,timeout:6e4}),Rl}a(jk,"getJetStream");async function zi(){let e=tn||await gp(),t=Al||await Sp(),r=Rl||await jk();return{connection:e,jsm:t,js:r}}a(zi,"getNATSReferences");async function die(e){let t=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await Kk.getClusterUser(),s=await fN(t,r,n),i=dN(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=Yk.decode(f.data);d.response_time=Date.now()-l,c.push(d)}})();return l=Date.now(),await s.publish("$SYS.REQ.SERVER.PING.VARZ",void 0,{reply:i}),await s.publish("$SYS.REQ.SERVER.PING",void 0,{reply:i}),await s.flush(),await Cg.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(die,"getServerList");async function _N(e,t){let{jsm:r}=await zi(),n=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:Zse.File,retention:eie.Limits,subjects:t,discard:tie.Old,max_msgs:s,max_bytes:i,max_age:n})}a(_N,"createLocalStream");async function Jk(){let{jsm:e}=await zi(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(Jk,"listStreams");async function fie(e){let{jsm:t}=await zi();await t.streams.delete(e)}a(fie,"deleteLocalStream");async function _ie(e){let{connection:t}=await zi(),r=[],n=dN(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(Yk.decode(o.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}a(_ie,"listRemoteStreams");async function pie(e,t=void 0,r=void 0){let{jsm:n,js:s}=await zi(),i=Gk(),o={durable_name:i,ack_policy:lN.Explicit};t&&(o.deliver_policy=uN.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];let u=[];for await(let f of l){let d=cN(f.data),_={nats_timestamp:f.info.timestampNanos,nats_sequence:f.info.streamSequence,entry:d};if(f.headers&&(_.origin=f.headers.get(Fr.MSG_HEADERS.ORIGIN)),u.push(_),f.ack(),f.info.pending===0)break}return await c.delete(),u}a(pie,"viewStream");async function*hie(e,t=void 0,r=void 0){let{jsm:n,js:s}=await zi(),i=Gk(),o={durable_name:i,ack_policy:lN.Explicit};t&&(o.deliver_policy=uN.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];for await(let u of l){let f=cN(u.data);f[0]||(f=[f]);for(let d of f){let _={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:d};u.headers&&(_.origin=u.headers.get(Fr.MSG_HEADERS.ORIGIN)),yield _}if(u.ack(),u.info.pending===0)break}await c.delete()}a(hie,"viewStreamIterator");async function mie(e,t,r,n){ui.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=Qk(n,r);let{js:s}=await zi(),i=await Dg(),o=`${e}.${i}`,c=await iie(()=>n instanceof Uint8Array?n:Vk.encode(n));try{ui.trace(`publishToStream publishing to subject: ${o}`),sie(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(o,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return Zk(async()=>{try{await s.publish(o,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){ui.trace(`publishToStream creating stream: ${t}`);let f=o.split(".");f[2]="*",await _N(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(mie,"publishToStream");function Qk(e,t){t===void 0&&(t=nie());let r=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(Fr.MSG_HEADERS.ORIGIN)&&r&&t.append(Fr.MSG_HEADERS.ORIGIN,r),t}a(Qk,"addNatsMsgHeader");function ud(e){e=e.toLowerCase();let t=Ep.join(Cr.get(ze.CONFIG_PARAMS.ROOTPATH),oie);if(e===ze.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return bl(oN)&&(oN={port:hp.getConfigFromFile(ze.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:hp.getConfigFromFile(ze.CONFIG_PARAMS.CLUSTERING_NODENAME)+Fr.SERVER_SUFFIX.HUB,config_file:Fr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:Ep.join(t,Fr.PID_FILES.HUB),hdb_nats_path:t}),oN;if(e===ze.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return bl(iN)&&(iN={port:hp.getConfigFromFile(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:hp.getConfigFromFile(ze.CONFIG_PARAMS.CLUSTERING_NODENAME)+Fr.SERVER_SUFFIX.LEAF,config_file:Fr.NATS_CONFIG_FILES.LEAF_SERVER,domain:hp.getConfigFromFile(ze.CONFIG_PARAMS.CLUSTERING_NODENAME)+Fr.SERVER_SUFFIX.LEAF,pid_file_path:Ep.join(t,Fr.PID_FILES.LEAF),hdb_nats_path:t}),iN;ui.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a(ud,"getServerConfig");async function Xk(e,t,r,n){try{await e.consumers.add(t,{ack_policy:lN.Explicit,durable_name:r,deliver_policy:uN.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a(Xk,"createConsumer");async function Eie(e,t,r){await e.consumers.delete(t,r)}a(Eie,"removeConsumer");function gie(e){return e.split(".")[1]}a(gie,"extractServerName");async function Sie(e,t,r=6e4,n=dN()){if(!Cg.isObject(t))throw new Error("data param must be an object");let s=Vk.encode(t),{connection:i}=await zi(),o={timeout:r};n&&(o.reply=n,o.noMux=!0);let c=await i.request(e,s,o);return cN(c.data)}a(Sie,"request");function pN(e){return new Promise(async(t,r)=>{let n=Vse(aN,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",o=>{r(o)}),n.stdout.on("data",o=>{i+=o.toString()}),n.stderr.on("data",o=>{s+=o.toString()}),n.stderr.on("close",o=>{s&&r(s),t(i)})})}a(pN,"reloadNATS");async function Tie(){let{pid_file_path:e}=ud(ze.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await pN(e)}a(Tie,"reloadNATSHub");async function Aie(){let{pid_file_path:e}=ud(ze.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await pN(e)}a(Aie,"reloadNATSLeaf");function Rie(e,t,r){let n;switch(e.code){case Fk.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case Fk.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(Rie,"requestErrorHandler");async function yie(e,t){let r=t+Fr.SERVER_SUFFIX.LEAF,{connection:n}=await zi(),{jsm:s}=await Die(r),{schema:i,table:o}=e,c=Pg.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await Zk(async()=>{if(e.subscribe===!0)await Xk(s,c,n.info.server_name,l);else try{await Eie(s,c,n.info.server_name)}catch(u){ui.trace(u)}})}a(yie,"updateRemoteConsumer");async function bie(e,t,r,n){let s=Pg.createNatsTableStreamName(e,t),i=r+Fr.SERVER_SUFFIX.LEAF,o={type:ze.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!$k&&Jse()<Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=sN();await c(o)}await zse(o),n==="stop"&&await Cg.async_set_timeout(1e3)}a(bie,"updateConsumerIterator");function Zk(e){return Wse.writeTransaction(ze.SYSTEM_SCHEMA_NAME,ze.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(Zk,"exclusiveLock");async function eF(e,t){let r=Pg.createNatsTableStreamName(e,t),n=await Dg(),s=Iie(e,t,n);await _N(r,[s])}a(eF,"createLocalTableStream");async function Oie(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await eF(n,s)}}a(Oie,"createTableStreams");async function tF(e,t,r=void 0){if(Cr.get(ze.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=Pg.createNatsTableStreamName(e,t),{domain:s}=ud(ze.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await gp()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")ui.warn(n);else throw n}}a(tF,"purgeTableStream");async function Nie(e,t){if(Cr.get(ze.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await tF(e,t[r])}a(Nie,"purgeSchemaTableStreams");async function wie(e){return(await Sp()).streams.info(e)}a(wie,"getStreamInfo");function Iie(e,t,r){return`${Fr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(Iie,"createSubjectName");async function Dg(){if(mp)return mp;if(mp=(await Sp())?.nc?.info?.server_name,mp===void 0)throw new Error("Unable to get jetstream manager server name");return mp}a(Dg,"getJsmServerName");async function Cie(){let e=await Sp(),t=await Dg(),r=await Jk();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=Pie(n),c=i.split(".");if(c[c.length-1]===t&&!o||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let f=u.join(".");ui.trace(`Updating stream subject name from: ${i} to: ${f}`),s.subjects[0]=f,await e.streams.update(s.name,s)}}a(Cie,"updateLocalStreams");function Pie(e){let{config:t}=e,r=!1,n=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=Cr.get(ze.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);return i=i===null?-1:i,n!==t.max_age&&(t.max_age=n,r=!0),s!==t.max_bytes&&(t.max_bytes=s,r=!0),i!==t.max_msgs&&(t.max_msgs=i,r=!0),r}a(Pie,"updateStreamLimits");async function Die(e){let t,r;try{t=await tn.jetstream({domain:e}),r=await tn.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw ui.error("Unable to connect to:",e),n}return{js:t,jsm:r}}a(Die,"connectToRemoteJS")});function hN(e){let t=e.get(Lg),r=t?(0,dd.unpack)(t):null;r||(r={remoteNameToId:{}});let n=et(),s=!1;r.nodeName=et();let i=r.remoteNameToId;if(i[n]!==0){let o=0,c;for(let l in i){let u=i[l];u===0?c=l:u>o&&(o=u)}if(c){o++,i[c]=o;let l=[Symbol.for("seq"),o];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:Ap(e)??1,nodes:[]})})}i[n]=0,e.putSync(Lg,(0,dd.pack)(r))}return r}function Tp(e){return hN(e).remoteNameToId}function sF(e,t){let r=hN(t),n=r.remoteNameToId,s=new Map,i=!1;for(let o in e){let c=e[o],l=n[o];if(l==null){let u=0;for(let f in n){let d=n[f];d>u&&(u=d)}l=u+1,n[o]=l,i=!0}s.set(c,l)}return i&&t.putSync(Lg,(0,dd.pack)(r)),s}function Mg(e,t){let r=hN(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let o in n){let c=n[o];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(Lg,(0,dd.pack)(r))}return nF.trace?.("The remote node name map",e,n,s),s}var nF,dd,Lg,mN=Re(()=>{nF=v(ei());ss();dd=require("msgpackr"),Lg=Symbol.for("remote-ids");a(hN,"getIdMappingRecord");a(Tp,"exportIdMapping");a(sF,"remoteToLocalNodeId");a(Mg,"getIdOfRemoteNode")});var EN={};xe(EN,{commits_awaiting_replication:()=>fd,getHDBNodeTable:()=>ar,getReplicationSharedStatus:()=>vg,iterateRoutes:()=>yp,shouldReplicateToNode:()=>Rp,subscribeToNodeUpdates:()=>_d});function ar(){return iF||(iF=_t({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 vg(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function _d(e){ar().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;lF.debug?.("adding node",n,"on node",et()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==et()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of ar().search({}))if(i.shard!=null){let o=s.get(i.shard);o||s.set(i.shard,o=[]),o.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function Rp(e,t){let r=Ha.default.get(x.REPLICATION_DATABASES);return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&(r==="*"||r?.find?.(n=>(typeof n=="string"?n:n.name)===t&&(!n.sharded||e.shard===Ha.default.get(x.REPLICATION_SHARD))))&&ar().primaryStore.get(et())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function Lie(){_d(e=>{ka({},(t,r)=>{let n=e.name,s=oF.get(n);if(s||oF.set(n,s=new Map),s.has(r))return;let i;for(let o in t)if(i=t[o].auditStore,i)break;if(i){let o=vg(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of fd.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*yp(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=Ha.default.get(x.REPLICATION_SECUREPORT)??(!Ha.default.get(x.REPLICATION_PORT)&&Ha.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||Ha.default.get(x.REPLICATION_PORT)||Ha.default.get(x.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){aF.isMainThread&&console.error("Invalid route, must specify a url or host (with port)");continue}yield{replicates:!t.subscriptions,url:r,subscription:t.subscriptions,routes:t.routes,start_time:t.startTime,revoked_certificates:t.revokedCertificates}}}var aF,cF,Ha,lF,iF,oF,fd,Ol=Re(()=>{Le();ss();vm();aF=require("worker_threads"),cF=v(pe()),Ha=v(ce());k();lF=v(ei());server.nodes=[];a(ar,"getHDBNodeTable");a(vg,"getReplicationSharedStatus");a(_d,"subscribeToNodeUpdates");a(Rp,"shouldReplicateToNode");oF=new Map;FL((e,t,r)=>{if(r>server.nodes.length)throw new cF.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);fd||(fd=new Map,Lie());let n=fd.get(e);return n||(n=[],fd.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(Lie,"startSubscriptionToReplications");a(yp,"iterateRoutes")});var fF={};xe(fF,{connectedToNode:()=>Nl,disconnectedFromNode:()=>hd,ensureNode:()=>Mo,requestClusterStatus:()=>dF,startOnMainThread:()=>SN});async function SN(e){let t=0,r=Xe();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){Ug.set(i,Ap(l.auditStore));break}}}Ji.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes?.search([])||[])i.push(o);for(let o of yp(e))try{let c=!o.subscriptions;if(c){let u=et(),f=ar().primaryStore.get(u);if(f!==null){let d=e.url??Fa();(f===void 0||f.url!==d||f.shard!==e.shard)&&await Mo(u,{name:u,url:d,shard:e.shard,replicates:!0})}}let l=o.trusted!==!1;if(c&&o.replicates==null&&(o.replicates=!0),i.find(u=>u.url===o.url))continue;s(o)}catch(c){console.error(c)}_d(s)});let n;function s(i,o=i?.name){let c=et()&&o===et()||Fa()&&i?.url===Fa();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let _ of ar().search([]))_.replicates&&_.name!==o&&s(_,_.name);n=d}if(it.trace("Setting up node replication for",i),!i){for(let[d,_]of ji){let p;for(let[h,{worker:S,nodes:g}]of _){let R=g[0];if(R&&R.name==o){p=!0;for(let[E,{worker:T}]of _)_.delete(E),it.warn("Node was deleted, unsubscribing from node",o,E,d),T?.postMessage({type:"unsubscribe-from-node",node:o,database:E,url:d});break}}if(p){ji.get(d).iterator.remove(),ji.delete(d);return}}return}if(c)return;if(!i.url){it.info(`Node ${i.name} is missing url`);return}let l=ji.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(it.info(`Added node ${i.name} at ${i.url} for process ${et()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[d,_]of pd)if(i.url===_.url){pd.delete(d);break}pd.set(i.name,i)}let u=Xe();if(l||(l=new Map,ji.set(i.url,l)),l.iterator=ka(e,(d,_,p)=>{p?f(_,!0):f(_,!1)}),i.subscriptions)for(let d of i.subscriptions){let _=d.database||d.schema;u[_]||(it.warn(`Database ${_} not found for node ${i.name}, making a subscription anyway`),f(_,!1))}function f(d,_){it.trace("Setting up replication for database",d,"on node",i.name);let p=l.get(d),h,S=[{replicateByDefault:_,...i}];Ug.has(d)&&bp.default.get(x.REPLICATION_FAILOVER)&&(S.push({replicateByDefault:_,name:et(),start_time:Ug.get(d),end_time:Date.now(),replicates:!0}),Ug.delete(d));let g=Rp(i,d),R=Ji.workers.filter(E=>E.name==="http");if(p?(h=p.worker,p.nodes=S):g&&(t=t%R.length,h=R[t++],l.set(d,{worker:h,nodes:S,url:i.url}),h?.on("exit",()=>{l.get(d)?.worker===h&&(l.delete(d),f(d,_))})),g)setTimeout(()=>{let E={type:"subscribe-to-node",database:d,nodes:S};h?h.postMessage(E):Op(E)},Mie);else{it.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],ar().primaryStore.get(et())?.replicates),ar().primaryStore.get(et())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};h?h.postMessage(E):Bg(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),hd=a(function(i){try{it.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(pd.keys()),c=o.sort(),l=c.indexOf(i.name||di(i.url));if(l===-1){it.warn("Disconnected node not found in node map",i.name,o);return}let u=ji.get(i.url),f=u?.get(i.database);if(!f){it.warn("Disconnected node not found in replication map",i.database,u);return}if(f.connected=!1,i.finished||!bp.default.get(x.REPLICATION_FAILOVER))return;let d=f.nodes[0];if(!(d.replicates===!0||d.replicates?.sends||d.subscriptions?.length))return;let _=d.shard,p=(l+1)%c.length;for(;l!==p;){let h=c[p],S=pd.get(h);u=ji.get(S.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==_){p=(p+1)%c.length;continue}let{worker:R,nodes:E}=g,T=!1;for(let N of f.nodes){if(E.some(M=>M.name===N.name)){it.info(`Disconnected node is already failing over to ${h} for ${i.database}`);continue}N.end_time<Date.now()||(E.push(N),T=!0)}if(f.nodes=[f.nodes[0]],!T){it.info(`Disconnected node ${i.name} has no nodes to fail over to ${h}`);return}it.info(`Failing over ${i.database} from ${i.name} to ${h}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:E}):Op({database:i.database,nodes:E});return}it.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){it.error("Error failing over node",o)}},"disconnectedFromNode"),Nl=a(function(i){let o=ji.get(i.url),c=o?.get(i.database);if(!c){it.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){it.info("Connected node has no nodes",i.database,c);return}if(!l.name){it.debug("Connected node is not named yet",i.database,c);return}if(!bp.default.get(x.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let f of ji.values()){let d=f.get(i.database);if(!d||d==c)continue;let{worker:_,nodes:p,connected:h}=d;if(p)if(h===!1&&p[0].shard===l.shard)u=!0,c.nodes.push(p[0]);else{let S=p.filter(g=>g.name!==l.name);S.length<p.length&&(d.nodes=S,_.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,Ji.onMessageByType)("disconnected-from-node",hd),(0,Ji.onMessageByType)("connected-to-node",Nl),(0,Ji.onMessageByType)("request-cluster-status",dF)}function dF(e,t){let r=[];for(let[n,s]of pd)try{let i=ji.get(s.url);it.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let o=[];if(i){for(let[l,{worker:u,connected:f,nodes:d,latency:_}]of i)o.push({database:l,connected:f,latency:_,thread_id:u?.threadId,nodes:d.filter(p=>!(p.end_time<Date.now())).map(p=>p.name)});let c=(0,gN.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){it.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Mo(e,t){let r=ar();e=e??di(t.url),t.name=e;try{if(t.ca){let s=new uF.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subject_alt_name:s.subjectAltName,serial_number:s.serialNumber,valid_from:s.validFrom,valid_to:s.validTo}}}catch(s){it.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(it.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!bp.default.get(x.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],o=(0,gN.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of o)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...o,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}it.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var Ji,xg,it,gN,bp,uF,Mie,ji,hd,Nl,pd,Ug,Np=Re(()=>{Le();Ji=v(nt());ss();xg=require("worker_threads");Ol();it=v(J()),gN=require("lodash"),bp=v(ce());k();uF=require("crypto"),Mie=200,ji=new Map,pd=new Map,Ug=new Map;a(SN,"startOnMainThread");a(dF,"requestClusterStatus");xg.parentPort&&(hd=a(e=>{xg.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Nl=a(e=>{xg.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Ji.onMessageByType)("subscribe-to-node",e=>{Op(e)}),(0,Ji.onMessageByType)("unsubscribe-from-node",e=>{Bg(e)}));a(Mo,"ensureNode")});var os=P(vF=>{"use strict";var cr=require("path"),{watch:gF}=require("chokidar"),Dn=require("fs-extra"),md=require("node-forge"),SF=require("net"),{generateKeyPair:AN,X509Certificate:vo,createPrivateKey:TF}=require("crypto"),vie=require("util");AN=vie.promisify(AN);var Nt=md.pki,fi=require("joi"),{v4:AF}=require("uuid"),{validateBySchema:ON}=ct(),Ot=J(),is=ce(),Cs=(k(),C(G)),{CONFIG_PARAMS:Il}=Cs,_i=ub(),{ClientError:qa}=pe(),kg=require("node:tls"),{relative:RF,join:Uie}=require("node:path"),{CERT_PREFERENCE_APP:mDe,CERTIFICATE_VALUES:_F}=_i,xie=Ea(),Hg=bt(),{table:Bie,getDatabases:Hie,databases:TN}=(Le(),C(st)),{getJWTRSAKeys:pF}=(od(),C(_p));Object.assign(vF,{generateKeys:CN,updateConfigCert:IF,createCsr:Yie,signCertificate:Wie,setCertTable:Ed,loadCertificates:IN,reviewSelfSignedCert:DN,createTLSSelector:PF,listCertificates:LF,addCertificate:Zie,removeCertificate:toe,createNatsCerts:Jie,generateCertsKeys:jie,getReplicationCert:Ip,getReplicationCertAuth:Vie,renewSelfSigned:Qie,hostnamesFromCert:LN,getKey:roe});var{urlToNodeName:yF,getThisNodeUrl:kie,getThisNodeName:$g,clearThisNodeName:Fie}=(ss(),C(Uo)),{readFileSync:Gie,statSync:bF}=require("node:fs"),EDe=ce(),{getTicketKeys:qie,onMessageFromWorkers:$ie}=nt(),Ga=J(),{isMainThread:RN}=require("worker_threads"),{TLSSocket:OF,createSecureContext:gDe}=require("node:tls"),NN=3650,wp=["127.0.0.1","localhost","::1"],wN=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];$ie(async e=>{e.type===Cs.ITC_EVENT_TYPES.RESTART&&(is.initSync(!0),await DN())});var Gr;function Va(){return Gr||(Gr=Hie().system.hdb_certificate,Gr||(Gr=Bie({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__"}]}))),Gr}a(Va,"getCertTable");async function Ip(){let e=PF("replication"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get($g());if(!r)return;let n=new vo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(Ip,"getReplicationCert");async function Vie(){Va();let e=(await Ip()).options.cert,r=new vo(e).issuer.match(/CN=(.*)/)?.[1];return Gr.get(r)}a(Vie,"getReplicationCertAuth");var yN,$a=new Map,Fg=[],hF;function IN(){if(yN)return;if(yN=!0,!hF&&RN){let n=Hg.getConfigFilePath();hF=gF(n,{persistent:!1}).on("change",()=>{logger.warn?.("Config file changed, reloading certificates"),Kie()})}let e=[{configKey:Il.TLS},{configKey:Il.OPERATIONSAPI_TLS}];Va();let t=cr.dirname(Hg.getConfigFilePath()),r;for(let{configKey:n}of e){let s=Hg.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&RF(Uie(t,"keys"),o);if(c){let l=mF(o,u=>{$a.set(c,u)},"private key");l&&Fg.push(l)}for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&RN){let f=mF(u,d=>{if(_F.cert===d)return;let _=i.hostname??i.hostnames??i.host??i.hosts;_&&!Array.isArray(_)&&(_=[_]);let p=CF(u),h=new vo(p),S;try{S=!l&&i.name||MF(h)}catch(M){logger.error("error extracting host name from certificate",M);return}if(S==null){logger.error("No host name found on certificate");return}if(h.checkIssued(new vo(_F.cert)))return;let g=Gr.primaryStore.get(S),R=bF(u).mtimeMs,E=!g||g.is_self_signed?1:g.fileTimestamp??g.__updatedtime__,T=i.uses??["https",...n.includes("operations")?["operations"]:[]],N=g&&R===E&&(JSON.stringify(g.uses)!==JSON.stringify(T)||g.ciphers!==i.ciphers||JSON.stringify(g.hostnames)!==JSON.stringify(_));if(E&&R<=E&&!N){R<E&&logger.info?.(`Certificate ${S} at ${u} is older (${new Date(R)}) than the certificate in the database (${E>1?new Date(E):"only self signed certificate available"})`);return}N&&logger.info?.(`Config values changed for certificate ${S}, updating record`),r=Gr.put({name:S,uses:i.uses??["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:p,private_key_name:c,is_authority:l,hostnames:_,file_timestamp: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");f&&Fg.push(f)}}}}}return r}a(IN,"loadCertificates");function Kie(){for(let e of Fg)e.close();Fg.length=0,yN=!1,IN()}a(Kie,"reloadCertificates");function mF(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&RN&&Ot.warn(`Reloading ${r}:`,i),n=c,t(CF(i)))}catch(c){Ot.error(`Error loading ${r}:`,i,c)}},"loadFile");return Dn.existsSync(e)?s(e,bF(e)):Ot.error?.(`${r} file not found:`,e),gF(e,{persistent:!1}).on("change",s)}a(mF,"loadAndWatch");function Gg(){let e=kie();if(e==null){let t=wp[0];return Ot.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return yF(e)}a(Gg,"getHost");function qg(){let e=$g();if(e==null){let t=wp[0];return Ot.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(qg,"getCommonName");async function Yie(){let e=await Ip(),t=Nt.certificateFromPem(e.options.cert),r=Nt.privateKeyFromPem(e.options.key);Ot.info("Creating CSR with cert named:",e.name);let n=Nt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:qg()},...wN];Ot.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:NF()}];return Ot.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),md.pki.certificationRequestToPem(n)}a(Yie,"createCsr");function NF(){let e=wp.includes(qg())?wp:[...wp,qg()];return e.includes(Gg())||e.push(Gg()),[{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=>SF.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(NF,"certExtensions");async function Wie(e){let t={},r=cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Va();for await(let f of Gr.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if($a.has(f.private_key_name)){n=$a.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await Dn.exists(cr.join(r,f.private_key_name))){n=Dn.readFile(cr.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await bN();s=f.ca,n=f.private_key}n=Nt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=Nt.certificateFromPem(s.certificate);Ot.info("Signing CSR with cert named",s.name);let o=Nt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return Ot.error(f),new Error("Error verifying CSR: "+f.message)}let c=md.pki.createCertificate();c.serialNumber=Math.random().toString().slice(2,10),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+NN),Ot.info("sign cert setting validity:",c.validity),Ot.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),Ot.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;Ot.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,md.md.sha256.create()),t.certificate=Nt.certificateToPem(c)}else Ot.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(Wie,"signCertificate");async function zie(e,t){await Ed({name:$g(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Ed({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:Nt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}a(zie,"createCertificateTable");async function Ed(e){let t=new vo(e.certificate);e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},Va(),await Gr.patch(e)}a(Ed,"setCertTable");async function CN(){let e=await AN("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{public_key:Nt.publicKeyFromPem(e.publicKey),private_key:Nt.privateKeyFromPem(e.privateKey)}}a(CN,"generateKeys");async function PN(e,t,r){let n=Nt.createCertificate();if(!t){let o=await Ip();t=Nt.certificateFromPem(o.options.cert).publicKey}n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+NN);let i=[{name:"commonName",value:qg()},...wN];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(NF()),n.sign(e,md.md.sha256.create()),Nt.certificateToPem(n)}a(PN,"generateCertificates");async function bN(){let e=await LF(),t;for(let r of e){if(!r.is_authority)continue;let n=await DF(r.private_key_name);if(r.private_key_name&&n&&new vo(r.certificate).checkPrivateKey(TF(n))){Ot.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;Ot.trace("No CA found with matching private key")}a(bN,"getCertAuthority");async function wF(e,t,r=!0){let n=Nt.createCertificate();n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+NN);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${is.get(Il.REPLICATION_HOSTNAME)??yF(is.get(Il.REPLICATION_URL))??AF().split("-")[0]}`},...wN];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,md.md.sha256.create());let o=cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME),c=cr.join(o,_i.PRIVATEKEY_PEM_NAME);return r&&await Dn.writeFile(c,Nt.privateKeyToPem(e)),n}a(wF,"generateCertAuthority");async function jie(){let{private_key:e,public_key:t}=await CN(),r=await wF(e,t),n=await PN(e,t,r);await zie(n,r),IF()}a(jie,"generateCertsKeys");async function Jie(){let e=await PN(Nt.privateKeyFromPem(_i.CERTIFICATE_VALUES.key),void 0,Nt.certificateFromPem(_i.CERTIFICATE_VALUES.cert)),t=cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME),r=cr.join(t,_i.NATS_CERTIFICATE_PEM_NAME);await Dn.exists(r)||await Dn.writeFile(r,e);let n=cr.join(t,_i.NATS_CA_PEM_NAME);await Dn.exists(n)||await Dn.writeFile(n,_i.CERTIFICATE_VALUES.cert)}a(Jie,"createNatsCerts");async function Qie(){Va();for await(let e of Gr.search([{attribute:"is_self_signed",value:!0}]))await Gr.delete(e.name);await DN()}a(Qie,"renewSelfSigned");async function DN(){Fie(),await IN(),Va();let e=await bN();if(!e){Ot.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=a(u=>{try{return{key:Nt.privateKeyFromPem(Dn.readFileSync(u)),keyPath:u}}catch(f){return Ot.warn(`Failed to parse private key from ${u}:`,f.message),{key:null,keyPath:u}}},"tryToParseKey"),n=is.get(Il.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let f=r(u.privateKey);if(s=f.key,i=f.keyPath,f.key)break}}else{let u=is.get(Il.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME),c=RF(o,i);s||(Ot.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{private_key:s}=await CN(),Dn.existsSync(cr.join(o,_i.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${AF().split("-")[0]}.pem`),await Dn.writeFile(cr.join(o,c),Nt.privateKeyToPem(s)));let l=await wF(s,Nt.setRsaPublicKey(s.n,s.e),!1);await Ed({name:l.subject.getField("CN").value,uses:["https"],certificate:Nt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await Ip()){let r=$g();Ot.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await bN();let n=Nt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await PN(Nt.privateKeyFromPem(e.private_key),s,n);await Ed({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(DN,"reviewSelfSignedCert");function IF(){let e=xie(Object.keys(Cs.CONFIG_PARAM_MAP),!0),t=cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME),r=cr.join(t,_i.PRIVATEKEY_PEM_NAME),n=cr.join(t,_i.NATS_CERTIFICATE_PEM_NAME),s=cr.join(t,_i.NATS_CA_PEM_NAME),i=Cs.CONFIG_PARAMS,o={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(o[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(o[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,o[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,o[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),Hg.updateConfigValue(void 0,void 0,o,!1,!0)}a(IF,"updateConfigCert");function CF(e){return e.startsWith("-----BEGIN")?e:Gie(e,"utf8")}a(CF,"readPEM");var EF=kg.createSecureContext;kg.createSecureContext=function(e){if(!e.cert||!e.key)return EF(e);let t={...e};delete t.key,delete t.cert;let r=EF(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var Xie=OF.prototype._init;OF.prototype._init=function(e,t){Xie.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,o)=>{this.sni_context=o?.context||o,this.certCbDone()})}};var wl=new Map;function PF(e,t){let r=new Map,n,s=!1;return i.initialize=o=>i.ready?i.ready:(o&&(o.secureContexts=r,o.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),wl.clear();let f=0;for await(let d of TN.system.hdb_certificate.search([])){let _=d.certificate,p=new vo(_);d.is_authority&&(p.asString=_,wl.set(p.subject,_))}for await(let d of TN.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let _=e==="operations-api",p=d.is_self_signed?1:2;d.uses?.includes(e)&&(p+=1);let h=await DF(d.private_key_name),S=d.certificate,g=new vo(S);if(wl.has(g.issuer)&&(S+=`
|
|
24
24
|
`+wl.get(g.issuer)),!h||!S)throw new Error("Missing private key or certificate for secure server");let R={ciphers:d.ciphers,ticketKeys:qie(),availableCAs:wl,ca:t&&Array.from(wl.values()),cert:S,key:h,key_file:d.private_key_name,is_self_signed:d.is_self_signed};o&&(R.sessionIdContext=o.sessionIdContext);let E=d.hostnames??LN(g);Array.isArray(E)||(E=[E]);for(let M of E)M===Gg()&&(p+=.1);let T=kg.createSecureContext(R);T.name=d.name,T.options=R,T.quality=p,T.certificateAuthorities=Array.from(wl),T.certStart=S.toString().slice(0,100),Array.isArray(E)||(E=[E]);let N;for(let M of E)if(M){M[0]==="*"&&(s=!0,M=M.slice(1)),M===Gg()&&(p+=2),SF.isIP(M)&&(N=!0);let H=r.get(M)?.quality??0;p>H&&r.set(M,T)}else Ga.error("No hostname found for certificate at",kg.certificate);Ga.trace("Adding TLS",T.name,"for",o.ports||"client","cert named",d.name,"hostnames",E,"quality",p,"best quality",f),p>f&&(i.defaultContext=n=T,f=p,o&&(o.defaultContext=T))}catch(_){Ga.error("Error applying TLS for",d.name,_)}o?.secureContextsListeners.forEach(d=>d()),c(n)}catch(f){l(f)}}a(u,"updateTLS"),TN.system.hdb_certificate.subscribe({listener:a(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(o,c){Ga.info("TLS requested for",o||"(no SNI)");let l=o;for(;;){let f=r.get(l);if(f)return Ga.debug("Found certificate for",o,f.certStart),f.updatedContext&&(f=f.updatedContext),c(null,f);if(s&&l){let d=l.indexOf(".",1);d<0?l="":l=l.slice(d)}else break}o?Ga.debug("No certificate found to match",o,"using the default certificate"):Ga.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):Ga.info("No default certificate found"),c(null,u)}a(i,"SNICallback")}a(PF,"createTLSSelector");async function DF(e){let t=$a.get(e);return!t&&e?await Dn.readFile(cr.join(is.get(Il.ROOTPATH),Cs.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(DF,"getPrivateKeyByName");async function LF(){Va();let e=[];for await(let t of Gr.search([]))e.push(t);return e}a(LF,"listCertificates");async function Zie(e){let t=ON(e,fi.object({name:fi.string().required(),certificate:fi.string().required(),is_authority:fi.boolean().required(),private_key:fi.string(),hosts:fi.array(),uses:fi.array()}));if(t)throw new qa(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,o=new vo(n),c=!1,l=!1,u;for(let[p,h]of $a)!s&&!c&&o.checkPrivateKey(TF(h))&&(c=!0,u=p),s&&s===h&&(l=!0,u=p);if(!i&&!s&&!c)throw new qa("A suitable private key was not found for this certificate");let f;if(!r){try{f=MF(o)}catch(p){Ot.error(p)}if(f==null)throw new qa("Error extracting certificate common name, please provide a name parameter")}let d=eoe(r??f);s&&!c&&!l&&(await Dn.writeFile(cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME,d+".pem"),s),$a.set(d,s));let _={name:r??f,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(_.private_key_name=u??d+".pem"),e.ciphers&&(_.ciphers=e.ciphers),await Ed(_),"Successfully added certificate: "+d}a(Zie,"addCertificate");function eoe(e){return e.replace(/[^a-z0-9.]/gi,"-")}a(eoe,"sanitizeName");async function toe(e){let t=ON(e,fi.object({name:fi.string().required()}));if(t)throw new qa(t.message);let{name:r}=e;Va();let n=await Gr.get(r);if(!n)throw new qa(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Gr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(Ot.info("Removing private key named",s),await Dn.remove(cr.join(is.getHdbBasePath(),Cs.LICENSE_KEY_DIR_NAME,s)))}return await Gr.delete(r),"Successfully removed "+r}a(toe,"removeCertificate");function MF(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||LN(e)[0]}a(MF,"getPrimaryHostName");function LN(e){if(e.subjectAltName)return e.subjectAltName.split(",").map(r=>{let n=r.indexOf(":");if(r=r.slice(n+1),r=r.trim(),r[0]==='"')try{r=JSON.parse(r)}catch{}return r.indexOf("=")>-1?r.match(/CN=([^,]*)/)?.[1]:r}).filter(r=>r);let t=certObj.subject?.match(/CN=(.*)/)?.[1];return t?[t]:[]}a(LN,"hostnamesFromCert");async function roe(e){if(e.bypass_auth!==!0)throw new qa("Unauthorized","401");let t=ON(e,fi.object({name:fi.string().required()}));if(t)throw new qa(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await pF()).privateKey;if(r===".jwtPublic")return(await pF()).publicKey;if($a.get(r))return $a.get(e.name);throw new qa("Key not found")}a(roe,"getKey")});var tG={};xe(tG,{CONFIRMATION_STATUS_POSITION:()=>ZF,NodeReplicationConnection:()=>Sd,OPERATION_REQUEST:()=>xN,RECEIVED_TIME_POSITION:()=>Qg,RECEIVED_VERSION_POSITION:()=>Jg,RECEIVING_STATUS_POSITION:()=>Xg,RECEIVING_STATUS_RECEIVING:()=>eG,RECEIVING_STATUS_WAITING:()=>BN,SENDING_TIME_POSITION:()=>Cp,createWebSocket:()=>eS,database_subscriptions:()=>Ya,replicateOverWS:()=>Pp,table_update_listeners:()=>kN});async function eS(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=et(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!vN){let l=(0,jF.createTLSSelector)("replication"),u={secureContexts:null};await l.initialize(u),vN=u.secureContexts}if(i=vN.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 o={};r&&(o.Authorization=r);let c={headers:o,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,QF.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(jg?.caCount!==xo.size&&(jg=JF.createSecureContext({...i.options,ca:[...xo,...i.options.availableCAs.values()]}),jg.caCount=xo.size),c.secureContext=jg),new WF.WebSocket(e,"harperdb-replication-v1",c)}function Pp(e,t,r){let n=t.port||t.securePort,s=Cl.pid%1e3+"-"+zF.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3),i=0,o=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(o.buffer,0,1024),u=t.database,f=t.databaseSubscriptions||Ya,d,_,p=!1,h=t.subscription;h?.then&&h.then(A=>h=A);let S=t.tables||u&&Xe()[u];if(!r){le.error?.("No authorization provided"),pn(1008,"Unauthorized");return}let g=new Map,R=[],E=r.name;E&&t.connection&&(t.connection.nodeName=E);let T,N,M,H,Z,W,$,se=6e4,z,fe=0,ue=0,ee=0,Ae=YF.default.get(x.REPLICATION_BLOBTIMEOUT)??12e4,he=new Map,ye=[],kt=0,ft;if(t.url){let A=a(()=>{Z&&ue===e._socket?.bytesRead&&ee===e._socket?.bytesWritten?e.terminate():(Z=performance.now(),e.ping(),ue=e._socket?.bytesRead,ee=e._socket?.bytesWritten)},"send_ping");M=setInterval(A,VF).unref(),A()}else Fn();e._socket?.setMaxListeners(200);function Fn(){clearTimeout(H),ue=e._socket?.bytesRead,ee=e._socket?.bytesWritten,H=setTimeout(()=>{ue===e._socket?.bytesRead&&ee===e._socket?.bytesWritten&&(le.warn?.(`Timeout waiting for ping from ${E}, terminating connection and reconnecting`),e.terminate())},VF*2).unref()}a(Fn,"resetPingTimer");function Wr(){if(!(!E||!u||!d))return _||(_=vg(d,u,E)),_}a(Wr,"getSharedStatus"),u&&ha(u);let Dr,wf,Pc=[],rR=[],nR,Ft=[],If=[],Cf=[],sR=150,dm=25,Pf=0,Ce=0,Df=!1,fo,Lr,Gn,Dc;e.on("message",A=>{fe=performance.now();try{let y=A.dataView=new Pl(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let B=(0,Ze.decode)(A),[w,D,q]=B;switch(w){case xF:{if(D){if(E){if(E!==D){le.error?.(s,`Node name mismatch, expecting to connect to ${E}, but peer reported name as ${D}, disconnecting`),e.send((0,Ze.encode)([gd])),pn(1008,"Node name mismatch");return}}else if(E=D,t.connection?.tentativeNode){let oe=t.connection.tentativeNode;oe.name=E,t.connection.tentativeNode=null,Mo(E,oe)}if(t.connection&&(t.connection.nodeName=E),le.debug?.(s,"received node name:",E,"db:",u),!u)try{ha(u=B[2]),u==="system"&&(Dr=ka(t,(oe,V)=>{pa(V)&&vf(V)}),e.on("close",()=>{Dr?.remove()}))}catch(oe){le.warn?.(s,"Error setting database",oe),e.send((0,Ze.encode)([gd])),pn(1008,oe.message);return}_a()}break}case qF:{le.debug?.(s,"Received table definitions for",D.map(oe=>oe.table));for(let oe of D){let V=B[2];oe.database=V;let X;pa(V)&&(V==="system"?We[V]?.[oe.table]||(X=L(oe,We[V]?.[oe.table])):X=L(oe,We[V]?.[oe.table]),d||(d=X?.auditStore),S||(S=Xe()?.[V]))}break}case gd:pn();break;case xN:try{let oe=r?.replicates||r?.subscribers||r?.name;server.operation(D,{user:r},!oe).then(V=>{Array.isArray(V)&&(V={results:V}),V.requestId=D.requestId,e.send((0,Ze.encode)([Kg,V]))},V=>{e.send((0,Ze.encode)([Kg,{requestId:D.requestId,error:V instanceof Error?V.toString():V}]))})}catch(oe){e.send((0,Ze.encode)([Kg,{requestId:D.requestId,error:oe instanceof Error?oe.toString():oe}]))}break;case Kg:let{resolve:Q,reject:j}=g.get(D.requestId);D.error?j(new Error(D.error)):Q(D),g.delete(D.requestId);break;case MN:let F=B[3];S||(u?le.error?.(s,"No tables found for",u):le.error?.(s,"Database name never received"));let Ue=S[F];Ue=L({table:F,database:u,attributes:D.attributes,schemaDefined:D.schemaDefined},Ue),Pc[q]={name:F,decoder:new Ze.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:D.typedStructs,structures:D.structures}),getEntry(oe){return Ue.primaryStore.getEntry(oe)},rootStore:Ue.primaryStore.rootStore};break;case BF:Dc=d?sF(D,d):new Map,nR=B[2],le.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${nR}`);break;case HF:let Ee=q;Cf[Ee]=D;break;case GF:Wr()[ZF]=D,le.trace?.(s,"received and broadcasting committed update",D),Wr().buffer.notify();break;case FF:T=D,h.send({type:"end_txn",localTime:T,remoteNodeIds:R}),Wr(),_[Jg]=T,_[Qg]=Date.now(),_[Xg]=BN;break;case Yg:{let oe=B[1],{fileId:V,size:X,finished:de,error:me}=oe,ae=he.get(V);le.debug?.("Received blob",V,"has stream",!!ae,"connectedToBlob",!!ae?.connectedToBlob,"length",B[2].length,"finished",de),ae||(ae=new UN.PassThrough,ae.expectedSize=X,he.set(V,ae)),ae.lastChunk=Date.now();let Ie=B[2];Mt(Ie.byteLength,"bytes-received",`${E}.${u}`,"replication","blob");try{de?(me?(ae.on("error",()=>{}),ae.destroy(new Error("Blob error: "+me+" for record "+(ae.recordId??"unknown")+" from "+E))):ae.end(Ie),ae.connectedToBlob&&he.delete(V)):ae.write(Ie)}catch(He){le.error?.(`Error receiving blob for ${ae.recordId} from ${E} and streaming to storage`,He),he.delete(V)}break}case kF:{let oe=D,V;try{let X=B[3],de=rR[q]||(rR[q]=S[B[4]]);if(!de)return le.warn?.("Unknown table id trying to handle record request",q);let me=de.primaryStore.getBinaryFast(Symbol.for("structures")),ae=me?.length;if(ae>0&&ae!==Ce){Ce=ae;let He=(0,Ze.decode)(me);e.send((0,Ze.encode)([MN,{typedStructs:He.typed,structures:He.named},q,de.tableName]))}let Ie=de.primaryStore.getBinaryFast(X);if(Ie){let He=de.primaryStore.decoder.decode(Ie,{valueAsBuffer:!0}),De=He.value;He[jc]&Br&&(De=Buffer.from(De),a_(()=>de.primaryStore.decoder.decode(Ie),rt=>Lc(rt,X),de.primaryStore.rootStore)),V=(0,Ze.encode)([Vg,oe,{value:De,expiresAt:He.expiresAt,version:He.version,residencyId:He.residencyId,nodeId:He.nodeId,user:He.user}])}else V=(0,Ze.encode)([Vg,oe])}catch(X){V=(0,Ze.encode)([Vg,oe,{error:X.message}])}e.send(V);break}case Vg:{let{resolve:oe,reject:V,tableId:X,key:de}=g.get(B[1]),me=B[2];if(me?.error)V(new Error(me.error));else if(me){let ae;Jm(()=>{let Ie=Pc[X].decoder.decode(me.value);me.value=Ie,me.key=de,oe(me)||ae&&setTimeout(()=>ae.forEach(Wm),6e4).unref()},d?.rootStore,Ie=>{let He=Lf(Ie,de);return ae||(ae=[]),ae.push(He),He})}else oe();g.delete(B[1]);break}case UF:{Gn=D;let oe,V,X=!1;if(h){if(u!==h.databaseName&&!h.then){le.error?.("Subscription request for wrong database",u,h.databaseName);return}}else h=f.get(u);if(le.debug?.(s,"received subscription request for",u,"at",Gn),!h){let Oe;h=new Promise(br=>{le.debug?.("Waiting for subscription to database "+u),Oe=br}),h.ready=Oe,Ya.set(u,h)}if(r.name)V=ar().subscribe(r.name),V.then(async Oe=>{oe=Oe;for await(let br of oe){let It=br.value;if(!(It?.replicates===!0||It?.replicates?.receives||It?.subscriptions?.some(Or=>(Or.database||Or.schema)===u&&Or.publish!==!1))){X=!0,e.send((0,Ze.encode)([gd])),pn(1008,`Unauthorized database subscription to ${u}`);return}}},Oe=>{le.error?.(s,"Error subscribing to HDB nodes",Oe)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,Ze.encode)([gd])),pn(1008,`Unauthorized database subscription to ${u}`);return}if(Lr&&(le.debug?.(s,"stopping previous subscription",u),Lr.emit("close")),Gn.length===0)return;let de=Gn[0],me=a(Oe=>{if(Oe&&(de.replicateByDefault?!de.tables.includes(Oe.tableName):de.tables.includes(Oe.tableName)))return{table:Oe}},"tableToTableEntry"),ae={txnTime:0},Ie,He,De=1/0,rt,qn=a((Oe,br)=>{if(Oe.type==="end_txn"){ae.txnTime&&(o[i]!==66&&le.error?.("Invalid encoding of message"),_o(9),_o(Zg),m(rt=br),bi()),i=c,ae.txnTime=0;return}let It=Oe.nodeId,Or=Oe.tableId,At=He[Or];if(!At&&(At=He[Or]=me(h.tableById[Or]),!At))return le.debug?.("Not subscribed to table",Or);let As=At.table,Ct=As.primaryStore,js=Ct.encoder;(Oe.extendedType&iE||!js.typedStructs)&&(js._mergeStructures(js.getStructures()),js.typedStructs&&(js.lastTypedStructuresLength=js.typedStructs.length));let gu=Ie[It];if(!(gu&&gu.startTime<br&&(!gu.endTime||gu.endTime>br)))return zg&&le.trace?.(s,"skipping replication update",Oe.recordId,"to:",E,"from:",It,"subscribed:",Ie),yD();zg&&le.trace?.(s,"sending replication update",Oe.recordId,"to:",E,"from:",It,"subscribed:",Ie);let iR=Oe.version,Uc=Oe.residencyId,oR=Mf(Uc,As),_m;if(oR&&!oR.includes(E)){let Js=Mf(Oe.previousResidencyId,As);if(Js&&!Js.includes(E)&&(Oe.type==="put"||Oe.type==="patch")||As.getResidencyById)return yD();let Uf=Oe.recordId;le.trace?.(s,"sending invalidation",Uf,E,"from",It);let xf=0;Uc&&(xf|=Xc),Oe.previousResidencyId&&(xf|=Zc);let lR,pm=null;for(let bD in As.indices){if(!pm){if(lR=Oe.getValue(Ct,!0),!lR)break;pm={}}pm[bD]=lR[bD]}_m=Jc(Oe.version,Or,Uf,null,It,Oe.user,Oe.type==="put"||Oe.type==="patch"?"invalidate":Oe.type,js.encode(pm),xf,Uc,Oe.previousResidencyId,Oe.expiresAt)}function yD(){return le.trace?.(s,"skipping audit record",Oe.recordId),W||(W=setTimeout(()=>{W=null,(rt||0)+$F/2<De&&(zg&&le.trace?.(s,"sending skipped sequence update",De),e.send((0,Ze.encode)([FF,De])))},$F).unref()),new Promise(setImmediate)}a(yD,"skipAuditRecord");let aR=js.typedStructs,cR=js.structures;if((aR?.length!=At.typed_length||cR?.length!=At.structure_length)&&(At.typed_length=aR?.length,At.structure_length=cR.length,le.debug?.(s,"send table struct",At.typed_length,At.structure_length),At.sentName||(At.sentName=!0),e.send((0,Ze.encode)([MN,{typedStructs:aR,structures:cR,attributes:As.attributes,schemaDefined:As.schemaDefined},Or,At.table.tableName]))),Uc&&!If[Uc]&&(e.send((0,Ze.encode)([HF,oR,Uc])),If[Uc]=!0),ae.txnTime!==iR&&(ae.txnTime&&(zg&&le.trace?.(s,"new txn time, sending queued txn",ae.txnTime),o[i]!==66&&le.error?.("Invalid encoding of message"),bi()),ae.txnTime=iR,i=c,m(iR)),_m)_o(_m.length),K(_m);else{let Js=Oe.encoded;Oe.extendedType&Br&&a_(()=>Oe.getValue(Ct),xf=>Lc(xf,Oe.recordId),Ct.rootStore);let Uf=Js[0]===66?8:0;_o(Js.length-Uf),K(Js,Uf),le.trace?.("wrote record",Oe.recordId,"length:",Js.length)}return e._socket.writableNeedDrain?new Promise(Js=>{le.debug?.(`Waiting for remote node ${E} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Js)}):kt>dm?new Promise(Js=>{ft=Js}):new Promise(setImmediate)},"sendAuditRecord"),bi=a(()=>{c-i>8?(e.send(o.subarray(i,c)),le.debug?.(s,"Sent message, size:",c-i),Mt(c-i,"bytes-sent",`${E}.${u}`,"replication","egress")):le.debug?.(s,"skipping empty transaction")},"sendQueuedData");Lr=new HN.EventEmitter,Lr.once("close",()=>{X=!0,oe?.end()});for(let{startTime:Oe}of Gn)Oe<De&&(De=Oe);(V||Promise.resolve()).then(async()=>{h=await h,d=h.auditStore,He=h.tableById.map(me),Ie=[];for(let{name:br,startTime:It,endTime:Or}of Gn){let At=Mg(br,d);le.debug?.("subscription to",br,"using local id",At,"starting",It),Ie[At]={startTime:It,endTime:Or}}vf(u),Dr||(Dr=Dl(br=>{br.databaseName===u&&vf(u)}),wf=Dp(br=>{br===u&&(e.send((0,Ze.encode)([gd])),pn())}),e.on("close",()=>{Dr?.remove(),wf?.remove()})),e.send((0,Ze.encode)([BF,Tp(h.auditStore),Gn.map(({name:br})=>br)]));let Oe=!0;do{isFinite(De)||(le.warn?.("Invalid sequence id "+De),pn(1008,"Invalid sequence id"+De));let br;if(Oe&&!X&&(Oe=!1,De===0)){let It=De,Or=tS(d);for(let At in S){if(!me(At))continue;let As=S[At];le.warn?.(`Fully copying ${At} table to ${E}`);for(let Ct of As.primaryStore.getRange({snapshot:!1,versions:!0})){if(X)return;if(Ct.localTime>=De){le.trace?.(s,"Copying record from",u,At,Ct.key,Ct.localTime),It=Math.max(Ct.localTime,It),Wr()[Cp]=1;let js=Jc(Ct.version,As.tableId,Ct.key,null,Or,null,"put",a_(()=>As.primaryStore.encoder.encode(Ct.value),gu=>Lc(gu,Ct.key)),Ct.metadataFlags&-256,Ct.residencyId,null,Ct.expiresAt);await qn({recordId:Ct.key,tableId:As.tableId,type:"put",getValue(){return Ct.value},encoded:js,version:Ct.version,residencyId:Ct.residencyId,nodeId:Or,extendedType:Ct.metadataFlags},Ct.localTime)}}}c-i>8&&qn({type:"end_txn"},De),Wr()[Cp]=0,De=It}for(let{key:It,value:Or}of d.getRange({start:De||1,exclusiveStart:!0,snapshot:!1})){if(X)return;let At=St(Or);le.debug?.("sending audit record",new Date(It)),Wr()[Cp]=It,De=It,await qn(At,It),Lr.startTime=It}c-i>8&&qn({type:"end_txn"},De),Wr()[Cp]=0,await rG(d)}while(!X)}).catch(Oe=>{le.error?.(s,"Error handling subscription to node",Oe),pn(1008,"Error handling subscription to node")});break}}return}y.position=8;let I=!0,b,U;do{Wr();let B=y.readInt();if(B===9&&y.getUint8(y.position)==Zg){y.position++,T=U=y.readFloat64(),_[Jg]=T,_[Qg]=Date.now(),_[Xg]=BN,le.trace?.("received remote sequence update",T,u);break}let w=y.position,D=St(A,w,w+B),q=Pc[D.tableId];q||le.error?.(`No table found with an id of ${D.tableId}`);let Q;D.residencyId&&(Q=Cf[D.residencyId],le.trace?.(s,"received residency list",Q,D.type,D.recordId));try{let j=D.recordId;Jm(()=>{b={table:q.name,id:j,type:D.type,nodeId:Dc.get(D.nodeId),residencyList:Q,timestamp:D.version,value:D.getValue(q),user:D.user,beginTxn:I,expiresAt:D.expiresAt}},d?.rootStore,F=>Lf(F,j))}catch(j){throw j.message+="typed structures for current decoder"+JSON.stringify(q.decoder.typedStructs),j}I=!1,le.trace?.(s,"received replication message",D.type,"id",b.id,"version",new Date(D.version),"nodeId",b.nodeId),_[Jg]=D.version,_[Qg]=Date.now(),_[Xg]=eG,h.send(b),y.position=w+B}while(y.position<A.byteLength);Pf++,Mt(A.byteLength,"bytes-received",`${E}.${u}.${b?.table||"unknown_table"}`,"replication","ingest"),Pf>sR&&!Df&&(Df=!0,e.pause(),le.debug?.(`Commit backlog causing replication back-pressure, requesting that ${E} pause replication`)),h.send({type:"end_txn",localTime:T,remoteNodeIds:R,async onCommit(){if(b){let B=Date.now()-b.timestamp;Mt(B,"replication-latency",E+"."+u+"."+b.table,b.type,"ingest")}Pf--,Df&&(Df=!1,e.resume(),le.debug?.(`Replication resuming ${E}`)),ye.length>0&&await Promise.all(ye),le.trace?.("All blobs finished"),!N&&U&&(le.trace?.(s,"queuing confirmation of a commit at",U),setTimeout(()=>{e.send((0,Ze.encode)([GF,N])),le.trace?.(s,"sent confirmation of a commit at",N),N=null},soe)),N=U,le.debug?.("last sequence committed",new Date(U),u)}})}catch(y){le.error?.(s,"Error handling incoming replication message",y)}}),e.on("ping",Fn),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-Z,t.isSubscriptionConnection&&Nl({name:E,database:u,url:t.url,latency:t.connection.latency})),Z=null}),e.on("close",(A,y)=>{clearInterval(M),clearTimeout(H),clearInterval($),Lr&&Lr.emit("close"),fo&&fo.end();for(let[I,{reject:b}]of g)b(new Error(`Connection closed ${y?.toString()} ${A}`));le.debug?.(s,"closed",A,y?.toString())});function pn(A,y){e.isFinished=!0,e.close(A,y),t.connection?.emit("finished")}a(pn,"close");let Mr=new Set;async function Lc(A,y){let I=zm(A);if(Mr.has(I)){le.debug?.("Blob already being sent",I);return}Mr.add(I);try{let b;kt++;for await(let U of A.stream())b&&(le.debug?.("Sending blob chunk",I,"length",b.length),e.send((0,Ze.encode)([Yg,{fileId:I,size:A.size},b]))),b=U,e._socket.writableNeedDrain&&(le.debug?.("draining",I),await new Promise(B=>e._socket.once("drain",B)),le.debug?.("drained",I)),Mt(U.length,"bytes-sent",`${E}.${u}`,"replication","blob");le.debug?.("Sending final blob chunk",I,"length",b.length),e.send((0,Ze.encode)([Yg,{fileId:I,size:A.size,finished:!0},b]))}catch(b){le.warn?.("Error sending blob",b,"blob id",I,"for record",y),e.send((0,Ze.encode)([Yg,{fileId:I,finished:!0,error:b.toString()},Buffer.alloc(0)]))}finally{Mr.delete(I),kt--,kt<dm&&ft?.()}}a(Lc,"sendBlobs");function Lf(A,y){let I=zm(A),b=he.get(I);le.debug?.("Received transaction for record",y,"with blob",I,"has stream",!!b,"ended",!!b?.writableEnded),b?b.writableEnded&&he.delete(I):(b=new UN.PassThrough,he.set(I,b)),b.connectedToBlob=!0,b.lastChunk=Date.now(),b.recordId=y,A.size===void 0&&b.expectedSize&&(A.size=b.expectedSize);let U=b.blob??createBlob(b,A);b.blob=U;let B=Eo(()=>o_(U).saving,h.auditStore?.rootStore);return B&&(B.blobId=I,ye.push(B),B.finally(()=>{le.debug?.(`Finished receiving blob stream ${I}`),ye.splice(ye.indexOf(B),1)})),U}a(Lf,"receiveBlobs");function _a(){if(p||(p=!0,t.connection?.on("subscriptions-updated",_a)),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let A=new Map;d||(d=h?.auditStore);try{for(let b of h?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let U of b.value.nodes||[])U.lastTxnTime>(A.get(U.id)??0)&&A.set(U.id,U.lastTxnTime)}catch(b){if(!b.message.includes("Can not re"))throw b}let y=t.connection?.nodeSubscriptions?.[0];R=[];let I=t.connection?.nodeSubscriptions?.map((b,U)=>{let B=[],{replicateByDefault:w}=b;if(b.subscriptions){for(let j of b.subscriptions)if(j.subscribe&&(j.schema||j.database)===u){let F=j.table;S?.[F]?.replicate!==!1&&B.push(F)}w=!1}else for(let j in S)(w?S[j].replicate===!1:S[j].replicate)&&B.push(j);let D=d&&Mg(b.name,d),q=h?.dbisDB?.get([Symbol.for("seq"),D])??1,Q=Math.max(q?.seqId??1,(typeof b.start_time=="string"?new Date(b.start_time).getTime():b.start_time)??1);if(le.debug?.("Starting time recorded in db",b.name,D,u,q?.seqId,"start time:",Q,new Date(Q)),y!==b){let j=d&&Mg(y.name,d),F=h?.dbisDB?.get([Symbol.for("seq"),j])??1;for(let Ue of F?.nodes||[])Ue.name===b.name&&(Q=Ue.seqId,le.debug?.("Using sequence id from proxy node",y.name,Q))}if(D===void 0?le.warn("Starting subscription request from node",b,"but no node id found"):R.push(D),A.get(D)>Q&&(Q=A.get(D),le.debug?.("Updating start time from more recent txn recorded",y.name,Q)),Q===1&&Wg)try{new URL(Wg).hostname===b.name&&E===b.name?(le.warn?.(`Requesting full copy of database ${u} from ${Wg}`),Q=0):Q=Date.now()-6e4}catch(j){le.error?.("Error parsing leader URL",Wg,j)}return le.trace?.(s,"defining subscription request",b.name,u,new Date(Q)),{name:b.name,replicateByDefault:w,tables:B,startTime:Q,endTime:b.end_time}});if(I)if(le.debug?.(s,"sending subscription request",I,h?.dbisDB?.path),clearTimeout(z),I.length>0)e.send((0,Ze.encode)([UF,I]));else{let b=a(()=>{let U=performance.now();z=setTimeout(()=>{fe<=U?pn(1008,"Connection has no subscriptions and is no longer used"):b()},se).unref()},"schedule_close");b()}}a(_a,"sendSubscriptionRequestUpdate");function Mf(A,y){if(!A)return;let I=Ft[A];return I||(I=y.getResidencyRecord(A),Ft[A]=I),I}a(Mf,"getResidence");function pa(A){return!(Ka&&Ka!="*"&&!Ka[A]&&!Ka.includes?.(A)&&!Ka.some?.(y=>y.name===A))}a(pa,"checkDatabaseAccess");function ha(A){if(h=h||f.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`),d=h?.auditStore,S||(S=Xe()?.[A]);let y=et();if(y===E)throw y?new Error("Should not connect to self",y):new Error("Node name not defined");return fm(y,A),!0}a(ha,"setDatabase");function fm(A,y){let I=Xe()?.[y],b=[];for(let U in I){let B=I[U];b.push({table:U,schemaDefined:B.schemaDefined,attributes:B.attributes.map(w=>({name:w.name,type:w.type,isPrimaryKey:w.isPrimaryKey}))})}le.trace?.("Sending database info for node",A,"database name",y),e.send((0,Ze.encode)([xF,A,y,b]))}a(fm,"sendNodeDBName");function vf(A){let y=Xe()?.[A],I=[];for(let b in y){if(Gn&&!Gn.some(B=>B.replicateByDefault?!B.tables.includes(b):B.tables.includes(b)))continue;let U=y[b];I.push({table:b,schemaDefined:U.schemaDefined,attributes:U.attributes.map(B=>({name:B.name,type:B.type,isPrimaryKey:B.isPrimaryKey}))})}e.send((0,Ze.encode)([qF,I,A]))}a(vf,"sendDBSchema"),$=setInterval(()=>{for(let[A,y]of he)y.lastChunk+Ae<Date.now()&&(le.warn?.(`Timeout waiting for blob stream to finish ${A} for record ${y.recordId??"unknown"} from ${E}`),he.delete(A),y.end())},Ae).unref();let Mc=1,vc=[];return{end(){fo&&fo.end(),Lr&&Lr.emit("close")},getRecord(A){let y=Mc++;return new Promise((I,b)=>{let U=[kF,y,A.table.tableId,A.id];vc[A.table.tableId]||(U.push(A.table.tableName),vc[A.table.tableId]=!0),e.send((0,Ze.encode)(U)),fe=performance.now(),g.set(y,{tableId:A.table.tableId,key:A.id,resolve(B){let{table:w,entry:D}=A;if(I(B),B)return w._recordRelocate(D,B)},reject:b})})},sendOperation(A){let y=Mc++;return A.requestId=y,e.send((0,Ze.encode)([xN,A])),new Promise((I,b)=>{g.set(y,{resolve:I,reject:b})})}};function _o(A){O(5),A<128?o[c++]=A:A<16384?(l.setUint16(c,A|32768),c+=2):A<1056964608?(l.setUint32(c,A|3221225472),c+=4):(o[c]=255,l.setUint32(c+1,A),c+=5)}function K(A,y=0,I=A.length){let b=I-y;O(b),A.copy(o,c,y,I),c+=b}function m(A){O(8),l.setFloat64(c,A),c+=8}function O(A){if(A+16>o.length-c){let y=Buffer.allocUnsafeSlow(c+A-i+65536>>10<<11);o.copy(y,0,i,c),c=c-i,i=0,o=y,l=new DataView(o.buffer,0,o.length)}}function L(A,y){let I=A.database??"data";if(I!=="data"&&!We[I]){le.warn?.("Database not found",A.database);return}y||(y={});let b=y.schemaDefined,U=!1,B=A.schemaDefined,w=y.attributes||[];for(let D=0;D<A.attributes?.length;D++){let q=A.attributes[D],Q=w.find(j=>j.name===q.name);(!Q||Q.type!==q.type)&&(b?le.error?.(`Schema for '${u}.${A.table}' is defined locally, but attribute '${q.name}: ${q.type}' from '${E}' does not match local attribute ${Q?"'"+Q.name+": "+Q.type+"'":"which does not exist"}`):(U=!0,B||(q.indexed=!0),Q?w[w.indexOf(Q)]=q:w.push(q)))}return U?(le.debug?.("(Re)creating",A),_t({table:A.table,database:A.database,schemaDefined:A.schemaDefined,attributes:w,...y})):y}}var YF,Ze,WF,zF,le,HN,jF,JF,Cl,QF,UN,XF,UF,xF,BF,gd,HF,MN,kF,Vg,xN,Kg,FF,GF,qF,Yg,ZF,Jg,Qg,Cp,Xg,BN,eG,noe,Wg,kN,Ya,zg,$F,soe,VF,vN,jg,KF,Sd,FN=Re(()=>{Le();Mi();mN();GN();ss();YF=v(ce());k();xu();Ze=require("msgpackr"),WF=require("ws"),zF=require("worker_threads"),le=v(ei());Np();HN=require("events"),jF=v(os()),JF=v(require("node:tls"));Ol();Cl=v(require("node:process")),QF=require("node:net");Ki();Rn();UN=require("node:stream"),XF=v(require("minimist")),UF=129,xF=140,BF=141,gd=142,HF=130,MN=132,kF=133,Vg=134,xN=136,Kg=137,FF=143,GF=144,qF=145,Yg=146,ZF=0,Jg=1,Qg=2,Cp=3,Xg=4,BN=0,eG=1,noe=(0,XF.default)(Cl.argv),Wg=noe.HDB_LEADER_URL??Cl.env.HDB_LEADER_URL,kN=new Map,Ya=new Map,zg=!0,$F=300,soe=2,VF=3e4;a(eS,"createWebSocket");KF=500,Sd=class extends HN.EventEmitter{constructor(r,n,s,i,o){super();this.url=r;this.subscription=n;this.databaseName=s;this.nodeName=i;this.authorization=o;this.nodeName=this.nodeName??di(r)}static{a(this,"NodeReplicationConnection")}socket;startTime;retryTime=KF;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await eS(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;le.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${Cl.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=KF,this.nodeSubscriptions&&Nl({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,n=Pp(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(n)}),this.socket.on("error",s=>{s.code==="SELF_SIGNED_CERT_IN_CHAIN"?(le.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),s.isHandled=!0):s.code!=="ECONNREFUSED"&&(s.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?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 ${s.message}`)),this.sessionReject(s)}),this.socket.on("close",(s,i)=>{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,n?.end(),this.emit("finished");return}if(++this.retries%20===1){let o=i?.toString();le.warn?.(`${n?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${o?'"'+o+'" ':""}(code: ${s})`)}n=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((r,n)=>{this.sessionResolve=r,this.sessionReject=n})}subscribe(r,n){this.nodeSubscriptions=r,this.replicateTablesByDefault=n,this.emit("subscriptions-updated",r)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(r){return this.session.then(n=>n.getRecord(r))}};a(Pp,"replicateOverWS")});var Uo={};xe(Uo,{clearThisNodeName:()=>_oe,disableReplication:()=>coe,enabled_databases:()=>Ka,forEachReplicatedDatabase:()=>ka,getThisNodeId:()=>tS,getThisNodeName:()=>et,getThisNodeUrl:()=>Fa,hostnameToUrl:()=>oS,lastTimeInAuditStore:()=>Ap,monitorNodeCAs:()=>uG,replicateOperation:()=>hoe,replication_certificate_authorities:()=>xo,sendOperationToNode:()=>Lp,servers:()=>ooe,setReplicator:()=>fG,start:()=>aoe,startOnMainThread:()=>SN,subscribeToNode:()=>Op,unsubscribeFromNode:()=>Bg,urlToNodeName:()=>di});function aoe(e){if(!e.port&&!e.securePort&&(e.port=Ps.default.get(x.OPERATIONSAPI_NETWORK_PORT),e.securePort=Ps.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),!et())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of yp(e))t.set(di(s.url),s);loe(e),e={mtls:!0,usageType:"replication",maxPayload:10*1024*1024*1024,...e};let r=Ye.ws(async(s,i,o,c)=>{if(i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,o);await o,s._socket.unref(),Pp(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&lr.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Ye.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){!s.authorized&&s._nodeRequest.socket.authorizationError&&lr.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let o=ar().primaryStore;if(s.authorized&&s.peerCertificate.subject){let c=s.peerCertificate.subject,l=c&&(o.get(c.CN)||t.get(c.CN));if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){lr.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else lr.warn(`No node found for certificate common name ${c.CN}, available nodes are ${Array.from(o.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=o.get(s.ip)||t.get(s.ip);c?s.user=c:lr.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...o.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=a(()=>{let o=new Set(s.secureContexts.values());s.defaultContext&&o.add(s.defaultContext);for(let c of o)try{let l=Array.from(xo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=iS.createSecureContext(u)}catch(l){lr.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Ps.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1&&i()}uG(()=>{for(let s of n)s()})}function uG(e){let t=0;_d(r=>{r?.ca&&(xo.add(r.ca),xo.size!==t&&(t=xo.size,e?.()))})}function coe(e=!0){lG=e}function loe(e){lG||(Xe(),Ka=e.databases,ka(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||Ya;for(let[s,i]of nS){let o=i.get(r);o&&(o.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];fG(r,s,e),kN.get(s)?.forEach(i=>i(s))}}))}function fG(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 dG extends zr{static{a(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||Ya,o=i.get(e),c=o?.tableById||[];c[t.tableId]=t;let l=o?.ready;if(lr.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new Vn,i.set(e,o),o.tableById=c,o.auditStore=t.auditStore,o.dbisDB=t.dbisDB,o.databaseName=e,l&&l(o),o;this.subscription=o}static subscribeOnThisThread(i,o){return!0}static async load(i){if(i){let o=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),o]);if(c){let l,u=new Set;do{let f;for(let _ of c){if(_===Ye.hostname)continue;let p=doe(_,dG.subscription,e);p?.isConnected&&!u.has(p)&&(!f||p.latency<f.latency)&&(f=p)}if(!f)throw l||new aG.ServerError("No connection to any other nodes are available",502);let d={requestId:ioe++,table:t,entry:i,id:i.key};u.add(f);try{return await f.getRecord(d)}catch(_){if(f.isConnected)throw _;lr.warn("Error in load from node",sS,_),l||(l=_)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function uoe(e,t,r,n,s){let i=nS.get(e);i||(i=new Map,nS.set(e,i));let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new Sd(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function doe(e,t,r){let n=nG.get(e);n||(n=new Map,nG.set(e,n));let s=n.get(r);if(s)return s;let i=ar().primaryStore.get(e);return i?.url&&(s=new Sd(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function Lp(e,t,r){r||(r={}),r.serverName=e.name;let n=await eS(e.url,r),s=Pp(n,{},{});return new Promise((i,o)=>{n.on("open",()=>{i(s.sendOperation(t))}),n.on("error",c=>{o(c)}),n.on("close",c=>{lr.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function Op(e){try{cG.isMainThread&&lr.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=Ya.get(e.database);if(!t){let n;t=new Promise(s=>{lr.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,Ya.set(e.database,t)}let r=uoe(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=>Rp(n,e.database)),e.replicateByDefault)}catch(t){lr.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function Bg({name:e,url:t,database:r}){lr.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(ar().primaryStore.getRange({})));let n=nS.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function foe(){if(qN!==void 0)return qN;let e=Ps.default.get(x.OPERATIONSAPI_TLS_CERTIFICATE)||Ps.default.get(x.TLS_CERTIFICATE);if(e)return qN=new iG.X509Certificate((0,oG.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function et(){return sS||(sS=Ps.default.get("replication_hostname")??di(Ps.default.get("replication_url"))??foe()??sG("operationsapi_network_secureport")??sG("operationsapi_network_port")??"127.0.0.1")}function _oe(){sS=void 0}function sG(e){let t=Ps.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function rS(e){let t=Ps.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[[\]]/g,""):+t}function tS(e){return Tp(e)?.[et()]}function Fa(){let e=Ps.default.get("replication_url");return e||oS(et())}function oS(e){let t=rS("replication_port");if(t)return`ws://${e}:${t}`;if(t=rS("replication_secureport"),t)return`wss://${e}:${t}`;if(t=rS("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=rS("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function di(e){if(e)return new URL(e).hostname}function ka(e,t){for(let n of Object.getOwnPropertyNames(We))r(n);return Dp(n=>{r(n)}),Dl((n,s)=>{r(n.databaseName)});function r(n){let s=We[n];lr.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):poe(n)&&t(s,n,!1)}a(r,"forDatabase")}function poe(e){let t=We[e];for(let r in t)if(t[r].replicate)return!0}function Ap(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function hoe(e){let t={message:""};if(e.replicated){e.replicated=!1,lr.trace?.("Replicating operation",e.operation,"to nodes",Ye.nodes.map(n=>n.name));let r=await Promise.allSettled(Ye.nodes.map(n=>Lp(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Ye.nodes[s]?.name,i})}return t}var Ps,lr,iG,oG,iS,aG,cG,lG,ioe,ooe,xo,Ka,nS,nG,qN,sS,ss=Re(()=>{Le();ya();Au();FN();Ur();Ps=v(ce()),lr=v(J()),iG=require("crypto"),oG=require("fs");Np();Ol();k();mN();iS=v(require("node:tls")),aG=v(pe()),cG=require("worker_threads"),ioe=1,ooe=[],xo=Ps.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1?new Set(iS.rootCertificates):new Set;a(aoe,"start");a(uG,"monitorNodeCAs");a(coe,"disableReplication");a(loe,"assignReplicationSource");a(fG,"setReplicator");nS=new Map;a(uoe,"getSubscriptionConnection");nG=new Map;a(doe,"getRetrievalConnectionByName");a(Lp,"sendOperationToNode");a(Op,"subscribeToNode");a(Bg,"unsubscribeFromNode");a(foe,"getCommonNameFromCert");a(et,"getThisNodeName");a(_oe,"clearThisNodeName");Object.defineProperty(Ye,"hostname",{get(){return et()}});a(sG,"getHostFromListeningPort");a(rS,"getPortFromListeningPort");a(tS,"getThisNodeId");Ye.replication={getThisNodeId:tS,exportIdMapping:Tp};a(Fa,"getThisNodeUrl");a(oS,"hostnameToUrl");a(di,"urlToNodeName");a(ka,"forEachReplicatedDatabase");a(poe,"hasExplicitlyReplicatedTable");a(Ap,"lastTimeInAuditStore");a(hoe,"replicateOperation")});var vp=P((KDe,EG)=>{"use strict";var Td=wk(),{validateBySchema:Mp}=ct(),{common_validators:Ad,schema_regex:$N}=Bi(),ur=require("joi"),moe=J(),Eoe=require("uuid").v4,lS=Co(),Rd=(k(),C(G)),goe=require("util"),Wa=Jn(),{handleHDBError:Bo,hdb_errors:Soe,ClientError:Ll}=pe(),{HDB_ERROR_MSGS:aS,HTTP_STATUS_CODES:Ho}=Soe,{SchemaEventMsg:uS}=oi(),_G=or(),{getDatabases:Toe}=(Le(),C(st)),{transformReq:yd}=ie(),{replicateOperation:pG}=(ss(),C(Uo)),{cleanupOrphans:VDe}=(Rn(),C(vu)),cS=ur.string().min(1).max(Ad.schema_length.maximum).pattern($N).messages({"string.pattern.base":"{:#label} "+Ad.schema_format.message}),Aoe=ur.string().min(1).max(Ad.schema_length.maximum).pattern($N).messages({"string.pattern.base":"{:#label} "+Ad.schema_format.message}).required(),Roe=ur.string().min(1).max(Ad.schema_length.maximum).pattern($N).messages({"string.pattern.base":"{:#label} "+Ad.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();EG.exports={createSchema:yoe,createSchemaStructure:hG,createTable:boe,createTableStructure:mG,createAttribute:Coe,dropSchema:Ooe,dropTable:Noe,dropAttribute:woe,getBackup:Poe,cleanupOrphanBlobs:Doe};async function yoe(e){let t=await hG(e);return lS.signalSchemaChange(new uS(process.pid,e.operation,e.schema)),t}a(yoe,"createSchema");async function hG(e){let t=Mp(e,ur.object({database:cS,schema:cS}));if(t)throw new Ll(t.message);if(yd(e),!await Td.checkSchemaExists(e.schema))throw Bo(new Error,aS.SCHEMA_EXISTS_ERR(e.schema),Ho.BAD_REQUEST,Rd.LOG_LEVELS.ERROR,aS.SCHEMA_EXISTS_ERR(e.schema),!0);return await Wa.createSchema(e),`database '${e.schema}' successfully created`}a(hG,"createSchemaStructure");async function boe(e){return yd(e),e.hash_attribute=e.primary_key??e.hash_attribute,await mG(e)}a(boe,"createTable");async function mG(e){let t=Mp(e,ur.object({database:cS,schema:cS,table:Aoe,residence:ur.array().items(ur.string().min(1)).optional(),hash_attribute:Roe}));if(t)throw new Ll(t.message);if(!await Td.checkSchemaTableExists(e.schema,e.table))throw Bo(new Error,aS.TABLE_EXISTS_ERR(e.schema,e.table),Ho.BAD_REQUEST,Rd.LOG_LEVELS.ERROR,aS.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Eoe(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await Wa.createTable(n,e);else throw Bo(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Ho.BAD_REQUEST);else await Wa.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}a(mG,"createTableStructure");async function Ooe(e){let t=Mp(e,ur.object({database:ur.string(),schema:ur.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Ll(t.message);yd(e);let r=await Td.checkSchemaExists(e.schema);if(r)throw Bo(new Error,r,Ho.NOT_FOUND,Rd.LOG_LEVELS.ERROR,r,!0);let n=await Td.schema_describe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await Wa.dropSchema(e),lS.signalSchemaChange(new uS(process.pid,e.operation,e.schema)),await _G.purgeSchemaTableStreams(e.schema,s);let i=await pG(e);return i.message=`successfully deleted '${e.schema}'`,i}a(Ooe,"dropSchema");async function Noe(e){let t=Mp(e,ur.object({database:ur.string(),schema:ur.string(),table:ur.string().required()}));if(t)throw new Ll(t.message);yd(e);let r=await Td.checkSchemaTableExists(e.schema,e.table);if(r)throw Bo(new Error,r,Ho.NOT_FOUND,Rd.LOG_LEVELS.ERROR,r,!0);await Wa.dropTable(e),await _G.purgeTableStream(e.schema,e.table);let n=await pG(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(Noe,"dropTable");async function woe(e){let t=Mp(e,ur.object({database:ur.string(),schema:ur.string(),table:ur.string().required(),attribute:ur.string().required()}));if(t)throw new Ll(t.message);yd(e);let r=await Td.checkSchemaTableExists(e.schema,e.table);if(r)throw Bo(new Error,r,Ho.NOT_FOUND,Rd.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Bo(new Error,"You cannot drop a hash attribute",Ho.BAD_REQUEST,void 0,void 0,!0);if(Rd.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Bo(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Ho.BAD_REQUEST,void 0,void 0,!0);try{return await Wa.dropAttribute(e),Ioe(e),lS.signalSchemaChange(new uS(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw moe.error(`Got an error deleting attribute ${goe.inspect(e)}.`),n}}a(woe,"dropAttribute");function Ioe(e){let t=Object.values(global.hdb_schema[e.schema][e.table].attributes);for(let r=0;r<t.length;r++)t[r].attribute===e.attribute&&global.hdb_schema[e.schema][e.table].attributes.splice(r,1)}a(Ioe,"dropAttributeFromGlobal");async function Coe(e){yd(e);let t=Toe()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Bo(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Ho.BAD_REQUEST,void 0,void 0,!0);return await Wa.createAttribute(e),lS.signalSchemaChange(new uS(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(Coe,"createAttribute");function Poe(e){return Wa.getBackup(e)}a(Poe,"getBackup");function Doe(e){if(!e.database)throw new Ll('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new Ll(`Unknown database '${e.database}'`);let{cleanupOrphans:r}=(Rn(),C(vu));return r(databases[e.database],e.database),{message:"Orphaned blobs cleanup started, check logs for progress"}}a(Doe,"cleanupOrphanBlobs")});var SG=P((WDe,gG)=>{"use strict";var{OPERATIONS_ENUM:Loe}=(k(),C(G)),VN=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Loe.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};gG.exports=VN});var KN=P((JDe,bG)=>{"use strict";var Moe=Jn(),jDe=SG(),dS=ie(),fS=(k(),C(G)),voe=ce(),{handleHDBError:TG,hdb_errors:Uoe}=pe(),{HDB_ERROR_MSGS:AG,HTTP_STATUS_CODES:RG}=Uoe,xoe=Object.values(fS.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),yG="To use this operation audit log must be enabled in harperdb-config.yaml";bG.exports=Boe;async function Boe(e){if(dS.isEmpty(e.schema))throw new Error(AG.SCHEMA_REQUIRED_ERR);if(dS.isEmpty(e.table))throw new Error(AG.TABLE_REQUIRED_ERR);if(!voe.get(fS.CONFIG_PARAMS.LOGGING_AUDITLOG))throw TG(new Error,yG,RG.BAD_REQUEST,fS.LOG_LEVELS.ERROR,yG,!0);let t=dS.checkSchemaTableExist(e.schema,e.table);if(t)throw TG(new Error,t,RG.NOT_FOUND,fS.LOG_LEVELS.ERROR,t,!0);if(!dS.isEmpty(e.search_type)&&xoe.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await Moe.readAuditLog(e)}a(Boe,"readAuditLog")});var NG=P((XDe,OG)=>{"use strict";var{OPERATIONS_ENUM:Hoe}=(k(),C(G)),YN=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Hoe.GET_BACKUP,this.schema=t,this.table=r}};OG.exports=YN});var CG=P((rLe,IG)=>{"use strict";var koe=Jn(),eLe=NG(),WN=ie(),Foe=(k(),C(G)),tLe=ce(),{handleHDBError:Goe,hdb_errors:qoe}=pe(),{HDB_ERROR_MSGS:wG,HTTP_STATUS_CODES:$oe}=qoe;IG.exports=Voe;async function Voe(e){if(WN.isEmpty(e.schema))throw new Error(wG.SCHEMA_REQUIRED_ERR);if(WN.isEmpty(e.table))throw new Error(wG.TABLE_REQUIRED_ERR);let t=WN.checkSchemaTableExist(e.schema,e.table);if(t)throw Goe(new Error,t,$oe.NOT_FOUND,Foe.LOG_LEVELS.ERROR,t,!0);return await koe.getBackup(read_audit_log_object)}a(Voe,"getBackup")});var MG=P((sLe,LG)=>{"use strict";var Koe=ce(),za=require("joi"),Yoe=ct(),PG=require("moment"),Woe=require("fs-extra"),zN=require("path"),zoe=require("lodash"),Up=(k(),C(G)),{LOG_LEVELS:Ml}=(k(),C(G)),joe="YYYY-MM-DD hh:mm:ss",Joe=zN.resolve(__dirname,"../logs");LG.exports=function(e){return Yoe.validateBySchema(e,Qoe)};var Qoe=za.object({from:za.custom(DG),until:za.custom(DG),level:za.valid(Ml.NOTIFY,Ml.FATAL,Ml.ERROR,Ml.WARN,Ml.INFO,Ml.DEBUG,Ml.TRACE),order:za.valid("asc","desc"),limit:za.number().min(1),start:za.number().min(0),log_name:za.custom(Xoe)});function DG(e,t){if(PG(e,PG.ISO_8601).format(joe)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(DG,"validateDatetime");function Xoe(e,t){if(zoe.invert(Up.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Koe.get(Up.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?Up.LOG_NAMES.HDB:e,i=s===Up.LOG_NAMES.INSTALL?zN.join(Joe,Up.LOG_NAMES.INSTALL):zN.join(n,s);return Woe.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(Xoe,"validateReadLogPath")});var JN=P((oLe,UG)=>{"use strict";var _S=(k(),C(G)),Zoe=J(),eae=ce(),tae=MG(),jN=require("path"),vG=require("fs-extra"),{once:rae}=require("events"),{handleHDBError:nae,hdb_errors:sae}=pe(),{PACKAGE_ROOT:iae}=at(),oae=jN.join(iae,"logs"),aae=1e3,cae=200;UG.exports=lae;async function lae(e){let t=tae(e);if(t)throw nae(t,t.message,sae.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=eae.get(_S.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?_S.LOG_NAMES.HDB:e.log_name,s=n===_S.LOG_NAMES.INSTALL?jN.join(oae,_S.LOG_NAMES.INSTALL):jN.join(r,n),i=e.level!==void 0,o=i?e.level:void 0,c=e.from!==void 0,l=c?new Date(e.from):void 0,u=e.until!==void 0,f=u?new Date(e.until):void 0,d=e.limit===void 0?aae:e.limit,_=e.order===void 0?void 0:e.order,p=e.start===void 0?0:e.start,h=p+d,S=0;_==="desc"&&!l&&!f&&(S=Math.max(vG.statSync(s).size-(h+5)*cae,0));let g=vG.createReadStream(s,{start:S});g.on("error",H=>{Zoe.error(H)});let R=0,E=[],T="",N;g.on("data",H=>{let Z=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;H=T+H;let W=0,$;for(;($=Z.exec(H))&&!g.destroyed;){N&&(N.message=H.slice(W,$.index),M(N));let[se,z,fe]=$,ue=fe.split("] ["),ee=ue[0],Ae=ue[1];ue.splice(0,2),N={timestamp:z,thread:ee,level:Ae,tags:ue,message:""},W=$.index+se.length}T=H.slice(W)}),g.on("end",H=>{g.destroyed||N&&(N.message=T.trim(),M(N))}),g.resume();function M(H){let Z,W,$;switch(!0){case(i&&c&&u):Z=new Date(H.timestamp),W=new Date(l),$=new Date(f),H.level===o&&Z>=W&&Z<=$&&R<p?R++:H.level===o&&Z>=W&&Z<=$&&(ja(H,_,E),R++,R===h&&g.destroy());break;case(i&&c):Z=new Date(H.timestamp),W=new Date(l),H.level===o&&Z>=W&&R<p?R++:H.level===o&&Z>=W&&(ja(H,_,E),R++,R===h&&g.destroy());break;case(i&&u):Z=new Date(H.timestamp),$=new Date(f),H.level===o&&Z<=$&&R<p?R++:H.level===o&&Z<=$&&(ja(H,_,E),R++,R===h&&g.destroy());break;case(c&&u):Z=new Date(H.timestamp),W=new Date(l),$=new Date(f),Z>=W&&Z<=$&&R<p?R++:Z>=W&&Z<=$&&(ja(H,_,E),R++,R===h&&g.destroy());break;case i:H.level===o&&R<p?R++:H.level===o&&(ja(H,_,E),R++,R===h&&g.destroy());break;case c:Z=new Date(H.timestamp),W=new Date(l),Z>=W&&R<p?R++:Z>=W&&R>=p&&(ja(H,_,E),R++,R===h&&g.destroy());break;case u:Z=new Date(H.timestamp),$=new Date(f),Z<=$&&R<p?R++:Z<=$&&R>=p&&(ja(H,_,E),R++,R===h&&g.destroy());break;default:R<p?R++:(ja(H,_,E),R++,R===h&&g.destroy())}}return a(M,"onLogMessage"),await rae(g,"close"),E}a(lae,"readLog");function ja(e,t,r){t==="desc"?uae(e,r):t==="asc"?dae(e,r):r.push(e)}a(ja,"pushLineToResult");function uae(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)>r?n=i+1:s=i}t.splice(n,0,e)}a(uae,"insertDescending");function dae(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)<r?n=i+1:s=i}t.splice(n,0,e)}a(dae,"insertAscending")});var pS=P((fLe,kG)=>{"use strict";var QN=require("joi"),{string:bd,boolean:xG,date:fae}=QN.types(),_ae=ct(),{validateSchemaExists:cLe,validateTableExists:lLe,validateSchemaName:uLe}=Bi(),pae=(k(),C(G)),hae=Rt(),BG=ce();BG.initSync();var dLe=bd.invalid(BG.get(pae.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(hae.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),HG={operation:bd.valid("add_node","update_node","set_node_replication"),node_name:bd.optional(),subscriptions:QN.array().items({table:bd.optional(),schema:bd.optional(),database:bd.optional(),subscribe:xG.required(),publish:xG.required().custom(Eae),start_time:fae.iso()})};function mae(e){return _ae.validateBySchema(e,QN.object(HG))}a(mae,"addUpdateNodeValidator");function Eae(e,t){if(t.state.ancestors[2].operation==="add_node"&&e===!1&&t.state.ancestors[0].subscribe===!1)return t.message(`'subscriptions[${t.state.path[1]}]' subscribe and/or publish must be set to true when adding a node`)}a(Eae,"checkForFalsy");kG.exports={addUpdateNodeValidator:mae,validation_schema:HG}});var Od=P((pLe,FG)=>{"use strict";var XN=class{static{a(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},ZN=class{static{a(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};FG.exports={Node:XN,NodeSubscription:ZN}});var qG=P((mLe,GG)=>{"use strict";var gae=(k(),C(G)).OPERATIONS_ENUM,ew=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=gae.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};GG.exports=ew});var xp=P((gLe,$G)=>{"use strict";var tw=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},rw=class{static{a(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,o,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=o,c!==void 0&&(this.attributes=c)}};$G.exports={RemotePayloadObject:tw,RemotePayloadSubscription:rw}});var KG=P((TLe,VG)=>{"use strict";var nw=class{static{a(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,o=0){this.schema=t,this.table=r,this.table_size=n,this.record_count=s,this.transaction_log_size=i,this.transaction_log_record_count=o}};VG.exports=nw});var WG=P((NLe,YG)=>{"use strict";var Sae=KG(),RLe=Gt(),yLe=pt(),Tae=J(),{getSchemaPath:bLe,getTransactionAuditStorePath:OLe}=gt(),{getDatabases:Aae}=(Le(),C(st));YG.exports=Rae;async function Rae(e){let t=new Sae;try{let r=Aae()[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){Tae.warn(`unable to stat table dbi due to ${r}`)}return t}a(Rae,"lmdbGetTableSize")});var jG=P((ILe,zG)=>{"use strict";var sw=class{static{a(this,"SystemInformationObject")}constructor(t,r,n,s,i,o,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=o,this.harperdb_processes=c}};zG.exports=sw});var ko=P((vLe,ZG)=>{"use strict";var yae=require("fs-extra"),bae=require("path"),rn=require("systeminformation"),Ja=J(),JG=or(),PLe=Rt(),Nd=(k(),C(G)),Oae=WG(),Nae=wo(),{getThreadInfo:QG}=nt(),Bp=ce();Bp.initSync();var wae=jG(),{openEnvironment:DLe}=pt(),{getSchemaPath:LLe}=gt(),{database:MLe,databases:iw}=(Le(),C(st)),hS;ZG.exports={getHDBProcessInfo:lw,getNetworkInfo:dw,getDiskInfo:uw,getMemoryInfo:cw,getCPUInfo:aw,getTimeInfo:ow,getSystemInformation:fw,systemInformation:Iae,getTableSize:_w,getMetrics:pw};function ow(){return rn.time()}a(ow,"getTimeInfo");async function aw(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:o,governor:c,socket:l,cache:u,...f}=await rn.cpu();f.cpu_speed=await rn.cpuCurrentSpeed();let{raw_currentload:d,raw_currentload_idle:_,raw_currentload_irq:p,raw_currentload_nice:h,raw_currentload_system:S,raw_currentload_user:g,cpus:R,...E}=await rn.currentLoad();return E.cpus=[],R.forEach(T=>{let{raw_load:N,raw_load_idle:M,raw_load_irq:H,raw_load_nice:Z,raw_load_system:W,raw_load_user:$,...se}=T;E.cpus.push(se)}),f.current_load=E,f}catch(e){return Ja.error(`error in getCPUInfo: ${e}`),{}}}a(aw,"getCPUInfo");async function cw(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await rn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return Ja.error(`error in getMemoryInfo: ${e}`),{}}}a(cw,"getMemoryInfo");async function lw(){let e={core:[],clustering:[]};try{let t=await rn.processes(),r;try{r=Number.parseInt(await yae.readFile(bae.join(Bp.get(Nd.CONFIG_PARAMS.ROOTPATH),Nd.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===Nd.NODE_ERROR_CODES.ENOENT)Ja.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 Ja.error(`error in getHDBProcessInfo: ${t}`),e}}a(lw,"getHDBProcessInfo");async function uw(){let e={};try{if(!Bp.get(Nd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await rn.disksIO();e.io=i;let{rx_sec:o,tx_sec:c,wx_sec:l,...u}=await rn.fsStats();return e.read_write=u,e.size=await rn.fsSize(),e}catch(t){return Ja.error(`error in getDiskInfo: ${t}`),e}}a(uw,"getDiskInfo");async function dw(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Bp.get(Nd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await rn.networkInterfaceDefault(),e.latency=await rn.inetChecksite("google.com"),(await rn.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:o,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:f,carrier_changes:d,..._}=n;e.interfaces.push(_)}),(await rn.networkStats()).forEach(n=>{let{rx_sec:s,tx_sec:i,ms:o,...c}=n;e.stats.push(c)})),e}catch(t){return Ja.error(`error in getNetworkInfo: ${t}`),e}}a(dw,"getNetworkInfo");async function fw(){if(hS!==void 0)return hS;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:o,...c}=await rn.osInfo();e=c;let l=await rn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,hS=e,hS}catch(t){return Ja.error(`error in getSystemInformation: ${t}`),e}}a(fw,"getSystemInformation");async function _w(){let e=[],t=await Nae.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await Oae(n));return e}a(_w,"getTableSize");async function pw(){let e={};for(let t in iw){let r=e[t]={},n=r.tables={};for(let s in iw[t])try{let i=iw[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,f,d]=l.trim().split(" ");return{pid:u,thread:f,txnid:d}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:_}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:_}}let o=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=o[l];n[s]=c}catch(i){Ja.notify(`Error getting stats for table ${s}: ${i}`)}}return e}a(pw,"getMetrics");async function XG(){if(Bp.get(Nd.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await JG.getNATSReferences(),t=await JG.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let o={stream_name:n.config.name,database:n.config.subjects[0].split(".")[1],table:n.config.subjects[0].split(".")[2],state:n.state,consumers:s};r.push(o)}return r}}a(XG,"getNatsStreamInfo");async function Iae(e){let t=new wae;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await fw(),t.time=ow(),t.cpu=await aw(),t.memory=await cw(),t.disk=await uw(),t.network=await dw(),t.harperdb_processes=await lw(),t.table_size=await _w(),t.metrics=await pw(),t.threads=await QG(),t.replication=await XG(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await fw();break;case"time":t.time=ow();break;case"cpu":t.cpu=await aw();break;case"memory":t.memory=await cw();break;case"disk":t.disk=await uw();break;case"network":t.network=await dw();break;case"harperdb_processes":t.harperdb_processes=await lw();break;case"table_size":t.table_size=await _w();break;case"database_metrics":case"metrics":t.metrics=await pw();break;case"threads":t.threads=await QG();break;case"replication":t.replication=await XG();break;default:break}return t}a(Iae,"systemInformation")});var Fo=P((kLe,nq)=>{"use strict";var Cae=In(),hw=ie(),Pae=require("util"),vl=(k(),C(G)),eq=ce();eq.initSync();var Dae=jO(),tq=Jr(),{Node:xLe,NodeSubscription:BLe}=Od(),Lae=ju(),Mae=qG(),{RemotePayloadObject:vae,RemotePayloadSubscription:Uae}=xp(),{handleHDBError:xae,hdb_errors:Bae}=pe(),{HTTP_STATUS_CODES:Hae,HDB_ERROR_MSGS:kae}=Bae,Fae=ai(),Gae=ko(),{packageJson:qae}=at(),{getDatabases:$ae}=(Le(),C(st)),HLe=Pae.promisify(Dae.authorize),Vae=tq.searchByHash,Kae=tq.searchByValue;nq.exports={isEmpty:Yae,getNodeRecord:Wae,upsertNodeRecord:zae,buildNodePayloads:jae,checkClusteringEnabled:Jae,getAllNodeRecords:Qae,getSystemInfo:Xae,reverseSubscription:rq};function Yae(e){return e==null}a(Yae,"isEmpty");async function Wae(e){let t=new Lae(vl.SYSTEM_SCHEMA_NAME,vl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Vae(t)}a(Wae,"getNodeRecord");async function zae(e){let t=new Mae(vl.SYSTEM_SCHEMA_NAME,vl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Cae.upsert(t)}a(zae,"upsertNodeRecord");function rq(e){if(hw.isEmpty(e.subscribe)||hw.isEmpty(e.publish))throw new Error("Received invalid subscription object");let{schema:t,table:r,hash_attribute:n}=e,s={schema:t,table:r,hash_attribute:n};return e.subscribe===!0&&e.publish===!1?(s.subscribe=!1,s.publish=!0):e.subscribe===!1&&e.publish===!0?(s.subscribe=!0,s.publish=!1):(s.subscribe=e.subscribe,s.publish=e.publish),s}a(rq,"reverseSubscription");function jae(e,t,r,n){let s=[];for(let i=0,o=e.length;i<o;i++){let c=e[i],{schema:l,table:u}=c,f=hw.getTableHashAttribute(l,u),{subscribe:d,publish:_}=rq(c),p=$ae()[l]?.[u],h=new Uae(l,u,f,_,d,c.start_time,p.schemaDefined?p.attributes:void 0);s.push(h)}return new vae(r,t,s,n)}a(jae,"buildNodePayloads");function Jae(){if(!eq.get(vl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw xae(new Error,kae.CLUSTERING_NOT_ENABLED,Hae.BAD_REQUEST,void 0,void 0,!0)}a(Jae,"checkClusteringEnabled");async function Qae(){let e=new Fae(vl.SYSTEM_SCHEMA_NAME,vl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await Kae(e))}a(Qae,"getAllNodeRecords");async function Xae(){let e=await Gae.getSystemInformation();return{hdb_version:qae.version,node_version:e.node_version,platform:e.platform}}a(Xae,"getSystemInfo")});var mw=P((GLe,dq)=>{"use strict";var mS=or(),sq=ie(),iq=Rt(),oq=(k(),C(G)),ES=J(),aq=vp(),Zae=z_(),{RemotePayloadObject:ece}=xp(),{handleHDBError:cq,hdb_errors:tce}=pe(),{HTTP_STATUS_CODES:lq}=tce,{NodeSubscription:uq}=Od();dq.exports=rce;async function rce(e,t){let r;try{r=await mS.request(`${t}.${iq.REQUEST_SUFFIX}`,new ece(oq.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),ES.trace("Response from remote describe all request:",r)}catch(o){ES.error(`addNode received error from describe all request to remote node: ${o}`);let c=mS.requestErrorHandler(o,"add_node",t);throw cq(new Error,c,lq.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===iq.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw cq(new Error,o,lq.INTERNAL_SERVER_ERROR,"error",o)}let n=r.message,s=[],i=[];for(let o of e){let{table:c}=o,l=o.database??o.schema??"data";if(l===oq.SYSTEM_SCHEMA_NAME){await mS.createLocalTableStream(l,c);let h=new uq(l,c,o.publish,o.subscribe);h.start_time=o.start_time,i.push(h);continue}let u=sq.doesSchemaExist(l),f=n[l]!==void 0,d=c?sq.doesTableExist(l,c):!0,_=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!f||!d&&!_){s.push(o);continue}if(!u&&f&&(ES.trace(`addNode creating schema: ${l}`),await aq.createSchema({operation:"create_schema",schema:l})),!d&&_){ES.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let h=new Zae(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(h.attributes=n[l][c].attributes),await aq.createTable(h)}await mS.createLocalTableStream(l,c);let p=new uq(l,c,o.publish,o.subscribe);p.start_time=o.start_time,i.push(p)}return{added:i,skipped:s}}a(rce,"reviewSubscriptions")});var Ul={};xe(Ul,{addNodeBack:()=>ace,removeNodeBack:()=>cce,setNode:()=>oce});async function oce(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=di(t)):t=oS(r);let n=(0,_q.validateBySchema)(e,ice);if(n)throw(0,Go.handleHDBError)(n,n.message,sce.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new Go.ClientError("url or hostname is required for remove_node operation");let p=r,h=ar(),S=await h.get(p);if(!S)throw new Go.ClientError(p+" does not exist");try{await Lp({url:S.url},{operation:zt.REMOVE_NODE_BACK,name:S?.subscriptions?.length>0?et():p},void 0)}catch(g){as.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 Go.ClientError("url required for this operation");let s=Fa();if(s==null)throw new Go.ClientError("replication url is missing from harperdb-config.yaml");let i,o,c;if(t?.startsWith("wss:")){i=await(0,Ds.getReplicationCert)();let p=await(0,Ds.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed||e.force_signing?(o=await(0,Ds.createCsr)(),as.info("Sending CSR to target node:",t)):p&&(c=p.certificate,as.info("Sending CA named",p.name,"to target node",t))}let l={operation:zt.ADD_NODE_BACK,hostname:(0,Xa.get)(x.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:o,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,Xa.get)(x.REPLICATION_SHARD)!==void 0&&(l.shard=(0,Xa.get)(x.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(fq):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let p=fq(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,f;try{u=await Lp({url:t},l,e)}catch(p){p.message=`Error returned from ${t}: `+p.message,as.warn("Error adding node:",t,"to cluster:",p),f=p}if(o&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw f?(f.message+=" and connection was required to sign certificate",f):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);o&&(as.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ds.setCertTable)({name:nce.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ds.setCertTable)({name:et()+"-replication",uses:["replication"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let d={url:t,ca:u?.usingCA};if(e.hostname&&(d.name=e.hostname),e.subscriptions?d.subscriptions=e.subscriptions:d.replicates=!0,e.start_time&&(d.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(d.authorization=e.authorization),e.revoked_certificates&&(d.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?d.shard=u.shard:e.shard!==void 0&&(d.shard=e.shard),d.replicates){let p={url:s,ca:c,replicates:!0,subscriptions:null};(0,Xa.get)(x.REPLICATION_SHARD)!==void 0&&(p.shard=(0,Xa.get)(x.REPLICATION_SHARD)),e.retain_authorization&&(p.authorization=e.authorization),e.start_time&&(p.start_time=e.start_time),await Mo(et(),p)}await Mo(u?u.nodeName:d.name??di(t),d);let _;return e.operation==="update_node"?_=`Successfully updated '${t}'`:_=`Successfully added '${t}' to cluster`,f&&(_+=" but there was an error updating target node: "+f.message),_}async function ace(e){as.trace("addNodeBack received request:",e);let t=await(0,Ds.signCertificate)(e),r;e.csr?(r=t.signingCA,as.info("addNodeBack received CSR from node:",e.url,"this node will use and respond with CA that was used to issue CSR")):(r=e?.cert_auth,as.info("addNodeBack received CA from node:",e.url));let n={url:e.url,ca:r};e.subscriptions?n.subscriptions=e.subscriptions:(n.replicates=!0,n.subscriptions=null),e.start_time&&(n.start_time=e.start_time),e.authorization&&(n.authorization=e.authorization),e.shard!==void 0&&(n.shard=e.shard);let s=await(0,Ds.getReplicationCertAuth)();if(n.replicates){let i={url:Fa(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,Xa.get)(x.REPLICATION_SHARD)!==void 0&&(i.shard=(0,Xa.get)(x.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Mo(et(),i)}return await Mo(e.hostname,n),t.nodeName=et(),t.usingCA=s?.certificate,as.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function cce(e){as.trace("removeNodeBack received request:",e),await ar().delete(e.name)}function fq(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ds,_q,Qa,Xa,as,Go,nce,sce,ice,xl=Re(()=>{Ds=v(os()),_q=v(ct()),Qa=v(require("joi")),Xa=v(ce());k();Np();Ol();ss();as=v(J()),Go=v(pe()),{pki:nce}=require("node-forge"),{HTTP_STATUS_CODES:sce}=Go.hdb_errors,ice=Qa.default.object({hostname:Qa.default.string(),verify_tls:Qa.default.boolean(),replicates:Qa.default.boolean(),subscriptions:Qa.default.array(),revoked_certificates:Qa.default.array(),shard:Qa.default.number()});a(oce,"setNode");a(ace,"addNodeBack");a(cce,"removeNodeBack");a(fq,"reverseSubscription")});var wd=P((JLe,hq)=>{"use strict";var{handleHDBError:gS,hdb_errors:lce}=pe(),{HTTP_STATUS_CODES:SS}=lce,{addUpdateNodeValidator:uce}=pS(),TS=J(),AS=(k(),C(G)),pq=Rt(),dce=ie(),Hp=or(),kp=Fo(),Ew=ce(),fce=mw(),{Node:_ce,NodeSubscription:pce}=Od(),{broadcast:hce}=nt(),{setNode:mce}=(xl(),C(Ul)),zLe=ce(),jLe=(k(),C(G)),Ece="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",gce="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Sce=Ew.get(AS.CONFIG_PARAMS.CLUSTERING_NODENAME);hq.exports=Tce;async function Tce(e,t=!1){if(TS.trace("addNode called with:",e),Ew.get(AS.CONFIG_PARAMS.REPLICATION_URL)||Ew.get(AS.CONFIG_PARAMS.REPLICATION_HOSTNAME))return mce(e);kp.checkClusteringEnabled();let r=uce(e);if(r)throw gS(r,r.message,SS.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let d=await kp.getNodeRecord(n);if(!dce.isEmptyOrZeroLength(d))throw gS(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,SS.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await fce(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=Ece,o;let c=kp.buildNodePayloads(s,Sce,AS.OPERATIONS_ENUM.ADD_NODE,await kp.getSystemInfo()),l=[];for(let d=0,_=s.length;d<_;d++){let p=s[d];s[d].start_time===void 0&&delete s[d].start_time,l.push(new pce(p.schema,p.table,p.publish,p.subscribe))}TS.trace("addNode sending remote payload:",c);let u;try{u=await Hp.request(`${n}.${pq.REQUEST_SUFFIX}`,c)}catch(d){TS.error(`addNode received error from request: ${d}`);for(let p=0,h=s.length;p<h;p++){let S=s[p];S.publish=!1,S.subscribe=!1,await Hp.updateRemoteConsumer(S,n)}let _=Hp.requestErrorHandler(d,"add_node",n);throw gS(new Error,_,SS.INTERNAL_SERVER_ERROR,"error",_)}if(u.status===pq.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${n}: ${u.message}`;throw gS(new Error,d,SS.INTERNAL_SERVER_ERROR,"error",d)}TS.trace(u);for(let d=0,_=s.length;d<_;d++){let p=s[d];await Hp.updateRemoteConsumer(p,n),p.subscribe===!0&&await Hp.updateConsumerIterator(p.schema,p.table,n,"start")}let f=new _ce(n,l,u.system_info);return await kp.upsertNodeRecord(f),hce({type:"nats_update"}),i.length>0?o.message=gce:o.message=`Successfully added '${n}' to manifest`,o}a(Tce,"addNode")});var Aw=P((ZLe,Eq)=>{"use strict";var{handleHDBError:gw,hdb_errors:Ace}=pe(),{HTTP_STATUS_CODES:Sw}=Ace,{addUpdateNodeValidator:Rce}=pS(),Fp=J(),RS=(k(),C(G)),mq=Rt(),XLe=ie(),Gp=or(),qp=Fo(),Tw=ce(),{cloneDeep:yce}=require("lodash"),bce=mw(),{Node:Oce,NodeSubscription:Nce}=Od(),{broadcast:wce}=nt(),{setNode:Ice}=(xl(),C(Ul)),Cce="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",Pce="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Dce=Tw.get(RS.CONFIG_PARAMS.CLUSTERING_NODENAME);Eq.exports=Lce;async function Lce(e){if(Fp.trace("updateNode called with:",e),Tw.get(RS.CONFIG_PARAMS.REPLICATION_URL)??Tw.get(RS.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Ice(e);qp.checkClusteringEnabled();let t=Rce(e);if(t)throw gw(t,t.message,Sw.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await qp.getNodeRecord(r);s.length>0&&(n=yce(s));let{added:i,skipped:o}=await bce(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=Cce,c;let l=qp.buildNodePayloads(i,Dce,RS.OPERATIONS_ENUM.UPDATE_NODE,await qp.getSystemInfo());for(let f=0,d=i.length;f<d;f++){let _=i[f];Fp.trace(`updateNode updating work stream for node: ${r} subscription:`,_),i[f].start_time===void 0&&delete i[f].start_time}Fp.trace("updateNode sending remote payload:",l);let u;try{u=await Gp.request(`${r}.${mq.REQUEST_SUFFIX}`,l)}catch(f){Fp.error(`updateNode received error from request: ${f}`);let d=Gp.requestErrorHandler(f,"update_node",r);throw gw(new Error,d,Sw.INTERNAL_SERVER_ERROR,"error",d)}if(u.status===mq.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${r}: ${u.message}`;throw gw(new Error,f,Sw.INTERNAL_SERVER_ERROR,"error",f)}Fp.trace(u);for(let f=0,d=i.length;f<d;f++){let _=i[f];await Gp.updateRemoteConsumer(_,r),_.subscribe===!0?await Gp.updateConsumerIterator(_.schema,_.table,r,"start"):await Gp.updateConsumerIterator(_.schema,_.table,r,"stop")}return n||(n=[new Oce(r,[],u.system_info)]),await Mce(n[0],i,u.system_info),o.length>0?c.message=Pce:c.message=`Successfully updated '${r}'`,c}a(Lce,"updateNode");async function Mce(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let o=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let f=n.subscriptions[l];if(f.schema===o.schema&&f.table===o.table){f.publish=o.publish,f.subscribe=o.subscribe,c=!0;break}}c||n.subscriptions.push(new Nce(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await qp.upsertNodeRecord(n),wce({type:"nats_update"})}a(Mce,"updateNodeTable")});var Rq=P((tMe,Aq)=>{"use strict";var Tq=require("joi"),{string:gq}=Tq.types(),vce=ct(),Sq=(k(),C(G)),Uce=ce(),xce=Rt();Aq.exports=Bce;function Bce(e){let t=gq.invalid(Uce.get(Sq.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(xce.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=Tq.object({operation:gq.valid(Sq.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return vce.validateBySchema(e,r)}a(Bce,"removeNodeValidator")});var yS=P((nMe,wq)=>{"use strict";var{handleHDBError:yq,hdb_errors:Hce}=pe(),{HTTP_STATUS_CODES:bq}=Hce,kce=Rq(),$p=J(),Oq=Fo(),Fce=ie(),Id=(k(),C(G)),Nq=Rt(),Rw=or(),yw=ce(),{RemotePayloadObject:Gce}=xp(),{NodeSubscription:qce}=Od(),$ce=W_(),Vce=al(),{broadcast:Kce}=nt(),{setNode:Yce}=(xl(),C(Ul)),Wce=yw.get(Id.CONFIG_PARAMS.CLUSTERING_NODENAME);wq.exports=zce;async function zce(e){if($p.trace("removeNode called with:",e),yw.get(Id.CONFIG_PARAMS.REPLICATION_URL)??yw.get(Id.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Yce(e);Oq.checkClusteringEnabled();let t=kce(e);if(t)throw yq(t,t.message,bq.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await Oq.getNodeRecord(r);if(Fce.isEmptyOrZeroLength(n))throw yq(new Error,`Node '${r}' was not found.`,bq.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new Gce(Id.OPERATIONS_ENUM.REMOVE_NODE,Wce,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let f=n.subscriptions[l];f.subscribe===!0&&await Rw.updateConsumerIterator(f.schema,f.table,r,"stop");try{await Rw.updateRemoteConsumer(new qce(f.schema,f.table,!1,!1),r)}catch(d){$p.error(d)}}try{i=await Rw.request(`${r}.${Nq.REQUEST_SUFFIX}`,s),$p.trace("Remove node reply from remote node:",r,i)}catch(l){$p.error("removeNode received error from request:",l),o=!0}let c=new $ce(Id.SYSTEM_SCHEMA_NAME,Id.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await Vce.deleteRecord(c),Kce({type:"nats_update"}),i?.status===Nq.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?($p.error("Error returned from remote node:",r,i?.message),`Successfully removed '${r}' from local manifest, however there was an error reaching remote node. Check the logs for more details.`):`Successfully removed '${r}' from manifest`}a(zce,"removeNode")});var Pq=P((iMe,Cq)=>{"use strict";var Iq=require("joi"),{string:jce,array:Jce}=Iq.types(),Qce=ct(),Xce=pS();Cq.exports=Zce;function Zce(e){let t=Iq.object({operation:jce.valid("configure_cluster").required(),connections:Jce.items(Xce.validation_schema).required()});return Qce.validateBySchema(e,t)}a(Zce,"configureClusterValidator")});var bw=P((aMe,Uq)=>{"use strict";var Dq=(k(),C(G)),bS=J(),ele=ie(),tle=ce(),rle=yS(),nle=wd(),sle=Fo(),ile=Pq(),{handleHDBError:Lq,hdb_errors:ole}=pe(),{HTTP_STATUS_CODES:Mq}=ole,ale="Configure cluster complete.",cle="Failed to configure the cluster. Check the logs for more details.",lle="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";Uq.exports=ule;async function ule(e){bS.trace("configure cluster called with:",e);let t=ile(e);if(t)throw Lq(t,t.message,Mq.BAD_REQUEST,void 0,void 0,!0);let r=await sle.getAllNodeRecords(),n=[];if(tle.get(Dq.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let f=0,d=r.length;f<d;f++){let _=await vq(rle,{operation:Dq.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[f].name},r[f].name);n.push(_)}bS.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let f=0;f<i;f++){let d=e.connections[f],_=await vq(nle,d,d.node_name);s.push(_)}bS.trace("All results from configure_cluster add node:",s);let o=[],c=[],l=!1,u=n.concat(s);for(let f=0,d=u.length;f<d;f++){let _=u[f];_.status==="rejected"&&(bS.error(_.node_name,_?.error?.message,_?.error?.stack),o.includes(_.node_name)||o.push(_.node_name)),(_?.result?.message?.includes?.("Successfully")||_?.result?.includes?.("Successfully"))&&(l=!0),!(typeof _.result=="string"&&_.result.includes("Successfully removed")||_.status==="rejected")&&c.push({node_name:_?.node_name,response:_?.result})}if(ele.isEmptyOrZeroLength(o))return{message:ale,connections:c};if(l)return{message:lle,failed_nodes:o,connections:c};throw Lq(new Error,cle,Mq.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(ule,"configureCluster");async function vq(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(vq,"functionWrapper")});var kq=P((lMe,Hq)=>{"use strict";var Vp=require("joi"),dle=ct(),{validateSchemaExists:xq,validateTableExists:fle,validateSchemaName:Bq}=Bi(),_le=Vp.object({operation:Vp.string().valid("purge_stream"),schema:Vp.string().custom(xq).custom(Bq).optional(),database:Vp.string().custom(xq).custom(Bq).optional(),table:Vp.string().custom(fle).required()});function ple(e){return dle.validateBySchema(e,_le)}a(ple,"purgeStreamValidator");Hq.exports=ple});var Ow=P((dMe,Fq)=>{"use strict";var{handleHDBError:hle,hdb_errors:mle}=pe(),{HTTP_STATUS_CODES:Ele}=mle,gle=kq(),Sle=or(),Tle=Fo();Fq.exports=Ale;async function Ale(e){e.schema=e.schema??e.database;let t=gle(e);if(t)throw hle(t,t.message,Ele.BAD_REQUEST,void 0,void 0,!0);Tle.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Sle.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(Ale,"purgeStream")});var wS=P((_Me,Wq)=>{"use strict";var ww=Fo(),Rle=or(),NS=ce(),Cd=(k(),C(G)),Bl=Rt(),yle=ie(),Nw=J(),{RemotePayloadObject:ble}=xp(),{ErrorCode:Gq}=require("nats"),{parentPort:qq}=require("worker_threads"),{onMessageByType:Ole}=nt(),{getThisNodeName:Nle}=(ss(),C(Uo)),{requestClusterStatus:wle}=(Np(),C(fF)),{getReplicationSharedStatus:Ile,getHDBNodeTable:Cle}=(Ol(),C(EN)),{CONFIRMATION_STATUS_POSITION:Ple,RECEIVED_VERSION_POSITION:Dle,RECEIVED_TIME_POSITION:Lle,SENDING_TIME_POSITION:Mle,RECEIVING_STATUS_POSITION:vle,RECEIVING_STATUS_RECEIVING:Ule}=(FN(),C(tG)),$q=NS.get(Cd.CONFIG_PARAMS.CLUSTERING_ENABLED),Vq=NS.get(Cd.CONFIG_PARAMS.CLUSTERING_NODENAME);Wq.exports={clusterStatus:xle,buildNodeStatus:Yq};var Kq;Ole("cluster-status",async e=>{Kq(e)});async function xle(){if(NS.get(Cd.CONFIG_PARAMS.REPLICATION_URL)||NS.get(Cd.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(qq){qq.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{Kq=i});for(let i of n.connections){let o=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let d of Object.values(databases[l]||{}))if(u=d.auditStore,u)break;if(!u)continue;let f=Ile(u,l,o);c.lastCommitConfirmed=OS(f[Ple]),c.lastReceivedRemoteTime=OS(f[Dle]),c.lastReceivedLocalTime=OS(f[Lle]),c.sendingMessage=OS(f[Mle]),c.lastReceivedStatus=f[vle]===Ule?"Receiving":"Waiting"}}}else n=wle();n.node_name=Nle();let s=Cle().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:Vq,is_enabled:$q,connections:[]};if(!$q)return e;let t=await ww.getAllNodeRecords();if(yle.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(Yq(t[n],e.connections));return await Promise.allSettled(r),e}a(xle,"clusterStatus");function OS(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}a(OS,"asDate");async function Yq(e,t){let r=e.name,n=new ble(Cd.OPERATIONS_ENUM.CLUSTER_STATUS,Vq,void 0,await ww.getSystemInfo()),s,i,o=Bl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Rle.request(Bl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Bl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=Bl.CLUSTER_STATUS_STATUSES.CLOSED,Nw.error(`Error getting node status from ${r} `,s))}catch(l){Nw.warn(`Error getting node status from ${r}`,l),l.code===Gq.NoResponders?o=Bl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===Gq.Timeout?o=Bl.CLUSTER_STATUS_STATUSES.TIMEOUT:o=Bl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Ble(r,o,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==Cd.PRE_4_0_0_VERSION&&await ww.upsertNodeRecord(l)}catch(l){Nw.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(Yq,"buildNodeStatus");function Ble(e,t,r,n,s,i,o,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=o,this.system_info=c}a(Ble,"NodeStatusObject")});var CS=P((hMe,zq)=>{"use strict";var{handleHDBError:Hle,hdb_errors:kle}=pe(),{HTTP_STATUS_CODES:Fle}=kle,Gle=or(),qle=Fo(),Iw=ie(),IS=require("joi"),$le=ct(),Vle=2e3,Kle=IS.object({timeout:IS.number().min(1),connected_nodes:IS.boolean(),routes:IS.boolean()});zq.exports=Yle;async function Yle(e){qle.checkClusteringEnabled();let t=$le.validateBySchema(e,Kle);if(t)throw Hle(t,t.message,Fle.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||Iw.autoCastBoolean(n),o=s===void 0||Iw.autoCastBoolean(s),c={nodes:[]},l=await Gle.getServerList(r??Vle),u={};if(i)for(let f=0,d=l.length;f<d;f++){let _=l[f].statsz;_&&(u[l[f].server.name]=_.routes)}for(let f=0,d=l.length;f<d;f++){if(l[f].statsz)continue;let _=l[f].server,p=l[f].data;if(_.name.endsWith("-hub")){let h={name:_.name.slice(0,-4),response_time:l[f].response_time};i&&(h.connected_nodes=[],u[_.name]&&u[_.name].forEach(S=>{h.connected_nodes.includes(S.name.slice(0,-4))||h.connected_nodes.push(S.name.slice(0,-4))})),o&&(h.routes=p.cluster?.urls?p.cluster?.urls.map(S=>({host:S.split(":")[0],port:Iw.autoCast(S.split(":")[1])})):[]),c.nodes.push(h)}}return c}a(Yle,"clusterNetwork")});var Xq=P((EMe,Qq)=>{"use strict";var Cw=require("joi"),jq=ct(),{route_constraints:Jq}=fb();Qq.exports={setRoutesValidator:Wle,deleteRoutesValidator:zle};function Wle(e){let t=Cw.object({server:Cw.valid("hub","leaf"),routes:Jq.required()});return jq.validateBySchema(e,t)}a(Wle,"setRoutesValidator");function zle(e){let t=Cw.object({routes:Jq.required()});return jq.validateBySchema(e,t)}a(zle,"deleteRoutesValidator")});var PS=P((SMe,i$)=>{"use strict";var qo=bt(),Pw=ie(),Ls=(k(),C(G)),Pd=ce(),Zq=Xq(),{handleHDBError:e$,hdb_errors:jle}=pe(),{HTTP_STATUS_CODES:t$}=jle,r$="cluster routes successfully set",n$="cluster routes successfully deleted";i$.exports={setRoutes:Qle,getRoutes:Xle,deleteRoutes:Zle};function Jle(e){let t=qo.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let o=0,c=e.routes.length;o<c;o++){let l=e.routes[o];l.port=Pw.autoCast(l.port);let u=r.some(d=>d.host===l.host&&d.port===l.port),f=n.some(d=>d.host===l.host&&d.port===l.port);u||f?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?qo.updateConfigValue(Ls.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):qo.updateConfigValue(Ls.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:r$,set:i,skipped:s}}a(Jle,"setRoutesNats");function Qle(e){let t=Zq.setRoutesValidator(e);if(t)throw e$(t,t.message,t$.BAD_REQUEST,void 0,void 0,!0);if(Pd.get(Ls.CONFIG_PARAMS.CLUSTERING_ENABLED))return Jle(e);let r=[],n=[],s=Pd.get(Ls.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{s$(s,i)?n.push(i):(s.push(i),r.push(i))}),qo.updateConfigValue(Ls.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:r$,set:r,skipped:n}}a(Qle,"setRoutes");function s$(e,t){return typeof t=="string"?e.includes(t):typeof t=="object"&&t!==null?e.some(r=>(r.host===t.host||r.hostname===t.hostname)&&r.port===t.port):!1}a(s$,"existsInArray");function Xle(){if(Pd.get(Ls.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=qo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Pd.get(Ls.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(Xle,"getRoutes");function Zle(e){let t=Zq.deleteRoutesValidator(e);if(t)throw e$(t,t.message,t$.BAD_REQUEST,void 0,void 0,!0);if(Pd.get(Ls.CONFIG_PARAMS.CLUSTERING_ENABLED))return eue(e);let r=[],n=[],s=Pd.get(Ls.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{s$(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),qo.updateConfigValue(Ls.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:n$,deleted:r,skipped:n}}a(Zle,"deleteRoutes");function eue(e){let t=qo.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],o=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let f=e.routes[l],d=!1;for(let _=0,p=r.length;_<p;_++){let h=r[_];if(f.host===h.host&&f.port===h.port){r.splice(_,1),d=!0,o=!0,s.push(f);break}}if(!d){let _=!0;for(let p=0,h=n.length;p<h;p++){let S=n[p];if(f.host===S.host&&f.port===S.port){n.splice(p,1),c=!0,_=!1,s.push(f);break}}_&&i.push(f)}}return o&&(r=Pw.isEmptyOrZeroLength(r)?null:r,qo.updateConfigValue(Ls.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=Pw.isEmptyOrZeroLength(n)?null:n,qo.updateConfigValue(Ls.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:n$,deleted:s,skipped:i}}a(eue,"deleteRoutesNats")});var a$=P((AMe,o$)=>{"use strict";var Kp=require("alasql"),Hl=require("recursive-iterator"),pi=J(),tue=ie(),Yp=(k(),C(G)),Dw=class{static{a(this,"sql_statement_bucket")}constructor(t){this.ast=t,this.affected_attributes=new Map,this.table_lookup=new Map,this.schema_lookup=new Map,this.table_to_schema_lookup=new Map,nue(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=>Yp.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=>!Yp.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,o=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[o]&&t[i].tables[o][Yp.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[o].attribute_permissions.length>0?c=rue(t[i].tables[o].attribute_permissions):c=global.hdb_schema[i][o].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(o).filter(u=>!Yp.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let f=new Kp.yy.Column({columnid:u});s.tableid&&(f.tableid=s.tableid),this.ast.columns.push(f),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(o,l)}}),this.ast}};function rue(e){return e.filter(t=>t[Yp.PERMS_CRUD_ENUM.READ])}a(rue,"filterReadRestrictedAttrs");function nue(e,t,r,n,s){sue(e,t,r,n,s)}a(nue,"interpretAST");function Wp(e,t,r,n,s){if(!(!e||!e.databaseid)&&(t.has(e.databaseid)||t.set(e.databaseid,new Map),t.get(e.databaseid).has(e.tableid)||t.get(e.databaseid).set(e.tableid,[]),e.as&&(r.has(e.as)||r.set(e.as,e.tableid),n&&!n.has(e.as)&&n.set(e.as,e.databaseid)),s)){let i=e.databaseid,o=e.tableid;e.as&&(o=e.as),s.set(o,i)}}a(Wp,"addSchemaTableToMap");function sue(e,t,r,n,s){if(!e){pi.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof Kp.yy.Insert?cue(e,t,r):e instanceof Kp.yy.Select?iue(e,t,r,n,s):e instanceof Kp.yy.Update?oue(e,t,r):e instanceof Kp.yy.Delete?aue(e,t,r):pi.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(sue,"getRecordAttributesAST");function iue(e,t,r,n,s){if(!e){pi.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(tue.isEmptyOrZeroLength(i)){pi.error("No schema specified");return}e.from.forEach(c=>{Wp(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),Wp(c.table,t,r,n,s)});let o=new Hl(e.columns);for(let{node:c}of o)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{pi.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 Hl(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let f=u.tableid?u.tableid:l;if(!t.get(i).has(f))if(r.has(f))f=r.get(f);else{pi.info(`table specified as ${f} not found.`);continue}t.get(i).get(f).indexOf(u.columnid)<0&&t.get(i).get(f).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new Hl(c.on);for(let{node:u}of l)if(u&&u.columnid){let f=u.tableid,d=s.get(f);if(!t.get(d).has(f))if(r.has(f))f=r.get(f);else{pi.info(`table specified as ${f} not found.`);continue}t.get(d).get(f).indexOf(u.columnid)<0&&t.get(d).get(f).push(u.columnid)}}),e.order){let c=new Hl(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,f=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(f).has(u))if(r.has(u))u=r.get(u);else{pi.info(`table specified as ${u} not found.`);return}t.get(f).get(u).indexOf(l.columnid)<0&&t.get(f).get(u).push(l.columnid)}}}a(iue,"getSelectAttributes");function oue(e,t,r){if(!e){pi.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new Hl(e.columns),s=e.table.databaseid;Wp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&Lw(e.table.tableid,s,i.columnid,t,r)}a(oue,"getUpdateAttributes");function aue(e,t,r){if(!e){pi.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new Hl(e.where),s=e.table.databaseid;Wp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&Lw(e.table.tableid,s,i.columnid,t,r)}a(aue,"getDeleteAttributes");function cue(e,t,r){if(!e){pi.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new Hl(e.columns),s=e.into.databaseid;Wp(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&Lw(e.into.tableid,s,i.columnid,t,r)}a(cue,"getInsertAttributes");function Lw(e,t,r,n,s){if(!n.get(t))return;let i=e;n.get(t).has(i)||(i=s.get(i)),n.get(t).get(i).push(r)}a(Lw,"pushAttribute");o$.exports=Dw});var l$=P((yMe,c$)=>{"use strict";var DS=(k(),C(G)),LS=class{static{a(this,"BaseLicense")}constructor(t=0,r=DS.RAM_ALLOCATION_ENUM.DEFAULT,n=DS.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},Mw=class extends LS{static{a(this,"ExtendedLicense")}constructor(t=0,r=DS.RAM_ALLOCATION_ENUM.DEFAULT,n=DS.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};c$.exports={BaseLicense:LS,ExtendedLicense:Mw}});var Md=P((OMe,h$)=>{"use strict";var Ld=require("fs-extra"),MS=(OE(),C(bE)),d$=require("crypto"),lue=require("moment"),uue=require("uuid").v4,nn=J(),Uw=require("path"),due=ie(),kl=(k(),C(G)),{totalmem:u$}=require("os"),fue=l$().ExtendedLicense,Dd="invalid license key format",_ue="061183",pue="mofi25",hue="aes-256-cbc",mue=16,Eue=32,f$=ce(),{resolvePath:_$}=bt();f$.initSync();var vw;h$.exports={validateLicense:p$,generateFingerPrint:Sue,licenseSearch:Hw,getLicense:Rue,checkMemoryLimit:yue};function xw(){return Uw.join(f$.getHdbBasePath(),kl.LICENSE_KEY_DIR_NAME,kl.LICENSE_FILE_NAME)}a(xw,"getLicenseDirPath");function gue(){let e=xw();return _$(Uw.join(e,kl.LICENSE_FILE_NAME))}a(gue,"getLicenseFilePath");function Bw(){let e=xw();return _$(Uw.join(e,kl.REG_KEY_FILE_NAME))}a(Bw,"getFingerPrintFilePath");async function Sue(){let e=Bw();try{return await Ld.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Tue();throw nn.error(`Error writing fingerprint file to ${e}`),nn.error(t),new Error("There was an error generating the fingerprint")}}a(Sue,"generateFingerPrint");async function Tue(){let e=uue(),t=MS.hash(e,MS.HASH_FUNCTION.MD5),r=Bw();try{await Ld.mkdirp(xw()),await Ld.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw nn.error(`Error writing fingerprint file to ${r}`),nn.error(n),new Error("There was an error generating the fingerprint")}return t}a(Tue,"writeFingerprint");function p$(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:kl.RAM_ALLOCATION_ENUM.DEFAULT,version:kl.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return nn.error("empty license key passed to validate."),r;let n=Bw(),s=!1;try{s=Ld.statSync(n)}catch(i){nn.error(i)}if(s){let i;try{i=Ld.readFileSync(n,"utf8")}catch{nn.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(pue),c=o[1];c=Buffer.concat([Buffer.from(c)],mue);let l=Buffer.concat([Buffer.from(i)],Eue),u=d$.createDecipheriv(hue,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let f=null;try{f=u.update(o[0],"hex","utf8"),f.trim(),f+=u.final("utf8")}catch{let p=Aue(o[0],i);if(p)f=p;else throw r.valid_license=!1,r.valid_machine=!1,console.error(Dd),nn.error(Dd),new Error(Dd)}let d;if(isNaN(f))try{d=JSON.parse(f),r.version=d.version,r.exp_date=d.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),d.ram_allocation&&(r.ram_allocation=d.ram_allocation)}catch{throw console.error(Dd),nn.error(Dd),new Error(Dd)}else r.exp_date=f;r.exp_date<lue().valueOf()&&(r.valid_date=!1),MS.validate(o[1],`${_ue}${i}${t}`,MS.HASH_FUNCTION.MD5)||(r.valid_license=!1)}else r.valid_license=!1,r.valid_machine=!1;return r.valid_license&&r.valid_machine&&r.valid_date||nn.error("Invalid licence"),r}a(p$,"validateLicense");function Aue(e,t){try{let r=d$.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{nn.warn("Check old license failed")}}a(Aue,"checkOldLicense");function Hw(){let e=new fue,t=[];try{t=Ld.readFileSync(gue(),"utf-8").split(`\r
|
|
25
25
|
`)}catch(r){r.code==="ENOENT"?nn.debug("no license file found"):nn.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(due.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=p$(s.license_key,s.company);i.valid_machine===!0&&i.valid_date===!0&&i.valid_machine===!0&&(e.exp_date=i.exp_date>e.exp_date?i.exp_date:e.exp_date,e.ram_allocation=i.ram_allocation,e.enterprise=!0)}catch(s){nn.error("There was an error parsing the license string."),nn.error(s),e.ram_allocation=kl.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return vw=e,e}a(Hw,"licenseSearch");async function Rue(){return vw||await Hw(),vw}a(Rue,"getLicense");function yue(){let e=Hw().ram_allocation,t=process.constrainedMemory?.()||u$();if(t=Math.round(Math.min(t,u$())/2**20),t>e)return`This server has more memory (${t}MB) than HarperDB is licensed for (${e}MB), this should only be used for educational and development purposes.`}a(yue,"checkMemoryLimit")});var US=P((wMe,S$)=>{var vS=Md(),m$=require("chalk"),cs=J(),E$=require("prompt"),{promisify:bue}=require("util"),kw=(k(),C(G)),Oue=require("fs-extra"),Nue=require("path"),wue=ie(),{packageJson:Iue}=at(),g$=ce();g$.initSync();var Cue=require("moment"),Pue=bue(E$.get),Due=Nue.join(g$.getHdbBasePath(),kw.LICENSE_KEY_DIR_NAME,kw.LICENSE_FILE_NAME,kw.LICENSE_FILE_NAME);S$.exports={getFingerprint:Mue,setLicense:Lue,parseLicense:Fw,register:vue,getRegistrationInfo:xue};async function Lue(e){if(e&&e.key&&e.company){try{cs.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await Fw(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw cs.error(r),cs.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(Lue,"setLicense");async function Mue(){let e={};try{e=await vS.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw cs.error(r),cs.error(t),new Error(r)}return e}a(Mue,"getFingerprint");async function Fw(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");cs.info("Validating license input...");let r=vS.validateLicense(e,t);if(cs.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(cs.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(cs.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{cs.info("writing license to disk"),await Oue.writeFile(Due,JSON.stringify({license_key:e,company:t}))}catch(n){throw cs.error("Failed to write License"),n}return"Registration successful."}a(Fw,"parseLicense");async function vue(){let e=await Uue();return Fw(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(vue,"register");async function Uue(){let e=await vS.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:m$.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:m$.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{E$.start()}catch(n){cs.error(n)}let r;try{r=await Pue(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(Uue,"promptForRegistration");async function xue(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await vS.getLicense()}catch(r){throw cs.error(`There was an error when searching licenses due to: ${r.message}`),r}if(wue.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=Iue.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=Cue.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(xue,"getRegistrationInfo")});var A$=P((CMe,T$)=>{"use strict";var Bue=Rt(),Gw=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d,_,p,h){this.port=t,o===null&&(o=void 0),this.server_name=r+Bue.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c}},this.cluster={name:f,port:d,routes:_,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l}},this.accounts={SYS:{users:p},HDB:{users:h}},this.system_account="SYS"}};T$.exports=Gw});var b$=P((DMe,y$)=>{"use strict";var R$=Rt(),qw=class{static{a(this,"LeafConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d){this.port=t,d===null&&(d=void 0),this.server_name=r+R$.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+R$.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:f,ca_file:d,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:d,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:d,insecure:!0},urls:o,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};y$.exports=qw});var N$=P((MMe,O$)=>{"use strict";var $w=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};O$.exports=$w});var I$=P((UMe,w$)=>{"use strict";var Hue=Rt(),Vw=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+Hue.SERVER_SUFFIX.ADMIN,this.password=r}};w$.exports=Vw});var kS=P((BMe,D$)=>{"use strict";var Fl=require("path"),Gl=require("fs-extra"),kue=A$(),Fue=b$(),Gue=N$(),que=I$(),Kw=wn(),Ud=ie(),Ln=bt(),BS=(k(),C(G)),zp=Rt(),{CONFIG_PARAMS:Xt}=BS,xd=J(),jp=ce(),C$=No(),Yw=or(),$ue=os(),vd="clustering",Vue=1e4,P$=50;D$.exports={generateNatsConfig:Yue,removeNatsConfig:Wue,getHubConfigPath:Kue};function Kue(){let e=jp.get(Xt.ROOTPATH);return Fl.join(e,vd,zp.NATS_CONFIG_FILES.HUB_SERVER)}a(Kue,"getHubConfigPath");async function Yue(e=!1,t=void 0){let r=jp.get(Xt.ROOTPATH);Gl.ensureDirSync(Fl.join(r,"clustering","leaf")),jp.initSync();let n=Ln.getConfigFromFile(Xt.CLUSTERING_TLS_CERT_AUTH),s=Ln.getConfigFromFile(Xt.CLUSTERING_TLS_PRIVATEKEY),i=Ln.getConfigFromFile(Xt.CLUSTERING_TLS_CERTIFICATE);!await Gl.exists(i)&&!await Gl.exists(!n)&&await $ue.createNatsCerts();let o=Fl.join(r,vd,zp.PID_FILES.HUB),c=Fl.join(r,vd,zp.PID_FILES.LEAF),l=Ln.getConfigFromFile(Xt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=Fl.join(r,vd,zp.NATS_CONFIG_FILES.HUB_SERVER),f=Fl.join(r,vd,zp.NATS_CONFIG_FILES.LEAF_SERVER),d=Ln.getConfigFromFile(Xt.CLUSTERING_TLS_INSECURE),_=Ln.getConfigFromFile(Xt.CLUSTERING_TLS_VERIFY),p=Ln.getConfigFromFile(Xt.CLUSTERING_NODENAME),h=Ln.getConfigFromFile(Xt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await Yw.checkNATSServerInstalled()||HS("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await Kw.listUsers(),g=Ln.getConfigFromFile(Xt.CLUSTERING_USER),R=await Kw.getClusterUser();(Ud.isEmpty(R)||R.active!==!0)&&HS(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await xS(Xt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await xS(Xt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await xS(Xt.CLUSTERING_HUBSERVER_NETWORK_PORT),await xS(Xt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[se,z]of S.entries())z.role?.role===BS.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(E.push(new que(z.username,C$.decrypt(z.hash))),T.push(new Gue(z.username,C$.decrypt(z.hash))));let N=[],{hub_routes:M}=Ln.getClusteringRoutes();if(!Ud.isEmptyOrZeroLength(M))for(let se of M)N.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${se.host}:${se.port}`);let H=new kue(Ln.getConfigFromFile(Xt.CLUSTERING_HUBSERVER_NETWORK_PORT),p,o,i,s,n,d,_,h,Ln.getConfigFromFile(Xt.CLUSTERING_HUBSERVER_CLUSTER_NAME),Ln.getConfigFromFile(Xt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete H.tls.ca_file,delete H.leafnodes.tls.ca_file),t=Ud.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===BS.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Gl.writeJson(u,H),xd.trace(`Hub server config written to ${u}`));let Z=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,W=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,$=new Fue(Ln.getConfigFromFile(Xt.CLUSTERING_LEAFSERVER_NETWORK_PORT),p,c,l,[Z],[W],E,T,i,s,n,d);n==null&&delete $.tls.ca_file,(t===void 0||t===BS.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Gl.writeJson(f,$),xd.trace(`Leaf server config written to ${f}`))}a(Yue,"generateNatsConfig");async function xS(e){let t=jp.get(e);return Ud.isEmpty(t)&&HS(`port undefined for '${e}'`),await Ud.isPortTaken(t)&&HS(`'${e}' port '${t}' is is in use by another process, check to see if HarperDB is already running or another process is using this port.`),!0}a(xS,"isPortAvailable");function HS(e){let t=`Error generating clustering config: ${e}`;xd.error(t),console.error(t),process.exit(1)}a(HS,"generateNatsConfigError");async function Wue(e){let{port:t,config_file:r}=Yw.getServerConfig(e),{username:n,decrypt_hash:s}=await Kw.getClusterUser(),i=0,o=2e3;for(;i<P$;){try{let f=await Yw.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){xd.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=P$)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=o*(i*2);u>3e4&&xd.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await Ud.async_set_timeout(u)}let c="0".repeat(Vue),l=Fl.join(jp.get(Xt.ROOTPATH),vd,r);await Gl.writeFile(l,c),await Gl.remove(l),xd.notify(e,"started.")}a(Wue,"removeNatsConfig")});var B$=P((kMe,x$)=>{"use strict";var ls=ce(),zue=Md(),Ve=(k(),C(G)),Jp=Rt(),$o=require("path"),{PACKAGE_ROOT:GS}=at(),L$=ce(),FS=ie(),Bd="/dev/null",jue=$o.join(GS,"launchServiceScripts"),M$=$o.join(GS,"utility/scripts"),Jue=$o.join(M$,Ve.HDB_RESTART_SCRIPT),v$=$o.resolve(GS,"dependencies",`${process.platform}-${process.arch}`,Jp.NATS_BINARY_NAME);function U$(){let t=zue.licenseSearch().ram_allocation||Ve.RAM_ALLOCATION_ENUM.DEFAULT,r=Ve.MEM_SETTING_KEY+t,n={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return FS.noBootFile()&&(n[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=FS.getEnvCliRootPath()),{name:Ve.PROCESS_DESCRIPTORS.HDB,script:Ve.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:GS}}a(U$,"generateMainServerConfig");var Que=9930;function Xue(){ls.initSync(!0);let e=ls.get(Ve.CONFIG_PARAMS.ROOTPATH),t=$o.join(e,"clustering",Jp.NATS_CONFIG_FILES.HUB_SERVER),r=$o.join(ls.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=L$.get(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Jp.LOG_LEVEL_FLAGS[ls.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Que?"-"+n:""),script:v$,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return ls.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Bd,i.error_file=Bd),i}a(Xue,"generateNatsHubServerConfig");var Zue=9940;function ede(){ls.initSync(!0);let e=ls.get(Ve.CONFIG_PARAMS.ROOTPATH),t=$o.join(e,"clustering",Jp.NATS_CONFIG_FILES.LEAF_SERVER),r=$o.join(ls.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=L$.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Jp.LOG_LEVEL_FLAGS[ls.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Zue?"-"+n:""),script:v$,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return ls.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Bd,i.error_file=Bd),i}a(ede,"generateNatsLeafServerConfig");function tde(){ls.initSync();let e=$o.join(ls.get(Ve.CONFIG_PARAMS.LOGGING_ROOT),Ve.LOG_NAMES.HDB),t={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ve.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:jue,autorestart:!1};return ls.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=Bd,t.error_file=Bd),t}a(tde,"generateClusteringUpgradeV4ServiceConfig");function rde(){let e={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.RESTART_HDB};return FS.noBootFile()&&(e[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=FS.getEnvCliRootPath()),{...{name:Ve.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:M$},script:Jue}}a(rde,"generateRestart");function nde(){return{apps:[U$()]}}a(nde,"generateAllServiceConfigs");x$.exports={generateAllServiceConfigs:nde,generateMainServerConfig:U$,generateRestart:rde,generateNatsHubServerConfig:Xue,generateNatsLeafServerConfig:ede,generateClusteringUpgradeV4ServiceConfig:tde}});var Hd=P((qMe,Q$)=>{"use strict";var tt=(k(),C(G)),sde=ie(),Ko=kS(),qS=or(),Vo=Rt(),Za=B$(),$S=ce(),ql=J(),ide=Fo(),{startWorker:H$,onMessageFromWorkers:ode}=nt(),ade=ko(),GMe=require("util"),cde=require("child_process"),lde=require("fs"),{execFile:ude}=cde,je;Q$.exports={enterPM2Mode:dde,start:ec,stop:Ww,reload:F$,restart:G$,list:zw,describe:V$,connect:Yo,kill:mde,startAllServices:Ede,startService:jw,getUniqueServicesList:K$,restartAllServices:gde,isServiceRegistered:Y$,reloadStopStart:W$,restartHdb:$$,deleteProcess:pde,startClusteringProcesses:j$,startClusteringThreads:J$,isHdbRestartRunning:hde,isClusteringRunning:Tde,stopClustering:Sde,reloadClustering:Ade,expectedRestartOfChildren:q$};var Qp=!1;ode(e=>{e.type==="restart"&&$S.initSync(!0)});function dde(){Qp=!0}a(dde,"enterPM2Mode");function Yo(){return je||(je=require("pm2")),new Promise((e,t)=>{je.connect((r,n)=>{r&&t(r),e(n)})})}a(Yo,"connect");var sn,fde=10,k$;function ec(e,t=!1){if(Qp)return _de(e);let r=ude(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=sn.indexOf(r);o>-1&&sn.splice(o,1),!k$&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<fde&&(lde.existsSync(Ko.getHubConfigPath())?ec(e):(await Ko.generateNatsConfig(!0),ec(e),await new Promise(c=>setTimeout(c,3e3)),await Ko.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Ko.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=$S.get(tt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&Vo.LOG_LEVEL_HIERARCHY[o]>=Vo.LOG_LEVEL_HIERARCHY[f||"info"]){let p=f===Vo.LOG_LEVELS.ERR||f===Vo.LOG_LEVELS.WRN?ql.OUTPUTS.STDERR:ql.OUTPUTS.STDOUT;ql.logCustomLevel(f||"info",p,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=Vo.LOG_LEVELS[_]}if(Vo.LOG_LEVEL_HIERARCHY[o]>=Vo.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===Vo.LOG_LEVELS.ERR||f===Vo.LOG_LEVELS.WRN?ql.OUTPUTS.STDERR:ql.OUTPUTS.STDOUT;ql.logCustomLevel(f||"info",d,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!sn&&(sn=[],!t)){let i=a(()=>{k$=!0,sn&&(sn.map(o=>o.kill()),process.exit(0))},"kill_children");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}sn.push(r)}a(ec,"start");function _de(e){return new Promise(async(t,r)=>{try{await Yo()}catch(n){r(n)}je.start(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(_de,"startWithPM2");function Ww(e){if(!Qp){for(let t of sn||[])t.name===e&&(sn.splice(sn.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Yo()}catch(n){r(n)}je.stop(e,async(n,s)=>{n&&(je.disconnect(),r(n)),je.delete(e,(i,o)=>{i&&(je.disconnect(),r(n)),je.disconnect(),t(o)})})})}a(Ww,"stop");function F$(e){return new Promise(async(t,r)=>{try{await Yo()}catch(n){r(n)}je.reload(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(F$,"reload");function G$(e){if(!Qp){q$();for(let t of sn||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Yo()}catch(n){r(n)}je.restart(e,(n,s)=>{je.disconnect(),t(s)})})}a(G$,"restart");function q$(){for(let e of sn||[])e.config&&(e.config.restarts=0)}a(q$,"expectedRestartOfChildren");function pde(e){return new Promise(async(t,r)=>{try{await Yo()}catch(n){r(n)}je.delete(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(pde,"deleteProcess");async function $$(){await ec(Za.generateRestart())}a($$,"restartHdb");async function hde(){let e=await zw();for(let t in e)if(e[t].name===tt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(hde,"isHdbRestartRunning");function zw(){return new Promise(async(e,t)=>{try{await Yo()}catch(r){t(r)}je.list((r,n)=>{r&&(je.disconnect(),t(r)),je.disconnect(),e(n)})})}a(zw,"list");function V$(e){return new Promise(async(t,r)=>{try{await Yo()}catch(n){r(n)}je.describe(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(V$,"describe");function mde(){if(!Qp){for(let e of sn||[])e.kill();sn=[];return}return new Promise(async(e,t)=>{try{await Yo()}catch(r){t(r)}je.killDaemon((r,n)=>{r&&(je.disconnect(),t(r)),je.disconnect(),e(n)})})}a(mde,"kill");async function Ede(){try{await j$(),await J$(),await ec(Za.generateAllServiceConfigs())}catch(e){throw je?.disconnect(),e}}a(Ede,"startAllServices");async function jw(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case tt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Za.generateMainServerConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Za.generateNatsIngestServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Za.generateNatsReplyServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Za.generateNatsHubServerConfig(),await ec(r,t),await Ko.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Za.generateNatsLeafServerConfig(),await ec(r,t),await Ko.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Za.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await ec(r)}catch(r){throw je?.disconnect(),r}}a(jw,"startService");async function K$(){try{let e=await zw(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw je?.disconnect(),e}}a(K$,"getUniqueServicesList");async function gde(e=[]){try{let t=!1,r=await K$();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===tt.PROCESS_DESCRIPTORS.HDB?t=!0:await G$(o))}t&&await W$(tt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw je?.disconnect(),t}}a(gde,"restartAllServices");async function Y$(e){if(sn?.find(r=>r.name===e))return!0;let t=await ade.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(Y$,"isServiceRegistered");async function W$(e){let t=$S.get(tt.CONFIG_PARAMS.THREADS_COUNT)??$S.get(tt.CONFIG_PARAMS.THREADS),r=await V$(e),n=sde.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await Ww(e),await jw(e)):e===tt.PROCESS_DESCRIPTORS.HDB?await $$():await F$(e)}a(W$,"reloadStopStart");var z$;async function j$(e=!1){for(let t in tt.CLUSTERING_PROCESSES){let r=tt.CLUSTERING_PROCESSES[t];await jw(r,e)}}a(j$,"startClusteringProcesses");async function J$(){z$=H$(tt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await qS.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await qS.updateLocalStreams();let e=await ide.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===tt.PRE_4_0_0_VERSION){ql.info("Starting clustering upgrade 4.0.0 process"),H$(tt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(J$,"startClusteringThreads");async function Sde(){for(let e in tt.CLUSTERING_PROCESSES)if(e!==tt.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===tt.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await z$.terminate();else{let t=tt.CLUSTERING_PROCESSES[e];await Ww(t)}}a(Sde,"stopClustering");async function Tde(){for(let e in tt.CLUSTERING_PROCESSES){let t=tt.CLUSTERING_PROCESSES[e];if(await Y$(t)===!1)return!1}return!0}a(Tde,"isClusteringRunning");async function Ade(){await Ko.generateNatsConfig(!0),await qS.reloadNATSHub(),await qS.reloadNATSLeaf(),await Ko.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Ko.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(Ade,"reloadClustering")});var YS={};xe(YS,{compactOnStart:()=>Rde,copyDb:()=>nV});async function Rde(){tc.notify("Running compact on start"),console.log("Running compact on start");let e=(0,Jw.get)(x.ROOTPATH),t=new Map,r=Xe();(0,Qw.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,VS.join)(e,"backup",n+".mdb"),o=(0,VS.join)(e,xc,n+"-copy.mdb"),c=0;try{c=await X$(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){tc.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{db_path:s,copy_dest:o,backup_dest:i,record_count:c}),await nV(n,o),console.log("Backing up",n,"to",i),await(0,$l.move)(s,i,{overwrite:!0}),console.log("Moving copy compacted",n,"to",s),await(0,$l.move)(o,s,{overwrite:!0}),await(0,$l.remove)((0,VS.join)(e,xc,`${n}-copy.mdb-lock`))}try{Fd()}catch(n){tc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}try{Fd()}catch(n){tc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){tc.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,Qw.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);for(let[s,{db_path:i,backup_dest:o}]of t){console.error("Moving backup database",o,"back to",i);try{await(0,$l.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw Fd(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=await X$(n);if(console.log("Database",n,"after compact has a total record count of",o),i!==o){let c=`There is a discrepancy between pre and post compact record count for database ${n}.
|
|
26
26
|
Total record count before compaction: ${i}, total after: ${o}.
|