harperdb 4.5.34 → 4.5.35

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.
@@ -19,9 +19,9 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
19
19
  This can occur during early stages of install where the config file has not yet been created`);return}else throw nr.error(i),new Error(`Error reading HarperDB config file at ${r}`)}tZ(n,r),fy(n);let s=n.toJSON();if(Y6.config=s,Dt=hu(s),Dt.logging_rotation_rotate)for(let i in xv)Dt[i]&&nr.error(`Config ${xv[i]} has been deprecated. Please check https://docs.harperdb.io/docs/ for further details.`);nr.trace(z6)}}a(Vp,"initConfig");function tZ(e,t){let r=e.getIn(["rootPath"]),n=!1;if(e.hasIn(["storage","path"])||(e.setIn(["storage","path"],Vn.join(r,"database")),n=!0),e.hasIn(["logging","rotation","path"])||(e.setIn(["logging","rotation","path"],Vn.join(r,"log")),n=!0),e.hasIn(["authentication"])||(e.addIn(["authentication"],{cacheTTL:3e4,enableSessions:!0,operationTokenTimeout:e.getIn(["operationsApi","authentication","operationTokenTimeout"])??"1d",refreshTokenTimeout:e.getIn(["operationsApi","authentication","refreshTokenTimeout"])??"30d"}),n=!0),e.hasIn(["analytics"])||(e.addIn(["analytics"],{aggregatePeriod:60}),n=!0),n){if(nr.trace("Updating config file with missing config params"),e.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${e.errors}`);zr.writeFileSync(t,String(e))}}a(tZ,"checkForUpdatedConfig");function fy(e,t=!1){let r=e.toJSON();if(r.componentsRoot=r.componentsRoot??r?.customFunctions?.root,r?.http?.threads&&(r.threads=r?.http?.threads),r.http?.port&&r.http?.port===r.http?.securePort)throw _u.CONFIG_VALIDATION("http.port and http.securePort cannot be the same value");if(r.operationsApi?.network?.port&&r.operationsApi?.network?.port===r.operationsApi?.network?.securePort)throw _u.CONFIG_VALIDATION("operationsApi.network.port and operationsApi.network.securePort cannot be the same value");let n=G6(r,t);if(n.error)throw _u.CONFIG_VALIDATION(n.error.message);typeof n.value.threads=="object"?e.setIn(["threads","count"],n.value.threads.count):e.setIn(["threads"],n.value.threads),e.setIn(["componentsRoot"],n.value.componentsRoot),e.setIn(["logging","root"],n.value.logging.root),e.setIn(["storage","path"],n.value.storage.path),e.setIn(["logging","rotation","path"],n.value.logging.rotation.path),e.setIn(["operationsApi","network","domainSocket"],n.value?.operationsApi?.network?.domainSocket),r?.clustering?.enabled&&e.setIn(["clustering","leafServer","streams","path"],n.value.clustering.leafServer.streams?.path)}a(fy,"validateConfig");function rZ(e,t){Dt===void 0&&(Dt={});let r=Vs[e.toLowerCase()];if(r===void 0){nr.trace(`Unable to update config object because config param '${e}' does not exist`);return}Dt[r.toLowerCase()]=t}a(rZ,"updateConfigObject");function $v(e,t,r=void 0,n=!1,s=!1,i=!1){Dt===void 0&&Vp();let o=qv(Vs.hdb_root),c=Vn.join(o,ms.HDB_CONFIG_FILE),l=_a(c),u;if(r&&Dt){let _=!1;for(let h in r)if(r[h]!=Dt[h.toLowerCase()]){_=!0;break}if(!_){nr.trace("No changes detected in config parameters, skipping update");return}}if(r===void 0&&e.toLowerCase()===$n.DATABASES)u=t;else if(r===void 0){let _;if(i)_=e;else if(_=Vs[e.toLowerCase()],_===void 0)throw new Error(`Unable to update config, unrecognized config parameter: ${e}`);let h=_.split("_"),m=dy(_,t);l.setIn([...h],m)}else for(let _ in r){let h=Vs[_.toLowerCase()];if(h===$n.HTTP_SECUREPORT&&r[_]===Dt[$n.HTTP_PORT]?.toString()&&l.setIn(["http","port"],null),h===$n.OPERATIONSAPI_NETWORK_SECUREPORT&&r[_]===Dt[$n.OPERATIONSAPI_NETWORK_PORT.toLowerCase()]?.toString()&&l.setIn(["operationsApi","network","port"],null),h===$n.DATABASES){u=r[_];continue}if(h?.startsWith("threads_")){let m=l.getIn(["threads"]);m>=0&&(l.deleteIn(["threads"]),l.setIn(["threads","count"],m))}if(!h&&(_.endsWith("_package")||_.endsWith("_port"))&&(h=_),h!==void 0){let m=h.split("_"),S=ms.LEGACY_CONFIG_PARAMS[_.toUpperCase()];S&&S.startsWith("customFunctions")&&l.hasIn(S.split("_"))&&(h=S,m=S.split("_"));let g=dy(h,r[_]);h==="rootPath"&&g?.endsWith("/")&&(g=g.slice(0,-1));try{m.length>1&&typeof l.getIn(m.slice(0,-1))=="boolean"&&l.deleteIn(m.slice(0,-1)),l.setIn([...m],g)}catch(R){nr.error(R)}}}u&&Gv(l,u),fy(l);let f=l.getIn(["rootPath"]),d=Vn.join(f,ms.HDB_CONFIG_FILE);if(n===!0&&nZ(c,f),l.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${l.errors}`);zr.writeFileSync(d,String(l)),s&&(Dt=hu(l.toJSON())),nr.trace(`Config parameter: ${e} updated with value: ${t}`)}a($v,"updateConfigValue");function nZ(e,t){try{let r=Vn.join(t,"backup",`${new Date(Date.now()).toISOString().replaceAll(":","-")}-${ms.HDB_CONFIG_FILE}.bak`);zr.copySync(e,r),nr.trace(`Config file: ${e} backed up to: ${r}`)}catch(r){nr.error(Q6),nr.error(r)}}a(nZ,"backupConfigFile");var sZ=["databases"];function hu(e){return e.http&&Object.assign(e.http,e?.customFunctions?.network),e?.operationsApi?.network&&(e.operationsApi.network={...e.http,...e.operationsApi.network}),e?.operationsApi&&(e.operationsApi.tls={...e.tls,...e.operationsApi.tls}),$p=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])&&!sZ.includes(i)){let o=r(n[i]);for(let c in o){if(!o.hasOwnProperty(c))continue;c!=="package"&&(i=i.toLowerCase());let l=i+"_"+c;!$n[l.toUpperCase()]&&Vs[l]&&(s[Vs[l].toLowerCase()]=o[c]),s[l]=o[c]}}n[i]!==void 0&&(s[i.toLowerCase()]=n[i])}return s}a(r,"squashObj")}a(hu,"flattenConfig");function dy(e,t){if(e===$n.CLUSTERING_NODENAME||e===$n.CLUSTERING_USER){if(t==null)return t;if(!isNaN(t))return t.toString();if(typeof t=="string"&&t.toLowerCase()==="true"||typeof t=="string"&&t.toLowerCase()==="false")return t}else{if(q6(t))return parseFloat(t);if(t===!0||t===!1||Array.isArray(t)||Er.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 Er.autoCast(t)}a(dy,"castConfigValue");function iZ(){let e=Er.getPropsFilePath(),t=Fc(e);return _a(t).toJSON()}a(iZ,"getConfiguration");async function oZ(e){let{operation:t,hdb_user:r,hdb_auth_header:n,...s}=e;try{return $v(void 0,void 0,s,!0),X6}catch(i){throw typeof i=="string"||i instanceof String?V6(i,i,K6.BAD_REQUEST,void 0,void 0,!0):i}}a(oZ,"setConfiguration");function _y(){let e=Er.getPropsFilePath();try{zr.accessSync(e,zr.constants.F_OK|zr.constants.R_OK)}catch(n){if(!Er.noBootFile())throw nr.error(n),new Error(`HarperDB properties file at path ${e} does not exist`)}let t=Fc(e);return _a(t).toJSON()}a(_y,"readConfigFile");function _a(e){return Bv.parseDocument(zr.readFileSync(e,"utf8"),{simpleKeys:!0})}a(_a,"parseYamlDoc");function aZ(){let e=_y(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=Er.isEmptyOrZeroLength(t)?[]:t;let r=Uv(t);if(r)throw _u.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=Er.isEmptyOrZeroLength(n)?[]:n;let s=Uv(n);if(s)throw _u.CONFIG_VALIDATION(s.message);if(!Er.isEmptyOrZeroLength(n)&&!Er.isEmptyOrZeroLength(t)){let i=t.filter(o=>n.some(c=>c.host===o.host&&c.port===o.port));if(!Er.isEmptyOrZeroLength(i)){let o=`Duplicate hub and leaf routes found ${JSON.stringify(i)}`;throw _u.CONFIG_VALIDATION(o)}}return{hub_routes:t,leaf_routes:n}}a(aZ,"getClusteringRoutes");function Vv(e){let t=Hv(e);Dt={};for(let r in Vs){let n=t.get(r.toUpperCase());if(Er.isEmpty(n)||typeof n=="string"&&n.trim().length===0)continue;let s=Vs[r].toLowerCase();s===$n.LOGGING_ROOT?Dt[s]=Vn.dirname(n):Dt[s]=n}return Dt}a(Vv,"initOldConfig");function cZ(e){let t=_y();return $6.get(t,e.replaceAll("_","."))}a(cZ,"getConfigFromFile");async function lZ(e,t){let r=_a(Fc());if(r.hasIn([e])?r.setIn([e],t):r.addIn([e],t),r.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${r.errors}`);await zr.writeFile(Fc(),String(r))}a(lZ,"addConfig");function uZ(e){let t=Fc(Er.getPropsFilePath()),r=_a(t);r.deleteIn(e);let n=r.getIn(["rootPath"]),s=Vn.join(n,ms.HDB_CONFIG_FILE);zr.writeFileSync(s,String(r))}a(uZ,"deleteConfigFromFile");function dZ(){return $p||(Vp(),$p)}a(dZ,"getConfigObj");function fZ(){return Dt||Vp(),Dt}a(fZ,"getFlatConfigObj")});var Kn=C((ibe,Nr)=>{"use strict";var zv="username is required",Qv="nothing to update, must supply active, role or password to update",jv="password cannot be an empty string",Jv="If role is specified, it cannot be empty.",Xv="active must be true or false";Nr.exports.addUser=AZ;Nr.exports.alterUser=RZ;Nr.exports.dropUser=bZ;Nr.exports.getSuperUser=CZ;Nr.exports.userInfo=OZ;Nr.exports.listUsers=Yp;Nr.exports.listUsersExternal=NZ;Nr.exports.setUsersWithRolesCache=Gc;Nr.exports.findAndValidateUser=Ry;Nr.exports.getClusterUser=PZ;Nr.exports.getUsersWithRolesCache=IZ;Nr.exports.USERNAME_REQUIRED=zv;Nr.exports.ALTERUSER_NOTHING_TO_UPDATE=Qv;Nr.exports.EMPTY_PASSWORD=jv;Nr.exports.EMPTY_ROLE=Jv;Nr.exports.ACTIVE_BOOLEAN=Xv;var Zv=An(),_Z=Hc(),s_=(Fp(),P(kp)),eU=Ov(),i_=Yr(),gy=mo(),Ii=ie(),tU=require("validate.js"),Sy=ee(),{promisify:hZ}=require("util"),Ty=fo(),my=(k(),P(q)),Yv=Pt(),mZ=Lt(),pZ=le(),EZ=co(),{hdb_errors:gZ,ClientError:Ks}=he(),{HTTP_STATUS_CODES:ho,AUTHENTICATION_ERROR_MSGS:hy,HDB_ERROR_MSGS:mu}=gZ,{UserEventMsg:Ay}=Ys(),py=require("lodash"),{server:Kp}=(Mr(),P(Zl)),SZ=ee();Kp.getUser=(e,t)=>Ry(e,t,t!=null);Kp.authenticateUser=(e,t)=>Ry(e,t);var rU={username:!0,active:!0,role:!0,password:!0},Wv=new Map,TZ=hZ(_Z.delete),Ey=pZ.get(my.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??s_.HASH_FUNCTION.SHA256,Ci;async function AZ(e){let t=tU.cleanAttributes(e,rU),r=eU.addUserValidation(t);if(r)throw new Ks(r.message);let n=await i_.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["id","permission","role"]});if(!n||n.length<1)throw new Ks(mu.ROLE_NAME_NOT_FOUND(t.role),ho.NOT_FOUND);if(n.length>1)throw new Ks(mu.DUP_ROLES_FOUND(t.role),ho.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=Ty.encrypt(t.password)),t.password=await s_.hash(t.password,Ey),t.hash_function=Ey,t.role=n[0].id;let s=await Zv.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(Sy.debug(s),await Gc(),s.skipped_hashes.length===1)throw new Ks(mu.USER_ALREADY_EXISTS(t.username),ho.CONFLICT);return gy.signalUserChange(new Ay(process.pid)),`${t.username} successfully added`}a(AZ,"addUser");async function RZ(e){let t=tU.cleanAttributes(e,rU);if(Ii.isEmptyOrZeroLength(t.username))throw new Error(zv);if(Ii.isEmptyOrZeroLength(t.password)&&Ii.isEmptyOrZeroLength(t.role)&&Ii.isEmptyOrZeroLength(t.active))throw new Error(Qv);if(!Ii.isEmpty(t.password)&&Ii.isEmptyOrZeroLength(t.password.trim()))throw new Error(jv);if(!Ii.isEmpty(t.active)&&!Ii.isBoolean(t.active))throw new Error(Xv);if(!Ii.isEmpty(t.password)&&!Ii.isEmptyOrZeroLength(t.password.trim())&&(yZ(t.username)&&(t.hash=Ty.encrypt(t.password)),t.password=await s_.hash(t.password,Ey)),t.role==="")throw new Error(Jv);if(t.role){let n=await i_.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["*"]});if(!n||n.length===0)throw new Ks(mu.ALTER_USER_ROLE_NOT_FOUND(t.role),ho.NOT_FOUND);if(n.length>1)throw new Ks(mu.DUP_ROLES_FOUND(t.role),ho.CONFLICT);t.role=n[0].id}let r=await Zv.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await Gc(),gy.signalUserChange(new Ay(process.pid)),r}a(RZ,"alterUser");function yZ(e){let t=!1,r=Ci.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}a(yZ,"isClusterUser");async function bZ(e){let t=eU.dropUserValidation(e);if(t)throw new Ks(t.message);if(Ci.get(e.username)===void 0)throw new Ks(mu.USER_NOT_EXIST(e.username),ho.NOT_FOUND);let r=await TZ({table:"hdb_user",schema:"system",hash_values:[e.username]});return Sy.debug(r),await Gc(),gy.signalUserChange(new Ay(process.pid)),`${e.username} successfully deleted`}a(bZ,"dropUser");async function OZ(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=py.cloneDeep(e.hdb_user);let r=await i_.searchByHash({schema:"system",table:"hdb_role",hash_values:[t.role.id],get_attributes:["*"]});return t.role=r[0],delete t.password,delete t.refresh_token,delete t.hash,delete t.hash_function,t}a(OZ,"userInfo");async function NZ(){let e=await Yp();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}a(NZ,"listUsersExternal");async function Yp(){let e=await i_.searchByValue({schema:"system",table:"hdb_role",search_value:"*",search_attribute:"role",get_attributes:["*"]}),t={};for(let s of e)t[s.id]=py.cloneDeep(s);if(Object.keys(t).length===0)return null;let r=await i_.searchByValue({schema:"system",table:"hdb_user",search_value:"*",search_attribute:"username",get_attributes:["*"]}),n=new Map;for(let s of r)s=py.cloneDeep(s),s.role=t[s.role],wZ(s.role),n.set(s.username,s);return n}a(Yp,"listUsers");function wZ(e){if(!e){Sy.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(EZ)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}a(wZ,"appendSystemTablesToRole");async function Gc(e=void 0){e?Ci=e:Ci=await Yp()}a(Gc,"setUsersWithRolesCache");async function IZ(){return Ci||await Gc(),Ci}a(IZ,"getUsersWithRolesCache");async function Ry(e,t,r=!0){Ci||await Gc();let n=Ci.get(e);if(!n){if(!r)return{username:e};throw new Ks(hy.GENERIC_AUTH_FAIL,ho.UNAUTHORIZED)}if(n&&!n.active)throw new Ks(hy.USER_INACTIVE,ho.UNAUTHORIZED);let s={active:n.active,username:n.username};if(n.refresh_token&&(s.refresh_token=n.refresh_token),n.role&&(s.role=n.role),r===!0){if(Wv.get(t)===n.password)return s;{let i=s_.validate(n.password,t,n.hash_function||s_.HASH_FUNCTION.MD5);if(i?.then&&(i=await i),i===!0)Wv.set(t,n.password);else throw new Ks(hy.GENERIC_AUTH_FAIL,ho.UNAUTHORIZED)}}return s}a(Ry,"findAndValidateUser");async function CZ(){Ci||await Gc();for(let[,e]of Ci)if(e.role.role==="super_user")return e}a(CZ,"getSuperUser");async function PZ(){let e=await Yp(),t=mZ.getConfigFromFile(my.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==my.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=Ty.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+Yv.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+Yv.SERVER_SUFFIX.ADMIN,r}a(PZ,"getClusterUser");var nU=[];Kp.invalidateUser=function(e){for(let t of nU)try{t(e)}catch(r){SZ.error("Error invalidating user",r)}};Kp.onInvalidatedUser=function(e){nU.push(e)}});var a_=C((lbe,aU)=>{"use strict";var qc=ee(),Yn=(k(),P(q)),DZ=TM(),abe=$s(),cbe=_o(),LZ=Kn(),{validateEvent:sU}=Ys(),o_=qn(),MZ=require("process"),{resetDatabases:vZ}=(xe(),P(ct)),UZ={[Yn.ITC_EVENT_TYPES.SCHEMA]:xZ,[Yn.ITC_EVENT_TYPES.USER]:oU};async function xZ(e){let t=sU(e);if(t){qc.error(t);return}qc.trace("ITC schemaHandler received schema event:",e),await DZ(e.message),await BZ(e.message)}a(xZ,"schemaHandler");async function BZ(e){try{o_.resetReadTxn(Yn.SYSTEM_SCHEMA_NAME,Yn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),o_.resetReadTxn(Yn.SYSTEM_SCHEMA_NAME,Yn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),o_.resetReadTxn(Yn.SYSTEM_SCHEMA_NAME,Yn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=vZ();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){qc.error(t)}}a(BZ,"syncSchemaMetadata");var iU=[];async function oU(e){try{try{o_.resetReadTxn(Yn.SYSTEM_SCHEMA_NAME,Yn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),o_.resetReadTxn(Yn.SYSTEM_SCHEMA_NAME,Yn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){qc.warn(r)}let t=sU(e);if(t){qc.error(t);return}qc.trace(`ITC userHandler ${Yn.HDB_ITC_CLIENT_PREFIX}${MZ.pid} received user event:`,e),await LZ.setUsersWithRolesCache();for(let r of iU)r()}catch(t){qc.error(t)}}a(oU,"userHandler");oU.addListener=function(e){iU.push(e)};aU.exports=UZ});var Ys=C((mbe,lU)=>{"use strict";var dbe=ee(),yy=ie(),HZ=(k(),P(q)),{ITC_ERRORS:c_}=Un(),{parentPort:fbe,threadId:kZ,isMainThread:FZ,workerData:_be}=require("worker_threads"),{onMessageFromWorkers:GZ,broadcast:hbe,broadcastWithAcknowledgement:qZ}=it();lU.exports={sendItcEvent:$Z,validateEvent:cU,SchemaEventMsg:VZ,UserEventMsg:KZ};var Wp;GZ(async(e,t)=>{Wp=Wp||a_(),cU(e),Wp[e.type]&&await Wp[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function $Z(e){return!FZ&&e.message&&(e.message.originator=kZ),qZ(e)}a($Z,"sendItcEvent");function cU(e){if(typeof e!="object")return c_.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||yy.isEmpty(e.type))return c_.MISSING_TYPE;if(!e.hasOwnProperty("message")||yy.isEmpty(e.message))return c_.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||yy.isEmpty(e.message.originator))return c_.MISSING_ORIGIN;if(HZ.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return c_.INVALID_EVENT(e.type)}a(cU,"validateEvent");function VZ(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(VZ,"SchemaEventMsg");function KZ(e){this.originator=e}a(KZ,"UserEventMsg")});var mo=C((gbe,_U)=>{"use strict";var uU=(k(),P(q)),Ebe=ie(),zp=ee(),dU=EM(),pu,{sendItcEvent:fU}=Ys();function YZ(e){try{zp.info("signalSchemaChange called with message:",e),pu=pu||a_();let t=new dU(uU.ITC_EVENT_TYPES.SCHEMA,e);return pu.schema(t),fU(t)}catch(t){zp.error(t)}}a(YZ,"signalSchemaChange");function WZ(e){try{zp.trace("signalUserChange called with message:",e),pu=pu||a_();let t=new dU(uU.ITC_EVENT_TYPES.USER,e);return pu.user(t),fU(t)}catch(t){zp.error(t)}}a(WZ,"signalUserChange");_U.exports={signalSchemaChange:YZ,signalUserChange:WZ}});var Qp=C((Tbe,mU)=>{"use strict";var hU=ie(),zZ=(k(),P(q)),QZ=ee(),jZ=Pp(),JZ=Cp(),XZ=mo(),{SchemaEventMsg:ZZ}=Ys(),e8="already exists in";mU.exports=t8;async function t8(e,t,r){if(hU.isEmptyOrZeroLength(r))return r;let n=[];hU.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 r8(e,t.schema,t.name,i)})),s}a(t8,"lmdbCheckForNewAttributes");async function r8(e,t,r,n){let s=new JZ(t,r,n,void 0,!0);e&&(s.hdb_auth_header=e);try{await n8(s)}catch(i){if(typeof i=="object"&&i.message!==void 0&&i.message.includes(e8))QZ.warn(`attribute ${t}.${r}.${n} already exists`);else throw i}}a(r8,"createNewAttribute");async function n8(e){let t;return t=await jZ(e),XZ.signalSchemaChange(new ZZ(process.pid,zZ.OPERATIONS_ENUM.CREATE_ATTRIBUTE,e.schema,e.table,e.attribute)),t}a(n8,"createAttribute")});var Eu=C((Rbe,pU)=>{"use strict";var by=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}};pU.exports=by});var gU=C((bbe,EU)=>{"use strict";var s8=Eu(),i8=(k(),P(q)).OPERATIONS_ENUM,Oy=class extends s8{static{a(this,"LMDBInsertTransactionObject")}constructor(t,r,n,s,i=void 0){super(i8.INSERT,r,n,s,i),this.records=t}};EU.exports=Oy});var TU=C((Nbe,SU)=>{"use strict";var o8=Eu(),a8=(k(),P(q)).OPERATIONS_ENUM,Ny=class extends o8{static{a(this,"LMDBUpdateTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(a8.UPDATE,n,s,i,o),this.records=t,this.original_records=r}};SU.exports=Ny});var RU=C((Ibe,AU)=>{"use strict";var c8=Eu(),l8=(k(),P(q)).OPERATIONS_ENUM,wy=class extends c8{static{a(this,"LMDBUpsertTransactionObject")}constructor(t,r,n,s,i,o=void 0){super(l8.UPSERT,n,s,i,o),this.records=t,this.original_records=r}};AU.exports=wy});var bU=C((Pbe,yU)=>{"use strict";var u8=Eu(),d8=(k(),P(q)).OPERATIONS_ENUM,Iy=class extends u8{static{a(this,"LMDBDeleteTransactionObject")}constructor(t,r,n,s,i=void 0){super(d8.DELETE,n,s,t,i),this.original_records=r}};yU.exports=Iy});var l_=C((Mbe,IU)=>{"use strict";var Lbe=require("path"),OU=_t(),f8=gU(),_8=TU(),h8=RU(),m8=bU(),gu=Gt(),NU=ie(),{CONFIG_PARAMS:p8}=(k(),P(q)),wU=le();wU.initSync();var jp=(k(),P(q)).OPERATIONS_ENUM,{getTransactionAuditStorePath:E8}=gt();IU.exports=g8;async function g8(e,t){if(wU.get(p8.LOGGING_AUDITLOG)===!1)return;let r=E8(e.schema,e.table),n=await OU.openEnvironment(r,e.table,!0),s=S8(e,t);if(!(s===void 0||s.hash_values.length===0)&&n!==void 0){OU.initializeDBIs(n,gu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,gu.TRANSACTIONS_DBIS);let i=s.timestamp;return await n.dbis[gu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].ifNoExists(i,()=>{n.dbis[gu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP].put(i,s),NU.isEmpty(s.user_name)||n.dbis[gu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].put(s.user_name,i);for(let o=0;o<s.hash_values.length;o++)n.dbis[gu.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].put(s.hash_values[o],i)})}}a(g8,"writeTransaction");function S8(e,t){let r=NU.isEmpty(e.hdb_user)?void 0:e.hdb_user?.username;if(e.operation===jp.INSERT)return new f8(e.records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===jp.UPDATE)return new _8(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===jp.UPSERT)return new h8(e.records,t.original_records,r,t.txn_time,t.written_hashes,e.__origin);if(e.operation===jp.DELETE)return new m8(t.deleted,t.original_records,r,t.txn_time,e.__origin)}a(S8,"createTransactionObject")});var Cy=C((xbe,CU)=>{"use strict";var T8=Yf(),Ube=gf(),u_=(k(),P(q)),A8=Sf(),R8=Lc().insertRecords,y8=_t(),b8=ee(),O8=Qp(),{getSchemaPath:N8}=gt(),w8=l_();CU.exports=I8;async function I8(e){try{let{schema_table:t,attributes:r}=T8(e);A8(e,r,t.hash_attribute),e.schema!==u_.SYSTEM_SCHEMA_NAME&&(r.includes(u_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||r.push(u_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),r.includes(u_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||r.push(u_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let n=await O8(e.hdb_auth_header,t,r),s=N8(e.schema,e.table),i=await y8.openEnvironment(s,e.table),o=await R8(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await w8(e,o)}catch(c){b8.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(I8,"lmdbCreateRecords")});var LU=C((Hbe,DU)=>{"use strict";var PU=(k(),P(q)),C8=Cy(),P8=gf(),D8=require("fs-extra"),{getSchemaPath:L8}=gt();DU.exports=M8;async function M8(e){let t=[{name:e.schema,createddate:Date.now()}],r=new P8(PU.SYSTEM_SCHEMA_NAME,PU.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,void 0,t);await C8(r),await D8.mkdirp(L8(e.schema))}a(M8,"lmdbCreateSchema")});var vU=C((Fbe,MU)=>{"use strict";var Py=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}};MU.exports=Py});var HU=C((Kbe,BU)=>{"use strict";var UU=_t(),Dy=un(),Ly=Un().LMDB_ERRORS_ENUM,v8=Gt(),xU=ee(),qbe=ie(),U8=require("lmdb"),x8=vU(),B8=(k(),P(q)),{OVERFLOW_MARKER:$be,MAX_SEARCH_KEY_LENGTH:Vbe}=v8,H8=B8.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;async function k8(e,t,r,n){if(Dy.validateEnv(e),t===void 0)throw new Error(Ly.HASH_ATTRIBUTE_REQUIRED);if(!Array.isArray(r))throw r===void 0?new Error(Ly.IDS_REQUIRED):new Error(Ly.IDS_MUST_BE_ITERABLE);try{let s=UU.listDBIs(e);UU.initializeDBIs(e,t,s);let i=new x8,o,c=[],l=[];for(let _=0,h=r.length;_<h;_++)try{o=r[_];let m=e.dbis[t].get(o);if(!m||n&&m[H8]>n){i.skipped.push(o);continue}let S=e.dbis[t].ifVersion(o,U8.IF_EXISTS,()=>{e.dbis[t].remove(o);for(let g=0;g<s.length;g++){let R=s[g];if(!m.hasOwnProperty(R)||R===t)continue;let E=e.dbis[R],T=m[R];if(T!=null)try{let N=Dy.getIndexedValues(T);if(N)for(let v=0,H=N.length;v<H;v++)E.remove(N[v],o)}catch{xU.warn(`cannot delete from attribute: ${R}, ${T}:${o}`)}}});c.push(S),l.push(o),i.original_records.push(m)}catch(m){xU.warn(m),i.skipped.push(o)}let u=[],f=await Promise.all(c);for(let _=0,h=f.length;_<h;_++)f[_]===!0?i.deleted.push(l[_]):(i.skipped.push(l[_]),u.push(_));let d=0;for(let _=0;_<u.length;_++){let h=u[_];i.original_records.splice(h-d,1),d++}return i.txn_time=Dy.getNextMonotonicTime(),i}catch(s){throw s}}a(k8,"deleteRecords");BU.exports={deleteRecords:k8}});var d_=C((Wbe,FU)=>{"use strict";var Su=ie(),F8=HU(),G8=_t(),{getSchemaPath:q8}=gt(),$8=l_(),V8=ee();FU.exports=K8;async function K8(e,t=!0){let n=global.hdb_schema[e.schema][e.table].hash_attribute;if(Su.isEmpty(n))throw new Error(`could not retrieve hash attribute for schema:${e.schema} and table ${e.table}`);try{if(Su.isEmptyOrZeroLength(e.hash_values)&&!Su.isEmptyOrZeroLength(e.records)){e.hash_values=[];for(let c=0;c<e.records.length;c++){let l=e.records[c][n];Su.isEmpty(l)||e.hash_values.push(l)}}if(Su.isEmptyOrZeroLength(e.hash_values))return kU([],[]);if(!Array.isArray(e.hash_values))throw new Error("hash_values must be an array");if(Su.isEmptyOrZeroLength(e.records)){e.records=[];for(let c=0;c<e.hash_values.length;c++)e.records[c]={[n]:e.hash_values[c]}}let s=q8(e.schema,e.table),i=await G8.openEnvironment(s,e.table),o=await F8.deleteRecords(i,n,e.hash_values,e.__origin?.timestamp);try{t===!0&&await $8(e,o)}catch(c){V8.error(`unable to write transaction due to ${c.message}`)}return kU(o.deleted,o.skipped,o.txn_time)}catch(s){throw s}}a(K8,"lmdbDeleteRecords");function kU(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(kU,"createDeleteResponse")});var vy=C((jbe,GU)=>{"use strict";var Y8=(k(),P(q)),Qbe=un();function My(e,t){let r=Object.create(null);if(t.length===1&&Y8.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(My,"parseRow");function W8(e,t,r,n){let s=My(r,e);n.push(s)}a(W8,"searchAll");function z8(e,t,r,n){let s=My(r,e);n[t]=s}a(z8,"searchAllToMap");function Q8(e,t,r){r[e]===void 0&&(r[e]=[]),r[e].push(t)}a(Q8,"iterateDBI");function $c(e,t,r,n,s){let i=Object.create(null);i[s]=e;let o;n===s?o=e:(o=t,n!==void 0&&(i[n]=o)),r[0].push(o),r[1].push(i)}a($c,"pushResults");function j8(e,t,r,n,s,i){t.toString().endsWith(e)&&$c(t,r,n,s,i)}a(j8,"endsWith");function J8(e,t,r,n,s,i){t.toString().includes(e)&&$c(t,r,n,s,i)}a(J8,"contains");function X8(e,t,r,n,s,i){t>e&&$c(t,r,n,s,i)}a(X8,"greaterThanCompare");function Z8(e,t,r,n,s,i){t>=e&&$c(t,r,n,s,i)}a(Z8,"greaterThanEqualCompare");function e5(e,t,r,n,s,i){t<e&&$c(t,r,n,s,i)}a(e5,"lessThanCompare");function t5(e,t,r,n,s,i){t<=e&&$c(t,r,n,s,i)}a(t5,"lessThanEqualCompare");GU.exports={parseRow:My,searchAll:W8,searchAllToMap:z8,iterateDBI:Q8,endsWith:j8,contains:J8,greaterThanCompare:X8,greaterThanEqualCompare:Z8,lessThanCompare:e5,lessThanEqualCompare:t5,pushResults:$c}});var Tu=C((tOe,zU)=>{"use strict";var ha=_t(),Xbe=ee(),Wn=un(),Jp=Gt(),Qt=Un().LMDB_ERRORS_ENUM,Zbe=ie(),r5=(k(),P(q)),Xp=vy(),{parseRow:n5}=Xp,eOe=require("lmdb"),{OVERFLOW_MARKER:qU,MAX_SEARCH_KEY_LENGTH:s5}=Jp;function $U(e,t,r,n=!1,s=void 0,i=void 0){return Vc(e,t,r,(o,c)=>c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}))}a($U,"iterateFullIndex");function f_(e,t,r,n,s,i=!1,o=void 0,c=void 0,l=!1,u=!1){return Vc(e,t,r,(f,d,_,h)=>{let E={transaction:f,start:i===!0?s:n,end:i===!0?n:s,reverse:i,limit:o,offset:c,inclusiveEnd:i===!0?!l:!u,exclusiveStart:i===!0?u:l};return h===r?(E.values=!1,d.getRange(E).map(T=>({value:T}))):d.getRange(E)})}a(f_,"iterateRangeBetween");function Vc(e,t,r,n){let s=e.database||e,i=ha.openDBI(s,r);i[Jp.DBI_DEFINITION_NAME].is_hash_attribute?t=r:t&&ha.openDBI(s,t);let o;e.database?o=e:(o=e.useReadTransaction(),o.database=e);let c=n(o,i,s,t);return c.transaction=o,e.database||(c.onDone=()=>{o.done()}),c}a(Vc,"setupTransaction");function VU(e,t,r,n){let s;return function(i,o){if(typeof i=="string"&&i.endsWith(qU)){if(!s)if(r)s=ha.openDBI(e,r);else{let l=ha.listDBIs(e);for(let u=0,f=l.length;u<f&&(s=ha.openDBI(e,l[u]),!s[Jp.DBI_DEFINITION_NAME].is_hash_attribute);u++);}i=s.get(o,{transaction:t,lazy:!0})[n]}return i}}a(VU,"getOverflowCheck");function i5(e,t,r,n=!1,s=void 0,i=void 0){if(Wn.validateEnv(e),t===void 0)throw new Error(Qt.HASH_ATTRIBUTE_REQUIRED);return Vc(e,t,t,(o,c,l)=>(Zp(r),r=__(l,r),c.getRange({transaction:o,start:n?void 0:!1,end:n?!1:void 0,limit:s,offset:i,reverse:n}).map(u=>n5(u.value,r))))}a(i5,"searchAll");function o5(e,t,r,n=!1,s=void 0,i=void 0){if(Wn.validateEnv(e),t===void 0)throw new Error(Qt.HASH_ATTRIBUTE_REQUIRED);Zp(r),r=__(e.database||e,r);let o=new Map;for(let{key:c,value:l}of $U(e,t,t,n,s,i))o.set(c,Xp.parseRow(l,r));return o}a(o5,"searchAllToMap");function a5(e,t,r=!1,n=void 0,s=void 0){if(Wn.validateEnv(e),t===void 0)throw new Error(Qt.ATTRIBUTE_REQUIRED);let i=Object.create(null),o=$U(e,void 0,t,r,n,s),c=o.transaction,l=VU(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(a5,"iterateDBI");function c5(e,t){if(Wn.validateEnv(e),t===void 0)throw new Error(Qt.HASH_ATTRIBUTE_REQUIRED);return ha.statDBI(e,t).entryCount}a(c5,"countAll");function l5(e,t,r,n,s=!1,i=void 0,o=void 0){return ma(e,r,n),Vc(e,t,r,(c,l,u,f)=>(n=Wn.convertKeyValueToWrite(n),f===r?l.get(n,{transaction:c,lazy:!0})===void 0?[]:[{key:n,value:n}]:l.getValues(n,{transaction:c,reverse:s,limit:i,offset:o}).map(d=>({key:n,value:d}))))}a(l5,"equals");function u5(e,t,r){return ma(e,t,r),ha.openDBI(e,t).getValuesCount(r)}a(u5,"count");function d5(e,t,r,n,s=!1,i=void 0,o=void 0){return ma(e,r,n),Vc(e,null,r,(c,l)=>{n=Wn.convertKeyValueToWrite(n);let u=!0;typeof n=="number"&&(u=!1);let f;if(s===!0){let d;for(let _ of l.getKeys({transaction:c,start:n}))if(!_.startsWith(n)){d=_;break}return d!==void 0&&(Number.isInteger(o)?o++:i++),f=l.getRange({transaction:c,start:d,end:void 0,reverse:s,limit:i,offset:o}).map(_=>{let{key:h}=_;if(h!==d){if(h.toString().startsWith(n))return _;if(u===!0)return f.DONE}}),f.filter(_=>_)}else return f=l.getRange({transaction:c,start:n,reverse:s,limit:i,offset:o}).map(d=>{if(d.key.toString().startsWith(n))return d;if(u===!0)return f.DONE}),u?f:f.filter(d=>d)})}a(d5,"startsWith");function f5(e,t,r,n,s=!1,i=void 0,o=void 0){return KU(e,t,r,n,s,i,o,!0)}a(f5,"endsWith");function KU(e,t,r,n,s=!1,i=void 0,o=void 0,c=!1){return ma(e,r,n),Vc(e,null,r,(l,u,f,d)=>{let _=VU(f,l,d,r);return o=Number.isInteger(o)?o:0,u.getKeys({transaction:l,end:s?!1:void 0,reverse:s}).flatMap(h=>{let m=h.toString();return m.endsWith(qU)?u.getValues(h,{transaction:l}).map(S=>{let g=_(h,S);if(c?g.endsWith(n):g.includes(n))return{key:g,value:S}}).filter(S=>S):(c?m.endsWith(n):m.includes(n))?u[Jp.DBI_DEFINITION_NAME].is_hash_attribute?{key:h,value:h}:u.getValues(h,{transaction:l}).map(S=>({key:h,value:S})):[]}).slice(o,i===void 0?void 0:i+(o||0))})}a(KU,"contains");function _5(e,t,r,n,s=!1,i=void 0,o=void 0){ma(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),f_(e,t,r,n,l,s,i,o,!0,!1)}a(_5,"greaterThan");function h5(e,t,r,n,s=!1,i=void 0,o=void 0){ma(e,r,n);let c=typeof n,l;return c==="string"?l="\uFFFF":c==="number"?l=1/0:c==="boolean"&&(l=!0),f_(e,t,r,n,l,s,i,o,!1,!1)}a(h5,"greaterThanEqual");function m5(e,t,r,n,s=!1,i=void 0,o=void 0){ma(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),f_(e,t,r,l,n,s,i,o,!1,!0)}a(m5,"lessThan");function p5(e,t,r,n,s=!1,i=void 0,o=void 0){ma(e,r,n);let c=typeof n,l;return c==="string"?l="\0":c==="number"?l=-1/0:c==="boolean"&&(l=!1),f_(e,t,r,l,n,s,i,o,!1,!1)}a(p5,"lessThanEqual");function E5(e,t,r,n,s,i=!1,o=void 0,c=void 0){if(Wn.validateEnv(e),r===void 0)throw new Error(Qt.ATTRIBUTE_REQUIRED);if(n===void 0)throw new Error(Qt.START_VALUE_REQUIRED);if(s===void 0)throw new Error(Qt.END_VALUE_REQUIRED);if(n=Wn.convertKeyValueToWrite(n),s=Wn.convertKeyValueToWrite(s),n>s)throw new Error(Qt.END_VALUE_MUST_BE_GREATER_THAN_START_VALUE);return f_(e,t,r,n,s,i,o,c)}a(E5,"between");function g5(e,t,r,n){Wn.validateEnv(e);let s=e.database||e,i=e.database?e:null;if(t===void 0)throw new Error(Qt.HASH_ATTRIBUTE_REQUIRED);if(Zp(r),r=__(s,r),n===void 0)throw new Error(Qt.ID_REQUIRED);let o=null,c=s.dbis[t].get(n,{transaction:i,lazy:r.length<3});return c&&(o=Xp.parseRow(c,r)),o}a(g5,"searchByHash");function S5(e,t,r){Wn.validateEnv(e);let n=e.database||e,s=e.database?e:null;if(t===void 0)throw new Error(Qt.HASH_ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(Qt.ID_REQUIRED);let i=!0;return n.dbis[t].get(r,{transaction:s,lazy:!0})===void 0&&(i=!1),i}a(S5,"checkHashExists");function T5(e,t,r,n,s=[]){return WU(e,t,r,n,s),YU(e,t,r,n,s).map(i=>i[1])}a(T5,"batchSearchByHash");function A5(e,t,r,n,s=[]){WU(e,t,r,n,s);let i=new Map;for(let[o,c]of YU(e,t,r,n,s))i.set(o,c);return i}a(A5,"batchSearchByHashToMap");function YU(e,t,r,n,s=[]){return Vc(e,t,t,(i,o,c)=>{r=__(c,r);let l=r.length<3;return n.map(u=>{let f=c.dbis[t].get(u,{transaction:i,lazy:l});if(f)return[u,Xp.parseRow(f,r)];s.push(u)}).filter(u=>u)})}a(YU,"batchHashSearch");function WU(e,t,r,n,s){if(Wn.validateEnv(e),t===void 0)throw new Error(Qt.HASH_ATTRIBUTE_REQUIRED);if(Zp(r),n==null)throw new Error(Qt.IDS_REQUIRED);if(!n[Symbol.iterator])throw new Error(Qt.IDS_MUST_BE_ITERABLE)}a(WU,"initializeBatchSearchByHash");function Zp(e){if(!Array.isArray(e))throw e===void 0?new Error(Qt.FETCH_ATTRIBUTES_REQUIRED):new Error(Qt.FETCH_ATTRIBUTES_MUST_BE_ARRAY)}a(Zp,"validateFetchAttributes");function ma(e,t,r){if(Wn.validateEnv(e),t===void 0)throw new Error(Qt.ATTRIBUTE_REQUIRED);if(r===void 0)throw new Error(Qt.SEARCH_VALUE_REQUIRED);if(r?.length>s5)throw new Error(Qt.SEARCH_VALUE_TOO_LARGE)}a(ma,"validateComparisonFunctions");function __(e,t){return t.length===1&&r5.SEARCH_WILDCARDS.indexOf(t[0])>=0&&(t=ha.listDBIs(e)),t}a(__,"setGetWholeRowAttributes");zU.exports={searchAll:i5,searchAllToMap:o5,count:u5,countAll:c5,equals:l5,startsWith:d5,endsWith:f5,contains:KU,searchByHash:g5,setGetWholeRowAttributes:__,batchSearchByHash:T5,batchSearchByHashToMap:A5,checkHashExists:S5,iterateDBI:a5,greaterThan:_5,greaterThanEqual:h5,lessThan:m5,lessThanEqual:p5,between:E5}});var Au=C((nOe,ZU)=>{var QU=require("lodash"),jU=ot(),qe=require("joi"),R5=ie(),{hdb_schema_table:h_,checkValidTable:JU,hdb_table:XU,hdb_database:eE}=bi(),{handleHDBError:y5,hdb_errors:b5}=he(),{getDatabases:O5}=(xe(),P(ct)),{HTTP_STATUS_CODES:N5}=b5,w5=qe.object({database:eE,schema:eE,table:XU,search_attribute:h_,search_value:qe.any().required(),get_attributes:qe.array().min(1).items(qe.alternatives(h_,qe.object())).optional(),desc:qe.bool(),limit:qe.number().integer().min(1),offset:qe.number().integer().min(0)}),I5=qe.object({database:eE,schema:eE,table:XU,operator:qe.string().valid("and","or").default("and").lowercase(),offset:qe.number().integer().min(0),limit:qe.number().integer().min(1),get_attributes:qe.array().min(1).items(qe.alternatives(h_,qe.object())).optional(),sort:qe.object({attribute:qe.alternatives(h_,qe.array().min(1)),descending:qe.bool().optional()}).optional(),conditions:qe.array().min(1).items(qe.alternatives(qe.object({operator:qe.string().valid("and","or").default("and").lowercase(),conditions:qe.array()}),qe.object({search_attribute:qe.alternatives(h_,qe.array().min(1)),search_type:qe.string().valid("equals","contains","starts_with","ends_with","greater_than","greater_than_equal","less_than","less_than_equal","between","not_equal").optional(),search_value:qe.when("search_type",{switch:[{is:"equals",then:qe.any()},{is:"between",then:qe.array().items(qe.alternatives([qe.string(),qe.number()])).length(2)}],otherwise:qe.alternatives(qe.string(),qe.number())}).required()}))).required()});ZU.exports=function(e,t){let r=null;switch(t){case"value":r=jU.validateBySchema(e,w5);break;case"hashes":let i=function(o){s?s+=". "+o:s=o};var n=i;a(i,"addError");let s;i(JU("database",e.schema)),i(JU("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=jU.validateBySchema(e,I5);break;default:throw new Error(`Error validating search, unknown type: ${t}`)}if(!r&&e.schema!=="system"){let s=R5.checkGlobalSchemaTable(e.schema,e.table);if(s)return y5(new Error,s,N5.NOT_FOUND);let o=O5()[e.schema][e.table].attributes,c=e.get_attributes?[...e.get_attributes]:[];t==="value"&&c.push(e.search_attribute);let l=a(f=>{for(let d=0,_=f.conditions.length;d<_;d++){let h=f.conditions[d];h.conditions?l(h):c.push(h.search_attribute)}},"addConditions");t==="conditions"&&l(e);let u=QU.filter(c,f=>f!=="*"&&!f.startsWith?.("$")&&f.attribute!=="*"&&!Array.isArray(f)&&!f.name&&!QU.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 Uy=C((iOe,e0)=>{"use strict";var C5=_t(),P5=Au(),{getSchemaPath:D5}=gt();e0.exports=L5;function L5(e){let t=P5(e,"hashes");if(t)throw t;let r=D5(e.schema,e.table);return C5.openEnvironment(r,e.table)}a(L5,"initialize")});var xy=C((aOe,t0)=>{"use strict";var M5=Tu(),v5=Uy();t0.exports=U5;async function U5(e){let t=await v5(e),r=t.useReadTransaction();r.database=t;let n=global.hdb_schema[e.schema][e.table];try{return M5.batchSearchByHashToMap(r,n.hash_attribute,e.get_attributes,e.hash_values)}finally{r.done()}}a(U5,"lmdbGetDataByHash")});var Ru=C((lOe,r0)=>{"use strict";var By=class{static{a(this,"SearchByHashObject")}constructor(t,r,n,s){this.schema=t,this.table=r,this.hash_values=n,this.get_attributes=s}};r0.exports=By});var s0=C((fOe,n0)=>{"use strict";var dOe=Ru(),x5=Tu(),B5=Uy();n0.exports=H5;async function H5(e){let t=await B5(e),r=global.hdb_schema[e.schema][e.table];return x5.batchSearchByHash(t,r.hash_attribute,e.get_attributes,e.hash_values)}a(H5,"lmdbSearchByHash")});var Ws=C((hOe,i0)=>{"use strict";var Hy=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}};i0.exports=Hy});var tE=C((pOe,d0)=>{"use strict";var Qr=Tu(),k5=_t(),F5=ie(),$e=Gt(),Kc=(k(),P(q)),G5=co(),o0=Un().LMDB_ERRORS_ENUM,{getSchemaPath:q5}=gt(),po=Kc.SEARCH_WILDCARDS;async function $5(e,t,r){let n;e.schema===Kc.SYSTEM_SCHEMA_NAME?n=G5[e.table]:n=global.hdb_schema[e.schema][e.table];let s=u0(e,n.hash_attribute,r,t);return c0(e,s,n.hash_attribute,r)}a($5,"prepSearch");async function c0(e,t,r,n){let s=q5(e.schema,e.table),i=await k5.openEnvironment(s,e.table),o=l0(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(V5(e,r)===!1){let f=e.search_attribute;if(f===r)return n?a0(o,()=>!0):o.map(_=>({[r]:_.key}));let d=a(_=>({[r]:_.value,[f]:_.key}),"toObject");return n?a0(o,d):o.map(d)}let u=e.search_attribute===r?o.map(f=>f.key):o.map(f=>f.value);return n===!0?Qr.batchSearchByHashToMap(c,r,e.get_attributes,u):Qr.batchSearchByHash(c,r,e.get_attributes,u)}a(c0,"executeSearch");function l0(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=Qr.equals(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.CONTAINS:s=Qr.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=Qr.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=Qr.startsWith(e,i,t.search_attribute,t.search_value,o,c,l);break;case $e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH:return Qr.batchSearchByHash(e,t.search_attribute,t.get_attributes,[t.search_value]);case $e.SEARCH_TYPES.BATCH_SEARCH_BY_HASH_TO_MAP:return Qr.batchSearchByHashToMap(e,t.search_attribute,t.get_attributes,[t.search_value]);case $e.SEARCH_TYPES.SEARCH_ALL:return Qr.searchAll(e,n,t.get_attributes,o,c,l);case $e.SEARCH_TYPES.SEARCH_ALL_TO_MAP:return Qr.searchAllToMap(e,n,t.get_attributes,o,c,l);case $e.SEARCH_TYPES.BETWEEN:s=Qr.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=Qr.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=Qr.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=Qr.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=Qr.lessThanEqual(e,i,t.search_attribute,t.search_value,o,c,l);break;default:return Object.create(null)}return s}a(l0,"searchByType");function a0(e,t){let r=new Map;for(let n of e)r.set(n.value,t(n));return r}a(a0,"createMapFromIterable");function V5(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(V5,"checkToFetchMore");function u0(e,t,r,n){if(F5.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(o0.UNKNOWN_SEARCH_TYPE)}else switch(n){case Kc.VALUE_SEARCH_COMPARATORS.BETWEEN:return $e.SEARCH_TYPES.BETWEEN;case Kc.VALUE_SEARCH_COMPARATORS.GREATER:return $e.SEARCH_TYPES.GREATER_THAN;case Kc.VALUE_SEARCH_COMPARATORS.GREATER_OR_EQ:return $e.SEARCH_TYPES.GREATER_THAN_EQUAL;case Kc.VALUE_SEARCH_COMPARATORS.LESS:return $e.SEARCH_TYPES.LESS_THAN;case Kc.VALUE_SEARCH_COMPARATORS.LESS_OR_EQ:return $e.SEARCH_TYPES.LESS_THAN_EQUAL;default:throw new Error(o0.UNKNOWN_SEARCH_TYPE)}}a(u0,"createSearchTypeFromSearchObject");d0.exports={executeSearch:c0,createSearchTypeFromSearchObject:u0,prepSearch:$5,searchByType:l0}});var _0=C((SOe,f0)=>{"use strict";var gOe=Ws(),K5=Au(),Y5=ie(),W5=(k(),P(q)),z5=tE();f0.exports=Q5;function Q5(e,t){if(!Y5.isEmpty(t)&&W5.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=K5(e,"value");if(n)throw n;return z5.prepSearch(e,t,!0)}a(Q5,"lmdbGetDataByValue")});var m_=C((ROe,h0)=>{"use strict";var AOe=Ws(),j5=Au(),J5=ie(),X5=(k(),P(q)),Z5=tE();h0.exports=e9;async function e9(e,t){if(!J5.isEmpty(t)&&X5.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[t]===void 0)throw new Error(`Value search comparator - ${t} - is not valid`);let n=j5(e,"value");if(n)throw n;return Z5.prepSearch(e,t,!1)}a(e9,"lmdbSearchByValue")});var p0=C((OOe,m0)=>{"use strict";var bOe=Gt(),ky=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}},Fy=class{static{a(this,"SearchCondition")}constructor(t,r,n){this.search_attribute=t,this.search_type=r,this.search_value=n}},Gy=class{static{a(this,"SortAttribute")}constructor(t,r){this.attribute=t,this.desc=r}};m0.exports={SearchByConditionsObject:ky,SearchCondition:Fy,SortAttribute:Gy}});var A0=C((COe,T0)=>{"use strict";var wOe=p0().SearchByConditionsObject,t9=Ws(),r9=Au(),qy=Tu(),rE=Gt(),{Resource:IOe}=(na(),P(vA)),S0=tE(),n9=vy(),s9=require("lodash"),{getSchemaPath:i9}=gt(),E0=_t(),{handleHDBError:o9,hdb_errors:a9}=he(),{HTTP_STATUS_CODES:c9}=a9,l9=1e8;T0.exports=u9;async function u9(e){let t=r9(e,"conditions");if(t)throw o9(t,t.message,c9.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=i9(e.schema,e.table),n=await E0.openEnvironment(r,e.table),s=global.hdb_schema[e.schema][e.table];for(let u of e.conditions)E0.openDBI(n,u.search_attribute);let i=s9.sortBy(e.conditions,u=>{if(u.estimated_count===void 0){let f=u.search_type;f===rE.SEARCH_TYPES.EQUALS?u.estimated_count=qy.count(n,u.search_attribute,u.search_value):f===rE.SEARCH_TYPES.CONTAINS||f===rE.SEARCH_TYPES.ENDS_WITH?u.estimated_count=1/0:u.estimated_count=l9}return u.estimated_count}),o=n.useReadTransaction();o.database=n;let c=await g0(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(S0.filterByType),d=f.length,_=qy.setGetWholeRowAttributes(n,e.get_attributes);l=c.map(h=>u.get(h,{transaction:o,lazy:!0})),d>0&&(l=l.filter(h=>{for(let m=0;m<d;m++)if(!f[m](h))return!1;return!0})),(e.offset||e.limit!==void 0)&&(l=l.slice(e.offset,e.limit!==void 0?(e.offset||0)+e.limit:void 0)),l=l.map(h=>n9.parseRow(h,_))}else{for(let d=1;d<i.length;d++){let _=i[d],h=await g0(o,e,_,s.hash_attribute);c=c.concat(h)}let u=new Set,f=e.offset||0;c=c.filter(d=>u.has(d)?!1:(u.add(d),!0)).slice(f,e.limit&&e.limit+f),l=qy.batchSearchByHash(o,s.hash_attribute,e.get_attributes,c)}return l.onDone=()=>{o.done()},l}a(u9,"lmdbSearchByConditions");async function g0(e,t,r,n){let s=new t9(t.schema,t.table,void 0,void 0,n,t.get_attributes),i=r.search_type;return s.search_attribute=r.search_attribute,i===rE.SEARCH_TYPES.BETWEEN?(s.search_value=r.search_value[0],s.end_value=r.search_value[1]):s.search_value=r.search_value,S0.searchByType(e,s,i,n).map(o=>o.value)}a(g0,"executeConditionSearch")});var p_=C((DOe,R0)=>{"use strict";var d9=(k(),P(q)).OPERATIONS_ENUM,$y=class{static{a(this,"DeleteObject")}constructor(t,r,n,s=void 0){this.operation=d9.DELETE,this.schema=t,this.table=r,this.hash_values=n,this.__origin=s}};R0.exports=$y});var Vy=C((MOe,P0)=>{"use strict";var N0=Ws(),w0=p_(),I0=m_(),C0=d_(),Rn=(k(),P(q)),y0=ie(),b0=_t(),{getTransactionAuditStorePath:f9,getSchemaPath:_9}=gt(),O0=ee();P0.exports=h9;async function h9(e){try{if(y0.isEmpty(global.hdb_schema[e.schema])||y0.isEmpty(global.hdb_schema[e.schema][e.table]))throw new Error(`unknown schema:${e.schema} and table ${e.table}`);await m9(e),await p9(e);let t=_9(e.schema,e.table);try{await b0.deleteEnvironment(t,e.table)}catch(r){if(r.message==="invalid environment")O0.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}try{let r=f9(e.schema,e.table);await b0.deleteEnvironment(r,e.table,!0)}catch(r){if(r.message==="invalid environment")O0.warn(`cannot delete environment for ${e.schema}.${e.table}, environment not found`);else throw r}}catch(t){throw t}}a(h9,"lmdbDropTable");async function m9(e){let t=new N0(Rn.SYSTEM_SCHEMA_NAME,Rn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r=Array.from(await I0(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 w0(Rn.SYSTEM_SCHEMA_NAME,Rn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,n);await C0(s)}a(m9,"deleteAttributesFromSystem");async function p9(e){let t=new N0(Rn.SYSTEM_SCHEMA_NAME,Rn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,e.table,void 0,[Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,Rn.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),r,n;try{r=Array.from(await I0(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 w0(Rn.SYSTEM_SCHEMA_NAME,Rn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,[n.id]);try{await C0(s)}catch(i){throw i}}a(p9,"dropTableFromSystem")});var L0=C((UOe,D0)=>{"use strict";var E9=require("fs-extra"),g9=Ws(),S9=Ru(),T9=p_(),A9=Vy(),R9=d_(),y9=xy(),b9=m_(),Eo=(k(),P(q)),{getSchemaPath:O9}=gt(),{handleHDBError:N9,hdb_errors:w9}=he(),{HDB_ERROR_MSGS:I9,HTTP_STATUS_CODES:C9}=w9;D0.exports=P9;async function P9(e){let t;try{t=await D9(e.schema);let r=new g9(Eo.SYSTEM_SCHEMA_NAME,Eo.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,Eo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,t,void 0,[Eo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),n=Array.from(await b9(r));for(let o=0;o<n.length;o++){let c={schema:t,table:n[o].name};try{await A9(c)}catch(l){if(l.message!=="invalid environment")throw l}}let s=new T9(Eo.SYSTEM_SCHEMA_NAME,Eo.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[t]);await R9(s);let i=O9(t);await E9.remove(i)}catch(r){throw r}}a(P9,"lmdbDropSchema");async function D9(e){let t=new S9(Eo.SYSTEM_SCHEMA_NAME,Eo.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,[e],[Eo.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]),r,n;try{r=Array.from(await y9(t))}catch(s){throw s}for(let[,s]of r)s.name===e&&(n=e);if(!n)throw N9(new Error,I9.SCHEMA_NOT_FOUND(e),C9.NOT_FOUND,void 0,void 0,!0);return n}a(D9,"validateDropSchema")});var E_=C((BOe,M0)=>{"use strict";var Ky=class{static{a(this,"CreateTableObject")}constructor(t,r,n){this.schema=t,this.table=r,this.hash_attribute=n}};M0.exports=Ky});var Wy=C((FOe,v0)=>{"use strict";var L9=require("fs-extra"),nE=_t(),{getTransactionAuditStorePath:M9}=gt(),Yy=Gt(),kOe=E_();v0.exports=v9;async function v9(e){let t;try{let r=M9(e.schema,e.table);await L9.mkdirp(r),t=await nE.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{nE.createDBI(t,Yy.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,!1,!0),nE.createDBI(t,Yy.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,!0,!1),nE.createDBI(t,Yy.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(v9,"createTransactionsAuditEnvironment")});var B0=C(($Oe,x0)=>{"use strict";var zy=(k(),P(q)),U0=_t(),U9=Lc(),{getSystemSchemaPath:x9,getSchemaPath:B9}=gt(),qOe=co(),H9=Pp(),Qy=Cp(),k9=ee(),F9=Wy();x0.exports=G9;async function G9(e,t){let r=B9(t.schema,t.table),n=new Qy(t.schema,t.table,zy.TIME_STAMP_NAMES_ENUM.CREATED_TIME,void 0,!0),s=new Qy(t.schema,t.table,zy.TIME_STAMP_NAMES_ENUM.UPDATED_TIME,void 0,!0),i=new Qy(t.schema,t.table,t.hash_attribute,void 0,!1,!0);try{if(await U0.createEnvironment(r,t.table),e!==void 0){let o=await U0.openEnvironment(x9(),zy.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME);await U9.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 jy(n),await jy(s),await jy(i)}await F9(t)}catch(o){throw o}}a(G9,"lmdbCreateTable");async function jy(e){try{await H9(e)}catch(t){k9.warn(`failed to create attribute ${e.attribute} due to ${t.message}`)}}a(jy,"createAttribute")});var k0=C((KOe,H0)=>{"use strict";var q9=Yf(),$9=Sf(),V9=Qp(),g_=(k(),P(q)),K9=Lc().updateRecords,Y9=_t(),{getSchemaPath:W9}=gt(),z9=l_(),Q9=ee();H0.exports=j9;async function j9(e){try{let{schema_table:t,attributes:r}=q9(e);$9(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 V9(e.hdb_auth_header,t,r),s=W9(e.schema,e.table),i=await Y9.openEnvironment(s,e.table),o=await K9(i,t.hash_attribute,r,e.records,e.__origin?.timestamp);try{await z9(e,o)}catch(c){Q9.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(j9,"lmdbUpdateRecords")});var G0=C((WOe,F0)=>{"use strict";var J9=(k(),P(q)).OPERATIONS_ENUM,Jy=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=J9.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};F0.exports=Jy});var $0=C((jOe,q0)=>{"use strict";var QOe=G0(),X9=Yf(),Z9=Sf(),e7=Qp(),S_=(k(),P(q)),t7=Lc().upsertRecords,r7=_t(),{getSchemaPath:n7}=gt(),s7=l_(),i7=ee(),{handleHDBError:o7,hdb_errors:a7}=he();q0.exports=c7;async function c7(e){let t;try{t=X9(e)}catch(l){throw o7(l,l.message,a7.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}let{schema_table:r,attributes:n}=t;Z9(e,n,r.hash_attribute),e.schema!==S_.SYSTEM_SCHEMA_NAME&&(n.includes(S_.TIME_STAMP_NAMES_ENUM.CREATED_TIME)||n.push(S_.TIME_STAMP_NAMES_ENUM.CREATED_TIME),n.includes(S_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)||n.push(S_.TIME_STAMP_NAMES_ENUM.UPDATED_TIME));let s=await e7(e.hdb_auth_header,r,n),i=n7(e.schema,e.table),o=await r7.openEnvironment(i,e.table),c=await t7(o,r.hash_attribute,n,e.records,e.__origin?.timestamp);try{await s7(e,c)}catch(l){i7.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(c7,"lmdbUpsertRecords")});var K0=C((XOe,V0)=>{"use strict";var Xy=class{static{a(this,"DeleteBeforeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.timestamp=n}};V0.exports=Xy});var W0=C((eNe,Y0)=>{"use strict";var Zy=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}};Y0.exports=Zy});var j0=C((nNe,Q0)=>{"use strict";var eb=_t(),{getTransactionAuditStorePath:l7}=gt(),rNe=K0(),T_=Gt(),u7=ie(),z0=W0(),d7=require("util").promisify,f7=d7(setTimeout),_7=1e4,h7=100;Q0.exports=m7;async function m7(e){let t=l7(e.schema,e.table),r=await eb.openEnvironment(t,e.table,!0),n=eb.listDBIs(r);eb.initializeDBIs(r,T_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s,i=new z0;do s=await p7(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 f7(h7);while(s.transactions_deleted>0);return i}a(m7,"deleteAuditLogsBefore");async function p7(e,t){let r=new z0;try{let n=e.dbis[T_.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP],s;for(let{key:i,value:o}of n.getRange({start:!1})){if(i>=t)break;r.start_timestamp===void 0&&(r.start_timestamp=i),s=n.remove(i);let c=o[T_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME];u7.isEmpty(c)||(s=e.dbis[T_.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].remove(c,i));for(let l=0;l<o.hash_values.length;l++)s=e.dbis[T_.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE].remove(o.hash_values[l],i);if(r.transactions_deleted++,r.end_timestamp=i,r.transactions_deleted>_7)break}return await s,r}catch(n){throw n}}a(p7,"deleteTransactions")});var X0=C((iNe,J0)=>{"use strict";var tb=class{static{a(this,"DropAttributeObject")}constructor(t,r,n){this.schema=t,this.table=r,this.attribute=n}};J0.exports=tb});var ex=C((cNe,Z0)=>{"use strict";var E7=Ws(),g7=p_(),aNe=X0(),Pi=(k(),P(q)),S7=ie(),rb=_t(),T7=co(),A7=m_(),R7=d_(),{getSchemaPath:y7}=gt();Z0.exports=b7;async function b7(e,t=!0){let r;e.schema===Pi.SYSTEM_SCHEMA_NAME?r=T7[e.table]:r=global.hdb_schema[e.schema][e.table];let n=await N7(e),s=y7(e.schema,e.table),i=await rb.openEnvironment(s,e.table);return t===!0&&await O7(e,i,r.hash_attribute),rb.dropDBI(i,e.attribute),n}a(b7,"lmdbDropAttribute");async function O7(e,t,r){let n=rb.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(O7,"removeAttributeFromAllObjects");async function N7(e){let t=new E7(Pi.SYSTEM_SCHEMA_NAME,Pi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,Pi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,`${e.schema}.${e.table}`,void 0,[Pi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY,Pi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]),n=Array.from(await A7(t)).filter(o=>o[Pi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]===e.attribute);if(S7.isEmptyOrZeroLength(n))throw new Error(`Attribute '${e.attribute}' was not found in '${e.schema}.${e.table}'`);let s=n.map(o=>o[Pi.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]),i=new g7(Pi.SYSTEM_SCHEMA_NAME,Pi.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,s);return R7(i)}a(N7,"dropAttributeFromSystem")});var ox=C((dNe,ix)=>{"use strict";var nb=_t(),yu=Gt(),uNe=un(),sb=(k(),P(q)),tx=ie(),{getTransactionAuditStorePath:w7}=gt(),I7=Tu(),sE=Eu(),C7=ee();ix.exports=P7;async function P7(e){let t=w7(e.schema,e.table),r=await nb.openEnvironment(t,e.table,!0),n=nb.listDBIs(r);nb.initializeDBIs(r,yu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,n);let s;switch(e.search_type){case sb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.TIMESTAMP:return rx(r,e.search_values);case sb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:return s=global.hdb_schema[e.schema][e.table].hash_attribute,L7(r,e.search_values,s);case sb.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME:return D7(r,e.search_values);default:return rx(r)}}a(P7,"readAuditLog");function rx(e,t=[0,Date.now()]){tx.isEmpty(t[0])&&(t[0]=0),tx.isEmpty(t[1])&&(t[1]=Date.now());let r=e.dbis[yu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP],n;for(let s of r.getKeys({start:t[1]}))if(s!==t[1]){n=s;break}return r.getRange({start:t[0],end:n}).map(({value:s})=>Object.assign(new sE,s))}a(rx,"searchTransactionsByTimestamp");function D7(e,t=[]){let r=new Map;for(let n=0;n<t.length;n++){let s=t[n],i=[];for(let o of e.dbis[yu.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].getValues(s))i.push(o);r.set(s,sx(e,i))}return Object.fromEntries(r)}a(D7,"searchTransactionsByUsername");function L7(e,t,r){let n=new Map;for(let c=0,l=t.length;c<l;c++){let u=t[c],f=I7.equals(e,yu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,yu.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,u);for(let{value:d}of f){let _=Number(d);n.has(_)?n.get(_).push(u.toString()):n.set(_,[u.toString()])}}let s=Array.from(n.keys()),i=sx(e,s),o=new Map;for(let c=0;c<i.length;c++){let l=i[c],u=l.timestamp,f=n.get(u);nx(l,"records",r,f,o),nx(l,"original_records",r,f,o)}return Object.fromEntries(o)}a(L7,"searchTransactionsByHashValues");function nx(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 sE(e.operation,e.user_name,i,void 0);d[t]=[c],u.push(d)}}else{let u=new sE(e.operation,e.user_name,i,void 0);u[t]=[c],s.set(l,[u])}}}a(nx,"loopRecords");function sx(e,t){let r=[];try{let n=e.dbis[yu.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP];for(let s=0;s<t.length;s++)try{let i=n.get(t[s]);if(i){let o=Object.assign(new sE,i);r.push(o)}}catch(i){C7.warn(i)}return r}catch(n){throw n}}a(sx,"batchSearchTransactions")});var cx=C((mNe,ax)=>{"use strict";var{getSchemaPath:_Ne}=gt(),hNe=_t(),{database:M7}=(xe(),P(ct));ax.exports={writeTransaction:v7};async function v7(e,t,r){return M7({database:e,table:t}).transaction(r)}a(v7,"writeTransaction")});var fx=C((ENe,dx)=>{"use strict";var{getSchemaPath:lx}=gt(),ux=_t();dx.exports={flush:U7,resetReadTxn:x7};async function U7(e,t){return(await ux.openEnvironment(lx(e,t),t.toString())).flushed}a(U7,"flush");async function x7(e,t){try{(await ux.openEnvironment(lx(e,t),t.toString())).resetReadTxn()}catch{}}a(x7,"resetReadTxn")});var px=C((SNe,mx)=>{"use strict";var{Readable:B7}=require("stream"),{getDatabases:H7}=(xe(),P(ct)),{readSync:k7,openSync:F7,createReadStream:_x}=require("fs"),{open:G7}=require("lmdb"),hx=Gf(),q7=qf(),{AUDIT_STORE_OPTIONS:$7}=(Ti(),P(Ex)),{INTERNAL_DBIS_NAME:V7,AUDIT_STORE_NAME:K7}=Gt();mx.exports=W7;var ib=32768,Y7=100;async function W7(e){let t=e.database||e.schema||"data",r=H7()[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=G7({noSync:!0,maxDbs:q7.MAX_DBS}),_,h=d.openDB(V7,new hx(!1)),m=f.useReadTransaction(),S=0,g=a(async function(E,T){T.encoding="binary",T.encoder=void 0;let N=d.openDB(E,T),v=f.openDB(E,T);for(let{key:H,version:X,value:W}of v.getRange({start:null,transaction:m,versions:v.useVersions}))_=N.put(H,W,X),S++%Y7===0&&(await new Promise($=>setTimeout($,20)),m.openTimer&&(m.openTimer=0))},"copyDatabase");for(let{key:E,value:T}of f.getRange({transaction:m,start:!1}))if(s.some(N=>E.startsWith?.(N+"/"))){h.put(E,T);let[,N]=E.split("/"),v=!N,H=new hx(!v,v);await g(E,H)}e.include_audit&&await g(K7,{...$7}),await _;let R=_x(d.path);return R.headers=l(),R.on("close",()=>{m.done(),d.close()}),R}let o=r[Object.keys(r)[0]].primaryStore,c=F7(o.path);return o.transaction(()=>{let u=Buffer.alloc(ib);k7(c,u,0,ib),o.resetReadTxn();let f=o.useReadTransaction();f.renew();let d=_x(null,{fd:c,start:ib}),_=new B7.from(async function*(){yield u;for await(let h of d)f.openTimer&&(f.openTimer=0),yield h;f.done()}());return _.headers=l(),_});function l(){let u=new Map;return u.set("content-type","application/octet-stream"),u.set("content-disposition",`attachment; filename="${t}"`),u.set("date",n),u}}a(W7,"getBackup")});var Tx=C((ANe,Sx)=>{"use strict";var z7=ee(),{handleHDBError:Q7}=he(),j7=DL(),J7=Pp(),X7=Cy(),Z7=LU(),eee=d_(),tee=xy(),ree=s0(),nee=_0(),see=m_(),iee=A0(),oee=L0(),aee=B0(),cee=k0(),lee=$0(),uee=j0(),dee=Vy(),fee=ex(),_ee=ox(),hee=cx(),gx=fx(),mee=px(),ob=class extends j7{static{a(this,"LMDBBridge")}async searchByConditions(t){return iee(t)}async getDataByHash(t){return await tee(t)}async searchByHash(t){return await ree(t)}async getDataByValue(t,r){return await nee(t,r)}async searchByValue(t){return await see(t)}async createSchema(t){return await Z7(t)}async dropSchema(t){return await oee(t)}async createTable(t,r){return await aee(t,r)}async dropTable(t){return await dee(t)}async createAttribute(t){return await J7(t)}async createRecords(t){return await X7(t)}async updateRecords(t){return await cee(t)}async upsertRecords(t){try{return await lee(t)}catch(r){throw Q7(r,null,null,z7.ERR,r)}}async deleteRecords(t){return await eee(t)}async dropAttribute(t){return await fee(t)}async deleteAuditLogsBefore(t){return await uee(t)}async readAuditLog(t){return await _ee(t)}writeTransaction(t,r,n){return hee.writeTransaction(t,r,n)}flush(t,r){return gx.flush(t,r)}resetReadTxn(t,r){return gx.resetReadTxn(t,r)}getBackup(t){return mee(t)}};Sx.exports=ob});var cb={};Ue(cb,{add:()=>iE,applyReverse:()=>Ax,getRecordAtTime:()=>ab,rebuildUpdateBefore:()=>oE});function iE(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 oE(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,iE(n,s,i)}else r&&(n||(n={}),n[s]=i)}else n||(n={}),n[s]=e[s];return n}function Ax(e,t){for(let r in t){let n=t[r];if(n?.__op__){let s=pee[n.__op__]?.reverse;if(s)s(e,r,{value:n.value});else throw new Error(`Unsupported operation ${n.__op__}`)}else e[r]=Rx}}function ab(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":Ax(s,u.getValue(r));break;case"delete":s=null}i=u.previousLocalTime}let o={},c=0;for(let l in s)s[l]===Rx&&(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 pee,Rx,aE=Re(()=>{Ti();a(iE,"add");iE.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)};pee={add:iE};a(oE,"rebuildUpdateBefore");a(Ax,"applyReverse");Rx={};a(ab,"getRecordAtTime")});function yn(e){let t=e.getChanges();return t||(t=Object.create(null),e._setChanges(t)),t}function dE(e,t){let r=e.prototype,n={},s=t.attributes||t.properties||[];for(let c of s){let l=c.name,u,f;if(c.resolve)f={get(){return c.resolve(this,this.getContext?.())},set(d){return c.set(this,d)},configurable:!0};else{switch(c.type){case"String":u=a(function(d){if(!(typeof d=="string"||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a string, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"ID":u=a(function(d){if(!(typeof d=="string"||d?.length>0&&d.every?.(_=>typeof _=="string")||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a string, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Float":case"Number":u=a(function(d){let _=d?.__op__?d.value:d;if(!(typeof _=="number"||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a number, attempt to assign ${_}`);yn(this)[l]=d},"set");break;case"Int":u=a(function(d){let _=d?.__op__?d.value:d;if(!(_>>0===_||d==null&&c.nullable!==!1))if(typeof _=="number"&&Math.abs((_>>0)-_)<=1)_=Math.round(_),d?.__op__?d.value=_:d=_;else throw new zn.ClientError(`${l} must be an integer between -2147483648 and 2147483647, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Long":u=a(function(d){let _=d?.__op__?d.value:d;if(!(Math.round(_)===d&&Math.abs(_)<=9007199254740992||d==null&&c.nullable!==!1))if(typeof _=="number"&&Math.abs(_)<=9007199254740992)_=Math.round(_),d?.__op__?d.value=_:d=_;else throw new zn.ClientError(`${l} must be an integer between -9007199254740992 and 9007199254740992, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"BigInt":u=a(function(d){let _=d?.__op__?d.value:d;if(!(typeof _=="bigint"||d==null&&c.nullable!==!1))if(typeof _=="string"||typeof _=="number")_=BigInt(_),d?.__op__?d.value=_:d=_;else throw new zn.ClientError(`${l} must be a number, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Boolean":u=a(function(d){if(!(typeof d=="boolean"||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a boolean, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Date":u=a(function(d){if(!(d instanceof Date||d==null&&c.nullable!==!1))if(typeof d=="string"||typeof d=="number")d=new Date(d);else throw new zn.ClientError(`${l} must be a Date, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Bytes":u=a(function(d){if(!(d instanceof Uint8Array||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a Buffer or Uint8Array, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Blob":u=a(function(d){if(!(d instanceof Si||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be a Blob, attempt to assign ${d}`);yn(this)[l]=d},"set");break;case"Any":case void 0:u=a(function(d){yn(this)[l]=d},"set");break;default:u=a(function(d){if(!(typeof d=="object"||d==null&&c.nullable!==!1))throw new zn.ClientError(`${l} must be an object, attempt to assign ${d}`);yn(this)[l]=d},"set")}f={get(){let d=this.getChanges?.();if(d&&l in d){let h=d[l];if(h?.__op__){let m=this.getRecord()?.[l];return h.update(m)}return h}let _=this.getRecord()?.[l];if(_&&typeof _=="object"){let h=lb(_,c);if(h)return d||this._setChanges(d=Object.create(null)),d[l]=h}return _},set:u,enumerable:!0,configurable:!0}}f.get.isAttribute=!0,n[l]=f,(!(l in r)||Object.getOwnPropertyDescriptor(r,l)?.get?.isAttribute)&&Object.defineProperty(r,l,f)}i("getProperty",function(c){let l=n[c];if(l)return l.get.call(this);let u=this.getChanges();return u?.[c]!==void 0?u[c]:this.getRecord()?.[c]}),i("set",function(c,l){let u=n[c];if(u)return u.set.call(this,l);if(t.sealed)throw new zn.ClientError("Can not add a property to a sealed table schema");yn(this)[c]=l}),i("deleteProperty",function(c){yn(this)[c]=void 0}),i("toJSON",function(){let c=this.getChanges?.(),l;for(let f in c){l||(l={...this.getRecord()});let d=c[f];if(d?.__op__){let _=l[f];d=d.update(_)}l[f]=d}return Object.keys(this).length>0&&(l||(l={...this.getRecord()}),Object.assign(l,this)),l||this.getRecord()}),r.get||i("get",r.getProperty),r.delete||i("delete",r.deleteProperty),r.then||i("then",null);function i(c,l){Object.defineProperty(r,c,{value:l,configurable:!0})}a(i,"setMethod");let o=r;do{let c=Object.getPrototypeOf(o);if(c===Object.prototype){Object.setPrototypeOf(o,bx);break}o=c}while(o&&o!==bx)}function lb(e,t){let r;switch(e.constructor){case Object:return t?(r=t.TrackedObject,r||(t.TrackedObject=r=class extends A_{static{a(this,"TrackedObject")}},dE(r,t)),new r(e)):new A_(e);case Array:let n=new lE(e.length,e);for(let s=0,i=e.length;s<i;s++){let o=e[s];o&&typeof o=="object"&&(o=lb(o,t?.elements)),n[s]=o}return n;default:return e}}function fE(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=fE(i);r[s]=i}return Object.keys(e).length>0&&(r||(r=e.getRecord?{...e.getRecord()}:{}),Object.assign(r,e)),r||e.getRecord?.()||e}function bu(e,t=e.getChanges?.()){let r;if(e.getRecord&&e.constructor===Array&&!Object.isFrozen(e)){r=e;for(let n=0,s=e.length;n<s;n++){let i=e[n];if(i&&typeof i=="object"){let o=bu(i);o!==i&&r===e&&(r=e.slice(0)),i=o}r[n]=i}return Object.freeze(r)}for(let n in t){r||(r={...e.getRecord?.()});let s=t[n];if(s&&typeof s=="object")if(s.__op__){let i=cb[s?.__op__];if(i)i(r,n,s);else throw new Error("Invalid CRDT operation "+s.__op__);continue}else s=bu(s);r[n]=s}if(!Array.isArray(e))for(let n in e)Eee.call(e,n)&&(r||(r={...e.getRecord?.()}),r[n]=e[n]);return r?Object.freeze(r):e.getRecord?.()??e}function cE(e){let t=e.getRecord?.();if(t===void 0)return!0;if(e.constructor===Array){if(!t||e[Yc]||e.length!==t.length)return!0;for(let r=0,n=e.length;r<n;r++){let s=t[r],i=e[r];if(s&&i?.getRecord?.()===s){if(cE(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(cE(s))return!0}else return!0}else return!0}}return!1}var zn,yx,bx,A_,Eee,Yc,lE,uE,ub=Re(()=>{zn=M(he());aE();pn();a(yn,"getChanges");a(dE,"assignTrackedAccessors");yx=Object.prototype,bx=new Proxy({},{get(e,t,r){if(typeof t=="string"){if(t==="then"||t==="getRecord"||t==="getChanges")return;if(yx[t])return yx[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=lb(s);if(i)return n||(n=Object.create(null),r._setChanges(n)),n[t]=i,i}return s}}});a(lb,"trackObject");A_=class{static{a(this,"GenericTrackedObject")}#e;#t;constructor(t){if(t?.getRecord)throw new Error("Can not track an already tracked object, check for circular references");this.#e=t}getRecord(){return this.#e}setRecord(t){this.#e=t}getChanges(){return this.#t}_setChanges(t){this.#t=t}};dE(A_,{});a(fE,"collapseData");Eee=Object.prototype.hasOwnProperty;a(bu,"updateAndFreeze");a(cE,"hasChanges");Yc=Symbol.for("has-array-changes"),lE=class extends Array{static{a(this,"TrackedArray")}#e;[Yc];constructor(t,r){super(t),this.#e=r}getRecord(){return this.#e}splice(...t){return this[Yc]=!0,super.splice(...t)}push(...t){return this[Yc]=!0,super.push(...t)}pop(){return this[Yc]=!0,super.pop()}unshift(...t){return this[Yc]=!0,super.unshift(...t)}shift(){return this[Yc]=!0,super.shift()}};lE.prototype.constructor=Array;uE=class{constructor(t){this.value=t}static{a(this,"Addition")}__op__="add";update(t){return(+t||0)+this.value}}});var Lx={};Ue(Lx,{ResourceBridge:()=>_b});function hb({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 Nx(e,t){let r=Di(e),n=hb(e,r);if(!r)throw new zs.ClientError(`Table ${e.table} not found`);let s;n&&r.attributes.length-n.length>2&&n.length<5&&(s=!0);let i={user:e.hdb_user,onlyIfCached:e.onlyIfCached,noCacheStore:e.noCacheStore,noCache:e.noCache,replicateFrom:e.replicateFrom},o;It(i,()=>new Promise(u=>o=u));let c=e.ids||e.hash_values,l=0;return{[Symbol.asyncIterator](){return{async next(){if(l<c.length){let u=c[l++],f;try{f=await r.get({id:u,lazy:s,select:n},i),f=f&&fE(f)}catch(d){f={message:d.toString()}}return t?{value:{key:u,value:f}}:{value:f}}else return o(),{done:!0}},return(u){return o(),{value:u,done:!0}},throw(u){return o(),{done:!0}}}}}}function Di(e){let t=e.database||e.schema||See,r=Xe()[t];if(!r)throw(0,zs.handleHDBError)(new Error,gee.SCHEMA_NOT_FOUND(t),404);return r[e.table]}function wx(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*Ix(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 Cx,_E,zs,Px,db,fb,Dx,gee,See,Tee,Aee,Ox,_b,Mx=Re(()=>{"use strict";Cx=M(Tx()),_E=M(Au()),zs=M(he());xe();Px=M(Yf());k();db=M(mo()),fb=M(Ys()),Dx=M(ie());mc();ub();({HDB_ERROR_MSGS:gee}=zs.hdb_errors),See="data",Tee=1e4,Aee=10,_b=class extends Cx.default{static{a(this,"ResourceBridge")}constructor(t){super(t),Ox=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,_E.default)(t,"conditions");if(r)throw(0,zs.handleHDBError)(r,r.message,400,void 0,void 0,!0);let n=Di(t);if(!n)throw new zs.ClientError(`Table ${t.table} not found`);let s=t.conditions.map(i);function i(o){return o.conditions?(o.conditions=o.conditions.map(i),o):{attribute:o.search_attribute??o.attribute,comparator:o.search_type??o.comparator,value:o.search_value!==void 0?o.search_value:o.value}}return a(i,"mapCondition"),n.search({conditions:s,operator:t.operator?t.operator.toLowerCase():void 0,limit:t.limit,offset:t.offset,reverse:t.reverse,select:hb(t,n),sort:t.sort,allowFullScan:!0},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async createTable(t,r){let n=r.attributes,s=!!n,i=r.primary_key||r.hash_attribute;if(n)for(let o of n)o.is_primary_key?(o.isPrimaryKey=!0,delete o.is_primary_key):o.name===i&&i&&(o.isPrimaryKey=!0);else{if(!i)throw new zs.ClientError("A primary key must be specified with a `primary_key` property or with `attributes`");n=[{name:i,isPrimaryKey:!0},{name:"__createdtime__",indexed:!0},{name:"__updatedtime__",indexed:!0}]}ft({database:r.database??r.schema,table:r.table,attributes:n,schemaDefined:s,expiration:r.expiration,audit:r.audit})}async createAttribute(t){return await Di(t).addAttributes([{name:t.attribute,indexed:t.indexed??!0}]),`attribute ${t.schema}.${t.table}.${t.attribute} successfully created.`}async dropAttribute(t){let r=Di(t);if(await r.removeAttributes([t.attribute]),!r.schemaDefined){let n=t.attribute,s,i=a((o,c,l)=>(c={...c},delete c[n],r.primaryStore.ifVersion(o,l,()=>r.primaryStore.put(o,c,l)).then(u=>{if(!u){let{value:f,version:d}=r.primaryStore.getEntry(o);return i(o,f,d)}})),"deleteRecord");for(let{key:o,value:c,version:l}of r.primaryStore.getRange({start:!0,versions:!0}))s=i(o,c,l),await new Promise(u=>setImmediate(u));await s}return`successfully deleted ${t.schema}.${t.table}.${t.attribute}`}dropTable(t){Di(t).dropTable()}createSchema(t){return Ou({database:t.schema,table:null}),db.signalSchemaChange(new fb.SchemaEventMsg(process.pid,Wt.CREATE_SCHEMA,t.schema))}async dropSchema(t){await mb(t.schema),db.signalSchemaChange(new fb.SchemaEventMsg(process.pid,Wt.DROP_SCHEMA,t.schema))}async updateRecords(t){return t.requires_existing=!0,this.upsertRecords(t)}async createRecords(t){return t.requires_no_existing=!0,Ox.upsertRecords(t)}async upsertRecords(t){let{schema_table:r,attributes:n}=(0,Px.default)(t),s,i=Xe()[t.schema][t.table],o={user:t.hdb_user,expiresAt:t.expiresAt,originatingOperation:t.operation};return t.replicateTo&&(o.replicateTo=t.replicateTo),t.replicatedConfirmation&&(o.replicatedConfirmation=t.replicatedConfirmation),It(o,async c=>{if(!i.schemaDefined){s=[];for(let f of n)i.attributes.find(_=>_.name==f)||s.push(f);s.length>0&&await i.addAttributes(s.map(f=>({name:f,indexed:!0})))}let l=[],u=[];for(let f of t.records){let d=f[i.primaryKey],_=d!=null&&await i.get(d,o);if(t.requires_existing&&!_||t.requires_no_existing&&_){u.push(f[i.primaryKey]);continue}_&&(_=fE(_));for(let h in f)if(Object.prototype.hasOwnProperty.call(f,h)){let m=f[h];if(typeof m=="function")try{let S=m([[_]]);Array.isArray(S)&&(m=S[0].func_val,f[h]=m)}catch(S){throw S.message+="Trying to set key "+h+" on object"+JSON.stringify(f),S}}if(_)for(let h in _)Object.prototype.hasOwnProperty.call(f,h)||(f[h]=_[h]);await(d==null?i.create(f,o):i.put(f,o)),l.push(f[i.primaryKey])}return{txn_time:c.timestamp,written_hashes:l,new_attributes:s,skipped_hashes:u}})}async deleteRecords(t){let r=Xe()[t.schema][t.table],n={user:t.hdb_user};return t.replicateTo&&(n.replicateTo=t.replicateTo),t.replicatedConfirmation&&(n.replicatedConfirmation=t.replicatedConfirmation),It(n,async s=>{let i=t.hash_values||t.records.map(l=>l[r.primaryKey]),o=[],c=[];for(let l of i)await r.delete(l,n)?o.push(l):c.push(l);return wx(o,c,s.timestamp)})}async deleteRecordsBefore(t){let r=Xe()[t.schema][t.table];if(!r.createdTimeProperty)throw new zs.ClientError("Table must have a '__createdtime__' attribute or @createdTime timestamp defined to perform this operation");let n=await r.search({conditions:[{attribute:r.createdTimeProperty.name,value:Date.parse(t.date),comparator:vm.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,Dx.async_set_timeout)(Aee),l=[],s=!0},"chunkDelete");for await(let f of n)l.push(f[r.primaryKey]),c++,c%Tee===0&&await u();return l.length>0&&await u(),s?wx(i,o,void 0):{message:"No records found to delete"}}searchByHash(t){t.select!==void 0&&(t.get_attributes=t.select);let r=(0,_E.default)(t,"hashes");if(r)throw r;return Nx(t)}async getDataByHash(t){let r=new Map;t._returnKeyValue=!0;for await(let{key:n,value:s}of Nx(t,!0))r.set(n,s);return r}searchByValue(t,r){if(r&&_A[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,_E.default)(t,"value");if(n)throw n;let s=Di(t);if(!s)throw new zs.ClientError(`Table ${t.table} not found`);let i=t.search_value;i.includes?.("*")&&(i.startsWith("*")?i.endsWith("*")?i!=="*"&&(r="contains",i=i.slice(1,-1)):(r="ends_with",i=i.slice(1)):i.endsWith("*")&&(r="starts_with",i=i.slice(0,-1))),r===vm.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:hb(t,s)},{onlyIfCached:t.onlyIfCached,noCacheStore:t.noCacheStore,noCache:t.noCache,replicateFrom:t.replicateFrom})}async getDataByValue(t,r){let n=new Map,s=Di(t);t.get_attributes&&!t.get_attributes.includes(s.primaryKey)&&t.get_attributes[0]!=="*"&&t.get_attributes.push(s.primaryKey);for await(let i of this.searchByValue(t,r))n.set(i[s.primaryKey],i);return n}resetReadTxn(t,r){Di({schema:t,table:r})?.primaryStore.resetReadTxn()}async deleteAuditLogsBefore(t){return Di(t).deleteHistory(t.timestamp,t.cleanup_deleted_records)}async readAuditLog(t){let r=Di(t),n={};switch(t.search_type){case Um.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 Um.USERNAME:let s=t.search_values;for await(let i of Ix(r))s.includes(i.user_name)&&(n[i.user_name]||(n[i.user_name]=[])).push(i);return n;default:return Ix(r,t.search_values?.[0],t.search_values?.[1],t.limit)}}};a(hb,"getSelect");a(Nx,"getRecords");a(Di,"getTable");a(wx,"createDeleteResponse");a(Ix,"groupRecordsInHistory")});var qn=C((vNe,vx)=>{"use strict";var{ResourceBridge:Ree}=(Mx(),P(Lx)),yee=le();yee.initSync();var hE;function bee(){return hE||(hE=new Ree,hE)}a(bee,"getBridge");vx.exports=bee()});var An=C((xNe,Hx)=>{"use strict";var pE=sR(),xr=ie(),Oee=require("util"),EE=qn(),Nee=$s(),Ux=ee(),{handleHDBError:Wc,hdb_errors:wee}=he(),{HTTP_STATUS_CODES:zc}=wee,Iee=Oee.promisify(Nee.getTableSchema),Cee="updated",xx="inserted",Bx="upserted";Hx.exports={insert:Dee,update:Lee,upsert:Mee,validation:Pee,flush:vee};async function Pee(e){if(xr.isEmpty(e))throw new Error("invalid update parameters defined.");if(xr.isEmptyOrZeroLength(e.schema))throw new Error("invalid database specified.");if(xr.isEmptyOrZeroLength(e.table))throw new Error("invalid table specified.");let t=await Iee(e.schema,e.table),r=pE(e);if(r)throw r;if(!Array.isArray(e.records))throw new Error("records must be an array");let n=t.hash_attribute,s=new Set,i={},o=!1;return e.operation==="update"&&(o=!0),e.records.forEach(c=>{if(o&&xr.isEmptyOrZeroLength(c[n]))throw Ux.error("a valid hash attribute must be provided with update record:",c),new Error("a valid hash attribute must be provided with update record");if(!xr.isEmptyOrZeroLength(c[n])&&(c[n]==="null"||c[n]==="undefined"))throw Ux.error(`a valid hash value must be provided with ${e.operation} record:`,c),new Error(`"${c[n]}" is not a valid hash attribute value`);!xr.isEmpty(c[n])&&c[n]!==""&&s.has(xr.autoCast(c[n]))&&(c.skip=!0),s.add(xr.autoCast(c[n]));for(let l in c)i[l]=1}),i[n]=1,{schema_table:t,hashes:Array.from(s),attributes:Object.keys(i)}}a(Pee,"validation");async function Dee(e){if(e.operation!=="insert")throw new Error("invalid operation, must be insert");let t=pE(e);if(t)throw Wc(new Error,t.message,zc.BAD_REQUEST);xr.transformReq(e);let r=xr.checkSchemaTableExist(e.schema,e.table);if(r)throw Wc(new Error,r,zc.BAD_REQUEST);let n=await EE.createRecords(e);return mE(xx,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time)}a(Dee,"insertData");async function Lee(e){if(e.operation!=="update")throw new Error("invalid operation, must be update");let t=pE(e);if(t)throw Wc(new Error,t.message,zc.BAD_REQUEST);xr.transformReq(e);let r=xr.checkSchemaTableExist(e.schema,e.table);if(r)throw Wc(new Error,r,zc.BAD_REQUEST);let n=await EE.updateRecords(e);return xr.isEmpty(n.existing_rows)?mE(Cee,n.written_hashes,e,n.skipped_hashes,n.new_attributes,n.txn_time):mE(n.update_action,[],e,n.hashes,void 0,n.txn_time)}a(Lee,"updateData");async function Mee(e){if(e.operation!=="upsert")throw Wc(new Error,"invalid operation, must be upsert",zc.INTERNAL_SERVER_ERROR);let t=pE(e);if(t)throw Wc(new Error,t.message,zc.BAD_REQUEST);xr.transformReq(e);let r=xr.checkSchemaTableExist(e.schema,e.table);if(r)throw Wc(new Error,r,zc.BAD_REQUEST);let n=await EE.upsertRecords(e);return mE(Bx,n.written_hashes,e,[],n.new_attributes,n.txn_time)}a(Mee,"upsertData");function mE(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===xx?(o.inserted_hashes=t,o.skipped_hashes=n,o):e===Bx?(o.upserted_hashes=t,o):(o.update_hashes=t,o.skipped_hashes=n,o)}a(mE,"returnObject");function vee(e){return xr.transformReq(e),EE.flush(e.schema,e.table)}a(vee,"flush")});var Vx=C((HNe,$x)=>{var Nu=require("validate.js"),Fx=ot(),wu=(k(),P(q)),{handleHDBError:Uee,hdb_errors:xee}=he(),{HDB_ERROR_MSGS:jt,HTTP_STATUS_CODES:Bee}=xee,pb=a(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Hee={STRUCTURE_USER:"structure_user"},kx=Object.values(wu.ROLE_TYPES_ENUM),kee="attribute_permissions",Fee="attribute_name",{PERMS_CRUD_ENUM:Iu}=wu,Gee=[kee,...Object.values(Iu)],Gx=[Iu.READ,Iu.INSERT,Iu.UPDATE],qee=[Fee,...Gx];function $ee(e){let t=pb();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,qx(e,t)}a($ee,"addRoleValidation");function Vee(e){let t=pb();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,qx(e,t)}a(Vee,"alterRoleValidation");function Kee(e){let t=pb();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,Fx.validateObject(e,t)}a(Kee,"dropRoleValidation");var Yee=["operation","role","id","permission","hdb_user","access"];function qx(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let o=0,c=n.length;o<c;o++)Yee.includes(n[o])||s.push(n[o]);s.length>0&&sr(jt.INVALID_ROLE_JSON_KEYS(s),r);let i=Fx.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{sr(o,r)}),e.permission){let o=Wee(e);o&&sr(o,r),kx.forEach(c=>{e.permission[c]&&!Nu.isBoolean(e.permission[c])&&sr(jt.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let o in e.permission)if(kx.indexOf(o)<0){if(o===Hee.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]||sr(jt.SCHEMA_NOT_FOUND(d),r)}continue}sr(jt.STRUCTURE_USER_ROLE_TYPE_ERROR(o),r);continue}let c=e.permission[o];if(!o||!global.hdb_schema[o]){sr(jt.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]){sr(jt.TABLE_NOT_FOUND(o,l),r);continue}if(Object.keys(u).forEach(f=>{Gee.includes(f)||sr(jt.INVALID_PERM_KEY(f),r,o,l)}),Object.values(Iu).forEach(f=>{Nu.isDefined(u[f])?Nu.isBoolean(u[f])||sr(jt.TABLE_PERM_NOT_BOOLEAN(f),r,o,l):sr(jt.TABLE_PERM_MISSING(f),r,o,l)}),u.attribute_permissions===void 0){sr(jt.ATTR_PERMS_ARRAY_MISSING,r,o,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){sr(jt.ATTR_PERMS_NOT_ARRAY,r,o,l);continue}if(u.attribute_permissions){let f=global.hdb_schema[o][l].attributes.map(({attribute:_})=>_),d={read:!1,insert:!1,update:!1};for(let _ in u.attribute_permissions){let h=u.attribute_permissions[_];if(Object.keys(h).forEach(S=>{!qee.includes(S)&&S!==Iu.DELETE&&sr(jt.INVALID_ATTR_PERM_KEY(S),r,o,l)}),!Nu.isDefined(h.attribute_name)){sr(jt.ATTR_PERM_MISSING_NAME,r,o,l);continue}let m=h.attribute_name;if(!f.includes(m)){sr(jt.INVALID_ATTRIBUTE_IN_PERMS(m),r,o,l);continue}Gx.forEach(S=>{Nu.isDefined(h[S])?Nu.isBoolean(h[S])||sr(jt.ATTR_PERM_NOT_BOOLEAN(S,m),r,o,l):sr(jt.ATTR_PERM_MISSING(S,m),r,o,l)}),!d.read&&h.read===!0&&(d.read=!0),!d.insert&&h.insert===!0&&(d.insert=!0),!d.update&&h.update===!0&&(d.update=!0)}if(u.read===!1&&d.read===!0||u.insert===!1&&d.insert===!0||u.update===!1&&d.update===!0){let _=`${o}.${l}`;sr(jt.MISMATCHED_TABLE_ATTR_PERMS(_),r,o,l)}}}}return zee(r)}a(qx,"customValidate");$x.exports={addRoleValidation:$ee,alterRoleValidation:Vee,dropRoleValidation:Kee};function Wee(e){let{operation:t,permission:r}=e;if(t===wu.OPERATIONS_ENUM.ADD_ROLE||t===wu.OPERATIONS_ENUM.ALTER_ROLE){let n=r.super_user===!0,s=r.cluster_user===!0;if(Object.keys(r).length>1&&(n||s)){if(s&&n)return jt.SU_CU_ROLE_COMBINED_ERROR;{let o=r.super_user?wu.ROLE_TYPES_ENUM.SUPER_USER:wu.ROLE_TYPES_ENUM.CLUSTER_USER;return jt.SU_CU_ROLE_NO_PERMS_ALLOWED(o)}}}return null}a(Wee,"validateNoSUPerms");function zee(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:jt.ROLE_PERMS_ERROR,...e};return Uee(new Error,n,Bee.BAD_REQUEST)}else return null}a(zee,"generateRolePermResponse");function sr(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(sr,"addPermError")});var y_=C((GNe,zx)=>{"use strict";var Kx=An(),Yx=Yr(),Qee=Hc(),gb=Vx(),Sb=mo(),FNe=require("uuid").v4,jee=require("util"),gE=(k(),P(q)),Jee=ie(),Tb=Yx.searchByValue,Xee=Yx.searchByHash,Zee=jee.promisify(Qee.delete),ete=Ws(),tte=Ru(),{hdb_errors:rte,handleHDBError:Qc}=he(),{HDB_ERROR_MSGS:Wx,HTTP_STATUS_CODES:R_}=rte,{UserEventMsg:Ab}=Ys();zx.exports={addRole:nte,alterRole:ste,dropRole:ite,listRoles:ote};function Eb(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(Eb,"scrubRoleDetails");async function nte(e){let t=gb.addRoleValidation(e);if(t)throw t;e=Eb(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 Tb(r)||[])}catch(i){throw Qc(i)}if(n&&n.length>0)throw Qc(new Error,Wx.ROLE_ALREADY_EXISTS(e.role),R_.CONFLICT,void 0,void 0,!0);e.id||(e.id=e.role);let s={operation:"insert",schema:"system",table:"hdb_role",hash_attribute:"id",records:[e]};return await Kx.insert(s),Sb.signalUserChange(new Ab(process.pid)),e=Eb(e),e}a(nte,"addRole");async function ste(e){let t=gb.alterRoleValidation(e);if(t)throw t;e=Eb(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await Kx.update(r)}catch(s){throw Qc(s)}if(n&&n?.message==="updated 0 of 1 records")throw Qc(new Error,"Invalid role id",R_.BAD_REQUEST,void 0,void 0,!0);return await Sb.signalUserChange(new Ab(process.pid)),e}a(ste,"alterRole");async function ite(e){let t=gb.dropRoleValidation(e);if(t)throw Qc(new Error,t,R_.BAD_REQUEST,void 0,void 0,!0);let r=new tte(gE.SYSTEM_SCHEMA_NAME,gE.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Xee(r));if(n.length===0)throw Qc(new Error,Wx.ROLE_NOT_FOUND,R_.NOT_FOUND,void 0,void 0,!0);let s=new ete(gE.SYSTEM_SCHEMA_NAME,gE.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await Tb(s)),o=!1;if(Jee.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){o=!0;break}}if(o===!0)throw Qc(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,R_.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Zee(c),Sb.signalUserChange(new Ab(process.pid)),`${n[0].role} successfully deleted`}a(ite,"dropRole");async function ote(){return Tb({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}a(ote,"listRoles")});var Rb={};Ue(Rb,{start:()=>Jx,startOnMainThread:()=>lte});function Jx({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,Qx.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(ate.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 cte(i)}}}async function cte(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,jx.isEqual)(i,e)?void 0:(e.id=r.id,(0,SE.alterRole)(e))}return(0,SE.addRole)(e)}var SE,Qx,jx,ate,lte,Xx=Re(()=>{xe();SE=M(y_()),Qx=require("yaml"),jx=require("lodash"),ate=["super_user","cluster_user","structure_user"];a(Jx,"start");a(cte,"ensureRole");lte=Jx});async function TE(e){let t=(0,tB.pathToFileURL)(e).toString();if(ute)return b_||(b_=dte(_te)),(await(await b_).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function dte(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),b_=new Compartment({console,Math,Date,fetch:fte,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,eB.extname)(r)||(r+=".js"),r)},importHook:a(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){Object.assign(s,{Resource:Vr,tables:Qn,databases:We})}};let n=await(0,Zx.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),b_}function fte(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 _te(){return{Resource:Vr,tables:Qn}}var Zx,eB,tB,ute,b_,yb=Re(()=>{na();xe();Zx=require("fs/promises"),eB=require("path"),tB=require("url"),ute=!1;a(TE,"secureImport");a(dte,"getCompartment");a(fte,"secureOnlyFetch");a(_te,"getGlobalVars")});var Ob={};Ue(Ob,{handleFile:()=>hte});async function hte(e,t,r,n){let s=new Map,i=await TE(r);c(i.default)&&n.set((0,bb.dirname)(t),i.default),o(i,(0,bb.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 bb,rB=Re(()=>{yb();bb=require("path");a(hte,"handleFile")});var wb={};Ue(wb,{start:()=>mte});function mte({resources:e}){e.set("login",Nb),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var Nb,nB=Re(()=>{na();a(mte,"start");Nb=class extends Vr{static{a(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:o}=r;return{data:await n.login(s,i)}}}});var P_={};Ue(P_,{addAnalyticsListener:()=>C_,calculateCPUUtilization:()=>RB,diffResourceUsage:()=>yB,recordAction:()=>Mt,recordActionBinary:()=>jn,setAnalyticsEnabled:()=>pte});function pte(e){EB=e}function Ete(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 gte(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},RE.set(e,o)}function Mt(e,t,r,n,s){if(!EB)return;let i=t+(r?"-"+r:"");n!==void 0&&(i+="-"+n),s!==void 0&&(i+="-"+s);let o=RE.get(i);o?Ete(e,o):gte(i,e,t,r,n,s),AE||Ste()}function jn(e,t,r,n,s){Mt(!!e,t,r,n,s)}function C_(e){TB.push(e)}function Ste(){AE=performance.now(),setTimeout(async()=>{let e=performance.now()-AE;AE=0;let t=[],r={time:Date.now(),period:e,threadId:jc.threadId,metrics:t};for(let[s,i]of RE){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 AB){let _=Math.floor(c*d),h=o[_-1];if(_>l){let m=_-l;if(h===f){let S=u[u.length-1];typeof S=="number"?u[u.length-1]={value:S,count:1+m}:S.count+=m}else u.push(m>1?{value:h,count:m}:h),f=h;l=_}}t.push(Object.assign(i.description,{mean:i.total/c,distribution:u,count:c}))}else i.callback?t.push(Object.assign(i.description,i.callback(i))):t.push(Object.assign(i.description,{total:i.total,count:i.count}));await bB()}let n=process.memoryUsage();t.push({metric:"memory",threadId:jc.threadId,byThread:!0,...n});for(let s of TB)s(t);RE=new Map,jc.parentPort?jc.parentPort.postMessage({type:SB,report:r}):wB({report:r})},gB).unref()}function yE(e,t,r){let n={id:(0,w_.getNextMonotonicTime)(),metric:t,...r};e.primaryStore.put(n.id,n,{append:!0}).then(s=>{s||e.primaryStore.put(n.id,n)})}function RB(e,t){let r=e.userCPUTime+e.systemCPUTime;return Math.round(r/t*100)/100}function yB(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 Tte(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};yE(e,"table-size",l),Jc.trace?.(`table ${o} size metric: ${JSON.stringify(l)}`),n+=c}return n}function sB(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getAuditSize();if(!i)return;let o=pB.default.statSync(s.primaryStore.env.path).size,c=Tte(e,r,n),l=o-c,u={database:r,size:o,used:c,free:l,audit:i};yE(e,"database-size",u),Jc.trace?.(`database ${r} size metric: ${JSON.stringify(u)}`)}catch(s){Jc.warn?.("Error getting DB size metrics",s)}}function iB(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};yE(e,"storage-volume",o),Jc.trace?.(`db ${r} storage volume metrics: ${JSON.stringify(o)}`)}catch(s){Jc.warn?.("Error getting DB volume metrics",s)}}async function Ate(e,t=6e4){let r=Cb(),n=OB(),s=new Promise(E=>{let T=performance.now();setImmediate(()=>{let N=performance.now();N-T>5e3&&Jc.warn?.("Unusually high event queue latency on the main thread of "+Math.round(N-T)+"ms"),T=performance.now()}),n.primaryStore.prefetch([1],()=>{let N=performance.now();N-T>5e3&&Jc.warn?.("Unusually high task queue latency on the main thread of "+Math.round(N-T)+"ms"),E(N-T)})}),i;for(let E of n.primaryStore.getRange({start:1/0,end:!1,reverse:!0}))if(E.value?.time){i=E.value.time;break}if(Date.now()-t<i)return;let o,c=new Map,l=new Map,u=[],f;for(let{key:E,value:T}of r.primaryStore.getRange({start:i||!1,exclusiveStart:!0,end:1/0})){if(!T)continue;if(o){if(E>o+t)break}else o=E;f=E;let{metrics:N,threadId:v}=T;for(let H of N||[]){let{path:X,method:W,type:$,metric:se,count:z,total:fe,distribution:ue,threads:Z,...Ae}=H;z||(z=1);let me=se+(X?"-"+X:"");W!==void 0&&(me+="-"+W),$!==void 0&&(me+="-"+$);let ye=c.get(me);if(ye){if(ye.threads){let dt=ye.threads[v];if(dt)ye=dt;else{ye.threads[v]={...Ae};continue}}ye.count||(ye.count=1);let Ht=ye.count;for(let dt in Ae){let Ln=Ae[dt];typeof Ln=="number"&&(ye[dt]=(ye[dt]*Ht+Ln*z)/(Ht+z))}ye.count+=z,fe>=0&&(ye.total+=fe,ye.ratio=ye.total/ye.count)}else ye={period:t,...H},delete ye.distribution,c.set(me,ye),ye.byThread&&(ye.threads=[],ye.threads[v]={...Ae},u.push(ye));if(ue){ue=ue.map(dt=>typeof dt=="number"?{value:dt,count:1}:dt);let Ht=l.get(me);Ht?Ht.push(...ue):l.set(me,ue)}}await bB()}for(let E of u){let{path:T,method:N,type:v,metric:H,count:X,total:W,distribution:$,threads:se,...z}=E;se=se.filter(fe=>fe);for(let fe in z){if(typeof E[fe]!="number")continue;let ue=0;for(let Z of se){let Ae=Z[fe];typeof Ae=="number"&&(ue+=Ae)}E[fe]=ue}E.count=se.length,delete E.threads,delete E.byThread}for(let[E,T]of l){let N=c.get(E);T.sort((dt,Ln)=>dt.value>Ln.value?1:-1);let v=N.count-1,H=[],X=0,W=0,$;for(let dt of AB){let Ln=v*dt;for(;X<Ln;)$=T[W++],X+=$.count,W===1&&X--;let an=T[W>1?W-2:0];$||($=T[0]),H.push($.value-($.value-an.value)*(X-Ln)/$.count)}let[se,z,fe,ue,Z,Ae,me,ye,Ht]=H;Object.assign(N,{p1:se,p10:z,p25:fe,median:ue,p75:Z,p90:Ae,p95:me,p99:ye,p999:Ht})}let d;for(let[E,T]of c)T.id=(0,w_.getNextMonotonicTime)(),T.time=f,n.primaryStore.put(T.id,T,{append:!0}).then(N=>{N||n.primaryStore.put(T.id,T)}),d=!0;let _=Date.now(),{idle:h,active:m}=performance.eventLoopUtilization();if(d||m*10>h){let E=(0,w_.getNextMonotonicTime)(),T={id:E,metric:"main-thread-utilization",idle:h-oB,active:m-aB,taskQueueLatency:await s,time:_,...process.memoryUsage()};n.primaryStore.put(E,T,{append:!0}).then(N=>{N||n.primaryStore.put(E,T)})}oB=h,aB=m;let S=process.resourceUsage(),g=yB(O_,S);g.time=_,g.period=O_.time?_-O_.time:t,g.cpuUtilization=RB(O_,g.period),yE(n,"resource-usage",g),O_=g;let R=Xe();sB(n,R),sB(n,{system:R.system}),iB(n,R),iB(n,{system:R.system})}async function cB(e,t){let r=Date.now()-t;for(let n of e.primaryStore.getKeys({start:!1,end:r}))e.primaryStore.remove(n)}function Cb(){return lB||(lB=ft({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function OB(){return uB||(uB=ft({table:"hdb_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]}))}function bte(){NB=!0;let e=(0,I_.get)(x.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await Ate(gB,e),await cB(Cb(),Rte),await cB(OB(),yte)},Math.min(e/2,2147483647)).unref()}function wB(e,t){let r=e.report;r.threadId=t?.threadId||jc.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(dB+=n.mean*n.count);r.totalBytesProcessed=dB,t&&(r.metrics.push({metric:"utilization",...t.performance.eventLoopUtilization(fB.get(t))}),fB.set(t,t.performance.eventLoopUtilization())),r.id=(0,w_.getNextMonotonicTime)(),Cb().primaryStore.put(r.id,r),NB||bte(),Ote&&(IB=wte(r))}async function wte(e){if(await IB,!pa){let r=(0,N_.dirname)((0,hB.getLogFilePath)());try{pa=await(0,Ib.open)((0,N_.join)(r,"analytics.log"),"r+")}catch{pa=await(0,Ib.open)((0,N_.join)(r,"analytics.log"),"w+")}}let t=(await pa.stat()).size;if(t>Nte){let r=Buffer.alloc(t);await pa.read(r,{position:0}),r=r.subarray(r.indexOf(10,r.length/2)+1),await pa.write(r,{position:0}),await pa.truncate(r.length),t=r.length}await pa.write(JSON.stringify(e)+`
20
20
  `,t)}var jc,_B,hB,mB,N_,Ib,w_,I_,pB,Jc,RE,EB,AE,gB,SB,TB,AB,oB,aB,O_,bB,Rte,yte,lB,uB,NB,dB,fB,Ote,IB,pa,Nte,Li=Re(()=>{jc=require("worker_threads"),_B=M(it());xe();hB=M(ee()),mB=M(ks()),N_=require("path"),Ib=require("fs/promises"),w_=M(un()),I_=M(le());k();Mr();pB=M(require("node:fs")),Jc=(0,mB.loggerWithTag)("analytics");(0,I_.initSync)();RE=new Map,EB=(0,I_.get)(x.ANALYTICS_AGGREGATEPERIOD)>-1;a(pte,"setAnalyticsEnabled");a(Ete,"recordExistingAction");a(gte,"recordNewAction");a(Mt,"recordAction");Ye.recordAnalytics=Mt;a(jn,"recordActionBinary");AE=0,gB=1e3,SB="analytics-report",TB=[];a(C_,"addAnalyticsListener");AB=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Ste,"sendAnalytics");a(yE,"storeMetric");a(RB,"calculateCPUUtilization");a(yB,"diffResourceUsage");a(Tte,"storeTableSizeMetrics");a(sB,"storeDBSizeMetrics");a(iB,"storeVolumeMetrics");a(Ate,"aggregation");oB=0,aB=0,O_={},bB=a(()=>new Promise(setImmediate),"rest");a(cB,"cleanup");Rte=36e5,yte=31536e6;a(Cb,"getRawAnalyticsTable");a(OB,"getAnalyticsTable");(0,_B.setChildListenerByType)(SB,wB);a(bte,"startScheduledTasks");dB=0,fB=new Map,Ote=!1;a(wB,"recordAnalytics");Nte=1e6;a(wte,"logAnalytics")});var CB={};Ue(CB,{Headers:()=>go,appendHeader:()=>bE,mergeHeaders:()=>Pb});function bE(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 Pb(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new go(e));for(let[r,n]of t)e.has(r)?r.toLowerCase()==="set-cookie"&&e.append?.(r,n,!0):e.set(r,n);return e}var go,D_=Re(()=>{go=class extends Map{static{a(this,"Headers")}constructor(t){if(t)if(t[Symbol.iterator])super(t);else{super();for(let r in t)this.set(r,t[r])}else super()}set(t,r){return typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r),super.set(t.toLowerCase(),[t,r])}get(t){return typeof t!="string"&&(t=""+t),super.get(t.toLowerCase())?.[1]}has(t){return typeof t!="string"&&(t=""+t),super.has(t.toLowerCase())}setIfNone(t,r){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let n=t.toLowerCase();if(!super.has(n))return super.set(n,[t,r])}append(t,r,n){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let s=t.toLowerCase(),i=super.get(s);if(i){let o=i[1];if(n)r=(typeof o=="string"?o:o.join(", "))+", "+r;else if(typeof o=="string")r=[o,r];else{o.push(r);return}}return super.set(s,[t,r])}[Symbol.iterator](){return super.values()[Symbol.iterator]()}};a(bE,"appendHeader");a(Pb,"mergeHeaders")});function vB(e){let t={openapi:Ite,info:{title:"HarperDB HTTP REST interface",version:MB.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:v,relationship:H,definition:X}of o){if(H)T==="array"?u[N]={type:"array",items:{$ref:Ea+v.type}}:u[N]={$ref:Ea+T};else{let W=X??v?.definition;if(W){if(!t.components.schemas[W.type]){let $={};W.properties.forEach(se=>{$[se.name]=new vb(Db[se.type],se.type)}),t.components.schemas[W.type]=new LB($)}T==="array"?u[N]={type:"array",items:{$ref:Ea+W.type}}:u[N]={$ref:Ea+W.type}}else T==="array"?v.type==="Any"||v.type=="ID"?u[N]={type:"array",items:{format:v.type}}:u[N]={type:"array",items:new vb(Db[v.type],v.type)}:T==="Any"||T=="ID"?u[N]={format:T}:u[N]=new vb(Db[T],T)}f.push(new Ub(N,"query",u[N]))}let d=Object.keys(u),_=new Ub(c,"path",{format:"ID"});_.required=!0,_.description="primary key of record";let h=new Ub("property","path",{enum:d});h.required=!0,t.components.schemas[i]=new LB(u);let m=l.post!==Resource.prototype.post||l.update,S=typeof l.put=="function",g=typeof l.get=="function",R=typeof l.delete=="function",E="/"+s+"/";m&&(t.paths[E]={},t.paths[E].post=new Cte(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[E]||(t.paths[E]={}),t.paths[E].get=new Lb(f,r,{200:new Mb({$ref:Ea+i})},"search for records by the specified property name and value pairs")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new DB(f,r,"delete all the records that match the provided query",{204:new PB})),E="/"+s+"/{"+c+"}",g&&(t.paths[E]={},t.paths[E].get=new Lb([_],r,{200:new Mb({$ref:Ea+i})},"retrieve a record by its primary key")),S&&(t.paths[E]||(t.paths[E]={}),t.paths[E].put=new Pte([_],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 DB([_],r,"delete a record with the given primary key",{204:new PB})),g&&h.schema.enum.length>0&&(E="/"+s+"/{"+c+"}.{property}",t.paths[E]={},t.paths[E].get=new Lb([_,h],r,{200:new Mb({enum:d})},"used to retrieve the specified property of the specified record"))}return t}function Cte(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:Ea+e}}}},this.security=t,this.responses={200:{description:xb,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function Lb(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function Mb(e){this.description=xb,this.content={"application/json":{schema:e}}}function PB(){this.description="successfully processed request, no content returned to client"}function Pte(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Ea+r}}}},this.responses={200:{description:xb}}}function DB(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function LB(e){this.type="object",this.properties=e}function vb(e,t){this.type=e,this.format=t}function Ub(e,t,r){this.name=e,this.in=t,this.schema=r}var MB,Ite,Db,Ea,xb,UB=Re(()=>{MB=M(Et()),Ite="3.0.3",Db={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},Ea="#/components/schemas/",xb="successful operation";a(vB,"generateJsonApi");a(Cte,"Post");a(Lb,"Get");a(Mb,"Response200");a(PB,"Response204");a(Pte,"Put");a(DB,"Delete");a(LB,"ResourceSchema");a(vb,"Type");a(Ub,"Parameter")});var BB={};Ue(BB,{Request:()=>L_,createReuseportFd:()=>OE});var xB,L_,Bb,Hb,OE,NE=Re(()=>{xB=require("os"),L_=class{static{a(this,"Request")}#e;constructor(t,r){this.method=t.method;let n=t.url;this._nodeRequest=t,this._nodeResponse=r,this.url=n,this.headers=new Hb(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 Bb(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)}},Bb=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)}},Hb=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,xB.platform)()!="win32"&&(OE=require("node-unix-socket").createReuseportFd)});var IE={};Ue(IE,{parseHeaderValue:()=>Fb,start:()=>Mte});async function Lte(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&Xm(e);let i=new go;try{e.responseHeaders=i;let o=e.url.slice(1),c,l;if(o!==HB){let g=wE.getMatch(o,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new pc(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let R=Fb(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=Fb(u).map(R=>(R.next?.name==="confirm"&&R.next.value>=0&&(e.replicatedConfirmation=+R.next.value),R.name));e.replicateTo=g.length===1&&+g[0]>=0?+g[0]:g[0]==="*"?void 0:g}r["x-replicate-from"]==="none"&&(e.replicateFrom=!1);let d=await It(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=oo(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new Cu.ClientError(g,400)}if(e.authorize=!0,o===HB&&s==="GET"){if(e?.user?.role?.permission?.super_user)return vB(wE);throw new Cu.ServerError("Forbidden",403)}switch(s){case"GET":case"HEAD":return l.get(c,e);case"POST":return l.post(c,e.data,e);case"PUT":return l.put(c,e.data,e);case"DELETE":return l.delete(c,e);case"PATCH":return l.patch(c,e.data,e);case"OPTIONS":i.setIfNone("Allow","GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE");return;case"CONNECT":return l.connect(c,null,e);case"TRACE":return"HarperDB is the terminating server";case"QUERY":return l.query(c,e.data,e);case"COPY":return l.copy(c,r.destination,e);case"MOVE":return l.move(c,r.destination,e);case"BREW":throw new Cu.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Cu.ServerError(`Method ${s} is not recognized`,501)}}),_=200,h;if(d==null)_=s==="GET"||s==="HEAD"?404:204,kb.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(d.status>0&&d.headers){let g=Pb(d.headers,i);return d.headers!==g&&(d.headers=g),d.data!==void 0&&(d.body=vf(d.data,e,d)),d}else if(h=e.lastModified){Dte[0]=h;let g=String.fromCharCode(34,(Br[0]&63)+62,(Br[0]>>6)+(Br[1]<<2&63)+62,(Br[1]>>4)+(Br[2]<<4&63)+62,(Br[2]>>2)+62,(Br[3]&63)+62,(Br[3]>>6)+(Br[4]<<2&63)+62,(Br[4]>>4)+(Br[5]<<4&63)+62,(Br[5]>>2)+62,(Br[6]&63)+62,(Br[6]>>6)+(Br[7]<<2&63)+62,34),R=r["if-none-match"];R&&g==R?(d?.onDone&&d.onDone(),_=304,d=void 0):i.setIfNone("ETag",g),kb.lastModified&&i.setIfNone("Last-Modified",new Date(h).toUTCString())}e.createdResource&&(_=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let m={status:_,headers:i,body:void 0},S=d?.wasLoadedFromSource?.();return S!==void 0&&(m.wasCacheMiss=S,!S&&h&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||h))/1e3))),d!==void 0&&(m.body=vf(d,e,m),s==="HEAD"&&(m.body=void 0)),m}catch(o){o.statusCode?o.statusCode===500?Mi.warn(o):Mi.info(o):Mi.error(o),o.statusCode===405&&(o.method&&(o.message+=` to handle HTTP method ${o.method.toUpperCase()||""}`),o.allow&&(o.allow.push("trace","head","options"),i.setIfNone("Allow",o.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:o.statusCode||500,headers:i,body:void 0};return c.body=vf(o.contentType?o:o.toString(),e,c),c}}function Mte(e){kb=e,e.includeExpensiveRecordCountEstimates&&(L_.prototype.includeExpensiveRecordCountEstimates=!0),!kB&&(kB=!0,wE=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return Lte(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{M_++;let s=new xn;FB||(FB=!0,C_(l=>{M_>0&&l.push({metric:"ws-connections",connections:M_,byThread:!0})}));let i;t.on("error",l=>{i=!0,Mi.warn(l)});let o;t.on("message",a(function(u){o||(o=oo(r.requestedContentType??r.headers.asObject["content-type"],!1));let f=o(u);Mt(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(f)},"message"));let c;t.on("close",()=>{M_--,jn(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=wE.getMatch(l,"ws");if(jn(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,Mt(m=>({count:m.count,total:M_}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let f=new pc(u.relativeURL),d=u.Resource;c=(await It(r,()=>d.connect(f,s,r)))[Symbol.asyncIterator]();let h;for(;!(h=await c.next()).done;){let m=await aa(h.value,r);t.send(m),Mt(m.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(S=>t._socket.once("drain",S))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?Mi.warn(l):Mi.info(l):Mi.error(l),t.close(vte[l.statusCode]||1011,l.toString())}t.close()},e))}function Fb(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,o]=s.trim().split("=");i=i.trim(),o&&(o=o.trim()),r={name:i.toLowerCase(),value:o,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var Mi,Cu,Br,Dte,kb,HB,kB,wE,FB,M_,vte,GB=Re(()=>{no();Li();Mi=M(ee()),Cu=M(he());bf();zl();mc();D_();UB();bf();NE();Br=new Uint8Array(8),Dte=new Float64Array(Br.buffer,0,1),kb={},HB="openapi";a(Lte,"http");M_=0;a(Mte,"start");vte={401:3e3,403:3003};a(Fb,"parseHeaderValue")});var Gb=C((gwe,$B)=>{var{recordAction:CE,recordActionBinary:qB}=(Li(),P(P_)),Ute=require("fastify-plugin"),xte=200;$B.exports=Ute(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),CE(o,"duration",u,d,f),qB(s.raw.statusCode<400,"success",u,d,f),qB(1,"response_"+s.raw.statusCode,u,d,f);let _=xte;i?.pipe?(i.on("data",g=>{_+=g.length}),i.on("end",()=>{CE(performance.now()-c,"transfer",u,d,f),CE(_,"bytes-sent",u,d,f)})):(_+=i?.length||0,CE(_,"bytes-sent",u,d,f));let h=o.toFixed(3),m=s.getHeader("Server-Timing"),S=`db;dur=${h}`;s.header("Server-Timing",m?`${m}, ${S}`:S)}),r()},{name:"hdb-request-time"})});var KB=C((Swe,VB)=>{var Bte=ot(),Hte={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};VB.exports=function(e){return Bte.validateObject(e,Hte)}});var PE=C((Twe,YB)=>{"use strict";var kte=(k(),P(q)).OPERATIONS_ENUM,qb=class{static{a(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=kte.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};YB.exports=qb});var x_={};Ue(x_,{createTokens:()=>Gte,getJWTRSAKeys:()=>UE,refreshOperationToken:()=>qte,validateOperationToken:()=>Kb,validateRefreshToken:()=>xE});async function UE(){if(DE)return DE;try{let e=v_.default.join(U_.default.getHdbBasePath(),uA),t=await LE.default.readFile(v_.default.join(e,cf.JWT_PASSPHRASE_NAME),"utf8"),r=await LE.default.readFile(v_.default.join(e,cf.JWT_PRIVATE_KEY_NAME),"utf8");return DE={publicKey:await LE.default.readFile(v_.default.join(e,cf.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},DE}catch(e){throw vE.default.error(e),new Qs.ClientError(Du.NO_ENCRYPTION_KEYS,Pu.INTERNAL_SERVER_ERROR)}}async function Gte(e){let t=(0,$b.validateBySchema)(e,vi.default.object({username:vi.default.string().optional(),password:vi.default.string().optional(),role:vi.default.string().optional(),expires_in:vi.default.alternatives(vi.default.string(),vi.default.number()).optional()}));if(t)throw new Qs.ClientError(t.message);let r;try{let d=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,d=!1),r=await(0,Vb.findAndValidateUser)(e.username,e.password,d)}catch(d){throw vE.default.error(d),new Qs.ClientError(Du.INVALID_CREDENTIALS,Pu.UNAUTHORIZED)}if(!r)throw new Qs.ClientError(Du.INVALID_CREDENTIALS,Pu.UNAUTHORIZED);let n=!1,s=!1;r.role?.permission&&(n=r.role.permission.super_user===!0,s=r.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s};e.role&&(i.role=e.role);let o=await UE(),c=await Lu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:e.expires_in??JB,algorithm:ME,subject:"operation"}),l=await Lu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:Fte,algorithm:ME,subject:"refresh"}),u=ny(l,"sha256");if((await(0,WB.update)(new zB.default(af,Yl.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new Qs.ClientError(Du.REFRESH_TOKEN_SAVE_FAILED,Pu.INTERNAL_SERVER_ERROR);return QB.default.signalUserChange(new jB.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function qte(e){let t=(0,$b.validateBySchema)(e,vi.default.object({refresh_token:vi.default.string().required()}).required());if(t)throw new Qs.ClientError(t.message);let{refresh_token:r}=e;await xE(r);let n=await UE(),s=await Lu.default.decode(r);return{operation_token:await Lu.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:JB,algorithm:ME,subject:"operation"})}}async function Kb(e){return XB(e,"operation")}async function xE(e){return XB(e,"refresh")}async function XB(e,t){try{let r=await UE(),n=await Lu.default.verify(e,r.publicKey,{algorithms:ME,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,Vb.findAndValidateUser)(n.username,void 0,!1);if(t==="refresh"&&!sy(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw vE.default.warn(r),r?.name==="TokenExpiredError"?new Qs.ClientError(Du.TOKEN_EXPIRED,Pu.FORBIDDEN):new Qs.ClientError(Du.INVALID_TOKEN,Pu.UNAUTHORIZED)}}var Lu,LE,v_,vi,$b,Qs,vE,Vb,WB,zB,QB,jB,U_,Pu,Du,JB,Fte,ME,DE,Mu=Re(()=>{Lu=M(require("jsonwebtoken")),LE=M(require("fs-extra")),v_=M(require("node:path")),vi=M(require("joi")),$b=M(ot());k();Qs=M(he()),vE=M(ee());Fp();Vb=M(Kn()),WB=M(An()),zB=M(PE()),QB=M(mo()),jB=M(Ys()),U_=M(le()),{HTTP_STATUS_CODES:Pu,AUTHENTICATION_ERROR_MSGS:Du}=Qs.hdb_errors;U_.default.initSync();JB=U_.default.get(x.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",Fte=U_.default.get(x.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",ME="RS256";a(UE,"getJWTRSAKeys");a(Gte,"createTokens");a(qte,"refreshOperationToken");a(Kb,"validateOperationToken");a(xE,"validateRefreshToken");a(XB,"validateToken")});var Yb=C((Owe,tH)=>{"use strict";var $te=KB(),vu=require("passport"),Vte=require("passport-local").Strategy,Kte=require("passport-http").BasicStrategy,Yte=require("util"),Wte=Kn(),eH=Yte.callbackify(Wte.findAndValidateUser),bwe=Un(),zte=(k(),P(q)),ZB=(Mu(),P(x_));vu.use(new Vte(function(e,t,r){eH(e,t,r)}));vu.use(new Kte(function(e,t,r){eH(e,t,r)}));vu.serializeUser(function(e,t){t(null,e)});vu.deserializeUser(function(e,t){t(null,e)});function Qte(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let o=e.headers.authorization.split(" ");n=o[0],s=o[1]}function i(o,c){return o?r(o):c?r(null,c):r("Must login")}switch(a(i,"handleResponse"),n){case"Basic":vu.authenticate("basic",{session:!1},(o,c)=>{i(o,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===zte.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?ZB.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):ZB.validateOperationToken(s).then(o=>{r(null,o)}).catch(o=>{r(o)});break;default:vu.authenticate("local",{session:!1},function(o,c){i(o,c)})(e,t,r);break}}a(Qte,"authorize");function jte(e,t){let r=$te(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(jte,"checkPermissions");tH.exports={authorize:Qte,checkPermissions:jte}});var BE=C((wwe,rH)=>{"use strict";var Jte=qn();rH.exports={writeTransaction:Xte};function Xte(e,t,r){return Jte.writeTransaction(e,t,r)}a(Xte,"writeTransaction")});var oH=C((Pwe,iH)=>{"use strict";var Zte=Yr(),ere=$s(),nH=ee(),tre=An(),Cwe=BE(),rre=require("clone"),zb=require("alasql"),nre=Lp(),sH=require("util"),sre=sH.promisify(ere.getTableSchema),ire=sH.promisify(Zte.search),ore=(k(),P(q)),Wb=ie();nre(zb);iH.exports={update:cre};var are="There was a problem performing this update. Please check the logs and try again.";async function cre({statement:e,hdb_user:t}){let r=await sre(e.table.databaseid,e.table.tableid),n=lre(e.columns);Wb.backtickASTSchemaItems(e);let{table:s,where:i}=e,o=rre(s),c=Wb.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=zb.parse(l).statements[0],f=await ire(u),d=ure(n,f);return dre(o,d,t)}a(cre,"update");function lre(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=zb.compile(`SELECT ${r.expression.toString()} AS [${ore.FUNC_VAL}] FROM ?`)}),t}catch(t){throw nH.error(t),new Error(are)}}a(lre,"createUpdateRecord");function ure(e,t){return Wb.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}a(ure,"buildUpdateRecords");async function dre(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await tre.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){nH.error(`Error delete new_attributes from update response: ${i}`)}return s}a(dre,"updateRecords")});var cH=C((vwe,aH)=>{var fre=require("alasql"),_re=Yr(),hre=ee(),mre=qn(),jb=require("util"),Qb=ie(),pre=(k(),P(q)),Ere=$s(),Lwe=BE(),Mwe=An(),gre="record",Sre="successfully deleted",Tre=jb.callbackify(bre),Are=jb.promisify(_re.search),Rre=jb.promisify(Ere.getTableSchema);aH.exports={convertDelete:Tre};function yre(e){return`${e.deleted_hashes.length} ${gre}${e.deleted_hashes.length===1?"":"s"} ${Sre}`}a(yre,"generateReturnMessage");async function bre({statement:e,hdb_user:t}){let r=await Rre(e.table.databaseid,e.table.tableid);Qb.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=Qb.isEmpty(s)?"":` WHERE ${s.toString()}`,o=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=fre.parse(o).statements[0],l={operation:pre.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await Are(c);let u=await mre.deleteRecords(l);return Qb.isEmptyOrZeroLength(u.message)&&(u.message=yre(u)),delete u.txn_time,u}catch(u){throw hre.error(u),u.hdb_code?u.message:u}}a(bre,"convertDelete")});var _H=C((xwe,fH)=>{"use strict";var Ore=_o(),{hdb_errors:lH}=he(),{getDatabases:uH}=(xe(),P(ct));fH.exports={checkSchemaExists:dH,checkSchemaTableExists:Nre,schema_describe:Ore};async function dH(e){if(!uH()[e])return lH.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(dH,"checkSchemaExists");async function Nre(e,t){let r=await dH(e);if(r)return r;if(!uH()[e][t])return lH.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(Nre,"checkSchemaTableExists")});function Jb(e){let t=e.get(HE),r=t?(0,Uu.unpack)(t):null;r||(r={remoteNameToId:{}});let n=et(),s=!1;r.nodeName=et();let i=r.remoteNameToId;if(i[n]!==0){let o=0,c;for(let l in i){let u=i[l];u===0?c=l:u>o&&(o=u)}if(c){o++,i[c]=o;let l=[Symbol.for("seq"),o];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:H_(e)??1,nodes:[]})})}i[n]=0,e.putSync(HE,(0,Uu.pack)(r))}return r}function B_(e){return Jb(e).remoteNameToId}function mH(e,t){let r=Jb(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(HE,(0,Uu.pack)(r)),s}function kE(e,t){let r=Jb(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(HE,(0,Uu.pack)(r))}return hH.trace?.("The remote node name map",e,n,s),s}var hH,Uu,HE,Xb=Re(()=>{hH=M(ks());ps();Uu=require("msgpackr"),HE=Symbol.for("remote-ids");a(Jb,"getIdMappingRecord");a(B_,"exportIdMapping");a(mH,"remoteToLocalNodeId");a(kE,"getIdOfRemoteNode")});var Zb={};Ue(Zb,{commits_awaiting_replication:()=>xu,getHDBNodeTable:()=>ir,getReplicationSharedStatus:()=>FE,iterateRoutes:()=>F_,shouldReplicateToNode:()=>k_,subscribeToNodeUpdates:()=>Bu});function ir(){return pH||(pH=ft({table:"hdb_nodes",database:"system",attributes:[{name:"name",isPrimaryKey:!0},{attribute:"subscriptions"},{attribute:"system_info"},{attribute:"url"},{attribute:"routes"},{attribute:"ca"},{attribute:"ca_info"},{attribute:"replicates"},{attribute:"revoked_certificates"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]}))}function FE(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Bu(e){ir().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;TH.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 ir().search({}))if(i.shard!=null){let o=s.get(i.shard);o||s.set(i.shard,o=[]),o.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function k_(e,t){let r=ga.default.get(x.REPLICATION_DATABASES);return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&(r==="*"||r?.find?.(n=>n.name===t&&(!n.sharded||e.shard===ga.default.get(x.REPLICATION_SHARD))))&&ir().primaryStore.get(et())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function wre(){Bu(e=>{Sa({},(t,r)=>{let n=e.name,s=EH.get(n);if(s||EH.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=FE(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of xu.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*F_(e){for(let t of e.routes||[]){let r=t.url,n;if(typeof t=="string"?t.includes("://")?r=t:n=t:n=t.hostname??t.host,n&&!r){let s=ga.default.get(x.REPLICATION_SECUREPORT)??(!ga.default.get(x.REPLICATION_PORT)&&ga.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||ga.default.get(x.REPLICATION_PORT)||ga.default.get(x.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){gH.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 gH,SH,ga,TH,pH,EH,xu,Xc=Re(()=>{xe();ps();Qm();gH=require("worker_threads"),SH=M(he()),ga=M(le());k();TH=M(ks());server.nodes=[];a(ir,"getHDBNodeTable");a(FE,"getReplicationSharedStatus");a(Bu,"subscribeToNodeUpdates");a(k_,"shouldReplicateToNode");EH=new Map;OD((e,t,r)=>{if(r>server.nodes.length)throw new SH.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);xu||(xu=new Map,wre());let n=xu.get(e);return n||(n=[],xu.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(wre,"startSubscriptionToReplications");a(F_,"iterateRoutes")});var yH={};Ue(yH,{connectedToNode:()=>Zc,disconnectedFromNode:()=>ku,ensureNode:()=>So,requestClusterStatus:()=>RH,startOnMainThread:()=>rO});async function rO(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){GE.set(i,H_(l.auditStore));break}}}xi.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes?.search([])||[])i.push(o);for(let o of F_(e))try{let c=!o.subscriptions;if(c){let u=et(),f=ir().primaryStore.get(u);if(f!==null){let d=e.url??Ta();(f===void 0||f.url!==d||f.shard!==e.shard)&&await So(u,{name:u,url:d,shard:e.shard,replicates:!0})}}let l=o.trusted!==!1;if(c&&o.replicates==null&&(o.replicates=!0),i.find(u=>u.url===o.url))continue;s(o)}catch(c){console.error(c)}Bu(s)});let n;function s(i,o=i?.name){let c=et()&&o===et()||Ta()&&i?.url===Ta();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let _ of ir().search([]))_.replicates&&_.name!==o&&s(_,_.name);n=d}if(nt.trace("Setting up node replication for",i),!i){for(let[d,_]of Ui){let h;for(let[m,{worker:S,nodes:g}]of _){let R=g[0];if(R&&R.name==o){h=!0;for(let[E,{worker:T}]of _)_.delete(E),nt.warn("Node was deleted, unsubscribing from node",o,E,d),T?.postMessage({type:"unsubscribe-from-node",node:o,database:E,url:d});break}}if(h){Ui.get(d).iterator.remove(),Ui.delete(d);return}}return}if(c)return;if(!i.url){nt.info(`Node ${i.name} is missing url`);return}let l=Ui.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(nt.info(`Added node ${i.name} at ${i.url} for process ${et()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[d,_]of Hu)if(i.url===_.url){Hu.delete(d);break}Hu.set(i.name,i)}let u=Xe();if(l||(l=new Map,Ui.set(i.url,l)),l.iterator=Sa(e,(d,_,h)=>{h?f(_,!0):f(_,!1)}),i.subscriptions)for(let d of i.subscriptions){let _=d.database||d.schema;u[_]||(nt.warn(`Database ${_} not found for node ${i.name}, making a subscription anyway`),f(_,!1))}function f(d,_){nt.trace("Setting up replication for database",d,"on node",i.name);let h=l.get(d),m,S=[{replicateByDefault:_,...i}];GE.has(d)&&(S.push({replicateByDefault:_,name:et(),start_time:GE.get(d),end_time:Date.now(),replicates:!0}),GE.delete(d));let g=k_(i,d),R=xi.workers.filter(E=>E.name==="http");if(h?(m=h.worker,h.nodes=S):g&&(t=t%R.length,m=R[t++],l.set(d,{worker:m,nodes:S,url:i.url}),m?.on("exit",()=>{l.get(d)?.worker===m&&(l.delete(d),f(d,_))})),g)setTimeout(()=>{let E={type:"subscribe-to-node",database:d,nodes:S};m?m.postMessage(E):G_(E)},Ire);else{nt.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],ir().primaryStore.get(et())?.replicates),ir().primaryStore.get(et())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};m?m.postMessage(E):$E(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),ku=a(function(i){try{nt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(Hu.keys()),c=o.sort(),l=c.indexOf(i.name||js(i.url));if(l===-1){nt.warn("Disconnected node not found in node map",i.name,o);return}let u=Ui.get(i.url),f=u?.get(i.database);if(!f){nt.warn("Disconnected node not found in replication map",i.database,u);return}if(f.connected=!1,i.finished||!tO.default.get(x.REPLICATION_FAILOVER))return;let d=f.nodes[0];if(!(d.replicates===!0||d.replicates?.sends||d.subscriptions?.length))return;let _=d.shard,h=(l+1)%c.length;for(;l!==h;){let m=c[h],S=Hu.get(m);u=Ui.get(S.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==_){h=(h+1)%c.length;continue}let{worker:R,nodes:E}=g,T=!1;for(let N of f.nodes){if(E.some(v=>v.name===N.name)){nt.info(`Disconnected node is already failing over to ${m} for ${i.database}`);continue}N.end_time<Date.now()||(E.push(N),T=!0)}if(f.nodes=[f.nodes[0]],!T){nt.info(`Disconnected node ${i.name} has no nodes to fail over to ${m}`);return}nt.info(`Failing over ${i.database} from ${i.name} to ${m}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:E}):G_({database:i.database,nodes:E});return}nt.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){nt.error("Error failing over node",o)}},"disconnectedFromNode"),Zc=a(function(i){let o=Ui.get(i.url),c=o?.get(i.database);if(!c){nt.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){nt.info("Connected node has no nodes",i.database,c);return}if(!l.name){nt.debug("Connected node is not named yet",i.database,c);return}c.nodes=[l];let u=!1;for(let f of Ui.values()){let d=f.get(i.database);if(!d||d==c)continue;let{worker:_,nodes:h,connected:m}=d;if(h)if(m===!1&&h[0].shard===l.shard)u=!0,c.nodes.push(h[0]);else{let S=h.filter(g=>g.name!==l.name);S.length<h.length&&(d.nodes=S,_.postMessage({type:"subscribe-to-node",database:i.database,nodes:h}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,xi.onMessageByType)("disconnected-from-node",ku),(0,xi.onMessageByType)("connected-to-node",Zc),(0,xi.onMessageByType)("request-cluster-status",RH)}function RH(e,t){let r=[];for(let[n,s]of Hu)try{let i=Ui.get(s.url);nt.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let o=[];if(i){for(let[l,{worker:u,connected:f,nodes:d,latency:_}]of i)o.push({database:l,connected:f,latency:_,thread_id:u?.threadId,nodes:d.filter(h=>!(h.end_time<Date.now())).map(h=>h.name)});let c=(0,eO.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){nt.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function So(e,t){let r=ir();e=e??js(t.url),t.name=e;try{if(t.ca){let s=new AH.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subject_alt_name:s.subjectAltName,serial_number:s.serialNumber,valid_from:s.validFrom,valid_to:s.validTo}}}catch(s){nt.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(nt.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!tO.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,eO.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of o)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...o,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}nt.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var xi,qE,nt,eO,tO,AH,Ire,Ui,ku,Zc,Hu,GE,q_=Re(()=>{xe();xi=M(it());ps();qE=require("worker_threads");Xc();nt=M(ee()),eO=require("lodash"),tO=M(le());k();AH=require("crypto"),Ire=200,Ui=new Map,Hu=new Map,GE=new Map;a(rO,"startOnMainThread");a(RH,"requestClusterStatus");qE.parentPort&&(ku=a(e=>{qE.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Zc=a(e=>{qE.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,xi.onMessageByType)("subscribe-to-node",e=>{G_(e)}),(0,xi.onMessageByType)("unsubscribe-from-node",e=>{$E(e)}));a(So,"ensureNode")});var Zs=C(YH=>{"use strict";var or=require("path"),{watch:Cre}=require("chokidar"),bn=require("fs-extra"),Fu=require("node-forge"),CH=require("net"),{generateKeyPair:sO,X509Certificate:To,createPrivateKey:PH}=require("crypto"),Pre=require("util");sO=Pre.promisify(sO);var bt=Fu.pki,Js=require("joi"),{v4:DH}=require("uuid"),{validateBySchema:cO}=ot(),Tt=ee(),Jn=le(),Es=(k(),P(q)),{CONFIG_PARAMS:tl}=Es,Xs=ay(),{ClientError:Ra}=he(),VE=require("node:tls"),{relative:LH,join:Dre}=require("node:path"),{CERT_PREFERENCE_APP:Zwe,CERTIFICATE_VALUES:bH}=Xs,Lre=_c(),iO=Lt(),{table:Mre,getDatabases:vre,databases:nO}=(xe(),P(ct)),{getJWTRSAKeys:OH}=(Mu(),P(x_));Object.assign(YH,{generateKeys:dO,updateConfigCert:FH,createCsr:Gre,signCertificate:qre,setCertTable:Gu,loadCertificates:BH,reviewSelfSignedCert:_O,createTLSSelector:qH,listCertificates:VH,addCertificate:zre,removeCertificate:jre,createNatsCerts:Kre,generateCertsKeys:Vre,getReplicationCert:V_,getReplicationCertAuth:Fre,renewSelfSigned:Yre,hostnamesFromCert:hO,getKey:Jre});var{urlToNodeName:MH,getThisNodeUrl:Ure,getThisNodeName:YE,clearThisNodeName:xre}=(ps(),P(Oa)),{readFileSync:Bre,statSync:vH}=require("node:fs"),eIe=le(),{getTicketKeys:Hre,onMessageFromWorkers:kre}=it(),Aa=ee(),{isMainThread:UH}=require("worker_threads"),{TLSSocket:xH,createSecureContext:tIe}=require("node:tls"),lO=3650,$_=["127.0.0.1","localhost","::1"],uO=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];kre(async e=>{e.type===Es.ITC_EVENT_TYPES.RESTART&&(Jn.initSync(!0),await _O())});var Hr;function ba(){return Hr||(Hr=vre().system.hdb_certificate,Hr||(Hr=Mre({table:"hdb_certificate",database:"system",attributes:[{name:"name",isPrimaryKey:!0},{attribute:"uses"},{attribute:"certificate"},{attribute:"is_authority"},{attribute:"private_key_name"},{attribute:"details"},{attribute:"is_self_signed"},{attribute:"__updatedtime__"}]}))),Hr}a(ba,"getCertTable");async function V_(){let e=qH("operations-api"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(YE());if(!r)return;let n=new To(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(V_,"getReplicationCert");async function Fre(){ba();let e=(await V_()).options.cert,r=new To(e).issuer.match(/CN=(.*)/)?.[1];return Hr.get(r)}a(Fre,"getReplicationCertAuth");var NH,ya=new Map;function BH(){if(NH)return;NH=!0;let e=[{configKey:tl.TLS},{configKey:tl.OPERATIONSAPI_TLS}];ba();let t=or.dirname(iO.getConfigFilePath()),r;for(let{configKey:n}of e){let s=iO.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&LH(Dre(t,"keys"),o);c&&wH(o,l=>{ya.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&UH){let f;wH(u,d=>{if(bH.cert===d)return;let _=i.hostname??i.hostnames??i.host??i.hosts;_&&!Array.isArray(_)&&(_=[_]);let h=GH(u),m=new To(h),S;try{S=KH(m)}catch(T){logger.error("error extracting host name from certificate",T);return}if(S==null){logger.error("No host name found on certificate");return}if(m.checkIssued(new To(bH.cert)))return;let g=Hr.primaryStore.get(S),R=vH(u).mtimeMs,E=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&R<=E){R<E&&Tt.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}r=Hr.put({name:S,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:_,file_timestamp:R,details:{issuer:m.issuer.replace(/\n/g," "),subject:m.subject?.replace(/\n/g," "),subject_alt_name:m.subjectAltName,serial_number:m.serialNumber,valid_from:m.validFrom,valid_to:m.validTo}})},l?"certificate authority":"certificate")}}}}}return r}a(BH,"loadCertificates");function wH(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&UH&&Tt.warn(`Reloading ${r}:`,i),n=c,t(GH(i)))}catch(c){Tt.error(`Error loading ${r}:`,i,c)}},"loadFile");bn.existsSync(e)?s(e,vH(e)):Tt.error(`${r} file not found:`,e),Cre(e,{persistent:!1}).on("change",s)}a(wH,"loadAndWatch");function oO(){let e=Ure();if(e==null){let t=$_[0];return Tt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return MH(e)}a(oO,"getHost");function KE(){let e=YE();if(e==null){let t=$_[0];return Tt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(KE,"getCommonName");async function Gre(){let e=await V_(),t=bt.certificateFromPem(e.options.cert),r=bt.privateKeyFromPem(e.options.key);Tt.info("Creating CSR with cert named:",e.name);let n=bt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:KE()},...uO];Tt.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:HH()}];return Tt.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Fu.pki.certificationRequestToPem(n)}a(Gre,"createCsr");function HH(){let e=$_.includes(KE())?$_:[...$_,KE()];return e.includes(oO())||e.push(oO()),[{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=>CH.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(HH,"certExtensions");async function qre(e){let t={},r=or.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;ba();for await(let f of Hr.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if(ya.has(f.private_key_name)){n=ya.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await bn.exists(or.join(r,f.private_key_name))){n=bn.readFile(or.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await aO();s=f.ca,n=f.private_key}n=bt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=bt.certificateFromPem(s.certificate);Tt.info("Signing CSR with cert named",s.name);let o=bt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return Tt.error(f),new Error("Error verifying CSR: "+f.message)}let c=Fu.pki.createCertificate();c.serialNumber=Math.random().toString().slice(2,10),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+lO),Tt.info("sign cert setting validity:",c.validity),Tt.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),Tt.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;Tt.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,Fu.md.sha256.create()),t.certificate=bt.certificateToPem(c)}else Tt.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(qre,"signCertificate");async function $re(e,t){await Gu({name:YE(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Gu({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:bt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}a($re,"createCertificateTable");async function Gu(e){let t=new To(e.certificate);e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},ba(),await Hr.patch(e)}a(Gu,"setCertTable");async function dO(){let e=await sO("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{public_key:bt.publicKeyFromPem(e.publicKey),private_key:bt.privateKeyFromPem(e.privateKey)}}a(dO,"generateKeys");async function fO(e,t,r){let n=bt.createCertificate();if(!t){let o=await V_();t=bt.certificateFromPem(o.options.cert).publicKey}n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+lO);let i=[{name:"commonName",value:KE()},...uO];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(HH()),n.sign(e,Fu.md.sha256.create()),bt.certificateToPem(n)}a(fO,"generateCertificates");async function aO(){let e=await VH(),t;for(let r of e){if(!r.is_authority)continue;let n=await $H(r.private_key_name);if(r.private_key_name&&n&&new To(r.certificate).checkPrivateKey(PH(n))){Tt.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;Tt.trace("No CA found with matching private key")}a(aO,"getCertAuthority");async function kH(e,t,r=!0){let n=bt.createCertificate();n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+lO);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${Jn.get(tl.REPLICATION_HOSTNAME)??MH(Jn.get(tl.REPLICATION_URL))??DH().split("-")[0]}`},...uO];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Fu.md.sha256.create());let o=or.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=or.join(o,Xs.PRIVATEKEY_PEM_NAME);return r&&await bn.writeFile(c,bt.privateKeyToPem(e)),n}a(kH,"generateCertAuthority");async function Vre(){let{private_key:e,public_key:t}=await dO(),r=await kH(e,t),n=await fO(e,t,r);await $re(n,r),FH()}a(Vre,"generateCertsKeys");async function Kre(){let e=await fO(bt.privateKeyFromPem(Xs.CERTIFICATE_VALUES.key),void 0,bt.certificateFromPem(Xs.CERTIFICATE_VALUES.cert)),t=or.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=or.join(t,Xs.NATS_CERTIFICATE_PEM_NAME);await bn.exists(r)||await bn.writeFile(r,e);let n=or.join(t,Xs.NATS_CA_PEM_NAME);await bn.exists(n)||await bn.writeFile(n,Xs.CERTIFICATE_VALUES.cert)}a(Kre,"createNatsCerts");async function Yre(){ba();for await(let e of Hr.search([{attribute:"is_self_signed",value:!0}]))await Hr.delete(e.name);await _O()}a(Yre,"renewSelfSigned");async function _O(){xre(),await BH(),ba();let e=await aO();if(!e){Tt.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=a(u=>{try{return{key:bt.privateKeyFromPem(bn.readFileSync(u)),keyPath:u}}catch(f){return Tt.warn(`Failed to parse private key from ${u}:`,f.message),{key:null,keyPath:u}}},"tryToParseKey"),n=Jn.get(tl.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let f=r(u.privateKey);if(s=f.key,i=f.keyPath,f.key)break}}else{let u=Jn.get(tl.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=or.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),c=LH(o,i);s||(Tt.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{private_key:s}=await dO(),bn.existsSync(or.join(o,Xs.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${DH().split("-")[0]}.pem`),await bn.writeFile(or.join(o,c),bt.privateKeyToPem(s)));let l=await kH(s,bt.setRsaPublicKey(s.n,s.e),!1);await Gu({name:l.subject.getField("CN").value,uses:["https"],certificate:bt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await V_()){let r=YE();Tt.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await aO();let n=bt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await fO(bt.privateKeyFromPem(e.private_key),s,n);await Gu({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(_O,"reviewSelfSignedCert");function FH(){let e=Lre(Object.keys(Es.CONFIG_PARAM_MAP),!0),t=or.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME),r=or.join(t,Xs.PRIVATEKEY_PEM_NAME),n=or.join(t,Xs.NATS_CERTIFICATE_PEM_NAME),s=or.join(t,Xs.NATS_CA_PEM_NAME),i=Es.CONFIG_PARAMS,o={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(o[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(o[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,o[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,o[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),iO.updateConfigValue(void 0,void 0,o,!1,!0)}a(FH,"updateConfigCert");function GH(e){return e.startsWith("-----BEGIN")?e:Bre(e,"utf8")}a(GH,"readPEM");var IH=VE.createSecureContext;VE.createSecureContext=function(e){if(!e.cert||!e.key)return IH(e);let t={...e};delete t.key,delete t.cert;let r=IH(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var Wre=xH.prototype._init;xH.prototype._init=function(e,t){Wre.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,o)=>{this.sni_context=o?.context||o,this.certCbDone()})}};var el=new Map;function qH(e,t){let r=new Map,n,s=!1;return i.initialize=o=>i.ready?i.ready:(o&&(o.secureContexts=r,o.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),el.clear();let f=0;for await(let d of nO.system.hdb_certificate.search([])){let _=d.certificate,h=new To(_);d.is_authority&&(h.asString=_,el.set(h.subject,_))}for await(let d of nO.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let _=e==="operations-api",h=d.is_self_signed?1:2;_&&d.uses?.includes?.("operations")&&(h+=1);let m=await $H(d.private_key_name),S=d.certificate,g=new To(S);if(el.has(g.issuer)&&(S+=`
21
21
  `+el.get(g.issuer)),!m||!S)throw new Error("Missing private key or certificate for secure server");let R={ciphers:d.ciphers,ticketKeys:Hre(),availableCAs:el,ca:t&&Array.from(el.values()),cert:S,key:m,key_file:d.private_key_name,is_self_signed:d.is_self_signed};o&&(R.sessionIdContext=o.sessionIdContext);let E=VE.createSecureContext(R);E.name=d.name,E.options=R,E.quality=h,E.certificateAuthorities=Array.from(el),E.certStart=S.toString().slice(0,100);let T=d.hostnames??hO(g);Array.isArray(T)||(T=[T]);let N;for(let v of T)if(v){v[0]==="*"&&(s=!0,v=v.slice(1)),v===oO()&&(h+=2),CH.isIP(v)&&(N=!0);let H=r.get(v)?.quality??0;h>H&&r.set(v,E)}else Aa.error("No hostname found for certificate at",VE.certificate);Aa.trace("Adding TLS",E.name,"for",o.ports||"client","cert named",d.name,"hostnames",T,"quality",h,"best quality",f),h>f&&(i.defaultContext=n=E,f=h,o&&(o.defaultContext=E))}catch(_){Aa.error("Error applying TLS for",d.name,_)}o?.secureContextsListeners.forEach(d=>d()),c(n)}catch(f){l(f)}}a(u,"updateTLS"),nO.system.hdb_certificate.subscribe({listener:a(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(o,c){Aa.info("TLS requested for",o||"(no SNI)");let l=o;for(;;){let f=r.get(l);if(f)return Aa.debug("Found certificate for",o,f.certStart),f.updatedContext&&(f=f.updatedContext),c(null,f);if(s&&l){let d=l.indexOf(".",1);d<0?l="":l=l.slice(d)}else break}o?Aa.debug("No certificate found to match",o,"using the default certificate"):Aa.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):Aa.info("No default certificate found"),c(null,u)}a(i,"SNICallback")}a(qH,"createTLSSelector");async function $H(e){let t=ya.get(e);return!t&&e?await bn.readFile(or.join(Jn.get(tl.ROOTPATH),Es.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a($H,"getPrivateKeyByName");async function VH(){ba();let e=[];for await(let t of Hr.search([]))e.push(t);return e}a(VH,"listCertificates");async function zre(e){let t=cO(e,Js.object({name:Js.string().required(),certificate:Js.string().required(),is_authority:Js.boolean().required(),private_key:Js.string(),hosts:Js.array(),uses:Js.array()}));if(t)throw new Ra(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,o=new To(n),c=!1,l=!1,u;for(let[h,m]of ya)!s&&!c&&o.checkPrivateKey(PH(m))&&(c=!0,u=h),s&&s===m&&(l=!0,u=h);if(!i&&!s&&!c)throw new Ra("A suitable private key was not found for this certificate");let f;if(!r){try{f=KH(o)}catch(h){Tt.error(h)}if(f==null)throw new Ra("Error extracting certificate common name, please provide a name parameter")}let d=Qre(r??f);s&&!c&&!l&&(await bn.writeFile(or.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME,d+".pem"),s),ya.set(d,s));let _={name:r??f,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(_.private_key_name=u??d+".pem"),e.ciphers&&(_.ciphers=e.ciphers),await Gu(_),"Successfully added certificate: "+d}a(zre,"addCertificate");function Qre(e){return e.replace(/[^a-z0-9\.]/gi,"-")}a(Qre,"sanitizeName");async function jre(e){let t=cO(e,Js.object({name:Js.string().required()}));if(t)throw new Ra(t.message);let{name:r}=e;ba();let n=await Hr.get(r);if(!n)throw new Ra(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Hr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(Tt.info("Removing private key named",s),await bn.remove(or.join(Jn.getHdbBasePath(),Es.LICENSE_KEY_DIR_NAME,s)))}return await Hr.delete(r),"Successfully removed "+r}a(jre,"removeCertificate");function KH(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||hO(e)[0]}a(KH,"getPrimaryHostName");function hO(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(hO,"hostnamesFromCert");async function Jre(e){if(e.bypass_auth!==!0)throw new Ra("Unauthorized","401");let t=cO(e,Js.object({name:Js.string().required()}));if(t)throw new Ra(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await OH()).privateKey;if(r===".jwtPublic")return(await OH()).publicKey;if(ya.get(r))return ya.get(e.name);throw new Ra("Key not found")}a(Jre,"getKey")});var hk={};Ue(hk,{CONFIRMATION_STATUS_POSITION:()=>dk,NodeReplicationConnection:()=>$u,OPERATION_REQUEST:()=>gO,RECEIVED_TIME_POSITION:()=>TO,RECEIVED_VERSION_POSITION:()=>SO,RECEIVING_STATUS_POSITION:()=>AO,RECEIVING_STATUS_RECEIVING:()=>_k,RECEIVING_STATUS_WAITING:()=>fk,SENDING_TIME_POSITION:()=>K_,createWebSocket:()=>eg,database_subscriptions:()=>wa,replicateOverWS:()=>Y_,table_update_listeners:()=>yO});async function eg(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(!pO){let l=(0,ak.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),pO=u.secureContexts}if(i=pO.get(s),i&&ce.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let o={};r&&(o.Authorization=r);let c={headers:o,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,lk.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(XE?.caCount!==Ao.size&&(XE=ck.createSecureContext({...i.options,ca:[...Ao,...i.options.availableCAs.values()]}),XE.caCount=Ao.size),c.secureContext=XE),new ik.WebSocket(e,"harperdb-replication-v1",c)}function Y_(e,t,r){let n=t.port||t.securePort,s=rl.pid%1e3+"-"+ok.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3),i=0,o=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(o.buffer,0,1024),u=t.database,f=t.databaseSubscriptions||wa,d,_,h=!1,m=t.subscription;m?.then&&m.then(A=>m=A);let S=t.tables||u&&Xe()[u];if(!r){ce.error?.("No authorization provided"),cn(1008,"Unauthorized");return}let g=new Map,R=[],E=r.name;E&&t.connection&&(t.connection.nodeName=E);let T,N,v,H,X,W,$,se=6e4,z,fe=0,ue=0,Z=0,Ae=sk.default.get(x.REPLICATION_BLOBTIMEOUT)??12e4,me=new Map,ye=[],Ht=0,dt;if(t.url){let A=a(()=>{X&&ue===e._socket?.bytesRead&&Z===e._socket?.bytesWritten?e.terminate():(X=performance.now(),e.ping(),ue=e._socket?.bytesRead,Z=e._socket?.bytesWritten)},"send_ping");v=setInterval(A,rk).unref(),A()}else Ln();e._socket?.setMaxListeners(200);function Ln(){clearTimeout(H),ue=e._socket?.bytesRead,Z=e._socket?.bytesWritten,H=setTimeout(()=>{ue===e._socket?.bytesRead&&Z===e._socket?.bytesWritten&&(ce.warn?.(`Timeout waiting for ping from ${E}, terminating connection and reconnecting`),e.terminate())},rk*2).unref()}a(Ln,"resetPingTimer");function an(){return _||(_=FE(d,u,E)),_}a(an,"getSharedStatus"),u&&jo(u);let Cr,Qd,oc=[],XT=[],ZT,kt=[],jd=[],Jd=[],eA=150,wm=25,Xd=0,Ce=0,Zd=!1,Ji,Pr,Mn,ac;e.on("message",A=>{fe=performance.now();try{let y=A.dataView=new nl(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let B=(0,Ze.decode)(A),[w,D,G]=B;switch(w){case zH:{if(D){if(E){if(E!==D){ce.error?.(s,`Node name mismatch, expecting to connect to ${E}, but peer reported name as ${D}, disconnecting`),e.send((0,Ze.encode)([qu])),cn(1008,"Node name mismatch");return}}else if(E=D,t.connection?.tentativeNode){let oe=t.connection.tentativeNode;oe.name=E,t.connection.tentativeNode=null,So(E,oe)}if(t.connection&&(t.connection.nodeName=E),ce.debug?.(s,"received node name:",E,"db:",u),!u)try{jo(u=B[2]),u==="system"&&(Cr=Sa(t,(oe,V)=>{Qo(V)&&rf(V)}),e.on("close",()=>{Cr?.remove()}))}catch(oe){ce.warn?.(s,"Error setting database",oe),e.send((0,Ze.encode)([qu])),cn(1008,oe.message);return}zo()}break}case ek:{ce.debug?.(s,"Received table definitions for",D.map(oe=>oe.table));for(let oe of D){let V=B[2];oe.database=V;let J;Qo(V)&&(V==="system"?We[V]?.[oe.table]||(J=L(oe,We[V]?.[oe.table])):J=L(oe,We[V]?.[oe.table]),d||(d=J?.auditStore),S||(S=Xe()?.[V]))}break}case qu:cn();break;case gO: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)([zE,V]))},V=>{e.send((0,Ze.encode)([zE,{requestId:D.requestId,error:V instanceof Error?V.toString():V}]))})}catch(oe){e.send((0,Ze.encode)([zE,{requestId:D.requestId,error:oe instanceof Error?oe.toString():oe}]))}break;case zE:let{resolve:j,reject:Q}=g.get(D.requestId);D.error?Q(new Error(D.error)):j(D),g.delete(D.requestId);break;case mO:let F=B[3];S||(u?ce.error?.(s,"No tables found for",u):ce.error?.(s,"Database name never received"));let ve=S[F];ve=L({table:F,database:u,attributes:D.attributes,schemaDefined:D.schemaDefined},ve),oc[G]={name:F,decoder:new Ze.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:D.typedStructs,structures:D.structures}),getEntry(oe){return ve.primaryStore.getEntry(oe)},rootStore:ve.primaryStore.rootStore};break;case QH:ac=d?mH(D,d):new Map,ZT=B[2],ce.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${ZT}`);break;case jH:let Ee=G;Jd[Ee]=D;break;case ZH:an()[dk]=D,ce.trace?.(s,"received and broadcasting committed update",D),an().buffer.notify();break;case XH:T=D,m.send({type:"end_txn",localTime:T,remoteNodeIds:R});break;case QE:{let oe=B[1],{fileId:V,size:J,finished:de,error:pe}=oe,ae=me.get(V);ce.debug?.("Received blob",V,"has stream",!!ae,"connectedToBlob",!!ae?.connectedToBlob,"length",B[2].length,"finished",de),ae||(ae=new EO.PassThrough,ae.expectedSize=J,me.set(V,ae)),ae.lastChunk=Date.now();let Ie=B[2];Mt(Ie.byteLength,"bytes-received",`${E}.${u}`,"replication","blob");try{de?(pe?(ae.on("error",()=>{}),ae.destroy(new Error("Blob error: "+pe+" for record "+(ae.recordId??"unknown")+" from "+E))):ae.end(Ie),ae.connectedToBlob&&me.delete(V)):ae.write(Ie)}catch(He){ce.error?.(`Error receiving blob for ${ae.recordId} from ${E} and streaming to storage`,He),me.delete(V)}break}case JH:{let oe=D,V;try{let J=B[3],de=XT[G]||(XT[G]=S[B[4]]);if(!de)return ce.warn?.("Unknown table id trying to handle record request",G);let pe=de.primaryStore.getBinaryFast(Symbol.for("structures")),ae=pe?.length;if(ae>0&&ae!==Ce){Ce=ae;let He=(0,Ze.decode)(pe);e.send((0,Ze.encode)([mO,{typedStructs:He.typed,structures:He.named},G,de.tableName]))}let Ie=de.primaryStore.getBinaryFast(J);if(Ie){let He=de.primaryStore.decoder.decode(Ie,{valueAsBuffer:!0}),De=He.value;He[Nc]&Ur&&(De=Buffer.from(De),Pf(()=>de.primaryStore.decoder.decode(Ie),rt=>cc(rt,J),de.primaryStore.rootStore)),V=(0,Ze.encode)([WE,oe,{value:De,expiresAt:He.expiresAt,version:He.version,residencyId:He.residencyId,nodeId:He.nodeId,user:He.user}])}else V=(0,Ze.encode)([WE,oe])}catch(J){V=(0,Ze.encode)([WE,oe,{error:J.message}])}e.send(V);break}case WE:{let{resolve:oe,reject:V,tableId:J,key:de}=g.get(B[1]),pe=B[2];if(pe?.error)V(new Error(pe.error));else if(pe){let ae;dp(()=>{let Ie=oc[J].decoder.decode(pe.value);pe.value=Ie,pe.key=de,oe(pe)||ae&&setTimeout(()=>ae.forEach(cp),6e4).unref()},d?.rootStore,Ie=>{let He=ef(Ie,de);return ae||(ae=[]),ae.push(He),He})}else oe();g.delete(B[1]);break}case WH:{Mn=D;let oe,V,J=!1;if(m){if(u!==m.databaseName&&!m.then){ce.error?.("Subscription request for wrong database",u,m.databaseName);return}}else m=f.get(u);if(ce.debug?.(s,"received subscription request for",u,"at",Mn),!m){let Oe;m=new Promise(Ft=>{ce.debug?.("Waiting for subscription to database "+u),Oe=Ft}),m.ready=Oe,wa.set(u,m)}if(r.name)V=ir().subscribe(r.name),V.then(async Oe=>{oe=Oe;for await(let Ft of oe){let Nt=Ft.value;if(!(Nt?.replicates===!0||Nt?.replicates?.receives||Nt?.subscriptions?.some(yr=>(yr.database||yr.schema)===u&&yr.publish!==!1))){J=!0,e.send((0,Ze.encode)([qu])),cn(1008,`Unauthorized database subscription to ${u}`);return}}},Oe=>{ce.error?.(s,"Error subscribing to HDB nodes",Oe)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,Ze.encode)([qu])),cn(1008,`Unauthorized database subscription to ${u}`);return}if(Pr&&(ce.debug?.(s,"stopping previous subscription",u),Pr.emit("close")),Mn.length===0)return;let de=Mn[0],pe=a(Oe=>{if(Oe&&(de.replicateByDefault?!de.tables.includes(Oe.tableName):de.tables.includes(Oe.tableName)))return{table:Oe}},"tableToTableEntry"),ae={txnTime:0},Ie,He,De=1/0,rt,vn=a((Oe,Ft)=>{if(Oe.type==="end_txn"){ae.txnTime&&(o[i]!==66&&ce.error?.("Invalid encoding of message"),Xi(9),Xi(ZE),p(rt=Ft),di()),i=c,ae.txnTime=0;return}let Nt=Oe.nodeId,yr=Oe.tableId,Rt=He[yr];if(!Rt&&(Rt=He[yr]=pe(m.tableById[yr]),!Rt))return ce.debug?.("Not subscribed to table",yr);let ls=Rt.table,wt=ls.primaryStore,vs=wt.encoder;(Oe.extendedType&Tp||!vs.typedStructs)&&(vs._mergeStructures(vs.getStructures()),vs.typedStructs&&(vs.lastTypedStructuresLength=vs.typedStructs.length));let Kl=Ie[Nt];if(!(Kl&&Kl.startTime<Ft&&(!Kl.endTime||Kl.endTime>Ft)))return JE&&ce.trace?.(s,"skipping replication update",Oe.recordId,"to:",E,"from:",Nt,"subscribed:",Ie),lP();JE&&ce.trace?.(s,"sending replication update",Oe.recordId,"to:",E,"from:",Nt,"subscribed:",Ie);let tA=Oe.version;ae.txnTime!==tA&&(ae.txnTime&&(JE&&ce.trace?.(s,"new txn time, sending queued txn",ae.txnTime),o[i]!==66&&ce.error?.("Invalid encoding of message"),di()),ae.txnTime=tA,i=c,p(tA));let dc=Oe.residencyId,rA=tf(dc,ls),Cm;if(rA&&!rA.includes(E)){let Us=tf(Oe.previousResidencyId,ls);if(Us&&!Us.includes(E)&&(Oe.type==="put"||Oe.type==="patch")||ls.getResidencyById)return lP();let nf=Oe.recordId;ce.trace?.(s,"sending invalidation",nf,E,"from",Nt);let sf=0;dc&&(sf|=Cc),Oe.previousResidencyId&&(sf|=Pc);let iA,Pm=null;for(let uP in ls.indices){if(!Pm){if(iA=Oe.getValue(wt,!0),!iA)break;Pm={}}Pm[uP]=iA[uP]}Cm=wc(Oe.version,yr,nf,null,Nt,Oe.user,Oe.type==="put"||Oe.type==="patch"?"invalidate":Oe.type,vs.encode(Pm),sf,dc,Oe.previousResidencyId,Oe.expiresAt)}function lP(){return ce.trace?.(s,"skipping audit record",Oe.recordId),W||(W=setTimeout(()=>{W=null,(rt||0)+tk/2<De&&(JE&&ce.trace?.(s,"sending skipped sequence update",De),e.send((0,Ze.encode)([XH,De])))},tk).unref()),new Promise(setImmediate)}a(lP,"skipAuditRecord");let nA=vs.typedStructs,sA=vs.structures;if((nA?.length!=Rt.typed_length||sA?.length!=Rt.structure_length)&&(Rt.typed_length=nA?.length,Rt.structure_length=sA.length,ce.debug?.(s,"send table struct",Rt.typed_length,Rt.structure_length),Rt.sentName||(Rt.sentName=!0),e.send((0,Ze.encode)([mO,{typedStructs:nA,structures:sA,attributes:ls.attributes,schemaDefined:ls.schemaDefined},yr,Rt.table.tableName]))),dc&&!jd[dc]&&(e.send((0,Ze.encode)([jH,rA,dc])),jd[dc]=!0),Cm)Xi(Cm.length),K(Cm);else{let Us=Oe.encoded;Oe.extendedType&Ur&&Pf(()=>Oe.getValue(wt),sf=>cc(sf,Oe.recordId),wt.rootStore);let nf=Us[0]===66?8:0;Xi(Us.length-nf),K(Us,nf),ce.trace?.("wrote record",Oe.recordId,"length:",Us.length)}return e._socket.writableNeedDrain?new Promise(Us=>{ce.debug?.(`Waiting for remote node ${E} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Us)}):Ht>wm?new Promise(Us=>{dt=Us}):new Promise(setImmediate)},"sendAuditRecord"),di=a(()=>{c-i>8?(e.send(o.subarray(i,c)),ce.debug?.(s,"Sent message, size:",c-i),Mt(c-i,"bytes-sent",`${E}.${u}`,"replication","egress")):ce.debug?.(s,"skipping empty transaction")},"sendQueuedData");Pr=new RO.EventEmitter,Pr.once("close",()=>{J=!0,oe?.end()});for(let{startTime:Oe}of Mn)Oe<De&&(De=Oe);(V||Promise.resolve()).then(async()=>{m=await m,d=m.auditStore,He=m.tableById.map(pe),Ie=[];for(let{name:Ft,startTime:Nt,endTime:yr}of Mn){let Rt=kE(Ft,d);ce.debug?.("subscription to",Ft,"using local id",Rt,"starting",Nt),Ie[Rt]={startTime:Nt,endTime:yr}}rf(u),Cr||(Cr=sl(Ft=>{Ft.databaseName===u&&rf(u)}),Qd=W_(Ft=>{Ft===u&&(e.send((0,Ze.encode)([qu])),cn())}),e.on("close",()=>{Cr?.remove(),Qd?.remove()})),e.send((0,Ze.encode)([QH,B_(m.auditStore),Mn.map(({name:Ft})=>Ft)]));let Oe=!0;do{isFinite(De)||(ce.warn?.("Invalid sequence id "+De),cn(1008,"Invalid sequence id"+De));let Ft;if(Oe&&!J&&(Oe=!1,De===0)){let Nt=De,yr=tg(d);for(let Rt in S){if(!pe(Rt))continue;let ls=S[Rt];ce.warn?.(`Fully copying ${Rt} table to ${E}`);for(let wt of ls.primaryStore.getRange({snapshot:!1,versions:!0})){if(J)return;if(wt.localTime>=De){ce.trace?.(s,"Copying record from",u,Rt,wt.key,wt.localTime),Nt=Math.max(wt.localTime,Nt),Ft=!0,an()[K_]=1;let vs=wc(wt.version,ls.tableId,wt.key,null,yr,null,"put",Pf(()=>ls.primaryStore.encoder.encode(wt.value),Kl=>cc(Kl,wt.key)),wt.metadataFlags&-256,wt.residencyId,null,wt.expiresAt);await vn({recordId:wt.key,tableId:ls.tableId,type:"put",getValue(){return wt.value},encoded:vs,version:wt.version,residencyId:wt.residencyId,nodeId:yr,extendedType:wt.metadataFlags},wt.localTime)}}}Ft&&vn({type:"end_txn"},De),an()[K_]=0,De=Nt}for(let{key:Nt,value:yr}of d.getRange({start:De||1,exclusiveStart:!0,snapshot:!1})){if(J)return;let Rt=St(yr);ce.debug?.("sending audit record",new Date(Nt)),an()[K_]=Nt,De=Nt,await vn(Rt,Nt),Pr.startTime=Nt,Ft=!0}Ft&&vn({type:"end_txn"},De),an()[K_]=0,await mk(d)}while(!J)}).catch(Oe=>{ce.error?.(s,"Error handling subscription to node",Oe),cn(1008,"Error handling subscription to node")});break}}return}y.position=8;let I=!0,b,U;do{an();let B=y.readInt();if(B===9&&y.getUint8(y.position)==ZE){y.position++,T=U=y.readFloat64(),_[SO]=T,_[TO]=Date.now(),_[AO]=fk,ce.trace?.("received remote sequence update",T,u);break}let w=y.position,D=St(A,w,w+B),G=oc[D.tableId];G||ce.error?.(`No table found with an id of ${D.tableId}`);let j;D.residencyId&&(j=Jd[D.residencyId],ce.trace?.(s,"received residency list",j,D.type,D.recordId));try{let Q=D.recordId;dp(()=>{b={table:G.name,id:Q,type:D.type,nodeId:ac.get(D.nodeId),residencyList:j,timestamp:D.version,value:D.getValue(G),user:D.user,beginTxn:I,expiresAt:D.expiresAt}},d?.rootStore,F=>ef(F,Q))}catch(Q){throw Q.message+="typed structures for current decoder"+JSON.stringify(G.decoder.typedStructs),Q}I=!1,ce.trace?.(s,"received replication message",D.type,"id",b.id,"version",new Date(D.version),"nodeId",b.nodeId),_[SO]=D.version,_[TO]=Date.now(),_[AO]=_k,m.send(b),y.position=w+B}while(y.position<A.byteLength);Xd++,Mt(A.byteLength,"bytes-received",`${E}.${u}.${b?.table||"unknown_table"}`,"replication","ingest"),Xd>eA&&!Zd&&(Zd=!0,e.pause(),ce.debug?.(`Commit backlog causing replication back-pressure, requesting that ${E} pause replication`)),m.send({type:"end_txn",localTime:T,remoteNodeIds:R,async onCommit(){if(b){let B=Date.now()-b.timestamp;Mt(B,"replication-latency",E+"."+u+"."+b.table,b.type,"ingest")}Xd--,Zd&&(Zd=!1,e.resume(),ce.debug?.(`Replication resuming ${E}`)),ye.length>0&&await Promise.all(ye),ce.trace?.("All blobs finished"),!N&&U&&(ce.trace?.(s,"queuing confirmation of a commit at",U),setTimeout(()=>{e.send((0,Ze.encode)([ZH,N])),ce.trace?.(s,"sent confirmation of a commit at",N),N=null},Zre)),N=U,ce.debug?.("last sequence committed",new Date(U),u)}})}catch(y){ce.error?.(s,"Error handling incoming replication message",y)}}),e.on("ping",Ln),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-X,t.isSubscriptionConnection&&Zc({name:E,database:u,url:t.url,latency:t.connection.latency})),X=null}),e.on("close",(A,y)=>{clearInterval(v),clearTimeout(H),clearInterval($),Pr&&Pr.emit("close"),Ji&&Ji.end();for(let[I,{reject:b}]of g)b(new Error(`Connection closed ${y?.toString()} ${A}`));ce.debug?.(s,"closed",A,y?.toString())});function cn(A,y){e.isFinished=!0,e.close(A,y),t.connection?.emit("finished")}a(cn,"close");let Dr=new Set;async function cc(A,y){let I=lp(A);if(Dr.has(I)){ce.debug?.("Blob already being sent",I);return}Dr.add(I);try{let b;Ht++;for await(let U of A.stream())b&&(ce.debug?.("Sending blob chunk",I,"length",b.length),e.send((0,Ze.encode)([QE,{fileId:I,size:A.size},b]))),b=U,e._socket.writableNeedDrain&&(ce.debug?.("draining",I),await new Promise(B=>e._socket.once("drain",B)),ce.debug?.("drained",I)),Mt(U.length,"bytes-sent",`${E}.${u}`,"replication","blob");ce.debug?.("Sending final blob chunk",I,"length",b.length),e.send((0,Ze.encode)([QE,{fileId:I,size:A.size,finished:!0},b]))}catch(b){ce.warn?.("Error sending blob",b,"blob id",I,"for record",y),e.send((0,Ze.encode)([QE,{fileId:I,finished:!0,error:b.toString()},Buffer.alloc(0)]))}finally{Dr.delete(I),Ht--,Ht<wm&&dt?.()}}a(cc,"sendBlobs");function ef(A,y){let I=lp(A),b=me.get(I);ce.debug?.("Received transaction for record",y,"with blob",I,"has stream",!!b,"ended",!!b?.writableEnded),b?b.writableEnded&&me.delete(I):(b=new EO.PassThrough,me.set(I,b)),b.connectedToBlob=!0,b.lastChunk=Date.now(),b.recordId=y,A.size===void 0&&b.expectedSize&&(A.size=b.expectedSize);let U=b.blob??createBlob(b,A);b.blob=U;let B=ro(()=>Cf(U).saving,m.auditStore?.rootStore);return B&&(B.blobId=I,ye.push(B),B.finally(()=>{ce.debug?.(`Finished receiving blob stream ${I}`),ye.splice(ye.indexOf(B),1)})),U}a(ef,"receiveBlobs");function zo(){if(h||(h=!0,t.connection?.on("subscriptions-updated",zo)),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let A=new Map;d||(d=m?.auditStore);try{for(let b of m?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let U of b.value.nodes||[])U.lastTxnTime>(A.get(U.id)??0)&&A.set(U.id,U.lastTxnTime)}catch(b){if(!b.message.includes("Can not re"))throw b}let y=t.connection?.nodeSubscriptions?.[0];R=[];let I=t.connection?.nodeSubscriptions?.map((b,U)=>{let B=[],{replicateByDefault:w}=b;if(b.subscriptions){for(let Q of b.subscriptions)if(Q.subscribe&&(Q.schema||Q.database)===u){let F=Q.table;S?.[F]?.replicate!==!1&&B.push(F)}w=!1}else for(let Q in S)(w?S[Q].replicate===!1:S[Q].replicate)&&B.push(Q);let D=d&&kE(b.name,d),G=m?.dbisDB?.get([Symbol.for("seq"),D])??1,j=Math.max(G?.seqId??1,(typeof b.start_time=="string"?new Date(b.start_time).getTime():b.start_time)??1);if(ce.debug?.("Starting time recorded in db",b.name,D,u,G?.seqId,"start time:",j,new Date(j)),y!==b){let Q=d&&kE(y.name,d),F=m?.dbisDB?.get([Symbol.for("seq"),Q])??1;for(let ve of F?.nodes||[])ve.name===b.name&&(j=ve.seqId,ce.debug?.("Using sequence id from proxy node",y.name,j))}if(D===void 0?ce.warn("Starting subscription request from node",b,"but no node id found"):R.push(D),A.get(D)>j&&(j=A.get(D),ce.debug?.("Updating start time from more recent txn recorded",y.name,j)),j===1&&jE)try{new URL(jE).hostname===b.name&&E===b.name?(ce.warn?.(`Requesting full copy of database ${u} from ${jE}`),j=0):j=Date.now()-6e4}catch(Q){ce.error?.("Error parsing leader URL",jE,Q)}return ce.trace?.(s,"defining subscription request",b.name,u,new Date(j)),{name:b.name,replicateByDefault:w,tables:B,startTime:j,endTime:b.end_time}});if(I)if(ce.debug?.(s,"sending subscription request",I,m?.dbisDB?.path),clearTimeout(z),I.length>0)e.send((0,Ze.encode)([WH,I]));else{let b=a(()=>{let U=performance.now();z=setTimeout(()=>{fe<=U?cn(1008,"Connection has no subscriptions and is no longer used"):b()},se).unref()},"schedule_close");b()}}a(zo,"sendSubscriptionRequestUpdate");function tf(A,y){if(!A)return;let I=kt[A];return I||(I=y.getResidencyRecord(A),kt[A]=I),I}a(tf,"getResidence");function Qo(A){return!(Na&&Na!="*"&&!Na[A]&&!Na.includes?.(A)&&!Na.some?.(y=>y.name===A))}a(Qo,"checkDatabaseAccess");function jo(A){if(m=m||f.get(A),!Qo(A))throw new Error(`Access to database "${A}" is not permitted`);m||ce.warn?.(`No database named "${A}" was declared and registered`),d=m?.auditStore,S||(S=Xe()?.[A]);let y=et();if(y===E)throw y?new Error("Should not connect to self",y):new Error("Node name not defined");return Im(y,A),!0}a(jo,"setDatabase");function Im(A,y){let I=Xe()?.[y],b=[];for(let U in I){let B=I[U];b.push({table:U,schemaDefined:B.schemaDefined,attributes:B.attributes.map(w=>({name:w.name,type:w.type,isPrimaryKey:w.isPrimaryKey}))})}ce.trace?.("Sending database info for node",A,"database name",y),e.send((0,Ze.encode)([zH,A,y,b]))}a(Im,"sendNodeDBName");function rf(A){let y=Xe()?.[A],I=[];for(let b in y){if(Mn&&!Mn.some(B=>B.replicateByDefault?!B.tables.includes(b):B.tables.includes(b)))continue;let U=y[b];I.push({table:b,schemaDefined:U.schemaDefined,attributes:U.attributes.map(B=>({name:B.name,type:B.type,isPrimaryKey:B.isPrimaryKey}))})}e.send((0,Ze.encode)([ek,I,A]))}a(rf,"sendDBSchema"),$=setInterval(()=>{for(let[A,y]of me)y.lastChunk+Ae<Date.now()&&(ce.warn?.(`Timeout waiting for blob stream to finish ${A} for record ${y.recordId??"unknown"} from ${E}`),me.delete(A),y.end())},Ae).unref();let lc=1,uc=[];return{end(){Ji&&Ji.end(),Pr&&Pr.emit("close")},getRecord(A){let y=lc++;return new Promise((I,b)=>{let U=[JH,y,A.table.tableId,A.id];uc[A.table.tableId]||(U.push(A.table.tableName),uc[A.table.tableId]=!0),e.send((0,Ze.encode)(U)),fe=performance.now(),g.set(y,{tableId:A.table.tableId,key:A.id,resolve(B){let{table:w,entry:D}=A;if(I(B),B)return w._recordRelocate(D,B)},reject:b})})},sendOperation(A){let y=lc++;return A.requestId=y,e.send((0,Ze.encode)([gO,A])),new Promise((I,b)=>{g.set(y,{resolve:I,reject:b})})}};function Xi(A){O(5),A<128?o[c++]=A:A<16384?(l.setUint16(c,A|32768),c+=2):A<1056964608?(l.setUint32(c,A|3221225472),c+=4):(o[c]=255,l.setUint32(c+1,A),c+=5)}function K(A,y=0,I=A.length){let b=I-y;O(b),A.copy(o,c,y,I),c+=b}function p(A){O(8),l.setFloat64(c,A),c+=8}function O(A){if(A+16>o.length-c){let y=Buffer.allocUnsafeSlow(c+A-i+65536>>10<<11);o.copy(y,0,i,c),c=c-i,i=0,o=y,l=new DataView(o.buffer,0,o.length)}}function L(A,y){let I=A.database??"data";if(I!=="data"&&!We[I]){ce.warn?.("Database not found",A.database);return}y||(y={});let b=y.schemaDefined,U=!1,B=A.schemaDefined,w=y.attributes||[];for(let D=0;D<A.attributes?.length;D++){let G=A.attributes[D],j=w.find(Q=>Q.name===G.name);(!j||j.type!==G.type)&&(b?ce.error?.(`Schema for '${u}.${A.table}' is defined locally, but attribute '${G.name}: ${G.type}' from '${E}' does not match local attribute ${j?"'"+j.name+": "+j.type+"'":"which does not exist"}`):(U=!0,B||(G.indexed=!0),j?w[w.indexOf(j)]=G:w.push(G)))}return U?(ce.debug?.("(Re)creating",A),ft({table:A.table,database:A.database,schemaDefined:A.schemaDefined,attributes:w,...y})):y}}var sk,Ze,ik,ok,ce,RO,ak,ck,rl,lk,EO,uk,WH,zH,QH,qu,jH,mO,JH,WE,gO,zE,XH,ZH,ek,QE,dk,SO,TO,K_,AO,fk,_k,Xre,jE,yO,wa,JE,tk,Zre,rk,pO,XE,nk,$u,bO=Re(()=>{xe();Ti();Xb();OO();ps();sk=M(le());k();lu();Ze=require("msgpackr"),ik=require("ws"),ok=require("worker_threads"),ce=M(ks());q_();RO=require("events"),ak=M(Zs()),ck=M(require("node:tls"));Xc();rl=M(require("node:process")),lk=require("node:net");Li();pn();EO=require("node:stream"),uk=M(require("minimist")),WH=129,zH=140,QH=141,qu=142,jH=130,mO=132,JH=133,WE=134,gO=136,zE=137,XH=143,ZH=144,ek=145,QE=146,dk=0,SO=1,TO=2,K_=3,AO=4,fk=0,_k=1,Xre=(0,uk.default)(rl.argv),jE=Xre.HDB_LEADER_URL??rl.env.HDB_LEADER_URL,yO=new Map,wa=new Map,JE=!0,tk=300,Zre=2,rk=3e4;a(eg,"createWebSocket");nk=500,$u=class extends RO.EventEmitter{constructor(r,n,s,i,o){super();this.url=r;this.subscription=n;this.databaseName=s;this.nodeName=i;this.authorization=o;this.nodeName=this.nodeName??js(r)}static{a(this,"NodeReplicationConnection")}socket;startTime;retryTime=nk;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await eg(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;ce.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${rl.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ce[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=nk,this.nodeSubscriptions&&Zc({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,n=Y_(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(n)}),this.socket.on("error",s=>{s.code==="SELF_SIGNED_CERT_IN_CHAIN"?(ce.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),s.isHandled=!0):s.code!=="ECONNREFUSED"&&(s.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?ce.error?.(`Can not connect to ${this.url}, the certificate provided by ${this.url} is not trusted, this node needs to be added to the cluster, or a certificate authority needs to be added`):ce.error?.(`Error in connection to ${this.url} due to ${s.message}`)),this.sessionReject(s)}),this.socket.on("close",(s,i)=>{if(this.isConnected&&(this.nodeSubscriptions&&ku({name:this.nodeName,database:this.databaseName,url:this.url,finished:this.socket.isFinished}),this.isConnected=!1),this.removeAllListeners("subscriptions-updated"),this.socket.isFinished){this.isFinished=!0,n?.end(),this.emit("finished");return}if(++this.retries%20===1){let o=i?.toString();ce.warn?.(`${n?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${o?'"'+o+'" ':""}(code: ${s})`)}n=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((r,n)=>{this.sessionResolve=r,this.sessionReject=n})}subscribe(r,n){this.nodeSubscriptions=r,this.replicateTablesByDefault=n,this.emit("subscriptions-updated",r)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(r){return this.session.then(n=>n.getRecord(r))}};a(Y_,"replicateOverWS")});var Oa={};Ue(Oa,{clearThisNodeName:()=>cne,disableReplication:()=>nne,enabled_databases:()=>Na,forEachReplicatedDatabase:()=>Sa,getThisNodeId:()=>tg,getThisNodeName:()=>et,getThisNodeUrl:()=>Ta,hostnameToUrl:()=>og,lastTimeInAuditStore:()=>H_,monitorNodeCAs:()=>yk,replicateOperation:()=>une,replication_certificate_authorities:()=>Ao,sendOperationToNode:()=>z_,servers:()=>tne,setReplicator:()=>Ok,start:()=>rne,startOnMainThread:()=>rO,subscribeToNode:()=>G_,unsubscribeFromNode:()=>$E,urlToNodeName:()=>js});function rne(e){if(e.port||(e.port=gs.default.get(x.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=gs.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),!et())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of F_(e))t.set(js(s.url),s);sne(e),e={mtls:!0,isOperationsServer:!0,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(),Y_(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&ar.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&&ar.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=ir().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)){ar.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else ar.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:ar.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...o.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=a(()=>{let o=new Set(s.secureContexts.values());s.defaultContext&&o.add(s.defaultContext);for(let c of o)try{let l=Array.from(Ao);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=ig.createSecureContext(u)}catch(l){ar.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),gs.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1&&i()}yk(()=>{for(let s of n)s()})}function yk(e){let t=0;Bu(r=>{r?.ca&&(Ao.add(r.ca),Ao.size!==t&&(t=Ao.size,e?.()))})}function nne(e=!0){Rk=e}function sne(e){Rk||(Xe(),Na=e.databases,Sa(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||wa;for(let[s,i]of ng){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];Ok(r,s,e),yO.get(s)?.forEach(i=>i(s))}}))}function Ok(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 bk extends Vr{static{a(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||wa,o=i.get(e),c=o?.tableById||[];c[t.tableId]=t;let l=o?.ready;if(ar.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new xn,i.set(e,o),o.tableById=c,o.auditStore=t.auditStore,o.dbisDB=t.dbisDB,o.databaseName=e,l&&l(o),o;this.subscription=o}static subscribeOnThisThread(i,o){return!0}static async load(i){if(i){let o=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),o]);if(c){let l,u=new Set;do{let f;for(let _ of c){if(_===Ye.hostname)continue;let h=one(_,bk.subscription,e);h?.isConnected&&!u.has(h)&&(!f||h.latency<f.latency)&&(f=h)}if(!f)throw l||new Tk.ServerError("No connection to any other nodes are available",502);let d={requestId:ene++,table:t,entry:i,id:i.key};u.add(f);try{return await f.getRecord(d)}catch(_){if(f.isConnected)throw _;ar.warn("Error in load from node",sg,_),l||(l=_)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function ine(e,t,r,n,s){let i=ng.get(e);i||(i=new Map,ng.set(e,i));let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new $u(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function one(e,t,r){let n=pk.get(e);n||(n=new Map,pk.set(e,n));let s=n.get(r);if(s)return s;let i=ir().primaryStore.get(e);return i?.url&&(s=new $u(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function z_(e,t,r){r||(r={}),r.serverName=e.name;let n=await eg(e.url,r),s=Y_(n,{},{});return new Promise((i,o)=>{n.on("open",()=>{i(s.sendOperation(t))}),n.on("error",c=>{o(c)}),n.on("close",c=>{ar.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function G_(e){try{Ak.isMainThread&&ar.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=wa.get(e.database);if(!t){let n;t=new Promise(s=>{ar.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,wa.set(e.database,t)}let r=ine(e.nodes[0].url,t,e.database,e.nodes[0].name,e.nodes[0].authorization);e.nodes[0].name===void 0?r.tentativeNode=e.nodes[0]:r.nodeName=e.nodes[0].name,r.subscribe(e.nodes.filter(n=>k_(n,e.database)),e.replicateByDefault)}catch(t){ar.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function $E({name:e,url:t,database:r}){ar.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(ir().primaryStore.getRange({})));let n=ng.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function ane(){if(NO!==void 0)return NO;let e=gs.default.get(x.OPERATIONSAPI_TLS_CERTIFICATE)||gs.default.get(x.TLS_CERTIFICATE);if(e)return NO=new gk.X509Certificate((0,Sk.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function et(){return sg||(sg=gs.default.get("replication_hostname")??js(gs.default.get("replication_url"))??ane()??Ek("operationsapi_network_secureport")??Ek("operationsapi_network_port")??"127.0.0.1")}function cne(){sg=void 0}function Ek(e){let t=gs.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function rg(e){let t=gs.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function tg(e){return B_(e)?.[et()]}function Ta(){let e=gs.default.get("replication_url");return e||og(et())}function og(e){let t=rg("replication_port");if(t)return`ws://${e}:${t}`;if(t=rg("replication_secureport"),t)return`wss://${e}:${t}`;if(t=rg("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=rg("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function js(e){if(e)return new URL(e).hostname}function Sa(e,t){for(let n of Object.getOwnPropertyNames(We))r(n);return W_(n=>{r(n)}),sl((n,s)=>{r(n.databaseName)});function r(n){let s=We[n];ar.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):lne(n)&&t(s,n,!1)}a(r,"forDatabase")}function lne(e){let t=We[e];for(let r in t)if(t[r].replicate)return!0}function H_(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function une(e){let t={message:""};if(e.replicated){e.replicated=!1,ar.trace?.("Replicating operation",e.operation,"to nodes",Ye.nodes.map(n=>n.name));let r=await Promise.allSettled(Ye.nodes.map(n=>z_(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Ye.nodes[s]?.name,i})}return t}var gs,ar,gk,Sk,ig,Tk,Ak,Rk,ene,tne,Ao,Na,ng,pk,NO,sg,ps=Re(()=>{xe();na();zl();bO();Mr();gs=M(le()),ar=M(ee()),gk=require("crypto"),Sk=require("fs");q_();Xc();k();Xb();ig=M(require("node:tls")),Tk=M(he()),Ak=require("worker_threads"),ene=1,tne=[],Ao=gs.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1?new Set(ig.rootCertificates):new Set;a(rne,"start");a(yk,"monitorNodeCAs");a(nne,"disableReplication");a(sne,"assignReplicationSource");a(Ok,"setReplicator");ng=new Map;a(ine,"getSubscriptionConnection");pk=new Map;a(one,"getRetrievalConnectionByName");a(z_,"sendOperationToNode");a(G_,"subscribeToNode");a($E,"unsubscribeFromNode");a(ane,"getCommonNameFromCert");a(et,"getThisNodeName");a(cne,"clearThisNodeName");Object.defineProperty(Ye,"hostname",{get(){return et()}});a(Ek,"getHostFromListeningPort");a(rg,"getPortFromListeningPort");a(tg,"getThisNodeId");Ye.replication={getThisNodeId:tg,exportIdMapping:B_};a(Ta,"getThisNodeUrl");a(og,"hostnameToUrl");a(js,"urlToNodeName");a(Sa,"forEachReplicatedDatabase");a(lne,"hasExplicitlyReplicatedTable");a(H_,"lastTimeInAuditStore");a(une,"replicateOperation")});var j_=C((IIe,Pk)=>{"use strict";var Vu=_H(),{validateBySchema:Q_}=ot(),{common_validators:Ku,schema_regex:wO}=bi(),cr=require("joi"),dne=ee(),fne=require("uuid").v4,lg=mo(),Yu=(k(),P(q)),_ne=require("util"),Ia=qn(),{handleHDBError:Ro,hdb_errors:hne,ClientError:il}=he(),{HDB_ERROR_MSGS:ag,HTTP_STATUS_CODES:yo}=hne,{SchemaEventMsg:ug}=Ys(),Nk=gr(),{getDatabases:mne}=(xe(),P(ct)),{transformReq:Wu}=ie(),{replicateOperation:wk}=(ps(),P(Oa)),{cleanupOrphans:wIe}=(pn(),P(au)),cg=cr.string().min(1).max(Ku.schema_length.maximum).pattern(wO).messages({"string.pattern.base":"{:#label} "+Ku.schema_format.message}),pne=cr.string().min(1).max(Ku.schema_length.maximum).pattern(wO).messages({"string.pattern.base":"{:#label} "+Ku.schema_format.message}).required(),Ene=cr.string().min(1).max(Ku.schema_length.maximum).pattern(wO).messages({"string.pattern.base":"{:#label} "+Ku.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();Pk.exports={createSchema:gne,createSchemaStructure:Ik,createTable:Sne,createTableStructure:Ck,createAttribute:bne,dropSchema:Tne,dropTable:Ane,dropAttribute:Rne,getBackup:One,cleanupOrphanBlobs:Nne};async function gne(e){let t=await Ik(e);return lg.signalSchemaChange(new ug(process.pid,e.operation,e.schema)),t}a(gne,"createSchema");async function Ik(e){let t=Q_(e,cr.object({database:cg,schema:cg}));if(t)throw new il(t.message);if(Wu(e),!await Vu.checkSchemaExists(e.schema))throw Ro(new Error,ag.SCHEMA_EXISTS_ERR(e.schema),yo.BAD_REQUEST,Yu.LOG_LEVELS.ERROR,ag.SCHEMA_EXISTS_ERR(e.schema),!0);return await Ia.createSchema(e),`database '${e.schema}' successfully created`}a(Ik,"createSchemaStructure");async function Sne(e){return Wu(e),e.hash_attribute=e.primary_key??e.hash_attribute,await Ck(e)}a(Sne,"createTable");async function Ck(e){let t=Q_(e,cr.object({database:cg,schema:cg,table:pne,residence:cr.array().items(cr.string().min(1)).optional(),hash_attribute:Ene}));if(t)throw new il(t.message);if(!await Vu.checkSchemaTableExists(e.schema,e.table))throw Ro(new Error,ag.TABLE_EXISTS_ERR(e.schema,e.table),yo.BAD_REQUEST,Yu.LOG_LEVELS.ERROR,ag.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:fne(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await Ia.createTable(n,e);else throw Ro(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",yo.BAD_REQUEST);else await Ia.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}a(Ck,"createTableStructure");async function Tne(e){let t=Q_(e,cr.object({database:cr.string(),schema:cr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new il(t.message);Wu(e);let r=await Vu.checkSchemaExists(e.schema);if(r)throw Ro(new Error,r,yo.NOT_FOUND,Yu.LOG_LEVELS.ERROR,r,!0);let n=await Vu.schema_describe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await Ia.dropSchema(e),lg.signalSchemaChange(new ug(process.pid,e.operation,e.schema)),await Nk.purgeSchemaTableStreams(e.schema,s);let i=await wk(e);return i.message=`successfully deleted '${e.schema}'`,i}a(Tne,"dropSchema");async function Ane(e){let t=Q_(e,cr.object({database:cr.string(),schema:cr.string(),table:cr.string().required()}));if(t)throw new il(t.message);Wu(e);let r=await Vu.checkSchemaTableExists(e.schema,e.table);if(r)throw Ro(new Error,r,yo.NOT_FOUND,Yu.LOG_LEVELS.ERROR,r,!0);await Ia.dropTable(e),await Nk.purgeTableStream(e.schema,e.table);let n=await wk(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(Ane,"dropTable");async function Rne(e){let t=Q_(e,cr.object({database:cr.string(),schema:cr.string(),table:cr.string().required(),attribute:cr.string().required()}));if(t)throw new il(t.message);Wu(e);let r=await Vu.checkSchemaTableExists(e.schema,e.table);if(r)throw Ro(new Error,r,yo.NOT_FOUND,Yu.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Ro(new Error,"You cannot drop a hash attribute",yo.BAD_REQUEST,void 0,void 0,!0);if(Yu.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Ro(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,yo.BAD_REQUEST,void 0,void 0,!0);try{return await Ia.dropAttribute(e),yne(e),lg.signalSchemaChange(new ug(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw dne.error(`Got an error deleting attribute ${_ne.inspect(e)}.`),n}}a(Rne,"dropAttribute");function yne(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(yne,"dropAttributeFromGlobal");async function bne(e){Wu(e);let t=mne()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Ro(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,yo.BAD_REQUEST,void 0,void 0,!0);return await Ia.createAttribute(e),lg.signalSchemaChange(new ug(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(bne,"createAttribute");function One(e){return Ia.getBackup(e)}a(One,"getBackup");function Nne(e){if(!e.database)throw new il('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new il(`Unknown database '${e.database}'`);let{cleanupOrphans:r}=(pn(),P(au));return r(databases[e.database],e.database),{message:"Orphaned blobs cleanup started, check logs for progress"}}a(Nne,"cleanupOrphanBlobs")});var Lk=C((PIe,Dk)=>{"use strict";var{OPERATIONS_ENUM:wne}=(k(),P(q)),IO=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=wne.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};Dk.exports=IO});var CO=C((MIe,Bk)=>{"use strict";var Ine=qn(),LIe=Lk(),dg=ie(),fg=(k(),P(q)),Cne=le(),{handleHDBError:Mk,hdb_errors:Pne}=he(),{HDB_ERROR_MSGS:vk,HTTP_STATUS_CODES:Uk}=Pne,Dne=Object.values(fg.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),xk="To use this operation audit log must be enabled in harperdb-config.yaml";Bk.exports=Lne;async function Lne(e){if(dg.isEmpty(e.schema))throw new Error(vk.SCHEMA_REQUIRED_ERR);if(dg.isEmpty(e.table))throw new Error(vk.TABLE_REQUIRED_ERR);if(!Cne.get(fg.CONFIG_PARAMS.LOGGING_AUDITLOG))throw Mk(new Error,xk,Uk.BAD_REQUEST,fg.LOG_LEVELS.ERROR,xk,!0);let t=dg.checkSchemaTableExist(e.schema,e.table);if(t)throw Mk(new Error,t,Uk.NOT_FOUND,fg.LOG_LEVELS.ERROR,t,!0);if(!dg.isEmpty(e.search_type)&&Dne.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await Ine.readAuditLog(e)}a(Lne,"readAuditLog")});var kk=C((UIe,Hk)=>{"use strict";var{OPERATIONS_ENUM:Mne}=(k(),P(q)),PO=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Mne.GET_BACKUP,this.schema=t,this.table=r}};Hk.exports=PO});var qk=C((kIe,Gk)=>{"use strict";var vne=qn(),BIe=kk(),DO=ie(),Une=(k(),P(q)),HIe=le(),{handleHDBError:xne,hdb_errors:Bne}=he(),{HDB_ERROR_MSGS:Fk,HTTP_STATUS_CODES:Hne}=Bne;Gk.exports=kne;async function kne(e){if(DO.isEmpty(e.schema))throw new Error(Fk.SCHEMA_REQUIRED_ERR);if(DO.isEmpty(e.table))throw new Error(Fk.TABLE_REQUIRED_ERR);let t=DO.checkSchemaTableExist(e.schema,e.table);if(t)throw xne(new Error,t,Hne.NOT_FOUND,Une.LOG_LEVELS.ERROR,t,!0);return await vne.getBackup(read_audit_log_object)}a(kne,"getBackup")});var Yk=C((GIe,Kk)=>{"use strict";var Fne=le(),Ca=require("joi"),Gne=ot(),$k=require("moment"),qne=require("fs-extra"),LO=require("path"),$ne=require("lodash"),J_=(k(),P(q)),{LOG_LEVELS:ol}=(k(),P(q)),Vne="YYYY-MM-DD hh:mm:ss",Kne=LO.resolve(__dirname,"../logs");Kk.exports=function(e){return Gne.validateBySchema(e,Yne)};var Yne=Ca.object({from:Ca.custom(Vk),until:Ca.custom(Vk),level:Ca.valid(ol.NOTIFY,ol.FATAL,ol.ERROR,ol.WARN,ol.INFO,ol.DEBUG,ol.TRACE),order:Ca.valid("asc","desc"),limit:Ca.number().min(1),start:Ca.number().min(0),log_name:Ca.custom(Wne)});function Vk(e,t){if($k(e,$k.ISO_8601).format(Vne)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(Vk,"validateDatetime");function Wne(e,t){if($ne.invert(J_.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Fne.get(J_.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?J_.LOG_NAMES.HDB:e,i=s===J_.LOG_NAMES.INSTALL?LO.join(Kne,J_.LOG_NAMES.INSTALL):LO.join(n,s);return qne.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(Wne,"validateReadLogPath")});var vO=C(($Ie,zk)=>{"use strict";var _g=(k(),P(q)),zne=ee(),Qne=le(),jne=Yk(),MO=require("path"),Wk=require("fs-extra"),{once:Jne}=require("events"),{handleHDBError:Xne,hdb_errors:Zne}=he(),{PACKAGE_ROOT:ese}=Et(),tse=MO.join(ese,"logs"),rse=1e3,nse=200;zk.exports=sse;async function sse(e){let t=jne(e);if(t)throw Xne(t,t.message,Zne.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=Qne.get(_g.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?_g.LOG_NAMES.HDB:e.log_name,s=n===_g.LOG_NAMES.INSTALL?MO.join(tse,_g.LOG_NAMES.INSTALL):MO.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?rse:e.limit,_=e.order===void 0?void 0:e.order,h=e.start===void 0?0:e.start,m=h+d,S=0;_==="desc"&&!l&&!f&&(S=Math.max(Wk.statSync(s).size-(m+5)*nse,0));let g=Wk.createReadStream(s,{start:S});g.on("error",H=>{zne.error(H)});let R=0,E=[],T="",N;g.on("data",H=>{let X=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;H=T+H;let W=0,$;for(;($=X.exec(H))&&!g.destroyed;){N&&(N.message=H.slice(W,$.index),v(N));let[se,z,fe]=$,ue=fe.split("] ["),Z=ue[0],Ae=ue[1];ue.splice(0,2),N={timestamp:z,thread:Z,level:Ae,tags:ue,message:""},W=$.index+se.length}T=H.slice(W)}),g.on("end",H=>{g.destroyed||N&&(N.message=T.trim(),v(N))}),g.resume();function v(H){let X,W,$;switch(!0){case(i&&c&&u):X=new Date(H.timestamp),W=new Date(l),$=new Date(f),H.level===o&&X>=W&&X<=$&&R<h?R++:H.level===o&&X>=W&&X<=$&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case(i&&c):X=new Date(H.timestamp),W=new Date(l),H.level===o&&X>=W&&R<h?R++:H.level===o&&X>=W&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case(i&&u):X=new Date(H.timestamp),$=new Date(f),H.level===o&&X<=$&&R<h?R++:H.level===o&&X<=$&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case(c&&u):X=new Date(H.timestamp),W=new Date(l),$=new Date(f),X>=W&&X<=$&&R<h?R++:X>=W&&X<=$&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case i:H.level===o&&R<h?R++:H.level===o&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case c:X=new Date(H.timestamp),W=new Date(l),X>=W&&R<h?R++:X>=W&&R>=h&&(Pa(H,_,E),R++,R===m&&g.destroy());break;case u:X=new Date(H.timestamp),$=new Date(f),X<=$&&R<h?R++:X<=$&&R>=h&&(Pa(H,_,E),R++,R===m&&g.destroy());break;default:R<h?R++:(Pa(H,_,E),R++,R===m&&g.destroy())}}return a(v,"onLogMessage"),await Jne(g,"close"),E}a(sse,"readLog");function Pa(e,t,r){t==="desc"?ise(e,r):t==="asc"?ose(e,r):r.push(e)}a(Pa,"pushLineToResult");function ise(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(ise,"insertDescending");function ose(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(ose,"insertAscending")});var hg=C((QIe,Xk)=>{"use strict";var UO=require("joi"),{string:zu,boolean:Qk,date:ase}=UO.types(),cse=ot(),{validateSchemaExists:KIe,validateTableExists:YIe,validateSchemaName:WIe}=bi(),lse=(k(),P(q)),use=Pt(),jk=le();jk.initSync();var zIe=zu.invalid(jk.get(lse.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(use.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),Jk={operation:zu.valid("add_node","update_node","set_node_replication"),node_name:zu.optional(),subscriptions:UO.array().items({table:zu.optional(),schema:zu.optional(),database:zu.optional(),subscribe:Qk.required(),publish:Qk.required().custom(fse),start_time:ase.iso()})};function dse(e){return cse.validateBySchema(e,UO.object(Jk))}a(dse,"addUpdateNodeValidator");function fse(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(fse,"checkForFalsy");Xk.exports={addUpdateNodeValidator:dse,validation_schema:Jk}});var Qu=C((JIe,Zk)=>{"use strict";var xO=class{static{a(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},BO=class{static{a(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};Zk.exports={Node:xO,NodeSubscription:BO}});var tF=C((ZIe,eF)=>{"use strict";var _se=(k(),P(q)).OPERATIONS_ENUM,HO=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=_se.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};eF.exports=HO});var X_=C((tCe,rF)=>{"use strict";var kO=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},FO=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)}};rF.exports={RemotePayloadObject:kO,RemotePayloadSubscription:FO}});var sF=C((nCe,nF)=>{"use strict";var GO=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}};nF.exports=GO});var oF=C((lCe,iF)=>{"use strict";var hse=sF(),iCe=Gt(),oCe=_t(),mse=ee(),{getSchemaPath:aCe,getTransactionAuditStorePath:cCe}=gt(),{getDatabases:pse}=(xe(),P(ct));iF.exports=Ese;async function Ese(e){let t=new hse;try{let r=pse()[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){mse.warn(`unable to stat table dbi due to ${r}`)}return t}a(Ese,"lmdbGetTableSize")});var cF=C((dCe,aF)=>{"use strict";var qO=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}};aF.exports=qO});var Ju=C((ECe,fF)=>{"use strict";var gse=require("fs-extra"),Sse=require("path"),jr=require("systeminformation"),Da=ee(),lF=gr(),_Ce=Pt(),ju=(k(),P(q)),Tse=oF(),Ase=_o(),{getThreadInfo:uF}=it(),Z_=le();Z_.initSync();var Rse=cF(),{openEnvironment:hCe}=_t(),{getSchemaPath:mCe}=gt(),{database:pCe,databases:$O}=(xe(),P(ct)),mg;fF.exports={getHDBProcessInfo:WO,getNetworkInfo:QO,getDiskInfo:zO,getMemoryInfo:YO,getCPUInfo:KO,getTimeInfo:VO,getSystemInformation:jO,systemInformation:yse,getTableSize:JO,getMetrics:XO};function VO(){return jr.time()}a(VO,"getTimeInfo");async function KO(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:o,governor:c,socket:l,cache:u,...f}=await jr.cpu();f.cpu_speed=await jr.cpuCurrentSpeed();let{raw_currentload:d,raw_currentload_idle:_,raw_currentload_irq:h,raw_currentload_nice:m,raw_currentload_system:S,raw_currentload_user:g,cpus:R,...E}=await jr.currentLoad();return E.cpus=[],R.forEach(T=>{let{raw_load:N,raw_load_idle:v,raw_load_irq:H,raw_load_nice:X,raw_load_system:W,raw_load_user:$,...se}=T;E.cpus.push(se)}),f.current_load=E,f}catch(e){return Da.error(`error in getCPUInfo: ${e}`),{}}}a(KO,"getCPUInfo");async function YO(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await jr.mem();return Object.assign(s,process.memoryUsage())}catch(e){return Da.error(`error in getMemoryInfo: ${e}`),{}}}a(YO,"getMemoryInfo");async function WO(){let e={core:[],clustering:[]};try{let t=await jr.processes(),r;try{r=Number.parseInt(await gse.readFile(Sse.join(Z_.get(ju.CONFIG_PARAMS.ROOTPATH),ju.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===ju.NODE_ERROR_CODES.ENOENT)Da.warn("Unable to locate 'hdb.pid' file, try stopping and starting HarperDB. This could be because HarperDB is not running.");else throw n}t.list.forEach(n=>{n.pid===r?e.core.push(n):n.name==="nats-server"&&e.clustering.push(n)});for(let n of e.core)for(let s of t.list)s.pid===n.parentPid&&(s.name==="PM2"||s.command==="PM2")&&(n.parent="PM2");return e}catch(t){return Da.error(`error in getHDBProcessInfo: ${t}`),e}}a(WO,"getHDBProcessInfo");async function zO(){let e={};try{if(!Z_.get(ju.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await jr.disksIO();e.io=i;let{rx_sec:o,tx_sec:c,wx_sec:l,...u}=await jr.fsStats();return e.read_write=u,e.size=await jr.fsSize(),e}catch(t){return Da.error(`error in getDiskInfo: ${t}`),e}}a(zO,"getDiskInfo");async function QO(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Z_.get(ju.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await jr.networkInterfaceDefault(),e.latency=await jr.inetChecksite("google.com"),(await jr.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:o,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:f,carrier_changes:d,..._}=n;e.interfaces.push(_)}),(await jr.networkStats()).forEach(n=>{let{rx_sec:s,tx_sec:i,ms:o,...c}=n;e.stats.push(c)})),e}catch(t){return Da.error(`error in getNetworkInfo: ${t}`),e}}a(QO,"getNetworkInfo");async function jO(){if(mg!==void 0)return mg;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:o,...c}=await jr.osInfo();e=c;let l=await jr.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,mg=e,mg}catch(t){return Da.error(`error in getSystemInformation: ${t}`),e}}a(jO,"getSystemInformation");async function JO(){let e=[],t=await Ase.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await Tse(n));return e}a(JO,"getTableSize");async function XO(){let e={};for(let t in $O){let r=e[t]={},n=r.tables={};for(let s in $O[t])try{let i=$O[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,f,d]=l.trim().split(" ");return{pid:u,thread:f,txnid:d}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:_}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:_}}let o=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=o[l];n[s]=c}catch(i){Da.notify(`Error getting stats for table ${s}: ${i}`)}}return e}a(XO,"getMetrics");async function dF(){if(Z_.get(ju.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await lF.getNATSReferences(),t=await lF.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(dF,"getNatsStreamInfo");async function yse(e){let t=new Rse;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await jO(),t.time=VO(),t.cpu=await KO(),t.memory=await YO(),t.disk=await zO(),t.network=await QO(),t.harperdb_processes=await WO(),t.table_size=await JO(),t.metrics=await XO(),t.threads=await uF(),t.replication=await dF(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await jO();break;case"time":t.time=VO();break;case"cpu":t.cpu=await KO();break;case"memory":t.memory=await YO();break;case"disk":t.disk=await zO();break;case"network":t.network=await QO();break;case"harperdb_processes":t.harperdb_processes=await WO();break;case"table_size":t.table_size=await JO();break;case"database_metrics":case"metrics":t.metrics=await XO();break;case"threads":t.threads=await uF();break;case"replication":t.replication=await dF();break;default:break}return t}a(yse,"systemInformation")});var bo=C((RCe,pF)=>{"use strict";var bse=An(),ZO=ie(),Ose=require("util"),al=(k(),P(q)),_F=le();_F.initSync();var Nse=Yb(),hF=Yr(),{Node:SCe,NodeSubscription:TCe}=Qu(),wse=Ru(),Ise=tF(),{RemotePayloadObject:Cse,RemotePayloadSubscription:Pse}=X_(),{handleHDBError:Dse,hdb_errors:Lse}=he(),{HTTP_STATUS_CODES:Mse,HDB_ERROR_MSGS:vse}=Lse,Use=Ws(),xse=Ju(),{packageJson:Bse}=Et(),{getDatabases:Hse}=(xe(),P(ct)),ACe=Ose.promisify(Nse.authorize),kse=hF.searchByHash,Fse=hF.searchByValue;pF.exports={isEmpty:Gse,getNodeRecord:qse,upsertNodeRecord:$se,buildNodePayloads:Vse,checkClusteringEnabled:Kse,getAllNodeRecords:Yse,getSystemInfo:Wse,reverseSubscription:mF};function Gse(e){return e==null}a(Gse,"isEmpty");async function qse(e){let t=new wse(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return kse(t)}a(qse,"getNodeRecord");async function $se(e){let t=new Ise(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return bse.upsert(t)}a($se,"upsertNodeRecord");function mF(e){if(ZO.isEmpty(e.subscribe)||ZO.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(mF,"reverseSubscription");function Vse(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=ZO.getTableHashAttribute(l,u),{subscribe:d,publish:_}=mF(c),h=Hse()[l]?.[u],m=new Pse(l,u,f,_,d,c.start_time,h.schemaDefined?h.attributes:void 0);s.push(m)}return new Cse(r,t,s,n)}a(Vse,"buildNodePayloads");function Kse(){if(!_F.get(al.CONFIG_PARAMS.CLUSTERING_ENABLED))throw Dse(new Error,vse.CLUSTERING_NOT_ENABLED,Mse.BAD_REQUEST,void 0,void 0,!0)}a(Kse,"checkClusteringEnabled");async function Yse(){let e=new Use(al.SYSTEM_SCHEMA_NAME,al.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await Fse(e))}a(Yse,"getAllNodeRecords");async function Wse(){let e=await xse.getSystemInformation();return{hdb_version:Bse.version,node_version:e.node_version,platform:e.platform}}a(Wse,"getSystemInfo")});var eN=C((bCe,bF)=>{"use strict";var pg=gr(),EF=ie(),gF=Pt(),SF=(k(),P(q)),Eg=ee(),TF=j_(),zse=E_(),{RemotePayloadObject:Qse}=X_(),{handleHDBError:AF,hdb_errors:jse}=he(),{HTTP_STATUS_CODES:RF}=jse,{NodeSubscription:yF}=Qu();bF.exports=Jse;async function Jse(e,t){let r;try{r=await pg.request(`${t}.${gF.REQUEST_SUFFIX}`,new Qse(SF.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),Eg.trace("Response from remote describe all request:",r)}catch(o){Eg.error(`addNode received error from describe all request to remote node: ${o}`);let c=pg.requestErrorHandler(o,"add_node",t);throw AF(new Error,c,RF.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===gF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw AF(new Error,o,RF.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===SF.SYSTEM_SCHEMA_NAME){await pg.createLocalTableStream(l,c);let m=new yF(l,c,o.publish,o.subscribe);m.start_time=o.start_time,i.push(m);continue}let u=EF.doesSchemaExist(l),f=n[l]!==void 0,d=c?EF.doesTableExist(l,c):!0,_=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!f||!d&&!_){s.push(o);continue}if(!u&&f&&(Eg.trace(`addNode creating schema: ${l}`),await TF.createSchema({operation:"create_schema",schema:l})),!d&&_){Eg.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let m=new zse(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(m.attributes=n[l][c].attributes),await TF.createTable(m)}await pg.createLocalTableStream(l,c);let h=new yF(l,c,o.publish,o.subscribe);h.start_time=o.start_time,i.push(h)}return{added:i,skipped:s}}a(Jse,"reviewSubscriptions")});var cl={};Ue(cl,{addNodeBack:()=>rie,removeNodeBack:()=>nie,setNode:()=>tie});async function tie(e){e.node_name&&!e.hostname&&(e.hostname=e.node_name),e.verify_tls!==void 0&&(e.rejectUnauthorized=e.verify_tls);let{url:t,hostname:r}=e;t?r||(r=e.hostname=js(t)):t=og(r);let n=(0,NF.validateBySchema)(e,eie);if(n)throw(0,Oo.handleHDBError)(n,n.message,Zse.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new Oo.ClientError("url or hostname is required for remove_node operation");let h=r,m=ir(),S=await m.get(h);if(!S)throw new Oo.ClientError(h+" does not exist");try{await z_({url:S.url},{operation:Wt.REMOVE_NODE_BACK,name:S?.subscriptions?.length>0?et():h},void 0)}catch(g){Xn.warn(`Error removing node from target node ${h}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,g)}return await m.delete(h),`Successfully removed '${h}' from cluster`}if(!t)throw new Oo.ClientError("url required for this operation");let s=Ta();if(s==null)throw new Oo.ClientError("replication url is missing from harperdb-config.yaml");let i,o,c;if(t?.startsWith("wss:")){i=await(0,Ss.getReplicationCert)();let h=await(0,Ss.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,Ss.createCsr)(),Xn.info("Sending CSR to target node:",t)):h&&(c=h.certificate,Xn.info("Sending CA named",h.name,"to target node",t))}let l={operation:Wt.ADD_NODE_BACK,hostname:(0,Ma.get)(x.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:o,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,Ma.get)(x.REPLICATION_SHARD)!==void 0&&(l.shard=(0,Ma.get)(x.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(OF):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let h=OF(e);l.subscribe=h.subscribe,l.publish=h.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,f;try{u=await z_({url:t},l,e)}catch(h){h.message=`Error returned from ${t}: `+h.message,Xn.warn("Error adding node:",t,"to cluster:",h),f=h}if(o&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw f?(f.message+=" and connection was required to sign certificate",f):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);o&&(Xn.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ss.setCertTable)({name:Xse.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ss.setCertTable)({name:et(),uses:["https","operations","wss"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let d={url:t,ca:u?.usingCA};if(e.hostname&&(d.name=e.hostname),e.subscriptions?d.subscriptions=e.subscriptions:d.replicates=!0,e.start_time&&(d.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(d.authorization=e.authorization),e.revoked_certificates&&(d.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?d.shard=u.shard:e.shard!==void 0&&(d.shard=e.shard),d.replicates){let h={url:s,ca:c,replicates:!0,subscriptions:null};(0,Ma.get)(x.REPLICATION_SHARD)!==void 0&&(h.shard=(0,Ma.get)(x.REPLICATION_SHARD)),e.retain_authorization&&(h.authorization=e.authorization),e.start_time&&(h.start_time=e.start_time),await So(et(),h)}await So(u?u.nodeName:d.name??js(t),d);let _;return e.operation==="update_node"?_=`Successfully updated '${t}'`:_=`Successfully added '${t}' to cluster`,f&&(_+=" but there was an error updating target node: "+f.message),_}async function rie(e){Xn.trace("addNodeBack received request:",e);let t=await(0,Ss.signCertificate)(e),r;e.csr?(r=t.signingCA,Xn.info("addNodeBack received CSR from node:",e.url,"this node will use and respond with CA that was used to issue CSR")):(r=e?.cert_auth,Xn.info("addNodeBack received CA from node:",e.url));let n={url:e.url,ca:r};e.subscriptions?n.subscriptions=e.subscriptions:(n.replicates=!0,n.subscriptions=null),e.start_time&&(n.start_time=e.start_time),e.authorization&&(n.authorization=e.authorization),e.shard!==void 0&&(n.shard=e.shard);let s=await(0,Ss.getReplicationCertAuth)();if(n.replicates){let i={url:Ta(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,Ma.get)(x.REPLICATION_SHARD)!==void 0&&(i.shard=(0,Ma.get)(x.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await So(et(),i)}return await So(e.hostname,n),t.nodeName=et(),t.usingCA=s?.certificate,Xn.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function nie(e){Xn.trace("removeNodeBack received request:",e),await ir().delete(e.name)}function OF(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ss,NF,La,Ma,Xn,Oo,Xse,Zse,eie,ll=Re(()=>{Ss=M(Zs()),NF=M(ot()),La=M(require("joi")),Ma=M(le());k();q_();Xc();ps();Xn=M(ee()),Oo=M(he()),{pki:Xse}=require("node-forge"),{HTTP_STATUS_CODES:Zse}=Oo.hdb_errors,eie=La.default.object({hostname:La.default.string(),verify_tls:La.default.boolean(),replicates:La.default.boolean(),subscriptions:La.default.array(),revoked_certificates:La.default.array(),shard:La.default.number()});a(tie,"setNode");a(rie,"addNodeBack");a(nie,"removeNodeBack");a(OF,"reverseSubscription")});var Rg=C((MCe,IF)=>{"use strict";var{handleHDBError:gg,hdb_errors:sie}=he(),{HTTP_STATUS_CODES:Sg}=sie,{addUpdateNodeValidator:iie}=hg(),Tg=ee(),Ag=(k(),P(q)),wF=Pt(),oie=ie(),eh=gr(),th=bo(),tN=le(),aie=eN(),{Node:cie,NodeSubscription:lie}=Qu(),{broadcast:uie}=it(),{setNode:die}=(ll(),P(cl)),DCe=le(),LCe=(k(),P(q)),fie="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",_ie="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",hie=tN.get(Ag.CONFIG_PARAMS.CLUSTERING_NODENAME);IF.exports=mie;async function mie(e,t=!1){if(Tg.trace("addNode called with:",e),tN.get(Ag.CONFIG_PARAMS.REPLICATION_URL)||tN.get(Ag.CONFIG_PARAMS.REPLICATION_HOSTNAME))return die(e);th.checkClusteringEnabled();let r=iie(e);if(r)throw gg(r,r.message,Sg.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let d=await th.getNodeRecord(n);if(!oie.isEmptyOrZeroLength(d))throw gg(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,Sg.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await aie(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=fie,o;let c=th.buildNodePayloads(s,hie,Ag.OPERATIONS_ENUM.ADD_NODE,await th.getSystemInfo()),l=[];for(let d=0,_=s.length;d<_;d++){let h=s[d];s[d].start_time===void 0&&delete s[d].start_time,l.push(new lie(h.schema,h.table,h.publish,h.subscribe))}Tg.trace("addNode sending remote payload:",c);let u;try{u=await eh.request(`${n}.${wF.REQUEST_SUFFIX}`,c)}catch(d){Tg.error(`addNode received error from request: ${d}`);for(let h=0,m=s.length;h<m;h++){let S=s[h];S.publish=!1,S.subscribe=!1,await eh.updateRemoteConsumer(S,n)}let _=eh.requestErrorHandler(d,"add_node",n);throw gg(new Error,_,Sg.INTERNAL_SERVER_ERROR,"error",_)}if(u.status===wF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${n}: ${u.message}`;throw gg(new Error,d,Sg.INTERNAL_SERVER_ERROR,"error",d)}Tg.trace(u);for(let d=0,_=s.length;d<_;d++){let h=s[d];await eh.updateRemoteConsumer(h,n),h.subscribe===!0&&await eh.updateConsumerIterator(h.schema,h.table,n,"start")}let f=new cie(n,l,u.system_info);return await th.upsertNodeRecord(f),uie({type:"nats_update"}),i.length>0?o.message=_ie:o.message=`Successfully added '${n}' to manifest`,o}a(mie,"addNode")});var iN=C((xCe,PF)=>{"use strict";var{handleHDBError:rN,hdb_errors:pie}=he(),{HTTP_STATUS_CODES:nN}=pie,{addUpdateNodeValidator:Eie}=hg(),rh=ee(),yg=(k(),P(q)),CF=Pt(),UCe=ie(),nh=gr(),sh=bo(),sN=le(),{cloneDeep:gie}=require("lodash"),Sie=eN(),{Node:Tie,NodeSubscription:Aie}=Qu(),{broadcast:Rie}=it(),{setNode:yie}=(ll(),P(cl)),bie="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",Oie="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Nie=sN.get(yg.CONFIG_PARAMS.CLUSTERING_NODENAME);PF.exports=wie;async function wie(e){if(rh.trace("updateNode called with:",e),sN.get(yg.CONFIG_PARAMS.REPLICATION_URL)??sN.get(yg.CONFIG_PARAMS.REPLICATION_HOSTNAME))return yie(e);sh.checkClusteringEnabled();let t=Eie(e);if(t)throw rN(t,t.message,nN.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await sh.getNodeRecord(r);s.length>0&&(n=gie(s));let{added:i,skipped:o}=await Sie(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=bie,c;let l=sh.buildNodePayloads(i,Nie,yg.OPERATIONS_ENUM.UPDATE_NODE,await sh.getSystemInfo());for(let f=0,d=i.length;f<d;f++){let _=i[f];rh.trace(`updateNode updating work stream for node: ${r} subscription:`,_),i[f].start_time===void 0&&delete i[f].start_time}rh.trace("updateNode sending remote payload:",l);let u;try{u=await nh.request(`${r}.${CF.REQUEST_SUFFIX}`,l)}catch(f){rh.error(`updateNode received error from request: ${f}`);let d=nh.requestErrorHandler(f,"update_node",r);throw rN(new Error,d,nN.INTERNAL_SERVER_ERROR,"error",d)}if(u.status===CF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${r}: ${u.message}`;throw rN(new Error,f,nN.INTERNAL_SERVER_ERROR,"error",f)}rh.trace(u);for(let f=0,d=i.length;f<d;f++){let _=i[f];await nh.updateRemoteConsumer(_,r),_.subscribe===!0?await nh.updateConsumerIterator(_.schema,_.table,r,"start"):await nh.updateConsumerIterator(_.schema,_.table,r,"stop")}return n||(n=[new Tie(r,[],u.system_info)]),await Iie(n[0],i,u.system_info),o.length>0?c.message=Oie:c.message=`Successfully updated '${r}'`,c}a(wie,"updateNode");async function Iie(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 Aie(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await sh.upsertNodeRecord(n),Rie({type:"nats_update"})}a(Iie,"updateNodeTable")});var UF=C((HCe,vF)=>{"use strict";var MF=require("joi"),{string:DF}=MF.types(),Cie=ot(),LF=(k(),P(q)),Pie=le(),Die=Pt();vF.exports=Lie;function Lie(e){let t=DF.invalid(Pie.get(LF.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(Die.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=MF.object({operation:DF.valid(LF.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return Cie.validateBySchema(e,r)}a(Lie,"removeNodeValidator")});var bg=C((FCe,FF)=>{"use strict";var{handleHDBError:xF,hdb_errors:Mie}=he(),{HTTP_STATUS_CODES:BF}=Mie,vie=UF(),ih=ee(),HF=bo(),Uie=ie(),Xu=(k(),P(q)),kF=Pt(),oN=gr(),aN=le(),{RemotePayloadObject:xie}=X_(),{NodeSubscription:Bie}=Qu(),Hie=p_(),kie=Hc(),{broadcast:Fie}=it(),{setNode:Gie}=(ll(),P(cl)),qie=aN.get(Xu.CONFIG_PARAMS.CLUSTERING_NODENAME);FF.exports=$ie;async function $ie(e){if(ih.trace("removeNode called with:",e),aN.get(Xu.CONFIG_PARAMS.REPLICATION_URL)??aN.get(Xu.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Gie(e);HF.checkClusteringEnabled();let t=vie(e);if(t)throw xF(t,t.message,BF.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await HF.getNodeRecord(r);if(Uie.isEmptyOrZeroLength(n))throw xF(new Error,`Node '${r}' was not found.`,BF.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new xie(Xu.OPERATIONS_ENUM.REMOVE_NODE,qie,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let f=n.subscriptions[l];f.subscribe===!0&&await oN.updateConsumerIterator(f.schema,f.table,r,"stop");try{await oN.updateRemoteConsumer(new Bie(f.schema,f.table,!1,!1),r)}catch(d){ih.error(d)}}try{i=await oN.request(`${r}.${kF.REQUEST_SUFFIX}`,s),ih.trace("Remove node reply from remote node:",r,i)}catch(l){ih.error("removeNode received error from request:",l),o=!0}let c=new Hie(Xu.SYSTEM_SCHEMA_NAME,Xu.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await kie.deleteRecord(c),Fie({type:"nats_update"}),i?.status===kF.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(ih.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($ie,"removeNode")});var $F=C((qCe,qF)=>{"use strict";var GF=require("joi"),{string:Vie,array:Kie}=GF.types(),Yie=ot(),Wie=hg();qF.exports=zie;function zie(e){let t=GF.object({operation:Vie.valid("configure_cluster").required(),connections:Kie.items(Wie.validation_schema).required()});return Yie.validateBySchema(e,t)}a(zie,"configureClusterValidator")});var cN=C((VCe,zF)=>{"use strict";var VF=(k(),P(q)),Og=ee(),Qie=ie(),jie=le(),Jie=bg(),Xie=Rg(),Zie=bo(),eoe=$F(),{handleHDBError:KF,hdb_errors:toe}=he(),{HTTP_STATUS_CODES:YF}=toe,roe="Configure cluster complete.",noe="Failed to configure the cluster. Check the logs for more details.",soe="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";zF.exports=ioe;async function ioe(e){Og.trace("configure cluster called with:",e);let t=eoe(e);if(t)throw KF(t,t.message,YF.BAD_REQUEST,void 0,void 0,!0);let r=await Zie.getAllNodeRecords(),n=[];if(jie.get(VF.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let f=0,d=r.length;f<d;f++){let _=await WF(Jie,{operation:VF.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[f].name},r[f].name);n.push(_)}Og.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 WF(Xie,d,d.node_name);s.push(_)}Og.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"&&(Og.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(Qie.isEmptyOrZeroLength(o))return{message:roe,connections:c};if(l)return{message:soe,failed_nodes:o,connections:c};throw KF(new Error,noe,YF.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(ioe,"configureCluster");async function WF(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(WF,"functionWrapper")});var XF=C((YCe,JF)=>{"use strict";var oh=require("joi"),ooe=ot(),{validateSchemaExists:QF,validateTableExists:aoe,validateSchemaName:jF}=bi(),coe=oh.object({operation:oh.string().valid("purge_stream"),schema:oh.string().custom(QF).custom(jF).optional(),database:oh.string().custom(QF).custom(jF).optional(),table:oh.string().custom(aoe).required()});function loe(e){return ooe.validateBySchema(e,coe)}a(loe,"purgeStreamValidator");JF.exports=loe});var lN=C((zCe,ZF)=>{"use strict";var{handleHDBError:uoe,hdb_errors:doe}=he(),{HTTP_STATUS_CODES:foe}=doe,_oe=XF(),hoe=gr(),moe=bo();ZF.exports=poe;async function poe(e){e.schema=e.schema??e.database;let t=_oe(e);if(t)throw uoe(t,t.message,foe.BAD_REQUEST,void 0,void 0,!0);moe.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await hoe.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(poe,"purgeStream")});var fN=C((jCe,oG)=>{"use strict";var dN=bo(),Eoe=gr(),wg=le(),Zu=(k(),P(q)),ul=Pt(),goe=ie(),uN=ee(),{RemotePayloadObject:Soe}=X_(),{ErrorCode:eG}=require("nats"),{parentPort:tG}=require("worker_threads"),{onMessageByType:Toe}=it(),{getThisNodeName:Aoe}=(ps(),P(Oa)),{requestClusterStatus:Roe}=(q_(),P(yH)),{getReplicationSharedStatus:yoe,getHDBNodeTable:boe}=(Xc(),P(Zb)),{CONFIRMATION_STATUS_POSITION:Ooe,RECEIVED_VERSION_POSITION:Noe,RECEIVED_TIME_POSITION:woe,SENDING_TIME_POSITION:Ioe,RECEIVING_STATUS_POSITION:Coe,RECEIVING_STATUS_RECEIVING:Poe}=(bO(),P(hk)),rG=wg.get(Zu.CONFIG_PARAMS.CLUSTERING_ENABLED),nG=wg.get(Zu.CONFIG_PARAMS.CLUSTERING_NODENAME);oG.exports={clusterStatus:Doe,buildNodeStatus:iG};var sG;Toe("cluster-status",async e=>{sG(e)});async function Doe(){if(wg.get(Zu.CONFIG_PARAMS.REPLICATION_URL)||wg.get(Zu.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(tG){tG.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{sG=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=yoe(u,l,o);c.lastCommitConfirmed=Ng(f[Ooe]),c.lastReceivedRemoteTime=Ng(f[Noe]),c.lastReceivedLocalTime=Ng(f[woe]),c.sendingMessage=Ng(f[Ioe]),c.lastReceivedStatus=f[Coe]===Poe?"Receiving":"Waiting"}}}else n=Roe();n.node_name=Aoe();let s=boe().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:nG,is_enabled:rG,connections:[]};if(!rG)return e;let t=await dN.getAllNodeRecords();if(goe.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(iG(t[n],e.connections));return await Promise.allSettled(r),e}a(Doe,"clusterStatus");function Ng(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}a(Ng,"asDate");async function iG(e,t){let r=e.name,n=new Soe(Zu.OPERATIONS_ENUM.CLUSTER_STATUS,nG,void 0,await dN.getSystemInfo()),s,i,o=ul.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Eoe.request(ul.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===ul.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=ul.CLUSTER_STATUS_STATUSES.CLOSED,uN.error(`Error getting node status from ${r} `,s))}catch(l){uN.warn(`Error getting node status from ${r}`,l),l.code===eG.NoResponders?o=ul.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===eG.Timeout?o=ul.CLUSTER_STATUS_STATUSES.TIMEOUT:o=ul.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Loe(r,o,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==Zu.PRE_4_0_0_VERSION&&await dN.upsertNodeRecord(l)}catch(l){uN.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(iG,"buildNodeStatus");function Loe(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(Loe,"NodeStatusObject")});var hN=C((XCe,aG)=>{"use strict";var{handleHDBError:Moe,hdb_errors:voe}=he(),{HTTP_STATUS_CODES:Uoe}=voe,xoe=gr(),Boe=bo(),_N=ie(),Ig=require("joi"),Hoe=ot(),koe=2e3,Foe=Ig.object({timeout:Ig.number().min(1),connected_nodes:Ig.boolean(),routes:Ig.boolean()});aG.exports=Goe;async function Goe(e){Boe.checkClusteringEnabled();let t=Hoe.validateBySchema(e,Foe);if(t)throw Moe(t,t.message,Uoe.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||_N.autoCastBoolean(n),o=s===void 0||_N.autoCastBoolean(s),c={nodes:[]},l=await xoe.getServerList(r??koe),u={};if(i)for(let f=0,d=l.length;f<d;f++){let _=l[f].statsz;_&&(u[l[f].server.name]=_.routes)}for(let f=0,d=l.length;f<d;f++){if(l[f].statsz)continue;let _=l[f].server,h=l[f].data;if(_.name.endsWith("-hub")){let m={name:_.name.slice(0,-4),response_time:l[f].response_time};i&&(m.connected_nodes=[],u[_.name]&&u[_.name].forEach(S=>{m.connected_nodes.includes(S.name.slice(0,-4))||m.connected_nodes.push(S.name.slice(0,-4))})),o&&(m.routes=h.cluster?.urls?h.cluster?.urls.map(S=>({host:S.split(":")[0],port:_N.autoCast(S.split(":")[1])})):[]),c.nodes.push(m)}}return c}a(Goe,"clusterNetwork")});var dG=C((ePe,uG)=>{"use strict";var mN=require("joi"),cG=ot(),{route_constraints:lG}=ly();uG.exports={setRoutesValidator:qoe,deleteRoutesValidator:$oe};function qoe(e){let t=mN.object({server:mN.valid("hub","leaf"),routes:lG.required()});return cG.validateBySchema(e,t)}a(qoe,"setRoutesValidator");function $oe(e){let t=mN.object({routes:lG.required()});return cG.validateBySchema(e,t)}a($oe,"deleteRoutesValidator")});var Cg=C((rPe,gG)=>{"use strict";var No=Lt(),pN=ie(),Ts=(k(),P(q)),ed=le(),fG=dG(),{handleHDBError:_G,hdb_errors:Voe}=he(),{HTTP_STATUS_CODES:hG}=Voe,mG="cluster routes successfully set",pG="cluster routes successfully deleted";gG.exports={setRoutes:Yoe,getRoutes:Woe,deleteRoutes:zoe};function Koe(e){let t=No.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let o=0,c=e.routes.length;o<c;o++){let l=e.routes[o];l.port=pN.autoCast(l.port);let u=r.some(d=>d.host===l.host&&d.port===l.port),f=n.some(d=>d.host===l.host&&d.port===l.port);u||f?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?No.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):No.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:mG,set:i,skipped:s}}a(Koe,"setRoutesNats");function Yoe(e){let t=fG.setRoutesValidator(e);if(t)throw _G(t,t.message,hG.BAD_REQUEST,void 0,void 0,!0);if(ed.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED))return Koe(e);let r=[],n=[],s=ed.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{EG(s,i)?n.push(i):(s.push(i),r.push(i))}),No.updateConfigValue(Ts.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:mG,set:r,skipped:n}}a(Yoe,"setRoutes");function EG(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(EG,"existsInArray");function Woe(){if(ed.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=No.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return ed.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(Woe,"getRoutes");function zoe(e){let t=fG.deleteRoutesValidator(e);if(t)throw _G(t,t.message,hG.BAD_REQUEST,void 0,void 0,!0);if(ed.get(Ts.CONFIG_PARAMS.CLUSTERING_ENABLED))return Qoe(e);let r=[],n=[],s=ed.get(Ts.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{EG(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),No.updateConfigValue(Ts.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:pG,deleted:r,skipped:n}}a(zoe,"deleteRoutes");function Qoe(e){let t=No.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],o=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let f=e.routes[l],d=!1;for(let _=0,h=r.length;_<h;_++){let m=r[_];if(f.host===m.host&&f.port===m.port){r.splice(_,1),d=!0,o=!0,s.push(f);break}}if(!d){let _=!0;for(let h=0,m=n.length;h<m;h++){let S=n[h];if(f.host===S.host&&f.port===S.port){n.splice(h,1),c=!0,_=!1,s.push(f);break}}_&&i.push(f)}}return o&&(r=pN.isEmptyOrZeroLength(r)?null:r,No.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=pN.isEmptyOrZeroLength(n)?null:n,No.updateConfigValue(Ts.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:pG,deleted:s,skipped:i}}a(Qoe,"deleteRoutesNats")});var TG=C((sPe,SG)=>{"use strict";var ah=require("alasql"),dl=require("recursive-iterator"),ei=ee(),joe=ie(),ch=(k(),P(q)),EN=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,Xoe(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=>ch.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=>!ch.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][ch.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[o].attribute_permissions.length>0?c=Joe(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=>!ch.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let f=new ah.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 Joe(e){return e.filter(t=>t[ch.PERMS_CRUD_ENUM.READ])}a(Joe,"filterReadRestrictedAttrs");function Xoe(e,t,r,n,s){Zoe(e,t,r,n,s)}a(Xoe,"interpretAST");function lh(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(lh,"addSchemaTableToMap");function Zoe(e,t,r,n,s){if(!e){ei.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof ah.yy.Insert?nae(e,t,r):e instanceof ah.yy.Select?eae(e,t,r,n,s):e instanceof ah.yy.Update?tae(e,t,r):e instanceof ah.yy.Delete?rae(e,t,r):ei.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(Zoe,"getRecordAttributesAST");function eae(e,t,r,n,s){if(!e){ei.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(joe.isEmptyOrZeroLength(i)){ei.error("No schema specified");return}e.from.forEach(c=>{lh(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),lh(c.table,t,r,n,s)});let o=new dl(e.columns);for(let{node:c}of o)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{ei.info(`table specified as ${l} not found.`);return}t.get(u).get(l).indexOf(c.columnid)<0&&t.get(u).get(l).push(c.columnid)}if(e.where){let c=new dl(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let f=u.tableid?u.tableid:l;if(!t.get(i).has(f))if(r.has(f))f=r.get(f);else{ei.info(`table specified as ${f} not found.`);continue}t.get(i).get(f).indexOf(u.columnid)<0&&t.get(i).get(f).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new dl(c.on);for(let{node:u}of l)if(u&&u.columnid){let f=u.tableid,d=s.get(f);if(!t.get(d).has(f))if(r.has(f))f=r.get(f);else{ei.info(`table specified as ${f} not found.`);continue}t.get(d).get(f).indexOf(u.columnid)<0&&t.get(d).get(f).push(u.columnid)}}),e.order){let c=new dl(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,f=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(f).has(u))if(r.has(u))u=r.get(u);else{ei.info(`table specified as ${u} not found.`);return}t.get(f).get(u).indexOf(l.columnid)<0&&t.get(f).get(u).push(l.columnid)}}}a(eae,"getSelectAttributes");function tae(e,t,r){if(!e){ei.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new dl(e.columns),s=e.table.databaseid;lh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&gN(e.table.tableid,s,i.columnid,t,r)}a(tae,"getUpdateAttributes");function rae(e,t,r){if(!e){ei.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new dl(e.where),s=e.table.databaseid;lh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&gN(e.table.tableid,s,i.columnid,t,r)}a(rae,"getDeleteAttributes");function nae(e,t,r){if(!e){ei.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new dl(e.columns),s=e.into.databaseid;lh(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&gN(e.into.tableid,s,i.columnid,t,r)}a(nae,"getInsertAttributes");function gN(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(gN,"pushAttribute");SG.exports=EN});var RG=C((oPe,AG)=>{"use strict";var Pg=(k(),P(q)),Dg=class{static{a(this,"BaseLicense")}constructor(t=0,r=Pg.RAM_ALLOCATION_ENUM.DEFAULT,n=Pg.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},SN=class extends Dg{static{a(this,"ExtendedLicense")}constructor(t=0,r=Pg.RAM_ALLOCATION_ENUM.DEFAULT,n=Pg.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};AG.exports={BaseLicense:Dg,ExtendedLicense:SN}});var nd=C((cPe,IG)=>{"use strict";var rd=require("fs-extra"),Lg=(Fp(),P(kp)),bG=require("crypto"),sae=require("moment"),iae=require("uuid").v4,Jr=ee(),AN=require("path"),oae=ie(),fl=(k(),P(q)),{totalmem:yG}=require("os"),aae=RG().ExtendedLicense,td="invalid license key format",cae="061183",lae="mofi25",uae="aes-256-cbc",dae=16,fae=32,OG=le(),{resolvePath:NG}=Lt();OG.initSync();var TN;IG.exports={validateLicense:wG,generateFingerPrint:hae,licenseSearch:bN,getLicense:Eae,checkMemoryLimit:gae};function RN(){return AN.join(OG.getHdbBasePath(),fl.LICENSE_KEY_DIR_NAME,fl.LICENSE_FILE_NAME)}a(RN,"getLicenseDirPath");function _ae(){let e=RN();return NG(AN.join(e,fl.LICENSE_FILE_NAME))}a(_ae,"getLicenseFilePath");function yN(){let e=RN();return NG(AN.join(e,fl.REG_KEY_FILE_NAME))}a(yN,"getFingerPrintFilePath");async function hae(){let e=yN();try{return await rd.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await mae();throw Jr.error(`Error writing fingerprint file to ${e}`),Jr.error(t),new Error("There was an error generating the fingerprint")}}a(hae,"generateFingerPrint");async function mae(){let e=iae(),t=Lg.hash(e,Lg.HASH_FUNCTION.MD5),r=yN();try{await rd.mkdirp(RN()),await rd.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw Jr.error(`Error writing fingerprint file to ${r}`),Jr.error(n),new Error("There was an error generating the fingerprint")}return t}a(mae,"writeFingerprint");function wG(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:fl.RAM_ALLOCATION_ENUM.DEFAULT,version:fl.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return Jr.error("empty license key passed to validate."),r;let n=yN(),s=!1;try{s=rd.statSync(n)}catch(i){Jr.error(i)}if(s){let i;try{i=rd.readFileSync(n,"utf8")}catch{Jr.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(lae),c=o[1];c=Buffer.concat([Buffer.from(c)],dae);let l=Buffer.concat([Buffer.from(i)],fae),u=bG.createDecipheriv(uae,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let f=null;try{f=u.update(o[0],"hex","utf8"),f.trim(),f+=u.final("utf8")}catch{let h=pae(o[0],i);if(h)f=h;else throw r.valid_license=!1,r.valid_machine=!1,console.error(td),Jr.error(td),new Error(td)}let d;if(isNaN(f))try{d=JSON.parse(f),r.version=d.version,r.exp_date=d.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),d.ram_allocation&&(r.ram_allocation=d.ram_allocation)}catch{throw console.error(td),Jr.error(td),new Error(td)}else r.exp_date=f;r.exp_date<sae().valueOf()&&(r.valid_date=!1),Lg.validate(o[1],`${cae}${i}${t}`,Lg.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||Jr.error("Invalid licence"),r}a(wG,"validateLicense");function pae(e,t){try{let r=bG.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{Jr.warn("Check old license failed")}}a(pae,"checkOldLicense");function bN(){let e=new aae,t=[];try{t=rd.readFileSync(_ae(),"utf-8").split(`\r
22
- `)}catch(r){r.code==="ENOENT"?Jr.debug("no license file found"):Jr.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(oae.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=wG(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){Jr.error("There was an error parsing the license string."),Jr.error(s),e.ram_allocation=fl.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return TN=e,e}a(bN,"licenseSearch");async function Eae(){return TN||await bN(),TN}a(Eae,"getLicense");function gae(){let e=bN().ram_allocation,t=process.constrainedMemory?.()||yG();if(t=Math.round(Math.min(t,yG())/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(gae,"checkMemoryLimit")});var wN=C((uPe,LG)=>{var Mg=nd(),CG=require("chalk"),Zn=ee(),PG=require("prompt"),{promisify:Sae}=require("util"),ON=(k(),P(q)),Tae=require("fs-extra"),Aae=require("path"),Rae=ie(),{packageJson:yae}=Et(),DG=le();DG.initSync();var bae=require("moment"),Oae=Sae(PG.get),Nae=Aae.join(DG.getHdbBasePath(),ON.LICENSE_KEY_DIR_NAME,ON.LICENSE_FILE_NAME,ON.LICENSE_FILE_NAME);LG.exports={getFingerprint:Iae,setLicense:wae,parseLicense:NN,register:Cae,getRegistrationInfo:Dae};async function wae(e){if(e&&e.key&&e.company){try{Zn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await NN(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw Zn.error(r),Zn.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(wae,"setLicense");async function Iae(){let e={};try{e=await Mg.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw Zn.error(r),Zn.error(t),new Error(r)}return e}a(Iae,"getFingerprint");async function NN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");Zn.info("Validating license input...");let r=Mg.validateLicense(e,t);if(Zn.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(Zn.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(Zn.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{Zn.info("writing license to disk"),await Tae.writeFile(Nae,JSON.stringify({license_key:e,company:t}))}catch(n){throw Zn.error("Failed to write License"),n}return"Registration successful."}a(NN,"parseLicense");async function Cae(){let e=await Pae();return NN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Cae,"register");async function Pae(){let e=await Mg.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:CG.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:CG.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{PG.start()}catch(n){Zn.error(n)}let r;try{r=await Oae(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(Pae,"promptForRegistration");async function Dae(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await Mg.getLicense()}catch(r){throw Zn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(Rae.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=yae.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=bae.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(Dae,"getRegistrationInfo")});var vG=C((fPe,MG)=>{"use strict";var Lae=Pt(),IN=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d,_,h,m){this.port=t,o===null&&(o=void 0),this.server_name=r+Lae.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c}},this.cluster={name:f,port:d,routes:_,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l}},this.accounts={SYS:{users:h},HDB:{users:m}},this.system_account="SYS"}};MG.exports=IN});var BG=C((hPe,xG)=>{"use strict";var UG=Pt(),CN=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+UG.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+UG.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"}};xG.exports=CN});var kG=C((pPe,HG)=>{"use strict";var PN=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};HG.exports=PN});var GG=C((gPe,FG)=>{"use strict";var Mae=Pt(),DN=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+Mae.SERVER_SUFFIX.ADMIN,this.password=r}};FG.exports=DN});var Bg=C((TPe,VG)=>{"use strict";var _l=require("path"),hl=require("fs-extra"),vae=vG(),Uae=BG(),xae=kG(),Bae=GG(),LN=Kn(),id=ie(),On=Lt(),Ug=(k(),P(q)),uh=Pt(),{CONFIG_PARAMS:Jt}=Ug,od=ee(),dh=le(),qG=fo(),MN=gr(),Hae=Zs(),sd="clustering",kae=1e4,$G=50;VG.exports={generateNatsConfig:Gae,removeNatsConfig:qae,getHubConfigPath:Fae};function Fae(){let e=dh.get(Jt.ROOTPATH);return _l.join(e,sd,uh.NATS_CONFIG_FILES.HUB_SERVER)}a(Fae,"getHubConfigPath");async function Gae(e=!1,t=void 0){let r=dh.get(Jt.ROOTPATH);hl.ensureDirSync(_l.join(r,"clustering","leaf")),dh.initSync();let n=On.getConfigFromFile(Jt.CLUSTERING_TLS_CERT_AUTH),s=On.getConfigFromFile(Jt.CLUSTERING_TLS_PRIVATEKEY),i=On.getConfigFromFile(Jt.CLUSTERING_TLS_CERTIFICATE);!await hl.exists(i)&&!await hl.exists(!n)&&await Hae.createNatsCerts();let o=_l.join(r,sd,uh.PID_FILES.HUB),c=_l.join(r,sd,uh.PID_FILES.LEAF),l=On.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=_l.join(r,sd,uh.NATS_CONFIG_FILES.HUB_SERVER),f=_l.join(r,sd,uh.NATS_CONFIG_FILES.LEAF_SERVER),d=On.getConfigFromFile(Jt.CLUSTERING_TLS_INSECURE),_=On.getConfigFromFile(Jt.CLUSTERING_TLS_VERIFY),h=On.getConfigFromFile(Jt.CLUSTERING_NODENAME),m=On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await MN.checkNATSServerInstalled()||xg("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await LN.listUsers(),g=On.getConfigFromFile(Jt.CLUSTERING_USER),R=await LN.getClusterUser();(id.isEmpty(R)||R.active!==!0)&&xg(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await vg(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await vg(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await vg(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),await vg(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[se,z]of S.entries())z.role?.role===Ug.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(E.push(new Bae(z.username,qG.decrypt(z.hash))),T.push(new xae(z.username,qG.decrypt(z.hash))));let N=[],{hub_routes:v}=On.getClusteringRoutes();if(!id.isEmptyOrZeroLength(v))for(let se of v)N.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${se.host}:${se.port}`);let H=new vae(On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),h,o,i,s,n,d,_,m,On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NAME),On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete H.tls.ca_file,delete H.leafnodes.tls.ca_file),t=id.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===Ug.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await hl.writeJson(u,H),od.trace(`Hub server config written to ${u}`));let X=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,W=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,$=new Uae(On.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[X],[W],E,T,i,s,n,d);n==null&&delete $.tls.ca_file,(t===void 0||t===Ug.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await hl.writeJson(f,$),od.trace(`Leaf server config written to ${f}`))}a(Gae,"generateNatsConfig");async function vg(e){let t=dh.get(e);return id.isEmpty(t)&&xg(`port undefined for '${e}'`),await id.isPortTaken(t)&&xg(`'${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(vg,"isPortAvailable");function xg(e){let t=`Error generating clustering config: ${e}`;od.error(t),console.error(t),process.exit(1)}a(xg,"generateNatsConfigError");async function qae(e){let{port:t,config_file:r}=MN.getServerConfig(e),{username:n,decrypt_hash:s}=await LN.getClusterUser(),i=0,o=2e3;for(;i<$G;){try{let f=await MN.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){od.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=$G)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=o*(i*2);u>3e4&&od.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await id.async_set_timeout(u)}let c="0".repeat(kae),l=_l.join(dh.get(Jt.ROOTPATH),sd,r);await hl.writeFile(l,c),await hl.remove(l),od.notify(e,"started.")}a(qae,"removeNatsConfig")});var jG=C((RPe,QG)=>{"use strict";var es=le(),$ae=nd(),Ve=(k(),P(q)),fh=Pt(),wo=require("path"),{PACKAGE_ROOT:kg}=Et(),KG=le(),Hg=ie(),ad="/dev/null",Vae=wo.join(kg,"launchServiceScripts"),YG=wo.join(kg,"utility/scripts"),Kae=wo.join(YG,Ve.HDB_RESTART_SCRIPT),WG=wo.resolve(kg,"dependencies",`${process.platform}-${process.arch}`,fh.NATS_BINARY_NAME);function zG(){let t=$ae.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 Hg.noBootFile()&&(n[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Hg.getEnvCliRootPath()),{name:Ve.PROCESS_DESCRIPTORS.HDB,script:Ve.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:kg}}a(zG,"generateMainServerConfig");var Yae=9930;function Wae(){es.initSync(!0);let e=es.get(Ve.CONFIG_PARAMS.ROOTPATH),t=wo.join(e,"clustering",fh.NATS_CONFIG_FILES.HUB_SERVER),r=wo.join(es.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=KG.get(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=fh.LOG_LEVEL_FLAGS[es.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Yae?"-"+n:""),script:WG,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=ad,i.error_file=ad),i}a(Wae,"generateNatsHubServerConfig");var zae=9940;function Qae(){es.initSync(!0);let e=es.get(Ve.CONFIG_PARAMS.ROOTPATH),t=wo.join(e,"clustering",fh.NATS_CONFIG_FILES.LEAF_SERVER),r=wo.join(es.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=KG.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=fh.LOG_LEVEL_FLAGS[es.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==zae?"-"+n:""),script:WG,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=ad,i.error_file=ad),i}a(Qae,"generateNatsLeafServerConfig");function jae(){es.initSync();let e=wo.join(es.get(Ve.CONFIG_PARAMS.LOGGING_ROOT),Ve.LOG_NAMES.HDB),t={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ve.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:Vae,autorestart:!1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=ad,t.error_file=ad),t}a(jae,"generateClusteringUpgradeV4ServiceConfig");function Jae(){let e={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.RESTART_HDB};return Hg.noBootFile()&&(e[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Hg.getEnvCliRootPath()),{...{name:Ve.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:YG},script:Kae}}a(Jae,"generateRestart");function Xae(){return{apps:[zG()]}}a(Xae,"generateAllServiceConfigs");QG.exports={generateAllServiceConfigs:Xae,generateMainServerConfig:zG,generateRestart:Jae,generateNatsHubServerConfig:Wae,generateNatsLeafServerConfig:Qae,generateClusteringUpgradeV4ServiceConfig:jae}});var hh=C((OPe,uq)=>{"use strict";var tt=(k(),P(q)),Zae=ie(),Co=Bg(),Fg=gr(),Io=Pt(),va=jG(),Gg=le(),ml=ee(),ece=bo(),{startWorker:JG,onMessageFromWorkers:tce}=it(),rce=Ju(),bPe=require("util"),nce=require("child_process"),sce=require("fs"),{execFile:ice}=nce,ze;uq.exports={enterPM2Mode:oce,start:Ua,stop:vN,reload:ZG,restart:eq,list:UN,describe:nq,connect:Po,kill:dce,startAllServices:fce,startService:xN,getUniqueServicesList:sq,restartAllServices:_ce,isServiceRegistered:iq,reloadStopStart:oq,restartHdb:rq,deleteProcess:lce,startClusteringProcesses:cq,startClusteringThreads:lq,isHdbRestartRunning:uce,isClusteringRunning:mce,stopClustering:hce,reloadClustering:pce,expectedRestartOfChildren:tq};var _h=!1;tce(e=>{e.type==="restart"&&Gg.initSync(!0)});function oce(){_h=!0}a(oce,"enterPM2Mode");function Po(){return ze||(ze=require("pm2")),new Promise((e,t)=>{ze.connect((r,n)=>{r&&t(r),e(n)})})}a(Po,"connect");var Xr,ace=10,XG;function Ua(e,t=!1){if(_h)return cce(e);let r=ice(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=Xr.indexOf(r);o>-1&&Xr.splice(o,1),!XG&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<ace&&(sce.existsSync(Co.getHubConfigPath())?Ua(e):(await Co.generateNatsConfig(!0),Ua(e),await new Promise(c=>setTimeout(c,3e3)),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=Gg.get(tt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&Io.LOG_LEVEL_HIERARCHY[o]>=Io.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===Io.LOG_LEVELS.ERR||f===Io.LOG_LEVELS.WRN?ml.OUTPUTS.STDERR:ml.OUTPUTS.STDOUT;ml.logCustomLevel(f||"info",h,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=Io.LOG_LEVELS[_]}if(Io.LOG_LEVEL_HIERARCHY[o]>=Io.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===Io.LOG_LEVELS.ERR||f===Io.LOG_LEVELS.WRN?ml.OUTPUTS.STDERR:ml.OUTPUTS.STDOUT;ml.logCustomLevel(f||"info",d,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!Xr&&(Xr=[],!t)){let i=a(()=>{XG=!0,Xr&&(Xr.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)}Xr.push(r)}a(Ua,"start");function cce(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.start(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(cce,"startWithPM2");function vN(e){if(!_h){for(let t of Xr||[])t.name===e&&(Xr.splice(Xr.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.stop(e,async(n,s)=>{n&&(ze.disconnect(),r(n)),ze.delete(e,(i,o)=>{i&&(ze.disconnect(),r(n)),ze.disconnect(),t(o)})})})}a(vN,"stop");function ZG(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.reload(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(ZG,"reload");function eq(e){if(!_h){tq();for(let t of Xr||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.restart(e,(n,s)=>{ze.disconnect(),t(s)})})}a(eq,"restart");function tq(){for(let e of Xr||[])e.config&&(e.config.restarts=0)}a(tq,"expectedRestartOfChildren");function lce(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.delete(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(lce,"deleteProcess");async function rq(){await Ua(va.generateRestart())}a(rq,"restartHdb");async function uce(){let e=await UN();for(let t in e)if(e[t].name===tt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(uce,"isHdbRestartRunning");function UN(){return new Promise(async(e,t)=>{try{await Po()}catch(r){t(r)}ze.list((r,n)=>{r&&(ze.disconnect(),t(r)),ze.disconnect(),e(n)})})}a(UN,"list");function nq(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.describe(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(nq,"describe");function dce(){if(!_h){for(let e of Xr||[])e.kill();Xr=[];return}return new Promise(async(e,t)=>{try{await Po()}catch(r){t(r)}ze.killDaemon((r,n)=>{r&&(ze.disconnect(),t(r)),ze.disconnect(),e(n)})})}a(dce,"kill");async function fce(){try{await cq(),await lq(),await Ua(va.generateAllServiceConfigs())}catch(e){throw ze?.disconnect(),e}}a(fce,"startAllServices");async function xN(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case tt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=va.generateMainServerConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=va.generateNatsIngestServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=va.generateNatsReplyServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=va.generateNatsHubServerConfig(),await Ua(r,t),await Co.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=va.generateNatsLeafServerConfig(),await Ua(r,t),await Co.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=va.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await Ua(r)}catch(r){throw ze?.disconnect(),r}}a(xN,"startService");async function sq(){try{let e=await UN(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw ze?.disconnect(),e}}a(sq,"getUniqueServicesList");async function _ce(e=[]){try{let t=!1,r=await sq();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 eq(o))}t&&await oq(tt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw ze?.disconnect(),t}}a(_ce,"restartAllServices");async function iq(e){if(Xr?.find(r=>r.name===e))return!0;let t=await rce.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(iq,"isServiceRegistered");async function oq(e){let t=Gg.get(tt.CONFIG_PARAMS.THREADS_COUNT)??Gg.get(tt.CONFIG_PARAMS.THREADS),r=await nq(e),n=Zae.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await vN(e),await xN(e)):e===tt.PROCESS_DESCRIPTORS.HDB?await rq():await ZG(e)}a(oq,"reloadStopStart");var aq;async function cq(e=!1){for(let t in tt.CLUSTERING_PROCESSES){let r=tt.CLUSTERING_PROCESSES[t];await xN(r,e)}}a(cq,"startClusteringProcesses");async function lq(){aq=JG(tt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await Fg.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await Fg.updateLocalStreams();let e=await ece.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===tt.PRE_4_0_0_VERSION){ml.info("Starting clustering upgrade 4.0.0 process"),JG(tt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(lq,"startClusteringThreads");async function hce(){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 aq.terminate();else{let t=tt.CLUSTERING_PROCESSES[e];await vN(t)}}a(hce,"stopClustering");async function mce(){for(let e in tt.CLUSTERING_PROCESSES){let t=tt.CLUSTERING_PROCESSES[e];if(await iq(t)===!1)return!1}return!0}a(mce,"isClusteringRunning");async function pce(){await Co.generateNatsConfig(!0),await Fg.reloadNATSHub(),await Fg.reloadNATSLeaf(),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(pce,"reloadClustering")});var kN={};Ue(kN,{compactOnStart:()=>Ece,copyDb:()=>pq});async function Ece(){xa.notify("Running compact on start"),console.log("Running compact on start");let e=(0,BN.get)(x.ROOTPATH),t=new Map,r=Xe();(0,HN.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,qg.join)(e,"backup",n+".mdb"),o=(0,qg.join)(e,fc,n+"-copy.mdb"),c=0;try{c=await dq(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){xa.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{db_path:s,copy_dest:o,backup_dest:i,record_count:c}),await pq(n,o),console.log("Backing up",n,"to",i),await(0,pl.move)(s,i,{overwrite:!0})}try{ld()}catch(n){xa.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}for(let[n,{db_path:s,copy_dest:i}]of t)console.log("Moving copy compacted",n,"to",s),await(0,pl.move)(i,s,{overwrite:!0}),await(0,pl.remove)((0,qg.join)(e,fc,`${n}-copy.mdb-lock`));try{ld()}catch(n){xa.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){xa.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,HN.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);for(let[s,{db_path:i,backup_dest:o}]of t){console.error("Moving backup database",o,"back to",i);try{await(0,pl.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw ld(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await dq(n);if(console.log("Database",n,"after compact has a total record count of",c),i!==c){o=!1;let l=`There is a discrepancy between pre and post compact record count for database ${n}.
23
- Total record count before compaction: ${i}, total after: ${c}.
24
- Database backup has not been removed and can be found here: ${s}`;xa.error(l),console.error(l)}(0,BN.get)(x.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||o===!1||(console.log("Removing backup",s),await(0,pl.remove)(s))}}async function dq(e){let t=await(0,mq.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}function cd(){}async function pq(e,t){console.log(`Copying database ${e} to ${t}`);let r=Xe()[e];if(!r)throw new Error(`Source database not found: ${e}`);let n;for(let d in r){let _=r[d];_.primaryStore.put=cd,_.primaryStore.remove=cd;for(let h in _.indices){let m=_.indices[h];m.put=cd,m.remove=cd}_.auditStore&&(_.auditStore.put=cd,_.auditStore.remove=cd),n=_.primaryStore.rootStore}if(!n)throw new Error(`Source database does not have any tables: ${e}`);let s=n.dbisDb,i=n.auditStore,o=(0,fq.open)(new _q.default(t)),c=o.openDB($g.INTERNAL_DBIS_NAME),l,u=0,f=s.useReadTransaction();try{for(let{key:_,value:h}of s.getRange({transaction:f})){let m=h.is_hash_attribute||h.isPrimaryKey,S,g;if(m&&(S=h.compression,g=Vg(),g?h.compression=g:delete h.compression,S?.dictionary?.toString()===g?.dictionary?.toString()&&(S=null,g=null)),c.put(_,h),!(m||h.indexed))continue;let R=new hq.default(!m,m);R.encoding="binary",R.compression=S;let E=n.openDB(_,R);E.decoder=null,E.decoderCopies=!1,E.encoding="binary",R.compression=g;let T=o.openDB(_,R);T.encoder=null,console.log("copying",_,"from",e,"to",t),await d(E,T,m,f)}if(i){let _=n.openDB($g.AUDIT_STORE_NAME,mh);console.log("copying audit log for",e,"to",t),d(i,_,!1,f)}async function d(_,h,m,S){let g=0,R=0,E=0,T=1e7,N=null;for(;T-- >0;)try{for(let v of _.getKeys({start:N,transaction:S}))try{N=v;let{value:H,version:X}=_.getEntry(v,{transaction:S});if(H?.length<14&&m){E++;continue}l=h.put(v,H,m?X:void 0),g++,S.openTimer&&(S.openTimer=0),R+=(v?.length||10)+H.length,u++>5e3&&(await l,console.log("copied",g,"entries, skipped",E,"delete records,",R,"bytes"),u=0)}catch(H){console.error("Error copying record",typeof v=="symbol"?"symbol":v,"from",e,"to",t,H)}console.log("finish copying, copied",g,"entries, skipped",E,"delete records,",R,"bytes");return}catch{if(typeof N=="string"){if(N==="z")return console.error("Reached end of dbi",N,"for",e,"to",t);N=N.slice(0,-2)+"z"}else if(typeof N=="number")N++;else return console.error("Unknown key type",N,"for",e,"to",t)}}a(d,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{f.done(),o.close()}}var fq,qg,pl,BN,_q,hq,$g,mq,HN,xa,FN=Re(()=>{xe();fq=require("lmdb"),qg=require("path"),pl=require("fs-extra"),BN=M(le()),_q=M(qf()),hq=M(Gf()),$g=M(Gt());k();Ti();mq=M(_o()),HN=M(Lt()),xa=M(ee());a(Ece,"compactOnStart");a(dq,"getTotalDBRecordCount");a(cd,"noop");a(pq,"copyDb")});var dd=C((vPe,yq)=>{"use strict";var gce=require("minimist"),{isMainThread:qN,parentPort:Eh,threadId:DPe}=require("worker_threads"),at=(k(),P(q)),Bi=ee(),$N=ie(),Yg=Bg(),Kg=gr(),LPe=Pt(),Tq=Lt(),ti=hh(),Eq=Ju(),{compactOnStart:Sce}=(FN(),P(kN)),Tce=_c(),{restartWorkers:Wg,onMessageByType:Ace}=it(),{handleHDBError:Rce,hdb_errors:yce}=he(),{HTTP_STATUS_CODES:bce}=yce,gh=le(),{sendOperationToNode:gq,getThisNodeName:Oce,monitorNodeCAs:Nce}=(ps(),P(Oa)),{getHDBNodeTable:MPe}=(Xc(),P(Zb));gh.initSync();var ph=`Restarting HarperDB. This may take up to ${at.RESTART_TIMEOUT_MS/1e3} seconds.`,wce="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",Sq="Clustering is not enabled so cannot be restarted",Ice="Invalid service",ud,As;yq.exports={restart:Aq,restartService:VN};qN&&Ace(at.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await VN({service:e.workerType}):Aq({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function Aq(e){As=Object.keys(e).length===0,ud=await ti.isServiceRegistered(at.PROCESS_DESCRIPTORS.HDB);let t=gce(process.argv);if(t.service){await VN(t);return}if(As&&!ud){console.error(wce);return}if(As&&console.log(ph),ud){ti.enterPM2Mode(),Bi.notify(ph);let r=Tce(Object.keys(at.CONFIG_PARAM_MAP),!0);return $N.isEmptyOrZeroLength(Object.keys(r))||Tq.updateConfigValue(void 0,void 0,r,!0,!0),Cce(),ph}return qN?(Bi.notify(ph),gh.get(at.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await Sce(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{Wg()},50)):Eh.postMessage({type:at.ITC_EVENT_TYPES.RESTART}),ph}a(Aq,"restart");async function VN(e){let{service:t}=e;if(at.HDB_PROCESS_SERVICES[t]===void 0)throw Rce(new Error,Ice,bce.BAD_REQUEST,void 0,void 0,!0);if(ti.expectedRestartOfChildren(),ud=await ti.isServiceRegistered(at.PROCESS_DESCRIPTORS.HDB),!qN){e.replicated&&Nce(),Eh.postMessage({type:at.ITC_EVENT_TYPES.RESTART,workerType:t}),Eh.ref(),await new Promise(s=>{Eh.on("message",i=>{i.type==="restart-complete"&&(s(),Eh.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===Oce())continue;let i;try{({job_id:i}=await gq(s,e))}catch(o){n.push({node:s.name,message:o.message});continue}n.push(await new Promise((o,c)=>{let u=2400,f=setInterval(async()=>{if(u--<=0){clearInterval(f);let h=new Error("Timed out waiting for restart job to complete");h.replicated=n,c(h)}let _=(await gq(s,{operation:"get_job",id:i})).results[0];if(_.status==="COMPLETE"&&(clearInterval(f),o({node:s.name,message:_.message})),_.status==="ERROR"){clearInterval(f);let h=new Error(_.message);h.replicated=n,c(h)}},250)}))}return{replicated:n}}return}let r;switch(t){case at.HDB_PROCESS_SERVICES.clustering:if(!gh.get(at.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Sq;break}As&&console.log("Restarting clustering"),Bi.notify("Restarting clustering"),await Rq();break;case at.HDB_PROCESS_SERVICES.clustering_config:case at.HDB_PROCESS_SERVICES["clustering config"]:if(!gh.get(at.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Sq;break}As&&console.log("Restarting clustering_config"),Bi.notify("Restarting clustering_config"),await ti.reloadClustering();break;case"custom_functions":case"custom functions":case at.HDB_PROCESS_SERVICES.harperdb:case at.HDB_PROCESS_SERVICES.http_workers:case at.HDB_PROCESS_SERVICES.http:if(As&&!ud){r=`Restart ${t} is not available from the CLI when running in non-pm2 mode. Either call restart ${t} from the API or stop and start HarperDB.`;break}As&&console.log("Restarting http_workers"),Bi.notify("Restarting http_workers"),As?await ti.restart(at.PROCESS_DESCRIPTORS.HDB):await Wg("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Bi.error(r),As&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(VN,"restartService");async function Cce(){await Rq(),await ti.restart(at.PROCESS_DESCRIPTORS.HDB),await $N.async_set_timeout(2e3),gh.get(at.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await GN(),As&&(await Kg.closeConnection(),process.exit(0))}a(Cce,"restartPM2Mode");async function Rq(){if(!Tq.getConfigFromFile(at.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await Eq.getHDBProcessInfo()).clustering.length===0)Bi.trace("Clustering not running, restart will start clustering services"),await Yg.generateNatsConfig(!0),await ti.startClusteringProcesses(),await ti.startClusteringThreads(),await GN(),As&&await Kg.closeConnection();else{await Yg.generateNatsConfig(!0),ud?(Bi.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await ti.restart(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await ti.restart(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await Eq.getHDBProcessInfo()).clustering.forEach(s=>{Bi.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await $N.async_set_timeout(3e3),await GN(),await Kg.updateLocalStreams(),As&&await Kg.closeConnection(),Bi.trace("Restart clustering restarting ingest and reply service threads");let t=Wg(at.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=Wg(at.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(Rq,"restartClustering");async function GN(){await Yg.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Yg.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(GN,"removeNatsConfig")});var vq=C((BPe,Mq)=>{"use strict";var xPe=require("lodash"),Nn=(k(),P(q)),{handleHDBError:bq,hdb_errors:Pce}=he(),{HDB_ERROR_MSGS:Dce,HTTP_STATUS_CODES:Lce}=Pce,KN=ee();Mq.exports={getRolePermissions:vce};var El=Object.create(null),Mce=a(e=>({key:e,perms:{}}),"perms_template_obj"),Iq=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),Cq=a((e=!1,t=!1,r=!1,n=!1)=>({[Nn.PERMS_CRUD_ENUM.READ]:e,[Nn.PERMS_CRUD_ENUM.INSERT]:t,[Nn.PERMS_CRUD_ENUM.UPDATE]:r,[Nn.PERMS_CRUD_ENUM.DELETE]:n}),"permissions_template"),YN=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...Cq(t,r,n,s)}),"table_perms_template"),Oq=a((e,t=Cq())=>({attribute_name:e,describe:Lq(t),[Sh]:t[Sh],[WN]:t[WN],[zN]:t[zN]}),"attr_perms_template"),Nq=a((e,t=!1)=>({attribute_name:e,describe:t,[Sh]:t}),"timestamp_attr_perms_template"),{READ:Sh,INSERT:WN,UPDATE:zN}=Nn.PERMS_CRUD_ENUM,Pq=Object.values(Nn.PERMS_CRUD_ENUM),Dq=[Sh,WN,zN];function vce(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[Nn.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(El[t]&&El[t].key===n)return El[t].perms;let s=Uce(e,r);return El[t]?El[t].key=n:El[t]=Mce(n),El[t].perms=s,s}catch(r){if(!e[Nn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[Nn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<Nn.PERMS_UPDATE_RELEASE_TIMESTAMP){let n=`Role permissions for role '${t}' must be updated to align with new structure from the 2.2.0 release.`;throw KN.error(n),KN.debug(r),bq(new Error,Dce.OUTDATED_PERMS_TRANSLATION_ERROR,Lce.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
22
+ `)}catch(r){r.code==="ENOENT"?Jr.debug("no license file found"):Jr.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(oae.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=wG(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){Jr.error("There was an error parsing the license string."),Jr.error(s),e.ram_allocation=fl.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return TN=e,e}a(bN,"licenseSearch");async function Eae(){return TN||await bN(),TN}a(Eae,"getLicense");function gae(){let e=bN().ram_allocation,t=process.constrainedMemory?.()||yG();if(t=Math.round(Math.min(t,yG())/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(gae,"checkMemoryLimit")});var wN=C((uPe,LG)=>{var Mg=nd(),CG=require("chalk"),Zn=ee(),PG=require("prompt"),{promisify:Sae}=require("util"),ON=(k(),P(q)),Tae=require("fs-extra"),Aae=require("path"),Rae=ie(),{packageJson:yae}=Et(),DG=le();DG.initSync();var bae=require("moment"),Oae=Sae(PG.get),Nae=Aae.join(DG.getHdbBasePath(),ON.LICENSE_KEY_DIR_NAME,ON.LICENSE_FILE_NAME,ON.LICENSE_FILE_NAME);LG.exports={getFingerprint:Iae,setLicense:wae,parseLicense:NN,register:Cae,getRegistrationInfo:Dae};async function wae(e){if(e&&e.key&&e.company){try{Zn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await NN(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw Zn.error(r),Zn.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(wae,"setLicense");async function Iae(){let e={};try{e=await Mg.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw Zn.error(r),Zn.error(t),new Error(r)}return e}a(Iae,"getFingerprint");async function NN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");Zn.info("Validating license input...");let r=Mg.validateLicense(e,t);if(Zn.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(Zn.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(Zn.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{Zn.info("writing license to disk"),await Tae.writeFile(Nae,JSON.stringify({license_key:e,company:t}))}catch(n){throw Zn.error("Failed to write License"),n}return"Registration successful."}a(NN,"parseLicense");async function Cae(){let e=await Pae();return NN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Cae,"register");async function Pae(){let e=await Mg.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:CG.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:CG.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{PG.start()}catch(n){Zn.error(n)}let r;try{r=await Oae(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(Pae,"promptForRegistration");async function Dae(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await Mg.getLicense()}catch(r){throw Zn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(Rae.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=yae.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=bae.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(Dae,"getRegistrationInfo")});var vG=C((fPe,MG)=>{"use strict";var Lae=Pt(),IN=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d,_,h,m){this.port=t,o===null&&(o=void 0),this.server_name=r+Lae.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c}},this.cluster={name:f,port:d,routes:_,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l}},this.accounts={SYS:{users:h},HDB:{users:m}},this.system_account="SYS"}};MG.exports=IN});var BG=C((hPe,xG)=>{"use strict";var UG=Pt(),CN=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+UG.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+UG.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"}};xG.exports=CN});var kG=C((pPe,HG)=>{"use strict";var PN=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};HG.exports=PN});var GG=C((gPe,FG)=>{"use strict";var Mae=Pt(),DN=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+Mae.SERVER_SUFFIX.ADMIN,this.password=r}};FG.exports=DN});var Bg=C((TPe,VG)=>{"use strict";var _l=require("path"),hl=require("fs-extra"),vae=vG(),Uae=BG(),xae=kG(),Bae=GG(),LN=Kn(),id=ie(),On=Lt(),Ug=(k(),P(q)),uh=Pt(),{CONFIG_PARAMS:Jt}=Ug,od=ee(),dh=le(),qG=fo(),MN=gr(),Hae=Zs(),sd="clustering",kae=1e4,$G=50;VG.exports={generateNatsConfig:Gae,removeNatsConfig:qae,getHubConfigPath:Fae};function Fae(){let e=dh.get(Jt.ROOTPATH);return _l.join(e,sd,uh.NATS_CONFIG_FILES.HUB_SERVER)}a(Fae,"getHubConfigPath");async function Gae(e=!1,t=void 0){let r=dh.get(Jt.ROOTPATH);hl.ensureDirSync(_l.join(r,"clustering","leaf")),dh.initSync();let n=On.getConfigFromFile(Jt.CLUSTERING_TLS_CERT_AUTH),s=On.getConfigFromFile(Jt.CLUSTERING_TLS_PRIVATEKEY),i=On.getConfigFromFile(Jt.CLUSTERING_TLS_CERTIFICATE);!await hl.exists(i)&&!await hl.exists(!n)&&await Hae.createNatsCerts();let o=_l.join(r,sd,uh.PID_FILES.HUB),c=_l.join(r,sd,uh.PID_FILES.LEAF),l=On.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=_l.join(r,sd,uh.NATS_CONFIG_FILES.HUB_SERVER),f=_l.join(r,sd,uh.NATS_CONFIG_FILES.LEAF_SERVER),d=On.getConfigFromFile(Jt.CLUSTERING_TLS_INSECURE),_=On.getConfigFromFile(Jt.CLUSTERING_TLS_VERIFY),h=On.getConfigFromFile(Jt.CLUSTERING_NODENAME),m=On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await MN.checkNATSServerInstalled()||xg("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await LN.listUsers(),g=On.getConfigFromFile(Jt.CLUSTERING_USER),R=await LN.getClusterUser();(id.isEmpty(R)||R.active!==!0)&&xg(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await vg(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await vg(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await vg(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),await vg(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[se,z]of S.entries())z.role?.role===Ug.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(E.push(new Bae(z.username,qG.decrypt(z.hash))),T.push(new xae(z.username,qG.decrypt(z.hash))));let N=[],{hub_routes:v}=On.getClusteringRoutes();if(!id.isEmptyOrZeroLength(v))for(let se of v)N.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${se.host}:${se.port}`);let H=new vae(On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),h,o,i,s,n,d,_,m,On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NAME),On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete H.tls.ca_file,delete H.leafnodes.tls.ca_file),t=id.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===Ug.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await hl.writeJson(u,H),od.trace(`Hub server config written to ${u}`));let X=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,W=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,$=new Uae(On.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[X],[W],E,T,i,s,n,d);n==null&&delete $.tls.ca_file,(t===void 0||t===Ug.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await hl.writeJson(f,$),od.trace(`Leaf server config written to ${f}`))}a(Gae,"generateNatsConfig");async function vg(e){let t=dh.get(e);return id.isEmpty(t)&&xg(`port undefined for '${e}'`),await id.isPortTaken(t)&&xg(`'${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(vg,"isPortAvailable");function xg(e){let t=`Error generating clustering config: ${e}`;od.error(t),console.error(t),process.exit(1)}a(xg,"generateNatsConfigError");async function qae(e){let{port:t,config_file:r}=MN.getServerConfig(e),{username:n,decrypt_hash:s}=await LN.getClusterUser(),i=0,o=2e3;for(;i<$G;){try{let f=await MN.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){od.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=$G)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=o*(i*2);u>3e4&&od.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await id.async_set_timeout(u)}let c="0".repeat(kae),l=_l.join(dh.get(Jt.ROOTPATH),sd,r);await hl.writeFile(l,c),await hl.remove(l),od.notify(e,"started.")}a(qae,"removeNatsConfig")});var jG=C((RPe,QG)=>{"use strict";var es=le(),$ae=nd(),Ve=(k(),P(q)),fh=Pt(),wo=require("path"),{PACKAGE_ROOT:kg}=Et(),KG=le(),Hg=ie(),ad="/dev/null",Vae=wo.join(kg,"launchServiceScripts"),YG=wo.join(kg,"utility/scripts"),Kae=wo.join(YG,Ve.HDB_RESTART_SCRIPT),WG=wo.resolve(kg,"dependencies",`${process.platform}-${process.arch}`,fh.NATS_BINARY_NAME);function zG(){let t=$ae.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 Hg.noBootFile()&&(n[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Hg.getEnvCliRootPath()),{name:Ve.PROCESS_DESCRIPTORS.HDB,script:Ve.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:kg}}a(zG,"generateMainServerConfig");var Yae=9930;function Wae(){es.initSync(!0);let e=es.get(Ve.CONFIG_PARAMS.ROOTPATH),t=wo.join(e,"clustering",fh.NATS_CONFIG_FILES.HUB_SERVER),r=wo.join(es.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=KG.get(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=fh.LOG_LEVEL_FLAGS[es.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Yae?"-"+n:""),script:WG,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=ad,i.error_file=ad),i}a(Wae,"generateNatsHubServerConfig");var zae=9940;function Qae(){es.initSync(!0);let e=es.get(Ve.CONFIG_PARAMS.ROOTPATH),t=wo.join(e,"clustering",fh.NATS_CONFIG_FILES.LEAF_SERVER),r=wo.join(es.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=KG.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=fh.LOG_LEVEL_FLAGS[es.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==zae?"-"+n:""),script:WG,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=ad,i.error_file=ad),i}a(Qae,"generateNatsLeafServerConfig");function jae(){es.initSync();let e=wo.join(es.get(Ve.CONFIG_PARAMS.LOGGING_ROOT),Ve.LOG_NAMES.HDB),t={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ve.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:Vae,autorestart:!1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=ad,t.error_file=ad),t}a(jae,"generateClusteringUpgradeV4ServiceConfig");function Jae(){let e={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.RESTART_HDB};return Hg.noBootFile()&&(e[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Hg.getEnvCliRootPath()),{...{name:Ve.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:YG},script:Kae}}a(Jae,"generateRestart");function Xae(){return{apps:[zG()]}}a(Xae,"generateAllServiceConfigs");QG.exports={generateAllServiceConfigs:Xae,generateMainServerConfig:zG,generateRestart:Jae,generateNatsHubServerConfig:Wae,generateNatsLeafServerConfig:Qae,generateClusteringUpgradeV4ServiceConfig:jae}});var hh=C((OPe,uq)=>{"use strict";var tt=(k(),P(q)),Zae=ie(),Co=Bg(),Fg=gr(),Io=Pt(),va=jG(),Gg=le(),ml=ee(),ece=bo(),{startWorker:JG,onMessageFromWorkers:tce}=it(),rce=Ju(),bPe=require("util"),nce=require("child_process"),sce=require("fs"),{execFile:ice}=nce,ze;uq.exports={enterPM2Mode:oce,start:Ua,stop:vN,reload:ZG,restart:eq,list:UN,describe:nq,connect:Po,kill:dce,startAllServices:fce,startService:xN,getUniqueServicesList:sq,restartAllServices:_ce,isServiceRegistered:iq,reloadStopStart:oq,restartHdb:rq,deleteProcess:lce,startClusteringProcesses:cq,startClusteringThreads:lq,isHdbRestartRunning:uce,isClusteringRunning:mce,stopClustering:hce,reloadClustering:pce,expectedRestartOfChildren:tq};var _h=!1;tce(e=>{e.type==="restart"&&Gg.initSync(!0)});function oce(){_h=!0}a(oce,"enterPM2Mode");function Po(){return ze||(ze=require("pm2")),new Promise((e,t)=>{ze.connect((r,n)=>{r&&t(r),e(n)})})}a(Po,"connect");var Xr,ace=10,XG;function Ua(e,t=!1){if(_h)return cce(e);let r=ice(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=Xr.indexOf(r);o>-1&&Xr.splice(o,1),!XG&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<ace&&(sce.existsSync(Co.getHubConfigPath())?Ua(e):(await Co.generateNatsConfig(!0),Ua(e),await new Promise(c=>setTimeout(c,3e3)),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=Gg.get(tt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&Io.LOG_LEVEL_HIERARCHY[o]>=Io.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===Io.LOG_LEVELS.ERR||f===Io.LOG_LEVELS.WRN?ml.OUTPUTS.STDERR:ml.OUTPUTS.STDOUT;ml.logCustomLevel(f||"info",h,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=Io.LOG_LEVELS[_]}if(Io.LOG_LEVEL_HIERARCHY[o]>=Io.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===Io.LOG_LEVELS.ERR||f===Io.LOG_LEVELS.WRN?ml.OUTPUTS.STDERR:ml.OUTPUTS.STDOUT;ml.logCustomLevel(f||"info",d,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!Xr&&(Xr=[],!t)){let i=a(()=>{XG=!0,Xr&&(Xr.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)}Xr.push(r)}a(Ua,"start");function cce(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.start(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(cce,"startWithPM2");function vN(e){if(!_h){for(let t of Xr||[])t.name===e&&(Xr.splice(Xr.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.stop(e,async(n,s)=>{n&&(ze.disconnect(),r(n)),ze.delete(e,(i,o)=>{i&&(ze.disconnect(),r(n)),ze.disconnect(),t(o)})})})}a(vN,"stop");function ZG(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.reload(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(ZG,"reload");function eq(e){if(!_h){tq();for(let t of Xr||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.restart(e,(n,s)=>{ze.disconnect(),t(s)})})}a(eq,"restart");function tq(){for(let e of Xr||[])e.config&&(e.config.restarts=0)}a(tq,"expectedRestartOfChildren");function lce(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.delete(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(lce,"deleteProcess");async function rq(){await Ua(va.generateRestart())}a(rq,"restartHdb");async function uce(){let e=await UN();for(let t in e)if(e[t].name===tt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(uce,"isHdbRestartRunning");function UN(){return new Promise(async(e,t)=>{try{await Po()}catch(r){t(r)}ze.list((r,n)=>{r&&(ze.disconnect(),t(r)),ze.disconnect(),e(n)})})}a(UN,"list");function nq(e){return new Promise(async(t,r)=>{try{await Po()}catch(n){r(n)}ze.describe(e,(n,s)=>{n&&(ze.disconnect(),r(n)),ze.disconnect(),t(s)})})}a(nq,"describe");function dce(){if(!_h){for(let e of Xr||[])e.kill();Xr=[];return}return new Promise(async(e,t)=>{try{await Po()}catch(r){t(r)}ze.killDaemon((r,n)=>{r&&(ze.disconnect(),t(r)),ze.disconnect(),e(n)})})}a(dce,"kill");async function fce(){try{await cq(),await lq(),await Ua(va.generateAllServiceConfigs())}catch(e){throw ze?.disconnect(),e}}a(fce,"startAllServices");async function xN(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case tt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=va.generateMainServerConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=va.generateNatsIngestServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=va.generateNatsReplyServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=va.generateNatsHubServerConfig(),await Ua(r,t),await Co.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=va.generateNatsLeafServerConfig(),await Ua(r,t),await Co.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=va.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await Ua(r)}catch(r){throw ze?.disconnect(),r}}a(xN,"startService");async function sq(){try{let e=await UN(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw ze?.disconnect(),e}}a(sq,"getUniqueServicesList");async function _ce(e=[]){try{let t=!1,r=await sq();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 eq(o))}t&&await oq(tt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw ze?.disconnect(),t}}a(_ce,"restartAllServices");async function iq(e){if(Xr?.find(r=>r.name===e))return!0;let t=await rce.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(iq,"isServiceRegistered");async function oq(e){let t=Gg.get(tt.CONFIG_PARAMS.THREADS_COUNT)??Gg.get(tt.CONFIG_PARAMS.THREADS),r=await nq(e),n=Zae.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await vN(e),await xN(e)):e===tt.PROCESS_DESCRIPTORS.HDB?await rq():await ZG(e)}a(oq,"reloadStopStart");var aq;async function cq(e=!1){for(let t in tt.CLUSTERING_PROCESSES){let r=tt.CLUSTERING_PROCESSES[t];await xN(r,e)}}a(cq,"startClusteringProcesses");async function lq(){aq=JG(tt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await Fg.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await Fg.updateLocalStreams();let e=await ece.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===tt.PRE_4_0_0_VERSION){ml.info("Starting clustering upgrade 4.0.0 process"),JG(tt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(lq,"startClusteringThreads");async function hce(){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 aq.terminate();else{let t=tt.CLUSTERING_PROCESSES[e];await vN(t)}}a(hce,"stopClustering");async function mce(){for(let e in tt.CLUSTERING_PROCESSES){let t=tt.CLUSTERING_PROCESSES[e];if(await iq(t)===!1)return!1}return!0}a(mce,"isClusteringRunning");async function pce(){await Co.generateNatsConfig(!0),await Fg.reloadNATSHub(),await Fg.reloadNATSLeaf(),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Co.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(pce,"reloadClustering")});var kN={};Ue(kN,{compactOnStart:()=>Ece,copyDb:()=>pq});async function Ece(){xa.notify("Running compact on start"),console.log("Running compact on start");let e=(0,BN.get)(x.ROOTPATH),t=new Map,r=Xe();(0,HN.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,qg.join)(e,"backup",n+".mdb"),o=(0,qg.join)(e,fc,n+"-copy.mdb"),c=0;try{c=await dq(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){xa.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{db_path:s,copy_dest:o,backup_dest:i,record_count:c}),await pq(n,o),console.log("Backing up",n,"to",i),await(0,pl.move)(s,i,{overwrite:!0}),console.log("Moving copy compacted",n,"to",s),await(0,pl.move)(o,s,{overwrite:!0}),await(0,pl.remove)((0,qg.join)(e,fc,`${n}-copy.mdb-lock`))}try{ld()}catch(n){xa.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}try{ld()}catch(n){xa.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){xa.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,HN.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);for(let[s,{db_path:i,backup_dest:o}]of t){console.error("Moving backup database",o,"back to",i);try{await(0,pl.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw ld(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=await dq(n);if(console.log("Database",n,"after compact has a total record count of",o),i!==o){let c=`There is a discrepancy between pre and post compact record count for database ${n}.
23
+ Total record count before compaction: ${i}, total after: ${o}.
24
+ Database backup has not been removed and can be found here: ${s}`;xa.error(c),console.error(c)}(0,BN.get)(x.STORAGE_COMPACTONSTARTKEEPBACKUP)!==!0&&(console.log("Removing backup",s),await(0,pl.remove)(s))}}async function dq(e){let t=await(0,mq.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}function cd(){}async function pq(e,t){console.log(`Copying database ${e} to ${t}`);let r=Xe()[e];if(!r)throw new Error(`Source database not found: ${e}`);let n;for(let d in r){let _=r[d];_.primaryStore.put=cd,_.primaryStore.remove=cd;for(let h in _.indices){let m=_.indices[h];m.put=cd,m.remove=cd}_.auditStore&&(_.auditStore.put=cd,_.auditStore.remove=cd),n=_.primaryStore.rootStore}if(!n)throw new Error(`Source database does not have any tables: ${e}`);let s=n.dbisDb,i=n.auditStore,o=(0,fq.open)(new _q.default(t)),c=o.openDB($g.INTERNAL_DBIS_NAME),l,u=0,f=s.useReadTransaction();try{for(let{key:_,value:h}of s.getRange({transaction:f})){let m=h.is_hash_attribute||h.isPrimaryKey,S,g;if(m&&(S=h.compression,g=Vg(),g?h.compression=g:delete h.compression,S?.dictionary?.toString()===g?.dictionary?.toString()&&(S=null,g=null)),c.put(_,h),!(m||h.indexed))continue;let R=new hq.default(!m,m);R.encoding="binary",R.compression=S;let E=n.openDB(_,R);E.decoder=null,E.decoderCopies=!1,E.encoding="binary",R.compression=g;let T=o.openDB(_,R);T.encoder=null,console.log("copying",_,"from",e,"to",t),await d(E,T,m,f)}if(i){let _=n.openDB($g.AUDIT_STORE_NAME,mh);console.log("copying audit log for",e,"to",t),d(i,_,!1,f)}async function d(_,h,m,S){let g=0,R=0,E=0,T=1e7,N=null;for(;T-- >0;)try{for(let v of _.getKeys({start:N,transaction:S}))try{N=v;let{value:H,version:X}=_.getEntry(v,{transaction:S});if(H?.length<14&&m){E++;continue}l=h.put(v,H,m?X:void 0),g++,S.openTimer&&(S.openTimer=0),R+=(v?.length||10)+H.length,u++>5e3&&(await l,console.log("copied",g,"entries, skipped",E,"delete records,",R,"bytes"),u=0)}catch(H){console.error("Error copying record",typeof v=="symbol"?"symbol":v,"from",e,"to",t,H)}console.log("finish copying, copied",g,"entries, skipped",E,"delete records,",R,"bytes");return}catch{if(typeof N=="string"){if(N==="z")return console.error("Reached end of dbi",N,"for",e,"to",t);N=N.slice(0,-2)+"z"}else if(typeof N=="number")N++;else return console.error("Unknown key type",N,"for",e,"to",t)}}a(d,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{f.done(),o.close()}}var fq,qg,pl,BN,_q,hq,$g,mq,HN,xa,FN=Re(()=>{xe();fq=require("lmdb"),qg=require("path"),pl=require("fs-extra"),BN=M(le()),_q=M(qf()),hq=M(Gf()),$g=M(Gt());k();Ti();mq=M(_o()),HN=M(Lt()),xa=M(ee());a(Ece,"compactOnStart");a(dq,"getTotalDBRecordCount");a(cd,"noop");a(pq,"copyDb")});var dd=C((vPe,yq)=>{"use strict";var gce=require("minimist"),{isMainThread:qN,parentPort:Eh,threadId:DPe}=require("worker_threads"),at=(k(),P(q)),Bi=ee(),$N=ie(),Yg=Bg(),Kg=gr(),LPe=Pt(),Tq=Lt(),ti=hh(),Eq=Ju(),{compactOnStart:Sce}=(FN(),P(kN)),Tce=_c(),{restartWorkers:Wg,onMessageByType:Ace}=it(),{handleHDBError:Rce,hdb_errors:yce}=he(),{HTTP_STATUS_CODES:bce}=yce,gh=le(),{sendOperationToNode:gq,getThisNodeName:Oce,monitorNodeCAs:Nce}=(ps(),P(Oa)),{getHDBNodeTable:MPe}=(Xc(),P(Zb));gh.initSync();var ph=`Restarting HarperDB. This may take up to ${at.RESTART_TIMEOUT_MS/1e3} seconds.`,wce="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",Sq="Clustering is not enabled so cannot be restarted",Ice="Invalid service",ud,As;yq.exports={restart:Aq,restartService:VN};qN&&Ace(at.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await VN({service:e.workerType}):Aq({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function Aq(e){As=Object.keys(e).length===0,ud=await ti.isServiceRegistered(at.PROCESS_DESCRIPTORS.HDB);let t=gce(process.argv);if(t.service){await VN(t);return}if(As&&!ud){console.error(wce);return}if(As&&console.log(ph),ud){ti.enterPM2Mode(),Bi.notify(ph);let r=Tce(Object.keys(at.CONFIG_PARAM_MAP),!0);return $N.isEmptyOrZeroLength(Object.keys(r))||Tq.updateConfigValue(void 0,void 0,r,!0,!0),Cce(),ph}return qN?(Bi.notify(ph),gh.get(at.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await Sce(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{Wg()},50)):Eh.postMessage({type:at.ITC_EVENT_TYPES.RESTART}),ph}a(Aq,"restart");async function VN(e){let{service:t}=e;if(at.HDB_PROCESS_SERVICES[t]===void 0)throw Rce(new Error,Ice,bce.BAD_REQUEST,void 0,void 0,!0);if(ti.expectedRestartOfChildren(),ud=await ti.isServiceRegistered(at.PROCESS_DESCRIPTORS.HDB),!qN){e.replicated&&Nce(),Eh.postMessage({type:at.ITC_EVENT_TYPES.RESTART,workerType:t}),Eh.ref(),await new Promise(s=>{Eh.on("message",i=>{i.type==="restart-complete"&&(s(),Eh.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===Oce())continue;let i;try{({job_id:i}=await gq(s,e))}catch(o){n.push({node:s.name,message:o.message});continue}n.push(await new Promise((o,c)=>{let u=2400,f=setInterval(async()=>{if(u--<=0){clearInterval(f);let h=new Error("Timed out waiting for restart job to complete");h.replicated=n,c(h)}let _=(await gq(s,{operation:"get_job",id:i})).results[0];if(_.status==="COMPLETE"&&(clearInterval(f),o({node:s.name,message:_.message})),_.status==="ERROR"){clearInterval(f);let h=new Error(_.message);h.replicated=n,c(h)}},250)}))}return{replicated:n}}return}let r;switch(t){case at.HDB_PROCESS_SERVICES.clustering:if(!gh.get(at.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Sq;break}As&&console.log("Restarting clustering"),Bi.notify("Restarting clustering"),await Rq();break;case at.HDB_PROCESS_SERVICES.clustering_config:case at.HDB_PROCESS_SERVICES["clustering config"]:if(!gh.get(at.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Sq;break}As&&console.log("Restarting clustering_config"),Bi.notify("Restarting clustering_config"),await ti.reloadClustering();break;case"custom_functions":case"custom functions":case at.HDB_PROCESS_SERVICES.harperdb:case at.HDB_PROCESS_SERVICES.http_workers:case at.HDB_PROCESS_SERVICES.http:if(As&&!ud){r=`Restart ${t} is not available from the CLI when running in non-pm2 mode. Either call restart ${t} from the API or stop and start HarperDB.`;break}As&&console.log("Restarting http_workers"),Bi.notify("Restarting http_workers"),As?await ti.restart(at.PROCESS_DESCRIPTORS.HDB):await Wg("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Bi.error(r),As&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(VN,"restartService");async function Cce(){await Rq(),await ti.restart(at.PROCESS_DESCRIPTORS.HDB),await $N.async_set_timeout(2e3),gh.get(at.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await GN(),As&&(await Kg.closeConnection(),process.exit(0))}a(Cce,"restartPM2Mode");async function Rq(){if(!Tq.getConfigFromFile(at.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await Eq.getHDBProcessInfo()).clustering.length===0)Bi.trace("Clustering not running, restart will start clustering services"),await Yg.generateNatsConfig(!0),await ti.startClusteringProcesses(),await ti.startClusteringThreads(),await GN(),As&&await Kg.closeConnection();else{await Yg.generateNatsConfig(!0),ud?(Bi.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await ti.restart(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await ti.restart(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await Eq.getHDBProcessInfo()).clustering.forEach(s=>{Bi.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await $N.async_set_timeout(3e3),await GN(),await Kg.updateLocalStreams(),As&&await Kg.closeConnection(),Bi.trace("Restart clustering restarting ingest and reply service threads");let t=Wg(at.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=Wg(at.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(Rq,"restartClustering");async function GN(){await Yg.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Yg.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(GN,"removeNatsConfig")});var vq=C((BPe,Mq)=>{"use strict";var xPe=require("lodash"),Nn=(k(),P(q)),{handleHDBError:bq,hdb_errors:Pce}=he(),{HDB_ERROR_MSGS:Dce,HTTP_STATUS_CODES:Lce}=Pce,KN=ee();Mq.exports={getRolePermissions:vce};var El=Object.create(null),Mce=a(e=>({key:e,perms:{}}),"perms_template_obj"),Iq=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),Cq=a((e=!1,t=!1,r=!1,n=!1)=>({[Nn.PERMS_CRUD_ENUM.READ]:e,[Nn.PERMS_CRUD_ENUM.INSERT]:t,[Nn.PERMS_CRUD_ENUM.UPDATE]:r,[Nn.PERMS_CRUD_ENUM.DELETE]:n}),"permissions_template"),YN=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...Cq(t,r,n,s)}),"table_perms_template"),Oq=a((e,t=Cq())=>({attribute_name:e,describe:Lq(t),[Sh]:t[Sh],[WN]:t[WN],[zN]:t[zN]}),"attr_perms_template"),Nq=a((e,t=!1)=>({attribute_name:e,describe:t,[Sh]:t}),"timestamp_attr_perms_template"),{READ:Sh,INSERT:WN,UPDATE:zN}=Nn.PERMS_CRUD_ENUM,Pq=Object.values(Nn.PERMS_CRUD_ENUM),Dq=[Sh,WN,zN];function vce(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[Nn.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(El[t]&&El[t].key===n)return El[t].perms;let s=Uce(e,r);return El[t]?El[t].key=n:El[t]=Mce(n),El[t].perms=s,s}catch(r){if(!e[Nn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[Nn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<Nn.PERMS_UPDATE_RELEASE_TIMESTAMP){let n=`Role permissions for role '${t}' must be updated to align with new structure from the 2.2.0 release.`;throw KN.error(n),KN.debug(r),bq(new Error,Dce.OUTDATED_PERMS_TRANSLATION_ERROR,Lce.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
25
25
  ${r.stack}`;throw KN.error(n),bq(new Error)}}}a(vce,"getRolePermissions");function Uce(e,t){let r=Object.create(null);r.super_user=!1;let n=e.permission;r[Nn.SYSTEM_SCHEMA_NAME]=n[Nn.SYSTEM_SCHEMA_NAME],r.structure_user=n.structure_user;let s=Array.isArray(e.permission.structure_user)||e.permission.structure_user===!0?e.permission.structure_user:[];return Object.keys(t).forEach(i=>{if(s===!0||s.indexOf(i)>-1){r[i]=xce(t[i]);return}r[i]=Iq(),n[i]?(n[i].describe&&(r[i].describe=!0),Object.keys(t[i]).forEach(o=>{if(n[i].tables[o]){let c=n[i].tables[o],l=t[i][o],u=Bce(c,l);r[i].describe||Pq.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=YN()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=YN()})}),r}a(Uce,"translateRolePermissions");function xce(e){let t=Iq(!0);return Object.keys(e).forEach(r=>{t.tables[r]=YN(!0,!0,!0,!0,!0)}),t}a(xce,"createStructureUserPermissions");function Bce(e,t){let{attribute_permissions:r}=e;if(r?.length>0){let s={...e};s.attribute_permissions=[];let i=r.reduce((u,f)=>{let{attribute_name:d}=f,_=f;return Nn.TIME_STAMP_NAMES.includes(d)&&(_=Nq(d,f[Sh])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=Oq(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=Lq(f),s.attribute_permissions.push(f),c||Hce(f,l)}else if(u!==o){let f;Nn.TIME_STAMP_NAMES.includes(u)?f=Nq(u):f=Oq(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=wq(s),s}else return e.describe=wq(e),e}a(Bce,"getTableAttrPerms");function wq(e){return Pq.filter(t=>e[t]).length>0}a(wq,"getSchemaTableDescribePerm");function Lq(e){return Dq.filter(t=>e[t]).length>0}a(Lq,"getAttributeDescribePerm");function Hce(e,t){Dq.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(Hce,"checkForHashPerms")});var Th={};Ue(Th,{authentication:()=>Gq,bypassAuth:()=>Yce,login:()=>zce,logout:()=>Qce,start:()=>Wce});function Yce(){Fq=!0}async function Gq(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let h=e.isOperationsServer?qce?Gce:[]:Fce?kce:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let m=Zr.get(x.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",S=new go([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",m],["Access-Control-Allow-Origin",i]]);return zg&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),zg&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(zg){i||(i=r.host);let h=(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session=",m=s?.split(/;\s+/)||[];for(let S of m)if(S.startsWith(h)){let g=S.indexOf(";");l=S.slice(h.length,g===-1?S.length:g),u=await Uq.get(l);break}e.session=u||(u={})}let f=a((h,m,S)=>{let g=new fd.AuthAuditLog(h,m,Jo.AUTHENTICATION,r["x-forwarded-for"]??e.ip,e.method,e.pathname);g.auth_strategy=S,l&&(g.session_id=l),r.referer&&(g.referer=r.referer),r.origin&&(g.origin=r.origin),m===xs.SUCCESS?QN.notify(g):QN.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&QN.error("Authorization error:",e._nodeRequest.socket.authorizationError),e.mtlsConfig&&e.authorized&&e.peerCertificate.subject){let h=e.mtlsConfig.user;h!==null?((h===void 0||h==="Common Name"||h==="CN")&&(h=e.peerCertificate.subject.CN),e.user=await Ye.getUser(h,null,e),f(h,xs.SUCCESS,"mTLS")):(0,fd.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let d;if(!e.user)if(n){if(d=gl.get(n),!d){let h=n.indexOf(" "),m=n.slice(0,h),S=n.slice(h+1),g,R;try{switch(m){case"Basic":let E=atob(S),T=E.indexOf(":");g=E.slice(0,T),R=E.slice(T+1),d=g||R?await Ye.getUser(g,R,e):null;break;case"Bearer":try{d=await Kb(S)}catch(N){if(N.message==="invalid token")try{return await xE(S),c({status:-1})}catch{throw N}}break}}catch(E){return Vce&&(gl.get(S)||(gl.set(S,S),f(g,xs.FAILURE,m))),c({status:401,body:aa({error:E.message},e)})}gl.set(n,d),$ce&&f(d.username,xs.SUCCESS,m)}e.user=d}else u?.user?e.user=await Ye.getUser(u.user,null,e):(Fq&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,Bq.getSuperUser)());zg&&(e.session.update=function(h){let m=Zr.get(x.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,Hq.v4)();let S=Zr.get(x.AUTHENTICATION_COOKIE_DOMAINS),g=m?new Date(Date.now()+(0,jN.convertToMS)(m)).toUTCString():Kce,R=S?.find(N=>r.host?.endsWith(N)),T=`${(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session="}${l}; Path=/; Expires=${g}; ${R?"Domain="+R+"; ":""}HttpOnly${e.protocol==="https"?"; SameSite=None; Secure":""}`;o?o.push("Set-Cookie",T):_?.headers?.set&&_.headers.set("Set-Cookie",T)}return e.protocol==="https"&&(o?(i&&o.push("Access-Control-Expose-Headers","X-Hdb-Session"),o.push("X-Hdb-Session","Secure")):_?.headers?.set&&(i&&_.headers.set("Access-Control-Expose-Headers","X-Hdb-Session"),_.headers.set("X-Hdb-Session","Secure"))),h.id=l,Uq.put(h,{expiresAt:m?Date.now()+(0,jN.convertToMS)(m):void 0})},e.login=async function(h,m){let S=e.user=await Ye.authenticateUser(h,m,e);e.session.update({user:S&&(S.getId?.()??S.username)})});let _=await t(e);return _&&(_.status===401&&(r["user-agent"]?.startsWith("Mozilla")&&r.accept?.startsWith("text/html")&&fs.loginPath?(_.status=302,_.headers.set("Location",fs.loginPath(e))):_.headers.set("WWW-Authenticate","Basic")),c(_))}catch(l){throw c(l)}function c(l){let u=o.length;if(u>0){let f=l.headers;f||(l.headers=f=new go);for(let d=0;d<u;){let _=o[d++];f.set(_,o[d++])}}return o=null,l}a(c,"applyResponseHeaders")}function Wce({server:e,port:t,securePort:r}){e.http(Gq,t||r?{port:t,securePort:r}:{port:"all"}),xq||(xq=!0,setInterval(()=>{gl=new Map},Zr.get(x.AUTHENTICATION_CACHETTL)).unref(),kq.user.addListener(()=>{gl=new Map}))}async function zce(e){if(!e.baseRequest?.login)throw new Error("No session for login");return e.baseResponse.headers.set=(t,r)=>{e.fastifyResponse.header(t,r)},await e.baseRequest.login(e.username,e.password??""),"Login successful"}async function Qce(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var Bq,Hq,Zr,fd,kq,jN,QN,kce,Fce,Gce,qce,Uq,zg,Fq,$ce,Vce,Kce,gl,xq,Qg=Re(()=>{Bq=M(Kn());Mr();tu();Mu();xe();Hq=require("uuid"),Zr=M(le());k();fd=M(ee()),kq=M(a_());D_();jN=M(ie());no();QN=(0,fd.loggerWithTag)("auth-event");Zr.initSync();kce=Zr.get(x.HTTP_CORSACCESSLIST),Fce=Zr.get(x.HTTP_CORS),Gce=Zr.get(x.OPERATIONSAPI_NETWORK_CORSACCESSLIST),qce=Zr.get(x.OPERATIONSAPI_NETWORK_CORS),Uq=ft({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),zg=Zr.get(x.AUTHENTICATION_ENABLESESSIONS)??!0,Fq=process.env.AUTHENTICATION_AUTHORIZELOCAL??Zr.get(x.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,$ce=Zr.get(x.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,Vce=Zr.get(x.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,Kce="Tue, 01 Oct 8307 19:33:20 GMT",gl=new Map;Ye.onInvalidatedUser(()=>{gl=new Map});a(Yce,"bypassAuth");a(Gq,"authentication");a(Wce,"start");a(zce,"login");a(Qce,"logout")});var zq=C((WPe,Wq)=>{"use strict";var Ne=require("joi"),qq=require("fs-extra"),$q=require("path"),ts=ot(),Vq=le(),Kq=(k(),P(q)),Yq=ee(),{hdb_errors:jce}=he(),{HDB_ERROR_MSGS:en}=jce,Do=/^[a-zA-Z0-9-_]+$/,Jce=/^[a-zA-Z0-9-_]+$/;Wq.exports={getDropCustomFunctionValidator:Zce,setCustomFunctionValidator:ele,addComponentValidator:sle,dropCustomFunctionProjectValidator:ile,packageComponentValidator:ole,deployComponentValidator:ale,setComponentFileValidator:tle,getComponentFileValidator:nle,dropComponentFileValidator:rle,addSSHKeyValidator:cle,updateSSHKeyValidator:lle,deleteSSHKeyValidator:ule,setSSHKnownHostsValidator:dle};function jg(e,t,r){try{let n=Vq.get(Kq.CONFIG_PARAMS.COMPONENTSROOT),s=$q.join(n,t);return qq.existsSync(s)?e?t:r.message(en.PROJECT_EXISTS):e?r.message(en.NO_PROJECT):t}catch(n){return Yq.error(n),r.message(en.VALIDATION_ERR)}}a(jg,"checkProjectExists");function Ah(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(Ah,"checkFilePath");function Xce(e,t,r,n){try{let s=Vq.get(Kq.CONFIG_PARAMS.COMPONENTSROOT),i=$q.join(s,e,t,r+".js");return qq.existsSync(i)?r:n.message(en.NO_FILE)}catch(s){return Yq.error(s),n.message(en.VALIDATION_ERR)}}a(Xce,"checkFileExists");function Zce(e){let t=Ne.object({project:Ne.string().pattern(Do).custom(jg.bind(null,!0)).required().messages({"string.pattern.base":en.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(Do).custom(Xce.bind(null,e.project,e.type)).custom(Ah).required().messages({"string.pattern.base":en.BAD_FILE_NAME})});return ts.validateBySchema(e,t)}a(Zce,"getDropCustomFunctionValidator");function ele(e){let t=Ne.object({project:Ne.string().pattern(Do).custom(jg.bind(null,!0)).required().messages({"string.pattern.base":en.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(Ah).required(),function_content:Ne.string().required()});return ts.validateBySchema(e,t)}a(ele,"setCustomFunctionValidator");function tle(e){let t=Ne.object({project:Ne.string().pattern(Do).required().messages({"string.pattern.base":en.BAD_PROJECT_NAME}),file:Ne.string().custom(Ah).required(),payload:Ne.string().allow("").optional(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return ts.validateBySchema(e,t)}a(tle,"setComponentFileValidator");function rle(e){let t=Ne.object({project:Ne.string().pattern(Do).required().messages({"string.pattern.base":en.BAD_PROJECT_NAME}),file:Ne.string().custom(Ah).optional()});return ts.validateBySchema(e,t)}a(rle,"dropComponentFileValidator");function nle(e){let t=Ne.object({project:Ne.string().required(),file:Ne.string().custom(Ah).required(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return ts.validateBySchema(e,t)}a(nle,"getComponentFileValidator");function sle(e){let t=Ne.object({project:Ne.string().pattern(Do).custom(jg.bind(null,!1)).required().messages({"string.pattern.base":en.BAD_PROJECT_NAME})});return ts.validateBySchema(e,t)}a(sle,"addComponentValidator");function ile(e){let t=Ne.object({project:Ne.string().pattern(Do).custom(jg.bind(null,!0)).required().messages({"string.pattern.base":en.BAD_PROJECT_NAME})});return ts.validateBySchema(e,t)}a(ile,"dropCustomFunctionProjectValidator");function ole(e){let t=Ne.object({project:Ne.string().pattern(Do).required().messages({"string.pattern.base":en.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return ts.validateBySchema(e,t)}a(ole,"packageComponentValidator");function ale(e){let t=Ne.object({project:Ne.string().pattern(Do).required().messages({"string.pattern.base":en.BAD_PROJECT_NAME}),package:Ne.string().optional(),restart:Ne.alternatives().try(Ne.boolean(),Ne.string().valid("rolling")).optional()});return ts.validateBySchema(e,t)}a(ale,"deployComponentValidator");function cle(e){let t=Ne.object({name:Ne.string().pattern(Jce).required().messages({"string.pattern.base":en.BAD_SSH_KEY_NAME}),key:Ne.string().required(),host:Ne.string().required(),hostname:Ne.string().required(),known_hosts:Ne.string().optional()});return ts.validateBySchema(e,t)}a(cle,"addSSHKeyValidator");function lle(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return ts.validateBySchema(e,t)}a(lle,"updateSSHKeyValidator");function ule(e){let t=Ne.object({name:Ne.string().required()});return ts.validateBySchema(e,t)}a(ule,"deleteSSHKeyValidator");function dle(e){let t=Ne.object({known_hosts:Ne.string().required()});return ts.validateBySchema(e,t)}a(dle,"setSSHKnownHostsValidator")});var bh=C((QPe,Zq)=>{"use strict";var Jg=require("joi"),Ba=require("path"),_d=require("fs-extra"),{exec:fle,spawn:_le}=require("child_process"),hle=require("util"),mle=hle.promisify(fle),hd=(k(),P(q)),{PACKAGE_ROOT:ple}=Et(),{handleHDBError:Rh,hdb_errors:Ele}=he(),{HTTP_STATUS_CODES:yh}=Ele,Sl=le(),gle=ot(),Ha=ee(),{once:Sle}=require("events");Sl.initSync();var JN=Sl.get(hd.CONFIG_PARAMS.COMPONENTSROOT),Qq="npm install --force --omit=dev --json",Tle=`${Qq} --dry-run`,Ale=Sl.get(hd.CONFIG_PARAMS.ROOTPATH),Xg=Ba.join(Ale,"ssh");Zq.exports={installModules:Ole,auditModules:Nle,installAllRootModules:Rle,uninstallRootModule:yle,linkHarperdb:ble,runCommand:md};async function Rle(e=!1,t=Sl.get(hd.CONFIG_PARAMS.ROOTPATH)){await Zg();let r=!1,n=process.env;_d.pathExistsSync(Xg)&&_d.readdirSync(Xg).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+Ba.join(Xg,"config")+" -o UserKnownHostsFile="+Ba.join(Xg,"known_hosts"),...process.env},r=!0)});try{let s=Sl.get(hd.CONFIG_PARAMS.ROOTPATH),i=Ba.join(s,"node_modules","harperdb");_d.lstatSync(i).isSymbolicLink()&&_d.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&Ha.error("Error removing symlink:",s)}await md(e?"npm install --force --ignore-scripts":"npm install --force",t,n)}a(Rle,"installAllRootModules");async function yle(e){await md(`npm uninstall ${e}`,Sl.get(hd.CONFIG_PARAMS.ROOTPATH))}a(yle,"uninstallRootModule");async function ble(){await Zg(),await md(`npm link ${ple}`,Sl.get(hd.CONFIG_PARAMS.ROOTPATH))}a(ble,"linkHarperdb");async function md(e,t=void 0,r=process.env){Ha.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=_le(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();Ha.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();Ha.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await Sle(n,"close");if(o!==0)throw new Error(`Command \`${e}\` exited with code ${o}.${i===""?"":` Error: ${i}`}`);return s||void 0}a(md,"runCommand");async function Ole(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";Ha.warn(t,e.projects);let r=Xq(e);if(r)throw Rh(r,r.message,yh.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?Tle:Qq;await Zg(),await Jq(n);let o={};for(let c=0,l=n.length;c<l;c++){let u=n[c];o[u]={npm_output:null,npm_error:null};let f=Ba.join(JN,u),d,_=null;try{let{stdout:h,stderr:m}=await mle(i,{cwd:f});d=h?h.replace(`
26
26
  `,""):null,_=m?m.replace(`
27
27
  `,""):null}catch(h){h.stderr?o[u].npm_error=jq(h.stderr):o[u].npm_error=h.message;continue}try{o[u].npm_output=JSON.parse(d)}catch{o[u].npm_output=d}try{o[u].npm_error=JSON.parse(_)}catch{o[u].npm_error=_}}return Ha.info(`finished installModules with response ${o}`),o.warning=t,o}a(Ole,"installModules");function jq(e){let t='"error": {',r=e.indexOf('"error": {'),n=e.indexOf(`}