harperdb 4.5.40 → 4.5.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/harperdb.js +1 -1
- package/bin/lite.js +1 -1
- package/launchServiceScripts/launchNatsIngestService.js +1 -1
- package/launchServiceScripts/launchNatsReplyService.js +1 -1
- package/launchServiceScripts/launchUpdateNodes4-0-0.js +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/server/jobs/jobProcess.js +1 -1
- package/server/threads/threadServer.js +1 -1
- package/studio/build-local/asset-manifest.json +2 -2
- package/studio/build-local/index.html +1 -1
- package/studio/build-local/static/js/{main.e3c003ec.js → main.e5420fc4.js} +2 -2
- package/utility/scripts/restartHdb.js +1 -1
- /package/studio/build-local/static/js/{main.e3c003ec.js.LICENSE.txt → main.e5420fc4.js.LICENSE.txt} +0 -0
package/bin/lite.js
CHANGED
|
@@ -19,7 +19,7 @@ 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 rr.error(i),new Error(`Error reading HarperDB config file at ${r}`)}q7(n,r),Sb(n);let s=n.toJSON();if(M7.config=s,Dt=bu(s),Dt.logging_rotation_rotate)for(let i in Rx)Dt[i]&&rr.error(`Config ${Rx[i]} has been deprecated. Please check https://docs.harperdb.io/docs/ for further details.`);rr.trace(U7)}}a(yE,"initConfig");function q7(e,t){let r=e.getIn(["rootPath"]),n=!1;if(e.hasIn(["storage","path"])||(e.setIn(["storage","path"],Yn.join(r,"database")),n=!0),e.hasIn(["logging","rotation","path"])||(e.setIn(["logging","rotation","path"],Yn.join(r,"log")),n=!0),e.hasIn(["authentication"])||(e.addIn(["authentication"],{cacheTTL:3e4,enableSessions:!0,operationTokenTimeout:e.getIn(["operationsApi","authentication","operationTokenTimeout"])??"1d",refreshTokenTimeout:e.getIn(["operationsApi","authentication","refreshTokenTimeout"])??"30d"}),n=!0),e.hasIn(["analytics"])||(e.addIn(["analytics"],{aggregatePeriod:60}),n=!0),n){if(rr.trace("Updating config file with missing config params"),e.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${e.errors}`);jr.writeFileSync(t,String(e))}}a(q7,"checkForUpdatedConfig");function Sb(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 yu.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 yu.CONFIG_VALIDATION("operationsApi.network.port and operationsApi.network.securePort cannot be the same value");let n=I7(r,t);if(n.error)throw yu.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(Sb,"validateConfig");function $7(e,t){Dt===void 0&&(Dt={});let r=Ws[e.toLowerCase()];if(r===void 0){rr.trace(`Unable to update config object because config param '${e}' does not exist`);return}Dt[r.toLowerCase()]=t}a($7,"updateConfigObject");function Cx(e,t,r=void 0,n=!1,s=!1,i=!1){Dt===void 0&&yE();let o=Ix(Ws.hdb_root),c=Yn.join(o,ps.HDB_CONFIG_FILE),l=pa(c),u;if(r&&Dt){let _=!1;for(let h in r)if(r[h]!=Dt[h.toLowerCase()]){_=!0;break}if(!_){rr.trace("No changes detected in config parameters, skipping update");return}}if(r===void 0&&e.toLowerCase()===Kn.DATABASES)u=t;else if(r===void 0){let _;if(i)_=e;else if(_=Ws[e.toLowerCase()],_===void 0)throw new Error(`Unable to update config, unrecognized config parameter: ${e}`);let h=_.split("_"),m=gb(_,t);l.setIn([...h],m)}else for(let _ in r){let h=Ws[_.toLowerCase()];if(h===Kn.HTTP_SECUREPORT&&r[_]===Dt[Kn.HTTP_PORT]?.toString()&&l.setIn(["http","port"],null),h===Kn.OPERATIONSAPI_NETWORK_SECUREPORT&&r[_]===Dt[Kn.OPERATIONSAPI_NETWORK_PORT.toLowerCase()]?.toString()&&l.setIn(["operationsApi","network","port"],null),h===Kn.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=ps.LEGACY_CONFIG_PARAMS[_.toUpperCase()];S&&S.startsWith("customFunctions")&&l.hasIn(S.split("_"))&&(h=S,m=S.split("_"));let g=gb(h,r[_]);h==="rootPath"&&g?.endsWith("/")&&(g=g.slice(0,-1));try{m.length>1&&typeof l.getIn(m.slice(0,-1))=="boolean"&&l.deleteIn(m.slice(0,-1)),l.setIn([...m],g)}catch(R){rr.error(R)}}}u&&wx(l,u),Sb(l);let f=l.getIn(["rootPath"]),d=Yn.join(f,ps.HDB_CONFIG_FILE);if(n===!0&&V7(c,f),l.errors?.length>0)throw new Error(`Error parsing harperdb-config.yaml ${l.errors}`);jr.writeFileSync(d,String(l)),s&&(Dt=bu(l.toJSON())),rr.trace(`Config parameter: ${e} updated with value: ${t}`)}a(Cx,"updateConfigValue");function V7(e,t){try{let r=Yn.join(t,"backup",`${new Date(Date.now()).toISOString().replaceAll(":","-")}-${ps.HDB_CONFIG_FILE}.bak`);jr.copySync(e,r),rr.trace(`Config file: ${e} backed up to: ${r}`)}catch(r){rr.error(x7),rr.error(r)}}a(V7,"backupConfigFile");var K7=["databases"];function bu(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}),RE=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])&&!K7.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;!Kn[l.toUpperCase()]&&Ws[l]&&(s[Ws[l].toLowerCase()]=o[c]),s[l]=o[c]}}n[i]!==void 0&&(s[i.toLowerCase()]=n[i])}return s}a(r,"squashObj")}a(bu,"flattenConfig");function gb(e,t){if(e===Kn.CLUSTERING_NODENAME||e===Kn.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(C7(t))return parseFloat(t);if(t===!0||t===!1||Array.isArray(t)||pr.isObject(t)||t===null)return t;if(typeof t=="string"&&t.toLowerCase()==="true")return!0;if(typeof t=="string"&&t.toLowerCase()==="false")return!1}if(t===void 0||t.toLowerCase()==="undefined")return null;if(typeof t=="string"&&(t.startsWith("{")&&t.endsWith("}")||t.startsWith("[")&&t.endsWith("]")))try{return JSON.parse(t)}catch{}return pr.autoCast(t)}a(gb,"castConfigValue");function Y7(){let e=pr.getPropsFilePath(),t=zc(e);return pa(t).toJSON()}a(Y7,"getConfiguration");async function W7(e){let{operation:t,hdb_user:r,hdb_auth_header:n,...s}=e;try{return Cx(void 0,void 0,s,!0),k7}catch(i){throw typeof i=="string"||i instanceof String?D7(i,i,L7.BAD_REQUEST,void 0,void 0,!0):i}}a(W7,"setConfiguration");function Tb(){let e=pr.getPropsFilePath();try{jr.accessSync(e,jr.constants.F_OK|jr.constants.R_OK)}catch(n){if(!pr.noBootFile())throw rr.error(n),new Error(`HarperDB properties file at path ${e} does not exist`)}let t=zc(e);return pa(t).toJSON()}a(Tb,"readConfigFile");function pa(e){return yx.parseDocument(jr.readFileSync(e,"utf8"),{simpleKeys:!0})}a(pa,"parseYamlDoc");function z7(){let e=Tb(),t=e?.clustering?.hubServer?.cluster?.network?.routes;t=pr.isEmptyOrZeroLength(t)?[]:t;let r=Ax(t);if(r)throw yu.CONFIG_VALIDATION(r.message);let n=e?.clustering?.leafServer?.network?.routes;n=pr.isEmptyOrZeroLength(n)?[]:n;let s=Ax(n);if(s)throw yu.CONFIG_VALIDATION(s.message);if(!pr.isEmptyOrZeroLength(n)&&!pr.isEmptyOrZeroLength(t)){let i=t.filter(o=>n.some(c=>c.host===o.host&&c.port===o.port));if(!pr.isEmptyOrZeroLength(i)){let o=`Duplicate hub and leaf routes found ${JSON.stringify(i)}`;throw yu.CONFIG_VALIDATION(o)}}return{hub_routes:t,leaf_routes:n}}a(z7,"getClusteringRoutes");function Px(e){let t=bx(e);Dt={};for(let r in Ws){let n=t.get(r.toUpperCase());if(pr.isEmpty(n)||typeof n=="string"&&n.trim().length===0)continue;let s=Ws[r].toLowerCase();s===Kn.LOGGING_ROOT?Dt[s]=Yn.dirname(n):Dt[s]=n}return Dt}a(Px,"initOldConfig");function Q7(e){let t=Tb();return P7.get(t,e.replaceAll("_","."))}a(Q7,"getConfigFromFile");async function j7(e,t){let r=pa(zc());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 jr.writeFile(zc(),String(r))}a(j7,"addConfig");function J7(e){let t=zc(pr.getPropsFilePath()),r=pa(t);r.deleteIn(e);let n=r.getIn(["rootPath"]),s=Yn.join(n,ps.HDB_CONFIG_FILE);jr.writeFileSync(s,String(r))}a(J7,"deleteConfigFromFile");function X7(){return RE||(yE(),RE)}a(X7,"getConfigObj");function Z7(){return Dt||yE(),Dt}a(Z7,"getFlatConfigObj")});var Wn=C((BNe,Or)=>{"use strict";var vx="username is required",Ux="nothing to update, must supply active, role or password to update",xx="password cannot be an empty string",Bx="If role is specified, it cannot be empty.",Hx="active must be true or false";Or.exports.addUser=cee;Or.exports.alterUser=lee;Or.exports.dropUser=dee;Or.exports.getSuperUser=pee;Or.exports.userInfo=fee;Or.exports.listUsers=OE;Or.exports.listUsersExternal=_ee;Or.exports.setUsersWithRolesCache=Qc;Or.exports.findAndValidateUser=Cb;Or.exports.getClusterUser=Eee;Or.exports.getUsersWithRolesCache=mee;Or.exports.USERNAME_REQUIRED=vx;Or.exports.ALTERUSER_NOTHING_TO_UPDATE=Ux;Or.exports.EMPTY_PASSWORD=xx;Or.exports.EMPTY_ROLE=Bx;Or.exports.ACTIVE_BOOLEAN=Hx;var kx=Rn(),eee=Yc(),A_=(SE(),P(gE)),Fx=dx(),R_=zr(),Ob=uo(),Ci=ie(),Gx=require("validate.js"),Nb=ee(),{promisify:tee}=require("util"),wb=mo(),Rb=(k(),P(q)),Lx=Pt(),ree=Lt(),nee=le(),see=ao(),{hdb_errors:iee,ClientError:zs}=he(),{HTTP_STATUS_CODES:Eo,AUTHENTICATION_ERROR_MSGS:Ab,HDB_ERROR_MSGS:Ou}=iee,{UserEventMsg:Ib}=qs(),yb=require("lodash"),{server:bE}=(Lr(),P(Yl)),oee=ee();bE.getUser=(e,t)=>Cb(e,t,t!=null);bE.authenticateUser=(e,t)=>Cb(e,t);var qx={username:!0,active:!0,role:!0,password:!0},Mx=new Map,aee=tee(eee.delete),bb=nee.get(Rb.CONFIG_PARAMS.AUTHENTICATION_HASHFUNCTION)??A_.HASH_FUNCTION.SHA256,Pi;async function cee(e){let t=Gx.cleanAttributes(e,qx),r=Fx.addUserValidation(t);if(r)throw new zs(r.message);let n=await R_.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 zs(Ou.ROLE_NAME_NOT_FOUND(t.role),Eo.NOT_FOUND);if(n.length>1)throw new zs(Ou.DUP_ROLES_FOUND(t.role),Eo.CONFLICT);n[0].permission.cluster_user===!0&&(t.hash=wb.encrypt(t.password)),t.password=await A_.hash(t.password,bb),t.hash_function=bb,t.role=n[0].id;let s=await kx.insert({operation:"insert",schema:"system",table:"hdb_user",records:[t]});if(Nb.debug(s),await Qc(),s.skipped_hashes.length===1)throw new zs(Ou.USER_ALREADY_EXISTS(t.username),Eo.CONFLICT);return Ob.signalUserChange(new Ib(process.pid)),`${t.username} successfully added`}a(cee,"addUser");async function lee(e){let t=Gx.cleanAttributes(e,qx);if(Ci.isEmptyOrZeroLength(t.username))throw new Error(vx);if(Ci.isEmptyOrZeroLength(t.password)&&Ci.isEmptyOrZeroLength(t.role)&&Ci.isEmptyOrZeroLength(t.active))throw new Error(Ux);if(!Ci.isEmpty(t.password)&&Ci.isEmptyOrZeroLength(t.password.trim()))throw new Error(xx);if(!Ci.isEmpty(t.active)&&!Ci.isBoolean(t.active))throw new Error(Hx);if(!Ci.isEmpty(t.password)&&!Ci.isEmptyOrZeroLength(t.password.trim())&&(uee(t.username)&&(t.hash=wb.encrypt(t.password)),t.password=await A_.hash(t.password,bb)),t.role==="")throw new Error(Bx);if(t.role){let n=await R_.searchByValue({schema:"system",table:"hdb_role",search_attribute:"role",search_value:t.role,get_attributes:["*"]});if(!n||n.length===0)throw new zs(Ou.ALTER_USER_ROLE_NOT_FOUND(t.role),Eo.NOT_FOUND);if(n.length>1)throw new zs(Ou.DUP_ROLES_FOUND(t.role),Eo.CONFLICT);t.role=n[0].id}let r=await kx.update({operation:"update",schema:"system",table:"hdb_user",records:[t]});return await Qc(),Ob.signalUserChange(new Ib(process.pid)),r}a(lee,"alterUser");function uee(e){let t=!1,r=Pi.get(e);return r&&r.role.permission.cluster_user===!0&&(t=!0),t}a(uee,"isClusterUser");async function dee(e){let t=Fx.dropUserValidation(e);if(t)throw new zs(t.message);if(Pi.get(e.username)===void 0)throw new zs(Ou.USER_NOT_EXIST(e.username),Eo.NOT_FOUND);let r=await aee({table:"hdb_user",schema:"system",hash_values:[e.username]});return Nb.debug(r),await Qc(),Ob.signalUserChange(new Ib(process.pid)),`${e.username} successfully deleted`}a(dee,"dropUser");async function fee(e){let t={};if(!e||!e.hdb_user)return"There was no user info in the body";t=yb.cloneDeep(e.hdb_user);let r=await R_.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(fee,"userInfo");async function _ee(){let e=await OE();return e.forEach(t=>{delete t.password,delete t.hash,delete t.refresh_token,delete t.hash_function}),[...e.values()]}a(_ee,"listUsersExternal");async function OE(){let e=await R_.searchByValue({schema:"system",table:"hdb_role",search_value:"*",search_attribute:"role",get_attributes:["*"]}),t={};for(let s of e)t[s.id]=yb.cloneDeep(s);if(Object.keys(t).length===0)return null;let r=await R_.searchByValue({schema:"system",table:"hdb_user",search_value:"*",search_attribute:"username",get_attributes:["*"]}),n=new Map;for(let s of r)s=yb.cloneDeep(s),s.role=t[s.role],hee(s.role),n.set(s.username,s);return n}a(OE,"listUsers");function hee(e){if(!e){Nb.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(see)){let r={read:!!e.permission.super_user,insert:!1,update:!1,delete:!1,attribute_permissions:[]};e.permission.system.tables[t]=r}}a(hee,"appendSystemTablesToRole");async function Qc(e=void 0){e?Pi=e:Pi=await OE()}a(Qc,"setUsersWithRolesCache");async function mee(){return Pi||await Qc(),Pi}a(mee,"getUsersWithRolesCache");async function Cb(e,t,r=!0){Pi||await Qc();let n=Pi.get(e);if(!n){if(!r)return{username:e};throw new zs(Ab.GENERIC_AUTH_FAIL,Eo.UNAUTHORIZED)}if(n&&!n.active)throw new zs(Ab.USER_INACTIVE,Eo.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(Mx.get(t)===n.password)return s;{let i=A_.validate(n.password,t,n.hash_function||A_.HASH_FUNCTION.MD5);if(i?.then&&(i=await i),i===!0)Mx.set(t,n.password);else throw new zs(Ab.GENERIC_AUTH_FAIL,Eo.UNAUTHORIZED)}}return s}a(Cb,"findAndValidateUser");async function pee(){Pi||await Qc();for(let[,e]of Pi)if(e.role.role==="super_user")return e}a(pee,"getSuperUser");async function Eee(){let e=await OE(),t=ree.getConfigFromFile(Rb.CONFIG_PARAMS.CLUSTERING_USER),r=e.get(t);if(!(r==null||r?.role?.role!==Rb.ROLE_TYPES_ENUM.CLUSTER_USER))return r.decrypt_hash=wb.decrypt(r.hash),r.uri_encoded_d_hash=encodeURIComponent(r.decrypt_hash),r.uri_encoded_name=encodeURIComponent(r.username),r.sys_name=r.username+Lx.SERVER_SUFFIX.ADMIN,r.sys_name_encoded=r.uri_encoded_name+Lx.SERVER_SUFFIX.ADMIN,r}a(Eee,"getClusterUser");var $x=[];bE.invalidateUser=function(e){for(let t of $x)try{t(e)}catch(r){oee.error("Error invalidating user",r)}};bE.onInvalidatedUser=function(e){$x.push(e)}});var b_=C((GNe,Wx)=>{"use strict";var jc=ee(),zn=(k(),P(q)),gee=fM(),kNe=Ys(),FNe=po(),See=Wn(),{validateEvent:Vx}=qs(),y_=$n(),Tee=require("process"),{resetDatabases:Aee}=(xe(),P(ct)),Ree={[zn.ITC_EVENT_TYPES.SCHEMA]:yee,[zn.ITC_EVENT_TYPES.USER]:Yx};async function yee(e){let t=Vx(e);if(t){jc.error(t);return}jc.trace("ITC schemaHandler received schema event:",e),await gee(e.message),await bee(e.message)}a(yee,"schemaHandler");async function bee(e){try{y_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME),y_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME),y_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME);let t=Aee();e.table&&e.database&&await t[e.database][e.table].put(Symbol.for("write-verify"),null)}catch(t){jc.error(t)}}a(bee,"syncSchemaMetadata");var Kx=[];async function Yx(e){try{try{y_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME),y_.resetReadTxn(zn.SYSTEM_SCHEMA_NAME,zn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME)}catch(r){jc.warn(r)}let t=Vx(e);if(t){jc.error(t);return}jc.trace(`ITC userHandler ${zn.HDB_ITC_CLIENT_PREFIX}${Tee.pid} received user event:`,e),await See.setUsersWithRolesCache();for(let r of Kx)r()}catch(t){jc.error(t)}}a(Yx,"userHandler");Yx.addListener=function(e){Kx.push(e)};Wx.exports=Ree});var qs=C((WNe,Qx)=>{"use strict";var $Ne=ee(),Pb=ie(),Oee=(k(),P(q)),{ITC_ERRORS:O_}=Un(),{parentPort:VNe,threadId:Nee,isMainThread:wee,workerData:KNe}=require("worker_threads"),{onMessageFromWorkers:Iee,broadcast:YNe,broadcastWithAcknowledgement:Cee}=it();Qx.exports={sendItcEvent:Pee,validateEvent:zx,SchemaEventMsg:Dee,UserEventMsg:Lee};var NE;Iee(async(e,t)=>{NE=NE||b_(),zx(e),NE[e.type]&&await NE[e.type](e),e.requestId&&t&&t.postMessage({type:"ack",id:e.requestId})});function Pee(e){return!wee&&e.message&&(e.message.originator=Nee),Cee(e)}a(Pee,"sendItcEvent");function zx(e){if(typeof e!="object")return O_.INVALID_ITC_DATA_TYPE;if(!e.hasOwnProperty("type")||Pb.isEmpty(e.type))return O_.MISSING_TYPE;if(!e.hasOwnProperty("message")||Pb.isEmpty(e.message))return O_.MISSING_MSG;if(!e.message.hasOwnProperty("originator")||Pb.isEmpty(e.message.originator))return O_.MISSING_ORIGIN;if(Oee.ITC_EVENT_TYPES[e.type.toUpperCase()]===void 0)return O_.INVALID_EVENT(e.type)}a(zx,"validateEvent");function Dee(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(Dee,"SchemaEventMsg");function Lee(e){this.originator=e}a(Lee,"UserEventMsg")});var uo=C((jNe,Zx)=>{"use strict";var jx=(k(),P(q)),QNe=ie(),wE=ee(),Jx=zL(),Nu,{sendItcEvent:Xx}=qs();function Mee(e){try{wE.info("signalSchemaChange called with message:",e),Nu=Nu||b_();let t=new Jx(jx.ITC_EVENT_TYPES.SCHEMA,e);return Nu.schema(t),Xx(t)}catch(t){wE.error(t)}}a(Mee,"signalSchemaChange");function vee(e){try{wE.trace("signalUserChange called with message:",e),Nu=Nu||b_();let t=new Jx(jx.ITC_EVENT_TYPES.USER,e);return Nu.user(t),Xx(t)}catch(t){wE.error(t)}}a(vee,"signalUserChange");Zx.exports={signalSchemaChange:Mee,signalUserChange:vee}});var D_={};Ue(D_,{addAnalyticsListener:()=>P_,calculateCPUUtilization:()=>gB,diffResourceUsage:()=>SB,recordAction:()=>Mt,recordActionBinary:()=>Qn,setAnalyticsEnabled:()=>Uee});function Uee(e){_B=e}function xee(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 Bee(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},CE.set(e,o)}function Mt(e,t,r,n,s){if(!_B)return;let i=t+(r?"-"+r:"");n!==void 0&&(i+="-"+n),s!==void 0&&(i+="-"+s);let o=CE.get(i);o?xee(e,o):Bee(i,e,t,r,n,s),IE||Hee()}function Qn(e,t,r,n,s){Mt(!!e,t,r,n,s)}function P_(e){pB.push(e)}function Hee(){IE=performance.now(),setTimeout(async()=>{let e=performance.now()-IE;IE=0;let t=[],r={time:Date.now(),period:e,threadId:Jc.threadId,metrics:t};for(let[s,i]of CE){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 EB){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 TB()}let n=process.memoryUsage();t.push({metric:"memory",threadId:Jc.threadId,byThread:!0,...n});for(let s of pB)s(t);CE=new Map,Jc.parentPort?Jc.parentPort.postMessage({type:mB,report:r}):yB({report:r})},hB).unref()}function PE(e,t,r){let n={id:(0,I_.getNextMonotonicTime)(),metric:t,...r};e.primaryStore.put(n.id,n,{append:!0}).then(s=>{s||e.primaryStore.put(n.id,n)})}function gB(e,t){let r=e.userCPUTime+e.systemCPUTime;return Math.round(r/t*100)/100}function SB(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 kee(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};PE(e,"table-size",l),Xc.trace?.(`table ${o} size metric: ${JSON.stringify(l)}`),n+=c}return n}function eB(e,t){for(let[r,n]of Object.entries(t))try{let[s]=Object.values(n),i=s?.getAuditSize();if(!i)return;let o=fB.default.statSync(s.primaryStore.env.path).size,c=kee(e,r,n),l=o-c,u={database:r,size:o,used:c,free:l,audit:i};PE(e,"database-size",u),Xc.trace?.(`database ${r} size metric: ${JSON.stringify(u)}`)}catch(s){Xc.warn?.("Error getting DB size metrics",s)}}function tB(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};PE(e,"storage-volume",o),Xc.trace?.(`db ${r} storage volume metrics: ${JSON.stringify(o)}`)}catch(s){Xc.warn?.("Error getting DB volume metrics",s)}}async function Fee(e,t=6e4){let r=Lb(),n=AB(),s=new Promise(E=>{let T=performance.now();setImmediate(()=>{let N=performance.now();N-T>5e3&&Xc.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&&Xc.warn?.("Unusually high task queue latency on the main thread of "+Math.round(N-T)+"ms"),E(N-T)})}),i;for(let E of n.primaryStore.getRange({start:1/0,end:!1,reverse:!0}))if(E.value?.time){i=E.value.time;break}if(Date.now()-t<i)return;let o,c=new Map,l=new Map,u=[],f;for(let{key:E,value:T}of r.primaryStore.getRange({start:i||!1,exclusiveStart:!0,end:1/0})){if(!T)continue;if(o){if(E>o+t)break}else o=E;f=E;let{metrics:N,threadId:M}=T;for(let H of N||[]){let{path:X,method:W,type:$,metric:se,count:z,total:fe,distribution:ue,threads:Z,...Ae}=H;z||(z=1);let me=se+(X?"-"+X:"");W!==void 0&&(me+="-"+W),$!==void 0&&(me+="-"+$);let ye=c.get(me);if(ye){if(ye.threads){let dt=ye.threads[M];if(dt)ye=dt;else{ye.threads[M]={...Ae};continue}}ye.count||(ye.count=1);let Ht=ye.count;for(let dt in Ae){let Ln=Ae[dt];typeof Ln=="number"&&(ye[dt]=(ye[dt]*Ht+Ln*z)/(Ht+z))}ye.count+=z,fe>=0&&(ye.total+=fe,ye.ratio=ye.total/ye.count)}else ye={period:t,...H},delete ye.distribution,c.set(me,ye),ye.byThread&&(ye.threads=[],ye.threads[M]={...Ae},u.push(ye));if(ue){ue=ue.map(dt=>typeof dt=="number"?{value:dt,count:1}:dt);let Ht=l.get(me);Ht?Ht.push(...ue):l.set(me,ue)}}await TB()}for(let E of u){let{path:T,method:N,type:M,metric:H,count:X,total:W,distribution:$,threads:se,...z}=E;se=se.filter(fe=>fe);for(let fe in z){if(typeof E[fe]!="number")continue;let ue=0;for(let Z of se){let Ae=Z[fe];typeof Ae=="number"&&(ue+=Ae)}E[fe]=ue}E.count=se.length,delete E.threads,delete E.byThread}for(let[E,T]of l){let N=c.get(E);T.sort((dt,Ln)=>dt.value>Ln.value?1:-1);let M=N.count-1,H=[],X=0,W=0,$;for(let dt of EB){let Ln=M*dt;for(;X<Ln;)$=T[W++],X+=$.count,W===1&&X--;let Vr=T[W>1?W-2:0];$||($=T[0]),H.push($.value-($.value-Vr.value)*(X-Ln)/$.count)}let[se,z,fe,ue,Z,Ae,me,ye,Ht]=H;Object.assign(N,{p1:se,p10:z,p25:fe,median:ue,p75:Z,p90:Ae,p95:me,p99:ye,p999:Ht})}let d;for(let[E,T]of c)T.id=(0,I_.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,I_.getNextMonotonicTime)(),T={id:E,metric:"main-thread-utilization",idle:h-rB,active:m-nB,taskQueueLatency:await s,time:_,...process.memoryUsage()};n.primaryStore.put(E,T,{append:!0}).then(N=>{N||n.primaryStore.put(E,T)})}rB=h,nB=m;let S=process.resourceUsage(),g=SB(N_,S);g.time=_,g.period=N_.time?_-N_.time:t,g.cpuUtilization=gB(N_,g.period),PE(n,"resource-usage",g),N_=g;let R=Je();eB(n,R),eB(n,{system:R.system}),tB(n,R),tB(n,{system:R.system})}async function sB(e,t){let r=Date.now()-t;for(let n of e.primaryStore.getKeys({start:!1,end:r}))e.primaryStore.remove(n)}function Lb(){return iB||(iB=_t({table:"hdb_raw_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"action"},{name:"metrics"}]}))}function AB(){return oB||(oB=_t({table:"hdb_analytics",database:"system",audit:!1,trackDeletes:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"metric"},{name:"path"},{name:"method"},{name:"type"}]}))}function $ee(){RB=!0;let e=(0,C_.get)(x.ANALYTICS_AGGREGATEPERIOD)*1e3;e&&setInterval(async()=>{await Fee(hB,e),await sB(Lb(),Gee),await sB(AB(),qee)},Math.min(e/2,2147483647)).unref()}function yB(e,t){let r=e.report;r.threadId=t?.threadId||Jc.threadId;for(let n of r.metrics)n.metric==="bytes-sent"&&(aB+=n.mean*n.count);r.totalBytesProcessed=aB,t&&(r.metrics.push({metric:"utilization",...t.performance.eventLoopUtilization(cB.get(t))}),cB.set(t,t.performance.eventLoopUtilization())),r.id=(0,I_.getNextMonotonicTime)(),Lb().primaryStore.put(r.id,r),RB||$ee(),Vee&&(bB=Yee(r))}async function Yee(e){if(await bB,!Ea){let r=(0,w_.dirname)((0,uB.getLogFilePath)());try{Ea=await(0,Db.open)((0,w_.join)(r,"analytics.log"),"r+")}catch{Ea=await(0,Db.open)((0,w_.join)(r,"analytics.log"),"w+")}}let t=(await Ea.stat()).size;if(t>Kee){let r=Buffer.alloc(t);await Ea.read(r,{position:0}),r=r.subarray(r.indexOf(10,r.length/2)+1),await Ea.write(r,{position:0}),await Ea.truncate(r.length),t=r.length}await Ea.write(JSON.stringify(e)+`
|
|
20
20
|
`,t)}var Jc,lB,uB,dB,w_,Db,I_,C_,fB,Xc,CE,_B,IE,hB,mB,pB,EB,rB,nB,N_,TB,Gee,qee,iB,oB,RB,aB,cB,Vee,bB,Ea,Kee,Di=Re(()=>{Jc=require("worker_threads"),lB=v(it());xe();uB=v(ee()),dB=v(ks()),w_=require("path"),Db=require("fs/promises"),I_=v(un()),C_=v(le());k();Lr();fB=v(require("node:fs")),Xc=(0,dB.loggerWithTag)("analytics");(0,C_.initSync)();CE=new Map,_B=(0,C_.get)(x.ANALYTICS_AGGREGATEPERIOD)>-1;a(Uee,"setAnalyticsEnabled");a(xee,"recordExistingAction");a(Bee,"recordNewAction");a(Mt,"recordAction");Ye.recordAnalytics=Mt;a(Qn,"recordActionBinary");IE=0,hB=1e3,mB="analytics-report",pB=[];a(P_,"addAnalyticsListener");EB=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];a(Hee,"sendAnalytics");a(PE,"storeMetric");a(gB,"calculateCPUUtilization");a(SB,"diffResourceUsage");a(kee,"storeTableSizeMetrics");a(eB,"storeDBSizeMetrics");a(tB,"storeVolumeMetrics");a(Fee,"aggregation");rB=0,nB=0,N_={},TB=a(()=>new Promise(setImmediate),"rest");a(sB,"cleanup");Gee=36e5,qee=31536e6;a(Lb,"getRawAnalyticsTable");a(AB,"getAnalyticsTable");(0,lB.setChildListenerByType)(mB,yB);a($ee,"startScheduledTasks");aB=0,cB=new Map,Vee=!1;a(yB,"recordAnalytics");Kee=1e6;a(Yee,"logAnalytics")});var OB={};Ue(OB,{Headers:()=>go,appendHeader:()=>DE,mergeHeaders:()=>Mb});function DE(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 Mb(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,L_=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(DE,"appendHeader");a(Mb,"mergeHeaders")});var xb={};Ue(xb,{EVICTED:()=>Ec,INVALIDATED:()=>_n,coerceType:()=>vE,makeTable:()=>xE,setServerUtilities:()=>ete});function xE(e){let{primaryKey:t,indices:r,tableId:n,tableName:s,primaryStore:i,databasePath:o,databaseName:c,auditStore:l,schemaDefined:u,dbisDB:f,sealed:d,splitSegments:_,replicate:h}=e,{expirationMS:m,evictionMS:S,audit:g,trackDeletes:R}=e;S??=0;let{attributes:E}=e;E||(E=[]);let T=fR(i,n,l),N,M,H={},X=Promise.resolve(),W,$,se;for(let K of E)(K.assignCreatedTime||K.name==="__createdtime__")&&(W=K),(K.assignUpdatedTime||K.name==="__updatedtime__")&&($=K),K.expiresAt&&(se=K),K.isPrimaryKey&&(H=K);let z,fe=[],ue=[],Z=1,Ae=2,me={},ye={},Ht=864e5,dt=0,Ln,Vr,Cr,Qd=!1,oc,oA=new Map,aA=new Map,kt,jd,Jd=el.get(x.REPLICATION_DATABASES);if(Array.isArray(Jd)){for(let K of Jd)if(K.name===c&&K.replicateTo>=0){jd=K.replicateTo;break}}let cA=i.getRange({start:!1,end:!1}).constructor,Im=10,Xd=6;g&&Cm(),Gf(i.env.path,K=>{if(M)return jo(K)});class Ce extends Kr{#e;#t;#n;#r;#s;#i;static name=s;static primaryStore=i;static auditStore=l;static primaryKey=t;static tableName=s;static tableId=n;static indices=r;static audit=g;static databasePath=o;static databaseName=c;static attributes=E;static replicate=h;static sealed=d;static splitSegments=_??!0;static createdTimeProperty=W;static updatedTimeProperty=$;static propertyResolvers;static userResolvers={};static sources=[];static getResidencyById;static get expirationMS(){return m}static dbisDB=f;static schemaDefined=u;static sourcedFrom(p,O){if(O&&(this.sourceOptions=O,(O.expiration||O.eviction||O.scanInterval)&&this.setTTLExpiration(O)),O?.intermediateSource)p.intermediateSource=!0,this.sources.unshift(p);else{if(this.sources.some(b=>!b.intermediateSource)){if(this.sources.some(b=>b.name===p.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(p)}M=M||p.get&&(!p.get.reliesOnPrototype||p.prototype.get),N=N||p.load;let L=a(b=>{let U=this.sources;if(U=U.filter(B=>B.intermediateSource&&B[b]&&(!B[b].reliesOnPrototype||B.prototype[b])),U.length>0)if(U.length===1){let B=U[0];return(w,D,G)=>{if(w?.source!==B)return B[b](D,G,w)}}else return(B,w,D)=>{let G=[];for(let j of U){if(B?.source===j)break;G.push(j[b](w,D,B))}return Promise.all(G)}},"getApplyToIntermediateSource"),A=this.sources[this.sources.length-1];A.intermediateSource&&(A={});let y=a(b=>{if(A[b]&&(!A[b].reliesOnPrototype||A.prototype[b]))return(U,B,w)=>{if(!U?.source)return A[b](B,w,U)}},"getApplyToCanonicalSource");me={put:y("put"),patch:y("patch"),delete:y("delete"),publish:y("publish")},ye={put:L("put"),patch:L("patch"),delete:L("delete"),publish:L("publish"),invalidate:L("invalidate")};let I=A.shouldRevalidateEvents;return(async()=>{let b=!1,U,B=a(async(w,D)=>{let G=w.value,j=w.table?We[c][w.table]:Ce;if(c===af&&(w.table===Wl.ROLE_TABLE_NAME||w.table===Wl.USER_TABLE_NAME)&&(b=!0),w.id===void 0&&(w.id=G[j.primaryKey],w.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(w));w.source=p;let Q={residencyId:uc(w.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:w.nodeId,async:!0},F=await j.getResource(w.id,D,Q);switch(w.finished&&await w.finished,w.type){case"put":return I?F._writeInvalidate(G,Q):F._writeUpdate(G,!0,Q);case"patch":return I?F._writeInvalidate(G,Q):F._writeUpdate(G,!1,Q);case"delete":return F._writeDelete(Q);case"publish":case"message":return F._writePublish(G,Q);case"invalidate":return F._writeInvalidate(G,Q);case"relocate":return F._writeRelocate(Q);default:Be.default.error?.("Unknown operation",w.type,w.id)}},"writeUpdate");try{let w=p.subscribe;w&&R==null&&(R=!0);let D={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},G=p.subscribeOnThisThread?p.subscribeOnThisThread((0,Zc.getWorkerIndex)(),D):(0,Zc.getWorkerIndex)()===0,j=w&&G&&await p.subscribe?.(D);if(j){let Q;for await(let F of j)try{if(!(F.type==="transaction"?F.writes[0]:F)){Be.default.error?.("Bad subscription event",F);continue}if(F.source=p,F.type==="end_txn"){if(Q?.resolve(),F.localTime&&U!==F.localTime){if(F.remoteNodeIds?.length>0){let oe=[Symbol.for("seq"),F.remoteNodeIds[0]],V=f.get(oe),J=V?.nodes;J||(J=[]);for(let pe of F.remoteNodeIds.slice(1)){let ae=J.find(Ie=>Ie.id===pe);J=J.filter(Ie=>Ie.id!==pe||Ie===ae),ae||(ae={id:pe,seqId:0},J.push(ae)),ae.seqId=Math.max(V?.seqId??1,F.localTime),pe===Q?.nodeId&&(ae.lastTxnTime=F.timestamp)}let de=Math.max(V?.seqId??1,F.localTime);Be.default.trace?.("Received txn",c,de,new Date(de),F.localTime,new Date(F.localTime),F.remoteNodeIds),f.put(oe,{seqId:de,nodes:J})}U=F.localTime}F.onCommit&&Q?.committed.then(F.onCommit);continue}if(Q)if(F.beginTxn)Q.resolve();else{Q.write_promises.push(B(F,Q));continue}!F.timestamp&&F.version&&(F.timestamp=F.version);let Ee=It(F,()=>{if(F.type==="transaction"){let oe=[];for(let V of F.writes)try{oe.push(B(V,F))}catch(J){throw J.message+=" writing "+JSON.stringify(V)+" of event "+JSON.stringify(F),J}return Promise.all(oe)}else if(F.type==="define_schema"){let oe=this.attributes.slice(0),V;for(let J of F.attributes)oe.find(de=>de.name===J.name)||(oe.push(J),V=!0);V&&(_t({table:s,database:c,attributes:oe,origin:"cluster"}),v_.signalSchemaChange(new U_.SchemaEventMsg(process.pid,Yt.CREATE_TABLE,c,s)))}else return F.beginTxn?(Q=F,Q.write_promises=[B(F,F)],new Promise(oe=>{Q.resolve=()=>oe(Promise.all(Q.write_promises))})):B(F,F)});Q&&(Q.committed=Ee),b&&Ee&&!Ee?.waitingForUserChange&&(Ee.then(()=>v_.signalUserChange(new U_.UserEventMsg(process.pid))),Ee.waitingForUserChange=!0),F.onCommit&&(Ee?Ee.then(F.onCommit):F.onCommit())}catch(ve){Be.default.error?.("error in subscription handler",ve)}}}catch(w){Be.default.error?.(w)}})(),this}static get isCaching(){return M}static get shouldRevalidateEvents(){return this.prototype.get!==Ce.prototype.get}static getResource(p,O,L){let A=super.getResource(p,O,L);if(p!=null){Pr(p);try{if(A.getRecord?.())return A;if(typeof p=="object"&&p&&!Array.isArray(p))throw new Error(`Invalid id ${JSON.stringify(p)}`);let y=!L?.async||i.cache?.get?.(p),I=Dr(O),b=I.getReadTxn();if(b?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return Mn(p,O,{transaction:b,ensureLoaded:L?.ensureLoaded},y,U=>{if(U?Ce._updateResource(A,U):A.#e=null,O.onlyIfCached&&O.noCacheStore){if(!A.doesExist())throw new Nr.ServerError("Entry is not cached",504)}else if(L?.ensureLoaded){let B=cn(p,U,O,A);if(B)return I?.disregardReadTxn(),A.#i=!0,Ub(B,w=>(Ce._updateResource(A,w),A))}return A})}catch(y){throw y.message.includes("Unable to serialize object")&&(y.message+=": "+JSON.stringify(p)),y}}return A}static _updateResource(p,O){p.#r=O,p.#e=O?.value??null,p.#n=O?.version}ensureLoaded(){let p=cn(this.getId(),this.#r,this.getContext());if(p)return this.#i=!0,Ub(p,O=>{this.#r=O,this.#e=O.value,this.#n=O.version})}static getNewId(){let p=H?.type;if(p==="String"||p==="ID")return super.getNewId();if(!kt){let y=i.getEntry(Symbol.for("id_allocation")),I=y?.value,b;if(I&&I.nodeName===server.hostname&&(!rte(i)||I.pid===process.pid)){let U=I.start,B=I.end;b=U;for(let w of i.getKeys({start:B,end:U,limit:1,reverse:!0}))b=w}else I=A(y?.version??null),b=I.start;kt=new BigInt64Array([BigInt(b)+1n]),kt=new BigInt64Array(i.getUserSharedBuffer("id",kt.buffer)),kt.maxSafeId=I.end}let O=Number(Atomics.add(kt,0,1n)),L=p==="Int"?512:1048576;if(O+L>=kt.maxSafeId){let y=a(I=>{kt.maxSafeId=O+(p==="Int"?1023:4194303);let b=(p==="Int"?Math.pow(2,31):Math.pow(2,49))-1,U=I?void 0:i.useReadTransaction(),B=Number(kt[0]);for(let G of i.getKeys({start:B+1,end:b,limit:1,transaction:U}))b=G;U?.done();let{value:w,version:D}=i.getEntry(Symbol.for("id_allocation"));if(kt.maxSafeId<b){if(w.end>kt.maxSafeId-100)return;Be.default.info?.("New id allocation",O,kt.maxSafeId,D),i.put(Symbol.for("id_allocation"),{start:w.start,end:kt.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),D)}else{Be.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${kt.maxSafeId}, but id of ${b} detected`);let G=A(D);G.alreadyUpdated||Atomics.store(kt,0,BigInt(G.start+1)),kt.maxSafeId=G.end}},"updateEnd");O+L===kt.maxSafeId?setImmediate(y):O+100>=kt.maxSafeId&&(Be.default.warn?.(`Synchronous id allocation required on table ${s}${p=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>y(!0)))}return O;function A(y){let I=(p==="Int"?Math.pow(2,31):Math.pow(2,49))-1,b=I/4,U,B,w=!1,D,G;do{D=Math.floor(Math.random()*I),G={start:D,end:D+(p==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},U=0;for(let j of i.getKeys({start:D,limit:1,reverse:!0}))U=j;B=I;for(let j of i.getKeys({start:D+1,end:I,limit:1}))B=j;b*=.875,b<1e3&&!w&&(w=!0,Be.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${p==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,D,U,B,b))}while(!(b<B-D&&(b<D-U||U===0)));return i.transactionSync(()=>{let j=i.getEntry(Symbol.for("id_allocation"));return(j?.version??null)==y?(Be.default.info?.("Allocated new id range",G),i.put(Symbol.for("id_allocation"),G,Date.now()),G):(Be.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...j.value})})}}static setTTLExpiration(p){if(typeof p=="number")m=p*1e3,S||(S=0);else if(p&&typeof p=="object")m=p.expiration*1e3,S=(p.eviction||0)*1e3,Ht=p.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(m<0)throw new Error("Expiration can not be negative");Ht=Ht||(m+S)/4,jo()}static getResidencyRecord(p){return f.get([Symbol.for("residency_by_id"),p])}static setResidency(p){Ce.getResidency=p&&((O,L)=>{try{return p(O,L)}catch(A){throw A.message+=` in residency function for table ${s}`,A}})}static setResidencyById(p){Ce.getResidencyById=p&&(O=>{try{return p(O)}catch(L){throw L.message+=` in residency function for table ${s}`,L}})}static getResidency(p,O){if(Ce.getResidencyById)return Ce.getResidencyById(p[t]);let L=jd;if(O.replicateTo!=null){if(Array.isArray(O.replicateTo))return O.replicateTo.includes(server.hostname)?O.replicateTo:[server.hostname,...O.replicateTo];O.replicateTo>=0&&(L=O.replicateTo)}if(L>=0&&server.nodes){let A=[server.hostname];if(O.previousResidency)A.push(...O.previousResidency.slice(0,L));else{let y=server.nodes.map(U=>U.name),I=Math.floor(y.length*Math.random());A.push(...y.slice(I,I+L));let b=I+L-y.length;b>0&&A.push(...y.slice(0,b))}return A}}static enableAuditing(p=!0){g=p,p&&Cm(),Ce.audit=p}static coerceId(p){return p===""?null:vE(p,H)}static async dropTable(){delete We[c][s];for(let p of i.getRange({versions:!0,snapshot:!1,lazy:!0}))p.metadataFlags&Ur&&p.value&&aa(p.value);if(c===o){for(let p of E)f.remove(Ce.tableName+"/"+p.name),r[p.name]?.drop();f.remove(Ce.tableName+"/"),i.drop(),await f.committed}else console.log("legacy dropTable"),await i.close(),await ME.default.remove(data_path),await ME.default.remove(data_path===standard_path?data_path+MDB_LOCK_FILE_SUFFIX:path.join(path.dirname(data_path),MDB_LEGACY_LOCK_FILE_NAME));v_.signalSchemaChange(new U_.SchemaEventMsg(process.pid,Yt.DROP_TABLE,c,s))}get(p){if(typeof p=="string")return this.getProperty(p);if(this.isCollection)return this.search(p);if(this.getId()===null){if(p?.conditions||p?.size>0)return this.search(p);let O={records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:E};return this.getContext()?.includeExpensiveRecordCountEstimates?Ce.getRecordCount().then(L=>(O.recordCount=L.recordCount,O.estimatedRecordRange=L.estimatedRange,O)):O}if(p?.property)return this.getProperty(p.property);if(this.doesExist()||p?.ensureLoaded===!1||this.getContext()?.returnNonexistent)return this}allowRead(p,O){let L=ac(p);if(L?.read){if(L.isSuperUser)return!0;let A=L.attribute_permissions,y=O?.select;if(A?.length>0||Qd&&y){if(O||(O={}),y){let I=A?.length>0&&vb(A,"read");O.select=y.map(b=>{let U=b.name||b;if(!I||I[U]){let B=Cr[U]?.definition?.tableClass;if(B){if(b.name||(b={name:b}),!B.prototype.allowRead.call(null,p,b))return!1;if(!b.select)return b.name}return b}}).filter(Boolean)}else O.select=A.filter(I=>I.read&&!Cr[I.attribute_name]).map(I=>I.attribute_name);return O}else return!0}}allowUpdate(p,O){let L=ac(p);if(L?.update){let A=L.attribute_permissions;if(A?.length>0){let y=vb(A,"update");for(let I in O)if(!y[I])return!1;for(let I of A){let b=I.attribute_name;!I.update&&!(b in O)&&(O[b]=this.getProperty(b))}}return Qo(this.getContext())}}allowCreate(p,O){if(this.isCollection){let L=ac(p);if(L?.insert){let A=L.attribute_permissions;if(A?.length>0){let y=vb(A,"insert");for(let I in O)if(!y[I])return!1;return Qo(this.getContext())}else return Qo(this.getContext())}}else return this.allowUpdate(p,{})}allowDelete(p){return ac(p)?.delete&&Qo(this.getContext())}update(p,O){if(!Dr(this.getContext()))throw new Error("Can not update a table resource outside of a transaction");if(p===!1)return this;let A;return typeof p=="object"&&p&&(O?(Object.isFrozen(p)&&(p={...p}),this.#e={},this.#t=p):(A=this.#t,A&&(p=Object.assign(A,p)),this.#t=p)),this._writeUpdate(this.#t,O),this}addTo(p,O){if(typeof O=="number"||typeof O=="bigint")this.#s===wB?this.set(p,(+this.getProperty(p)||0)+O):(this.#s||this.update(),this.set(p,new nE(O)));else throw new Error("Can not add a non-numeric value")}subtractFrom(p,O){if(typeof O=="number")return this.addTo(p,-O);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this.#r}getRecord(){return this.#e}getChanges(){return this.#t}_setChanges(p){this.#t=p}setRecord(p){this.#e=p}invalidate(){this._writeInvalidate()}_writeInvalidate(p,O){let L=this.getContext(),A=this.getId();Pr(A),Dr(this.getContext()).addWrite({key:A,store:i,invalidated:!0,entry:this.#r,before:me.invalidate?.bind(this,L,A),beforeIntermediate:Xi(p,ye.invalidate?.bind(this,L,A)),commit:a((I,b)=>{if(!(zo(I,b,O?.nodeId)<=0)){p??=null;for(let U in r)p||(p={}),p[U]===void 0&&(p[U]=this.getProperty(U));Be.default.trace?.(`Invalidating entry id: ${A}, timestamp: ${new Date(I).toISOString()}`),T(A,p,this.#r,I,_n,g,{user:L?.user,residencyId:O?.residencyId,nodeId:O?.nodeId},"invalidate")}},"commit")})}_writeRelocate(p){let O=this.getContext(),L=this.getId();Pr(L),Dr(this.getContext()).addWrite({key:L,store:i,invalidated:!0,entry:this.#r,before:me.relocate?.bind(this,O,L),beforeIntermediate:ye.relocate?.bind(this,O,L),commit:a((y,I)=>{if(zo(y,I,p?.nodeId)<=0)return;let b=Ce.getResidencyRecord(p.residencyId),U=0,B=null,w=I?.value;if(b&&!b.includes(server.hostname)){for(let D in r)B||(B={}),B[D]=w[D];U=_n}else B=w;Be.default.trace?.(`Relocating entry id: ${L}, timestamp: ${new Date(y).toISOString()}`),T(L,B,this.#r,y,U,g,{user:O.user,residencyId:p.residencyId,nodeId:p.nodeId,expiresAt:p.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(p,O){if(this.getResidencyById)return!1;let L={previousResidency:this.getResidencyRecord(p.residencyId),isRelocation:!0},A=lc(this.getResidency(O.value,L)),y;if(A){if(!A.includes(server.hostname))return!1;y=uc(A)}let I=0;Be.default.debug?.("Performing a relocate of an entry",p.key,O.value,A);let b=T(p.key,O.value,p,p.version,I,!0,{residencyId:y,expiresAt:O.expiresAt},"relocate",!1,null);return!0}static evict(p,O,L){let A=this.Source,y;if(!((M||g)&&(!O||(y=i.getEntry(p),!y||!O)||y.version!==L))){if(M){if(i.hasLock(p,y.version))return;let I;for(let b in r)I||(I={}),I[b]=O[b];if(I)return T(p,I,y,L,Ec,null,null,null,!0)}return i.ifVersion(p,L,()=>{Ji(p,O,null)}),Ic(i,y??i.getEntry(p),L)}}lock(){throw new Error("Not yet implemented")}static operation(p,O){return p.table||=s,p.schema||=c,UB.operation(p,O)}put(p){this.update(p,!0)}patch(p){this.update(p,!1)}_writeUpdate(p,O,L){let A=this.getContext(),y=Dr(A),I=this.getId();Pr(I);let b=this.#r??i.getEntry(I);this.#s=O?wB:Jee;let U=a(w=>O?w.put?()=>w.put(A,I,p):null:w.patch?()=>w.patch(A,I,p):w.put?()=>w.put(A,I,gu(this)):null,"writeToSources"),B={key:I,store:i,entry:b,nodeName:A?.nodeName,validate:a(w=>{p||(p=this.#t),O||p&&tE(this.#t===p?this:p)?A?.source||(y.checkOverloaded(),this.validate(p,!O),$&&(p[$.name]=$.type==="Date"?new Date(w):$.type==="String"?new Date(w).toISOString():w),O&&(t&&p[t]!==I&&(p[t]=I),W&&(b?.value?p[W.name]=b?.value[W.name]:p[W.name]=W.type==="Date"?new Date(w):W.type==="String"?new Date(w).toISOString():w),p=gu(p))):y.removeWrite(B)},"validate"),before:U(me),beforeIntermediate:Xi(p,U(ye)),commit:a((w,D,G)=>{if(G){if(A&&D?.version>(A.lastModified||0)&&(A.lastModified=D.version),this.#r=D,D?.value&&D.value.getRecord)throw new Error("Can not assign a record to a record, check for circular references");O||(this.#e=D?.value??null)}this.#t=void 0,this.#n=w;let j=D?.value,Q=p;this.#s=0;let F=!1,ve=zo(w,D,L?.nodeId),Ee,oe=O?"put":"patch",V;L?.residencyId!=null&&(V=L.residencyId);let J=A?.expiresAt??(m?m+Date.now():-1);if(ve<=0)if(g){let ae=D.localTime,Ie=D.version;Be.default.trace?.("Applying CRDT update to record with id: ",I,"applying later update:",Ie);let He=[];for(;ae>w||Ie>=w&&ae>0;){let De=l.get(ae);if(!De)break;let rt=St(De);if(Ie=rt.version,Ie>=w){if(Ie===w){if(ve=zo(w,{version:Ie,localTime:ae},L?.nodeId),ve===0)return pe(!1);if(ve>0)continue}if(rt.type==="patch")He.push(rt),Ee=p;else if(rt.type==="put"||rt.type==="delete")return pe(!1)}ae=rt.previousLocalTime}He.sort((De,rt)=>De.version-rt.version);for(let De of He){let rt=De.getValue(i);if(Q=bp(Q,rt,O),Be.default.debug?.("Rebuilding update with future patch:",Q),!Q)return pe(!1)}}else{if(O)return pe(!1);Q=bp(Q,j,O),Be.default.debug?.("Rebuilding update without audit:",Q)}let de;if(O?de=Q:(this.#e=j,de=gu(this,Q)),this.#e=de,de&&de.getRecord)throw new Error("Can not assign a record to a record, check for circular references");if(V==null){b?.residencyId&&(A.previousResidency=Ce.getResidencyRecord(b.residencyId));let ae=lc(Ce.getResidency(de,A));if(ae&&!ae.includes(server.hostname))if(Ee??=de,F=!0,Ce.getResidencyById)de=void 0;else{de=null;for(let Ie in r)de||(de={}),de[Ie]=Ee[Ie]}V=uc(ae)}O||(Ee=p),Be.default.trace?.(`Saving record with id: ${I}, timestamp: ${new Date(w).toISOString()}${J?", expires at: "+new Date(J).toISOString():""}${D?", replaces entry from: "+new Date(D.version).toISOString():", new entry"}`,(()=>{try{return JSON.stringify(de).slice(0,100)}catch{return""}})()),Ji(I,j,de),pe(!0),A.expiresAt&&jo();function pe(ae){T(I,ae?de:void 0,ae?D:{...D,value:void 0},w,F?_n:0,g,{omitLocalRecord:F,user:A?.user,residencyId:V,expiresAt:J,nodeId:L?.nodeId,originatingOperation:A?.originatingOperation},oe,!1,ae?Ee:Ee??p)}a(pe,"writeCommit")},"commit")};y.addWrite(B)}async delete(p){if(typeof p=="string")return this.deleteProperty(p);if(this.isCollection){for await(let O of this.search(p))(await Ce.getResource(O[t],this.getContext(),{ensureLoaded:!1}))._writeDelete(p);return}return this.#e?this._writeDelete(p):!1}_writeDelete(p){let O=Dr(this.getContext()),L=this.getId();Pr(L);let A=this.getContext();return O.addWrite({key:L,store:i,entry:this.#r,nodeName:A?.nodeName,before:me.delete?.bind(this,A,L),beforeIntermediate:ye.delete?.bind(this,A,L),commit:a((y,I,b)=>{let U=I?.value;b&&(A&&I?.version>(A.lastModified||0)&&(A.lastModified=I.version),Ce._updateResource(this,I)),!(zo(y,I,p?.nodeId)<=0)&&(Ji(this.getId(),U),Be.default.trace?.(`Deleting record with id: ${L}, txn timestamp: ${new Date(y).toISOString()}`),g||R?(T(L,null,this.#r,y,0,g,{user:A?.user,nodeId:p?.nodeId},"delete"),g||jo()):Ic(i,I))},"commit")}),!0}search(p){let O=this.getContext(),L=Dr(O);if(!p)throw new Error("No query provided");let A=p.conditions;A?A.length===void 0&&(A=A[Symbol.iterator]?Array.from(A):[A]):A=Array.isArray(p)?p:p[Symbol.iterator]?Array.from(p):[],this.getId()&&(A=[{attribute:null,comparator:Array.isArray(this.getId())?"prefix":"starts_with",value:this.getId()}].concat(A));let y,I={};function b(J,de){let pe;switch(de){case"and":case void 0:if(J.length<1)throw new Error('An "and" operator requires at least one condition');pe=!0;break;case"or":if(J.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+de)}for(let ae of J){if(ae.conditions){ae.conditions=b(ae.conditions,ae.operator);continue}let Ie=ae[0]??ae.attribute,He=Ie==null?H:pi(E,Ie);if(He)(He.type||HA[ae.comparator])&&(ae[1]===void 0?ae.value=B(ae.value,He):ae[1]=B(ae[1],He));else if(Ie!=null)throw(0,Nr.handleHDBError)(new Error,`${Ie} is not a defined attribute`,404);if(ae.chainedConditions)if(ae.chainedConditions.length===1&&(!ae.operator||ae.operator=="and")){let De=ae.chainedConditions[0],rt,vn;if(De.comparator==="gt"||De.comparator==="greater_than"||De.comparator==="ge"||De.comparator==="greater_than_equal"?(rt=ae,vn=De):(rt=De,vn=ae),rt.comparator!=="lt"&&rt.comparator!=="less_than"&&rt.comparator!=="le"&&rt.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let di=vn.comparator==="ge"||vn.comparator==="greater_than_equal",Oe=rt.comparator==="le"||rt.comparator==="less_than_equal";ae.comparator=(di?"ge":"gt")+(Oe?"le":"lt"),ae.value=[vn.value,rt.value]}else throw new Error("Multiple chained conditions are not currently supported")}return J}a(b,"prepareConditions");function U(J,de){if(p.enforceExecutionOrder)return J;for(let pe of J)pe.conditions&&(pe.conditions=U(pe.conditions,pe.operator));return J.length>1&&de!=="or"?(0,MB.sortBy)(J,Zm(Ce)):J}a(U,"orderConditions");function B(J,de){return Array.isArray(J)?J.map(pe=>vE(pe,de)):vE(J,de)}a(B,"coerceTypedValues");let w=p.operator;(A.length>0||w)&&(A=b(A,w));let D=typeof p.sort=="object"&&p.sort,G;if(D&&w!=="or"){let J=D.attribute;if(J==null)throw new Nr.ClientError("Sort requires an attribute");if(y=A.find(de=>Zl(de.attribute)===Zl(J)),!y){let de=pi(E,J);if(!de)throw(0,Nr.handleHDBError)(new Error,`${Array.isArray(J)?J.join("."):J} is not a defined attribute`,404);if(de.indexed)y={attribute:J,comparator:"sort"},A.push(y);else if(A.length===0&&!p.allowFullScan)throw(0,Nr.handleHDBError)(new Error,`${Array.isArray(J)?J.join("."):J} is not indexed and not combined with any other conditions`,404)}y&&(y.descending=!!D.descending)}A=U(A,w),D&&(y&&A[0]===y?D.next&&(G={dbOrderedAttribute:D.attribute,attribute:D.next.attribute,descending:D.next.descending,next:D.next.next}):(y&&A.splice(A.indexOf(y),1),G=D));let j=p.select;if(A.length===0&&(A=[{attribute:t,comparator:"greater_than",value:!0}]),p.explain)return{conditions:A,operator:w,postOrdering:G,selectApplied:!!j};let Q=L.useReadTxn(),F=kA(A,w,Ce,Q,p,O,(J,de)=>ef(J,j,O,Q,de),I),ve=p.ensureLoaded!==!1;G||(F=V(F));let Ee=Ce.transformEntryForSelect(j,O,Q,I,ve,!0),oe=Ce.transformToOrderedSelect(F,j,G,Q,O,Ee);function V(J){return p.offset||p.limit!==void 0?J.slice(p.offset,p.limit!==void 0?(p.offset||0)+p.limit:void 0):J}return a(V,"applyOffset"),G&&(oe=V(oe)),oe.onDone=()=>{oe.onDone=null,L.doneReadTxn()},oe.selectApplied=!0,oe.getColumns=()=>{if(j){let J=[];for(let de of j)de==="*"?J.push(...E.map(pe=>pe.name)):J.push(de.name||de);return J}return E.filter(J=>!J.computed&&!J.relationship).map(J=>J.name)},oe}static transformToOrderedSelect(p,O,L,A,y,I){let b=new cA;if(L){p=ef(p,O,A,y,null);let U;b.iterate=function(){let w,D=p[Symbol.asyncIterator]?p[Symbol.asyncIterator]():p[Symbol.iterator](),G,j=L.dbOrderedAttribute,Q,F,ve=!0;function Ee(V){let J=V.next&&Ee(V.next),de=V.descending;return(pe,ae)=>{let Ie=cc(pe,V.attribute,A),He=cc(ae,V.attribute,A),De=de?(0,tl.compareKeys)(He,Ie):(0,tl.compareKeys)(Ie,He);return De===0?J?.(pe,ae)||0:De}}a(Ee,"createComparator");let oe=Ee(L);return{async next(){let V;if(w)if(V=w.next(),V.done){if(G)return b.onDone&&b.onDone(),V}else return{value:await I.call(this,V.value)};U=[],Q&&U.push(Q);do if(V=await D.next(),V.done){if(G=!0,U.length)break;return b.onDone&&b.onDone(),V}else{let J=V.value;if(J?.then&&(J=await J),j){let de=cc(J,j,A);if(ve)ve=!1,F=de;else if(de!==F){F=de,Q=J;break}}U.push(J)}while(!0);return L.isGrouped,U.sort(oe),w=U[Symbol.iterator](),V=w.next(),V.done?(b.onDone&&b.onDone(),V):{value:await I.call(this,V.value)}},return(){b.onDone&&b.onDone(),D.return()},throw(){b.onDone&&b.onDone(),D.throw()}}};let B=a(w=>{if(typeof O=="object"&&Array.isArray(w.attribute))for(let D=0;D<O.length;D++){let G=O[D],j;if(G.name===w.attribute[0]){for(j=G.sort||(G.sort={});j.next;)j=j.next;j.attribute=w.attribute.slice(1),j.descending=w.descending}else G===w.attribute[0]&&(O[D]=j={name:G,sort:{attribute:w.attribute.slice(1),descending:w.descending}})}w.next&&B(w.next)},"applySortingOnSelect");B(L)}else b.iterate=(p[Symbol.asyncIterator]||p[Symbol.iterator]).bind(p),b=b.map(function(U){try{let B=I.call(this,U);return typeof B?.catch=="function"?B.catch(w=>{throw w.partialObject={[t]:U.key},w}):B}catch(B){throw B.partialObject={[t]:U.key},B}});return b}static transformEntryForSelect(p,O,L,A,y,I){if(p&&(p===t||p?.length===1&&p[0]===t&&Array.isArray(p))){let w=a(D=>(O?.transaction?.stale&&(O.transaction.stale=!1),D?.key??D),"transform");return p===t?w:p.asArray?D=>[w(D)]:D=>({[t]:w(D)})}let b;y&&M&&!(typeof p=="string"?[p]:p)?.every(w=>{let D;return typeof w=="object"?D=w.name:D=w,r[D]||D===t})&&(b=!0);let U,B=a(function(w){let D;if(O?.transaction?.stale&&(O.transaction.stale=!1),w!=null){if(D=w.value||w.deref?.()?.value,!D&&(w.key===void 0||w.deref)||w.metadataFlags&_n){if(w.metadataFlags&_n&&O.replicateFrom===!1&&I&&w.residencyId)return Sa.SKIP;if(w=Mn(w.key??w,O,{transaction:L,lazy:p?.length<4,ensureLoaded:y},this?.isSync,G=>G),w?.then)return w.then(B.bind(this));D=w?.value}if(b&&w?.metadataFlags&(_n|Ec)||w?.expiresAt!=null&&w?.expiresAt<Date.now()){if(O.onlyIfCached&&O.noCacheStore)return{[t]:w.key,message:"This entry has expired"};let G=cn(w.key??w,w,O);if(G?.then)return G.then(B)}}if(D==null)return I?Sa.SKIP:D;if(p&&!(p[0]==="*"&&p.length===1)){let G,j=a((F,ve)=>{let Ee;typeof F=="object"?Ee=F.name:Ee=F;let oe=Cr?.[Ee],V;if(oe){let J=A?.[Ee];if(J)if(J.hasMappings){let pe=oe.from?D[oe.from]:Zl(w.key);V=J.get(pe),V||(V=[])}else V=J.fromRecord?.(D);else V=oe(D,O,w);let de=a(pe=>{if(pe&&typeof pe=="object"){let ae=oe.definition?.tableClass||Ce;U||(U={});let Ie=U[Ee]||(U[Ee]=ae.transformEntryForSelect(Ee===F?null:F.select||(Array.isArray(F)?F:null),O,L,J,y));if(Array.isArray(pe)){let He=[],De=ae.transformToOrderedSelect(pe,F.select,typeof F.sort=="object"&&F.sort,O,L,Ie)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),rt=a(di=>{for(;!di.done;){if(di?.then)return di.then(rt);He.push(di.value),di=De.next()}ve(He,Ee)},"nextValue"),vn=rt(De.next());vn&&(G||(G=[]),G.push(vn));return}else if(pe=Ie.call(this,pe),pe?.then){G||(G=[]),G.push(pe.then(He=>ve(He,Ee)));return}}ve(pe,Ee)},"handleResolvedValue");V?.then?(G||(G=[]),G.push(V.then(de))):de(V);return}else V=D[Ee],V&&typeof V=="object"&&Ee!==F&&(V=Ce.transformEntryForSelect(F.select||F,O,L,null)({value:V}));ve(V,Ee)},"selectAttribute"),Q;if(typeof p=="string")j(p,F=>{Q=F});else if(Array.isArray(p))if(p.asArray)Q=[],p.forEach((F,ve)=>{F==="*"?p[ve]=D:j(F,Ee=>Q[ve]=Ee)});else{Q={};let F=p.forceNulls;for(let ve of p)if(ve==="*")for(let Ee in D)Q[Ee]=D[Ee];else j(ve,(Ee,oe)=>{Ee===void 0&&F&&(Ee=null),Q[oe]=Ee})}else throw new Nr.ClientError("Invalid select"+p);return G?Promise.all(G).then(()=>Q):Q}return D},"transform");return B}async subscribe(p){if(!l)throw new Error("Can not subscribe to a table without an audit log");g||_t({table:s,database:c,schemaDefined:u,attributes:E,audit:!0}),p||(p={});let O=!p.rawEvents,L=[],A=this,y=NR(Ce,this.getId()??null,function(b,U,B,w){try{let D=U.getValue?.(i,O),G=U.type;if(!D&&G==="patch"&&O){let Q=i.getEntry(b);Q?.version===U.version?D=Q.value:D=U.getValue?.(i,!0,B),G="put"}let j={id:b,localTime:B,value:D,version:U.version,type:G,beginTxn:w};L?L.push(j):this.send(j)}catch(D){Be.default.error?.(D)}},p.startTime||0,p),I=(async()=>{this.isCollection&&(y.includeDescendants=!0,p.onlyChildren&&(y.onlyChildren=!0)),p.supportsTransactions&&(y.supportsTransactions=!0);let b=this.getId(),U=p.previousCount;U>1e3&&(U=1e3);let B=p.startTime;if(this.isCollection){if(B){if(U)throw new Nr.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:w,value:D}of l.getRange({start:B,exclusiveStart:!0,snapshot:!1})){let G=St(D);if(G.tableId!==n)continue;let j=G.recordId;if(b==null||DB(b,j)){let Q=G.getValue(i,O,w);if(y.send({id:j,localTime:w,value:Q,version:G.version,type:G.type}),y.queue?.length>CB&&await y.waitForDrain()===!1)return}y.startTime=w}}else if(U){let w=[];for(let{key:D,value:G}of l.getRange({start:"z",end:!1,reverse:!0}))try{let j=St(G);if(j.tableId!==n)continue;let Q=j.recordId;if(b==null||DB(b,Q)){let F=j.getValue(i,O,D);if(w.push({id:Q,localTime:D,value:F,version:j.version,type:j.type}),--U<=0)break}}catch(j){Be.default.error("Error getting history entry",D,j)}for(let D=w.length;D>0;)y.send(w[--D]);w[0]&&(y.startTime=w[0].localTime)}else if(!p.omitCurrent){for(let{key:w,value:D,version:G,localTime:j}of i.getRange({start:b??!1,end:b==null?void 0:[b,tl.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(D&&(y.send({id:w,localTime:j,value:D,version:G,type:"put"}),y.queue?.length>CB&&await y.waitForDrain()===!1))return}}else{U&&!B&&(B=0);let w=this.#r?.localTime;if(w===dR&&(i.cache?.delete(b),this.#r=i.getEntry(b),Be.default.trace?.("re-retrieved record",w,this.#r?.localTime),w=this.#r?.localTime),Be.default.trace?.("Subscription from",B,"from",b,w),B<w){let D=[],G=w;do{let j=l.get(G);if(j){p.omitCurrent=!0;let Q=St(j),F=Q.getValue(i,O,G);O&&(Q.type="put"),D.push({id:b,value:F,localTime:G,...Q}),G=Q.previousLocalTime}else break;U&&U--}while(G>B&&U!==0);for(let j=D.length;j>0;)y.send(D[--j]);y.startTime=w}!p.omitCurrent&&this.doesExist()&&y.send({id:b,localTime:w,value:this.#e,version:this.#n,type:"put"})}for(let w of L)y.send(w);L=null})();return p.listener&&y.on("data",p.listener),y}static subscribeOnThisThread(p,O){return p===0||O?.crossThreads===!1}doesExist(){return!!(this.#e||this.#s)}publish(p,O){this._writePublish(p,O)}_writePublish(p,O){let L=Dr(this.getContext()),A=this.getId()||null;A!=null&&Pr(A);let y=this.getContext();L.addWrite({key:A,store:i,entry:this.#r,nodeName:y?.nodeName,validate:a(()=>{y?.source||(L.checkOverloaded(),this.validate(p))},"validate"),before:me.publish?.bind(this,y,A,p),beforeIntermediate:Xi(p,ye.publish?.bind(this,y,A,p)),commit:a((I,b,U)=>{b===void 0&&R&&!g&&jo(),Be.default.trace?.(`Publishing message to id: ${A}, timestamp: ${new Date(I).toISOString()}`),T(A,b?.value??null,b,b?.version||I,0,!0,{user:y?.user,residencyId:O?.residencyId,expiresAt:y?.expiresAt,nodeId:O?.nodeId},"message",!1,p)},"commit")})}validate(p,O){let L,A=a((y,I,b)=>{if(I.type&&y!=null)if(O&&y.__op__&&(y=y.value),I.properties){typeof y!="object"&&(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be an object${I.type?" ("+I.type+")":""}`);let U=I.properties;for(let B=0,w=U.length;B<w;B++){let D=U[B],G=A(y[D.name],D,b+"."+D.name);G&&(y[D.name]=G)}if(I.sealed&&y!=null&&typeof y=="object")for(let B in y)U.find(w=>w.name===B)||(L||(L=[])).push(`Property ${B} is not allowed within object in property ${b}`)}else switch(I.type){case"Int":(typeof y!="number"||y>>0!==y)&&(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof y!="number"||!(Math.floor(y)===y&&Math.abs(y)<=9007199254740992))&&(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof y!="number"&&(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be a number`);break;case"ID":typeof y=="string"||y?.length>0&&y.every?.(U=>typeof U=="string")||(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be a string, or an array of strings`);break;case"String":typeof y!="string"&&(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be a string`);break;case"Boolean":typeof y!="boolean"&&(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be a boolean`);break;case"Date":if(!(y instanceof Date)){if(typeof y=="string"||typeof y=="number")return new Date(y);(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be a Date`)}break;case"BigInt":if(typeof y!="bigint"){if(typeof y=="string"||typeof y=="number")return BigInt(y);(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be a bigint`)}break;case"Bytes":if(!(y instanceof Uint8Array)){if(typeof y=="string")return Buffer.from(y);(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be a Buffer or Uint8Array`)}break;case"Blob":if(!(y instanceof gi)){if(typeof y=="string"&&(y=Buffer.from(y)),y instanceof Buffer)return createBlob(y,{type:"text/plain"});(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be a Blob`)}break;case"array":if(Array.isArray(y)){if(I.elements)for(let U=0,B=y.length;U<B;U++){let w=y[U],D=A(w,I.elements,b+"[*]");D&&(y[U]=D)}}else(L||(L=[])).push(`Value ${Es(y)} in property ${b} must be an Array`);break}I.nullable===!1&&y==null&&(L||(L=[])).push(`Property ${b} is required (and not does not allow null values)`)},"validateValue");for(let y=0,I=E.length;y<I;y++){let b=E[y];if(!(b.relationship||b.computed)&&(!O||b.name in p)){let U=A(p[b.name],b,b.name);U&&(p[b.name]=U)}}if(d)for(let y in p)E.find(I=>I.name===y)||(L||(L=[])).push(`Property ${y} is not allowed`);if(L)throw new Nr.ClientError(L.join(". "))}getUpdatedTime(){return this.#n}wasLoadedFromSource(){return M?!!this.#i:void 0}static async addAttributes(p){let O=E.slice(0);for(let L of p){if(!L.name)throw new Nr.ClientError("Attribute name is required");if(L.name.match(/[`/]/))throw new Nr.ClientError("Attribute names cannot include backticks or forward slashes");(0,vB.validateAttribute)(L.name),O.push(L)}return _t({table:s,database:c,schemaDefined:u,attributes:O}),Ce.indexingOperation}static async removeAttributes(p){let O=E.filter(L=>!p.includes(L.name));return _t({table:s,database:c,schemaDefined:u,attributes:O}),Ce.indexingOperation}static getSize(){let p=i.getStats();return(p.treeBranchPageCount+p.treeLeafPageCount+p.overflowPages)*p.pageSize}static getAuditSize(){let p=l?.getStats();return p&&(p.treeBranchPageCount+p.treeLeafPageCount+p.overflowPages)*p.pageSize}static getStorageStats(){let p=i.env.path,O=ME.default.statfsSync?.(p)??{};return{available:O.bavail*O.bsize,free:O.bfree*O.bsize,size:O.blocks*O.bsize}}static async getRecordCount(p){let O=i.getStats().entryCount,L=1e3/2,A=performance.now(),y=Math.floor(O/2),I=p?.exactCount,b=0,U=0,B;for(let{value:w}of i.getRange({start:!0,lazy:!0,snapshot:!1}))if(w!=null&&b++,U++,await ga(),!I&&U<y&&performance.now()-A>L){B=U;break}if(B){let w=b;b=0;for(let{value:V}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:B,snapshot:!1}))V!=null&&b++,await ga();let D=B*2,G=(b+w)/D,j=Math.pow((b-w+1)/B/2,2)+G*(1-G)/D,Q=Math.max(Math.sqrt(j)*O,1),F=Math.round(G*O),ve=Math.max(F-1.96*Q,b+w),Ee=Math.min(F+1.96*Q,O),oe=Math.pow(10,Math.round(Math.log10(Q)));return oe>F&&(oe=oe/10),b=Math.round(F/oe)*oe,{recordCount:b,estimatedRange:[Math.round(ve),Math.round(Ee)]}}return{recordCount:b}}static updatedAttributes(){Cr=this.propertyResolvers={$id:a((p,O,L)=>({value:L.key}),"$id"),$updatedtime:a((p,O,L)=>L.version,"$updatedtime"),$record:a((p,O,L)=>L?{value:p}:p,"$record")};for(let p of this.attributes){p.isPrimaryKey&&(H=p),p.resolve=null;let O=p.relationship,L=p.computed;if(O)if(p.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),L&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),Qd=!0,O.to)p.elements?.definition?(Cr[p.name]=p.resolve=(A,y,I)=>{let b=A[O.from?O.from:t],U=p.elements.definition.tableClass;return I?Xl({attribute:O.to,value:b},Dr(y).getReadTxn(),!1,U,!1).asArray:U.search([{attribute:O.to,value:b}],y).asArray},p.set=()=>{throw new Error("Setting a one-to-many relationship property is not supported")},p.resolve.definition=p.elements.definition,O.from&&(p.resolve.from=O.from)):console.error(`The one-to-many/many-to-many relationship property "${p.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(O.from){let A=p.definition||p.elements?.definition;A?(Cr[p.name]=p.resolve=(y,I,b)=>{let U=y[O.from];if(U!==void 0){if(p.elements){let B,w=U?.map(D=>{let G=b?A.tableClass.primaryStore.getEntry(D,{transaction:Dr(I).getReadTxn()}):A.tableClass.get(D,I);return G?.then&&(B=!0),G});return O.filterMissing?B?Promise.all(w).then(D=>D.filter(LB)):w.filter(LB):B?Promise.all(w):w}return b?A.tableClass.primaryStore.getEntry(U,{transaction:Dr(I).getReadTxn()}):A.tableClass.get(U,I)}},p.set=(y,I)=>{if(Array.isArray(I)){let b=I.map(U=>U.getId?.()||U[A.tableClass.primaryKey]);y[O.from]=b}else{let b=I.getId?.()||I[A.tableClass.primaryKey];y[O.from]=b}},p.resolve.definition=p.definition||p.elements?.definition,p.resolve.from=O.from):console.error(`The relationship property "${p.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${p.name}" in table "${s}" must use either "from" or "to" arguments`);else L&&(typeof L.from=="function"&&this.setComputedAttribute(p.name,L.from),Cr[p.name]=p.resolve=(A,y,I)=>{let b=typeof L.from=="string"?A[L.from]:A,U=this.userResolvers[p.name];if(U)return U(b,y,I);Be.default.warn(`Computed attribute "${p.name}" does not have a function assigned to it. Please use setComputedAttribute('${p.name}', resolver) to assign a resolver function.`),this.userResolvers[p.name]=()=>{}})}sE(this,this)}static setComputedAttribute(p,O){let L=pi(E,p);if(!L){console.error(`The attribute "${p}" does not exist in the table "${s}"`);return}if(!L.computed){console.error(`The attribute "${p}" is not defined as computed in the table "${s}"`);return}this.userResolvers[p]=O}static async deleteHistory(p=0,O=!1){let L;for(let{key:A,value:y}of l.getRange({start:0,end:p}))await ga(),St(y).tableId===n&&(L=Mp(l,A,y));if(O)for(let A of i.getRange({start:0,versions:!0})){let{key:y,value:I,localTime:b}=A;await ga(),I===null&&b<p&&(L=Ic(i,A))}await L}static async*getHistory(p=0,O=1/0){for(let{key:L,value:A}of l.getRange({start:p||1,end:O})){await ga();let y=St(A);y.tableId===n&&(yield{id:y.recordId,localTime:L,version:y.version,type:y.type,value:y.getValue(i,!0,L),user:y.user,operation:y.originatingOperation})}}static async getHistoryOfRecord(p){let O=[];if(p==null)throw new Error("An id is required");let L=i.getEntry(p);if(!L)return O;let A=L.localTime;if(!A)throw new Error("The entry does not have a local audit time");let y=0;do{await ga();let I=l.get(A);if(I){let b=St(I);O.push({id:b.recordId,localTime:A,version:b.version,type:b.type,value:b.getValue(i,!0,A),user:b.user}),A=b.previousLocalTime}else break}while(y<1e3&&A);return O.reverse()}static cleanup(){z?.remove()}}Ce.updatedAttributes();let Zd=Ce.prototype;return m&&Ce.setTTLExpiration(m/1e3),se&&rf(),Ce;function Ji(K,p,O){let L;for(let A in r){let y=r[A],I=y.isIndexing,b=Cr[A],U=O&&(b?b(O):O[A]),B=p&&(b?b(p):p[A]);if(U===B&&!I)continue;L=!0;let w=y.indexNulls,D=(0,M_.getIndexedValues)(U,w),G=(0,M_.getIndexedValues)(B,w);if(G?.length>0){let j=new Set(G);if(D=D?D.filter(Q=>{if(j.has(Q))j.delete(Q);else return!0}):[],G=Array.from(j),(G.length>0||D.length>0)&&NB){let Q=G.concat(D).map(F=>({key:F,value:K}));y.prefetch(Q,PB)}for(let Q=0,F=G.length;Q<F;Q++)y.remove(G[Q],K)}else D?.length>0&&NB&&y.prefetch(D.map(j=>({key:j,value:K})),PB);if(D)for(let j=0,Q=D.length;j<Q;j++)y.put(D[j],K)}return L}a(Ji,"updateIndices");function Pr(K){switch(typeof K){case"number":return!0;case"string":if(K.length<659)return!0;if(K.length>IB)throw new Error("Primary key size is too large: "+K.length);break;case"object":if(K===null)throw new Error("Invalid primary key of null");break;case"bigint":if(K<2n**64n&&K>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof K)}if((0,tl.writeKey)(K,Xee,0)>IB)throw new Error("Primary key size is too large: "+K.length);return!0}a(Pr,"checkValidId");function Mn(K,p,O,L,A){if(Ce.getResidencyById&&O.ensureLoaded&&p?.replicateFrom!==!1){let I=lc(Ce.getResidencyById(K));if(I&&!I.includes(server.hostname)&&N)return N({key:K,residency:I}).then(A)}let y=a(()=>{if(p?.transaction?.stale&&(p.transaction.stale=!1),O.transaction?.isDone)return A(null,K);let I=i.getEntry(K,O);return I?.residencyId&&I.metadataFlags&_n&&N&&O.ensureLoaded&&p?.replicateFrom!==!1?N(I).then(b=>A(b,K),b=>(Be.default.error?.("Error loading remote record",K,I,O,b),A(null,K))):(I&&p&&(I?.version>(p.lastModified||0)&&(p.lastModified=I.version),I?.localTime&&!p.lastRefreshed&&(p.lastRefreshed=I.localTime)),A(I,K))},"whenPrefetched");return L?y():Z>0?(Z--,y()):new Promise((I,b)=>{Z===0?(Z--,i.prefetch([K],()=>{U(),B()})):(fe.push(K),ue.push(B),fe.length>Xd&&(Z--,U()));function U(){if(fe.length>0){let w=ue;i.prefetch(fe,()=>{Z===-1?U():Z++;for(let D of w)D()}),fe=[],ue=[],Ae>2&&Ae--}else Z=Ae,Ae<Im&&Ae++}a(U,"prefetch");function B(){try{I(y())}catch(w){b(w)}}a(B,"load")})}a(Mn,"loadLocalRecord");function ac(K){if(!K?.role)return;let p=K.role.permission;if(p.super_user)return Zee;let O=p[c],L,A=O?.tables;if(A)return A[s];if(c==="data"&&(L=p[s])&&!L.tables)return L}a(ac,"getTablePermissions");function cn(K,p,O,L){if(M){let A=!1;if(O.noCache?A=!0:(p?(!p.value||p.metadataFlags&(_n|Ec)||p.expiresAt!=null&&p.expiresAt<Date.now())&&(A=!0):A=!0,Qn(!A,"cache-hit",s)),A){let y=tf(K,p,O).then(I=>(I?.value&&I?.value.getRecord?.()&&Be.default.error?.("Can not assign a record that is already a resource"),O&&(I?.version>(O.lastModified||0)&&(O.lastModified=I.version),O.lastRefreshed=Date.now()),I));if(O?.onlyIfCached||p?.value&&L?.allowStaleWhileRevalidate?.(p,K)){if(y.catch(I=>Be.default.warn?.(I)),O?.onlyIfCached&&!L.doesExist())throw new Nr.ServerError("Entry is not cached",504);return}else return y}}else if(p?.value&&p.expiresAt!=null&&p.expiresAt<Date.now())return Ce.evict(p.key,p.value,p.version),p.value=null,{then(A){return A(p)}}}a(cn,"ensureLoadedFromSource");function Dr(K){let p=K?.transaction;if(p){if(!p.lmdbDb)return p.lmdbDb=i,p;do{if(p.lmdbDb?.path===i.path)return p;let O=p.next;if(!O)return p=p.next=new hc,p.lmdbDb=i,p;p=O}while(!0)}else return new jm}a(Dr,"txnForContext");function cc(K,p,O){if(!K)return;let L=K.value||i.getEntry(K.key)?.value;if(typeof p=="object"){let y=Cr,I=L;for(let b=0,U=p.length;b<U;b++){let B=p[b],w=y?.[B];I=w&&I?w(I,O,!0)?.value:I?.[B],y=w?.definition?.tableClass?.propertyResolvers}return I}let A=Cr[p];return A?A(L,O):L[p]}a(cc,"getAttributeValue");function ef(K,p,O,L,A){let y=A?.length,I={transaction:L,lazy:y>0||typeof p=="string"||p?.length<4,alwaysPrefetch:!0},b;function U(B,w){let D=B?.value;if(!D)return Sa.SKIP;for(let G=0;G<y;G++)if(!b?.includes(G)&&!A[G](D,B))return Sa.SKIP;return w!==void 0&&(B.key=w),B}if(a(U,"processEntry"),y>0||!K.hasEntries){let B=K.map(w=>{if(b=null,typeof w=="object"&&w?.key!==void 0)return y>0?U(w):w;if(w==null)return Sa.SKIP;for(let D=0;D<y;D++){let j=A[D].idFilter;if(j){if(!j(w))return Sa.SKIP;b||(b=[]),b.push(D)}}return Mn(w,O,I,!1,U)});return Array.isArray(K)&&(B=B.filter(w=>w!==Sa.SKIP)),B.hasEntries=!0,B}return K}a(ef,"transformToEntries");function zo(K,p,O=server.replication?.getThisNodeId(l)){if(K<=p?.version){if(p?.version===K&&O!==void 0){let L=server.replication?.exportIdMapping(l),A=p.localTime,y=A&&l.get(A);if(y){let I,b,U=St(y);for(let B in L)L[B]===O&&(I=B),L[B]===U.nodeId&&(b=B);if(I>b)return 1;if(I===b)return 0}}return-1}return 1}a(zo,"precedesExistingVersion");async function tf(K,p,O){let L=p?.metadataFlags,A=p?.version,y,I;if(!i.attemptLock(K,A,()=>{clearTimeout(I);let w=i.getEntry(K);!w||!w.value||w.metadataFlags&(_n|Ec)||w.expiresAt!=null&&w.expiresAt<Date.now()?y(tf(K,i.getEntry(K),O)):y(w)}))return new Promise(w=>{y=w,I=setTimeout(()=>{i.unlock(K,A)},jee)});let b=p?.value,U={requestContext:O,replacingRecord:b,replacingEntry:p,replacingVersion:A,noCacheStore:!1,source:null,resourceCache:O?.resourceCache},B=O?.responseHeaders;return new Promise((w,D)=>{let G;Ub(It(U,async j=>{let Q=performance.now(),F,ve,Ee;try{for(let de of Ce.sources)if(de.get&&(!de.get.reliesOnPrototype||de.prototype.get)){if(de.available?.(p)===!1)continue;if(U.source=de,F=await de.get(K,U),F)break}Ee=L&_n;let V=U.lastModified||Ee&&A;V||(V=(0,M_.getNextMonotonicTime)()),ve=Ee||V>A||!b;let J=performance.now()-Q;if(Mt(J,"cache-resolution",s,null,"success"),B&&DE(B,"Server-Timing",`cache-resolve;dur=${J.toFixed(2)}`,!0),j.timestamp=V,m&&U.expiresAt==null&&(U.expiresAt=Date.now()+m),F){if(typeof F!="object")throw new Error("Only objects can be cached and stored in tables");if(F.status>0&&F.headers)if(F.status>=300)if(F.status===304)F=b,V=A;else throw new Nr.ServerError(F.body||"Error from source",F.status);else F=F.body;typeof F.toJSON=="function"&&(F=F.toJSON()),t&&F[t]!==K&&(F[t]=K)}G=!0,w({key:K,version:V,value:F})}catch(V){V.message+=` while resolving record ${K} for ${s}`,b&&((V.code==="ECONNRESET"||V.code==="ECONNREFUSED"||V.code==="EAI_AGAIN")&&!O?.mustRevalidate||O?.staleIfError&&(V.statusCode===500||V.statusCode===502||V.statusCode===503||V.statusCode===504))?(w({key:K,version:A,value:b}),Be.default.trace?.(V.message,"(returned stale record)")):D(V);let J=performance.now()-Q;Mt(J,"cache-resolution",s,null,"fail"),B&&DE(B,"Server-Timing",`cache-resolve;dur=${J.toFixed(2)}`,!0),U.transaction.abort();return}if(O?.noCacheStore||U.noCacheStore){U.transaction.abort();return}Dr(U).addWrite({key:K,store:i,entry:p,nodeName:"source",before:Xi(F),commit:a((V,J)=>{if(J?.version!==A)return;let de=Ji(K,b,F);if(F){ye.put?.(U,K,F),J&&(O.previousResidency=Ce.getResidencyRecord(J.residencyId));let pe,ae=!1,Ie,He=lc(Ce.getResidency(F,O));if(He){if(!He.includes(server.hostname))if(pe=F,ae=!0,Ce.getResidencyById)F=void 0;else{F=null;for(let De in r)F||(F={}),F[De]=pe[De]}Ie=uc(He)}Be.default.trace?.(`Writing resolved record from source with id: ${K}, timestamp: ${new Date(V).toISOString()}`),T(K,F,J,V,ae?_n:0,g&&(ve||ae)||null,{user:U?.user,expiresAt:U.expiresAt,residencyId:Ie},"put",!!Ee,pe)}else J&&(ye.delete?.(U,K),Be.default.trace?.(`Deleting resolved record from source with id: ${K}, timestamp: ${new Date(V).toISOString()}`),g||R?T(K,null,J,V,0,g&&ve||null,{user:U?.user},"delete",!!Ee):Ic(i,J,A))},"commit")})}),()=>{i.unlock(K,A)},j=>{i.unlock(K,A),G&&Be.default.error?.("Error committing cache update",j)})})}a(tf,"getFromSource");function Qo(K){if(!K||K.user?.role?.permission?.super_user)return!0;if(K.replicateTo)throw new Nr.ClientError("Can not specify replication parameters without super user permissions",403);if(K.replicatedConfirmation)throw new Nr.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}a(Qo,"checkContextPermissions");function jo(K){let p=!1;if(K&&(K-dt>1&&(p=!0),dt=K),!(Ht===Ln&&!p)&&(Ln=Ht,(0,Zc.getWorkerIndex)()===(0,Zc.getWorkerCount)()-1))return Vr&&clearTimeout(Vr),Ht?new Promise(O=>{let L=new Date;L.setMonth(0),L.setDate(1),L.setHours(0),L.setMinutes(0),L.setSeconds(0);let A=Ht/(1+dt),y=p?Date.now():Math.ceil((Date.now()-L.getTime())/A)*A+L.getTime(),I=a(b=>{Be.default.trace?.(`Scheduled next cleanup scan at ${new Date(b)}`),Vr=setTimeout(()=>X=X.then(async()=>{if(I(Math.max(b+Ht,Date.now())),i.rootStore.status!=="open"){clearTimeout(Vr);return}let U=50,B=new Array(U),w=0,D=Math.pow(dt,8)*(el.get(x.STORAGE_RECLAMATION_EVICTIONFACTOR)??1e5),G=S/Math.pow(Math.max(dt,1),4);Be.default.info?.(`Starting cleanup scan for ${s}, evict threshold ${D}, adjusted eviction ${G}ms`);function j(Q,F,ve,Ee){let oe=Q+G-Date.now();if(oe<0)return!0;if(dt){let V=i.lastSize;return ve&Ur&&Rc(Ee,J=>{J.size&&(V+=J.size)}),Be.default.trace?.(`shouldEvict adjusted ${oe} ${V}, ${oe*(Q-F)/V} < ${D}`),oe*(Q-F)/V<D}return!1}a(j,"shouldEvict");try{let Q=0;for(let F of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let{key:ve,value:Ee,version:oe,expiresAt:V,metadataFlags:J}=F,de;Ee===null&&!g&&oe+Qee<Date.now()?de=Ic(i,F,oe):V!=null&&j(V,oe,J,Ee)&&(de=Ce.evict(ve,Ee,oe),Q++),de&&(await B[w],B[w]=de.catch(pe=>{Be.default.error?.("Cleanup error",pe)}),++w>=U&&(w=0)),await ga()}Be.default.info?.(`Finished cleanup scan for ${s}, evicted ${Q} entries`)}catch(Q){Be.default.warn?.(`Error in cleanup scan for ${s}:`,Q)}O(void 0),dt=0}),Math.min(b-Date.now(),2147483647)).unref()},"startNextTimer");I(y)}):void 0}a(jo,"scheduleCleanup");function Cm(){z=l?.addDeleteRemovalCallback(n,i,(K,p)=>{i.remove(K,p)})}a(Cm,"addDeleteRemoval");function rf(){(0,Zc.getWorkerIndex)()===0&&setInterval(async()=>{if(!oc){oc=!0;try{let K=se.name,p=r[K];if(!p)throw new Error(`expiresAt attribute ${se} must be indexed`);for(let O of p.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let L of p.getValues(O)){let A=i.getEntry(L);A?.value?A.value[K]<Date.now()&&Ce.evict(L,A.value,A.version):i.ifVersion(L,A?.version,()=>p.remove(O,L))}await ga()}}catch(K){Be.default.error?.("Error in evicting old records",K)}finally{oc=!1}}},zee).unref()}a(rf,"runRecordExpirationEviction");function lc(K){if(K!=null){if(Array.isArray(K))return K;if(typeof K=="number"){if(K>=65536)throw new Error(`Shard id ${K} must be below 65536`);let p=server.shards?.get?.(K);if(p)return Be.default.trace?.(`Shard ${K} mapped to ${p.map(O=>O.name).join(", ")}`),p.map(O=>O.name);throw new Error(`Shard ${K} is not defined`)}throw new Error(`Shard or residency list ${K} is not a valid type, must be a shard number or residency list of node hostnames`)}}a(lc,"residencyFromFunction");function uc(K){if(K){let p=K.join(","),O=f.get([Symbol.for("residency_by_set"),p]);return O||(f.put([Symbol.for("residency_by_set"),p],O=Math.floor(Math.random()*2147418112)+65535),f.put([Symbol.for("residency_by_id"),O],K),O)}}a(uc,"getResidencyId");function Xi(K,p){let O=sR(K,i.rootStore);if(O){let L=p;return L?async()=>{await L(),await O()}:()=>O()}return p}a(Xi,"preCommitBlobsForRecordBefore")}function vb(e,t){let r=e.attr_object||(e.attr_object={}),n=r[t];if(n)return n;n=r[t]=Object.create(null);for(let s of e)n[s.attribute_name]=s[t];return n}function PB(){}function ete(e){UB=e}function vE(e,t){let r=t?.type;if(e===null)return e;if(e===""&&r&&r!=="String"&&r!=="Any")return null;try{switch(r){case"Int":case"Long":if(e[0]==="$")return LE(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return LE(+e);case"Float":return e==="null"?null:LE(+e);case"BigInt":return e==="null"?null:BigInt(e);case"Boolean":return e==="true"?!0:e==="false"?!1:e;case"Date":if(isNaN(e)){if(e==="null")return null;tte.test(e)||(e+="Z");let n=new Date(e);return LE(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,UE.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function LE(e){if(isNaN(e))throw new SyntaxError;return e}function DB(e,t){if(e==null)return!0;if(!Array.isArray(t))return e===t||t.startsWith?.(e);if(Array.isArray(e)){let r=e.length;if(e[r-1]===null&&r--,t.length>=r){for(let n=0;n<r;n++)if(t[n]!==e[n])return!1;return!0}return!1}else if(t[0]===e)return!0}function Ub(e,t,r){return e?.then?e.then(t,r):t(e)}function LB(e){return e!=null}function Es(e){try{return JSON.stringify(e)}catch{return e}}function rte(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var Sa,M_,MB,vB,el,Nr,v_,U_,Be,tl,Zc,UE,ME,Wee,UB,zee,Qee,NB,jee,wB,Jee,_n,Ec,Xee,IB,CB,Zee,Swe,tte,ga,Of=Re(()=>{k();Sa=require("lmdb"),M_=v(un()),MB=require("lodash"),vB=v(Sf());na();Jm();el=v(le());wR();Nr=v(he()),v_=v(uo()),U_=v(qs());xe();bf();Be=v(ks());Fy();mc();tl=require("ordered-binary"),Zc=v(it());Ai();UE=v(ie());cu();Di();Op();L_();ME=v(require("node:fs"));hn();Cp();Wee=new Uint8Array(9);Wee[8]=192;zee=6e4,Qee=864e5;el.initSync();NB=el.get(x.STORAGE_PREFETCHWRITES),jee=1e4,wB=1,Jee=2,_n=1,Ec=8,Xee=Buffer.allocUnsafeSlow(8192),IB=1978,CB=100,Zee={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},Swe=(0,UE.convertToMS)(el.get(x.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;a(xE,"makeTable");a(vb,"attributesAsObject");a(PB,"noop");a(ete,"setServerUtilities");tte=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;a(vE,"coerceType");a(LE,"rejectNaN");a(DB,"isDescendantId");ga=a(()=>new Promise(setImmediate),"rest");a(Ub,"when");a(LB,"exists");a(Es,"stringify");a(rte,"hasOtherProcesses")});var ct={};Ue(ct,{database:()=>Su,database_envs:()=>So,databases:()=>We,dropDatabase:()=>Ky,dropTableMeta:()=>ate,getDatabases:()=>Je,getDefaultCompression:()=>qE,getTables:()=>nte,onRemovedDB:()=>G_,onUpdatedTable:()=>nl,readMetaDb:()=>x_,resetDatabases:()=>Du,table:()=>_t,tables:()=>Jn});function nte(){return FE||Je(),Jn||{}}function Je(){if(FE)return We;FE=!0,Cu=new Map;let e=(0,Qt.getHdbBasePath)()&&(0,vt.join)((0,Qt.getHdbBasePath)(),fc),t=(0,Qt.get)(x.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,Qt.get)(x.STORAGE_PATH)||e&&((0,jn.existsSync)(e)?e:(0,vt.join)((0,Qt.getHdbBasePath)(),Um)),!e)return;if((0,jn.existsSync)(e))for(let n of(0,jn.readdirSync)(e,{withFileTypes:!0})){let s=(0,vt.basename)(n.name,".mdb");n.isFile()&&(0,vt.extname)(n.name).toLowerCase()===".mdb"&&!t[s]?.path&&x_((0,vt.join)(e,n.name),null,s)}if((0,jn.existsSync)((0,Iu.getBaseSchemaPath)())){for(let n of(0,jn.readdirSync)((0,Iu.getBaseSchemaPath)(),{withFileTypes:!0}))if(!n.isFile()){let s=(0,vt.join)((0,Iu.getBaseSchemaPath)(),n.name),i=(0,vt.join)((0,Iu.getTransactionAuditStoreBasePath)(),n.name);for(let o of(0,jn.readdirSync)(s,{withFileTypes:!0}))if(o.isFile()&&(0,vt.extname)(o.name).toLowerCase()===".mdb"){let c=(0,vt.join)(i,o.name);x_((0,vt.join)(s,o.name),(0,vt.basename)(o.name,".mdb"),n.name,c,!0)}}}if(t)for(let n in t){let s=t[n],i=s.path;if((0,jn.existsSync)(i))for(let c of(0,jn.readdirSync)(i,{withFileTypes:!0}))c.isFile()&&(0,vt.extname)(c.name).toLowerCase()===".mdb"&&x_((0,vt.join)(i,c.name),(0,vt.basename)(c.name,".mdb"),n);let o=s.tables;if(o)for(let c in o){let l=o[c],u=(0,vt.join)(l.path,(0,vt.basename)(c+".mdb"));(0,jn.existsSync)(u)&&x_(u,c,n,null,!0)}}for(let n in We){let s=Cu.get(n);if(s){let i=We[n];n.includes("delete")&&Ut.trace(`defined tables ${Array.from(s.keys())}`);for(let o in i)s.has(o)||(Ut.trace(`delete table class ${o}`),delete i[o])}else if(delete We[n],n==="data"){for(let i in Jn)delete Jn[i];delete Jn[GE]}}let r=["hdb_temp","hdb_certificate","hdb_analytics","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_license","hdb_info"];if(We.system)for(let n of r)We.system[n]&&(We.system[n].replicate=!1);return Cu=null,We}function Du(){FE=!1;for(let[,e]of So)e.needsDeletion=!0;Je();for(let[e,t]of So)t.needsDeletion&&!e.endsWith("system.mdb")&&(t.close(),So.delete(e),delete We[t.databaseName],H_.forEach(r=>r(t.databaseName)));return We}function x_(e,t,r=kb,n,s){let i=new Bb.default(e,!1);try{let o=So.get(e);o?o.needsDeletion=!1:(o=(0,Pu.open)(i),So.set(e,o));let c=new rl.default(!1),l=o.dbisDb||(o.dbisDb=o.openDB(BE.INTERNAL_DBIS_NAME,c)),u=o.auditStore;u||(n?(0,jn.existsSync)(n)&&(i.path=n,u=(0,Pu.open)(i),u.isLegacy=!0):u=Lp(o));let f=kB(r),d=f[GE],_=new Map;for(let{key:h,value:m}of l.getRange({start:!1})){let[S,g]=h.toString().split("/");g===""?g=m.name:g||(g=S,S=t,m.name||(m.name=g,m.indexed=!m.is_hash_attribute)),d?.add(S);let R=_.get(S);R||_.set(S,R={attributes:[]}),(g==null||m.is_hash_attribute)&&(R.primary=m),g!=null&&R.attributes.push(m),Object.defineProperty(m,"key",{value:h,configurable:!0})}for(let[h,m]of _){let{attributes:S,primary:g}=m;if(!g){for(let Z of S)if(Z.is_hash_attribute||Z.isPrimaryKey){g=Z;break}if(!g){Ut.warn(`Unable to find a primary key attribute on table ${h}, with attributes: ${JSON.stringify(S)}`);continue}}let R=f[h],E={},T=[],N,M,H=typeof g.audit=="boolean"?g.audit:(0,Qt.get)(x.LOGGING_AUDITLOG),X=g.trackDeletes,W=g.expiration,$=g.eviction,se=g.sealed,z=g.splitSegments,fe=g.replicate;if(R)E=R.indices,T=R.attributes,R.schemaVersion++;else{N=g.tableId,N?N>=(l.get(wu)||0)&&(l.putSync(wu,N+1),Ut.info(`Updating next table id (it was out of sync) to ${N+1} for ${h}`)):(g.tableId=N=l.get(wu),N||(N=1),Ut.debug("Table {table_name} missing an id, assigning {table_id}"),l.putSync(wu,N+1),l.putSync(g.key,g));let Z=new rl.default(!g.is_hash_attribute,g.is_hash_attribute);if(Z.compression=g.compression,Z.compression){let Ae=(0,Qt.get)(x.STORAGE_COMPRESSION_THRESHOLD)||HB;Z.compression.threshold=Ae}M=Rp(o.openDB(g.key,Z),o),o.databaseName=r,M.tableId=N}let ue;for(let Z of S){Z.attribute=Z.name;try{if(!Z.is_hash_attribute&&(Z.indexed||Z.attribute&&!Z.name)){if(!E[Z.name]){let me=new rl.default(!Z.is_hash_attribute,Z.is_hash_attribute);E[Z.name]=o.openDB(Z.key,me),E[Z.name].indexNulls=Z.indexNulls}let Ae=T.find(me=>me.name===Z.name);Ae?T.splice(T.indexOf(Ae),1,Z):T.push(Z),ue=!0}}catch(Ae){Ut.error("Error trying to update attribute",Z,T,E,Ae)}}for(let Z of T)if(!S.find(me=>me.name===Z.name)){if(Z.is_hash_attribute){Ut.error("Unable to remove existing primary key attribute",Z);continue}Z.indexed&&(T.splice(T.indexOf(Z),1),ue=!0)}if(R)ue&&(R.schemaVersion++,R.updatedAttributes());else{R=FB(f,h,xE({primaryStore:M,auditStore:u,audit:H,sealed:se,splitSegments:z,replicate:fe,expirationMS:W&&W*1e3,evictionMS:$&&$*1e3,trackDeletes:X,tableName:h,tableId:N,primaryKey:g.name,databasePath:s?r+"/"+h:r,databaseName:r,indices:E,attributes:S,schemaDefined:g.schemaDefined,dbisDB:l})),R.schemaVersion=1;for(let Z of B_)Z(R)}}return o}catch(o){throw o.message+=` opening database ${e}`,o}}function kB(e){let t=We[e];if(t||(e==="data"?t=We[e]=Jn:e==="system"?Object.defineProperty(We,"system",{value:t=Object.create(null),configurable:!0}):t=We[e]=Object.create(null)),Cu&&!Cu.has(e)){let r=new Set;t[GE]=r,Cu.set(e,r)}return t}function FB(e,t,r){return e[t]=r,r}function Su({database:e,table:t}){e||(e=kb),Je();let r=kB(e),n=(0,vt.join)((0,Qt.getHdbBasePath)(),fc),s=(0,Qt.get)(x.DATABASES)||{};process.env.SCHEMAS_DATA_PATH&&(s.data={path:process.env.SCHEMAS_DATA_PATH});let i=t&&s[e]?.tables?.[t]?.path;n=i||s[e]?.path||process.env.STORAGE_PATH||(0,Qt.get)(x.STORAGE_PATH)||((0,jn.existsSync)(n)?n:(0,vt.join)((0,Qt.getHdbBasePath)(),Um));let o=(0,vt.join)(n,(i?t:e)+".mdb"),c=So.get(o);if(!c||c.status==="closed"){let l=new Bb.default(o,!1);c=(0,Pu.open)(l),So.set(o,c)}return c.auditStore||(c.auditStore=Lp(c)),c}async function Ky(e){if(!We[e])throw new Error("Schema does not exist");let t=We[e],r;for(let n in t)r=t[n].primaryStore.rootStore,So.delete(r.path),r.status==="open"&&(await r.close(),await k_.remove(r.path));if(r||(r=Su({database:e,table:null}),r.status==="open"&&(await r.close(),await k_.remove(r.path))),e==="data"){for(let n in Jn)delete Jn[n];delete Jn[GE]}delete We[e],H_.forEach(n=>n(e)),await nR(r)}function _t(e){let{table:t,database:r,expiration:n,eviction:s,scanInterval:i,attributes:o,audit:c,sealed:l,splitSegments:u,replicate:f,trackDeletes:d,schemaDefined:_,origin:h}=e;r||(r=kb);let m=Su({database:r,table:t}),S=We[r];Ut.trace(`Defining ${t} in ${r}`);let g=S?.[t];if(m.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let R,E,T;_==null&&(_=!0);let N=new rl.default(!1);for(let z of o)z.attribute&&!z.name?(z.name=z.attribute,z.indexed=!0):z.attribute=z.name,z.expiresAt&&(z.indexed=!0);let M,H;if(g){if(R=g.primaryKey,g.primaryStore.rootStore.status==="closed")throw new Error(`Can not use a closed data store from ${t} class`);u==null&&(u=g.splitSegments),g.attributes.splice(0,g.attributes.length,...o)}else{let z=m.auditStore;E=o.find(Ae=>Ae.isPrimaryKey)||{},R=E.name,E.is_hash_attribute=E.isPrimaryKey=!0,E.schemaDefined=_,E.compression=qE(),d&&(E.trackDeletes=!0),c=E.audit=typeof c=="boolean"?c:(0,Qt.get)(x.LOGGING_AUDITLOG),n&&(E.expiration=n),s&&(E.eviction=s),u??=!1,E.splitSegments=u,typeof l=="boolean"&&(E.sealed=l),typeof f=="boolean"&&(E.replicate=f),h&&(E.origins?E.origins.includes(h)||E.origins.push(h):E.origins=[h]),Ut.trace(`${t} table loading, opening primary store`);let fe=new rl.default(!1,!0);fe.compression=E.compression;let ue=t+"/";if(T=m.dbisDb=m.openDB(BE.INTERNAL_DBIS_NAME,N),se(),T.get(ue))return H&&H(),Du(),_t(e);let Z=Rp(m.openDB(ue,fe),m);m.databaseName=r,Z.tableId=T.get(wu),Ut.trace(`Assigning new table id ${Z.tableId} for ${t}`),Z.tableId||(Z.tableId=1),T.put(wu,Z.tableId+1),E.tableId=Z.tableId,g=FB(S,t,xE({primaryStore:Z,auditStore:z,audit:c,sealed:l,splitSegments:u,replicate:f,trackDeletes:d,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:R,tableName:t,tableId:Z.tableId,databasePath:r,databaseName:r,indices:{},attributes:o,schemaDefined:_,dbisDB:T})),g.schemaVersion=1,M=!0,T.put(ue,E)}let X=g.indices;T=T||(m.dbisDb=m.openDB(BE.INTERNAL_DBIS_NAME,N)),g.dbisDB=T;let W=[];for(let{key:z,value:fe}of T.getRange({start:!0})){let[ue,Z]=z.toString().split("/");if(Z===""&&(Z=fe.name),Z){if(ue!==t)continue}else continue;let Ae=o.find(ye=>ye.name===Z),me=!Ae?.indexed&&fe.indexed&&!fe.isPrimaryKey;if((!Ae||me)&&(se(),M=!0,Ae||T.remove(z),me)){let ye=g.indices[ue];ye&&W.push(ye)}}let $=[];try{for(let z of o||[]){if((z.relationship||z.computed)&&(M=!0,z.relationship))continue;let fe=t+"/"+(z.name||"");Object.defineProperty(z,"key",{value:fe,configurable:!0});let ue=T.get(fe);if(z.isPrimaryKey){if(ue=ue||T.get(fe=t+"/")||{},c!==void 0&&c!==g.audit||l!==void 0&&l!==g.sealed||f!==void 0&&f!==g.replicate||(+n||void 0)!==(+ue.expiration||void 0)||(+s||void 0)!==(+ue.eviction||void 0)||z.type!==ue.type){let Ae={...ue};typeof c=="boolean"&&(c&&g.enableAuditing(c),Ae.audit=c),n&&(Ae.expiration=+n),s&&(Ae.eviction=+s),l!==void 0&&(Ae.sealed=l),f!==void 0&&(Ae.replicate=f),z.type&&(Ae.type=z.type),M=!0,se(),T.put(fe,Ae)}continue}ue?.attribute&&!ue.name&&(ue.indexed=!0);let Z=!ue||ue.type!==z.type||ue.indexed!==z.indexed||ue.nullable!==z.nullable||ue.version!==z.version||JSON.stringify(ue.properties)!==JSON.stringify(z.properties)||JSON.stringify(ue.elements)!==JSON.stringify(z.elements);if(z.indexed){let Ae=new rl.default(!0,!1),me=m.openDB(fe,Ae);(Z||ue.indexingPID&&ue.indexingPID!==process.pid||ue.restartNumber<F_.workerData?.restartNumber)&&(M=!0,se(),ue=T.get(fe),(Z||ue.indexingPID&&ue.indexingPID!==process.pid||ue.restartNumber<F_.workerData?.restartNumber)&&(M=!0,z.indexNulls===void 0&&(z.indexNulls=!0),g.primaryStore.getStats().entryCount>0&&(z.lastIndexedKey=ue?.lastIndexedKey??void 0,z.indexingPID=process.pid,me.isIndexing=!0,Object.defineProperty(z,"dbi",{value:me}),$.push(z))),T.put(fe,z)),ue?.indexNulls&&z.indexNulls===void 0&&(z.indexNulls=!0),me.indexNulls=z.indexNulls,X[z.name]=me}else Z&&(M=!0,se(),T.put(fe,z))}}finally{H&&H()}if(M&&(g.schemaVersion++,g.updatedAttributes()),Ut.trace(`${t} table loading, running index`),$.length>0||W.length>0?g.indexingOperation=ote(g,$,W):M&&HE.signalSchemaChange(new kE.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=h,M)for(let z of B_)z(g,h!=="cluster");return(n||s||i)&&g.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),Ut.trace(`${t} table loaded`),g;function se(){H||m.transactionSync(()=>({then(z){H=z}}))}a(se,"startTxn")}async function ote(e,t,r){try{Ut.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await HE.signalSchemaChange(new kE.SchemaEventMsg(process.pid,"schema-change",e.databaseName,e.tableName));let s;for(let u of r)s=u.drop();let i,o={},c=0,l=t.length;if(await new Promise(u=>setImmediate(u)),l>0){let u;for(let d of t)(0,Pu.compareKeys)(d.lastIndexedKey,u)<0&&(u=d.lastIndexedKey),d.lastIndexedKey==null&&d.dbi.clearAsync();let f=0;for(let{key:d,value:_,version:h}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(_){if(f++,s=e.primaryStore.ifVersion(d,h,()=>{for(let m=0;m<l;m++){let S=t[m],g=S.name;try{let R=S.resolve,E=_&&(R?R(_):_[g]),T=(0,xB.getIndexedValues)(E);if(T)for(let N=0,M=T.length;N<M;N++)S.dbi.put(T[N],d)}catch(R){o[g]||(o[g]=!0,Ut.error(`Error indexing attribute ${g}`,R))}}}),s.then(()=>f--,m=>{f--,Ut.error(m)}),F_.workerData&&F_.workerData.restartNumber!==BB.restartNumber&&(i=!0),++c%100===0||i){for(let m of t)m.lastIndexedKey=d,e.dbisDB.put(m.key,m);if(i)return}f>ste?await s:f>ite&&await new Promise(m=>setImmediate(m))}for(let d of t)delete d.lastIndexedKey,delete d.indexingPID,d.dbi.isIndexing=!1,s=e.dbisDB.put(d.key,d)}await s,await HE.signalSchemaChange(new kE.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),Ut.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){Ut.error("Error in indexing",n)}}function ate({table:e,database:t}){let r=Su({database:t,table:e}),n=[],s=r.dbisDb;for(let i of s.getKeys({start:e+"/",end:e+"0"}))n.push(s.remove(i));return Promise.all(n)}function nl(e){return B_.push(e),{remove(){let t=B_.indexOf(e);t>-1&&B_.splice(t,1)}}}function G_(e){return H_.push(e),{remove(){let t=H_.indexOf(e);t>-1&&H_.splice(t,1)}}}function qE(){let e=(0,Qt.get)(x.STORAGE_COMPRESSION),t=(0,Qt.get)(x.STORAGE_COMPRESSION_DICTIONARY),r=(0,Qt.get)(x.STORAGE_COMPRESSION_THRESHOLD)||HB,n={startingOffset:32};return t&&(n.dictionary=k_.readFileSync(t)),r&&(n.threshold=r),e&&n}var Qt,BE,Pu,vt,jn,Iu,rl,Bb,k_,Hb,xB,HE,kE,F_,Ut,BB,kb,GE,HB,Jn,We,wu,B_,H_,FE,So,Cu,ste,ite,xe=Re(()=>{Qt=v(le()),BE=v(Ft()),Pu=require("lmdb"),vt=require("path"),jn=require("fs"),Iu=v(gt());Of();rl=v(Kf()),Bb=v(Yf());k();k_=v(require("fs-extra")),Hb=v(fi()),xB=v(un()),HE=v(uo()),kE=v(qs()),F_=require("worker_threads"),Ut=v(ee()),BB=v(it());Ai();cu();hn();kb="data",GE=Symbol("defined-tables"),HB=((0,Qt.get)(x.STORAGE_PAGESIZE)||4096)-60;(0,Qt.initSync)();Jn=Object.create(null),We=Object.create(null);(0,Hb._assignPackageExport)("databases",We);(0,Hb._assignPackageExport)("tables",Jn);wu=Symbol.for("next-table-id"),B_=[],H_=[],So=new Map;a(nte,"getTables");a(Je,"getDatabases");a(Du,"resetDatabases");a(x_,"readMetaDb");a(kB,"ensureDB");a(FB,"setTable");a(Su,"database");a(Ky,"dropDatabase");a(_t,"table");ste=1e3,ite=10;a(ote,"runIndexing");a(ate,"dropTableMeta");a(nl,"onUpdatedTable");a(G_,"onRemovedDB");a(qE,"getDefaultCompression")});var ie=C((Pwe,eH)=>{"use strict";var Ta=require("path"),KB=require("fs-extra"),bn=ee(),GB=require("fs-extra"),$E=require("os"),cte=require("net"),lte=require("recursive-iterator"),Er=(k(),P(q)),{PACKAGE_ROOT:ute}=Et(),dte=CA(),qB=require("papaparse"),VE=require("moment"),{inspect:fte}=require("util"),$B=require("is-number"),Cwe=require("lodash"),_te=require("minimist"),hte=require("https"),mte=require("http"),{hdb_errors:KE}=he(),pte=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,YB=require("util").promisify(setTimeout),Ete=100,gte=5,Ste="",Tte=4,VB={true:!0,TRUE:!0,FALSE:!1,false:!1,undefined:null,null:null,NULL:null,NaN:NaN};eH.exports={isEmpty:Xn,isEmptyOrZeroLength:Li,arrayHasEmptyValues:yte,arrayHasEmptyOrZeroLengthValues:bte,buildFolderPath:Ote,isBoolean:WB,errorizeMessage:Ate,stripFileExtension:wte,autoCast:Ite,autoCastJSON:zB,autoCastJSONDeep:Gb,removeDir:Cte,compareVersions:Pte,isCompatibleDataVersion:Dte,escapeRawValue:Lte,unescapeValue:Mte,stringifyProps:vte,timeoutPromise:xte,isClusterOperation:Hte,getClusterUser:Fte,checkGlobalSchemaTable:kte,getHomeDir:jB,getPropsFilePath:Ute,promisifyPapaParse:Gte,removeBOM:JB,createEventPromise:qte,checkProcessRunning:$te,checkSchemaTableExist:Vte,checkSchemaExists:XB,checkTableExists:ZB,getStartOfTomorrowInSeconds:Kte,getLimitKey:Yte,isObject:Nte,isNotEmptyAndHasValue:Rte,autoCasterIsNumberCheck:QB,backtickASTSchemaItems:Wte,isPortTaken:Bte,createForkArgs:zte,autoCastBoolean:Qte,async_set_timeout:YB,getTableHashAttribute:jte,doesSchemaExist:Jte,doesTableExist:Xte,stringifyObj:Zte,ms_to_time:ere,changeExtension:tre,getEnvCliRootPath:qb,noBootFile:rre,httpRequest:nre,transformReq:sre,convertToMS:ire,PACKAGE_ROOT:ute};function Ate(e){return e instanceof Error?e:new Error(e)}a(Ate,"errorizeMessage");function Xn(e){return e==null}a(Xn,"isEmpty");function Rte(e){return!Xn(e)&&(e||e===0||e===""||WB(e))}a(Rte,"isNotEmptyAndHasValue");function Li(e){return Xn(e)||e.length===0||e.size===0}a(Li,"isEmptyOrZeroLength");function yte(e){if(Xn(e))return!0;for(let t=0;t<e.length;t++)if(Xn(e[t]))return!0;return!1}a(yte,"arrayHasEmptyValues");function bte(e){if(Li(e))return!0;for(let t=0;t<e.length;t++)if(Li(e[t]))return!0;return!1}a(bte,"arrayHasEmptyOrZeroLengthValues");function Ote(...e){try{return e.join(Ta.sep)}catch{console.error(e)}}a(Ote,"buildFolderPath");function WB(e){return Xn(e)?!1:e===!0||e===!1}a(WB,"isBoolean");function Nte(e){return Xn(e)?!1:typeof e=="object"}a(Nte,"isObject");function wte(e){return Li(e)?Ste:e.slice(0,-Tte)}a(wte,"stripFileExtension");function Ite(e){return Xn(e)||e===""||typeof e!="string"?e:VB[e]!==void 0?VB[e]:QB(e)===!0?Number(e):pte.test(e)?new Date(e):e}a(Ite,"autoCast");function zB(e){if(typeof e=="string"&&(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]")))try{return JSON.parse(e)}catch{}return e}a(zB,"autoCastJSON");function Gb(e){if(e&&typeof e=="object"){if(Array.isArray(e))for(let t=0,r=e.length;t<r;t++){let n=e[t],s=Gb(n);s!==n&&(e[t]=s)}else for(let t in e){let r=e[t],n=Gb(r);n!==r&&(e[t]=n)}return e}else return zB(e)}a(Gb,"autoCastJSONDeep");function QB(e){if(e.startsWith("0.")&&$B(e))return!0;let t=e.toUpperCase().includes("E");return!!((e!=="0"&&e.startsWith("0"))===!1&&t===!1&&$B(e))}a(QB,"autoCasterIsNumberCheck");async function Cte(e){if(Li(e))throw new Error(`Directory path: ${e} does not exist`);try{await GB.emptyDir(e),await GB.remove(e)}catch(t){throw bn.error(`Error removing files in ${e} -- ${t}`),t}}a(Cte,"removeDir");function Pte(e,t){if(Li(e)){bn.info("Invalid current version sent as parameter.");return}if(Li(t)){bn.info("Invalid upgrade version sent as parameter.");return}let r,n=/(\.0+)+$/,s=e.version?e.version:e,i=t.version?t.version:t,o=s.replace(n,"").split("."),c=i.replace(n,"").split("."),l=Math.min(o.length,c.length);for(let u=0;u<l;u++)if(r=parseInt(o[u],10)-parseInt(c[u],10),r)return r;return o.length-c.length}a(Pte,"compareVersions");function Dte(e,t,r=!1){let n=e.toString().split("."),s=t.toString().split(".");return n[0]===s[0]&&(!r||n[1]===s[1])}a(Dte,"isCompatibleDataVersion");function Lte(e){if(Xn(e))return e;let t=String(e);return t==="."?Er.UNICODE_PERIOD:t===".."?Er.UNICODE_PERIOD+Er.UNICODE_PERIOD:t.replace(Er.FORWARD_SLASH_REGEX,Er.UNICODE_FORWARD_SLASH)}a(Lte,"escapeRawValue");function Mte(e){if(Xn(e))return e;let t=String(e);return t===Er.UNICODE_PERIOD?".":t===Er.UNICODE_PERIOD+Er.UNICODE_PERIOD?"..":String(e).replace(Er.ESCAPED_FORWARD_SLASH_REGEX,"/")}a(Mte,"unescapeValue");function vte(e,t){if(Xn(e))return bn.info("Properties object is null"),"";let r="";return e.each(function(n,s){try{if(t&&t[n]){let i=t[n];for(let o of i)r+=";"+o+$E.EOL}!Li(n)&&n[0]===";"?r+=" "+n+s+$E.EOL:Li(n)||(r+=n+"="+s+$E.EOL)}catch{bn.error(`Found bad property during upgrade with key ${n} and value: ${s}`)}}),r}a(vte,"stringifyProps");function jB(){let e;try{e=$E.homedir()}catch{e=process.env.HOME}return e}a(jB,"getHomeDir");function Ute(){let e=Ta.join(jB(),Er.HDB_HOME_DIR_NAME,Er.BOOT_PROPS_FILE_NAME);return KB.existsSync(e)||(e=Ta.join(__dirname,"../","hdb_boot_properties.file")),e}a(Ute,"getPropsFilePath");function xte(e,t){let r,n;return n=new Promise(function(s){r=setTimeout(function(){s(t)},e)}),{promise:n,cancel:a(function(){clearTimeout(r)},"cancel")}}a(xte,"timeoutPromise");async function Bte(e){if(!e)throw new Error("Invalid port passed as parameter");return new Promise((t,r)=>{let n=cte.createServer().once("error",s=>{s.code==="EADDRINUSE"?t(!0):r(s)}).once("listening",()=>n.once("close",()=>t(!1)).close()).listen(e)})}a(Bte,"isPortTaken");function Hte(e){try{return Er.CLUSTER_OPERATIONS[e.toLowerCase()]!==void 0}catch(t){bn.error(`Error checking operation against cluster ops ${t}`)}return!1}a(Hte,"isClusterOperation");function kte(e,t){let r=(xe(),P(ct)).getDatabases();if(!r[e])return KE.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e);if(!r[e][t])return KE.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(kte,"checkGlobalSchemaTable");function Fte(e,t){if(Xn(t)){bn.warn("No CLUSTERING_USER defined, clustering disabled");return}if(Xn(e)||Li(e)){bn.warn("No users to search.");return}let r;try{let n=e.get(t);n&&n.role.permission.cluster_user===!0&&n.active===!0&&(r=n)}catch(n){bn.error(`unable to find cluster_user due to: ${n.message}`);return}if(r===void 0){bn.warn(`CLUSTERING_USER: ${t} not found or is not active.`);return}return r}a(Fte,"getClusterUser");function Gte(){qB.parsePromise=function(e,t,r){return new Promise(function(n,s){qB.parse(e,{header:!0,transformHeader:JB,chunk:t.bind(null,s),skipEmptyLines:!0,transform:r,dynamicTyping:!1,error:s,complete:n})})}}a(Gte,"promisifyPapaParse");function JB(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return e.charCodeAt(0)===65279?e.slice(1):e}a(JB,"removeBOM");function qte(e,t,r){return new Promise(n=>{t.once(e,s=>{let i=r;bn.info(`Got cluster status event response: ${fte(s)}`);try{i.cancel()}catch{bn.error("Error trying to cancel timeout.")}n(s)})})}a(qte,"createEventPromise");async function $te(e){let t=!0,r=0;do await YB(Ete*r++),(await dte.findPs(e)).length>0&&(t=!1);while(t&&r<gte);if(t)throw new Error(`process ${e} was not started`)}a($te,"checkProcessRunning");function Vte(e,t){let r=XB(e);if(r)return r;let n=ZB(e,t);if(n)return n}a(Vte,"checkSchemaTableExist");function XB(e){let{getDatabases:t}=(xe(),P(ct));if(!t()[e])return KE.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(XB,"checkSchemaExists");function ZB(e,t){let{getDatabases:r}=(xe(),P(ct));if(!r()[e][t])return KE.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(ZB,"checkTableExists");function Kte(){let e=VE().utc().add(1,"d").startOf("d").unix(),t=VE().utc().unix();return e-t}a(Kte,"getStartOfTomorrowInSeconds");function Yte(){return VE().utc().format("DD-MM-YYYY")}a(Yte,"getLimitKey");function Wte(e){try{let t=new lte(e);for(let{node:r}of t)r&&(r.columnid&&typeof r.columnid!="string"&&(r.columnid=r.columnid.toString()),r.columnid&&!r.columnid.startsWith("`")&&(r.columnid_orig=r.columnid,r.columnid=`\`${r.columnid}\``),r.tableid&&!r.tableid.startsWith("`")&&(r.tableid_orig=r.tableid,r.tableid=`\`${r.tableid}\``),r.databaseid&&!r.databaseid.startsWith("`")&&(r.databaseid_orig=r.databaseid,r.databaseid=`\`${r.databaseid}\``),r.as&&typeof r.as=="string"&&!r.as.startsWith("[")&&(r.as_orig=r.as,r.as=`\`${r.as}\``))}catch(t){bn.error("Got an error back ticking items."),bn.error(t)}}a(Wte,"backtickASTSchemaItems");function zte(e){return[e]}a(zte,"createForkArgs");function Qte(e){return e===!0||typeof e=="string"&&e.toLowerCase()==="true"}a(Qte,"autoCastBoolean");function jte(e,t){let{getDatabases:r}=(xe(),P(ct)),n=r()[e]?.[t];return n?.primaryKey||n?.hash_attribute}a(jte,"getTableHashAttribute");function Jte(e){let{getDatabases:t}=(xe(),P(ct));return t()[e]!==void 0}a(Jte,"doesSchemaExist");function Xte(e,t){let{getDatabases:r}=(xe(),P(ct));return r()[e]?.[t]!==void 0}a(Xte,"doesTableExist");function Zte(e){try{return JSON.stringify(e)}catch{return e}}a(Zte,"stringifyObj");function ere(e){let t=VE.duration(e),r=t.seconds()>0?t.seconds()+"s":"",n=t.minutes()>0?t.minutes()+"m ":"",s=t.hours()>0?t.hours()+"h ":"",i=t.days()>0?t.days()+"d ":"";return(t.years()>0?t.years()+"y ":"")+i+s+n+r}a(ere,"ms_to_time");function tre(e,t){let r=Ta.basename(e,Ta.extname(e));return Ta.join(Ta.dirname(e),r+t)}a(tre,"changeExtension");function qb(){if(process.env[Er.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return process.env[Er.CONFIG_PARAMS.ROOTPATH.toUpperCase()];let e=_te(process.argv);if(e[Er.CONFIG_PARAMS.ROOTPATH.toUpperCase()])return e[Er.CONFIG_PARAMS.ROOTPATH.toUpperCase()]}a(qb,"getEnvCliRootPath");var Fb;function rre(){if(Fb)return Fb;let e=qb();if(qb()&&KB.pathExistsSync(Ta.join(e,Er.HDB_CONFIG_FILE)))return Fb=!0,!0}a(rre,"noBootFile");function nre(e,t){let r;return e.protocol==="http:"?r=mte:r=hte,new Promise((n,s)=>{let i=r.request(e,o=>{o.setEncoding("utf8"),o.body="",o.on("data",c=>{o.body+=c}),o.on("end",()=>{n(o)})});i.on("error",o=>{s(o)}),i.write(t instanceof Buffer?t:JSON.stringify(t)),i.end()})}a(nre,"httpRequest");function sre(e){if(!e.schema&&!e.database){e.schema=Er.DEFAULT_DATABASE_NAME;return}e.database&&(e.schema=e.database)}a(sre,"transformReq");function ire(e){let t=0;if(typeof e=="number"&&(t=e),typeof e=="string")switch(t=parseFloat(e),e.slice(-1)){case"M":t*=86400*30;break;case"D":case"d":t*=86400;break;case"H":case"h":t*=3600;break;case"m":t*=60;break}return t*1e3}a(ire,"convertToMS")});var le=C((sH,iH)=>{"use strict";var $b=require("fs-extra"),sl=require("path"),tH=require("os"),ore=require("properties-reader"),$_=ee(),q_=ie(),Le=(k(),P(q)),YE=Lt(),are="Error initializing environment manager",WE="BOOT_PROPS_FILE_PATH",rH=!1,cre={[Le.HDB_SETTINGS_NAMES.INSTALL_USER]:!0,[Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY]:!0,[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]:!0,BOOT_PROPS_FILE_PATH:!0},To={};Object.assign(sH,iH.exports={BOOT_PROPS_FILE_PATH:WE,getHdbBasePath:lre,setHdbBasePath:ure,get:nH,initSync:fre,setProperty:ze,initTestEnvironment:_re});function lre(){return To[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]}a(lre,"getHdbBasePath");function ure(e){To[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]=e}a(ure,"setHdbBasePath");function nH(e){let t=YE.getConfigValue(e);return t===void 0?To[e]:t}a(nH,"get");function ze(e,t){cre[e]&&(To[e]=t),YE.updateConfigObject(e,t)}a(ze,"setProperty");function dre(){let e;try{e=q_.getPropsFilePath(),$b.accessSync(e,$b.constants.F_OK|$b.constants.R_OK),rH=!0;let t=ore(e);return To[Le.HDB_SETTINGS_NAMES.INSTALL_USER]=t.get(Le.HDB_SETTINGS_NAMES.INSTALL_USER),To[Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY]=t.get(Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY),To[WE]=e,!0}catch{return $_.trace(`Environment manager found no properties file at ${e}`),!1}}a(dre,"doesPropFileExist");function fre(e=!1){try{(rH||dre()||q_.noBootFile()||e)&&(YE.initConfig(e),To[Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]=YE.getConfigValue(Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY))}catch(t){$_.error(are),$_.error(t),console.error(t),process.exit(1)}}a(fre,"initSync");function _re(e={}){try{let{keep_alive_timeout:t,headers_timeout:r,server_timeout:n,https_enabled:s,cors_enabled:i,cors_accesslist:o,local_studio_on:c}=e,l=sl.join(__dirname,"../../","unitTests");To[WE]=sl.join(l,"hdb_boot_properties.file"),ze(Le.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY,sl.join(l,"settings.test")),ze(Le.HDB_SETTINGS_NAMES.INSTALL_USER,tH.userInfo()?tH.userInfo().username:void 0),ze(Le.HDB_SETTINGS_NAMES.LOG_LEVEL_KEY,"debug"),ze(Le.HDB_SETTINGS_NAMES.LOG_PATH_KEY,sl.join(l,"envDir","log")),ze(Le.HDB_SETTINGS_NAMES.LOG_DAILY_ROTATE_KEY,!1),ze(Le.HDB_SETTINGS_NAMES.CLUSTERING_ENABLED_KEY,!0),ze(Le.HDB_SETTINGS_NAMES.CLUSTERING_NODE_NAME_KEY,"1231412de213"),ze(Le.HDB_SETTINGS_NAMES.HDB_ROOT_KEY,sl.join(l,"envDir")),ze(Le.CONFIG_PARAMS.STORAGE_PATH,sl.join(l,"envDir")),s&&(ze(Le.CONFIG_PARAMS.HTTP_SECUREPORT,nH(Le.CONFIG_PARAMS.HTTP_PORT)),ze(Le.CONFIG_PARAMS.HTTP_PORT,null)),ze(Le.CONFIG_PARAMS.CUSTOMFUNCTIONS_NETWORK_HTTPS,!!s),ze(Le.CONFIG_PARAMS.HTTP_PORT,9926),ze(Le.HDB_SETTINGS_NAMES.SERVER_PORT_KEY,9925),ze(Le.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT,9925),ze(Le.HDB_SETTINGS_NAMES.CORS_ENABLED_KEY,q_.isEmpty(i)?!1:i),ze(Le.CONFIG_PARAMS.HTTP_CORS,q_.isEmpty(i)?!1:i),ze(Le.HDB_SETTINGS_NAMES.MAX_CUSTOM_FUNCTION_PROCESSES,2),ze(Le.HDB_SETTINGS_NAMES.MAX_HDB_PROCESSES,4),ze(Le.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_PORT_KEY,9926),ze(Le.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_ENABLED_KEY,!0),ze(Le.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_DIRECTORY_KEY,sl.resolve(__dirname,"../../unitTests/server/fastifyRoutes/custom_functions")),ze(Le.HDB_SETTINGS_NAMES.LOCAL_STUDIO_ON,q_.isEmpty(c)?!1:c),o&&(ze("CORS_ACCESSLIST",o),ze(Le.CONFIG_PARAMS.HTTP_CORSACCESSLIST,o)),n&&(ze(Le.HDB_SETTINGS_NAMES.SERVER_TIMEOUT_KEY,n),ze(Le.CONFIG_PARAMS.HTTP_TIMEOUT,n)),t&&(ze(Le.HDB_SETTINGS_NAMES.SERVER_KEEP_ALIVE_TIMEOUT_KEY,t),ze(Le.CONFIG_PARAMS.HTTP_KEEPALIVETIMEOUT,t)),r&&(ze(Le.HDB_SETTINGS_NAMES.SERVER_HEADERS_TIMEOUT_KEY,r),ze(Le.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT,r))}catch(t){let r=`Error reading in HDB environment variables from path ${WE}. Please check your boot props and settings files`;$_.fatal(r),$_.error(t)}}a(_re,"initTestEnvironment")});var Yb={};Ue(Yb,{loadGQLSchema:()=>pre,start:()=>Kb,startOnMainThread:()=>mre});function Kb({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r,n,s,i){let{parse:o,Source:c,Kind:l,NamedTypeNode:u,StringValueNode:f}=await import("graphql"),d=o(new c(r.toString(),s)),_=new Map,h=[],m;for(let R of d.definitions)switch(R.kind){case l.OBJECT_TYPE_DEFINITION:let H=function(W){if(W.kind==="NonNullType"){let z=H(W.type);return z.nullable=!1,z}if(W.kind==="ListType")return{type:"array",elements:H(W.type)};let se={type:W.name?.value};return Object.defineProperty(se,"location",{value:W.loc.startToken}),se};a(H,"getProperty");let E=R.name.value,T=[],N={table:null,database:null,properties:T};_.set(E,N);for(let W of R.directives){if(W.name.value==="table"){for(let se of W.arguments)N[se.name.value]=se.value.value;N.schema&&(N.database=N.schema),N.table||(N.table=E),N.audit&&(N.audit=N.audit!=="false"),N.attributes=N.properties,h.push(N)}if(W.name.value==="sealed"&&(N.sealed=!0),W.name.value==="splitSegments"&&(N.splitSegments=!0),W.name.value==="replicate"&&(N.replicate=!0),W.name.value==="export"){N.export=!0;for(let se of W.arguments)typeof N.export!="object"&&(N.export={}),N.export[se.name.value]=se.value.value}}let M=!1,X={};for(let W of R.fields){let $=H(W.type);$.name=W.name.value,T.push($),X[$.name]=void 0;for(let se of W.directives){let z=se.name.value;if(z==="primaryKey")M?console.warn("Can not define two attributes as a primary key at",se.loc):($.isPrimaryKey=!0,M=!0);else if(z==="indexed")$.indexed=!0;else if(z==="computed"){for(let fe of se.arguments||[])if(fe.name.value==="from"){let ue=fe.value.value;$.computed={from:g(ue,fe,X)},$.version==null&&($.version=ue)}else fe.name.value==="version"&&($.version=fe.value.value);$.computed=$.computed||!0}else if(z==="relationship"){let fe={};for(let ue of se.arguments)fe[ue.name.value]=ue.value.value;$.relationship=fe}else if(z==="createdTime")$.assignCreatedTime=!0;else if(z==="updatedTime")$.assignUpdatedTime=!0;else if(z==="expiresAt")$.expiresAt=!0;else if(z==="allow"){let fe=$.authorizedRoles=[];for(let ue of se.arguments)ue.name.value==="role"&&fe.push(ue.value.value)}else server.knownGraphQLDirectives.includes(z)&&console.warn(`@${z} is an unknown directive, at`,se.loc)}}N.type=E,E==="Query"&&(m=N)}function S(R){let E=_.get(R.type);E?(Object.defineProperty(R,"properties",{value:E.properties}),Object.defineProperty(R,"definition",{value:E})):R.type==="array"?S(R.elements):hre.includes(R.type)||(0,aH.getWorkerIndex)()===0&&console.error(`The type ${R.type} is unknown at line ${R.location.line}, column ${R.location.column}, in ${s}`)}a(S,"connectPropertyType");for(let R of _.values())for(let E of R.properties)S(E);for(let R of h)R.tableClass=e(R),R.export&&(R.export.name===""?i.set((0,Vb.dirname)(n),R.tableClass):i.set((0,Vb.dirname)(n)+"/"+(R.export.name||R.type),R.tableClass,R.export));function g(R,E,T){return new oH.Script(`function computed(attributes) { return function(record) { with(attributes) { with (record) { return ${R}; } } } } computed;`,{filename:s,lineOffset:E.loc.startToken.line-1,columnOffset:E.loc.startToken.column}).runInThisContext()(T)}a(g,"createComputedFrom")}}var Vb,oH,aH,hre,mre,pre,cH=Re(()=>{Vb=require("path"),oH=require("node:vm");xe();aH=v(it()),hre=["ID","Int","Float","Long","String","Boolean","Date","Bytes","Any","BigInt","Blob"];server.knownGraphQLDirectives&&(server.knownGraphQLDirectives=["table","sealed","export","primaryKey","indexed","computed","relationship","createdTime","updatedTime","expiresAt","allow"]);a(Kb,"start");mre=Kb,pre=Kb({ensureTable:_t}).handleFile});var zb={};Ue(zb,{start:()=>Ore});function Ere(e){if(e.kind!==Me.Kind.OPERATION_DEFINITION&&e.kind!==Me.Kind.FRAGMENT_DEFINITION)throw new wr(`Unexpected non-executable definition type ${e.kind}.`)}function lH(e){if(typeof e!="object"||e===null)throw new Mi("Request body must be an object.");if(!("query"in e))throw new Mi("Request body must contain a `query` field.");if(typeof e.query!="string")throw new Mi("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new Mi("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new Mi("Request body `operationName` field must be a string.")}function Wb(e){return parseInt(e.value,10)}function dH(e){return parseFloat(e.value)}function fH(e,t,r){let n=r.get(e.name.value);return _H(n)?hH(n,t):{attribute:t,value:n}}function _H(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function hH(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],_H(n)?hH(n,t):{attribute:t,value:n}))}function gre(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case Me.Kind.NULL:return{attribute:t,value:null};case Me.Kind.INT:return{attribute:t,value:Wb(e.value)};case Me.Kind.FLOAT:return{attribute:t,value:dH(e.value)};case Me.Kind.BOOLEAN:case Me.Kind.STRING:return{attribute:t,value:e.value.value};case Me.Kind.VARIABLE:return fH(e.value,t,r);case Me.Kind.OBJECT:return mH(e.value,t,r);case Me.Kind.LIST:case Me.Kind.ENUM:default:throw new wr(`Value type, ${e.value.kind}, is not supported.`)}}function mH(e,t,r){return e.fields.flatMap(n=>gre(n,t,r))}function Sre(e,t){switch(e.value.kind){case Me.Kind.NULL:return{attribute:e.name.value,value:null};case Me.Kind.INT:return{attribute:e.name.value,value:Wb(e.value)};case Me.Kind.FLOAT:return{attribute:e.name.value,value:dH(e.value)};case Me.Kind.BOOLEAN:case Me.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case Me.Kind.VARIABLE:return fH(e.value,e.name.value,t);case Me.Kind.OBJECT:return mH(e.value,[e.name.value],t);case Me.Kind.LIST:case Me.Kind.ENUM:default:throw new wr(`Argument type, ${e.value.kind}, is not supported.`)}}function Tre(e,t){return e.flatMap(r=>Sre(r,t))}function zE(e,t){return e.selections.flatMap(r=>{switch(r.kind){case Me.Kind.FIELD:return r;case Me.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new wr(`Fragment \`${n}\` not found.`);return zE(s.selectionSet,t)}case Me.Kind.INLINE_FRAGMENT:return zE(r.selectionSet,t)}})}function pH(e,t){return zE(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:pH(r.selectionSet,t)}:r.name.value)}async function Are(e,t,r,n){let s=fs.getMatch(e.name.value,"graphql");if(s===void 0)throw new wr(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,o={select:pH(e.selectionSet,r),conditions:Tre(e.arguments,t)},c=[];n.authorize=!0;for await(let l of i.search(o,n))c.push(l);return[e.name.value,c]}function EH(e){switch(e.kind){case Me.Kind.NULL:return null;case Me.Kind.INT:return Wb(e);case Me.Kind.FLOAT:return parseFloat(e.value);case Me.Kind.STRING:case Me.Kind.BOOLEAN:return e.value;case Me.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:EH(r.value),...t}),{});case Me.Kind.LIST:case Me.Kind.ENUM:default:throw new wr(`Value type, ${e.kind}, is not supported.`)}}function Rre(e,t){let r=new Map;for(let n of e){let s=n.variable.name.value,i=t?.[s];if(i===void 0&&n.defaultValue!==void 0&&(i=EH(n.defaultValue)),n.type.kind===Me.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new wr(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function yre(e,t,r,n){if(e.operation===Me.OperationTypeNode.SUBSCRIPTION)throw new wr("Subscriptions are not supported.");if(e.operation===Me.OperationTypeNode.MUTATION)throw new wr("Mutations are not supported yet.");let s=Rre(e.variableDefinitions,t),i=await Promise.all(zE(e.selectionSet,r).map(c=>Are(c,s,r,n))),o={data:{}};for(let[c,l]of i)o.data[c]=l;return o}async function uH({query:e,variables:t={},operationName:r},n){let s=Me.parse(e),i=new Map,o=new Map;for(let u of s.definitions)if(Ere(u),u.kind===Me.Kind.FRAGMENT_DEFINITION)o.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new wr("Unnamed operations are only allowed when there is a single operation in the document.");let f=u.name?.value??"Unnamed Query";if(i.has(f))throw new wr(`Duplicate operation definition: ${f}`);i.set(f,u)}let c;if(r==null)if(i.size===1)c=i.entries().next().value[1];else throw new wr("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new wr(`Operation \`${r}\` not found.`);let l=await yre(c,t,o,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function bre(e){switch(e.method){case"GET":{let t=new URLSearchParams(e.url.split("?")[1]),r={};for(let[n,s]of t)r[n]=n==="variables"||n==="extensions"?JSON.parse(s):s;return lH(r),uH(r,e)}case"POST":{let r=await no(e.headers.get("content-type"),!0)(e._nodeRequest);return lH(r),uH(r,e)}default:throw new Mi("Method Not Allowed",405,{Allow:"GET, POST"})}}function Ore(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await bre(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof Mi)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof Me.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof wr)return{status:200,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};break}default:logger.info(`Unsupported accept header, ${s}, defaulting to application/graphql-response+json`);case"application/graphql-response+json":{if(n instanceof Mi)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof Me.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof wr)return{status:400,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};break}}throw n}},{port:e.port,securePort:e.securePort})}var Me,wr,Mi,gH=Re(()=>{Me=v(require("graphql"));so();tu();a(Ere,"assertExecutableDefinitionNode");a(lH,"assertRequestParams");a(Wb,"processIntValueNode");a(dH,"processFloatValueNode");a(fH,"processVariableNode");a(_H,"isObject");a(hH,"transformObjectIntoQueryCondition");a(gre,"processObjectFieldNode");a(mH,"processObjectValueNode");a(Sre,"processArgumentNode");a(Tre,"buildConditionsQuery");a(zE,"fillInFragments");a(pH,"buildSelectQuery");a(Are,"processFieldNode");a(EH,"processConstValueNode");a(Rre,"resolveVariables");a(yre,"executeOperation");a(uH,"resolver");wr=class extends Error{static{a(this,"GraphQLQueryingError")}},Mi=class extends Error{static{a(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};a(bre,"graphqlQueryingHandler");a(Ore,"start")});var bH=C((Hwe,yH)=>{var Lu=require("validate.js"),TH=ot(),Mu=(k(),P(q)),{handleHDBError:Nre,hdb_errors:wre}=he(),{HDB_ERROR_MSGS:jt,HTTP_STATUS_CODES:Ire}=wre,Qb=a(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Cre={STRUCTURE_USER:"structure_user"},SH=Object.values(Mu.ROLE_TYPES_ENUM),Pre="attribute_permissions",Dre="attribute_name",{PERMS_CRUD_ENUM:vu}=Mu,Lre=[Pre,...Object.values(vu)],AH=[vu.READ,vu.INSERT,vu.UPDATE],Mre=[Dre,...AH];function vre(e){let t=Qb();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,RH(e,t)}a(vre,"addRoleValidation");function Ure(e){let t=Qb();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,RH(e,t)}a(Ure,"alterRoleValidation");function xre(e){let t=Qb();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,TH.validateObject(e,t)}a(xre,"dropRoleValidation");var Bre=["operation","role","id","permission","hdb_user","access"];function RH(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let o=0,c=n.length;o<c;o++)Bre.includes(n[o])||s.push(n[o]);s.length>0&&nr(jt.INVALID_ROLE_JSON_KEYS(s),r);let i=TH.validateObject(e,t);if(i&&i.message.split(",").forEach(o=>{nr(o,r)}),e.permission){let o=Hre(e);o&&nr(o,r),SH.forEach(c=>{e.permission[c]&&!Lu.isBoolean(e.permission[c])&&nr(jt.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let o in e.permission)if(SH.indexOf(o)<0){if(o===Cre.STRUCTURE_USER){let l=e.permission[o];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,f=l.length;u<f;u++){let d=l[u];global.hdb_schema[d]||nr(jt.SCHEMA_NOT_FOUND(d),r)}continue}nr(jt.STRUCTURE_USER_ROLE_TYPE_ERROR(o),r);continue}let c=e.permission[o];if(!o||!global.hdb_schema[o]){nr(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]){nr(jt.TABLE_NOT_FOUND(o,l),r);continue}if(Object.keys(u).forEach(f=>{Lre.includes(f)||nr(jt.INVALID_PERM_KEY(f),r,o,l)}),Object.values(vu).forEach(f=>{Lu.isDefined(u[f])?Lu.isBoolean(u[f])||nr(jt.TABLE_PERM_NOT_BOOLEAN(f),r,o,l):nr(jt.TABLE_PERM_MISSING(f),r,o,l)}),u.attribute_permissions===void 0){nr(jt.ATTR_PERMS_ARRAY_MISSING,r,o,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){nr(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=>{!Mre.includes(S)&&S!==vu.DELETE&&nr(jt.INVALID_ATTR_PERM_KEY(S),r,o,l)}),!Lu.isDefined(h.attribute_name)){nr(jt.ATTR_PERM_MISSING_NAME,r,o,l);continue}let m=h.attribute_name;if(!f.includes(m)){nr(jt.INVALID_ATTRIBUTE_IN_PERMS(m),r,o,l);continue}AH.forEach(S=>{Lu.isDefined(h[S])?Lu.isBoolean(h[S])||nr(jt.ATTR_PERM_NOT_BOOLEAN(S,m),r,o,l):nr(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}`;nr(jt.MISMATCHED_TABLE_ATTR_PERMS(_),r,o,l)}}}}return kre(r)}a(RH,"customValidate");yH.exports={addRoleValidation:vre,alterRoleValidation:Ure,dropRoleValidation:xre};function Hre(e){let{operation:t,permission:r}=e;if(t===Mu.OPERATIONS_ENUM.ADD_ROLE||t===Mu.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?Mu.ROLE_TYPES_ENUM.SUPER_USER:Mu.ROLE_TYPES_ENUM.CLUSTER_USER;return jt.SU_CU_ROLE_NO_PERMS_ALLOWED(o)}}}return null}a(Hre,"validateNoSUPerms");function kre(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 Nre(new Error,n,Ire.BAD_REQUEST)}else return null}a(kre,"generateRolePermResponse");function nr(e,t,r,n){if(!r)t.main_permissions.push(e);else{let s=n?r+"_"+n:r;t.schema_permissions[s]?t.schema_permissions[s].push(e):t.schema_permissions[s]=[e]}}a(nr,"addPermError")});var K_=C((Gwe,IH)=>{"use strict";var OH=Rn(),NH=zr(),Fre=Yc(),Jb=bH(),Xb=uo(),Fwe=require("uuid").v4,Gre=require("util"),QE=(k(),P(q)),qre=ie(),Zb=NH.searchByValue,$re=NH.searchByHash,Vre=Gre.promisify(Fre.delete),Kre=$s(),Yre=pu(),{hdb_errors:Wre,handleHDBError:il}=he(),{HDB_ERROR_MSGS:wH,HTTP_STATUS_CODES:V_}=Wre,{UserEventMsg:eO}=qs();IH.exports={addRole:zre,alterRole:Qre,dropRole:jre,listRoles:Jre};function jb(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(jb,"scrubRoleDetails");async function zre(e){let t=Jb.addRoleValidation(e);if(t)throw t;e=jb(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 Zb(r)||[])}catch(i){throw il(i)}if(n&&n.length>0)throw il(new Error,wH.ROLE_ALREADY_EXISTS(e.role),V_.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 OH.insert(s),Xb.signalUserChange(new eO(process.pid)),e=jb(e),e}a(zre,"addRole");async function Qre(e){let t=Jb.alterRoleValidation(e);if(t)throw t;e=jb(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await OH.update(r)}catch(s){throw il(s)}if(n&&n?.message==="updated 0 of 1 records")throw il(new Error,"Invalid role id",V_.BAD_REQUEST,void 0,void 0,!0);return await Xb.signalUserChange(new eO(process.pid)),e}a(Qre,"alterRole");async function jre(e){let t=Jb.dropRoleValidation(e);if(t)throw il(new Error,t,V_.BAD_REQUEST,void 0,void 0,!0);let r=new Yre(QE.SYSTEM_SCHEMA_NAME,QE.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await $re(r));if(n.length===0)throw il(new Error,wH.ROLE_NOT_FOUND,V_.NOT_FOUND,void 0,void 0,!0);let s=new Kre(QE.SYSTEM_SCHEMA_NAME,QE.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await Zb(s)),o=!1;if(qre.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){o=!0;break}}if(o===!0)throw il(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,V_.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Vre(c),Xb.signalUserChange(new eO(process.pid)),`${n[0].role} successfully deleted`}a(jre,"dropRole");async function Jre(){return Zb({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}a(Jre,"listRoles")});var tO={};Ue(tO,{start:()=>DH,startOnMainThread:()=>ene});function DH({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,CH.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(Xre.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 Zre(i)}}}async function Zre(e){let t=Je().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,PH.isEqual)(i,e)?void 0:(e.id=r.id,(0,jE.alterRole)(e))}return(0,jE.addRole)(e)}var jE,CH,PH,Xre,ene,LH=Re(()=>{xe();jE=v(K_()),CH=require("yaml"),PH=require("lodash"),Xre=["super_user","cluster_user","structure_user"];a(DH,"start");a(Zre,"ensureRole");ene=DH});async function JE(e){let t=(0,UH.pathToFileURL)(e).toString();if(tne)return Y_||(Y_=rne(sne)),(await(await Y_).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function rne(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),Y_=new Compartment({console,Math,Date,fetch:nne,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,vH.extname)(r)||(r+=".js"),r)},importHook:a(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){Object.assign(s,{Resource:Kr,tables:Jn,databases:We})}};let n=await(0,MH.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),Y_}function nne(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 sne(){return{Resource:Kr,tables:Jn}}var MH,vH,UH,tne,Y_,rO=Re(()=>{na();xe();MH=require("fs/promises"),vH=require("path"),UH=require("url"),tne=!1;a(JE,"secureImport");a(rne,"getCompartment");a(nne,"secureOnlyFetch");a(sne,"getGlobalVars")});var sO={};Ue(sO,{handleFile:()=>ine});async function ine(e,t,r,n){let s=new Map,i=await JE(r);c(i.default)&&n.set((0,nO.dirname)(t),i.default),o(i,(0,nO.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 nO,xH=Re(()=>{rO();nO=require("path");a(ine,"handleFile")});var oO={};Ue(oO,{start:()=>one});function one({resources:e}){e.set("login",iO),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var iO,BH=Re(()=>{na();a(one,"start");iO=class extends Kr{static{a(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:o}=r;return{data:await n.login(s,i)}}}});function qH(e){let t={openapi:ane,info:{title:"HarperDB HTTP REST interface",version:GH.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}];for(let[,n]of e){if(!n.path||n.Resource.isError)continue;let{path:s}=n,i=s.split("/").slice(-1),{attributes:o,primaryKey:c,prototype:l}=n.Resource;if(c=c??"id",!c)continue;let u={},f=[];if(o)for(let{type:T,name:N,elements:M,relationship:H,definition:X}of o){if(H)T==="array"?u[N]={type:"array",items:{$ref:Aa+M.type}}:u[N]={$ref:Aa+T};else{let W=X??M?.definition;if(W){if(!t.components.schemas[W.type]){let $={};W.properties.forEach(se=>{$[se.name]=new uO(aO[se.type],se.type)}),t.components.schemas[W.type]=new FH($)}T==="array"?u[N]={type:"array",items:{$ref:Aa+W.type}}:u[N]={$ref:Aa+W.type}}else T==="array"?M.type==="Any"||M.type=="ID"?u[N]={type:"array",items:{format:M.type}}:u[N]={type:"array",items:new uO(aO[M.type],M.type)}:T==="Any"||T=="ID"?u[N]={format:T}:u[N]=new uO(aO[T],T)}f.push(new dO(N,"query",u[N]))}let d=Object.keys(u),_=new dO(c,"path",{format:"ID"});_.required=!0,_.description="primary key of record";let h=new dO("property","path",{enum:d});h.required=!0,t.components.schemas[i]=new FH(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 cne(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[E]||(t.paths[E]={}),t.paths[E].get=new cO(f,r,{200:new lO({$ref:Aa+i})},"search for records by the specified property name and value pairs")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new kH(f,r,"delete all the records that match the provided query",{204:new HH})),E="/"+s+"/{"+c+"}",g&&(t.paths[E]={},t.paths[E].get=new cO([_],r,{200:new lO({$ref:Aa+i})},"retrieve a record by its primary key")),S&&(t.paths[E]||(t.paths[E]={}),t.paths[E].put=new lne([_],r,i,"create or update the record with the URL path that maps to the record's primary key")),R&&(t.paths[E]||(t.paths[E]={}),t.paths[E].delete=new kH([_],r,"delete a record with the given primary key",{204:new HH})),g&&h.schema.enum.length>0&&(E="/"+s+"/{"+c+"}.{property}",t.paths[E]={},t.paths[E].get=new cO([_,h],r,{200:new lO({enum:d})},"used to retrieve the specified property of the specified record"))}return t}function cne(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:Aa+e}}}},this.security=t,this.responses={200:{description:fO,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function cO(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function lO(e){this.description=fO,this.content={"application/json":{schema:e}}}function HH(){this.description="successfully processed request, no content returned to client"}function lne(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Aa+r}}}},this.responses={200:{description:fO}}}function kH(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function FH(e){this.type="object",this.properties=e}function uO(e,t){this.type=e,this.format=t}function dO(e,t,r){this.name=e,this.in=t,this.schema=r}var GH,ane,aO,Aa,fO,$H=Re(()=>{GH=v(Et()),ane="3.0.3",aO={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},Aa="#/components/schemas/",fO="successful operation";a(qH,"generateJsonApi");a(cne,"Post");a(cO,"Get");a(lO,"Response200");a(HH,"Response204");a(lne,"Put");a(kH,"Delete");a(FH,"ResourceSchema");a(uO,"Type");a(dO,"Parameter")});var KH={};Ue(KH,{Request:()=>W_,createReuseportFd:()=>XE});var VH,W_,_O,hO,XE,ZE=Re(()=>{VH=require("os"),W_=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 hO(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 _O(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)}},_O=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)}},hO=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,VH.platform)()!="win32"&&(XE=require("node-unix-socket").createReuseportFd)});var tg={};Ue(tg,{parseHeaderValue:()=>pO,start:()=>fne});async function dne(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&ep(e);let i=new go;try{e.responseHeaders=i;let o=e.url.slice(1),c,l;if(o!==YH){let g=eg.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=pO(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=pO(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=no(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new Uu.ClientError(g,400)}if(e.authorize=!0,o===YH&&s==="GET"){if(e?.user?.role?.permission?.super_user)return qH(eg);throw new Uu.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 Uu.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new Uu.ServerError(`Method ${s} is not recognized`,501)}}),_=200,h;if(d==null)_=s==="GET"||s==="HEAD"?404:204,mO.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(d.status>0&&d.headers){let g=Mb(d.headers,i);return d.headers!==g&&(d.headers=g),d.data!==void 0&&(d.body=Pf(d.data,e,d)),d}else if(h=e.lastModified){une[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),mO.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=Pf(d,e,m),s==="HEAD"&&(m.body=void 0)),m}catch(o){o.statusCode?o.statusCode===500?vi.warn(o):vi.info(o):vi.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=Pf(o.contentType?o:o.toString(),e,c),c}}function fne(e){mO=e,e.includeExpensiveRecordCountEstimates&&(W_.prototype.includeExpensiveRecordCountEstimates=!0),!WH&&(WH=!0,eg=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return dne(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{z_++;let s=new xn;zH||(zH=!0,P_(l=>{z_>0&&l.push({metric:"ws-connections",connections:z_,byThread:!0})}));let i;t.on("error",l=>{i=!0,vi.warn(l)});let o;t.on("message",a(function(u){o||(o=no(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",()=>{z_--,Qn(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=eg.getMatch(l,"ws");if(Qn(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,Mt(m=>({count:m.count,total:z_}),"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 ia(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?vi.warn(l):vi.info(l):vi.error(l),t.close(_ne[l.statusCode]||1011,l.toString())}t.close()},e))}function pO(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 vi,Uu,Br,une,mO,YH,WH,eg,zH,z_,_ne,QH=Re(()=>{so();Di();vi=v(ee()),Uu=v(he());bf();Ql();mc();L_();$H();bf();ZE();Br=new Uint8Array(8),une=new Float64Array(Br.buffer,0,1),mO={},YH="openapi";a(dne,"http");z_=0;a(fne,"start");_ne={401:3e3,403:3003};a(pO,"parseHeaderValue")});var EO=C((_Ie,JH)=>{var{recordAction:rg,recordActionBinary:jH}=(Di(),P(D_)),hne=require("fastify-plugin"),mne=200;JH.exports=hne(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),rg(o,"duration",u,d,f),jH(s.raw.statusCode<400,"success",u,d,f),jH(1,"response_"+s.raw.statusCode,u,d,f);let _=mne;i?.pipe?(i.on("data",g=>{_+=g.length}),i.on("end",()=>{rg(performance.now()-c,"transfer",u,d,f),rg(_,"bytes-sent",u,d,f)})):(_+=i?.length||0,rg(_,"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 ZH=C((hIe,XH)=>{var pne=ot(),Ene={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};XH.exports=function(e){return pne.validateObject(e,Ene)}});var ng=C((mIe,ek)=>{"use strict";var gne=(k(),P(q)).OPERATIONS_ENUM,gO=class{static{a(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=gne.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};ek.exports=gO});var J_={};Ue(J_,{createTokens:()=>Tne,getJWTRSAKeys:()=>cg,refreshOperationToken:()=>Ane,validateOperationToken:()=>AO,validateRefreshToken:()=>lg});async function cg(){if(sg)return sg;try{let e=Q_.default.join(j_.default.getHdbBasePath(),gA),t=await ig.default.readFile(Q_.default.join(e,cf.JWT_PASSPHRASE_NAME),"utf8"),r=await ig.default.readFile(Q_.default.join(e,cf.JWT_PRIVATE_KEY_NAME),"utf8");return sg={publicKey:await ig.default.readFile(Q_.default.join(e,cf.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},sg}catch(e){throw ag.default.error(e),new Qs.ClientError(Bu.NO_ENCRYPTION_KEYS,xu.INTERNAL_SERVER_ERROR)}}async function Tne(e){let t=(0,SO.validateBySchema)(e,Ui.default.object({username:Ui.default.string().optional(),password:Ui.default.string().optional(),role:Ui.default.string().optional(),expires_in:Ui.default.alternatives(Ui.default.string(),Ui.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,TO.findAndValidateUser)(e.username,e.password,d)}catch(d){throw ag.default.error(d),new Qs.ClientError(Bu.INVALID_CREDENTIALS,xu.UNAUTHORIZED)}if(!r)throw new Qs.ClientError(Bu.INVALID_CREDENTIALS,xu.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 cg(),c=await Hu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:e.expires_in??ik,algorithm:og,subject:"operation"}),l=await Hu.default.sign(i,{key:o.privateKey,passphrase:o.passphrase},{expiresIn:Sne,algorithm:og,subject:"refresh"}),u=ub(l,"sha256");if((await(0,tk.update)(new rk.default(af,Wl.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new Qs.ClientError(Bu.REFRESH_TOKEN_SAVE_FAILED,xu.INTERNAL_SERVER_ERROR);return nk.default.signalUserChange(new sk.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function Ane(e){let t=(0,SO.validateBySchema)(e,Ui.default.object({refresh_token:Ui.default.string().required()}).required());if(t)throw new Qs.ClientError(t.message);let{refresh_token:r}=e;await lg(r);let n=await cg(),s=await Hu.default.decode(r);return{operation_token:await Hu.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:ik,algorithm:og,subject:"operation"})}}async function AO(e){return ok(e,"operation")}async function lg(e){return ok(e,"refresh")}async function ok(e,t){try{let r=await cg(),n=await Hu.default.verify(e,r.publicKey,{algorithms:og,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,TO.findAndValidateUser)(n.username,void 0,!1);if(t==="refresh"&&!db(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw ag.default.warn(r),r?.name==="TokenExpiredError"?new Qs.ClientError(Bu.TOKEN_EXPIRED,xu.FORBIDDEN):new Qs.ClientError(Bu.INVALID_TOKEN,xu.UNAUTHORIZED)}}var Hu,ig,Q_,Ui,SO,Qs,ag,TO,tk,rk,nk,sk,j_,xu,Bu,ik,Sne,og,sg,ku=Re(()=>{Hu=v(require("jsonwebtoken")),ig=v(require("fs-extra")),Q_=v(require("node:path")),Ui=v(require("joi")),SO=v(ot());k();Qs=v(he()),ag=v(ee());SE();TO=v(Wn()),tk=v(Rn()),rk=v(ng()),nk=v(uo()),sk=v(qs()),j_=v(le()),{HTTP_STATUS_CODES:xu,AUTHENTICATION_ERROR_MSGS:Bu}=Qs.hdb_errors;j_.default.initSync();ik=j_.default.get(x.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",Sne=j_.default.get(x.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",og="RS256";a(cg,"getJWTRSAKeys");a(Tne,"createTokens");a(Ane,"refreshOperationToken");a(AO,"validateOperationToken");a(lg,"validateRefreshToken");a(ok,"validateToken")});var RO=C((TIe,lk)=>{"use strict";var Rne=ZH(),Fu=require("passport"),yne=require("passport-local").Strategy,bne=require("passport-http").BasicStrategy,One=require("util"),Nne=Wn(),ck=One.callbackify(Nne.findAndValidateUser),SIe=Un(),wne=(k(),P(q)),ak=(ku(),P(J_));Fu.use(new yne(function(e,t,r){ck(e,t,r)}));Fu.use(new bne(function(e,t,r){ck(e,t,r)}));Fu.serializeUser(function(e,t){t(null,e)});Fu.deserializeUser(function(e,t){t(null,e)});function Ine(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":Fu.authenticate("basic",{session:!1},(o,c)=>{i(o,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===wne.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?ak.validateRefreshToken(s).then(o=>{e.body.refresh_token=s,r(null,o)}).catch(o=>{r(o)}):ak.validateOperationToken(s).then(o=>{r(null,o)}).catch(o=>{r(o)});break;default:Fu.authenticate("local",{session:!1},function(o,c){i(o,c)})(e,t,r);break}}a(Ine,"authorize");function Cne(e,t){let r=Rne(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(Cne,"checkPermissions");lk.exports={authorize:Ine,checkPermissions:Cne}});var ug=C((RIe,uk)=>{"use strict";var Pne=$n();uk.exports={writeTransaction:Dne};function Dne(e,t,r){return Pne.writeTransaction(e,t,r)}a(Dne,"writeTransaction")});var hk=C((OIe,_k)=>{"use strict";var Lne=zr(),Mne=Ys(),dk=ee(),vne=Rn(),bIe=ug(),Une=require("clone"),bO=require("alasql"),xne=cE(),fk=require("util"),Bne=fk.promisify(Mne.getTableSchema),Hne=fk.promisify(Lne.search),kne=(k(),P(q)),yO=ie();xne(bO);_k.exports={update:Gne};var Fne="There was a problem performing this update. Please check the logs and try again.";async function Gne({statement:e,hdb_user:t}){let r=await Bne(e.table.databaseid,e.table.tableid),n=qne(e.columns);yO.backtickASTSchemaItems(e);let{table:s,where:i}=e,o=Une(s),c=yO.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=bO.parse(l).statements[0],f=await Hne(u),d=$ne(n,f);return Vne(o,d,t)}a(Gne,"update");function qne(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=bO.compile(`SELECT ${r.expression.toString()} AS [${kne.FUNC_VAL}] FROM ?`)}),t}catch(t){throw dk.error(t),new Error(Fne)}}a(qne,"createUpdateRecord");function $ne(e,t){return yO.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}a($ne,"buildUpdateRecords");async function Vne(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await vne.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){dk.error(`Error delete new_attributes from update response: ${i}`)}return s}a(Vne,"updateRecords")});var pk=C((CIe,mk)=>{var Kne=require("alasql"),Yne=zr(),Wne=ee(),zne=$n(),NO=require("util"),OO=ie(),Qne=(k(),P(q)),jne=Ys(),wIe=ug(),IIe=Rn(),Jne="record",Xne="successfully deleted",Zne=NO.callbackify(nse),ese=NO.promisify(Yne.search),tse=NO.promisify(jne.getTableSchema);mk.exports={convertDelete:Zne};function rse(e){return`${e.deleted_hashes.length} ${Jne}${e.deleted_hashes.length===1?"":"s"} ${Xne}`}a(rse,"generateReturnMessage");async function nse({statement:e,hdb_user:t}){let r=await tse(e.table.databaseid,e.table.tableid);OO.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=OO.isEmpty(s)?"":` WHERE ${s.toString()}`,o=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=Kne.parse(o).statements[0],l={operation:Qne.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await ese(c);let u=await zne.deleteRecords(l);return OO.isEmptyOrZeroLength(u.message)&&(u.message=rse(u)),delete u.txn_time,u}catch(u){throw Wne.error(u),u.hdb_code?u.message:u}}a(nse,"convertDelete")});var Ak=C((DIe,Tk)=>{"use strict";var sse=po(),{hdb_errors:Ek}=he(),{getDatabases:gk}=(xe(),P(ct));Tk.exports={checkSchemaExists:Sk,checkSchemaTableExists:ise,schema_describe:sse};async function Sk(e){if(!gk()[e])return Ek.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}a(Sk,"checkSchemaExists");async function ise(e,t){let r=await Sk(e);if(r)return r;if(!gk()[e][t])return Ek.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}a(ise,"checkSchemaTableExists")});var DO=C((xIe,Mk)=>{"use strict";var{decode:ose}=require("msgpackr"),{isMainThread:MIe,parentPort:vIe,threadId:UIe}=require("worker_threads"),_g=gr(),Gu=Pt(),CO=(k(),P(q)),Jr=ee(),IO=le(),ase=(k(),P(q)),{onMessageByType:cse}=it(),Ok=mo(),{recordAction:Rk,recordActionBinary:lse}=(Di(),P(D_)),{publishToStream:use}=_g,{ConsumerEvents:yk}=require("nats"),dse=zr(),{promisify:fse}=require("util"),{decodeBlobsWithWrites:_se}=(hn(),P(au)),Nk=fse(setTimeout),hg=1e4,mg,fg,hse,mse,wk,X_=new Map,qu=new Map;Mk.exports={initialize:Ik,ingestConsumer:PO,setSubscription:pse,setIgnoreOrigin:Sse,getDatabaseSubscriptions:gse,updateConsumer:Ck};async function Ik(){cse(CO.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,async n=>{await Ck(n)}),wk=!0,Jr.notify("Initializing clustering ingest service.");let{connection:e,jsm:t,js:r}=await _g.getNATSReferences();mg=e,fg=e.info.server_name,hse=t,mse=r}a(Ik,"initialize");async function Ck(e){if(e.status==="start"){let{js:t,jsm:r}=await Pk(e.node_domain_name);PO(e.stream_name,t,r,e.node_domain_name)}else if(e.status==="stop"){let t=X_.get(e.stream_name+e.node_domain_name);t&&(Jr.notify("Closing ingest consumer for node:",e.node_domain_name,"stream:",e.stream_name),await t.close?.(),X_.set(e.stream_name+e.node_domain_name,"close")),qu.get(e.node_domain_name)==="failed"&&qu.set(e.node_domain_name,"close")}}a(Ck,"updateConsumer");var pg=new Map;function pse(e,t,r){let n=pg.get(e);n||pg.set(e,n=new Map),n.set(t,r),wk||Ik().then(Ese)}a(pse,"setSubscription");async function Ese(){let e=await dse.searchByValue({database:"system",table:"hdb_nodes",search_attribute:"name",search_value:"*"});for await(let t of e){let r=t.name+Gu.SERVER_SUFFIX.LEAF,n,s;for(let i of t.subscriptions||[])if(i.subscribe===!0){if(!n&&({js:n,jsm:s}=await Pk(r),!n))break;let{schema:o,table:c}=i,l=Ok.createNatsTableStreamName(o,c);PO(l,n,s,r)}}}a(Ese,"accessConsumers");async function Pk(e){let t,r,n=1;for(;!r;)try{t=await mg.jetstream({domain:e}),r=await mg.jetstreamManager({domain:e,checkAPI:!1})}catch(s){if(qu.get(e)==="close")break;qu.set(e,"failed"),n%10===1&&Jr.warn("Nats ingest attempting to connect to:",e,"Nats error:",s.message);let i=n++*100<hg?n++*100:hg;await Nk(i)}return{js:t,jsm:r}}a(Pk,"connectToRemoteJS");function gse(){return pg}a(gse,"getDatabaseSubscriptions");var Dk;function Sse(e){Dk=e}a(Sse,"setIgnoreOrigin");var Lk=100,bk=new Array(Lk),dg=0;async function PO(e,t,r,n){let{connection:s}=await _g.getNATSReferences();mg=s,fg=s.info.server_name;let i,o=1;for(;!i;)try{i=await t.consumers.get(e,fg),Jr.notify("Initializing ingest consumer for node:",n,"stream:",e)}catch(u){if(qu.get(n)==="close")break;o%10===1&&Jr.warn("Nats ingest error getting consumer:",n,"stream:",e,"Nats error:",u.message),u.code==="404"&&(Jr.notify("Nats ingest creating consumer for node:",n,"stream:",e),i=await _g.createConsumer(r,e,fg,new Date(Date.now()).toISOString()));let f=o++*100<hg?o++*100:hg;await Nk(f)}let c=!1,l;for(;!c;){if(X_.get(e+n)==="close"||qu.get(n)==="close"){X_.delete(e+n),c=!0;continue}l=await i.consume({max_messages:IO.get(CO.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXCONSUMEMSGS)??100,bind:!0}),X_.set(e+n,l);let u=!1;(async()=>{for await(let f of await l.status())if(f.type===yk.ConsumerDeleted&&(await l.close(),c=!0),f.type===yk.HeartbeatsMissed){let d=f.data;Jr.trace(`${d} clustering ingest consumer heartbeats missed, node: ${n} stream: ${l.consumer.stream}`),d===100&&(Jr.warn(`Restarting clustering ingest consumer due to missed heartbeat threshold being met, node: ${n} stream: ${l.consumer.stream}`),l.stop(),u=!0)}})();try{for await(let f of l)await bk[dg],bk[dg]=Tse(f).catch(d=>{Jr.error(d)}),++dg>=Lk&&(dg=0)}catch(f){f.message==="consumer deleted"?(Jr.notify("Nats consumer deleted, closing messages for node:",n,"stream:",l.consumer.stream),await l.close(),c=!0):Jr.error("Error consuming clustering ingest, restarting consumer",f)}}}a(PO,"ingestConsumer");async function Tse(e){let t;await _se(()=>{t=ose(e.data)}),Rk(e.data.length,"bytes-received",e.subject,t.operation,"ingest"),Jr.trace("Nats message processor message size:",e?.msg?._msg?.size,"bytes");let r=e.headers,n=!1,s=IO.get(CO.CONFIG_PARAMS.CLUSTERING_NODENAME);r.has(Gu.MSG_HEADERS.TRANSACTED_NODES)&&r.values(Gu.MSG_HEADERS.TRANSACTED_NODES).indexOf(s)>-1&&(n=!0);let i=r.get(Gu.MSG_HEADERS.ORIGIN);if(n||(n=i===s&&!Dk),lse(n,"echo",e.subject,t.operation,"ingest"),n){e.ack();return}r.append(Gu.MSG_HEADERS.TRANSACTED_NODES,s);try{let{operation:o,schema:c,next:l,table:u,records:f,hash_values:d,__origin:_,expiresAt:h}=t;Jr.trace("processing message:",o,c,u,(f?"records: "+f.map(M=>M?.id):"")+(d?"ids: "+d:""),"with sequence:",e.seq),Jr.trace(`messageProcessor nats msg id: ${e.headers.get(Gu.MSG_HEADERS.NATS_MSG_ID)}`);let m;f||(f=d);let S=new Promise(M=>m=M),{timestamp:g,user:R,node_name:E}=_||{},T=pg.get(c)?.get(u);if(!T)throw new Error(`Missing table for replication message: ${u}`);if(o==="define_schema")t.type=o,t.onCommit=m,T.send(t);else if(f.length===1&&!l)T.send({type:wO(o),value:f[0],id:d?.[0],expiresAt:h,timestamp:g,table:u,onCommit:m,user:R,nodeName:E});else{let M=f.map((H,X)=>({type:wO(o),value:H,expiresAt:h,id:d?.[X],table:u}));for(;l;)M.push({type:wO(l.operation),value:l.record,expiresAt:l.expiresAt,id:l.id,table:l.table}),l=l.next;T.send({type:"transaction",writes:M,table:u,timestamp:g,onCommit:m,user:R,nodeName:E})}IO.get(ase.CONFIG_PARAMS.CLUSTERING_REPUBLISHMESSAGES)!==!1&&use(e.subject.split(".").slice(0,-1).join("."),Ok.createNatsTableStreamName(c,u),e.headers,e.data),await S;let N=Date.now()-g;g&&Rk(N,"replication-latency",e.subject,o,"ingest")}catch(o){Jr.error(o)}e.ack()}a(Tse,"messageProcessor");function wO(e){switch(e){case"insert":case"upsert":case"update":return"put"}return e}a(wO,"convertOperation")});var gr=C(($Ie,jk)=>{"use strict";var Ir=le();Ir.initSync();var Ase=require("fs-extra"),Rse=require("semver"),th=require("path"),{monotonicFactory:yse}=require("ulidx"),Uk=yse(),bse=require("util"),xk=require("child_process"),Ose=bse.promisify(xk.exec),Nse=xk.spawn,Hr=Pt(),Qe=(k(),P(q)),{packageJson:wse,PACKAGE_ROOT:Ise}=Et(),Eg=ie(),js=ee(),gg=mo(),Cse=ug(),Z_=Lt(),{broadcast:Pse,onMessageByType:Dse,getWorkerIndex:Lse}=it(),{isMainThread:Bk}=require("worker_threads"),{Encoder:Mse,decode:UO}=require("msgpackr"),Hk=new Mse,{isEmpty:ll}=Eg,kk=Wn(),HIe=48*36e11;Bk&&Dse(Qe.ITC_EVENT_TYPES.RESTART,()=>{Xr=void 0,cl=void 0});var{connect:vse,StorageType:Use,RetentionPolicy:xse,AckPolicy:xO,DeliverPolicy:BO,DiscardPolicy:Bse,NatsConnection:kIe,JetStreamManager:FIe,JetStreamClient:GIe,StringCodec:qIe,JSONCodec:Hse,createInbox:HO,headers:kse,ErrorCode:vk}=require("nats"),{recordAction:Fse}=(Di(),P(D_)),{encodeBlobsAsBuffers:Gse}=(hn(),P(au)),Fk=Hse(),qse="clustering",$se=wse.engines[Hr.NATS_SERVER_NAME],Vse=th.join(Ise,"dependencies"),vO=th.join(Vse,`${process.platform}-${process.arch}`,Hr.NATS_BINARY_NAME),LO,MO,eh,ol,al;jk.exports={runCommand:Gk,checkNATSServerInstalled:Kse,createConnection:kO,getConnection:rh,getJetStreamManager:nh,getJetStream:$k,getNATSReferences:xi,getServerList:Wse,createLocalStream:FO,listStreams:Vk,deleteLocalStream:zse,getServerConfig:$u,listRemoteStreams:Qse,viewStream:jse,viewStreamIterator:Jse,publishToStream:Xse,request:tie,reloadNATS:GO,reloadNATSHub:rie,reloadNATSLeaf:nie,extractServerName:eie,requestErrorHandler:sie,createLocalTableStream:zk,createTableStreams:aie,purgeTableStream:Qk,purgeSchemaTableStreams:cie,getStreamInfo:lie,updateLocalStreams:die,closeConnection:Yse,getJsmServerName:Sg,addNatsMsgHeader:Kk,clearClientCache:qk,updateRemoteConsumer:iie,createConsumer:Yk,updateConsumerIterator:oie};async function Gk(e,t=void 0){let{stdout:r,stderr:n}=await Ose(e,{cwd:t});if(n)throw new Error(n.replace(`
|
|
21
21
|
`,""));return r.replace(`
|
|
22
|
-
`,"")}a(Gk,"runCommand");async function Kse(){try{await Ase.access(vO)}catch{return!1}let e=await Gk(`${vO} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return Rse.eq(t,$se)}a(Kse,"checkNATSServerInstalled");async function kO(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await kk.getClusterUser();if(ll(o))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=o.username,r=o.decrypt_hash}js.trace("create nats connection called");let i=await vse({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),js.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(o=>{o&&js.error("Error with Nats client connection, connection closed",o),i===Xr&&qk()}),i}a(kO,"createConnection");function qk(){Xr=void 0,ol=void 0,al=void 0,cl=void 0}a(qk,"clearClientCache");async function Yse(){Xr&&(await Xr.drain(),Xr=void 0,ol=void 0,al=void 0,cl=void 0)}a(Yse,"closeConnection");var Xr,cl;async function rh(){return cl||(cl=kO(Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),Xr=await cl),Xr||cl}a(rh,"getConnection");async function nh(){if(ol)return ol;ll(Xr)&&await rh();let{domain:e}=$u(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(ll(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return ol=await Xr.jetstreamManager({domain:e,timeout:6e4}),ol}a(nh,"getJetStreamManager");async function $k(){if(al)return al;ll(Xr)&&await rh();let{domain:e}=$u(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(ll(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return al=Xr.jetstream({domain:e,timeout:6e4}),al}a($k,"getJetStream");async function xi(){let e=Xr||await rh(),t=ol||await nh(),r=al||await $k();return{connection:e,jsm:t,js:r}}a(xi,"getNATSReferences");async function Wse(e){let t=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await kk.getClusterUser(),s=await kO(t,r,n),i=HO(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=Fk.decode(f.data);d.response_time=Date.now()-l,c.push(d)}})();return l=Date.now(),await s.publish("$SYS.REQ.SERVER.PING.VARZ",void 0,{reply:i}),await s.publish("$SYS.REQ.SERVER.PING",void 0,{reply:i}),await s.flush(),await Eg.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(Wse,"getServerList");async function FO(e,t){let{jsm:r}=await xi(),n=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:Use.File,retention:xse.Limits,subjects:t,discard:Bse.Old,max_msgs:s,max_bytes:i,max_age:n})}a(FO,"createLocalStream");async function Vk(){let{jsm:e}=await xi(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(Vk,"listStreams");async function zse(e){let{jsm:t}=await xi();await t.streams.delete(e)}a(zse,"deleteLocalStream");async function Qse(e){let{connection:t}=await xi(),r=[],n=HO(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(Fk.decode(o.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}a(Qse,"listRemoteStreams");async function jse(e,t=void 0,r=void 0){let{jsm:n,js:s}=await xi(),i=Uk(),o={durable_name:i,ack_policy:xO.Explicit};t&&(o.deliver_policy=BO.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];let u=[];for await(let f of l){let d=UO(f.data),_={nats_timestamp:f.info.timestampNanos,nats_sequence:f.info.streamSequence,entry:d};if(f.headers&&(_.origin=f.headers.get(Hr.MSG_HEADERS.ORIGIN)),u.push(_),f.ack(),f.info.pending===0)break}return await c.delete(),u}a(jse,"viewStream");async function*Jse(e,t=void 0,r=void 0){let{jsm:n,js:s}=await xi(),i=Uk(),o={durable_name:i,ack_policy:xO.Explicit};t&&(o.deliver_policy=BO.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];for await(let u of l){let f=UO(u.data);f[0]||(f=[f]);for(let d of f){let _={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:d};u.headers&&(_.origin=u.headers.get(Hr.MSG_HEADERS.ORIGIN)),yield _}if(u.ack(),u.info.pending===0)break}await c.delete()}a(Jse,"viewStreamIterator");async function Xse(e,t,r,n){js.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=Kk(n,r);let{js:s}=await xi(),i=await Sg(),o=`${e}.${i}`,c=await Gse(()=>n instanceof Uint8Array?n:Hk.encode(n));try{js.trace(`publishToStream publishing to subject: ${o}`),Fse(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(o,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return Wk(async()=>{try{await s.publish(o,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){js.trace(`publishToStream creating stream: ${t}`);let f=o.split(".");f[2]="*",await FO(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(Xse,"publishToStream");function Kk(e,t){t===void 0&&(t=kse());let r=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(Hr.MSG_HEADERS.ORIGIN)&&r&&t.append(Hr.MSG_HEADERS.ORIGIN,r),t}a(Kk,"addNatsMsgHeader");function $u(e){e=e.toLowerCase();let t=th.join(Ir.get(Qe.CONFIG_PARAMS.ROOTPATH),qse);if(e===Qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return ll(MO)&&(MO={port:Z_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:Z_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Hr.SERVER_SUFFIX.HUB,config_file:Hr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:th.join(t,Hr.PID_FILES.HUB),hdb_nats_path:t}),MO;if(e===Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return ll(LO)&&(LO={port:Z_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:Z_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Hr.SERVER_SUFFIX.LEAF,config_file:Hr.NATS_CONFIG_FILES.LEAF_SERVER,domain:Z_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Hr.SERVER_SUFFIX.LEAF,pid_file_path:th.join(t,Hr.PID_FILES.LEAF),hdb_nats_path:t}),LO;js.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a($u,"getServerConfig");async function Yk(e,t,r,n){try{await e.consumers.add(t,{ack_policy:xO.Explicit,durable_name:r,deliver_policy:BO.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a(Yk,"createConsumer");async function Zse(e,t,r){await e.consumers.delete(t,r)}a(Zse,"removeConsumer");function eie(e){return e.split(".")[1]}a(eie,"extractServerName");async function tie(e,t,r=6e4,n=HO()){if(!Eg.isObject(t))throw new Error("data param must be an object");let s=Hk.encode(t),{connection:i}=await xi(),o={timeout:r};n&&(o.reply=n,o.noMux=!0);let c=await i.request(e,s,o);return UO(c.data)}a(tie,"request");function GO(e){return new Promise(async(t,r)=>{let n=Nse(vO,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",o=>{r(o)}),n.stdout.on("data",o=>{i+=o.toString()}),n.stderr.on("data",o=>{s+=o.toString()}),n.stderr.on("close",o=>{s&&r(s),t(i)})})}a(GO,"reloadNATS");async function rie(){let{pid_file_path:e}=$u(Qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await GO(e)}a(rie,"reloadNATSHub");async function nie(){let{pid_file_path:e}=$u(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await GO(e)}a(nie,"reloadNATSLeaf");function sie(e,t,r){let n;switch(e.code){case vk.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case vk.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(sie,"requestErrorHandler");async function iie(e,t){let r=t+Hr.SERVER_SUFFIX.LEAF,{connection:n}=await xi(),{jsm:s}=await _ie(r),{schema:i,table:o}=e,c=gg.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await Wk(async()=>{if(e.subscribe===!0)await Yk(s,c,n.info.server_name,l);else try{await Zse(s,c,n.info.server_name)}catch(u){js.trace(u)}})}a(iie,"updateRemoteConsumer");async function oie(e,t,r,n){let s=gg.createNatsTableStreamName(e,t),i=r+Hr.SERVER_SUFFIX.LEAF,o={type:Qe.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!Bk&&Lse()<Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=DO();await c(o)}await Pse(o),n==="stop"&&await Eg.async_set_timeout(1e3)}a(oie,"updateConsumerIterator");function Wk(e){return Cse.writeTransaction(Qe.SYSTEM_SCHEMA_NAME,Qe.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(Wk,"exclusiveLock");async function zk(e,t){let r=gg.createNatsTableStreamName(e,t),n=await Sg(),s=uie(e,t,n);await FO(r,[s])}a(zk,"createLocalTableStream");async function aie(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await zk(n,s)}}a(aie,"createTableStreams");async function Qk(e,t,r=void 0){if(Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=gg.createNatsTableStreamName(e,t),{domain:s}=$u(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await rh()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")js.warn(n);else throw n}}a(Qk,"purgeTableStream");async function cie(e,t){if(Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await Qk(e,t[r])}a(cie,"purgeSchemaTableStreams");async function lie(e){return(await nh()).streams.info(e)}a(lie,"getStreamInfo");function uie(e,t,r){return`${Hr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(uie,"createSubjectName");async function Sg(){if(eh)return eh;if(eh=(await nh())?.nc?.info?.server_name,eh===void 0)throw new Error("Unable to get jetstream manager server name");return eh}a(Sg,"getJsmServerName");async function die(){let e=await nh(),t=await Sg(),r=await Vk();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=fie(n),c=i.split(".");if(c[c.length-1]===t&&!o||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let f=u.join(".");js.trace(`Updating stream subject name from: ${i} to: ${f}`),s.subjects[0]=f,await e.streams.update(s.name,s)}}a(die,"updateLocalStreams");function fie(e){let{config:t}=e,r=!1,n=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);return i=i===null?-1:i,n!==t.max_age&&(t.max_age=n,r=!0),s!==t.max_bytes&&(t.max_bytes=s,r=!0),i!==t.max_msgs&&(t.max_msgs=i,r=!0),r}a(fie,"updateStreamLimits");async function _ie(e){let t,r;try{t=await Xr.jetstream({domain:e}),r=await Xr.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw js.error("Unable to connect to:",e),n}return{js:t,jsm:r}}a(_ie,"connectToRemoteJS")});function qO(e){let t=e.get(Tg),r=t?(0,Vu.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:ih(e)??1,nodes:[]})})}i[n]=0,e.putSync(Tg,(0,Vu.pack)(r))}return r}function sh(e){return qO(e).remoteNameToId}function Xk(e,t){let r=qO(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(Tg,(0,Vu.pack)(r)),s}function Ag(e,t){let r=qO(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(Tg,(0,Vu.pack)(r))}return Jk.trace?.("The remote node name map",e,n,s),s}var Jk,Vu,Tg,$O=Re(()=>{Jk=v(ks());gs();Vu=require("msgpackr"),Tg=Symbol.for("remote-ids");a(qO,"getIdMappingRecord");a(sh,"exportIdMapping");a(Xk,"remoteToLocalNodeId");a(Ag,"getIdOfRemoteNode")});var VO={};Ue(VO,{commits_awaiting_replication:()=>Ku,getHDBNodeTable:()=>sr,getReplicationSharedStatus:()=>Rg,iterateRoutes:()=>ah,shouldReplicateToNode:()=>oh,subscribeToNodeUpdates:()=>Yu});function sr(){return Zk||(Zk=_t({table:"hdb_nodes",database:"system",attributes:[{name:"name",isPrimaryKey:!0},{attribute:"subscriptions"},{attribute:"system_info"},{attribute:"url"},{attribute:"routes"},{attribute:"ca"},{attribute:"ca_info"},{attribute:"replicates"},{attribute:"revoked_certificates"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]}))}function Rg(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Yu(e){sr().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;nF.debug?.("adding node",n,"on node",et()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==et()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of sr().search({}))if(i.shard!=null){let o=s.get(i.shard);o||s.set(i.shard,o=[]),o.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function oh(e,t){let r=Ra.default.get(x.REPLICATION_DATABASES);return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&(r==="*"||r?.find?.(n=>(typeof n=="string"?n:n.name)===t&&(!n.sharded||e.shard===Ra.default.get(x.REPLICATION_SHARD))))&&sr().primaryStore.get(et())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function hie(){Yu(e=>{ya({},(t,r)=>{let n=e.name,s=eF.get(n);if(s||eF.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=Rg(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of Ku.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*ah(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=Ra.default.get(x.REPLICATION_SECUREPORT)??(!Ra.default.get(x.REPLICATION_PORT)&&Ra.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||Ra.default.get(x.REPLICATION_PORT)||Ra.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){tF.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 tF,rF,Ra,nF,Zk,eF,Ku,ul=Re(()=>{xe();gs();Jm();tF=require("worker_threads"),rF=v(he()),Ra=v(le());k();nF=v(ks());server.nodes=[];a(sr,"getHDBNodeTable");a(Rg,"getReplicationSharedStatus");a(Yu,"subscribeToNodeUpdates");a(oh,"shouldReplicateToNode");eF=new Map;MD((e,t,r)=>{if(r>server.nodes.length)throw new rF.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);Ku||(Ku=new Map,hie());let n=Ku.get(e);return n||(n=[],Ku.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(hie,"startSubscriptionToReplications");a(ah,"iterateRoutes")});var oF={};Ue(oF,{connectedToNode:()=>dl,disconnectedFromNode:()=>zu,ensureNode:()=>Ao,requestClusterStatus:()=>iF,startOnMainThread:()=>YO});async function YO(e){let t=0,r=Je();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){yg.set(i,ih(l.auditStore));break}}}Hi.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes?.search([])||[])i.push(o);for(let o of ah(e))try{let c=!o.subscriptions;if(c){let u=et(),f=sr().primaryStore.get(u);if(f!==null){let d=e.url??ba();(f===void 0||f.url!==d||f.shard!==e.shard)&&await Ao(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)}Yu(s)});let n;function s(i,o=i?.name){let c=et()&&o===et()||ba()&&i?.url===ba();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let _ of sr().search([]))_.replicates&&_.name!==o&&s(_,_.name);n=d}if(nt.trace("Setting up node replication for",i),!i){for(let[d,_]of Bi){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){Bi.get(d).iterator.remove(),Bi.delete(d);return}}return}if(c)return;if(!i.url){nt.info(`Node ${i.name} is missing url`);return}let l=Bi.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 Wu)if(i.url===_.url){Wu.delete(d);break}Wu.set(i.name,i)}let u=Je();if(l||(l=new Map,Bi.set(i.url,l)),l.iterator=ya(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}];yg.has(d)&&ch.default.get(x.REPLICATION_FAILOVER)&&(S.push({replicateByDefault:_,name:et(),start_time:yg.get(d),end_time:Date.now(),replicates:!0}),yg.delete(d));let g=oh(i,d),R=Hi.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):lh(E)},mie);else{nt.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],sr().primaryStore.get(et())?.replicates),sr().primaryStore.get(et())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};m?m.postMessage(E):Og(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),zu=a(function(i){try{nt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(Wu.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=Bi.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||!ch.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=Wu.get(m);u=Bi.get(S.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==_){h=(h+1)%c.length;continue}let{worker:R,nodes:E}=g,T=!1;for(let N of f.nodes){if(E.some(M=>M.name===N.name)){nt.info(`Disconnected node is already failing over to ${m} for ${i.database}`);continue}N.end_time<Date.now()||(E.push(N),T=!0)}if(f.nodes=[f.nodes[0]],!T){nt.info(`Disconnected node ${i.name} has no nodes to fail over to ${m}`);return}nt.info(`Failing over ${i.database} from ${i.name} to ${m}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:E}):lh({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"),dl=a(function(i){let o=Bi.get(i.url),c=o?.get(i.database);if(!c){nt.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){nt.info("Connected node has no nodes",i.database,c);return}if(!l.name){nt.debug("Connected node is not named yet",i.database,c);return}if(!ch.default.get(x.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let f of Bi.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,Hi.onMessageByType)("disconnected-from-node",zu),(0,Hi.onMessageByType)("connected-to-node",dl),(0,Hi.onMessageByType)("request-cluster-status",iF)}function iF(e,t){let r=[];for(let[n,s]of Wu)try{let i=Bi.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,KO.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 Ao(e,t){let r=sr();e=e??Js(t.url),t.name=e;try{if(t.ca){let s=new sF.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&&!ch.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,KO.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 Hi,bg,nt,KO,ch,sF,mie,Bi,zu,dl,Wu,yg,uh=Re(()=>{xe();Hi=v(it());gs();bg=require("worker_threads");ul();nt=v(ee()),KO=require("lodash"),ch=v(le());k();sF=require("crypto"),mie=200,Bi=new Map,Wu=new Map,yg=new Map;a(YO,"startOnMainThread");a(iF,"requestClusterStatus");bg.parentPort&&(zu=a(e=>{bg.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),dl=a(e=>{bg.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Hi.onMessageByType)("subscribe-to-node",e=>{lh(e)}),(0,Hi.onMessageByType)("unsubscribe-from-node",e=>{Og(e)}));a(Ao,"ensureNode")});var ei=C(IF=>{"use strict";var ir=require("path"),{watch:fF}=require("chokidar"),On=require("fs-extra"),Qu=require("node-forge"),_F=require("net"),{generateKeyPair:zO,X509Certificate:Ro,createPrivateKey:hF}=require("crypto"),pie=require("util");zO=pie.promisify(zO);var bt=Qu.pki,Xs=require("joi"),{v4:mF}=require("uuid"),{validateBySchema:XO}=ot(),yt=ee(),Zn=le(),Ss=(k(),P(q)),{CONFIG_PARAMS:_l}=Ss,Zs=hb(),{ClientError:Na}=he(),wg=require("node:tls"),{relative:pF,join:Eie}=require("node:path"),{CERT_PREFERENCE_APP:oCe,CERTIFICATE_VALUES:aF}=Zs,gie=_c(),Ng=Lt(),{table:Sie,getDatabases:Tie,databases:WO}=(xe(),P(ct)),{getJWTRSAKeys:cF}=(ku(),P(J_));Object.assign(IF,{generateKeys:rN,updateConfigCert:RF,createCsr:Iie,signCertificate:Cie,setCertTable:ju,loadCertificates:tN,reviewSelfSignedCert:sN,createTLSSelector:bF,listCertificates:NF,addCertificate:Uie,removeCertificate:Bie,createNatsCerts:Lie,generateCertsKeys:Die,getReplicationCert:fh,getReplicationCertAuth:Nie,renewSelfSigned:Mie,hostnamesFromCert:iN,getKey:Hie});var{urlToNodeName:EF,getThisNodeUrl:Aie,getThisNodeName:Dg,clearThisNodeName:Rie}=(gs(),P(Ca)),{readFileSync:yie,statSync:gF}=require("node:fs"),aCe=le(),{getTicketKeys:bie,onMessageFromWorkers:Oie}=it(),Oa=ee(),{isMainThread:QO}=require("worker_threads"),{TLSSocket:SF,createSecureContext:cCe}=require("node:tls"),ZO=3650,dh=["127.0.0.1","localhost","::1"],eN=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];Oie(async e=>{e.type===Ss.ITC_EVENT_TYPES.RESTART&&(Zn.initSync(!0),await sN())});var kr;function Ia(){return kr||(kr=Tie().system.hdb_certificate,kr||(kr=Sie({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__"}]}))),kr}a(Ia,"getCertTable");async function fh(){let e=bF("replication"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(Dg());if(!r)return;let n=new Ro(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(fh,"getReplicationCert");async function Nie(){Ia();let e=(await fh()).options.cert,r=new Ro(e).issuer.match(/CN=(.*)/)?.[1];return kr.get(r)}a(Nie,"getReplicationCertAuth");var jO,wa=new Map,Ig=[],lF;function tN(){if(jO)return;if(jO=!0,!lF&&QO){let n=Ng.getConfigFilePath();lF=fF(n,{persistent:!1}).on("change",()=>{logger.warn?.("Config file changed, reloading certificates"),wie()})}let e=[{configKey:_l.TLS},{configKey:_l.OPERATIONSAPI_TLS}];Ia();let t=ir.dirname(Ng.getConfigFilePath()),r;for(let{configKey:n}of e){let s=Ng.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&pF(Eie(t,"keys"),o);if(c){let l=uF(o,u=>{wa.set(c,u)},"private key");l&&Ig.push(l)}for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&QO){let f=uF(u,d=>{if(aF.cert===d)return;let _=i.hostname??i.hostnames??i.host??i.hosts;_&&!Array.isArray(_)&&(_=[_]);let h=yF(u),m=new Ro(h),S;try{S=!l&&i.name||wF(x509Cert)}catch(M){logger.error("error extracting host name from certificate",M);return}if(S==null){logger.error("No host name found on certificate");return}if(m.checkIssued(new Ro(aF.cert)))return;let g=kr.primaryStore.get(S),R=gF(u).mtimeMs,E=!g||g.is_self_signed?1:g.fileTimestamp??g.__updatedtime__,T=i.uses??["https",...n.includes("operations")?["operations"]:[]],N=g&&R===E&&(JSON.stringify(g.uses)!==JSON.stringify(T)||g.ciphers!==i.ciphers||JSON.stringify(g.hostnames)!==JSON.stringify(_));if(E&&R<=E&&!N){R<E&&logger.info?.(`Certificate ${S} at ${u} is older (${new Date(R)}) than the certificate in the database (${E>1?new Date(E):"only self signed certificate available"})`);return}N&&logger.info?.(`Config values changed for certificate ${S}, updating record`),r=kr.put({name:S,uses:i.uses??["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:_,file_timestamp:R,details:{issuer:m.issuer.replace(/\n/g," "),subject:m.subject?.replace(/\n/g," "),subject_alt_name:m.subjectAltName,serial_number:m.serialNumber,valid_from:m.validFrom,valid_to:m.validTo}})},l?"certificate authority":"certificate");f&&Ig.push(f)}}}}}return r}a(tN,"loadCertificates");function wie(){for(let e of Ig)e.close();Ig.length=0,jO=!1,tN()}a(wie,"reloadCertificates");function uF(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&QO&&yt.warn(`Reloading ${r}:`,i),n=c,t(yF(i)))}catch(c){yt.error(`Error loading ${r}:`,i,c)}},"loadFile");return On.existsSync(e)?s(e,gF(e)):yt.error?.(`${r} file not found:`,e),fF(e,{persistent:!1}).on("change",s)}a(uF,"loadAndWatch");function Cg(){let e=Aie();if(e==null){let t=dh[0];return yt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return EF(e)}a(Cg,"getHost");function Pg(){let e=Dg();if(e==null){let t=dh[0];return yt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(Pg,"getCommonName");async function Iie(){let e=await fh(),t=bt.certificateFromPem(e.options.cert),r=bt.privateKeyFromPem(e.options.key);yt.info("Creating CSR with cert named:",e.name);let n=bt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:Pg()},...eN];yt.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:TF()}];return yt.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Qu.pki.certificationRequestToPem(n)}a(Iie,"createCsr");function TF(){let e=dh.includes(Pg())?dh:[...dh,Pg()];return e.includes(Cg())||e.push(Cg()),[{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=>_F.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(TF,"certExtensions");async function Cie(e){let t={},r=ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Ia();for await(let f of kr.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if(wa.has(f.private_key_name)){n=wa.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await On.exists(ir.join(r,f.private_key_name))){n=On.readFile(ir.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await JO();s=f.ca,n=f.private_key}n=bt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=bt.certificateFromPem(s.certificate);yt.info("Signing CSR with cert named",s.name);let o=bt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return yt.error(f),new Error("Error verifying CSR: "+f.message)}let c=Qu.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()+ZO),yt.info("sign cert setting validity:",c.validity),yt.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),yt.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;yt.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,Qu.md.sha256.create()),t.certificate=bt.certificateToPem(c)}else yt.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(Cie,"signCertificate");async function Pie(e,t){await ju({name:Dg(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await ju({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(Pie,"createCertificateTable");async function ju(e){let t=new Ro(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},Ia(),await kr.patch(e)}a(ju,"setCertTable");async function rN(){let e=await zO("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(rN,"generateKeys");async function nN(e,t,r){let n=bt.createCertificate();if(!t){let o=await fh();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()+ZO);let i=[{name:"commonName",value:Pg()},...eN];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(TF()),n.sign(e,Qu.md.sha256.create()),bt.certificateToPem(n)}a(nN,"generateCertificates");async function JO(){let e=await NF(),t;for(let r of e){if(!r.is_authority)continue;let n=await OF(r.private_key_name);if(r.private_key_name&&n&&new Ro(r.certificate).checkPrivateKey(hF(n))){yt.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;yt.trace("No CA found with matching private key")}a(JO,"getCertAuthority");async function AF(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()+ZO);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${Zn.get(_l.REPLICATION_HOSTNAME)??EF(Zn.get(_l.REPLICATION_URL))??mF().split("-")[0]}`},...eN];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Qu.md.sha256.create());let o=ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME),c=ir.join(o,Zs.PRIVATEKEY_PEM_NAME);return r&&await On.writeFile(c,bt.privateKeyToPem(e)),n}a(AF,"generateCertAuthority");async function Die(){let{private_key:e,public_key:t}=await rN(),r=await AF(e,t),n=await nN(e,t,r);await Pie(n,r),RF()}a(Die,"generateCertsKeys");async function Lie(){let e=await nN(bt.privateKeyFromPem(Zs.CERTIFICATE_VALUES.key),void 0,bt.certificateFromPem(Zs.CERTIFICATE_VALUES.cert)),t=ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME),r=ir.join(t,Zs.NATS_CERTIFICATE_PEM_NAME);await On.exists(r)||await On.writeFile(r,e);let n=ir.join(t,Zs.NATS_CA_PEM_NAME);await On.exists(n)||await On.writeFile(n,Zs.CERTIFICATE_VALUES.cert)}a(Lie,"createNatsCerts");async function Mie(){Ia();for await(let e of kr.search([{attribute:"is_self_signed",value:!0}]))await kr.delete(e.name);await sN()}a(Mie,"renewSelfSigned");async function sN(){Rie(),await tN(),Ia();let e=await JO();if(!e){yt.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=a(u=>{try{return{key:bt.privateKeyFromPem(On.readFileSync(u)),keyPath:u}}catch(f){return yt.warn(`Failed to parse private key from ${u}:`,f.message),{key:null,keyPath:u}}},"tryToParseKey"),n=Zn.get(_l.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=Zn.get(_l.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME),c=pF(o,i);s||(yt.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{private_key:s}=await rN(),On.existsSync(ir.join(o,Zs.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${mF().split("-")[0]}.pem`),await On.writeFile(ir.join(o,c),bt.privateKeyToPem(s)));let l=await AF(s,bt.setRsaPublicKey(s.n,s.e),!1);await ju({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 fh()){let r=Dg();yt.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await JO();let n=bt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await nN(bt.privateKeyFromPem(e.private_key),s,n);await ju({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(sN,"reviewSelfSignedCert");function RF(){let e=gie(Object.keys(Ss.CONFIG_PARAM_MAP),!0),t=ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME),r=ir.join(t,Zs.PRIVATEKEY_PEM_NAME),n=ir.join(t,Zs.NATS_CERTIFICATE_PEM_NAME),s=ir.join(t,Zs.NATS_CA_PEM_NAME),i=Ss.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),Ng.updateConfigValue(void 0,void 0,o,!1,!0)}a(RF,"updateConfigCert");function yF(e){return e.startsWith("-----BEGIN")?e:yie(e,"utf8")}a(yF,"readPEM");var dF=wg.createSecureContext;wg.createSecureContext=function(e){if(!e.cert||!e.key)return dF(e);let t={...e};delete t.key,delete t.cert;let r=dF(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var vie=SF.prototype._init;SF.prototype._init=function(e,t){vie.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 fl=new Map;function bF(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(),fl.clear();let f=0;for await(let d of WO.system.hdb_certificate.search([])){let _=d.certificate,h=new Ro(_);d.is_authority&&(h.asString=_,fl.set(h.subject,_))}for await(let d of WO.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let _=e==="operations-api",h=d.is_self_signed?1:2;d.uses?.includes(e)&&(h+=1);let m=await OF(d.private_key_name),S=d.certificate,g=new Ro(S);if(fl.has(g.issuer)&&(S+=`
|
|
22
|
+
`,"")}a(Gk,"runCommand");async function Kse(){try{await Ase.access(vO)}catch{return!1}let e=await Gk(`${vO} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return Rse.eq(t,$se)}a(Kse,"checkNATSServerInstalled");async function kO(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await kk.getClusterUser();if(ll(o))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=o.username,r=o.decrypt_hash}js.trace("create nats connection called");let i=await vse({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),js.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(o=>{o&&js.error("Error with Nats client connection, connection closed",o),i===Xr&&qk()}),i}a(kO,"createConnection");function qk(){Xr=void 0,ol=void 0,al=void 0,cl=void 0}a(qk,"clearClientCache");async function Yse(){Xr&&(await Xr.drain(),Xr=void 0,ol=void 0,al=void 0,cl=void 0)}a(Yse,"closeConnection");var Xr,cl;async function rh(){return cl||(cl=kO(Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),Xr=await cl),Xr||cl}a(rh,"getConnection");async function nh(){if(ol)return ol;ll(Xr)&&await rh();let{domain:e}=$u(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(ll(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return ol=await Xr.jetstreamManager({domain:e,timeout:6e4}),ol}a(nh,"getJetStreamManager");async function $k(){if(al)return al;ll(Xr)&&await rh();let{domain:e}=$u(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(ll(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return al=Xr.jetstream({domain:e,timeout:6e4}),al}a($k,"getJetStream");async function xi(){let e=Xr||await rh(),t=ol||await nh(),r=al||await $k();return{connection:e,jsm:t,js:r}}a(xi,"getNATSReferences");async function Wse(e){let t=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await kk.getClusterUser(),s=await kO(t,r,n),i=HO(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=Fk.decode(f.data);d.response_time=Date.now()-l,c.push(d)}})();return l=Date.now(),await s.publish("$SYS.REQ.SERVER.PING.VARZ",void 0,{reply:i}),await s.publish("$SYS.REQ.SERVER.PING",void 0,{reply:i}),await s.flush(),await Eg.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(Wse,"getServerList");async function FO(e,t){let{jsm:r}=await xi(),n=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:Use.File,retention:xse.Limits,subjects:t,discard:Bse.Old,max_msgs:s,max_bytes:i,max_age:n})}a(FO,"createLocalStream");async function Vk(){let{jsm:e}=await xi(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a(Vk,"listStreams");async function zse(e){let{jsm:t}=await xi();await t.streams.delete(e)}a(zse,"deleteLocalStream");async function Qse(e){let{connection:t}=await xi(),r=[],n=HO(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(Fk.decode(o.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}a(Qse,"listRemoteStreams");async function jse(e,t=void 0,r=void 0){let{jsm:n,js:s}=await xi(),i=Uk(),o={durable_name:i,ack_policy:xO.Explicit};t&&(o.deliver_policy=BO.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];let u=[];for await(let f of l){let d=UO(f.data),_={nats_timestamp:f.info.timestampNanos,nats_sequence:f.info.streamSequence,entry:d};if(f.headers&&(_.origin=f.headers.get(Hr.MSG_HEADERS.ORIGIN)),u.push(_),f.ack(),f.info.pending===0)break}return await c.delete(),u}a(jse,"viewStream");async function*Jse(e,t=void 0,r=void 0){let{jsm:n,js:s}=await xi(),i=Uk(),o={durable_name:i,ack_policy:xO.Explicit};t&&(o.deliver_policy=BO.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];for await(let u of l){let f=UO(u.data);f[0]||(f=[f]);for(let d of f){let _={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:d};u.headers&&(_.origin=u.headers.get(Hr.MSG_HEADERS.ORIGIN)),yield _}if(u.ack(),u.info.pending===0)break}await c.delete()}a(Jse,"viewStreamIterator");async function Xse(e,t,r,n){js.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=Kk(n,r);let{js:s}=await xi(),i=await Sg(),o=`${e}.${i}`,c=await Gse(()=>n instanceof Uint8Array?n:Hk.encode(n));try{js.trace(`publishToStream publishing to subject: ${o}`),Fse(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(o,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return Wk(async()=>{try{await s.publish(o,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){js.trace(`publishToStream creating stream: ${t}`);let f=o.split(".");f[2]="*",await FO(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(Xse,"publishToStream");function Kk(e,t){t===void 0&&(t=kse());let r=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(Hr.MSG_HEADERS.ORIGIN)&&r&&t.append(Hr.MSG_HEADERS.ORIGIN,r),t}a(Kk,"addNatsMsgHeader");function $u(e){e=e.toLowerCase();let t=th.join(Ir.get(Qe.CONFIG_PARAMS.ROOTPATH),qse);if(e===Qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return ll(MO)&&(MO={port:Z_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:Z_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Hr.SERVER_SUFFIX.HUB,config_file:Hr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:th.join(t,Hr.PID_FILES.HUB),hdb_nats_path:t}),MO;if(e===Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return ll(LO)&&(LO={port:Z_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:Z_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Hr.SERVER_SUFFIX.LEAF,config_file:Hr.NATS_CONFIG_FILES.LEAF_SERVER,domain:Z_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Hr.SERVER_SUFFIX.LEAF,pid_file_path:th.join(t,Hr.PID_FILES.LEAF),hdb_nats_path:t}),LO;js.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a($u,"getServerConfig");async function Yk(e,t,r,n){try{await e.consumers.add(t,{ack_policy:xO.Explicit,durable_name:r,deliver_policy:BO.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a(Yk,"createConsumer");async function Zse(e,t,r){await e.consumers.delete(t,r)}a(Zse,"removeConsumer");function eie(e){return e.split(".")[1]}a(eie,"extractServerName");async function tie(e,t,r=6e4,n=HO()){if(!Eg.isObject(t))throw new Error("data param must be an object");let s=Hk.encode(t),{connection:i}=await xi(),o={timeout:r};n&&(o.reply=n,o.noMux=!0);let c=await i.request(e,s,o);return UO(c.data)}a(tie,"request");function GO(e){return new Promise(async(t,r)=>{let n=Nse(vO,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",o=>{r(o)}),n.stdout.on("data",o=>{i+=o.toString()}),n.stderr.on("data",o=>{s+=o.toString()}),n.stderr.on("close",o=>{s&&r(s),t(i)})})}a(GO,"reloadNATS");async function rie(){let{pid_file_path:e}=$u(Qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await GO(e)}a(rie,"reloadNATSHub");async function nie(){let{pid_file_path:e}=$u(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await GO(e)}a(nie,"reloadNATSLeaf");function sie(e,t,r){let n;switch(e.code){case vk.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case vk.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(sie,"requestErrorHandler");async function iie(e,t){let r=t+Hr.SERVER_SUFFIX.LEAF,{connection:n}=await xi(),{jsm:s}=await _ie(r),{schema:i,table:o}=e,c=gg.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await Wk(async()=>{if(e.subscribe===!0)await Yk(s,c,n.info.server_name,l);else try{await Zse(s,c,n.info.server_name)}catch(u){js.trace(u)}})}a(iie,"updateRemoteConsumer");async function oie(e,t,r,n){let s=gg.createNatsTableStreamName(e,t),i=r+Hr.SERVER_SUFFIX.LEAF,o={type:Qe.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!Bk&&Lse()<Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=DO();await c(o)}await Pse(o),n==="stop"&&await Eg.async_set_timeout(1e3)}a(oie,"updateConsumerIterator");function Wk(e){return Cse.writeTransaction(Qe.SYSTEM_SCHEMA_NAME,Qe.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(Wk,"exclusiveLock");async function zk(e,t){let r=gg.createNatsTableStreamName(e,t),n=await Sg(),s=uie(e,t,n);await FO(r,[s])}a(zk,"createLocalTableStream");async function aie(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await zk(n,s)}}a(aie,"createTableStreams");async function Qk(e,t,r=void 0){if(Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=gg.createNatsTableStreamName(e,t),{domain:s}=$u(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await rh()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")js.warn(n);else throw n}}a(Qk,"purgeTableStream");async function cie(e,t){if(Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await Qk(e,t[r])}a(cie,"purgeSchemaTableStreams");async function lie(e){return(await nh()).streams.info(e)}a(lie,"getStreamInfo");function uie(e,t,r){return`${Hr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a(uie,"createSubjectName");async function Sg(){if(eh)return eh;if(eh=(await nh())?.nc?.info?.server_name,eh===void 0)throw new Error("Unable to get jetstream manager server name");return eh}a(Sg,"getJsmServerName");async function die(){let e=await nh(),t=await Sg(),r=await Vk();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=fie(n),c=i.split(".");if(c[c.length-1]===t&&!o||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let f=u.join(".");js.trace(`Updating stream subject name from: ${i} to: ${f}`),s.subjects[0]=f,await e.streams.update(s.name,s)}}a(die,"updateLocalStreams");function fie(e){let{config:t}=e,r=!1,n=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=Ir.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);return i=i===null?-1:i,n!==t.max_age&&(t.max_age=n,r=!0),s!==t.max_bytes&&(t.max_bytes=s,r=!0),i!==t.max_msgs&&(t.max_msgs=i,r=!0),r}a(fie,"updateStreamLimits");async function _ie(e){let t,r;try{t=await Xr.jetstream({domain:e}),r=await Xr.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw js.error("Unable to connect to:",e),n}return{js:t,jsm:r}}a(_ie,"connectToRemoteJS")});function qO(e){let t=e.get(Tg),r=t?(0,Vu.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:ih(e)??1,nodes:[]})})}i[n]=0,e.putSync(Tg,(0,Vu.pack)(r))}return r}function sh(e){return qO(e).remoteNameToId}function Xk(e,t){let r=qO(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(Tg,(0,Vu.pack)(r)),s}function Ag(e,t){let r=qO(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(Tg,(0,Vu.pack)(r))}return Jk.trace?.("The remote node name map",e,n,s),s}var Jk,Vu,Tg,$O=Re(()=>{Jk=v(ks());gs();Vu=require("msgpackr"),Tg=Symbol.for("remote-ids");a(qO,"getIdMappingRecord");a(sh,"exportIdMapping");a(Xk,"remoteToLocalNodeId");a(Ag,"getIdOfRemoteNode")});var VO={};Ue(VO,{commits_awaiting_replication:()=>Ku,getHDBNodeTable:()=>sr,getReplicationSharedStatus:()=>Rg,iterateRoutes:()=>ah,shouldReplicateToNode:()=>oh,subscribeToNodeUpdates:()=>Yu});function sr(){return Zk||(Zk=_t({table:"hdb_nodes",database:"system",attributes:[{name:"name",isPrimaryKey:!0},{attribute:"subscriptions"},{attribute:"system_info"},{attribute:"url"},{attribute:"routes"},{attribute:"ca"},{attribute:"ca_info"},{attribute:"replicates"},{attribute:"revoked_certificates"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]}))}function Rg(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Yu(e){sr().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;nF.debug?.("adding node",n,"on node",et()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==et()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of sr().search({}))if(i.shard!=null){let o=s.get(i.shard);o||s.set(i.shard,o=[]),o.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function oh(e,t){let r=Ra.default.get(x.REPLICATION_DATABASES);return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&(r==="*"||r?.find?.(n=>(typeof n=="string"?n:n.name)===t&&(!n.sharded||e.shard===Ra.default.get(x.REPLICATION_SHARD))))&&sr().primaryStore.get(et())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function hie(){Yu(e=>{ya({},(t,r)=>{let n=e.name,s=eF.get(n);if(s||eF.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=Rg(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of Ku.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*ah(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=Ra.default.get(x.REPLICATION_SECUREPORT)??(!Ra.default.get(x.REPLICATION_PORT)&&Ra.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||Ra.default.get(x.REPLICATION_PORT)||Ra.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){tF.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 tF,rF,Ra,nF,Zk,eF,Ku,ul=Re(()=>{xe();gs();Jm();tF=require("worker_threads"),rF=v(he()),Ra=v(le());k();nF=v(ks());server.nodes=[];a(sr,"getHDBNodeTable");a(Rg,"getReplicationSharedStatus");a(Yu,"subscribeToNodeUpdates");a(oh,"shouldReplicateToNode");eF=new Map;MD((e,t,r)=>{if(r>server.nodes.length)throw new rF.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);Ku||(Ku=new Map,hie());let n=Ku.get(e);return n||(n=[],Ku.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(hie,"startSubscriptionToReplications");a(ah,"iterateRoutes")});var oF={};Ue(oF,{connectedToNode:()=>dl,disconnectedFromNode:()=>zu,ensureNode:()=>Ao,requestClusterStatus:()=>iF,startOnMainThread:()=>YO});async function YO(e){let t=0,r=Je();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){yg.set(i,ih(l.auditStore));break}}}Hi.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes?.search([])||[])i.push(o);for(let o of ah(e))try{let c=!o.subscriptions;if(c){let u=et(),f=sr().primaryStore.get(u);if(f!==null){let d=e.url??ba();(f===void 0||f.url!==d||f.shard!==e.shard)&&await Ao(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)}Yu(s)});let n;function s(i,o=i?.name){let c=et()&&o===et()||ba()&&i?.url===ba();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let _ of sr().search([]))_.replicates&&_.name!==o&&s(_,_.name);n=d}if(nt.trace("Setting up node replication for",i),!i){for(let[d,_]of Bi){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){Bi.get(d).iterator.remove(),Bi.delete(d);return}}return}if(c)return;if(!i.url){nt.info(`Node ${i.name} is missing url`);return}let l=Bi.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 Wu)if(i.url===_.url){Wu.delete(d);break}Wu.set(i.name,i)}let u=Je();if(l||(l=new Map,Bi.set(i.url,l)),l.iterator=ya(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}];yg.has(d)&&ch.default.get(x.REPLICATION_FAILOVER)&&(S.push({replicateByDefault:_,name:et(),start_time:yg.get(d),end_time:Date.now(),replicates:!0}),yg.delete(d));let g=oh(i,d),R=Hi.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):lh(E)},mie);else{nt.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],sr().primaryStore.get(et())?.replicates),sr().primaryStore.get(et())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};m?m.postMessage(E):Og(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),zu=a(function(i){try{nt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(Wu.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=Bi.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||!ch.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=Wu.get(m);u=Bi.get(S.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==_){h=(h+1)%c.length;continue}let{worker:R,nodes:E}=g,T=!1;for(let N of f.nodes){if(E.some(M=>M.name===N.name)){nt.info(`Disconnected node is already failing over to ${m} for ${i.database}`);continue}N.end_time<Date.now()||(E.push(N),T=!0)}if(f.nodes=[f.nodes[0]],!T){nt.info(`Disconnected node ${i.name} has no nodes to fail over to ${m}`);return}nt.info(`Failing over ${i.database} from ${i.name} to ${m}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:E}):lh({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"),dl=a(function(i){let o=Bi.get(i.url),c=o?.get(i.database);if(!c){nt.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){nt.info("Connected node has no nodes",i.database,c);return}if(!l.name){nt.debug("Connected node is not named yet",i.database,c);return}if(!ch.default.get(x.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let f of Bi.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,Hi.onMessageByType)("disconnected-from-node",zu),(0,Hi.onMessageByType)("connected-to-node",dl),(0,Hi.onMessageByType)("request-cluster-status",iF)}function iF(e,t){let r=[];for(let[n,s]of Wu)try{let i=Bi.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,KO.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 Ao(e,t){let r=sr();e=e??Js(t.url),t.name=e;try{if(t.ca){let s=new sF.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&&!ch.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,KO.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 Hi,bg,nt,KO,ch,sF,mie,Bi,zu,dl,Wu,yg,uh=Re(()=>{xe();Hi=v(it());gs();bg=require("worker_threads");ul();nt=v(ee()),KO=require("lodash"),ch=v(le());k();sF=require("crypto"),mie=200,Bi=new Map,Wu=new Map,yg=new Map;a(YO,"startOnMainThread");a(iF,"requestClusterStatus");bg.parentPort&&(zu=a(e=>{bg.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),dl=a(e=>{bg.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Hi.onMessageByType)("subscribe-to-node",e=>{lh(e)}),(0,Hi.onMessageByType)("unsubscribe-from-node",e=>{Og(e)}));a(Ao,"ensureNode")});var ei=C(IF=>{"use strict";var ir=require("path"),{watch:fF}=require("chokidar"),On=require("fs-extra"),Qu=require("node-forge"),_F=require("net"),{generateKeyPair:zO,X509Certificate:Ro,createPrivateKey:hF}=require("crypto"),pie=require("util");zO=pie.promisify(zO);var bt=Qu.pki,Xs=require("joi"),{v4:mF}=require("uuid"),{validateBySchema:XO}=ot(),yt=ee(),Zn=le(),Ss=(k(),P(q)),{CONFIG_PARAMS:_l}=Ss,Zs=hb(),{ClientError:Na}=he(),wg=require("node:tls"),{relative:pF,join:Eie}=require("node:path"),{CERT_PREFERENCE_APP:oCe,CERTIFICATE_VALUES:aF}=Zs,gie=_c(),Ng=Lt(),{table:Sie,getDatabases:Tie,databases:WO}=(xe(),P(ct)),{getJWTRSAKeys:cF}=(ku(),P(J_));Object.assign(IF,{generateKeys:rN,updateConfigCert:RF,createCsr:Iie,signCertificate:Cie,setCertTable:ju,loadCertificates:tN,reviewSelfSignedCert:sN,createTLSSelector:bF,listCertificates:NF,addCertificate:Uie,removeCertificate:Bie,createNatsCerts:Lie,generateCertsKeys:Die,getReplicationCert:fh,getReplicationCertAuth:Nie,renewSelfSigned:Mie,hostnamesFromCert:iN,getKey:Hie});var{urlToNodeName:EF,getThisNodeUrl:Aie,getThisNodeName:Dg,clearThisNodeName:Rie}=(gs(),P(Ca)),{readFileSync:yie,statSync:gF}=require("node:fs"),aCe=le(),{getTicketKeys:bie,onMessageFromWorkers:Oie}=it(),Oa=ee(),{isMainThread:QO}=require("worker_threads"),{TLSSocket:SF,createSecureContext:cCe}=require("node:tls"),ZO=3650,dh=["127.0.0.1","localhost","::1"],eN=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];Oie(async e=>{e.type===Ss.ITC_EVENT_TYPES.RESTART&&(Zn.initSync(!0),await sN())});var kr;function Ia(){return kr||(kr=Tie().system.hdb_certificate,kr||(kr=Sie({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__"}]}))),kr}a(Ia,"getCertTable");async function fh(){let e=bF("replication"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(Dg());if(!r)return;let n=new Ro(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(fh,"getReplicationCert");async function Nie(){Ia();let e=(await fh()).options.cert,r=new Ro(e).issuer.match(/CN=(.*)/)?.[1];return kr.get(r)}a(Nie,"getReplicationCertAuth");var jO,wa=new Map,Ig=[],lF;function tN(){if(jO)return;if(jO=!0,!lF&&QO){let n=Ng.getConfigFilePath();lF=fF(n,{persistent:!1}).on("change",()=>{logger.warn?.("Config file changed, reloading certificates"),wie()})}let e=[{configKey:_l.TLS},{configKey:_l.OPERATIONSAPI_TLS}];Ia();let t=ir.dirname(Ng.getConfigFilePath()),r;for(let{configKey:n}of e){let s=Ng.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&pF(Eie(t,"keys"),o);if(c){let l=uF(o,u=>{wa.set(c,u)},"private key");l&&Ig.push(l)}for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&QO){let f=uF(u,d=>{if(aF.cert===d)return;let _=i.hostname??i.hostnames??i.host??i.hosts;_&&!Array.isArray(_)&&(_=[_]);let h=yF(u),m=new Ro(h),S;try{S=!l&&i.name||wF(m)}catch(M){logger.error("error extracting host name from certificate",M);return}if(S==null){logger.error("No host name found on certificate");return}if(m.checkIssued(new Ro(aF.cert)))return;let g=kr.primaryStore.get(S),R=gF(u).mtimeMs,E=!g||g.is_self_signed?1:g.fileTimestamp??g.__updatedtime__,T=i.uses??["https",...n.includes("operations")?["operations"]:[]],N=g&&R===E&&(JSON.stringify(g.uses)!==JSON.stringify(T)||g.ciphers!==i.ciphers||JSON.stringify(g.hostnames)!==JSON.stringify(_));if(E&&R<=E&&!N){R<E&&logger.info?.(`Certificate ${S} at ${u} is older (${new Date(R)}) than the certificate in the database (${E>1?new Date(E):"only self signed certificate available"})`);return}N&&logger.info?.(`Config values changed for certificate ${S}, updating record`),r=kr.put({name:S,uses:i.uses??["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:_,file_timestamp:R,details:{issuer:m.issuer.replace(/\n/g," "),subject:m.subject?.replace(/\n/g," "),subject_alt_name:m.subjectAltName,serial_number:m.serialNumber,valid_from:m.validFrom,valid_to:m.validTo}})},l?"certificate authority":"certificate");f&&Ig.push(f)}}}}}return r}a(tN,"loadCertificates");function wie(){for(let e of Ig)e.close();Ig.length=0,jO=!1,tN()}a(wie,"reloadCertificates");function uF(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&QO&&yt.warn(`Reloading ${r}:`,i),n=c,t(yF(i)))}catch(c){yt.error(`Error loading ${r}:`,i,c)}},"loadFile");return On.existsSync(e)?s(e,gF(e)):yt.error?.(`${r} file not found:`,e),fF(e,{persistent:!1}).on("change",s)}a(uF,"loadAndWatch");function Cg(){let e=Aie();if(e==null){let t=dh[0];return yt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return EF(e)}a(Cg,"getHost");function Pg(){let e=Dg();if(e==null){let t=dh[0];return yt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(Pg,"getCommonName");async function Iie(){let e=await fh(),t=bt.certificateFromPem(e.options.cert),r=bt.privateKeyFromPem(e.options.key);yt.info("Creating CSR with cert named:",e.name);let n=bt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:Pg()},...eN];yt.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:TF()}];return yt.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Qu.pki.certificationRequestToPem(n)}a(Iie,"createCsr");function TF(){let e=dh.includes(Pg())?dh:[...dh,Pg()];return e.includes(Cg())||e.push(Cg()),[{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=>_F.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(TF,"certExtensions");async function Cie(e){let t={},r=ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Ia();for await(let f of kr.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if(wa.has(f.private_key_name)){n=wa.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await On.exists(ir.join(r,f.private_key_name))){n=On.readFile(ir.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await JO();s=f.ca,n=f.private_key}n=bt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=bt.certificateFromPem(s.certificate);yt.info("Signing CSR with cert named",s.name);let o=bt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return yt.error(f),new Error("Error verifying CSR: "+f.message)}let c=Qu.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()+ZO),yt.info("sign cert setting validity:",c.validity),yt.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),yt.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;yt.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,Qu.md.sha256.create()),t.certificate=bt.certificateToPem(c)}else yt.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(Cie,"signCertificate");async function Pie(e,t){await ju({name:Dg(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await ju({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(Pie,"createCertificateTable");async function ju(e){let t=new Ro(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},Ia(),await kr.patch(e)}a(ju,"setCertTable");async function rN(){let e=await zO("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(rN,"generateKeys");async function nN(e,t,r){let n=bt.createCertificate();if(!t){let o=await fh();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()+ZO);let i=[{name:"commonName",value:Pg()},...eN];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(TF()),n.sign(e,Qu.md.sha256.create()),bt.certificateToPem(n)}a(nN,"generateCertificates");async function JO(){let e=await NF(),t;for(let r of e){if(!r.is_authority)continue;let n=await OF(r.private_key_name);if(r.private_key_name&&n&&new Ro(r.certificate).checkPrivateKey(hF(n))){yt.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;yt.trace("No CA found with matching private key")}a(JO,"getCertAuthority");async function AF(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()+ZO);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${Zn.get(_l.REPLICATION_HOSTNAME)??EF(Zn.get(_l.REPLICATION_URL))??mF().split("-")[0]}`},...eN];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Qu.md.sha256.create());let o=ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME),c=ir.join(o,Zs.PRIVATEKEY_PEM_NAME);return r&&await On.writeFile(c,bt.privateKeyToPem(e)),n}a(AF,"generateCertAuthority");async function Die(){let{private_key:e,public_key:t}=await rN(),r=await AF(e,t),n=await nN(e,t,r);await Pie(n,r),RF()}a(Die,"generateCertsKeys");async function Lie(){let e=await nN(bt.privateKeyFromPem(Zs.CERTIFICATE_VALUES.key),void 0,bt.certificateFromPem(Zs.CERTIFICATE_VALUES.cert)),t=ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME),r=ir.join(t,Zs.NATS_CERTIFICATE_PEM_NAME);await On.exists(r)||await On.writeFile(r,e);let n=ir.join(t,Zs.NATS_CA_PEM_NAME);await On.exists(n)||await On.writeFile(n,Zs.CERTIFICATE_VALUES.cert)}a(Lie,"createNatsCerts");async function Mie(){Ia();for await(let e of kr.search([{attribute:"is_self_signed",value:!0}]))await kr.delete(e.name);await sN()}a(Mie,"renewSelfSigned");async function sN(){Rie(),await tN(),Ia();let e=await JO();if(!e){yt.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=a(u=>{try{return{key:bt.privateKeyFromPem(On.readFileSync(u)),keyPath:u}}catch(f){return yt.warn(`Failed to parse private key from ${u}:`,f.message),{key:null,keyPath:u}}},"tryToParseKey"),n=Zn.get(_l.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=Zn.get(_l.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME),c=pF(o,i);s||(yt.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{private_key:s}=await rN(),On.existsSync(ir.join(o,Zs.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${mF().split("-")[0]}.pem`),await On.writeFile(ir.join(o,c),bt.privateKeyToPem(s)));let l=await AF(s,bt.setRsaPublicKey(s.n,s.e),!1);await ju({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 fh()){let r=Dg();yt.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await JO();let n=bt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await nN(bt.privateKeyFromPem(e.private_key),s,n);await ju({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(sN,"reviewSelfSignedCert");function RF(){let e=gie(Object.keys(Ss.CONFIG_PARAM_MAP),!0),t=ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME),r=ir.join(t,Zs.PRIVATEKEY_PEM_NAME),n=ir.join(t,Zs.NATS_CERTIFICATE_PEM_NAME),s=ir.join(t,Zs.NATS_CA_PEM_NAME),i=Ss.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),Ng.updateConfigValue(void 0,void 0,o,!1,!0)}a(RF,"updateConfigCert");function yF(e){return e.startsWith("-----BEGIN")?e:yie(e,"utf8")}a(yF,"readPEM");var dF=wg.createSecureContext;wg.createSecureContext=function(e){if(!e.cert||!e.key)return dF(e);let t={...e};delete t.key,delete t.cert;let r=dF(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var vie=SF.prototype._init;SF.prototype._init=function(e,t){vie.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 fl=new Map;function bF(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(),fl.clear();let f=0;for await(let d of WO.system.hdb_certificate.search([])){let _=d.certificate,h=new Ro(_);d.is_authority&&(h.asString=_,fl.set(h.subject,_))}for await(let d of WO.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let _=e==="operations-api",h=d.is_self_signed?1:2;d.uses?.includes(e)&&(h+=1);let m=await OF(d.private_key_name),S=d.certificate,g=new Ro(S);if(fl.has(g.issuer)&&(S+=`
|
|
23
23
|
`+fl.get(g.issuer)),!m||!S)throw new Error("Missing private key or certificate for secure server");let R={ciphers:d.ciphers,ticketKeys:bie(),availableCAs:fl,ca:t&&Array.from(fl.values()),cert:S,key:m,key_file:d.private_key_name,is_self_signed:d.is_self_signed};o&&(R.sessionIdContext=o.sessionIdContext);let E=d.hostnames??iN(g);Array.isArray(E)||(E=[E]);for(let M of E)M===Cg()&&(h+=.1);let T=wg.createSecureContext(R);T.name=d.name,T.options=R,T.quality=h,T.certificateAuthorities=Array.from(fl),T.certStart=S.toString().slice(0,100),Array.isArray(E)||(E=[E]);let N;for(let M of E)if(M){M[0]==="*"&&(s=!0,M=M.slice(1)),M===Cg()&&(h+=2),_F.isIP(M)&&(N=!0);let H=r.get(M)?.quality??0;h>H&&r.set(M,T)}else Oa.error("No hostname found for certificate at",wg.certificate);Oa.trace("Adding TLS",T.name,"for",o.ports||"client","cert named",d.name,"hostnames",E,"quality",h,"best quality",f),h>f&&(i.defaultContext=n=T,f=h,o&&(o.defaultContext=T))}catch(_){Oa.error("Error applying TLS for",d.name,_)}o?.secureContextsListeners.forEach(d=>d()),c(n)}catch(f){l(f)}}a(u,"updateTLS"),WO.system.hdb_certificate.subscribe({listener:a(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(o,c){Oa.info("TLS requested for",o||"(no SNI)");let l=o;for(;;){let f=r.get(l);if(f)return Oa.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?Oa.debug("No certificate found to match",o,"using the default certificate"):Oa.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):Oa.info("No default certificate found"),c(null,u)}a(i,"SNICallback")}a(bF,"createTLSSelector");async function OF(e){let t=wa.get(e);return!t&&e?await On.readFile(ir.join(Zn.get(_l.ROOTPATH),Ss.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(OF,"getPrivateKeyByName");async function NF(){Ia();let e=[];for await(let t of kr.search([]))e.push(t);return e}a(NF,"listCertificates");async function Uie(e){let t=XO(e,Xs.object({name:Xs.string().required(),certificate:Xs.string().required(),is_authority:Xs.boolean().required(),private_key:Xs.string(),hosts:Xs.array(),uses:Xs.array()}));if(t)throw new Na(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,o=new Ro(n),c=!1,l=!1,u;for(let[h,m]of wa)!s&&!c&&o.checkPrivateKey(hF(m))&&(c=!0,u=h),s&&s===m&&(l=!0,u=h);if(!i&&!s&&!c)throw new Na("A suitable private key was not found for this certificate");let f;if(!r){try{f=wF(o)}catch(h){yt.error(h)}if(f==null)throw new Na("Error extracting certificate common name, please provide a name parameter")}let d=xie(r??f);s&&!c&&!l&&(await On.writeFile(ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME,d+".pem"),s),wa.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 ju(_),"Successfully added certificate: "+d}a(Uie,"addCertificate");function xie(e){return e.replace(/[^a-z0-9.]/gi,"-")}a(xie,"sanitizeName");async function Bie(e){let t=XO(e,Xs.object({name:Xs.string().required()}));if(t)throw new Na(t.message);let{name:r}=e;Ia();let n=await kr.get(r);if(!n)throw new Na(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await kr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(yt.info("Removing private key named",s),await On.remove(ir.join(Zn.getHdbBasePath(),Ss.LICENSE_KEY_DIR_NAME,s)))}return await kr.delete(r),"Successfully removed "+r}a(Bie,"removeCertificate");function wF(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||iN(e)[0]}a(wF,"getPrimaryHostName");function iN(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(iN,"hostnamesFromCert");async function Hie(e){if(e.bypass_auth!==!0)throw new Na("Unauthorized","401");let t=XO(e,Xs.object({name:Xs.string().required()}));if(t)throw new Na(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await cF()).privateKey;if(r===".jwtPublic")return(await cF()).publicKey;if(wa.get(r))return wa.get(e.name);throw new Na("Key not found")}a(Hie,"getKey")});var QF={};Ue(QF,{CONFIRMATION_STATUS_POSITION:()=>WF,NodeReplicationConnection:()=>Xu,OPERATION_REQUEST:()=>lN,RECEIVED_TIME_POSITION:()=>kg,RECEIVED_VERSION_POSITION:()=>Hg,RECEIVING_STATUS_POSITION:()=>Fg,RECEIVING_STATUS_RECEIVING:()=>zF,RECEIVING_STATUS_WAITING:()=>uN,SENDING_TIME_POSITION:()=>_h,createWebSocket:()=>Gg,database_subscriptions:()=>Da,replicateOverWS:()=>hh,table_update_listeners:()=>fN});async function Gg(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(!aN){let l=(0,$F.createTLSSelector)("replication"),u={secureContexts:null};await l.initialize(u),aN=u.secureContexts}if(i=aN.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,KF.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(Bg?.caCount!==yo.size&&(Bg=VF.createSecureContext({...i.options,ca:[...yo,...i.options.availableCAs.values()]}),Bg.caCount=yo.size),c.secureContext=Bg),new GF.WebSocket(e,"harperdb-replication-v1",c)}function hh(e,t,r){let n=t.port||t.securePort,s=hl.pid%1e3+"-"+qF.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||Da,d,_,h=!1,m=t.subscription;m?.then&&m.then(A=>m=A);let S=t.tables||u&&Je()[u];if(!r){ce.error?.("No authorization provided"),cn(1008,"Unauthorized");return}let g=new Map,R=[],E=r.name;E&&t.connection&&(t.connection.nodeName=E);let T,N,M,H,X,W,$,se=6e4,z,fe=0,ue=0,Z=0,Ae=FF.default.get(x.REPLICATION_BLOBTIMEOUT)??12e4,me=new Map,ye=[],Ht=0,dt;if(t.url){let A=a(()=>{X&&ue===e._socket?.bytesRead&&Z===e._socket?.bytesWritten?e.terminate():(X=performance.now(),e.ping(),ue=e._socket?.bytesRead,Z=e._socket?.bytesWritten)},"send_ping");M=setInterval(A,HF).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())},HF*2).unref()}a(Ln,"resetPingTimer");function Vr(){if(!(!E||!u||!d))return _||(_=Rg(d,u,E)),_}a(Vr,"getSharedStatus"),u&&jo(u);let Cr,Qd,oc=[],oA=[],aA,kt=[],jd=[],Jd=[],cA=150,Im=25,Xd=0,Ce=0,Zd=!1,Ji,Pr,Mn,ac;e.on("message",A=>{fe=performance.now();try{let y=A.dataView=new Lc(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let B=(0,Ze.decode)(A),[w,D,G]=B;switch(w){case PF:{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)([Ju])),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,Ao(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=ya(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)([Ju])),cn(1008,oe.message);return}zo()}break}case xF:{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=Je()?.[V]))}break}case Ju:cn();break;case lN: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)([Mg,V]))},V=>{e.send((0,Ze.encode)([Mg,{requestId:D.requestId,error:V instanceof Error?V.toString():V}]))})}catch(oe){e.send((0,Ze.encode)([Mg,{requestId:D.requestId,error:oe instanceof Error?oe.toString():oe}]))}break;case Mg:let{resolve:j,reject:Q}=g.get(D.requestId);D.error?Q(new Error(D.error)):j(D),g.delete(D.requestId);break;case oN: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 DF:ac=d?Xk(D,d):new Map,aA=B[2],ce.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${aA}`);break;case LF:let Ee=G;Jd[Ee]=D;break;case UF:Vr()[WF]=D,ce.trace?.(s,"received and broadcasting committed update",D),Vr().buffer.notify();break;case vF:T=D,m.send({type:"end_txn",localTime:T,remoteNodeIds:R}),Vr(),_[Hg]=T,_[kg]=Date.now(),_[Fg]=uN;break;case vg:{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 cN.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 MF:{let oe=D,V;try{let J=B[3],de=oA[G]||(oA[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)([oN,{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),vf(()=>de.primaryStore.decoder.decode(Ie),rt=>cc(rt,J),de.primaryStore.rootStore)),V=(0,Ze.encode)([Lg,oe,{value:De,expiresAt:He.expiresAt,version:He.version,residencyId:He.residencyId,nodeId:He.nodeId,user:He.user}])}else V=(0,Ze.encode)([Lg,oe])}catch(J){V=(0,Ze.encode)([Lg,oe,{error:J.message}])}e.send(V);break}case Lg:{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;mp(()=>{let Ie=oc[J].decoder.decode(pe.value);pe.value=Ie,pe.key=de,oe(pe)||ae&&setTimeout(()=>ae.forEach(fp),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 CF:{Mn=D;let oe,V,J=!1;if(m){if(u!==m.databaseName&&!m.then){ce.error?.("Subscription request for wrong database",u,m.databaseName);return}}else m=f.get(u);if(ce.debug?.(s,"received subscription request for",u,"at",Mn),!m){let Oe;m=new Promise(Rr=>{ce.debug?.("Waiting for subscription to database "+u),Oe=Rr}),m.ready=Oe,Da.set(u,m)}if(r.name)V=sr().subscribe(r.name),V.then(async Oe=>{oe=Oe;for await(let Rr of oe){let Nt=Rr.value;if(!(Nt?.replicates===!0||Nt?.replicates?.receives||Nt?.subscriptions?.some(yr=>(yr.database||yr.schema)===u&&yr.publish!==!1))){J=!0,e.send((0,Ze.encode)([Ju])),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)([Ju])),cn(1008,`Unauthorized database subscription to ${u}`);return}if(Pr&&(ce.debug?.(s,"stopping previous subscription",u),Pr.emit("close")),Mn.length===0)return;let de=Mn[0],pe=a(Oe=>{if(Oe&&(de.replicateByDefault?!de.tables.includes(Oe.tableName):de.tables.includes(Oe.tableName)))return{table:Oe}},"tableToTableEntry"),ae={txnTime:0},Ie,He,De=1/0,rt,vn=a((Oe,Rr)=>{if(Oe.type==="end_txn"){ae.txnTime&&(o[i]!==66&&ce.error?.("Invalid encoding of message"),Xi(9),Xi(vp),p(rt=Rr),di()),i=c,ae.txnTime=0;return}let Nt=Oe.nodeId,yr=Oe.tableId,At=He[yr];if(!At&&(At=He[yr]=pe(m.tableById[yr]),!At))return ce.debug?.("Not subscribed to table",yr);let ls=At.table,wt=ls.primaryStore,vs=wt.encoder;(Oe.extendedType&Ap||!vs.typedStructs)&&(vs._mergeStructures(vs.getStructures()),vs.typedStructs&&(vs.lastTypedStructuresLength=vs.typedStructs.length));let Kl=Ie[Nt];if(!(Kl&&Kl.startTime<Rr&&(!Kl.endTime||Kl.endTime>Rr)))return xg&&ce.trace?.(s,"skipping replication update",Oe.recordId,"to:",E,"from:",Nt,"subscribed:",Ie),mP();xg&&ce.trace?.(s,"sending replication update",Oe.recordId,"to:",E,"from:",Nt,"subscribed:",Ie);let lA=Oe.version,dc=Oe.residencyId,uA=tf(dc,ls),Pm;if(uA&&!uA.includes(E)){let Us=tf(Oe.previousResidencyId,ls);if(Us&&!Us.includes(E)&&(Oe.type==="put"||Oe.type==="patch")||ls.getResidencyById)return mP();let nf=Oe.recordId;ce.trace?.(s,"sending invalidation",nf,E,"from",Nt);let sf=0;dc&&(sf|=Cc),Oe.previousResidencyId&&(sf|=Pc);let _A,Dm=null;for(let pP in ls.indices){if(!Dm){if(_A=Oe.getValue(wt,!0),!_A)break;Dm={}}Dm[pP]=_A[pP]}Pm=wc(Oe.version,yr,nf,null,Nt,Oe.user,Oe.type==="put"||Oe.type==="patch"?"invalidate":Oe.type,vs.encode(Dm),sf,dc,Oe.previousResidencyId,Oe.expiresAt)}function mP(){return ce.trace?.(s,"skipping audit record",Oe.recordId),W||(W=setTimeout(()=>{W=null,(rt||0)+BF/2<De&&(xg&&ce.trace?.(s,"sending skipped sequence update",De),e.send((0,Ze.encode)([vF,De])))},BF).unref()),new Promise(setImmediate)}a(mP,"skipAuditRecord");let dA=vs.typedStructs,fA=vs.structures;if((dA?.length!=At.typed_length||fA?.length!=At.structure_length)&&(At.typed_length=dA?.length,At.structure_length=fA.length,ce.debug?.(s,"send table struct",At.typed_length,At.structure_length),At.sentName||(At.sentName=!0),e.send((0,Ze.encode)([oN,{typedStructs:dA,structures:fA,attributes:ls.attributes,schemaDefined:ls.schemaDefined},yr,At.table.tableName]))),dc&&!jd[dc]&&(e.send((0,Ze.encode)([LF,uA,dc])),jd[dc]=!0),ae.txnTime!==lA&&(ae.txnTime&&(xg&&ce.trace?.(s,"new txn time, sending queued txn",ae.txnTime),o[i]!==66&&ce.error?.("Invalid encoding of message"),di()),ae.txnTime=lA,i=c,p(lA)),Pm)Xi(Pm.length),K(Pm);else{let Us=Oe.encoded;Oe.extendedType&Ur&&vf(()=>Oe.getValue(wt),sf=>cc(sf,Oe.recordId),wt.rootStore);let nf=Us[0]===66?8:0;Xi(Us.length-nf),K(Us,nf),ce.trace?.("wrote record",Oe.recordId,"length:",Us.length)}return e._socket.writableNeedDrain?new Promise(Us=>{ce.debug?.(`Waiting for remote node ${E} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Us)}):Ht>Im?new Promise(Us=>{dt=Us}):new Promise(setImmediate)},"sendAuditRecord"),di=a(()=>{c-i>8?(e.send(o.subarray(i,c)),ce.debug?.(s,"Sent message, size:",c-i),Mt(c-i,"bytes-sent",`${E}.${u}`,"replication","egress")):ce.debug?.(s,"skipping empty transaction")},"sendQueuedData");Pr=new dN.EventEmitter,Pr.once("close",()=>{J=!0,oe?.end()});for(let{startTime:Oe}of Mn)Oe<De&&(De=Oe);(V||Promise.resolve()).then(async()=>{m=await m,d=m.auditStore,He=m.tableById.map(pe),Ie=[];for(let{name:Rr,startTime:Nt,endTime:yr}of Mn){let At=Ag(Rr,d);ce.debug?.("subscription to",Rr,"using local id",At,"starting",Nt),Ie[At]={startTime:Nt,endTime:yr}}rf(u),Cr||(Cr=nl(Rr=>{Rr.databaseName===u&&rf(u)}),Qd=G_(Rr=>{Rr===u&&(e.send((0,Ze.encode)([Ju])),cn())}),e.on("close",()=>{Cr?.remove(),Qd?.remove()})),e.send((0,Ze.encode)([DF,sh(m.auditStore),Mn.map(({name:Rr})=>Rr)]));let Oe=!0;do{isFinite(De)||(ce.warn?.("Invalid sequence id "+De),cn(1008,"Invalid sequence id"+De));let Rr;if(Oe&&!J&&(Oe=!1,De===0)){let Nt=De,yr=qg(d);for(let At in S){if(!pe(At))continue;let ls=S[At];ce.warn?.(`Fully copying ${At} table to ${E}`);for(let wt of ls.primaryStore.getRange({snapshot:!1,versions:!0})){if(J)return;if(wt.localTime>=De){ce.trace?.(s,"Copying record from",u,At,wt.key,wt.localTime),Nt=Math.max(wt.localTime,Nt),Vr()[_h]=1;let vs=wc(wt.version,ls.tableId,wt.key,null,yr,null,"put",vf(()=>ls.primaryStore.encoder.encode(wt.value),Kl=>cc(Kl,wt.key)),wt.metadataFlags&-256,wt.residencyId,null,wt.expiresAt);await vn({recordId:wt.key,tableId:ls.tableId,type:"put",getValue(){return wt.value},encoded:vs,version:wt.version,residencyId:wt.residencyId,nodeId:yr,extendedType:wt.metadataFlags},wt.localTime)}}}c-i>8&&vn({type:"end_txn"},De),Vr()[_h]=0,De=Nt}for(let{key:Nt,value:yr}of d.getRange({start:De||1,exclusiveStart:!0,snapshot:!1})){if(J)return;let At=St(yr);ce.debug?.("sending audit record",new Date(Nt)),Vr()[_h]=Nt,De=Nt,await vn(At,Nt),Pr.startTime=Nt}c-i>8&&vn({type:"end_txn"},De),Vr()[_h]=0,await YL(d)}while(!J)}).catch(Oe=>{ce.error?.(s,"Error handling subscription to node",Oe),cn(1008,"Error handling subscription to node")});break}}return}y.position=8;let I=!0,b,U;do{Vr();let B=y.readInt();if(B===9&&y.getUint8(y.position)==vp){y.position++,T=U=y.readFloat64(),_[Hg]=T,_[kg]=Date.now(),_[Fg]=uN,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;mp(()=>{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),_[Hg]=D.version,_[kg]=Date.now(),_[Fg]=zF,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>cA&&!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)([UF,N])),ce.trace?.(s,"sent confirmation of a commit at",N),N=null},Fie)),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&&dl({name:E,database:u,url:t.url,latency:t.connection.latency})),X=null}),e.on("close",(A,y)=>{clearInterval(M),clearTimeout(H),clearInterval($),Pr&&Pr.emit("close"),Ji&&Ji.end();for(let[I,{reject:b}]of g)b(new Error(`Connection closed ${y?.toString()} ${A}`));ce.debug?.(s,"closed",A,y?.toString())});function cn(A,y){e.isFinished=!0,e.close(A,y),t.connection?.emit("finished")}a(cn,"close");let Dr=new Set;async function cc(A,y){let I=_p(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)([vg,{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)([vg,{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)([vg,{fileId:I,finished:!0,error:b.toString()},Buffer.alloc(0)]))}finally{Dr.delete(I),Ht--,Ht<Im&&dt?.()}}a(cc,"sendBlobs");function ef(A,y){let I=_p(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 cN.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=oo(()=>Mf(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&&Ag(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&&Ag(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&&Ug)try{new URL(Ug).hostname===b.name&&E===b.name?(ce.warn?.(`Requesting full copy of database ${u} from ${Ug}`),j=0):j=Date.now()-6e4}catch(Q){ce.error?.("Error parsing leader URL",Ug,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)([CF,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!(Pa&&Pa!="*"&&!Pa[A]&&!Pa.includes?.(A)&&!Pa.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=Je()?.[A]);let y=et();if(y===E)throw y?new Error("Should not connect to self",y):new Error("Node name not defined");return Cm(y,A),!0}a(jo,"setDatabase");function Cm(A,y){let I=Je()?.[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)([PF,A,y,b]))}a(Cm,"sendNodeDBName");function rf(A){let y=Je()?.[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)([xF,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=[MF,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)([lN,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),_t({table:A.table,database:A.database,schemaDefined:A.schemaDefined,attributes:w,...y})):y}}var FF,Ze,GF,qF,ce,dN,$F,VF,hl,KF,cN,YF,CF,PF,DF,Ju,LF,oN,MF,Lg,lN,Mg,vF,UF,xF,vg,WF,Hg,kg,_h,Fg,uN,zF,kie,Ug,fN,Da,xg,BF,Fie,HF,aN,Bg,kF,Xu,_N=Re(()=>{xe();Ai();$O();wR();gs();FF=v(le());k();cu();Ze=require("msgpackr"),GF=require("ws"),qF=require("worker_threads"),ce=v(ks());uh();dN=require("events"),$F=v(ei()),VF=v(require("node:tls"));ul();hl=v(require("node:process")),KF=require("node:net");Di();hn();cN=require("node:stream"),YF=v(require("minimist")),CF=129,PF=140,DF=141,Ju=142,LF=130,oN=132,MF=133,Lg=134,lN=136,Mg=137,vF=143,UF=144,xF=145,vg=146,WF=0,Hg=1,kg=2,_h=3,Fg=4,uN=0,zF=1,kie=(0,YF.default)(hl.argv),Ug=kie.HDB_LEADER_URL??hl.env.HDB_LEADER_URL,fN=new Map,Da=new Map,xg=!0,BF=300,Fie=2,HF=3e4;a(Gg,"createWebSocket");kF=500,Xu=class extends dN.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=kF;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await Gg(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;ce.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${hl.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=kF,this.nodeSubscriptions&&dl({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,n=hh(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&&zu({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(hh,"replicateOverWS")});var Ca={};Ue(Ca,{clearThisNodeName:()=>Qie,disableReplication:()=>Vie,enabled_databases:()=>Pa,forEachReplicatedDatabase:()=>ya,getThisNodeId:()=>qg,getThisNodeName:()=>et,getThisNodeUrl:()=>ba,hostnameToUrl:()=>Wg,lastTimeInAuditStore:()=>ih,monitorNodeCAs:()=>nG,replicateOperation:()=>Jie,replication_certificate_authorities:()=>yo,sendOperationToNode:()=>mh,servers:()=>qie,setReplicator:()=>iG,start:()=>$ie,startOnMainThread:()=>YO,subscribeToNode:()=>lh,unsubscribeFromNode:()=>Og,urlToNodeName:()=>Js});function $ie(e){if(!e.port&&!e.securePort&&(e.port=Ts.default.get(x.OPERATIONSAPI_NETWORK_PORT),e.securePort=Ts.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 ah(e))t.set(Js(s.url),s);Kie(e),e={mtls:!0,usageType:"replication",maxPayload:10*1024*1024*1024,...e};let r=Ye.ws(async(s,i,o,c)=>{if(i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,o);await o,s._socket.unref(),hh(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&or.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Ye.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){!s.authorized&&s._nodeRequest.socket.authorizationError&&or.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let o=sr().primaryStore;if(s.authorized&&s.peerCertificate.subject){let c=s.peerCertificate.subject,l=c&&(o.get(c.CN)||t.get(c.CN));if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){or.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else or.warn(`No node found for certificate common name ${c.CN}, available nodes are ${Array.from(o.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=o.get(s.ip)||t.get(s.ip);c?s.user=c:or.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...o.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=a(()=>{let o=new Set(s.secureContexts.values());s.defaultContext&&o.add(s.defaultContext);for(let c of o)try{let l=Array.from(yo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=Yg.createSecureContext(u)}catch(l){or.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Ts.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1&&i()}nG(()=>{for(let s of n)s()})}function nG(e){let t=0;Yu(r=>{r?.ca&&(yo.add(r.ca),yo.size!==t&&(t=yo.size,e?.()))})}function Vie(e=!0){rG=e}function Kie(e){rG||(Je(),Pa=e.databases,ya(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||Da;for(let[s,i]of Vg){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];iG(r,s,e),fN.get(s)?.forEach(i=>i(s))}}))}function iG(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 sG extends Kr{static{a(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||Da,o=i.get(e),c=o?.tableById||[];c[t.tableId]=t;let l=o?.ready;if(or.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new xn,i.set(e,o),o.tableById=c,o.auditStore=t.auditStore,o.dbisDB=t.dbisDB,o.databaseName=e,l&&l(o),o;this.subscription=o}static subscribeOnThisThread(i,o){return!0}static async load(i){if(i){let o=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),o]);if(c){let l,u=new Set;do{let f;for(let _ of c){if(_===Ye.hostname)continue;let h=Wie(_,sG.subscription,e);h?.isConnected&&!u.has(h)&&(!f||h.latency<f.latency)&&(f=h)}if(!f)throw l||new eG.ServerError("No connection to any other nodes are available",502);let d={requestId:Gie++,table:t,entry:i,id:i.key};u.add(f);try{return await f.getRecord(d)}catch(_){if(f.isConnected)throw _;or.warn("Error in load from node",Kg,_),l||(l=_)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function Yie(e,t,r,n,s){let i=Vg.get(e);i||(i=new Map,Vg.set(e,i));let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new Xu(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function Wie(e,t,r){let n=jF.get(e);n||(n=new Map,jF.set(e,n));let s=n.get(r);if(s)return s;let i=sr().primaryStore.get(e);return i?.url&&(s=new Xu(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function mh(e,t,r){r||(r={}),r.serverName=e.name;let n=await Gg(e.url,r),s=hh(n,{},{});return new Promise((i,o)=>{n.on("open",()=>{i(s.sendOperation(t))}),n.on("error",c=>{o(c)}),n.on("close",c=>{or.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function lh(e){try{tG.isMainThread&&or.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=Da.get(e.database);if(!t){let n;t=new Promise(s=>{or.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,Da.set(e.database,t)}let r=Yie(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=>oh(n,e.database)),e.replicateByDefault)}catch(t){or.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function Og({name:e,url:t,database:r}){or.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(sr().primaryStore.getRange({})));let n=Vg.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function zie(){if(hN!==void 0)return hN;let e=Ts.default.get(x.OPERATIONSAPI_TLS_CERTIFICATE)||Ts.default.get(x.TLS_CERTIFICATE);if(e)return hN=new XF.X509Certificate((0,ZF.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function et(){return Kg||(Kg=Ts.default.get("replication_hostname")??Js(Ts.default.get("replication_url"))??zie()??JF("operationsapi_network_secureport")??JF("operationsapi_network_port")??"127.0.0.1")}function Qie(){Kg=void 0}function JF(e){let t=Ts.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function $g(e){let t=Ts.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[[\]]/g,""):+t}function qg(e){return sh(e)?.[et()]}function ba(){let e=Ts.default.get("replication_url");return e||Wg(et())}function Wg(e){let t=$g("replication_port");if(t)return`ws://${e}:${t}`;if(t=$g("replication_secureport"),t)return`wss://${e}:${t}`;if(t=$g("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=$g("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function Js(e){if(e)return new URL(e).hostname}function ya(e,t){for(let n of Object.getOwnPropertyNames(We))r(n);return G_(n=>{r(n)}),nl((n,s)=>{r(n.databaseName)});function r(n){let s=We[n];or.trace("Checking replication status of ",n,e?.databases),e?.databases===void 0||e.databases==="*"||e.databases.includes(n)||e.databases.some?.(i=>i.name===n)||!s?t(s,n,!0):jie(n)&&t(s,n,!1)}a(r,"forDatabase")}function jie(e){let t=We[e];for(let r in t)if(t[r].replicate)return!0}function ih(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function Jie(e){let t={message:""};if(e.replicated){e.replicated=!1,or.trace?.("Replicating operation",e.operation,"to nodes",Ye.nodes.map(n=>n.name));let r=await Promise.allSettled(Ye.nodes.map(n=>mh(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 Ts,or,XF,ZF,Yg,eG,tG,rG,Gie,qie,yo,Pa,Vg,jF,hN,Kg,gs=Re(()=>{xe();na();Ql();_N();Lr();Ts=v(le()),or=v(ee()),XF=require("crypto"),ZF=require("fs");uh();ul();k();$O();Yg=v(require("node:tls")),eG=v(he()),tG=require("worker_threads"),Gie=1,qie=[],yo=Ts.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1?new Set(Yg.rootCertificates):new Set;a($ie,"start");a(nG,"monitorNodeCAs");a(Vie,"disableReplication");a(Kie,"assignReplicationSource");a(iG,"setReplicator");Vg=new Map;a(Yie,"getSubscriptionConnection");jF=new Map;a(Wie,"getRetrievalConnectionByName");a(mh,"sendOperationToNode");a(lh,"subscribeToNode");a(Og,"unsubscribeFromNode");a(zie,"getCommonNameFromCert");a(et,"getThisNodeName");a(Qie,"clearThisNodeName");Object.defineProperty(Ye,"hostname",{get(){return et()}});a(JF,"getHostFromListeningPort");a($g,"getPortFromListeningPort");a(qg,"getThisNodeId");Ye.replication={getThisNodeId:qg,exportIdMapping:sh};a(ba,"getThisNodeUrl");a(Wg,"hostnameToUrl");a(Js,"urlToNodeName");a(ya,"forEachReplicatedDatabase");a(jie,"hasExplicitlyReplicatedTable");a(ih,"lastTimeInAuditStore");a(Jie,"replicateOperation")});var Eh=C((UCe,uG)=>{"use strict";var Zu=Ak(),{validateBySchema:ph}=ot(),{common_validators:ed,schema_regex:mN}=bi(),ar=require("joi"),Xie=ee(),Zie=require("uuid").v4,jg=uo(),td=(k(),P(q)),eoe=require("util"),La=$n(),{handleHDBError:bo,hdb_errors:toe,ClientError:ml}=he(),{HDB_ERROR_MSGS:zg,HTTP_STATUS_CODES:Oo}=toe,{SchemaEventMsg:Jg}=qs(),oG=gr(),{getDatabases:roe}=(xe(),P(ct)),{transformReq:rd}=ie(),{replicateOperation:aG}=(gs(),P(Ca)),{cleanupOrphans:vCe}=(hn(),P(au)),Qg=ar.string().min(1).max(ed.schema_length.maximum).pattern(mN).messages({"string.pattern.base":"{:#label} "+ed.schema_format.message}),noe=ar.string().min(1).max(ed.schema_length.maximum).pattern(mN).messages({"string.pattern.base":"{:#label} "+ed.schema_format.message}).required(),soe=ar.string().min(1).max(ed.schema_length.maximum).pattern(mN).messages({"string.pattern.base":"{:#label} "+ed.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();uG.exports={createSchema:ioe,createSchemaStructure:cG,createTable:ooe,createTableStructure:lG,createAttribute:doe,dropSchema:aoe,dropTable:coe,dropAttribute:loe,getBackup:foe,cleanupOrphanBlobs:_oe};async function ioe(e){let t=await cG(e);return jg.signalSchemaChange(new Jg(process.pid,e.operation,e.schema)),t}a(ioe,"createSchema");async function cG(e){let t=ph(e,ar.object({database:Qg,schema:Qg}));if(t)throw new ml(t.message);if(rd(e),!await Zu.checkSchemaExists(e.schema))throw bo(new Error,zg.SCHEMA_EXISTS_ERR(e.schema),Oo.BAD_REQUEST,td.LOG_LEVELS.ERROR,zg.SCHEMA_EXISTS_ERR(e.schema),!0);return await La.createSchema(e),`database '${e.schema}' successfully created`}a(cG,"createSchemaStructure");async function ooe(e){return rd(e),e.hash_attribute=e.primary_key??e.hash_attribute,await lG(e)}a(ooe,"createTable");async function lG(e){let t=ph(e,ar.object({database:Qg,schema:Qg,table:noe,residence:ar.array().items(ar.string().min(1)).optional(),hash_attribute:soe}));if(t)throw new ml(t.message);if(!await Zu.checkSchemaTableExists(e.schema,e.table))throw bo(new Error,zg.TABLE_EXISTS_ERR(e.schema,e.table),Oo.BAD_REQUEST,td.LOG_LEVELS.ERROR,zg.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Zie(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await La.createTable(n,e);else throw bo(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Oo.BAD_REQUEST);else await La.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}a(lG,"createTableStructure");async function aoe(e){let t=ph(e,ar.object({database:ar.string(),schema:ar.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new ml(t.message);rd(e);let r=await Zu.checkSchemaExists(e.schema);if(r)throw bo(new Error,r,Oo.NOT_FOUND,td.LOG_LEVELS.ERROR,r,!0);let n=await Zu.schema_describe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await La.dropSchema(e),jg.signalSchemaChange(new Jg(process.pid,e.operation,e.schema)),await oG.purgeSchemaTableStreams(e.schema,s);let i=await aG(e);return i.message=`successfully deleted '${e.schema}'`,i}a(aoe,"dropSchema");async function coe(e){let t=ph(e,ar.object({database:ar.string(),schema:ar.string(),table:ar.string().required()}));if(t)throw new ml(t.message);rd(e);let r=await Zu.checkSchemaTableExists(e.schema,e.table);if(r)throw bo(new Error,r,Oo.NOT_FOUND,td.LOG_LEVELS.ERROR,r,!0);await La.dropTable(e),await oG.purgeTableStream(e.schema,e.table);let n=await aG(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(coe,"dropTable");async function loe(e){let t=ph(e,ar.object({database:ar.string(),schema:ar.string(),table:ar.string().required(),attribute:ar.string().required()}));if(t)throw new ml(t.message);rd(e);let r=await Zu.checkSchemaTableExists(e.schema,e.table);if(r)throw bo(new Error,r,Oo.NOT_FOUND,td.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw bo(new Error,"You cannot drop a hash attribute",Oo.BAD_REQUEST,void 0,void 0,!0);if(td.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw bo(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Oo.BAD_REQUEST,void 0,void 0,!0);try{return await La.dropAttribute(e),uoe(e),jg.signalSchemaChange(new Jg(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw Xie.error(`Got an error deleting attribute ${eoe.inspect(e)}.`),n}}a(loe,"dropAttribute");function uoe(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(uoe,"dropAttributeFromGlobal");async function doe(e){rd(e);let t=roe()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw bo(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Oo.BAD_REQUEST,void 0,void 0,!0);return await La.createAttribute(e),jg.signalSchemaChange(new Jg(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(doe,"createAttribute");function foe(e){return La.getBackup(e)}a(foe,"getBackup");function _oe(e){if(!e.database)throw new ml('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new ml(`Unknown database '${e.database}'`);let{cleanupOrphans:r}=(hn(),P(au));return r(databases[e.database],e.database),{message:"Orphaned blobs cleanup started, check logs for progress"}}a(_oe,"cleanupOrphanBlobs")});var fG=C((BCe,dG)=>{"use strict";var{OPERATIONS_ENUM:hoe}=(k(),P(q)),pN=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=hoe.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};dG.exports=pN});var EN=C((FCe,EG)=>{"use strict";var moe=$n(),kCe=fG(),Xg=ie(),Zg=(k(),P(q)),poe=le(),{handleHDBError:_G,hdb_errors:Eoe}=he(),{HDB_ERROR_MSGS:hG,HTTP_STATUS_CODES:mG}=Eoe,goe=Object.values(Zg.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),pG="To use this operation audit log must be enabled in harperdb-config.yaml";EG.exports=Soe;async function Soe(e){if(Xg.isEmpty(e.schema))throw new Error(hG.SCHEMA_REQUIRED_ERR);if(Xg.isEmpty(e.table))throw new Error(hG.TABLE_REQUIRED_ERR);if(!poe.get(Zg.CONFIG_PARAMS.LOGGING_AUDITLOG))throw _G(new Error,pG,mG.BAD_REQUEST,Zg.LOG_LEVELS.ERROR,pG,!0);let t=Xg.checkSchemaTableExist(e.schema,e.table);if(t)throw _G(new Error,t,mG.NOT_FOUND,Zg.LOG_LEVELS.ERROR,t,!0);if(!Xg.isEmpty(e.search_type)&&goe.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await moe.readAuditLog(e)}a(Soe,"readAuditLog")});var SG=C((qCe,gG)=>{"use strict";var{OPERATIONS_ENUM:Toe}=(k(),P(q)),gN=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Toe.GET_BACKUP,this.schema=t,this.table=r}};gG.exports=gN});var RG=C((YCe,AG)=>{"use strict";var Aoe=$n(),VCe=SG(),SN=ie(),Roe=(k(),P(q)),KCe=le(),{handleHDBError:yoe,hdb_errors:boe}=he(),{HDB_ERROR_MSGS:TG,HTTP_STATUS_CODES:Ooe}=boe;AG.exports=Noe;async function Noe(e){if(SN.isEmpty(e.schema))throw new Error(TG.SCHEMA_REQUIRED_ERR);if(SN.isEmpty(e.table))throw new Error(TG.TABLE_REQUIRED_ERR);let t=SN.checkSchemaTableExist(e.schema,e.table);if(t)throw yoe(new Error,t,Ooe.NOT_FOUND,Roe.LOG_LEVELS.ERROR,t,!0);return await Aoe.getBackup(read_audit_log_object)}a(Noe,"getBackup")});var NG=C((zCe,OG)=>{"use strict";var woe=le(),Ma=require("joi"),Ioe=ot(),yG=require("moment"),Coe=require("fs-extra"),TN=require("path"),Poe=require("lodash"),gh=(k(),P(q)),{LOG_LEVELS:pl}=(k(),P(q)),Doe="YYYY-MM-DD hh:mm:ss",Loe=TN.resolve(__dirname,"../logs");OG.exports=function(e){return Ioe.validateBySchema(e,Moe)};var Moe=Ma.object({from:Ma.custom(bG),until:Ma.custom(bG),level:Ma.valid(pl.NOTIFY,pl.FATAL,pl.ERROR,pl.WARN,pl.INFO,pl.DEBUG,pl.TRACE),order:Ma.valid("asc","desc"),limit:Ma.number().min(1),start:Ma.number().min(0),log_name:Ma.custom(voe)});function bG(e,t){if(yG(e,yG.ISO_8601).format(Doe)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(bG,"validateDatetime");function voe(e,t){if(Poe.invert(gh.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=woe.get(gh.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?gh.LOG_NAMES.HDB:e,i=s===gh.LOG_NAMES.INSTALL?TN.join(Loe,gh.LOG_NAMES.INSTALL):TN.join(n,s);return Coe.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(voe,"validateReadLogPath")});var RN=C((jCe,IG)=>{"use strict";var eS=(k(),P(q)),Uoe=ee(),xoe=le(),Boe=NG(),AN=require("path"),wG=require("fs-extra"),{once:Hoe}=require("events"),{handleHDBError:koe,hdb_errors:Foe}=he(),{PACKAGE_ROOT:Goe}=Et(),qoe=AN.join(Goe,"logs"),$oe=1e3,Voe=200;IG.exports=Koe;async function Koe(e){let t=Boe(e);if(t)throw koe(t,t.message,Foe.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=xoe.get(eS.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?eS.LOG_NAMES.HDB:e.log_name,s=n===eS.LOG_NAMES.INSTALL?AN.join(qoe,eS.LOG_NAMES.INSTALL):AN.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?$oe: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(wG.statSync(s).size-(m+5)*Voe,0));let g=wG.createReadStream(s,{start:S});g.on("error",H=>{Uoe.error(H)});let R=0,E=[],T="",N;g.on("data",H=>{let X=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;H=T+H;let W=0,$;for(;($=X.exec(H))&&!g.destroyed;){N&&(N.message=H.slice(W,$.index),M(N));let[se,z,fe]=$,ue=fe.split("] ["),Z=ue[0],Ae=ue[1];ue.splice(0,2),N={timestamp:z,thread:Z,level:Ae,tags:ue,message:""},W=$.index+se.length}T=H.slice(W)}),g.on("end",H=>{g.destroyed||N&&(N.message=T.trim(),M(N))}),g.resume();function M(H){let X,W,$;switch(!0){case(i&&c&&u):X=new Date(H.timestamp),W=new Date(l),$=new Date(f),H.level===o&&X>=W&&X<=$&&R<h?R++:H.level===o&&X>=W&&X<=$&&(va(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&&(va(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<=$&&(va(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<=$&&(va(H,_,E),R++,R===m&&g.destroy());break;case i:H.level===o&&R<h?R++:H.level===o&&(va(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&&(va(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&&(va(H,_,E),R++,R===m&&g.destroy());break;default:R<h?R++:(va(H,_,E),R++,R===m&&g.destroy())}}return a(M,"onLogMessage"),await Hoe(g,"close"),E}a(Koe,"readLog");function va(e,t,r){t==="desc"?Yoe(e,r):t==="asc"?Woe(e,r):r.push(e)}a(va,"pushLineToResult");function Yoe(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(Yoe,"insertDescending");function Woe(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(Woe,"insertAscending")});var tS=C((rPe,LG)=>{"use strict";var yN=require("joi"),{string:nd,boolean:CG,date:zoe}=yN.types(),Qoe=ot(),{validateSchemaExists:XCe,validateTableExists:ZCe,validateSchemaName:ePe}=bi(),joe=(k(),P(q)),Joe=Pt(),PG=le();PG.initSync();var tPe=nd.invalid(PG.get(joe.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Joe.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),DG={operation:nd.valid("add_node","update_node","set_node_replication"),node_name:nd.optional(),subscriptions:yN.array().items({table:nd.optional(),schema:nd.optional(),database:nd.optional(),subscribe:CG.required(),publish:CG.required().custom(Zoe),start_time:zoe.iso()})};function Xoe(e){return Qoe.validateBySchema(e,yN.object(DG))}a(Xoe,"addUpdateNodeValidator");function Zoe(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(Zoe,"checkForFalsy");LG.exports={addUpdateNodeValidator:Xoe,validation_schema:DG}});var sd=C((sPe,MG)=>{"use strict";var bN=class{static{a(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},ON=class{static{a(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};MG.exports={Node:bN,NodeSubscription:ON}});var UG=C((oPe,vG)=>{"use strict";var eae=(k(),P(q)).OPERATIONS_ENUM,NN=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=eae.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};vG.exports=NN});var Sh=C((cPe,xG)=>{"use strict";var wN=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},IN=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)}};xG.exports={RemotePayloadObject:wN,RemotePayloadSubscription:IN}});var HG=C((uPe,BG)=>{"use strict";var CN=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}};BG.exports=CN});var FG=C((pPe,kG)=>{"use strict";var tae=HG(),fPe=Ft(),_Pe=ft(),rae=ee(),{getSchemaPath:hPe,getTransactionAuditStorePath:mPe}=gt(),{getDatabases:nae}=(xe(),P(ct));kG.exports=sae;async function sae(e){let t=new tae;try{let r=nae()[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){rae.warn(`unable to stat table dbi due to ${r}`)}return t}a(sae,"lmdbGetTableSize")});var qG=C((gPe,GG)=>{"use strict";var PN=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}};GG.exports=PN});var od=C((bPe,YG)=>{"use strict";var iae=require("fs-extra"),oae=require("path"),Zr=require("systeminformation"),Ua=ee(),$G=gr(),TPe=Pt(),id=(k(),P(q)),aae=FG(),cae=po(),{getThreadInfo:VG}=it(),Th=le();Th.initSync();var lae=qG(),{openEnvironment:APe}=ft(),{getSchemaPath:RPe}=gt(),{database:yPe,databases:DN}=(xe(),P(ct)),rS;YG.exports={getHDBProcessInfo:UN,getNetworkInfo:BN,getDiskInfo:xN,getMemoryInfo:vN,getCPUInfo:MN,getTimeInfo:LN,getSystemInformation:HN,systemInformation:uae,getTableSize:kN,getMetrics:FN};function LN(){return Zr.time()}a(LN,"getTimeInfo");async function MN(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:o,governor:c,socket:l,cache:u,...f}=await Zr.cpu();f.cpu_speed=await Zr.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 Zr.currentLoad();return E.cpus=[],R.forEach(T=>{let{raw_load:N,raw_load_idle:M,raw_load_irq:H,raw_load_nice:X,raw_load_system:W,raw_load_user:$,...se}=T;E.cpus.push(se)}),f.current_load=E,f}catch(e){return Ua.error(`error in getCPUInfo: ${e}`),{}}}a(MN,"getCPUInfo");async function vN(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await Zr.mem();return Object.assign(s,process.memoryUsage())}catch(e){return Ua.error(`error in getMemoryInfo: ${e}`),{}}}a(vN,"getMemoryInfo");async function UN(){let e={core:[],clustering:[]};try{let t=await Zr.processes(),r;try{r=Number.parseInt(await iae.readFile(oae.join(Th.get(id.CONFIG_PARAMS.ROOTPATH),id.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===id.NODE_ERROR_CODES.ENOENT)Ua.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 Ua.error(`error in getHDBProcessInfo: ${t}`),e}}a(UN,"getHDBProcessInfo");async function xN(){let e={};try{if(!Th.get(id.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await Zr.disksIO();e.io=i;let{rx_sec:o,tx_sec:c,wx_sec:l,...u}=await Zr.fsStats();return e.read_write=u,e.size=await Zr.fsSize(),e}catch(t){return Ua.error(`error in getDiskInfo: ${t}`),e}}a(xN,"getDiskInfo");async function BN(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Th.get(id.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await Zr.networkInterfaceDefault(),e.latency=await Zr.inetChecksite("google.com"),(await Zr.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 Zr.networkStats()).forEach(n=>{let{rx_sec:s,tx_sec:i,ms:o,...c}=n;e.stats.push(c)})),e}catch(t){return Ua.error(`error in getNetworkInfo: ${t}`),e}}a(BN,"getNetworkInfo");async function HN(){if(rS!==void 0)return rS;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:o,...c}=await Zr.osInfo();e=c;let l=await Zr.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,rS=e,rS}catch(t){return Ua.error(`error in getSystemInformation: ${t}`),e}}a(HN,"getSystemInformation");async function kN(){let e=[],t=await cae.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await aae(n));return e}a(kN,"getTableSize");async function FN(){let e={};for(let t in DN){let r=e[t]={},n=r.tables={};for(let s in DN[t])try{let i=DN[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){Ua.notify(`Error getting stats for table ${s}: ${i}`)}}return e}a(FN,"getMetrics");async function KG(){if(Th.get(id.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await $G.getNATSReferences(),t=await $G.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let 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(KG,"getNatsStreamInfo");async function uae(e){let t=new lae;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await HN(),t.time=LN(),t.cpu=await MN(),t.memory=await vN(),t.disk=await xN(),t.network=await BN(),t.harperdb_processes=await UN(),t.table_size=await kN(),t.metrics=await FN(),t.threads=await VG(),t.replication=await KG(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await HN();break;case"time":t.time=LN();break;case"cpu":t.cpu=await MN();break;case"memory":t.memory=await vN();break;case"disk":t.disk=await xN();break;case"network":t.network=await BN();break;case"harperdb_processes":t.harperdb_processes=await UN();break;case"table_size":t.table_size=await kN();break;case"database_metrics":case"metrics":t.metrics=await FN();break;case"threads":t.threads=await VG();break;case"replication":t.replication=await KG();break;default:break}return t}a(uae,"systemInformation")});var No=C((CPe,jG)=>{"use strict";var dae=Rn(),GN=ie(),fae=require("util"),El=(k(),P(q)),WG=le();WG.initSync();var _ae=RO(),zG=zr(),{Node:NPe,NodeSubscription:wPe}=sd(),hae=pu(),mae=UG(),{RemotePayloadObject:pae,RemotePayloadSubscription:Eae}=Sh(),{handleHDBError:gae,hdb_errors:Sae}=he(),{HTTP_STATUS_CODES:Tae,HDB_ERROR_MSGS:Aae}=Sae,Rae=$s(),yae=od(),{packageJson:bae}=Et(),{getDatabases:Oae}=(xe(),P(ct)),IPe=fae.promisify(_ae.authorize),Nae=zG.searchByHash,wae=zG.searchByValue;jG.exports={isEmpty:Iae,getNodeRecord:Cae,upsertNodeRecord:Pae,buildNodePayloads:Dae,checkClusteringEnabled:Lae,getAllNodeRecords:Mae,getSystemInfo:vae,reverseSubscription:QG};function Iae(e){return e==null}a(Iae,"isEmpty");async function Cae(e){let t=new hae(El.SYSTEM_SCHEMA_NAME,El.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Nae(t)}a(Cae,"getNodeRecord");async function Pae(e){let t=new mae(El.SYSTEM_SCHEMA_NAME,El.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return dae.upsert(t)}a(Pae,"upsertNodeRecord");function QG(e){if(GN.isEmpty(e.subscribe)||GN.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(QG,"reverseSubscription");function Dae(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=GN.getTableHashAttribute(l,u),{subscribe:d,publish:_}=QG(c),h=Oae()[l]?.[u],m=new Eae(l,u,f,_,d,c.start_time,h.schemaDefined?h.attributes:void 0);s.push(m)}return new pae(r,t,s,n)}a(Dae,"buildNodePayloads");function Lae(){if(!WG.get(El.CONFIG_PARAMS.CLUSTERING_ENABLED))throw gae(new Error,Aae.CLUSTERING_NOT_ENABLED,Tae.BAD_REQUEST,void 0,void 0,!0)}a(Lae,"checkClusteringEnabled");async function Mae(){let e=new Rae(El.SYSTEM_SCHEMA_NAME,El.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await wae(e))}a(Mae,"getAllNodeRecords");async function vae(){let e=await yae.getSystemInformation();return{hdb_version:bae.version,node_version:e.node_version,platform:e.platform}}a(vae,"getSystemInfo")});var qN=C((DPe,sq)=>{"use strict";var nS=gr(),JG=ie(),XG=Pt(),ZG=(k(),P(q)),sS=ee(),eq=Eh(),Uae=o_(),{RemotePayloadObject:xae}=Sh(),{handleHDBError:tq,hdb_errors:Bae}=he(),{HTTP_STATUS_CODES:rq}=Bae,{NodeSubscription:nq}=sd();sq.exports=Hae;async function Hae(e,t){let r;try{r=await nS.request(`${t}.${XG.REQUEST_SUFFIX}`,new xae(ZG.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),sS.trace("Response from remote describe all request:",r)}catch(o){sS.error(`addNode received error from describe all request to remote node: ${o}`);let c=nS.requestErrorHandler(o,"add_node",t);throw tq(new Error,c,rq.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===XG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw tq(new Error,o,rq.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===ZG.SYSTEM_SCHEMA_NAME){await nS.createLocalTableStream(l,c);let m=new nq(l,c,o.publish,o.subscribe);m.start_time=o.start_time,i.push(m);continue}let u=JG.doesSchemaExist(l),f=n[l]!==void 0,d=c?JG.doesTableExist(l,c):!0,_=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!f||!d&&!_){s.push(o);continue}if(!u&&f&&(sS.trace(`addNode creating schema: ${l}`),await eq.createSchema({operation:"create_schema",schema:l})),!d&&_){sS.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let m=new Uae(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(m.attributes=n[l][c].attributes),await eq.createTable(m)}await nS.createLocalTableStream(l,c);let h=new nq(l,c,o.publish,o.subscribe);h.start_time=o.start_time,i.push(h)}return{added:i,skipped:s}}a(Hae,"reviewSubscriptions")});var gl={};Ue(gl,{addNodeBack:()=>$ae,removeNodeBack:()=>Vae,setNode:()=>qae});async function qae(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=Wg(r);let n=(0,oq.validateBySchema)(e,Gae);if(n)throw(0,wo.handleHDBError)(n,n.message,Fae.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new wo.ClientError("url or hostname is required for remove_node operation");let h=r,m=sr(),S=await m.get(h);if(!S)throw new wo.ClientError(h+" does not exist");try{await mh({url:S.url},{operation:Yt.REMOVE_NODE_BACK,name:S?.subscriptions?.length>0?et():h},void 0)}catch(g){es.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 wo.ClientError("url required for this operation");let s=ba();if(s==null)throw new wo.ClientError("replication url is missing from harperdb-config.yaml");let i,o,c;if(t?.startsWith("wss:")){i=await(0,As.getReplicationCert)();let h=await(0,As.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed||e.force_signing?(o=await(0,As.createCsr)(),es.info("Sending CSR to target node:",t)):h&&(c=h.certificate,es.info("Sending CA named",h.name,"to target node",t))}let l={operation:Yt.ADD_NODE_BACK,hostname:(0,Ba.get)(x.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:o,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,Ba.get)(x.REPLICATION_SHARD)!==void 0&&(l.shard=(0,Ba.get)(x.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(iq):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let h=iq(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 mh({url:t},l,e)}catch(h){h.message=`Error returned from ${t}: `+h.message,es.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&&(es.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,As.setCertTable)({name:kae.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,As.setCertTable)({name:et()+"-replication",uses:["replication"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let d={url:t,ca:u?.usingCA};if(e.hostname&&(d.name=e.hostname),e.subscriptions?d.subscriptions=e.subscriptions:d.replicates=!0,e.start_time&&(d.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(d.authorization=e.authorization),e.revoked_certificates&&(d.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?d.shard=u.shard:e.shard!==void 0&&(d.shard=e.shard),d.replicates){let h={url:s,ca:c,replicates:!0,subscriptions:null};(0,Ba.get)(x.REPLICATION_SHARD)!==void 0&&(h.shard=(0,Ba.get)(x.REPLICATION_SHARD)),e.retain_authorization&&(h.authorization=e.authorization),e.start_time&&(h.start_time=e.start_time),await Ao(et(),h)}await Ao(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 $ae(e){es.trace("addNodeBack received request:",e);let t=await(0,As.signCertificate)(e),r;e.csr?(r=t.signingCA,es.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,es.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,As.getReplicationCertAuth)();if(n.replicates){let i={url:ba(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,Ba.get)(x.REPLICATION_SHARD)!==void 0&&(i.shard=(0,Ba.get)(x.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Ao(et(),i)}return await Ao(e.hostname,n),t.nodeName=et(),t.usingCA=s?.certificate,es.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function Vae(e){es.trace("removeNodeBack received request:",e),await sr().delete(e.name)}function iq(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var As,oq,xa,Ba,es,wo,kae,Fae,Gae,Sl=Re(()=>{As=v(ei()),oq=v(ot()),xa=v(require("joi")),Ba=v(le());k();uh();ul();gs();es=v(ee()),wo=v(he()),{pki:kae}=require("node-forge"),{HTTP_STATUS_CODES:Fae}=wo.hdb_errors,Gae=xa.default.object({hostname:xa.default.string(),verify_tls:xa.default.boolean(),replicates:xa.default.boolean(),subscriptions:xa.default.array(),revoked_certificates:xa.default.array(),shard:xa.default.number()});a(qae,"setNode");a($ae,"addNodeBack");a(Vae,"removeNodeBack");a(iq,"reverseSubscription")});var lS=C((FPe,cq)=>{"use strict";var{handleHDBError:iS,hdb_errors:Kae}=he(),{HTTP_STATUS_CODES:oS}=Kae,{addUpdateNodeValidator:Yae}=tS(),aS=ee(),cS=(k(),P(q)),aq=Pt(),Wae=ie(),Ah=gr(),Rh=No(),$N=le(),zae=qN(),{Node:Qae,NodeSubscription:jae}=sd(),{broadcast:Jae}=it(),{setNode:Xae}=(Sl(),P(gl)),HPe=le(),kPe=(k(),P(q)),Zae="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",ece="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",tce=$N.get(cS.CONFIG_PARAMS.CLUSTERING_NODENAME);cq.exports=rce;async function rce(e,t=!1){if(aS.trace("addNode called with:",e),$N.get(cS.CONFIG_PARAMS.REPLICATION_URL)||$N.get(cS.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Xae(e);Rh.checkClusteringEnabled();let r=Yae(e);if(r)throw iS(r,r.message,oS.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let d=await Rh.getNodeRecord(n);if(!Wae.isEmptyOrZeroLength(d))throw iS(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,oS.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await zae(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=Zae,o;let c=Rh.buildNodePayloads(s,tce,cS.OPERATIONS_ENUM.ADD_NODE,await Rh.getSystemInfo()),l=[];for(let d=0,_=s.length;d<_;d++){let h=s[d];s[d].start_time===void 0&&delete s[d].start_time,l.push(new jae(h.schema,h.table,h.publish,h.subscribe))}aS.trace("addNode sending remote payload:",c);let u;try{u=await Ah.request(`${n}.${aq.REQUEST_SUFFIX}`,c)}catch(d){aS.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 Ah.updateRemoteConsumer(S,n)}let _=Ah.requestErrorHandler(d,"add_node",n);throw iS(new Error,_,oS.INTERNAL_SERVER_ERROR,"error",_)}if(u.status===aq.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${n}: ${u.message}`;throw iS(new Error,d,oS.INTERNAL_SERVER_ERROR,"error",d)}aS.trace(u);for(let d=0,_=s.length;d<_;d++){let h=s[d];await Ah.updateRemoteConsumer(h,n),h.subscribe===!0&&await Ah.updateConsumerIterator(h.schema,h.table,n,"start")}let f=new Qae(n,l,u.system_info);return await Rh.upsertNodeRecord(f),Jae({type:"nats_update"}),i.length>0?o.message=ece:o.message=`Successfully added '${n}' to manifest`,o}a(rce,"addNode")});var WN=C(($Pe,uq)=>{"use strict";var{handleHDBError:VN,hdb_errors:nce}=he(),{HTTP_STATUS_CODES:KN}=nce,{addUpdateNodeValidator:sce}=tS(),yh=ee(),uS=(k(),P(q)),lq=Pt(),qPe=ie(),bh=gr(),Oh=No(),YN=le(),{cloneDeep:ice}=require("lodash"),oce=qN(),{Node:ace,NodeSubscription:cce}=sd(),{broadcast:lce}=it(),{setNode:uce}=(Sl(),P(gl)),dce="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",fce="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",_ce=YN.get(uS.CONFIG_PARAMS.CLUSTERING_NODENAME);uq.exports=hce;async function hce(e){if(yh.trace("updateNode called with:",e),YN.get(uS.CONFIG_PARAMS.REPLICATION_URL)??YN.get(uS.CONFIG_PARAMS.REPLICATION_HOSTNAME))return uce(e);Oh.checkClusteringEnabled();let t=sce(e);if(t)throw VN(t,t.message,KN.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await Oh.getNodeRecord(r);s.length>0&&(n=ice(s));let{added:i,skipped:o}=await oce(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=dce,c;let l=Oh.buildNodePayloads(i,_ce,uS.OPERATIONS_ENUM.UPDATE_NODE,await Oh.getSystemInfo());for(let f=0,d=i.length;f<d;f++){let _=i[f];yh.trace(`updateNode updating work stream for node: ${r} subscription:`,_),i[f].start_time===void 0&&delete i[f].start_time}yh.trace("updateNode sending remote payload:",l);let u;try{u=await bh.request(`${r}.${lq.REQUEST_SUFFIX}`,l)}catch(f){yh.error(`updateNode received error from request: ${f}`);let d=bh.requestErrorHandler(f,"update_node",r);throw VN(new Error,d,KN.INTERNAL_SERVER_ERROR,"error",d)}if(u.status===lq.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${r}: ${u.message}`;throw VN(new Error,f,KN.INTERNAL_SERVER_ERROR,"error",f)}yh.trace(u);for(let f=0,d=i.length;f<d;f++){let _=i[f];await bh.updateRemoteConsumer(_,r),_.subscribe===!0?await bh.updateConsumerIterator(_.schema,_.table,r,"start"):await bh.updateConsumerIterator(_.schema,_.table,r,"stop")}return n||(n=[new ace(r,[],u.system_info)]),await mce(n[0],i,u.system_info),o.length>0?c.message=fce:c.message=`Successfully updated '${r}'`,c}a(hce,"updateNode");async function mce(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let o=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let f=n.subscriptions[l];if(f.schema===o.schema&&f.table===o.table){f.publish=o.publish,f.subscribe=o.subscribe,c=!0;break}}c||n.subscriptions.push(new cce(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await Oh.upsertNodeRecord(n),lce({type:"nats_update"})}a(mce,"updateNodeTable")});var mq=C((KPe,hq)=>{"use strict";var _q=require("joi"),{string:dq}=_q.types(),pce=ot(),fq=(k(),P(q)),Ece=le(),gce=Pt();hq.exports=Sce;function Sce(e){let t=dq.invalid(Ece.get(fq.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(gce.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=_q.object({operation:dq.valid(fq.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return pce.validateBySchema(e,r)}a(Sce,"removeNodeValidator")});var dS=C((WPe,Tq)=>{"use strict";var{handleHDBError:pq,hdb_errors:Tce}=he(),{HTTP_STATUS_CODES:Eq}=Tce,Ace=mq(),Nh=ee(),gq=No(),Rce=ie(),ad=(k(),P(q)),Sq=Pt(),zN=gr(),QN=le(),{RemotePayloadObject:yce}=Sh(),{NodeSubscription:bce}=sd(),Oce=i_(),Nce=Yc(),{broadcast:wce}=it(),{setNode:Ice}=(Sl(),P(gl)),Cce=QN.get(ad.CONFIG_PARAMS.CLUSTERING_NODENAME);Tq.exports=Pce;async function Pce(e){if(Nh.trace("removeNode called with:",e),QN.get(ad.CONFIG_PARAMS.REPLICATION_URL)??QN.get(ad.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Ice(e);gq.checkClusteringEnabled();let t=Ace(e);if(t)throw pq(t,t.message,Eq.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await gq.getNodeRecord(r);if(Rce.isEmptyOrZeroLength(n))throw pq(new Error,`Node '${r}' was not found.`,Eq.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new yce(ad.OPERATIONS_ENUM.REMOVE_NODE,Cce,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let f=n.subscriptions[l];f.subscribe===!0&&await zN.updateConsumerIterator(f.schema,f.table,r,"stop");try{await zN.updateRemoteConsumer(new bce(f.schema,f.table,!1,!1),r)}catch(d){Nh.error(d)}}try{i=await zN.request(`${r}.${Sq.REQUEST_SUFFIX}`,s),Nh.trace("Remove node reply from remote node:",r,i)}catch(l){Nh.error("removeNode received error from request:",l),o=!0}let c=new Oce(ad.SYSTEM_SCHEMA_NAME,ad.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await Nce.deleteRecord(c),wce({type:"nats_update"}),i?.status===Sq.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(Nh.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(Pce,"removeNode")});var yq=C((QPe,Rq)=>{"use strict";var Aq=require("joi"),{string:Dce,array:Lce}=Aq.types(),Mce=ot(),vce=tS();Rq.exports=Uce;function Uce(e){let t=Aq.object({operation:Dce.valid("configure_cluster").required(),connections:Lce.items(vce.validation_schema).required()});return Mce.validateBySchema(e,t)}a(Uce,"configureClusterValidator")});var jN=C((JPe,Iq)=>{"use strict";var bq=(k(),P(q)),fS=ee(),xce=ie(),Bce=le(),Hce=dS(),kce=lS(),Fce=No(),Gce=yq(),{handleHDBError:Oq,hdb_errors:qce}=he(),{HTTP_STATUS_CODES:Nq}=qce,$ce="Configure cluster complete.",Vce="Failed to configure the cluster. Check the logs for more details.",Kce="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";Iq.exports=Yce;async function Yce(e){fS.trace("configure cluster called with:",e);let t=Gce(e);if(t)throw Oq(t,t.message,Nq.BAD_REQUEST,void 0,void 0,!0);let r=await Fce.getAllNodeRecords(),n=[];if(Bce.get(bq.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let f=0,d=r.length;f<d;f++){let _=await wq(Hce,{operation:bq.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[f].name},r[f].name);n.push(_)}fS.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 wq(kce,d,d.node_name);s.push(_)}fS.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"&&(fS.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(xce.isEmptyOrZeroLength(o))return{message:$ce,connections:c};if(l)return{message:Kce,failed_nodes:o,connections:c};throw Oq(new Error,Vce,Nq.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(Yce,"configureCluster");async function wq(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(wq,"functionWrapper")});var Lq=C((ZPe,Dq)=>{"use strict";var wh=require("joi"),Wce=ot(),{validateSchemaExists:Cq,validateTableExists:zce,validateSchemaName:Pq}=bi(),Qce=wh.object({operation:wh.string().valid("purge_stream"),schema:wh.string().custom(Cq).custom(Pq).optional(),database:wh.string().custom(Cq).custom(Pq).optional(),table:wh.string().custom(zce).required()});function jce(e){return Wce.validateBySchema(e,Qce)}a(jce,"purgeStreamValidator");Dq.exports=jce});var JN=C((tDe,Mq)=>{"use strict";var{handleHDBError:Jce,hdb_errors:Xce}=he(),{HTTP_STATUS_CODES:Zce}=Xce,ele=Lq(),tle=gr(),rle=No();Mq.exports=nle;async function nle(e){e.schema=e.schema??e.database;let t=ele(e);if(t)throw Jce(t,t.message,Zce.BAD_REQUEST,void 0,void 0,!0);rle.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await tle.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(nle,"purgeStream")});var ew=C((nDe,Fq)=>{"use strict";var ZN=No(),sle=gr(),hS=le(),cd=(k(),P(q)),Tl=Pt(),ile=ie(),XN=ee(),{RemotePayloadObject:ole}=Sh(),{ErrorCode:vq}=require("nats"),{parentPort:Uq}=require("worker_threads"),{onMessageByType:ale}=it(),{getThisNodeName:cle}=(gs(),P(Ca)),{requestClusterStatus:lle}=(uh(),P(oF)),{getReplicationSharedStatus:ule,getHDBNodeTable:dle}=(ul(),P(VO)),{CONFIRMATION_STATUS_POSITION:fle,RECEIVED_VERSION_POSITION:_le,RECEIVED_TIME_POSITION:hle,SENDING_TIME_POSITION:mle,RECEIVING_STATUS_POSITION:ple,RECEIVING_STATUS_RECEIVING:Ele}=(_N(),P(QF)),xq=hS.get(cd.CONFIG_PARAMS.CLUSTERING_ENABLED),Bq=hS.get(cd.CONFIG_PARAMS.CLUSTERING_NODENAME);Fq.exports={clusterStatus:gle,buildNodeStatus:kq};var Hq;ale("cluster-status",async e=>{Hq(e)});async function gle(){if(hS.get(cd.CONFIG_PARAMS.REPLICATION_URL)||hS.get(cd.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(Uq){Uq.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{Hq=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=ule(u,l,o);c.lastCommitConfirmed=_S(f[fle]),c.lastReceivedRemoteTime=_S(f[_le]),c.lastReceivedLocalTime=_S(f[hle]),c.sendingMessage=_S(f[mle]),c.lastReceivedStatus=f[ple]===Ele?"Receiving":"Waiting"}}}else n=lle();n.node_name=cle();let s=dle().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:Bq,is_enabled:xq,connections:[]};if(!xq)return e;let t=await ZN.getAllNodeRecords();if(ile.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(kq(t[n],e.connections));return await Promise.allSettled(r),e}a(gle,"clusterStatus");function _S(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}a(_S,"asDate");async function kq(e,t){let r=e.name,n=new ole(cd.OPERATIONS_ENUM.CLUSTER_STATUS,Bq,void 0,await ZN.getSystemInfo()),s,i,o=Tl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await sle.request(Tl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Tl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=Tl.CLUSTER_STATUS_STATUSES.CLOSED,XN.error(`Error getting node status from ${r} `,s))}catch(l){XN.warn(`Error getting node status from ${r}`,l),l.code===vq.NoResponders?o=Tl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===vq.Timeout?o=Tl.CLUSTER_STATUS_STATUSES.TIMEOUT:o=Tl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Sle(r,o,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==cd.PRE_4_0_0_VERSION&&await ZN.upsertNodeRecord(l)}catch(l){XN.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(kq,"buildNodeStatus");function Sle(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(Sle,"NodeStatusObject")});var rw=C((iDe,Gq)=>{"use strict";var{handleHDBError:Tle,hdb_errors:Ale}=he(),{HTTP_STATUS_CODES:Rle}=Ale,yle=gr(),ble=No(),tw=ie(),mS=require("joi"),Ole=ot(),Nle=2e3,wle=mS.object({timeout:mS.number().min(1),connected_nodes:mS.boolean(),routes:mS.boolean()});Gq.exports=Ile;async function Ile(e){ble.checkClusteringEnabled();let t=Ole.validateBySchema(e,wle);if(t)throw Tle(t,t.message,Rle.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||tw.autoCastBoolean(n),o=s===void 0||tw.autoCastBoolean(s),c={nodes:[]},l=await yle.getServerList(r??Nle),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:tw.autoCast(S.split(":")[1])})):[]),c.nodes.push(m)}}return c}a(Ile,"clusterNetwork")});var Kq=C((aDe,Vq)=>{"use strict";var nw=require("joi"),qq=ot(),{route_constraints:$q}=pb();Vq.exports={setRoutesValidator:Cle,deleteRoutesValidator:Ple};function Cle(e){let t=nw.object({server:nw.valid("hub","leaf"),routes:$q.required()});return qq.validateBySchema(e,t)}a(Cle,"setRoutesValidator");function Ple(e){let t=nw.object({routes:$q.required()});return qq.validateBySchema(e,t)}a(Ple,"deleteRoutesValidator")});var pS=C((lDe,Xq)=>{"use strict";var Io=Lt(),sw=ie(),Rs=(k(),P(q)),ld=le(),Yq=Kq(),{handleHDBError:Wq,hdb_errors:Dle}=he(),{HTTP_STATUS_CODES:zq}=Dle,Qq="cluster routes successfully set",jq="cluster routes successfully deleted";Xq.exports={setRoutes:Mle,getRoutes:vle,deleteRoutes:Ule};function Lle(e){let t=Io.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=sw.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"?Io.updateConfigValue(Rs.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):Io.updateConfigValue(Rs.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:Qq,set:i,skipped:s}}a(Lle,"setRoutesNats");function Mle(e){let t=Yq.setRoutesValidator(e);if(t)throw Wq(t,t.message,zq.BAD_REQUEST,void 0,void 0,!0);if(ld.get(Rs.CONFIG_PARAMS.CLUSTERING_ENABLED))return Lle(e);let r=[],n=[],s=ld.get(Rs.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{Jq(s,i)?n.push(i):(s.push(i),r.push(i))}),Io.updateConfigValue(Rs.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:Qq,set:r,skipped:n}}a(Mle,"setRoutes");function Jq(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(Jq,"existsInArray");function vle(){if(ld.get(Rs.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=Io.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return ld.get(Rs.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(vle,"getRoutes");function Ule(e){let t=Yq.deleteRoutesValidator(e);if(t)throw Wq(t,t.message,zq.BAD_REQUEST,void 0,void 0,!0);if(ld.get(Rs.CONFIG_PARAMS.CLUSTERING_ENABLED))return xle(e);let r=[],n=[],s=ld.get(Rs.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{Jq(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),Io.updateConfigValue(Rs.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:jq,deleted:r,skipped:n}}a(Ule,"deleteRoutes");function xle(e){let t=Io.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=sw.isEmptyOrZeroLength(r)?null:r,Io.updateConfigValue(Rs.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=sw.isEmptyOrZeroLength(n)?null:n,Io.updateConfigValue(Rs.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:jq,deleted:s,skipped:i}}a(xle,"deleteRoutesNats")});var e$=C((dDe,Zq)=>{"use strict";var Ih=require("alasql"),Al=require("recursive-iterator"),ti=ee(),Ble=ie(),Ch=(k(),P(q)),iw=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,kle(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=Hle(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 Ih.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 Hle(e){return e.filter(t=>t[Ch.PERMS_CRUD_ENUM.READ])}a(Hle,"filterReadRestrictedAttrs");function kle(e,t,r,n,s){Fle(e,t,r,n,s)}a(kle,"interpretAST");function Ph(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(Ph,"addSchemaTableToMap");function Fle(e,t,r,n,s){if(!e){ti.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof Ih.yy.Insert?Vle(e,t,r):e instanceof Ih.yy.Select?Gle(e,t,r,n,s):e instanceof Ih.yy.Update?qle(e,t,r):e instanceof Ih.yy.Delete?$le(e,t,r):ti.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(Fle,"getRecordAttributesAST");function Gle(e,t,r,n,s){if(!e){ti.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(Ble.isEmptyOrZeroLength(i)){ti.error("No schema specified");return}e.from.forEach(c=>{Ph(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),Ph(c.table,t,r,n,s)});let o=new Al(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{ti.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 Al(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{ti.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 Al(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{ti.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 Al(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{ti.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(Gle,"getSelectAttributes");function qle(e,t,r){if(!e){ti.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new Al(e.columns),s=e.table.databaseid;Ph(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&ow(e.table.tableid,s,i.columnid,t,r)}a(qle,"getUpdateAttributes");function $le(e,t,r){if(!e){ti.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new Al(e.where),s=e.table.databaseid;Ph(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&ow(e.table.tableid,s,i.columnid,t,r)}a($le,"getDeleteAttributes");function Vle(e,t,r){if(!e){ti.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new Al(e.columns),s=e.into.databaseid;Ph(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&ow(e.into.tableid,s,i.columnid,t,r)}a(Vle,"getInsertAttributes");function ow(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(ow,"pushAttribute");Zq.exports=iw});var r$=C((_De,t$)=>{"use strict";var ES=(k(),P(q)),gS=class{static{a(this,"BaseLicense")}constructor(t=0,r=ES.RAM_ALLOCATION_ENUM.DEFAULT,n=ES.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},aw=class extends gS{static{a(this,"ExtendedLicense")}constructor(t=0,r=ES.RAM_ALLOCATION_ENUM.DEFAULT,n=ES.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};t$.exports={BaseLicense:gS,ExtendedLicense:aw}});var fd=C((mDe,c$)=>{"use strict";var dd=require("fs-extra"),SS=(SE(),P(gE)),s$=require("crypto"),Kle=require("moment"),Yle=require("uuid").v4,en=ee(),lw=require("path"),Wle=ie(),Rl=(k(),P(q)),{totalmem:n$}=require("os"),zle=r$().ExtendedLicense,ud="invalid license key format",Qle="061183",jle="mofi25",Jle="aes-256-cbc",Xle=16,Zle=32,i$=le(),{resolvePath:o$}=Lt();i$.initSync();var cw;c$.exports={validateLicense:a$,generateFingerPrint:tue,licenseSearch:fw,getLicense:sue,checkMemoryLimit:iue};function uw(){return lw.join(i$.getHdbBasePath(),Rl.LICENSE_KEY_DIR_NAME,Rl.LICENSE_FILE_NAME)}a(uw,"getLicenseDirPath");function eue(){let e=uw();return o$(lw.join(e,Rl.LICENSE_FILE_NAME))}a(eue,"getLicenseFilePath");function dw(){let e=uw();return o$(lw.join(e,Rl.REG_KEY_FILE_NAME))}a(dw,"getFingerPrintFilePath");async function tue(){let e=dw();try{return await dd.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await rue();throw en.error(`Error writing fingerprint file to ${e}`),en.error(t),new Error("There was an error generating the fingerprint")}}a(tue,"generateFingerPrint");async function rue(){let e=Yle(),t=SS.hash(e,SS.HASH_FUNCTION.MD5),r=dw();try{await dd.mkdirp(uw()),await dd.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw en.error(`Error writing fingerprint file to ${r}`),en.error(n),new Error("There was an error generating the fingerprint")}return t}a(rue,"writeFingerprint");function a$(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:Rl.RAM_ALLOCATION_ENUM.DEFAULT,version:Rl.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return en.error("empty license key passed to validate."),r;let n=dw(),s=!1;try{s=dd.statSync(n)}catch(i){en.error(i)}if(s){let i;try{i=dd.readFileSync(n,"utf8")}catch{en.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(jle),c=o[1];c=Buffer.concat([Buffer.from(c)],Xle);let l=Buffer.concat([Buffer.from(i)],Zle),u=s$.createDecipheriv(Jle,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=nue(o[0],i);if(h)f=h;else throw r.valid_license=!1,r.valid_machine=!1,console.error(ud),en.error(ud),new Error(ud)}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(ud),en.error(ud),new Error(ud)}else r.exp_date=f;r.exp_date<Kle().valueOf()&&(r.valid_date=!1),SS.validate(o[1],`${Qle}${i}${t}`,SS.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||en.error("Invalid licence"),r}a(a$,"validateLicense");function nue(e,t){try{let r=s$.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{en.warn("Check old license failed")}}a(nue,"checkOldLicense");function fw(){let e=new zle,t=[];try{t=dd.readFileSync(eue(),"utf-8").split(`\r
|
|
24
24
|
`)}catch(r){r.code==="ENOENT"?en.debug("no license file found"):en.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(Wle.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=a$(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){en.error("There was an error parsing the license string."),en.error(s),e.ram_allocation=Rl.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return cw=e,e}a(fw,"licenseSearch");async function sue(){return cw||await fw(),cw}a(sue,"getLicense");function iue(){let e=fw().ram_allocation,t=process.constrainedMemory?.()||n$();if(t=Math.round(Math.min(t,n$())/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(iue,"checkMemoryLimit")});var mw=C((EDe,f$)=>{var TS=fd(),l$=require("chalk"),ts=ee(),u$=require("prompt"),{promisify:oue}=require("util"),_w=(k(),P(q)),aue=require("fs-extra"),cue=require("path"),lue=ie(),{packageJson:uue}=Et(),d$=le();d$.initSync();var due=require("moment"),fue=oue(u$.get),_ue=cue.join(d$.getHdbBasePath(),_w.LICENSE_KEY_DIR_NAME,_w.LICENSE_FILE_NAME,_w.LICENSE_FILE_NAME);f$.exports={getFingerprint:mue,setLicense:hue,parseLicense:hw,register:pue,getRegistrationInfo:gue};async function hue(e){if(e&&e.key&&e.company){try{ts.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await hw(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw ts.error(r),ts.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(hue,"setLicense");async function mue(){let e={};try{e=await TS.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw ts.error(r),ts.error(t),new Error(r)}return e}a(mue,"getFingerprint");async function hw(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");ts.info("Validating license input...");let r=TS.validateLicense(e,t);if(ts.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(ts.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(ts.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{ts.info("writing license to disk"),await aue.writeFile(_ue,JSON.stringify({license_key:e,company:t}))}catch(n){throw ts.error("Failed to write License"),n}return"Registration successful."}a(hw,"parseLicense");async function pue(){let e=await Eue();return hw(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(pue,"register");async function Eue(){let e=await TS.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:l$.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:l$.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{u$.start()}catch(n){ts.error(n)}let r;try{r=await fue(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(Eue,"promptForRegistration");async function gue(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await TS.getLicense()}catch(r){throw ts.error(`There was an error when searching licenses due to: ${r.message}`),r}if(lue.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=uue.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=due.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(gue,"getRegistrationInfo")});var h$=C((SDe,_$)=>{"use strict";var Sue=Pt(),pw=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+Sue.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"}};_$.exports=pw});var E$=C((ADe,p$)=>{"use strict";var m$=Pt(),Ew=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+m$.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+m$.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"}};p$.exports=Ew});var S$=C((yDe,g$)=>{"use strict";var gw=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};g$.exports=gw});var A$=C((ODe,T$)=>{"use strict";var Tue=Pt(),Sw=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+Tue.SERVER_SUFFIX.ADMIN,this.password=r}};T$.exports=Sw});var bS=C((wDe,b$)=>{"use strict";var yl=require("path"),bl=require("fs-extra"),Aue=h$(),Rue=E$(),yue=S$(),bue=A$(),Tw=Wn(),hd=ie(),Nn=Lt(),RS=(k(),P(q)),Dh=Pt(),{CONFIG_PARAMS:Jt}=RS,md=ee(),Lh=le(),R$=mo(),Aw=gr(),Oue=ei(),_d="clustering",Nue=1e4,y$=50;b$.exports={generateNatsConfig:Iue,removeNatsConfig:Cue,getHubConfigPath:wue};function wue(){let e=Lh.get(Jt.ROOTPATH);return yl.join(e,_d,Dh.NATS_CONFIG_FILES.HUB_SERVER)}a(wue,"getHubConfigPath");async function Iue(e=!1,t=void 0){let r=Lh.get(Jt.ROOTPATH);bl.ensureDirSync(yl.join(r,"clustering","leaf")),Lh.initSync();let n=Nn.getConfigFromFile(Jt.CLUSTERING_TLS_CERT_AUTH),s=Nn.getConfigFromFile(Jt.CLUSTERING_TLS_PRIVATEKEY),i=Nn.getConfigFromFile(Jt.CLUSTERING_TLS_CERTIFICATE);!await bl.exists(i)&&!await bl.exists(!n)&&await Oue.createNatsCerts();let o=yl.join(r,_d,Dh.PID_FILES.HUB),c=yl.join(r,_d,Dh.PID_FILES.LEAF),l=Nn.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=yl.join(r,_d,Dh.NATS_CONFIG_FILES.HUB_SERVER),f=yl.join(r,_d,Dh.NATS_CONFIG_FILES.LEAF_SERVER),d=Nn.getConfigFromFile(Jt.CLUSTERING_TLS_INSECURE),_=Nn.getConfigFromFile(Jt.CLUSTERING_TLS_VERIFY),h=Nn.getConfigFromFile(Jt.CLUSTERING_NODENAME),m=Nn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await Aw.checkNATSServerInstalled()||yS("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await Tw.listUsers(),g=Nn.getConfigFromFile(Jt.CLUSTERING_USER),R=await Tw.getClusterUser();(hd.isEmpty(R)||R.active!==!0)&&yS(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await AS(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await AS(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await AS(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),await AS(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[se,z]of S.entries())z.role?.role===RS.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(E.push(new bue(z.username,R$.decrypt(z.hash))),T.push(new yue(z.username,R$.decrypt(z.hash))));let N=[],{hub_routes:M}=Nn.getClusteringRoutes();if(!hd.isEmptyOrZeroLength(M))for(let se of M)N.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${se.host}:${se.port}`);let H=new Aue(Nn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),h,o,i,s,n,d,_,m,Nn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NAME),Nn.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete H.tls.ca_file,delete H.leafnodes.tls.ca_file),t=hd.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===RS.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await bl.writeJson(u,H),md.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 Rue(Nn.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===RS.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await bl.writeJson(f,$),md.trace(`Leaf server config written to ${f}`))}a(Iue,"generateNatsConfig");async function AS(e){let t=Lh.get(e);return hd.isEmpty(t)&&yS(`port undefined for '${e}'`),await hd.isPortTaken(t)&&yS(`'${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(AS,"isPortAvailable");function yS(e){let t=`Error generating clustering config: ${e}`;md.error(t),console.error(t),process.exit(1)}a(yS,"generateNatsConfigError");async function Cue(e){let{port:t,config_file:r}=Aw.getServerConfig(e),{username:n,decrypt_hash:s}=await Tw.getClusterUser(),i=0,o=2e3;for(;i<y$;){try{let f=await Aw.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){md.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=y$)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&&md.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await hd.async_set_timeout(u)}let c="0".repeat(Nue),l=yl.join(Lh.get(Jt.ROOTPATH),_d,r);await bl.writeFile(l,c),await bl.remove(l),md.notify(e,"started.")}a(Cue,"removeNatsConfig")});var P$=C((CDe,C$)=>{"use strict";var rs=le(),Pue=fd(),Ve=(k(),P(q)),Mh=Pt(),Co=require("path"),{PACKAGE_ROOT:NS}=Et(),O$=le(),OS=ie(),pd="/dev/null",Due=Co.join(NS,"launchServiceScripts"),N$=Co.join(NS,"utility/scripts"),Lue=Co.join(N$,Ve.HDB_RESTART_SCRIPT),w$=Co.resolve(NS,"dependencies",`${process.platform}-${process.arch}`,Mh.NATS_BINARY_NAME);function I$(){let t=Pue.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 OS.noBootFile()&&(n[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=OS.getEnvCliRootPath()),{name:Ve.PROCESS_DESCRIPTORS.HDB,script:Ve.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:NS}}a(I$,"generateMainServerConfig");var Mue=9930;function vue(){rs.initSync(!0);let e=rs.get(Ve.CONFIG_PARAMS.ROOTPATH),t=Co.join(e,"clustering",Mh.NATS_CONFIG_FILES.HUB_SERVER),r=Co.join(rs.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=O$.get(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Mh.LOG_LEVEL_FLAGS[rs.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Mue?"-"+n:""),script:w$,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 rs.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=pd,i.error_file=pd),i}a(vue,"generateNatsHubServerConfig");var Uue=9940;function xue(){rs.initSync(!0);let e=rs.get(Ve.CONFIG_PARAMS.ROOTPATH),t=Co.join(e,"clustering",Mh.NATS_CONFIG_FILES.LEAF_SERVER),r=Co.join(rs.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=O$.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Mh.LOG_LEVEL_FLAGS[rs.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Uue?"-"+n:""),script:w$,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 rs.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=pd,i.error_file=pd),i}a(xue,"generateNatsLeafServerConfig");function Bue(){rs.initSync();let e=Co.join(rs.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:Due,autorestart:!1};return rs.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=pd,t.error_file=pd),t}a(Bue,"generateClusteringUpgradeV4ServiceConfig");function Hue(){let e={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.RESTART_HDB};return OS.noBootFile()&&(e[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=OS.getEnvCliRootPath()),{...{name:Ve.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:N$},script:Lue}}a(Hue,"generateRestart");function kue(){return{apps:[I$()]}}a(kue,"generateAllServiceConfigs");C$.exports={generateAllServiceConfigs:kue,generateMainServerConfig:I$,generateRestart:Hue,generateNatsHubServerConfig:vue,generateNatsLeafServerConfig:xue,generateClusteringUpgradeV4ServiceConfig:Bue}});var Uh=C((LDe,V$)=>{"use strict";var tt=(k(),P(q)),Fue=ie(),Do=bS(),wS=gr(),Po=Pt(),Ha=P$(),IS=le(),Ol=ee(),Gue=No(),{startWorker:D$,onMessageFromWorkers:que}=it(),$ue=od(),DDe=require("util"),Vue=require("child_process"),Kue=require("fs"),{execFile:Yue}=Vue,je;V$.exports={enterPM2Mode:Wue,start:ka,stop:Rw,reload:M$,restart:v$,list:yw,describe:B$,connect:Lo,kill:Xue,startAllServices:Zue,startService:bw,getUniqueServicesList:H$,restartAllServices:ede,isServiceRegistered:k$,reloadStopStart:F$,restartHdb:x$,deleteProcess:jue,startClusteringProcesses:q$,startClusteringThreads:$$,isHdbRestartRunning:Jue,isClusteringRunning:rde,stopClustering:tde,reloadClustering:nde,expectedRestartOfChildren:U$};var vh=!1;que(e=>{e.type==="restart"&&IS.initSync(!0)});function Wue(){vh=!0}a(Wue,"enterPM2Mode");function Lo(){return je||(je=require("pm2")),new Promise((e,t)=>{je.connect((r,n)=>{r&&t(r),e(n)})})}a(Lo,"connect");var tn,zue=10,L$;function ka(e,t=!1){if(vh)return Que(e);let r=Yue(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=tn.indexOf(r);o>-1&&tn.splice(o,1),!L$&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<zue&&(Kue.existsSync(Do.getHubConfigPath())?ka(e):(await Do.generateNatsConfig(!0),ka(e),await new Promise(c=>setTimeout(c,3e3)),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=IS.get(tt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&Po.LOG_LEVEL_HIERARCHY[o]>=Po.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===Po.LOG_LEVELS.ERR||f===Po.LOG_LEVELS.WRN?Ol.OUTPUTS.STDERR:Ol.OUTPUTS.STDOUT;Ol.logCustomLevel(f||"info",h,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=Po.LOG_LEVELS[_]}if(Po.LOG_LEVEL_HIERARCHY[o]>=Po.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===Po.LOG_LEVELS.ERR||f===Po.LOG_LEVELS.WRN?Ol.OUTPUTS.STDERR:Ol.OUTPUTS.STDOUT;Ol.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(),!tn&&(tn=[],!t)){let i=a(()=>{L$=!0,tn&&(tn.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)}tn.push(r)}a(ka,"start");function Que(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.start(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(Que,"startWithPM2");function Rw(e){if(!vh){for(let t of tn||[])t.name===e&&(tn.splice(tn.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.stop(e,async(n,s)=>{n&&(je.disconnect(),r(n)),je.delete(e,(i,o)=>{i&&(je.disconnect(),r(n)),je.disconnect(),t(o)})})})}a(Rw,"stop");function M$(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.reload(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(M$,"reload");function v$(e){if(!vh){U$();for(let t of tn||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.restart(e,(n,s)=>{je.disconnect(),t(s)})})}a(v$,"restart");function U$(){for(let e of tn||[])e.config&&(e.config.restarts=0)}a(U$,"expectedRestartOfChildren");function jue(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.delete(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(jue,"deleteProcess");async function x$(){await ka(Ha.generateRestart())}a(x$,"restartHdb");async function Jue(){let e=await yw();for(let t in e)if(e[t].name===tt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(Jue,"isHdbRestartRunning");function yw(){return new Promise(async(e,t)=>{try{await Lo()}catch(r){t(r)}je.list((r,n)=>{r&&(je.disconnect(),t(r)),je.disconnect(),e(n)})})}a(yw,"list");function B$(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.describe(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(B$,"describe");function Xue(){if(!vh){for(let e of tn||[])e.kill();tn=[];return}return new Promise(async(e,t)=>{try{await Lo()}catch(r){t(r)}je.killDaemon((r,n)=>{r&&(je.disconnect(),t(r)),je.disconnect(),e(n)})})}a(Xue,"kill");async function Zue(){try{await q$(),await $$(),await ka(Ha.generateAllServiceConfigs())}catch(e){throw je?.disconnect(),e}}a(Zue,"startAllServices");async function bw(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case tt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Ha.generateMainServerConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Ha.generateNatsIngestServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Ha.generateNatsReplyServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Ha.generateNatsHubServerConfig(),await ka(r,t),await Do.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Ha.generateNatsLeafServerConfig(),await ka(r,t),await Do.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Ha.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await ka(r)}catch(r){throw je?.disconnect(),r}}a(bw,"startService");async function H$(){try{let e=await yw(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw je?.disconnect(),e}}a(H$,"getUniqueServicesList");async function ede(e=[]){try{let t=!1,r=await H$();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 v$(o))}t&&await F$(tt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw je?.disconnect(),t}}a(ede,"restartAllServices");async function k$(e){if(tn?.find(r=>r.name===e))return!0;let t=await $ue.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(k$,"isServiceRegistered");async function F$(e){let t=IS.get(tt.CONFIG_PARAMS.THREADS_COUNT)??IS.get(tt.CONFIG_PARAMS.THREADS),r=await B$(e),n=Fue.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await Rw(e),await bw(e)):e===tt.PROCESS_DESCRIPTORS.HDB?await x$():await M$(e)}a(F$,"reloadStopStart");var G$;async function q$(e=!1){for(let t in tt.CLUSTERING_PROCESSES){let r=tt.CLUSTERING_PROCESSES[t];await bw(r,e)}}a(q$,"startClusteringProcesses");async function $$(){G$=D$(tt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await wS.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await wS.updateLocalStreams();let e=await Gue.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===tt.PRE_4_0_0_VERSION){Ol.info("Starting clustering upgrade 4.0.0 process"),D$(tt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a($$,"startClusteringThreads");async function tde(){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 G$.terminate();else{let t=tt.CLUSTERING_PROCESSES[e];await Rw(t)}}a(tde,"stopClustering");async function rde(){for(let e in tt.CLUSTERING_PROCESSES){let t=tt.CLUSTERING_PROCESSES[e];if(await k$(t)===!1)return!1}return!0}a(rde,"isClusteringRunning");async function nde(){await Do.generateNatsConfig(!0),await wS.reloadNATSHub(),await wS.reloadNATSLeaf(),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(nde,"reloadClustering")});var ww={};Ue(ww,{compactOnStart:()=>sde,copyDb:()=>j$});async function sde(){Fa.notify("Running compact on start"),console.log("Running compact on start");let e=(0,Ow.get)(x.ROOTPATH),t=new Map,r=Je();(0,Nw.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,CS.join)(e,"backup",n+".mdb"),o=(0,CS.join)(e,fc,n+"-copy.mdb"),c=0;try{c=await K$(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){Fa.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 j$(n,o),console.log("Backing up",n,"to",i),await(0,Nl.move)(s,i,{overwrite:!0}),console.log("Moving copy compacted",n,"to",s),await(0,Nl.move)(o,s,{overwrite:!0}),await(0,Nl.remove)((0,CS.join)(e,fc,`${n}-copy.mdb-lock`))}try{Du()}catch(n){Fa.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}try{Du()}catch(n){Fa.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){Fa.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,Nw.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,Nl.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw Du(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=await K$(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}.
|
|
25
25
|
Total record count before compaction: ${i}, total after: ${o}.
|