harperdb 4.6.19 → 4.6.20
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.3dd2cdff.js → main.d7e525a4.js} +2 -2
- package/utility/scripts/restartHdb.js +1 -1
- /package/studio/build-local/static/js/{main.3dd2cdff.js.LICENSE.txt → main.d7e525a4.js.LICENSE.txt} +0 -0
package/bin/lite.js
CHANGED
|
@@ -20,7 +20,7 @@ var K4=Object.create;var qf=Object.defineProperty;var Y4=Object.getOwnPropertyDe
|
|
|
20
20
|
`),ud&&(clearTimeout(a),f())):ud||l<performance.now()+Qk?f(_):(l=Math.min(l,performance.now()+Qk),c=[_],a=setTimeout(f,1))}function f(p){if(h(),s){let _=performance.now();xo.appendFileSync(s,c?c.join(""):p);let g=performance.now();l=Math.max(g,l)+(g-_)*50}else i||console.log(c?c.join(""):p);c&&(c=null)}function m(){try{xo.closeSync(s)}catch{}s=null,r&&(Qg=null)}function h(p){if(!s){try{s=xo.openSync(e,"a"),r&&(Qg=s)}catch(_){if(_.code==="ENOENT"&&!p)return xo.mkdirpSync(yh.dirname(e)),h(!0);i||(i=!0,console.error(_))}setTimeout(()=>{m()},Eoe).unref()}}}o(Jk,"getFileLogger");function Roe(...e){wt.info(...e)}o(Roe,"info");function yoe(...e){wt.trace(...e)}o(yoe,"trace");function vN(...e){wt.error(...e)}o(vN,"error");function Aoe(...e){wt.debug(...e)}o(Aoe,"debug");function boe(...e){wt.notify(...e)}o(boe,"notify");function Ioe(...e){wt.fatal(...e)}o(Ioe,"fatal");function Noe(...e){wt.warn(...e)}o(Noe,"warn");function woe(e,t,r,...n){MN=r.service_name;try{wt[e](...n)}finally{MN=void 0}}o(woe,"logCustomLevel");function Ooe(){let e;try{e=doe.homedir()}catch{e=process.env.HOME}e||(e="~/");let t=Bo(e,Hr.HDB_HOME_DIR_NAME,Hr.BOOT_PROPS_FILE_NAME);return xo.existsSync(t)||(t=Bo(UN,"utility/hdb_boot_properties.file")),t}o(Ooe,"getPropsFilePath");function Coe(e){Qi=e}o(Coe,"setLogLevel");function Poe(e){try{if(e.includes("config/settings.js")){let l=eG(e);return{level:l.get(Hr.HDB_SETTINGS_NAMES.LOG_LEVEL_KEY),configLogPath:yh.dirname(l.get(Hr.HDB_SETTINGS_NAMES.LOG_PATH_KEY)),toFile:l.get(Hr.HDB_SETTINGS_NAMES.LOG_TO_FILE),toStream:l.get(Hr.HDB_SETTINGS_NAMES.LOG_TO_STDSTREAMS)}}let t=Zk.parseDocument(xo.readFileSync(e,"utf8")),r=t.getIn(["logging","level"]),n=t.getIn(["logging","root"]),s=t.getIn(["logging","file"]),i=t.getIn(["logging","stdStreams"]),a=t.getIn(["logging","console"]),c=t.getIn(["logging","rotation"])?.toJSON();return{level:r,configLogPath:n,toFile:s,toStream:i,logConsole:a,rotation:c}}catch(t){if(t.code===Hr.NODE_ERROR_CODES.ENOENT)throw t;console.error("Error accessing config file for logging"),console.error(t)}}o(Poe,"getLogConfig");function Loe(){try{let e=Zk.parseDocument(xo.readFileSync(poe,"utf8")),t=e.getIn(["logging","level"]),r=e.getIn(["logging","file"]),n=e.getIn(["logging","stdStreams"]);return{defaultLevel:t,defaultToFile:r,defaultToStream:n}}catch(e){console.error("Error accessing default config file for logging"),console.error(e)}}o(Loe,"getDefaultConfig");function Doe(e){return typeof e.message=="string"?`${e.constructor.name}: ${e.message}`:e.toString()}o(Doe,"errorToString");function Moe(e){wt=e}o(Moe,"setMainLogger");function sG(){try{xo.closeSync(Qg)}catch{}Qg=null}o(sG,"closeLogFile");function voe(e,t,r,n,s,i){this.username=e,this.status=t,this.type=r,this.originating_ip=n,this.request_method=s,this.path=i}o(voe,"AuthAuditLog");var{RootConfigWatcher:Uoe}=(Kk(),v(Vk))});var oe=M((cG,lG)=>{"use strict";var xN=require("fs-extra"),Il=require("path"),iG=require("os"),xoe=require("properties-reader"),Nh=Q(),Ih=ie(),Be=(k(),v(W)),tS=bt(),Boe="Error initializing environment manager",rS="BOOT_PROPS_FILE_PATH",oG=!1,Foe={[Be.HDB_SETTINGS_NAMES.INSTALL_USER]:!0,[Be.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY]:!0,[Be.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]:!0,BOOT_PROPS_FILE_PATH:!0},Fo={};Object.assign(cG,lG.exports={BOOT_PROPS_FILE_PATH:rS,getHdbBasePath:Hoe,setHdbBasePath:koe,get:aG,initSync:qoe,setProperty:je,initTestEnvironment:$oe});function Hoe(){return Fo[Be.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]}o(Hoe,"getHdbBasePath");function koe(e){Fo[Be.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]=e}o(koe,"setHdbBasePath");function aG(e){let t=tS.getConfigValue(e);return t===void 0?Fo[e]:t}o(aG,"get");function je(e,t){Foe[e]&&(Fo[e]=t),tS.updateConfigObject(e,t)}o(je,"setProperty");function Goe(){let e;try{e=Ih.getPropsFilePath(),xN.accessSync(e,xN.constants.F_OK|xN.constants.R_OK),oG=!0;let t=xoe(e);return Fo[Be.HDB_SETTINGS_NAMES.INSTALL_USER]=t.get(Be.HDB_SETTINGS_NAMES.INSTALL_USER),Fo[Be.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY]=t.get(Be.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY),Fo[rS]=e,!0}catch{return Nh.trace(`Environment manager found no properties file at ${e}`),!1}}o(Goe,"doesPropFileExist");function qoe(e=!1){try{(oG||Goe()||Ih.noBootFile()||e)&&(tS.initConfig(e),Fo[Be.HDB_SETTINGS_NAMES.HDB_ROOT_KEY]=tS.getConfigValue(Be.HDB_SETTINGS_NAMES.HDB_ROOT_KEY))}catch(t){Nh.error(Boe),Nh.error(t),console.error(t),process.exit(1)}}o(qoe,"initSync");function $oe(e={}){try{let{keep_alive_timeout:t,headers_timeout:r,server_timeout:n,https_enabled:s,cors_enabled:i,cors_accesslist:a,local_studio_on:c}=e,l=Il.join(__dirname,"../../","unitTests");Fo[rS]=Il.join(l,"hdb_boot_properties.file"),je(Be.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY,Il.join(l,"settings.test")),je(Be.HDB_SETTINGS_NAMES.INSTALL_USER,iG.userInfo()?iG.userInfo().username:void 0),je(Be.HDB_SETTINGS_NAMES.LOG_LEVEL_KEY,"debug"),je(Be.HDB_SETTINGS_NAMES.LOG_PATH_KEY,Il.join(l,"envDir","log")),je(Be.HDB_SETTINGS_NAMES.LOG_DAILY_ROTATE_KEY,!1),je(Be.HDB_SETTINGS_NAMES.CLUSTERING_ENABLED_KEY,!0),je(Be.HDB_SETTINGS_NAMES.CLUSTERING_NODE_NAME_KEY,"1231412de213"),je(Be.HDB_SETTINGS_NAMES.HDB_ROOT_KEY,Il.join(l,"envDir")),je(Be.CONFIG_PARAMS.STORAGE_PATH,Il.join(l,"envDir")),s&&(je(Be.CONFIG_PARAMS.HTTP_SECUREPORT,aG(Be.CONFIG_PARAMS.HTTP_PORT)),je(Be.CONFIG_PARAMS.HTTP_PORT,null)),je(Be.CONFIG_PARAMS.CUSTOMFUNCTIONS_NETWORK_HTTPS,!!s),je(Be.CONFIG_PARAMS.HTTP_PORT,9926),je(Be.HDB_SETTINGS_NAMES.SERVER_PORT_KEY,9925),je(Be.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT,9925),je(Be.HDB_SETTINGS_NAMES.CORS_ENABLED_KEY,Ih.isEmpty(i)?!1:i),je(Be.CONFIG_PARAMS.HTTP_CORS,Ih.isEmpty(i)?!1:i),je(Be.HDB_SETTINGS_NAMES.MAX_CUSTOM_FUNCTION_PROCESSES,2),je(Be.HDB_SETTINGS_NAMES.MAX_HDB_PROCESSES,4),je(Be.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_PORT_KEY,9926),je(Be.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_ENABLED_KEY,!0),je(Be.HDB_SETTINGS_NAMES.CUSTOM_FUNCTIONS_DIRECTORY_KEY,Il.resolve(__dirname,"../../unitTests/server/fastifyRoutes/custom_functions")),je(Be.HDB_SETTINGS_NAMES.LOCAL_STUDIO_ON,Ih.isEmpty(c)?!1:c),a&&(je("CORS_ACCESSLIST",a),je(Be.CONFIG_PARAMS.HTTP_CORSACCESSLIST,a)),n&&(je(Be.HDB_SETTINGS_NAMES.SERVER_TIMEOUT_KEY,n),je(Be.CONFIG_PARAMS.HTTP_TIMEOUT,n)),t&&(je(Be.HDB_SETTINGS_NAMES.SERVER_KEEP_ALIVE_TIMEOUT_KEY,t),je(Be.CONFIG_PARAMS.HTTP_KEEPALIVETIMEOUT,t)),r&&(je(Be.HDB_SETTINGS_NAMES.SERVER_HEADERS_TIMEOUT_KEY,r),je(Be.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT,r))}catch(t){let r=`Error reading in HDB environment variables from path ${rS}. Please check your boot props and settings files`;Nh.fatal(r),Nh.error(t)}}o($oe,"initTestEnvironment")});var HN={};Oe(HN,{loadGQLSchema:()=>Yoe,start:()=>FN,startOnMainThread:()=>Koe});function FN({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r,n,s,i){let{parse:a,Source:c,Kind:l,NamedTypeNode:u,StringValueNode:d}=await import("graphql"),f=a(new c(r.toString(),s)),m=new Map,h=[],p;for(let y of f.definitions)switch(y.kind){case l.OBJECT_TYPE_DEFINITION:let F=function(G){if(G.kind==="NonNullType"){let K=F(G.type);return K.nullable=!1,K}if(G.kind==="ListType")return{type:"array",elements:F(G.type)};let q={type:G.name?.value};return Object.defineProperty(q,"location",{value:G.loc.startToken}),q};o(F,"getProperty");let T=y.name.value,R=[],N={table:null,database:null,properties:R};m.set(T,N);for(let G of y.directives){if(G.name.value==="table"){for(let q of G.arguments)N[q.name.value]=q.value.value;N.schema&&(N.database=N.schema),N.table||(N.table=T),N.audit&&(N.audit=N.audit!=="false"),N.attributes=N.properties,h.push(N)}if(G.name.value==="sealed"&&(N.sealed=!0),G.name.value==="splitSegments"&&(N.splitSegments=!0),G.name.value==="replicate"&&(N.replicate=!0),G.name.value==="export"){N.export=!0;for(let q of G.arguments)typeof N.export!="object"&&(N.export={}),N.export[q.name.value]=q.value.value}}let O=!1,Z={};for(let G of y.fields){let Y=F(G.type);Y.name=G.name.value,R.push(Y),Z[Y.name]=void 0;for(let q of G.directives){let K=q.name.value;if(K==="primaryKey")O?console.warn("Can not define two attributes as a primary key at",q.loc):(Y.isPrimaryKey=!0,O=!0);else if(K==="indexed"){let ce={};for(let le of q.arguments||[])ce[le.name.value]=le.value.value;Y.indexed=ce}else if(K==="computed"){for(let ce of q.arguments||[])if(ce.name.value==="from"){let le=ce.value.value;Y.computed={from:g(le,ce,Z)},Y.version==null&&(Y.version=le)}else ce.name.value==="version"&&(Y.version=ce.value.value);Y.computed=Y.computed||!0}else if(K==="relationship"){let ce={};for(let le of q.arguments)ce[le.name.value]=le.value.value;Y.relationship=ce}else if(K==="createdTime")Y.assignCreatedTime=!0;else if(K==="updatedTime")Y.assignUpdatedTime=!0;else if(K==="expiresAt")Y.expiresAt=!0;else if(K==="allow"){let ce=Y.authorizedRoles=[];for(let le of q.arguments)le.name.value==="role"&&ce.push(le.value.value)}else server.knownGraphQLDirectives.includes(K)&&console.warn(`@${K} is an unknown directive, at`,q.loc)}}N.type=T,T==="Query"&&(p=N)}function _(y){let T=m.get(y.type);T?(Object.defineProperty(y,"properties",{value:T.properties}),Object.defineProperty(y,"definition",{value:T})):y.type==="array"?_(y.elements):Voe.includes(y.type)||(0,dG.getWorkerIndex)()===0&&console.error(`The type ${y.type} is unknown at line ${y.location.line}, column ${y.location.column}, in ${s}`)}o(_,"connectPropertyType");for(let y of m.values())for(let T of y.properties)_(T);for(let y of h)y.tableClass=e(y),y.export&&(y.export.name===""?i.set((0,BN.dirname)(n),y.tableClass):i.set((0,BN.dirname)(n)+"/"+(y.export.name||y.type),y.tableClass,y.export));function g(y,T,R){return new uG.Script(`function computed(attributes) { return function(record) { with(attributes) { with (record) { return ${y}; } } } } computed;`,{filename:s,lineOffset:T.loc.startToken.line-1,columnOffset:T.loc.startToken.column}).runInThisContext()(R)}o(g,"createComputedFrom")}}var BN,uG,dG,Voe,Koe,Yoe,fG=ue(()=>{BN=require("path"),uG=require("node:vm");De();dG=w(rt()),Voe=["ID","Int","Float","Long","String","Boolean","Date","Bytes","Any","BigInt","Blob"];server.knownGraphQLDirectives&&(server.knownGraphQLDirectives=["table","sealed","export","primaryKey","indexed","computed","relationship","createdTime","updatedTime","expiresAt","allow"]);o(FN,"start");Koe=FN,Yoe=FN({ensureTable:ze}).handleFile});var GN={};Oe(GN,{start:()=>tae});function Woe(e){if(e.kind!==Fe.Kind.OPERATION_DEFINITION&&e.kind!==Fe.Kind.FRAGMENT_DEFINITION)throw new kr(`Unexpected non-executable definition type ${e.kind}.`)}function mG(e){if(typeof e!="object"||e===null)throw new Ji("Request body must be an object.");if(!("query"in e))throw new Ji("Request body must contain a `query` field.");if(typeof e.query!="string")throw new Ji("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new Ji("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new Ji("Request body `operationName` field must be a string.")}function kN(e){return parseInt(e.value,10)}function pG(e){return parseFloat(e.value)}function EG(e,t,r){let n=r.get(e.name.value);return _G(n)?gG(n,t):{attribute:t,value:n}}function _G(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function gG(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],_G(n)?gG(n,t):{attribute:t,value:n}))}function zoe(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case Fe.Kind.NULL:return{attribute:t,value:null};case Fe.Kind.INT:return{attribute:t,value:kN(e.value)};case Fe.Kind.FLOAT:return{attribute:t,value:pG(e.value)};case Fe.Kind.BOOLEAN:case Fe.Kind.STRING:return{attribute:t,value:e.value.value};case Fe.Kind.VARIABLE:return EG(e.value,t,r);case Fe.Kind.OBJECT:return SG(e.value,t,r);case Fe.Kind.LIST:case Fe.Kind.ENUM:default:throw new kr(`Value type, ${e.value.kind}, is not supported.`)}}function SG(e,t,r){return e.fields.flatMap(n=>zoe(n,t,r))}function joe(e,t){switch(e.value.kind){case Fe.Kind.NULL:return{attribute:e.name.value,value:null};case Fe.Kind.INT:return{attribute:e.name.value,value:kN(e.value)};case Fe.Kind.FLOAT:return{attribute:e.name.value,value:pG(e.value)};case Fe.Kind.BOOLEAN:case Fe.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case Fe.Kind.VARIABLE:return EG(e.value,e.name.value,t);case Fe.Kind.OBJECT:return SG(e.value,[e.name.value],t);case Fe.Kind.LIST:case Fe.Kind.ENUM:default:throw new kr(`Argument type, ${e.value.kind}, is not supported.`)}}function Qoe(e,t){return e.flatMap(r=>joe(r,t))}function nS(e,t){return e.selections.flatMap(r=>{switch(r.kind){case Fe.Kind.FIELD:return r;case Fe.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new kr(`Fragment \`${n}\` not found.`);return nS(s.selectionSet,t)}case Fe.Kind.INLINE_FRAGMENT:return nS(r.selectionSet,t)}})}function TG(e,t){return nS(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:TG(r.selectionSet,t)}:r.name.value)}async function Joe(e,t,r,n){let s=bs.getMatch(e.name.value,"graphql");if(s===void 0)throw new kr(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,a={select:TG(e.selectionSet,r),conditions:Qoe(e.arguments,t)},c=[];n.authorize=!0;for await(let l of i.search(a,n))c.push(l);return[e.name.value,c]}function RG(e){switch(e.kind){case Fe.Kind.NULL:return null;case Fe.Kind.INT:return kN(e);case Fe.Kind.FLOAT:return parseFloat(e.value);case Fe.Kind.STRING:case Fe.Kind.BOOLEAN:return e.value;case Fe.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:RG(r.value),...t}),{});case Fe.Kind.LIST:case Fe.Kind.ENUM:default:throw new kr(`Value type, ${e.kind}, is not supported.`)}}function Xoe(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=RG(n.defaultValue)),n.type.kind===Fe.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new kr(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function Zoe(e,t,r,n){if(e.operation===Fe.OperationTypeNode.SUBSCRIPTION)throw new kr("Subscriptions are not supported.");if(e.operation===Fe.OperationTypeNode.MUTATION)throw new kr("Mutations are not supported yet.");let s=Xoe(e.variableDefinitions,t),i=await Promise.all(nS(e.selectionSet,r).map(c=>Joe(c,s,r,n))),a={data:{}};for(let[c,l]of i)a.data[c]=l;return a}async function hG({query:e,variables:t={},operationName:r},n){let s=Fe.parse(e),i=new Map,a=new Map;for(let u of s.definitions)if(Woe(u),u.kind===Fe.Kind.FRAGMENT_DEFINITION)a.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new kr("Unnamed operations are only allowed when there is a single operation in the document.");let d=u.name?.value??"Unnamed Query";if(i.has(d))throw new kr(`Duplicate operation definition: ${d}`);i.set(d,u)}let c;if(r==null)if(i.size===1)c=i.entries().next().value[1];else throw new kr("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new kr(`Operation \`${r}\` not found.`);let l=await Zoe(c,t,a,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function eae(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 mG(r),hG(r,e)}case"POST":{let r=await To(e.headers.get("content-type"),!0)(e._nodeRequest);return mG(r),hG(r,e)}default:throw new Ji("Method Not Allowed",405,{Allow:"GET, POST"})}}function tae(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await eae(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof Ji)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof Fe.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof kr)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 Ji)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof Fe.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof kr)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 Fe,kr,Ji,yG=ue(()=>{Fe=w(require("graphql"));Ro();Bu();o(Woe,"assertExecutableDefinitionNode");o(mG,"assertRequestParams");o(kN,"processIntValueNode");o(pG,"processFloatValueNode");o(EG,"processVariableNode");o(_G,"isObject");o(gG,"transformObjectIntoQueryCondition");o(zoe,"processObjectFieldNode");o(SG,"processObjectValueNode");o(joe,"processArgumentNode");o(Qoe,"buildConditionsQuery");o(nS,"fillInFragments");o(TG,"buildSelectQuery");o(Joe,"processFieldNode");o(RG,"processConstValueNode");o(Xoe,"resolveVariables");o(Zoe,"executeOperation");o(hG,"resolver");kr=class extends Error{static{o(this,"GraphQLQueryingError")}},Ji=class extends Error{static{o(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};o(eae,"graphqlQueryingHandler");o(tae,"start")});var OG=M((IDe,wG)=>{var dd=require("validate.js"),bG=lt(),fd=(k(),v(W)),{handleHDBError:rae,hdbErrors:nae}=ge(),{HDB_ERROR_MSGS:rr,HTTP_STATUS_CODES:sae}=nae,qN=o(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),iae={STRUCTURE_USER:"structure_user"},AG=Object.values(fd.ROLE_TYPES_ENUM),oae="attribute_permissions",aae="attribute_name",{PERMS_CRUD_ENUM:md}=fd,cae=[oae,...Object.values(md)],IG=[md.READ,md.INSERT,md.UPDATE],lae=[aae,...IG];function uae(e){let t=qN();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,NG(e,t)}o(uae,"addRoleValidation");function dae(e){let t=qN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,NG(e,t)}o(dae,"alterRoleValidation");function fae(e){let t=qN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,bG.validateObject(e,t)}o(fae,"dropRoleValidation");var mae=["operation","role","id","permission","hdb_user","access"];function NG(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let a=0,c=n.length;a<c;a++)mae.includes(n[a])||s.push(n[a]);s.length>0&&fr(rr.INVALID_ROLE_JSON_KEYS(s),r);let i=bG.validateObject(e,t);if(i&&i.message.split(",").forEach(a=>{fr(a,r)}),e.permission){let a=hae(e);a&&fr(a,r),AG.forEach(c=>{e.permission[c]&&!dd.isBoolean(e.permission[c])&&fr(rr.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let a in e.permission)if(AG.indexOf(a)<0){if(a===iae.STRUCTURE_USER){let l=e.permission[a];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,d=l.length;u<d;u++){let f=l[u];global.hdb_schema[f]||fr(rr.SCHEMA_NOT_FOUND(f),r)}continue}fr(rr.STRUCTURE_USER_ROLE_TYPE_ERROR(a),r);continue}let c=e.permission[a];if(!a||!global.hdb_schema[a]){fr(rr.SCHEMA_NOT_FOUND(a),r);continue}if(c.tables)for(let l in c.tables){let u=c.tables[l];if(!l||!global.hdb_schema[a][l]){fr(rr.TABLE_NOT_FOUND(a,l),r);continue}if(Object.keys(u).forEach(d=>{cae.includes(d)||fr(rr.INVALID_PERM_KEY(d),r,a,l)}),Object.values(md).forEach(d=>{dd.isDefined(u[d])?dd.isBoolean(u[d])||fr(rr.TABLE_PERM_NOT_BOOLEAN(d),r,a,l):fr(rr.TABLE_PERM_MISSING(d),r,a,l)}),u.attribute_permissions===void 0){fr(rr.ATTR_PERMS_ARRAY_MISSING,r,a,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){fr(rr.ATTR_PERMS_NOT_ARRAY,r,a,l);continue}if(u.attribute_permissions){let d=global.hdb_schema[a][l].attributes.map(({attribute:m})=>m),f={read:!1,insert:!1,update:!1};for(let m in u.attribute_permissions){let h=u.attribute_permissions[m];if(Object.keys(h).forEach(_=>{!lae.includes(_)&&_!==md.DELETE&&fr(rr.INVALID_ATTR_PERM_KEY(_),r,a,l)}),!dd.isDefined(h.attribute_name)){fr(rr.ATTR_PERM_MISSING_NAME,r,a,l);continue}let p=h.attribute_name;if(!d.includes(p)){fr(rr.INVALID_ATTRIBUTE_IN_PERMS(p),r,a,l);continue}IG.forEach(_=>{dd.isDefined(h[_])?dd.isBoolean(h[_])||fr(rr.ATTR_PERM_NOT_BOOLEAN(_,p),r,a,l):fr(rr.ATTR_PERM_MISSING(_,p),r,a,l)}),!f.read&&h.read===!0&&(f.read=!0),!f.insert&&h.insert===!0&&(f.insert=!0),!f.update&&h.update===!0&&(f.update=!0)}if(u.read===!1&&f.read===!0||u.insert===!1&&f.insert===!0||u.update===!1&&f.update===!0){let m=`${a}.${l}`;fr(rr.MISMATCHED_TABLE_ATTR_PERMS(m),r,a,l)}}}}return pae(r)}o(NG,"customValidate");wG.exports={addRoleValidation:uae,alterRoleValidation:dae,dropRoleValidation:fae};function hae(e){let{operation:t,permission:r}=e;if(t===fd.OPERATIONS_ENUM.ADD_ROLE||t===fd.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 rr.SU_CU_ROLE_COMBINED_ERROR;{let a=r.super_user?fd.ROLE_TYPES_ENUM.SUPER_USER:fd.ROLE_TYPES_ENUM.CLUSTER_USER;return rr.SU_CU_ROLE_NO_PERMS_ALLOWED(a)}}}return null}o(hae,"validateNoSUPerms");function pae(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:rr.ROLE_PERMS_ERROR,...e};return rae(new Error,n,sae.BAD_REQUEST)}else return null}o(pae,"generateRolePermResponse");function fr(e,t,r,n){if(!r)t.main_permissions.push(e);else{let s=n?r+"_"+n:r;t.schema_permissions[s]?t.schema_permissions[s].push(e):t.schema_permissions[s]=[e]}}o(fr,"addPermError")});var Oh=M((ODe,DG)=>{"use strict";var CG=Mn(),PG=on(),Eae=pl(),VN=OG(),KN=Co(),wDe=require("uuid").v4,_ae=require("util"),sS=(k(),v(W)),gae=ie(),YN=PG.searchByValue,Sae=PG.searchByHash,Tae=_ae.promisify(Eae.delete),Rae=ai(),yae=Vu(),{hdbErrors:Aae,handleHDBError:Nl}=ge(),{HDB_ERROR_MSGS:LG,HTTP_STATUS_CODES:wh}=Aae,{UserEventMsg:WN}=oi();DG.exports={addRole:bae,alterRole:Iae,dropRole:Nae,listRoles:wae};function $N(e){try{e.hdb_auth_header&&delete e.hdb_auth_header,e.HDB_INTERNAL_PATH&&delete e.HDB_INTERNAL_PATH,e.operation&&delete e.operation,e.hdb_user&&delete e.hdb_user}catch{}return e}o($N,"scrubRoleDetails");async function bae(e){let t=VN.addRoleValidation(e);if(t)throw t;e=$N(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 YN(r)||[])}catch(i){throw Nl(i)}if(n&&n.length>0)throw Nl(new Error,LG.ROLE_ALREADY_EXISTS(e.role),wh.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 CG.insert(s),KN.signalUserChange(new WN(process.pid)),e=$N(e),e}o(bae,"addRole");async function Iae(e){let t=VN.alterRoleValidation(e);if(t)throw t;e=$N(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await CG.update(r)}catch(s){throw Nl(s)}if(n&&n?.message==="updated 0 of 1 records")throw Nl(new Error,"Invalid role id",wh.BAD_REQUEST,void 0,void 0,!0);return await KN.signalUserChange(new WN(process.pid)),e}o(Iae,"alterRole");async function Nae(e){let t=VN.dropRoleValidation(e);if(t)throw Nl(new Error,t,wh.BAD_REQUEST,void 0,void 0,!0);let r=new yae(sS.SYSTEM_SCHEMA_NAME,sS.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Sae(r));if(n.length===0)throw Nl(new Error,LG.ROLE_NOT_FOUND,wh.NOT_FOUND,void 0,void 0,!0);let s=new Rae(sS.SYSTEM_SCHEMA_NAME,sS.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await YN(s)),a=!1;if(gae.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){a=!0;break}}if(a===!0)throw Nl(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,wh.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await Tae(c),KN.signalUserChange(new WN(process.pid)),`${n[0].role} successfully deleted`}o(Nae,"dropRole");async function wae(){return YN({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}o(wae,"listRoles")});var zN={};Oe(zN,{start:()=>UG,startOnMainThread:()=>Pae});function UG({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,MG.parseDocument)(r.toString(),{simpleKeys:!0}).toJSON();for(let s in n){let i=n[s];i.permission||(i={permission:i},i.permission.access&&(i.access=i.permission.access,delete i.permission.access));for(let a in i.permission){if(Oae.includes(a))continue;let c=i.permission[a];c.tables||(i.permission[a]=c={tables:c});for(let l in c.tables){let u=c.tables[l];if(u.read=!!u.read,u.insert=!!u.insert,u.update=!!u.update,u.delete=!!u.delete,u.attributes){let d=[];for(let f in u.attributes){let m=u.attributes[f];m.attribute_name=f,d.push(m)}u.attribute_permissions=d,delete u.attributes}if(u.attribute_permissions){if(!Array.isArray(u.attribute_permissions))throw new Error("attribute_permissions must be an array if defined");for(let d of u.attribute_permissions)d.read=!!d.read,d.insert=!!d.insert,d.update=!!d.update}else u.attribute_permissions=null}}i.role=i.id=s,await Cae(i)}}}async function Cae(e){let t=nt().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,vG.isEqual)(i,e)?void 0:(e.id=r.id,(0,iS.alterRole)(e))}return(0,iS.addRole)(e)}var iS,MG,vG,Oae,Pae,xG=ue(()=>{De();iS=w(Oh()),MG=require("yaml"),vG=require("lodash"),Oae=["super_user","cluster_user","structure_user"];o(UG,"start");o(Cae,"ensureRole");Pae=UG});async function oS(e){let t=(0,HG.pathToFileURL)(e).toString();if(Lae)return Ch||(Ch=Dae(vae)),(await(await Ch).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function Dae(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),Ch=new Compartment({console,Math,Date,fetch:Mae,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,FG.extname)(r)||(r+=".js"),r)},importHook:o(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){s.Resource=xr,s.tables=un,s.databases=ke}};let n=await(0,BG.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),Ch}function Mae(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 vae(){return{Resource:xr,tables:un}}var BG,FG,HG,Lae,Ch,jN=ue(()=>{Pa();De();BG=require("fs/promises"),FG=require("path"),HG=require("url"),Lae=!1;o(oS,"secureImport");o(Dae,"getCompartment");o(Mae,"secureOnlyFetch");o(vae,"getGlobalVars")});var QN={};Oe(QN,{handleApplication:()=>Uae,suppressHandleApplicationWarning:()=>xae});function GG(e){return typeof e=="function"&&("get"in e||"put"in e||"post"in e||"delete"in e)}async function Uae(e){e.handleEntry(t=>{if(t.entryType!=="file"){e.logger.warn(`jsResource plugin cannot handle entry type ${t.entryType}. Modify the 'files' option in ${e.configFilePath} to only include files.`);return}if(t.eventType!=="add"){e.requestRestart();return}oS(t.absolutePath).then(r=>{let n=(0,kG.dirname)(t.urlPath).replace(/\\/g,"/").replace(/^\/$/,"");GG(r.default)&&(e.resources.set(n,r.default),e.logger.debug(`Registered root resource: ${n}`)),qG(e,r,n)}).catch(r=>{e.logger.error(`Failed to load resource module ${t.absolutePath}: ${r}`),e.requestRestart()})})}function qG(e,t,r){for(let n in t){let s=t[n],i=`${r}/${n}`;GG(s)?(e.resources.set(i,s),e.logger.debug(`Registered resource: ${i}`)):typeof s=="object"&&qG(e,s,i)}}var kG,xae,$G=ue(()=>{jN();kG=require("path");o(GG,"isResource");o(Uae,"handleApplication");o(qG,"recurseForResources");xae=!0});var XN={};Oe(XN,{start:()=>Bae});function Bae({resources:e}){e.set("login",JN),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var JN,VG=ue(()=>{Pa();o(Bae,"start");JN=class extends xr{static{o(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:a}=r;return{data:await n.login(s,i)}}}});function jG(e){let t={openapi:Fae,info:{title:"HarperDB HTTP REST interface",version:zG.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:a,primaryKey:c,prototype:l}=n.Resource;if(c=c??"id",!c)continue;let u={},d=[];if(a)for(let{type:R,name:N,elements:O,relationship:F,definition:Z}of a){if(F)R==="array"?u[N]={type:"array",items:{$ref:Ka+O.type}}:u[N]={$ref:Ka+R};else{let G=Z??O?.definition;if(G){if(!t.components.schemas[G.type]){let Y={};G.properties.forEach(q=>{Y[q.name]=new rw(ZN[q.type],q.type)}),t.components.schemas[G.type]=new WG(Y)}R==="array"?u[N]={type:"array",items:{$ref:Ka+G.type}}:u[N]={$ref:Ka+G.type}}else R==="array"?O.type==="Any"||O.type=="ID"?u[N]={type:"array",items:{format:O.type}}:u[N]={type:"array",items:new rw(ZN[O.type],O.type)}:R==="Any"||R=="ID"?u[N]={format:R}:u[N]=new rw(ZN[R],R)}d.push(new nw(N,"query",u[N]))}let f=Object.keys(u),m=new nw(c,"path",{format:"ID"});m.required=!0,m.description="primary key of record";let h=new nw("property","path",{enum:f});h.required=!0,t.components.schemas[i]=new WG(u);let p=l.post!==Resource.prototype.post||l.update,_=typeof l.put=="function",g=typeof l.get=="function",y=typeof l.delete=="function",T="/"+s+"/";p&&(t.paths[T]={},t.paths[T].post=new Hae(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[T]||(t.paths[T]={}),t.paths[T].get=new ew(d,r,{200:new tw({$ref:Ka+i})},"search for records by the specified property name and value pairs")),y&&(t.paths[T]||(t.paths[T]={}),t.paths[T].delete=new YG(d,r,"delete all the records that match the provided query",{204:new KG})),T="/"+s+"/{"+c+"}",g&&(t.paths[T]={},t.paths[T].get=new ew([m],r,{200:new tw({$ref:Ka+i})},"retrieve a record by its primary key")),_&&(t.paths[T]||(t.paths[T]={}),t.paths[T].put=new kae([m],r,i,"create or update the record with the URL path that maps to the record's primary key")),y&&(t.paths[T]||(t.paths[T]={}),t.paths[T].delete=new YG([m],r,"delete a record with the given primary key",{204:new KG})),g&&h.schema.enum.length>0&&(T="/"+s+"/{"+c+"}.{property}",t.paths[T]={},t.paths[T].get=new ew([m,h],r,{200:new tw({enum:f})},"used to retrieve the specified property of the specified record"))}return t}function Hae(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:Ka+e}}}},this.security=t,this.responses={200:{description:sw,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function ew(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function tw(e){this.description=sw,this.content={"application/json":{schema:e}}}function KG(){this.description="successfully processed request, no content returned to client"}function kae(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Ka+r}}}},this.responses={200:{description:sw}}}function YG(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function WG(e){this.type="object",this.properties=e}function rw(e,t){this.type=e,this.format=t}function nw(e,t,r){this.name=e,this.in=t,this.schema=r}var zG,Fae,ZN,Ka,sw,QG=ue(()=>{zG=w(Rt()),Fae="3.0.3",ZN={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},Ka="#/components/schemas/",sw="successful operation";o(jG,"generateJsonApi");o(Hae,"Post");o(ew,"Get");o(tw,"Response200");o(KG,"Response204");o(kae,"Put");o(YG,"Delete");o(WG,"ResourceSchema");o(rw,"Type");o(nw,"Parameter")});var XG={};Oe(XG,{Request:()=>Ya,createReuseportFd:()=>aS});var JG,Ya,iw,ow,aS,Ph=ue(()=>{JG=require("os"),Ya=class{static{o(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 ow(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 iw(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get httpVersion(){return this._nodeRequest.httpVersion}get isAborted(){return!1}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},iw=class{static{o(this,"RequestBody")}#e;constructor(t){this.#e=t}on(t,r){return this.#e.on(t,r),this}pipe(t,r){return this.#e.pipe(t,r)}},ow=class{constructor(t){this.asObject=t}static{o(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,JG.platform)()!="win32"&&(aS=require("node-unix-socket").createReuseportFd)});var lS={};Oe(lS,{parseHeaderValue:()=>cw,start:()=>$ae});async function qae(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&I_(e);let i=new Os;try{e.responseHeaders=i;let a=e.url.slice(1),c,l;if(a!==ZG){let g=cS.getMatch(a,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new ri(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let y=cw(g);for(let T of y)switch(T.name){case"max-age":e.expiresAt=T.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=cw(u).map(y=>(y.next?.name==="confirm"&&y.next.value>=0&&(e.replicatedConfirmation=+y.next.value),y.name));e.replicateTo=g.length===1&&+g[0]>=0?+g[0]:g[0]==="*"?void 0:g}r["x-replicate-from"]==="none"&&(e.replicateFrom=!1);let f=await xt(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=To(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new hd.ClientError(g,400)}if(e.authorize=!0,a===ZG&&s==="GET"){if(e?.user?.role?.permission?.super_user)return jG(cS);throw new hd.ServerError("Forbidden",403)}switch(c.checkPermission=e.user?.role?.permission??{},s){case"GET":case"HEAD":return l.get(c,e);case"POST":return l.post(c,e.data,e);case"PUT":return l.put(c,e.data,e);case"DELETE":return l.delete(c,e);case"PATCH":return l.patch(c,e.data,e);case"OPTIONS":i.setIfNone("Allow","GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE");return;case"CONNECT":return l.connect(c,null,e);case"TRACE":return"HarperDB is the terminating server";case"QUERY":return l.query(c,e.data,e);case"COPY":return l.copy(c,r.destination,e);case"MOVE":return l.move(c,r.destination,e);case"BREW":throw new hd.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new hd.ServerError(`Method ${s} is not recognized`,501)}}),m=200,h;if(f==null)m=s==="GET"||s==="HEAD"?404:204,aw.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(f.status>0&&f.headers){let g=jH(f.headers,i);return f.headers!==g&&(f.headers=g),f.data!==void 0&&(f.body=cm(f.data,e,f)),f}else if(h=e.lastModified){Gae[0]=h;let g=String.fromCharCode(34,(jr[0]&63)+62,(jr[0]>>6)+(jr[1]<<2&63)+62,(jr[1]>>4)+(jr[2]<<4&63)+62,(jr[2]>>2)+62,(jr[3]&63)+62,(jr[3]>>6)+(jr[4]<<2&63)+62,(jr[4]>>4)+(jr[5]<<4&63)+62,(jr[5]>>2)+62,(jr[6]&63)+62,(jr[6]>>6)+(jr[7]<<2&63)+62,34),y=r["if-none-match"];y&&g==y?(f?.onDone&&f.onDone(),m=304,f=void 0):i.setIfNone("ETag",g),aw.lastModified&&i.setIfNone("Last-Modified",new Date(h).toUTCString())}e.createdResource&&(m=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let p={status:m,headers:i,body:void 0},_=e.loadedFromSource??f?.wasLoadedFromSource?.();return _!==void 0&&(p.wasCacheMiss=_,!_&&h&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||h))/1e3))),f!==void 0&&(p.body=cm(f,e,p),s==="HEAD"&&(p.body=void 0)),p}catch(a){a.statusCode?a.statusCode===500?fi.warn(a):fi.info(a):fi.error(a),a.statusCode===405&&(a.method&&(a.message+=` to handle HTTP method ${a.method.toUpperCase()||""}`),a.allow&&(a.allow.push("trace","head","options"),i.setIfNone("Allow",a.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:a.statusCode||500,headers:i,body:void 0};return c.body=cm(a.contentType?a:rq(a),e,c),c}}function $ae(e){aw=e,e.includeExpensiveRecordCountEstimates&&(Ya.prototype.includeExpensiveRecordCountEstimates=!0),!eq&&(eq=!0,cS=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return qae(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{Lh++;let s=new Vn;tq||(tq=!0,ch(l=>{Lh>0&&l.push({metric:"ws-connections",connections:Lh,byThread:!0})}));let i;t.on("error",l=>{i=!0,fi.warn(l)});let a;t.on("message",o(function(u){a||(a=To(r.requestedContentType??r.headers.asObject["content-type"],!1));let d=a(u);st(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(d)},"message"));let c;t.on("close",()=>{Lh--,zr(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=cS.getMatch(l,"ws");if(zr(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,st(p=>({count:p.count,total:Lh}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let d=new ri(u.relativeURL);d.checkPermission=r.user?.role?.permission??{};let f=u.Resource;c=(await xt(r,()=>f.connect(d,s,r)))[Symbol.asyncIterator]();let h;for(;!(h=await c.next()).done;){let p=await ba(h.value,r);t.send(p),st(p.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(_=>t._socket.once("drain",_))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?fi.warn(l):fi.info(l):fi.error(l),t.close(Vae[l.statusCode]||1011,rq(l))}t.close()},e))}function cw(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,a]=s.trim().split("=");i=i.trim(),a&&(a=a.trim()),r={name:i.toLowerCase(),value:a,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var fi,hd,rq,jr,Gae,aw,ZG,eq,cS,tq,Lh,Vae,nq=ue(()=>{Ro();Wi();fi=w(Q()),hd=w(ge());N_();Tu();xc();uh();QG();Ph();O_();({errorToString:rq}=fi),jr=new Uint8Array(8),Gae=new Float64Array(jr.buffer,0,1),aw={},ZG="openapi";o(qae,"http");Lh=0;o($ae,"start");Vae={401:3e3,403:3003};o(cw,"parseHeaderValue")});var lw=M((eMe,iq)=>{var{recordAction:uS,recordActionBinary:sq}=(Wi(),v(wg)),Kae=require("fastify-plugin"),Yae=200;iq.exports=Kae(function(e,t,r){e.addHook("onResponse",async(n,s)=>{let i=s.elapsedTime}),e.addHook("onSend",async(n,s,i)=>{let a=s.elapsedTime,c=performance.now(),l=s.request.routeOptions,u,d,f;l.config?.isOperation?(u=n.body?.operation,d="operation"):(u=l.url,d="fastify-route",f=l.method),uS(a,"duration",u,f,d),sq(s.raw.statusCode<400,"success",u,f,d),sq(1,"response_"+s.raw.statusCode,u,f,d);let m=Yae;i?.pipe?(i.on("data",g=>{m+=g.length}),i.on("end",()=>{uS(performance.now()-c,"transfer",u,f,d),uS(m,"bytes-sent",u,f,d)})):(m+=i?.length||0,uS(m,"bytes-sent",u,f,d));let h=a.toFixed(3),p=s.getHeader("Server-Timing"),_=`db;dur=${h}`;s.header("Server-Timing",p?`${p}, ${_}`:_)}),r()},{name:"hdb-request-time"})});var aq=M((tMe,oq)=>{var Wae=lt(),zae={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};oq.exports=function(e){return Wae.validateObject(e,zae)}});var dS=M((rMe,cq)=>{"use strict";var jae=(k(),v(W)).OPERATIONS_ENUM,uw=class{static{o(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=jae.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};cq.exports=uw});var vh={};Oe(vh,{createTokens:()=>mw,getJWTRSAKeys:()=>ES,refreshOperationToken:()=>hw,validateOperationToken:()=>pw,validateRefreshToken:()=>_S});async function ES(){if(fS)return fS;try{let e=Dh.default.join(Mh.default.getHdbBasePath(),zy),t=await mS.default.readFile(Dh.default.join(e,Yf.JWT_PASSPHRASE_NAME),"utf8"),r=await mS.default.readFile(Dh.default.join(e,Yf.JWT_PRIVATE_KEY_NAME),"utf8");return fS={publicKey:await mS.default.readFile(Dh.default.join(e,Yf.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},fS}catch(e){throw pS.default.error(e),new mi.ClientError(Ed.NO_ENCRYPTION_KEYS,pd.INTERNAL_SERVER_ERROR)}}async function mw(e){let t=(0,dw.validateBySchema)(e,Xi.default.object({username:Xi.default.string().optional(),password:Xi.default.string().optional(),role:Xi.default.string().optional(),expires_in:Xi.default.alternatives(Xi.default.string(),Xi.default.number()).optional()}));if(t)throw new mi.ClientError(t.message);let r;try{let f=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,f=!1),r=await(0,fw.findAndValidateUser)(e.username,e.password,f)}catch(f){throw pS.default.error(f),new mi.ClientError(Ed.INVALID_CREDENTIALS,pd.UNAUTHORIZED)}if(!r)throw new mi.ClientError(Ed.INVALID_CREDENTIALS,pd.UNAUTHORIZED);let n=!1,s=!1;r.role?.permission&&(n=r.role.permission.super_user===!0,s=r.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s};e.role&&(i.role=e.role);let a=await ES(),c=await _d.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:e.expires_in??mq,algorithm:hS,subject:gd.OPERATION}),l=await _d.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:Qae,algorithm:hS,subject:gd.REFRESH}),u=FI(l,Br.SHA256);if((await(0,lq.update)(new uq.default(Kf,_u.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new mi.ClientError(Ed.REFRESH_TOKEN_SAVE_FAILED,pd.INTERNAL_SERVER_ERROR);return dq.default.signalUserChange(new fq.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function hw(e){let t=(0,dw.validateBySchema)(e,Xi.default.object({refresh_token:Xi.default.string().required()}).required());if(t)throw new mi.ClientError(t.message);let{refresh_token:r}=e;await _S(r);let n=await ES(),s=await _d.default.decode(r);return{operation_token:await _d.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:mq,algorithm:hS,subject:gd.OPERATION})}}async function pw(e){return hq(e,gd.OPERATION)}async function _S(e){return hq(e,gd.REFRESH)}async function hq(e,t){try{let r=await ES(),n=await _d.default.verify(e,r.publicKey,{algorithms:hS,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,fw.findAndValidateUser)(n.username,void 0,!1);if(t===gd.REFRESH&&!HI(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw pS.default.warn(r),r?.name==="TokenExpiredError"?new mi.ClientError(Ed.TOKEN_EXPIRED,pd.FORBIDDEN):new mi.ClientError(Ed.INVALID_TOKEN,pd.UNAUTHORIZED)}}var _d,mS,Dh,Xi,dw,mi,pS,fw,lq,uq,dq,fq,Mh,pd,Ed,mq,Qae,hS,gd,fS,Sd=ue(()=>{_d=w(require("jsonwebtoken")),mS=w(require("fs-extra")),Dh=w(require("node:path")),Xi=w(require("joi")),dw=w(lt());k();mi=w(ge()),pS=w(Q());mg();fw=w(ts()),lq=w(Mn()),uq=w(dS()),dq=w(Co()),fq=w(oi()),Mh=w(oe()),{HTTP_STATUS_CODES:pd,AUTHENTICATION_ERROR_MSGS:Ed}=mi.hdbErrors;Mh.default.initSync();mq=Mh.default.get(U.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",Qae=Mh.default.get(U.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",hS="RS256",gd={OPERATION:"operation",REFRESH:"refresh"};o(ES,"getJWTRSAKeys");o(mw,"createTokens");o(hw,"refreshOperationToken");o(pw,"validateOperationToken");o(_S,"validateRefreshToken");o(hq,"validateToken")});var Ew=M((aMe,_q)=>{"use strict";var Jae=aq(),Td=require("passport"),Xae=require("passport-local").Strategy,Zae=require("passport-http").BasicStrategy,ece=require("util"),tce=ts(),Eq=ece.callbackify(tce.findAndValidateUser),oMe=rn(),rce=(k(),v(W)),pq=(Sd(),v(vh));Td.use(new Xae(function(e,t,r){Eq(e,t,r)}));Td.use(new Zae(function(e,t,r){Eq(e,t,r)}));Td.serializeUser(function(e,t){t(null,e)});Td.deserializeUser(function(e,t){t(null,e)});function nce(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let a=e.headers.authorization.split(" ");n=a[0],s=a[1]}function i(a,c){return a?r(a):c?r(null,c):r("Must login")}switch(o(i,"handleResponse"),n){case"Basic":Td.authenticate("basic",{session:!1},(a,c)=>{i(a,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===rce.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?pq.validateRefreshToken(s).then(a=>{e.body.refresh_token=s,r(null,a)}).catch(a=>{r(a)}):pq.validateOperationToken(s).then(a=>{r(null,a)}).catch(a=>{r(a)});break;default:Td.authenticate("local",{session:!1},function(a,c){i(a,c)})(e,t,r);break}}o(nce,"authorize");function sce(e,t){let r=Jae(e);if(r){t(r);return}let n={authorized:!0,messages:[]},s=e.user.role;if(!s?.permission)return t("Invalid role");let i=JSON.parse(s.permission);if(i.super_user)return t(null,n);if(!i[e.schema])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.schema} schema`),t(null,n);if(!i[e.schema].tables[e.table])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.table} table`),t(null,n);if(!i[e.schema].tables[e.table][e.operation])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.operation} on ${e.table} table`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&!e.attributes)return n.authorized=!1,n.messages.push(`${e.schema}.${e.table} has attribute permissions. Missing attributes to validate`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&e.attributes){let a=i[e.schema].tables[e.table].attribute_permissions;for(let c in a)e.attributes.indexOf(a[c].attribute_name)>-1&&!a[c][e.operation]&&(n.authorized=!1,n.messages.push(`Not authorized to ${e.operation} ${a[c].attribute_name} `))}return t(null,n)}o(sce,"checkPermissions");_q.exports={authorize:nce,checkPermissions:sce}});var gS=M((lMe,gq)=>{"use strict";var ice=Jn();gq.exports={writeTransaction:oce};function oce(e,t,r){return ice.writeTransaction(e,t,r)}o(oce,"writeTransaction")});var yq=M((fMe,Rq)=>{"use strict";var ace=on(),cce=ii(),Sq=Q(),lce=Mn(),dMe=gS(),uce=require("clone"),gw=require("alasql"),dce=rg(),Tq=require("util"),fce=Tq.promisify(cce.getTableSchema),mce=Tq.promisify(ace.search),hce=(k(),v(W)),_w=ie();dce(gw);Rq.exports={update:Ece};var pce="There was a problem performing this update. Please check the logs and try again.";async function Ece({statement:e,hdb_user:t}){let r=await fce(e.table.databaseid,e.table.tableid),n=_ce(e.columns);_w.backtickASTSchemaItems(e);let{table:s,where:i}=e,a=uce(s),c=_w.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=gw.parse(l).statements[0],d=await mce(u),f=gce(n,d);return Sce(a,f,t)}o(Ece,"update");function _ce(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=gw.compile(`SELECT ${r.expression.toString()} AS [${hce.FUNC_VAL}] FROM ?`)}),t}catch(t){throw Sq.error(t),new Error(pce)}}o(_ce,"createUpdateRecord");function gce(e,t){return _w.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}o(gce,"buildUpdateRecords");async function Sce(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await lce.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){Sq.error(`Error delete new_attributes from update response: ${i}`)}return s}o(Sce,"updateRecords")});var bq=M((EMe,Aq)=>{var Tce=require("alasql"),Rce=on(),yce=Q(),Ace=Jn(),Tw=require("util"),Sw=ie(),bce=(k(),v(W)),Ice=ii(),hMe=gS(),pMe=Mn(),Nce="record",wce="successfully deleted",Oce=Tw.callbackify(Dce),Cce=Tw.promisify(Rce.search),Pce=Tw.promisify(Ice.getTableSchema);Aq.exports={convertDelete:Oce};function Lce(e){return`${e.deleted_hashes.length} ${Nce}${e.deleted_hashes.length===1?"":"s"} ${wce}`}o(Lce,"generateReturnMessage");async function Dce({statement:e,hdb_user:t}){let r=await Pce(e.table.databaseid,e.table.tableid);Sw.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=Sw.isEmpty(s)?"":` WHERE ${s.toString()}`,a=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=Tce.parse(a).statements[0],l={operation:bce.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await Cce(c);let u=await Ace.deleteRecords(l);return Sw.isEmptyOrZeroLength(u.message)&&(u.message=Lce(u)),delete u.txn_time,u}catch(u){throw yce.error(u),u.hdb_code?u.message:u}}o(Dce,"convertDelete")});var Cq=M((gMe,Oq)=>{"use strict";var Mce=Ua(),{hdbErrors:Iq}=ge(),{getDatabases:Nq}=(De(),v(mt));Oq.exports={checkSchemaExists:wq,checkSchemaTableExists:vce,schemaDescribe:Mce};async function wq(e){if(!Nq()[e])return Iq.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}o(wq,"checkSchemaExists");async function vce(e,t){let r=await wq(e);if(r)return r;if(!Nq()[e][t])return Iq.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}o(vce,"checkSchemaTableExists")});var Iw=M((AMe,Gq)=>{"use strict";var{decode:Uce}=require("msgpackr"),{isMainThread:TMe,parentPort:RMe,threadId:yMe}=require("worker_threads"),RS=mr(),Rd=It(),Aw=(k(),v(W)),fn=Q(),yw=oe(),xce=(k(),v(W)),{onMessageByType:Bce}=rt(),Mq=$i(),{recordAction:Pq,recordActionBinary:Fce}=(Wi(),v(wg)),{publishToStream:Hce}=RS,{ConsumerEvents:Lq}=require("nats"),kce=on(),{promisify:Gce}=require("util"),{decodeBlobsWithWrites:qce}=(Kn(),v(o_)),vq=Gce(setTimeout),yS=1e4,AS,TS,$ce,Vce,Uq,Uh=new Map,yd=new Map;Gq.exports={initialize:xq,ingestConsumer:bw,setSubscription:Kce,setIgnoreOrigin:zce,getDatabaseSubscriptions:Wce,updateConsumer:Bq};async function xq(){Bce(Aw.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,async n=>{await Bq(n)}),Uq=!0,fn.notify("Initializing clustering ingest service.");let{connection:e,jsm:t,js:r}=await RS.getNATSReferences();AS=e,TS=e.info.server_name,$ce=t,Vce=r}o(xq,"initialize");async function Bq(e){if(e.status==="start"){let{js:t,jsm:r}=await Fq(e.node_domain_name);bw(e.stream_name,t,r,e.node_domain_name)}else if(e.status==="stop"){let t=Uh.get(e.stream_name+e.node_domain_name);t&&(fn.notify("Closing ingest consumer for node:",e.node_domain_name,"stream:",e.stream_name),await t.close?.(),Uh.set(e.stream_name+e.node_domain_name,"close")),yd.get(e.node_domain_name)==="failed"&&yd.set(e.node_domain_name,"close")}}o(Bq,"updateConsumer");var bS=new Map;function Kce(e,t,r){let n=bS.get(e);n||bS.set(e,n=new Map),n.set(t,r),Uq||xq().then(Yce)}o(Kce,"setSubscription");async function Yce(){let e=await kce.searchByValue({database:"system",table:"hdb_nodes",search_attribute:"name",search_value:"*"});for await(let t of e){let r=t.name+Rd.SERVER_SUFFIX.LEAF,n,s;for(let i of t.subscriptions||[])if(i.subscribe===!0){if(!n&&({js:n,jsm:s}=await Fq(r),!n))break;let{schema:a,table:c}=i,l=Mq.createNatsTableStreamName(a,c);bw(l,n,s,r)}}}o(Yce,"accessConsumers");async function Fq(e){let t,r,n=1;for(;!r;)try{t=await AS.jetstream({domain:e}),r=await AS.jetstreamManager({domain:e,checkAPI:!1})}catch(s){if(yd.get(e)==="close")break;yd.set(e,"failed"),n%10===1&&fn.warn("Nats ingest attempting to connect to:",e,"Nats error:",s.message);let i=n++*100<yS?n++*100:yS;await vq(i)}return{js:t,jsm:r}}o(Fq,"connectToRemoteJS");function Wce(){return bS}o(Wce,"getDatabaseSubscriptions");var Hq;function zce(e){Hq=e}o(zce,"setIgnoreOrigin");var kq=100,Dq=new Array(kq),SS=0;async function bw(e,t,r,n){let{connection:s}=await RS.getNATSReferences();AS=s,TS=s.info.server_name;let i,a=1;for(;!i;)try{i=await t.consumers.get(e,TS),fn.notify("Initializing ingest consumer for node:",n,"stream:",e)}catch(u){if(yd.get(n)==="close")break;a%10===1&&fn.warn("Nats ingest error getting consumer:",n,"stream:",e,"Nats error:",u.message),u.code==="404"&&(fn.notify("Nats ingest creating consumer for node:",n,"stream:",e),i=await RS.createConsumer(r,e,TS,new Date(Date.now()).toISOString()));let d=a++*100<yS?a++*100:yS;await vq(d)}let c=!1,l;for(;!c;){if(Uh.get(e+n)==="close"||yd.get(n)==="close"){Uh.delete(e+n),c=!0;continue}l=await i.consume({max_messages:yw.get(Aw.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXCONSUMEMSGS)??100,bind:!0}),Uh.set(e+n,l);let u=!1;(async()=>{for await(let d of await l.status())if(d.type===Lq.ConsumerDeleted&&(await l.close(),c=!0),d.type===Lq.HeartbeatsMissed){let f=d.data;fn.trace(`${f} clustering ingest consumer heartbeats missed, node: ${n} stream: ${l.consumer.stream}`),f===100&&(fn.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 d of l)await Dq[SS],Dq[SS]=jce(d).catch(f=>{fn.error(f)}),++SS>=kq&&(SS=0)}catch(d){d.message==="consumer deleted"?(fn.notify("Nats consumer deleted, closing messages for node:",n,"stream:",l.consumer.stream),await l.close(),c=!0):fn.error("Error consuming clustering ingest, restarting consumer",d)}}}o(bw,"ingestConsumer");async function jce(e){let t;await qce(()=>{t=Uce(e.data)}),Pq(e.data.length,"bytes-received",e.subject,t.operation,"ingest"),fn.trace("Nats message processor message size:",e?.msg?._msg?.size,"bytes");let r=e.headers,n=!1,s=yw.get(Aw.CONFIG_PARAMS.CLUSTERING_NODENAME);r.has(Rd.MSG_HEADERS.TRANSACTED_NODES)&&r.values(Rd.MSG_HEADERS.TRANSACTED_NODES).indexOf(s)>-1&&(n=!0);let i=r.get(Rd.MSG_HEADERS.ORIGIN);if(n||(n=i===s&&!Hq),Fce(n,"echo",e.subject,t.operation,"ingest"),n){e.ack();return}r.append(Rd.MSG_HEADERS.TRANSACTED_NODES,s);try{let{operation:a,schema:c,next:l,table:u,records:d,hash_values:f,__origin:m,expiresAt:h}=t;fn.trace("processing message:",a,c,u,(d?"records: "+d.map(O=>O?.id):"")+(f?"ids: "+f:""),"with sequence:",e.seq),fn.trace(`messageProcessor nats msg id: ${e.headers.get(Rd.MSG_HEADERS.NATS_MSG_ID)}`);let p;d||(d=f);let _=new Promise(O=>p=O),{timestamp:g,user:y,node_name:T}=m||{},R=bS.get(c)?.get(u);if(!R)throw new Error(`Missing table for replication message: ${u}`);if(a==="define_schema")t.type=a,t.onCommit=p,R.send(t);else if(d.length===1&&!l)R.send({type:Rw(a),value:d[0],id:f?.[0],expiresAt:h,timestamp:g,table:u,onCommit:p,user:y,nodeName:T});else{let O=d.map((F,Z)=>({type:Rw(a),value:F,expiresAt:h,id:f?.[Z],table:u}));for(;l;)O.push({type:Rw(l.operation),value:l.record,expiresAt:l.expiresAt,id:l.id,table:l.table}),l=l.next;R.send({type:"transaction",writes:O,table:u,timestamp:g,onCommit:p,user:y,nodeName:T})}yw.get(xce.CONFIG_PARAMS.CLUSTERING_REPUBLISHMESSAGES)!==!1&&Hce(e.subject.split(".").slice(0,-1).join("."),Mq.createNatsTableStreamName(c,u),e.headers,e.data),await _;let N=Date.now()-g;g&&Pq(N,"replication-latency",e.subject,a,"ingest")}catch(a){fn.error(a)}e.ack()}o(jce,"messageProcessor");function Rw(e){switch(e){case"insert":case"upsert":case"update":return"put"}return e}o(Rw,"convertOperation")});var mr=M((PMe,s$)=>{"use strict";var Gr=oe();Gr.initSync();var Qce=require("fs-extra"),Jce=require("semver"),Fh=require("path"),{monotonicFactory:Xce}=require("ulidx"),$q=Xce(),Zce=require("util"),Vq=require("child_process"),ele=Zce.promisify(Vq.exec),tle=Vq.spawn,Qr=It(),Qe=(k(),v(W)),{packageJson:rle,PACKAGE_ROOT:nle}=Rt(),IS=ie(),hi=Q(),NS=$i(),sle=gS(),xh=bt(),{broadcast:ile,onMessageByType:ole,getWorkerIndex:ale}=rt(),{isMainThread:Kq}=require("worker_threads"),{Encoder:cle,decode:Cw}=require("msgpackr"),Yq=new cle,{isEmpty:Pl}=IS,Wq=ts(),IMe=48*36e11;Kq&&ole(Qe.ITC_EVENT_TYPES.RESTART,()=>{mn=void 0,Cl=void 0});var{connect:lle,StorageType:ule,RetentionPolicy:dle,AckPolicy:Pw,DeliverPolicy:Lw,DiscardPolicy:fle,NatsConnection:NMe,JetStreamManager:wMe,JetStreamClient:OMe,StringCodec:CMe,JSONCodec:mle,createInbox:Dw,headers:hle,ErrorCode:qq}=require("nats"),{recordAction:ple}=(Wi(),v(wg)),{encodeBlobsAsBuffers:Ele}=(Kn(),v(o_)),zq=mle(),_le="clustering",gle=rle.engines[Qr.NATS_SERVER_NAME],Sle=Fh.join(nle,"dependencies"),Ow=Fh.join(Sle,`${process.platform}-${process.arch}`,Qr.NATS_BINARY_NAME),Nw,ww,Bh,wl,Ol;s$.exports={runCommand:jq,checkNATSServerInstalled:Tle,createConnection:Mw,getConnection:Hh,getJetStreamManager:kh,getJetStream:Jq,getNATSReferences:Zi,getServerList:yle,createLocalStream:vw,listStreams:Xq,deleteLocalStream:Ale,getServerConfig:Ad,listRemoteStreams:ble,viewStream:Ile,viewStreamIterator:Nle,publishToStream:wle,request:Ple,reloadNATS:Uw,reloadNATSHub:Lle,reloadNATSLeaf:Dle,extractServerName:Cle,requestErrorHandler:Mle,createLocalTableStream:r$,createTableStreams:xle,purgeTableStream:n$,purgeSchemaTableStreams:Ble,getStreamInfo:Fle,updateLocalStreams:kle,closeConnection:Rle,getJsmServerName:wS,addNatsMsgHeader:Zq,clearClientCache:Qq,updateRemoteConsumer:vle,createConsumer:e$,updateConsumerIterator:Ule};async function jq(e,t=void 0){let{stdout:r,stderr:n}=await ele(e,{cwd:t});if(n)throw new Error(n.replace(`
|
|
21
21
|
`,""));return r.replace(`
|
|
22
22
|
`,"")}o(jq,"runCommand");async function Tle(){try{await Qce.access(Ow)}catch{return!1}let e=await jq(`${Ow} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return Jce.eq(t,gle)}o(Tle,"checkNATSServerInstalled");async function Mw(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let a=await Wq.getClusterUser();if(Pl(a))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=a.username,r=a.decrypt_hash}hi.trace("create nats connection called");let i=await lle({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),hi.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(a=>{a&&hi.error("Error with Nats client connection, connection closed",a),i===mn&&Qq()}),i}o(Mw,"createConnection");function Qq(){mn=void 0,wl=void 0,Ol=void 0,Cl=void 0}o(Qq,"clearClientCache");async function Rle(){mn&&(await mn.drain(),mn=void 0,wl=void 0,Ol=void 0,Cl=void 0)}o(Rle,"closeConnection");var mn,Cl;async function Hh(){return Cl||(Cl=Mw(Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),mn=await Cl),mn||Cl}o(Hh,"getConnection");async function kh(){if(wl)return wl;Pl(mn)&&await Hh();let{domain:e}=Ad(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Pl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return wl=await mn.jetstreamManager({domain:e,timeout:6e4}),wl}o(kh,"getJetStreamManager");async function Jq(){if(Ol)return Ol;Pl(mn)&&await Hh();let{domain:e}=Ad(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Pl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Ol=mn.jetstream({domain:e,timeout:6e4}),Ol}o(Jq,"getJetStream");async function Zi(){let e=mn||await Hh(),t=wl||await kh(),r=Ol||await Jq();return{connection:e,jsm:t,js:r}}o(Zi,"getNATSReferences");async function yle(e){let t=Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await Wq.getClusterUser(),s=await Mw(t,r,n),i=Dw(),a=s.subscribe(i),c=[],l,u=(async()=>{for await(let d of a){let f=zq.decode(d.data);f.response_time=Date.now()-l,c.push(f)}})();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 IS.asyncSetTimeout(e),await a.drain(),await s.close(),await u,c}o(yle,"getServerList");async function vw(e,t){let{jsm:r}=await Zi(),n=Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:ule.File,retention:dle.Limits,subjects:t,discard:fle.Old,maxMsgs:s,maxBytes:i,maxAge:n})}o(vw,"createLocalStream");async function Xq(){let{jsm:e}=await Zi(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}o(Xq,"listStreams");async function Ale(e){let{jsm:t}=await Zi();await t.streams.delete(e)}o(Ale,"deleteLocalStream");async function ble(e){let{connection:t}=await Zi(),r=[],n=Dw(),s=t.subscribe(n),i=(async()=>{for await(let a of s)r.push(zq.decode(a.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}o(ble,"listRemoteStreams");async function Ile(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Zi(),i=$q(),a={durable_name:i,ack_policy:Pw.Explicit};t&&(a.deliver_policy=Lw.StartTime,a.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,a);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 d of l){let f=Cw(d.data),m={nats_timestamp:d.info.timestampNanos,nats_sequence:d.info.streamSequence,entry:f};if(d.headers&&(m.origin=d.headers.get(Qr.MSG_HEADERS.ORIGIN)),u.push(m),d.ack(),d.info.pending===0)break}return await c.delete(),u}o(Ile,"viewStream");async function*Nle(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Zi(),i=$q(),a={durable_name:i,ack_policy:Pw.Explicit};t&&(a.deliver_policy=Lw.StartTime,a.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,a);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 d=Cw(u.data);d[0]||(d=[d]);for(let f of d){let m={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:f};u.headers&&(m.origin=u.headers.get(Qr.MSG_HEADERS.ORIGIN)),yield m}if(u.ack(),u.info.pending===0)break}await c.delete()}o(Nle,"viewStreamIterator");async function wle(e,t,r,n){hi.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=Zq(n,r);let{js:s}=await Zi(),i=await wS(),a=`${e}.${i}`,c=await Ele(()=>n instanceof Uint8Array?n:Yq.encode(n));try{hi.trace(`publishToStream publishing to subject: ${a}`),ple(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(a,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return t$(async()=>{try{await s.publish(a,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){hi.trace(`publishToStream creating stream: ${t}`);let d=a.split(".");d[2]="*",await vw(t,[a]),await s.publish(a,c,{headers:r})}else throw l}});throw l}}o(wle,"publishToStream");function Zq(e,t){t===void 0&&(t=hle());let r=Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(Qr.MSG_HEADERS.ORIGIN)&&r&&t.append(Qr.MSG_HEADERS.ORIGIN,r),t}o(Zq,"addNatsMsgHeader");function Ad(e){e=e.toLowerCase();let t=Fh.join(Gr.get(Qe.CONFIG_PARAMS.ROOTPATH),_le);if(e===Qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return Pl(ww)&&(ww={port:xh.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:xh.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Qr.SERVER_SUFFIX.HUB,config_file:Qr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:Fh.join(t,Qr.PID_FILES.HUB),hdbNatsPath:t}),ww;if(e===Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return Pl(Nw)&&(Nw={port:xh.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:xh.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Qr.SERVER_SUFFIX.LEAF,config_file:Qr.NATS_CONFIG_FILES.LEAF_SERVER,domain:xh.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Qr.SERVER_SUFFIX.LEAF,pid_file_path:Fh.join(t,Qr.PID_FILES.LEAF),hdbNatsPath:t}),Nw;hi.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}o(Ad,"getServerConfig");async function e$(e,t,r,n){try{await e.consumers.add(t,{ack_policy:Pw.Explicit,durable_name:r,deliver_policy:Lw.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}o(e$,"createConsumer");async function Ole(e,t,r){await e.consumers.delete(t,r)}o(Ole,"removeConsumer");function Cle(e){return e.split(".")[1]}o(Cle,"extractServerName");async function Ple(e,t,r=6e4,n=Dw()){if(!IS.isObject(t))throw new Error("data param must be an object");let s=Yq.encode(t),{connection:i}=await Zi(),a={timeout:r};n&&(a.reply=n,a.noMux=!0);let c=await i.request(e,s,a);return Cw(c.data)}o(Ple,"request");function Uw(e){return new Promise(async(t,r)=>{let n=tle(Ow,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",a=>{r(a)}),n.stdout.on("data",a=>{i+=a.toString()}),n.stderr.on("data",a=>{s+=a.toString()}),n.stderr.on("close",a=>{s&&r(s),t(i)})})}o(Uw,"reloadNATS");async function Lle(){let{pid_file_path:e}=Ad(Qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await Uw(e)}o(Lle,"reloadNATSHub");async function Dle(){let{pid_file_path:e}=Ad(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await Uw(e)}o(Dle,"reloadNATSLeaf");function Mle(e,t,r){let n;switch(e.code){case qq.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case qq.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}o(Mle,"requestErrorHandler");async function vle(e,t){let r=t+Qr.SERVER_SUFFIX.LEAF,{connection:n}=await Zi(),{jsm:s}=await qle(r),{schema:i,table:a}=e,c=NS.createNatsTableStreamName(i,a),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await t$(async()=>{if(e.subscribe===!0)await e$(s,c,n.info.server_name,l);else try{await Ole(s,c,n.info.server_name)}catch(u){hi.trace(u)}})}o(vle,"updateRemoteConsumer");async function Ule(e,t,r,n){let s=NS.createNatsTableStreamName(e,t),i=r+Qr.SERVER_SUFFIX.LEAF,a={type:Qe.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!Kq&&ale()<Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=Iw();await c(a)}await ile(a),n==="stop"&&await IS.asyncSetTimeout(1e3)}o(Ule,"updateConsumerIterator");function t$(e){return sle.writeTransaction(Qe.SYSTEM_SCHEMA_NAME,Qe.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}o(t$,"exclusiveLock");async function r$(e,t){let r=NS.createNatsTableStreamName(e,t),n=await wS(),s=Hle(e,t,n);await vw(r,[s])}o(r$,"createLocalTableStream");async function xle(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await r$(n,s)}}o(xle,"createTableStreams");async function n$(e,t,r=void 0){if(Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=NS.createNatsTableStreamName(e,t),{domain:s}=Ad(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await Hh()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")hi.warn(n);else throw n}}o(n$,"purgeTableStream");async function Ble(e,t){if(Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await n$(e,t[r])}o(Ble,"purgeSchemaTableStreams");async function Fle(e){return(await kh()).streams.info(e)}o(Fle,"getStreamInfo");function Hle(e,t,r){return`${Qr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}o(Hle,"createSubjectName");async function wS(){if(Bh)return Bh;if(Bh=(await kh())?.nc?.info?.server_name,Bh===void 0)throw new Error("Unable to get jetstream manager server name");return Bh}o(wS,"getJsmServerName");async function kle(){let e=await kh(),t=await wS(),r=await Xq();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let a=Gle(n),c=i.split(".");if(c[c.length-1]===t&&!a||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let d=u.join(".");hi.trace(`Updating stream subject name from: ${i} to: ${d}`),s.subjects[0]=d,await e.streams.update(s.name,s)}}o(kle,"updateLocalStreams");function Gle(e){let{config:t}=e,r=!1,n=Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Gr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=Gr.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}o(Gle,"updateStreamLimits");async function qle(e){let t,r;try{t=await mn.jetstream({domain:e}),r=await mn.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw hi.error("Unable to connect to:",e),n}return{js:t,jsm:r}}o(qle,"connectToRemoteJS")});function xw(e){let t=e.get(OS),r=t?(0,bd.unpack)(t):null;r||(r={remoteNameToId:{}});let n=Ze(),s=!1;r.nodeName=Ze();let i=r.remoteNameToId;if(i[n]!==0){let a=0,c;for(let l in i){let u=i[l];u===0?c=l:u>a&&(a=u)}if(c){a++,i[c]=a;let l=[Symbol.for("seq"),a];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:qh(e)??1,nodes:[]})})}i[n]=0,e.putSync(OS,(0,bd.pack)(r))}return r}function Gh(e){return xw(e).remoteNameToId}function o$(e,t){let r=xw(t),n=r.remoteNameToId,s=new Map,i=!1;for(let a in e){let c=e[a],l=n[a];if(l==null){let u=0;for(let d in n){let f=n[d];f>u&&(u=f)}l=u+1,n[a]=l,i=!0}s.set(c,l)}return i&&t.putSync(OS,(0,bd.pack)(r)),s}function CS(e,t){let r=xw(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let a in n){let c=n[a];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(OS,(0,bd.pack)(r))}return i$.trace?.("The remote node name map",e,n,s),s}var i$,bd,OS,Bw=ue(()=>{i$=w(ei());is();bd=require("msgpackr"),OS=Symbol.for("remote-ids");o(xw,"getIdMappingRecord");o(Gh,"exportIdMapping");o(o$,"remoteToLocalNodeId");o(CS,"getIdOfRemoteNode")});var Fw={};Oe(Fw,{commitsAwaitingReplication:()=>Id,getHDBNodeTable:()=>Kt,getReplicationSharedStatus:()=>Nd,iterateRoutes:()=>Vh,shouldReplicateToNode:()=>$h,subscribeToNodeUpdates:()=>wd});function Kt(){return a$||(a$=ze({table:"hdb_nodes",database:"system",attributes:[{name:"name",isPrimaryKey:!0},{attribute:"subscriptions"},{attribute:"system_info"},{attribute:"url"},{attribute:"routes"},{attribute:"ca"},{attribute:"ca_info"},{attribute:"replicates"},{attribute:"revoked_certificates"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]}))}function Nd(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function wd(e){Kt().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;d$.debug?.("adding node",n,"on node",Ze()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==Ze()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of Kt().search({}))if(i.shard!=null){let a=s.get(i.shard);a||s.set(i.shard,a=[]),a.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function $h(e,t){let r=Wa.default.get(U.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===Wa.default.get(U.REPLICATION_SHARD))))&&Kt().primaryStore.get(Ze())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function $le(){wd(e=>{za({},(t,r)=>{let n=e.name,s=c$.get(n);if(s||c$.set(n,s=new Map),s.has(r))return;let i;for(let a in t)if(i=t[a].auditStore,i)break;if(i){let a=Nd(i,r,n,()=>{let c=a[0],l=a.lastTime;for(let{txnTime:u,onConfirm:d}of Id.get(r)||[])u>l&&u<=c&&d();a.lastTime=c});a.lastTime=0,s.set(r,a)}})})}function*Vh(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=Wa.default.get(U.REPLICATION_SECUREPORT)??(!Wa.default.get(U.REPLICATION_PORT)&&Wa.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||Wa.default.get(U.REPLICATION_PORT)||Wa.default.get(U.OPERATIONSAPI_NETWORK_PORT);let a=i?.lastIndexOf?.(":");a>0&&(i=+i.slice(a+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){l$.isMainThread&&console.error("Invalid route, must specify a url or host (with port)");continue}yield{replicates:!t.subscriptions,url:r,subscription:t.subscriptions,routes:t.routes,startTime:t.startTime,revoked_certificates:t.revokedCertificates}}}var l$,u$,Wa,d$,a$,c$,Id,Ll=ue(()=>{De();is();rm();l$=require("worker_threads"),u$=w(ge()),Wa=w(oe());k();d$=w(ei());server.nodes=[];o(Kt,"getHDBNodeTable");o(Nd,"getReplicationSharedStatus");o(wd,"subscribeToNodeUpdates");o($h,"shouldReplicateToNode");c$=new Map;tv((e,t,r)=>{if(r>server.nodes.length)throw new u$.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);Id||(Id=new Map,$le());let n=Id.get(e);return n||(n=[],Id.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:o(()=>{++i===r&&s()},"onConfirm")})})});o($le,"startSubscriptionToReplications");o(Vh,"iterateRoutes")});var h$={};Oe(h$,{connectedToNode:()=>Dl,disconnectedFromNode:()=>Cd,ensureNode:()=>Ho,requestClusterStatus:()=>m$,startOnMainThread:()=>kw});async function kw(e){let t=0,r=nt();for(let i of Object.getOwnPropertyNames(r)){let a=r[i];for(let c in a){let l=a[c];if(l.auditStore){PS.set(i,qh(l.auditStore));break}}}to.whenThreadsStarted.then(async()=>{let i=[];for await(let l of r.system.hdb_nodes?.search([])||[])i.push(l);let a=Ze();function c(){let l=Kt().primaryStore.get(a);if(l!==null){let u=e.url??ja();if(l===void 0||l.url!==u||l.shard!==e.shard)return Ho(a,{name:a,url:u,shard:e.shard,replicates:!0})}}o(c,"ensureThisNode"),Kt().primaryStore.get(a)&&c();for(let l of Vh(e))try{let u=!l.subscriptions;if(u&&await c(),u&&l.replicates==null&&(l.replicates=!0),i.find(d=>d.url===l.url))continue;s(l)}catch(u){console.error(u)}wd(s)});let n;function s(i,a=i?.name){let c=Ze()&&a===Ze()||ja()&&i?.url===ja();if(c){let f=!!i?.replicates;if(n!==void 0&&n!==f)for(let m of Kt().search([]))m.replicates&&m.name!==a&&s(m,m.name);n=f}if(ot.trace("Setting up node replication for",i),!i){for(let[f,m]of eo){let h;for(let[p,{worker:_,nodes:g}]of m){let y=g[0];if(y&&y.name==a){h=!0;for(let[T,{worker:R}]of m)m.delete(T),ot.warn("Node was deleted, unsubscribing from node",a,T,f),R?.postMessage({type:"unsubscribe-from-node",node:a,database:T,url:f});break}}if(h){eo.get(f).iterator.remove(),eo.delete(f);return}}return}if(c)return;if(!i.url){ot.info(`Node ${i.name} is missing url`);return}let l=eo.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(ot.info(`Added node ${i.name} at ${i.url} for process ${Ze()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[f,m]of Od)if(i.url===m.url){Od.delete(f);break}Od.set(i.name,i)}let u=nt();if(l||(l=new Map,eo.set(i.url,l)),l.iterator=za(e,(f,m,h)=>{h?d(m,!0):d(m,!1)}),i.subscriptions)for(let f of i.subscriptions){let m=f.database||f.schema;u[m]||(ot.warn(`Database ${m} not found for node ${i.name}, making a subscription anyway`),d(m,!1))}function d(f,m){ot.trace("Setting up replication for database",f,"on node",i.name);let h=l.get(f),p,_=[{replicateByDefault:m,...i}];PS.has(f)&&Kh.default.get(U.REPLICATION_FAILOVER)&&(_.push({replicateByDefault:m,name:Ze(),startTime:PS.get(f),endTime:Date.now(),replicates:!0}),PS.delete(f));let g=$h(i,f),y=to.workers.filter(T=>T.name==="http");if(h?(p=h.worker,h.nodes=_):g&&(t=t%y.length,p=y[t++],l.set(f,{worker:p,nodes:_,url:i.url}),p?.on("exit",()=>{l.get(f)?.worker===p&&(l.delete(f),d(f,m))})),g)setTimeout(()=>{let T={type:"subscribe-to-node",database:f,nodes:_};p?p.postMessage(T):Yh(T)},Vle);else{ot.info("Node no longer should be used, unsubscribing from node",{replicates:i.replicates,databaseName:f,node:i,subscriptions:i.subscriptions,hasDatabase:!!u[f],thisReplicates:Kt().primaryStore.get(Ze())?.replicates}),Kt().primaryStore.get(Ze())?.replicates||(n=!1,ot.info("Disabling replication, this node name",Ze(),Kt().primaryStore.get(Ze()),f));let T={type:"unsubscribe-from-node",database:f,url:i.url,name:i.name};p?p.postMessage(T):DS(T)}}o(d,"onDatabase")}o(s,"onNodeUpdate"),Cd=o(function(i){try{ot.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let a=Array.from(Od.keys()),c=a.sort(),l=c.indexOf(i.name||pi(i.url));if(l===-1){ot.warn("Disconnected node not found in node map",i.name,a);return}let u=eo.get(i.url),d=u?.get(i.database);if(!d){ot.warn("Disconnected node not found in replication map",i.database,u);return}if(d.connected=!1,i.finished||!Kh.default.get(U.REPLICATION_FAILOVER))return;let f=d.nodes[0];if(!(f.replicates===!0||f.replicates?.sends||f.subscriptions?.length))return;let m=f.shard,h=(l+1)%c.length;for(;l!==h;){let p=c[h],_=Od.get(p);u=eo.get(_.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==m){h=(h+1)%c.length;continue}let{worker:y,nodes:T}=g,R=!1;for(let N of d.nodes){if(T.some(O=>O.name===N.name)){ot.info(`Disconnected node is already failing over to ${p} for ${i.database}`);continue}N.endTime<Date.now()||(T.push(N),R=!0)}if(d.nodes=[d.nodes[0]],!R){ot.info(`Disconnected node ${i.name} has no nodes to fail over to ${p}`);return}ot.info(`Failing over ${i.database} from ${i.name} to ${p}`),y?y.postMessage({type:"subscribe-to-node",database:i.database,nodes:T}):Yh({database:i.database,nodes:T});return}ot.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(a){ot.error("Error failing over node",a)}},"disconnectedFromNode"),Dl=o(function(i){let a=eo.get(i.url),c=a?.get(i.database);if(!c){ot.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,a);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){ot.warn("Newly connected node has no node subscriptions",i.database,c);return}if(!l.name){ot.debug("Connected node is not named yet",i.database,c);return}if(!Kh.default.get(U.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let d of eo.values()){let f=d.get(i.database);if(!f||f==c)continue;let{worker:m,nodes:h,connected:p}=f;if(h)if(p===!1&&h[0].shard===l.shard)u=!0,c.nodes.push(h[0]);else{let _=h.filter(g=>g&&g.name!==l.name);_.length<h.length&&(f.nodes=_,m.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,to.onMessageByType)("disconnected-from-node",Cd),(0,to.onMessageByType)("connected-to-node",Dl),(0,to.onMessageByType)("request-cluster-status",m$)}function m$(e,t){let r=[];for(let[n,s]of Od)try{let i=eo.get(s.url);ot.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let a=[];if(i){for(let[l,{worker:u,connected:d,nodes:f,latency:m}]of i)a.push({database:l,connected:d,latency:m,threadId:u?.threadId,nodes:f.filter(h=>!(h.endTime<Date.now())).map(h=>h.name)});let c=(0,Hw.cloneDeep)(s);c.database_sockets=a,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){ot.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Ho(e,t){let r=Kt();e=e??pi(t.url),t.name=e;try{if(t.ca){let s=new f$.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subjectAltName:s.subjectAltName,serialNumber:s.serialNumber,validFrom:s.validFrom,validTo:s.validTo}}}catch(s){ot.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(ot.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!Kh.default.get(U.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],a=(0,Hw.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of a)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...a,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}ot.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var to,LS,ot,Hw,Kh,f$,Vle,eo,Cd,Dl,Od,PS,Wh=ue(()=>{De();to=w(rt());is();LS=require("worker_threads");Ll();ot=w(Q()),Hw=require("lodash"),Kh=w(oe());k();f$=require("crypto"),Vle=200,eo=new Map,Od=new Map,PS=new Map;o(kw,"startOnMainThread");o(m$,"requestClusterStatus");LS.parentPort&&(Cd=o(e=>{LS.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Dl=o(e=>{LS.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,to.onMessageByType)("subscribe-to-node",e=>{Yh(e)}),(0,to.onMessageByType)("unsubscribe-from-node",e=>{DS(e)}));o(Ho,"ensureNode")});var as=M(Yt=>{"use strict";var hr=require("path"),{watch:Kle}=require("chokidar"),Bn=require("fs-extra"),Pd=require("node-forge"),T$=require("net"),{generateKeyPair:Gw,X509Certificate:ko,createPrivateKey:R$}=require("crypto"),Yle=require("util");Gw=Yle.promisify(Gw);var Ot=Pd.pki,Ei=require("joi"),{v4:y$}=require("uuid"),{validateBySchema:Kw}=lt(),{forComponent:Wle}=Q(),os=oe(),Ls=(k(),v(W)),{CONFIG_PARAMS:vl}=Ls,_i=qI(),{ClientError:Ja}=ge(),vS=require("node:tls"),{relative:A$,join:zle}=require("node:path"),{CERT_PREFERENCE_APP:WMe,CERTIFICATE_VALUES:p$}=_i,jle=Uc(),qw=bt(),{table:Qle,getDatabases:Jle,databases:MS}=(De(),v(mt)),{getJWTRSAKeys:E$}=(Sd(),v(vh)),ht=Wle("tls");Yt.generateKeys=zw;Yt.updateConfigCert=L$;Yt.createCsr=sue;Yt.signCertificate=iue;Yt.setCertTable=Ld;Yt.loadCertificates=O$;Yt.reviewSelfSignedCert=Qw;Yt.createTLSSelector=M$;Yt.listCertificates=U$;Yt.addCertificate=due;Yt.removeCertificate=mue;Yt.createNatsCerts=cue;Yt.generateCertsKeys=aue;Yt.getReplicationCert=jh;Yt.getReplicationCertAuth=nue;Yt.renewSelfSigned=lue;Yt.hostnamesFromCert=Xw;Yt.getKey=hue;Yt.getHostnamesFromCertificate=pue;Yt.getPrimaryHostName=Jw;var{urlToNodeName:b$,getThisNodeUrl:Xle,getThisNodeName:xS,clearThisNodeName:Zle}=(is(),v(Go)),{readFileSync:eue,statSync:I$}=require("node:fs"),zMe=oe(),{getTicketKeys:tue,onMessageFromWorkers:rue}=rt(),Qa=Q(),{isMainThread:N$}=require("worker_threads"),{TLSSocket:w$,createSecureContext:jMe}=require("node:tls"),Yw=3650,zh=["127.0.0.1","localhost","::1"],Ww=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];rue(async e=>{e.type===Ls.ITC_EVENT_TYPES.RESTART&&(os.initSync(!0),await Qw())});var Jr;function Za(){return Jr||(Jr=Jle().system.hdb_certificate,Jr||(Jr=Qle({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__"}]}))),Jr}o(Za,"getCertTable");async function jh(){let e=M$("operations-api"),t={secureContexts:null,setSecureContext:o(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(xS());if(!r)return;let n=new ko(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}o(jh,"getReplicationCert");async function nue(){Za();let e=(await jh()).options.cert,r=new ko(e).issuer.match(/CN=(.*)/)?.[1];return Jr.get(r)}o(nue,"getReplicationCertAuth");var _$,Xa=new Map;function O$(){if(_$)return;_$=!0;let e=[{configKey:vl.TLS},{configKey:vl.OPERATIONSAPI_TLS}];Za();let t=hr.dirname(qw.getConfigFilePath()),r;for(let{configKey:n}of e){let s=qw.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let a=i.privateKey,c=a&&A$(zle(t,"keys"),a);c&&g$(a,l=>{Xa.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&N$){let d;g$(u,f=>{if(p$.cert===f)return;let m=i.hostname??i.hostnames??i.host??i.hosts;m&&!Array.isArray(m)&&(m=[m]);let h=D$(u),p=new ko(h),_;try{_=Jw(p)}catch(R){ht.error("error extracting host name from certificate",R);return}if(_==null){ht.error("No host name found on certificate");return}if(p.checkIssued(new ko(p$.cert)))return;let g=Jr.primaryStore.get(_),y=I$(u).mtimeMs,T=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&y<=T){y<T&&ht.info(`Certificate ${_} at ${u} is older (${new Date(y)}) than the certificate in the database (${T>1?new Date(T):"only self signed certificate available"})`);return}r=Jr.put({name:_,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:m,fileTimestamp:y,details:{issuer:p.issuer.replace(/\n/g," "),subject:p.subject?.replace(/\n/g," "),subject_alt_name:p.subjectAltName,serial_number:p.serialNumber,valid_from:p.validFrom,valid_to:p.validTo}})},l?"certificate authority":"certificate")}}}}}return r}o(O$,"loadCertificates");function g$(e,t,r){let n,s=o((i,a)=>{try{let c=a.mtimeMs;c&&c!==n&&(n&&N$&&ht.warn(`Reloading ${r}:`,i),n=c,t(D$(i)))}catch(c){ht.error(`Error loading ${r}:`,i,c)}},"loadFile");Bn.existsSync(e)?s(e,I$(e)):ht.error(`${r} file not found:`,e),Kle(e,{persistent:!1}).on("change",s)}o(g$,"loadAndWatch");function $w(){let e=Xle();if(e==null){let t=zh[0];return ht.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return b$(e)}o($w,"getHost");function US(){let e=xS();if(e==null){let t=zh[0];return ht.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}o(US,"getCommonName");async function sue(){let e=await jh(),t=Ot.certificateFromPem(e.options.cert),r=Ot.privateKeyFromPem(e.options.key);ht.info("Creating CSR with cert named:",e.name);let n=Ot.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:US()},...Ww];ht.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:C$()}];return ht.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Pd.pki.certificationRequestToPem(n)}o(sue,"createCsr");function C$(){let e=zh.includes(US())?zh:[...zh,US()];return e.includes($w())||e.push($w()),[{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=>T$.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}o(C$,"certExtensions");async function iue(e){let t={},r=hr.join(os.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Za();for await(let d of Jr.search([]))if(d.is_authority&&!d.details.issuer.includes("HarperDB-Certificate-Authority")){if(Xa.has(d.private_key_name)){n=Xa.get(d.private_key_name),s=d;break}else if(d.private_key_name&&await Bn.exists(hr.join(r,d.private_key_name))){n=Bn.readFile(hr.join(r,d.private_key_name)),s=d;break}}if(!n){let d=await Vw();s=d.ca,n=d.private_key}n=Ot.privateKeyFromPem(n),t.signingCA=s.certificate;let i=Ot.certificateFromPem(s.certificate);ht.info("Signing CSR with cert named",s.name);let a=Ot.certificationRequestFromPem(e.csr);try{a.verify()}catch(d){return ht.error(d),new Error("Error verifying CSR: "+d.message)}let c=Pd.pki.createCertificate();c.serialNumber="0"+Math.random().toString().slice(2,9),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+Yw),ht.info("sign cert setting validity:",c.validity),ht.info("sign cert setting subject from CSR:",a.subject.attributes),c.setSubject(a.subject.attributes),ht.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=a.getAttribute({name:"extensionRequest"}).extensions;ht.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=a.publicKey,c.sign(n,Pd.md.sha256.create()),t.certificate=Ot.certificateToPem(c)}else ht.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}o(iue,"signCertificate");async function oue(e,t){await Ld({name:xS(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Ld({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:Ot.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}o(oue,"createCertificateTable");async function Ld(e){let t=new ko(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},Za(),await Jr.patch(e)}o(Ld,"setCertTable");async function zw(){let e=await Gw("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{publicKey:Ot.publicKeyFromPem(e.publicKey),privateKey:Ot.privateKeyFromPem(e.privateKey)}}o(zw,"generateKeys");async function jw(e,t,r){let n=Ot.createCertificate();if(!t){let a=await jh();t=Ot.certificateFromPem(a.options.cert).publicKey}n.publicKey=t,n.serialNumber="0"+Math.random().toString().slice(2,9),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+Yw);let i=[{name:"commonName",value:US()},...Ww];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(C$()),n.sign(e,Pd.md.sha256.create()),Ot.certificateToPem(n)}o(jw,"generateCertificates");async function Vw(){let e=await U$(),t;for(let r of e){if(!r.is_authority)continue;let n=await v$(r.private_key_name);if(r.private_key_name&&n&&new ko(r.certificate).checkPrivateKey(R$(n))){ht.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;ht.trace("No CA found with matching private key")}o(Vw,"getCertAuthority");async function P$(e,t,r=!0){let n=Ot.createCertificate();n.publicKey=t,n.serialNumber="0"+Math.random().toString().slice(2,9),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+Yw);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${os.get(vl.REPLICATION_HOSTNAME)??b$(os.get(vl.REPLICATION_URL))??y$().split("-")[0]}`},...Ww];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Pd.md.sha256.create());let a=hr.join(os.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),c=hr.join(a,_i.PRIVATEKEY_PEM_NAME);return r&&await Bn.writeFile(c,Ot.privateKeyToPem(e)),n}o(P$,"generateCertAuthority");async function aue(){let{privateKey:e,publicKey:t}=await zw(),r=await P$(e,t),n=await jw(e,t,r);await oue(n,r),L$()}o(aue,"generateCertsKeys");async function cue(){let e=await jw(Ot.privateKeyFromPem(_i.CERTIFICATE_VALUES.key),void 0,Ot.certificateFromPem(_i.CERTIFICATE_VALUES.cert)),t=hr.join(os.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),r=hr.join(t,_i.NATS_CERTIFICATE_PEM_NAME);await Bn.exists(r)||await Bn.writeFile(r,e);let n=hr.join(t,_i.NATS_CA_PEM_NAME);await Bn.exists(n)||await Bn.writeFile(n,_i.CERTIFICATE_VALUES.cert)}o(cue,"createNatsCerts");async function lue(){Za();for await(let e of Jr.search([{attribute:"is_self_signed",value:!0}]))await Jr.delete(e.name);await Qw()}o(lue,"renewSelfSigned");async function Qw(){Zle(),await O$(),Za();let e=await Vw();if(!e){ht.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=o(u=>{try{return{key:Ot.privateKeyFromPem(Bn.readFileSync(u)),keyPath:u}}catch(d){return ht.warn(`Failed to parse private key from ${u}:`,d.message),{key:null,keyPath:u}}},"tryToParseKey"),n=os.get(vl.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let d=r(u.privateKey);if(s=d.key,i=d.keyPath,d.key)break}}else{let u=os.get(vl.TLS_PRIVATEKEY),d=r(u);s=d.key,i=d.keyPath}let a=hr.join(os.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),c=A$(a,i);s||(ht.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{privateKey:s}=await zw(),Bn.existsSync(hr.join(a,_i.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${y$().split("-")[0]}.pem`),await Bn.writeFile(hr.join(a,c),Ot.privateKeyToPem(s)));let l=await P$(s,Ot.setRsaPublicKey(s.n,s.e),!1);await Ld({name:l.subject.getField("CN").value,uses:["https"],certificate:Ot.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await jh()){let r=xS();ht.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await Vw();let n=Ot.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await jw(Ot.privateKeyFromPem(e.private_key),s,n);await Ld({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}o(Qw,"reviewSelfSignedCert");function L$(){let e=jle(Object.keys(Ls.CONFIG_PARAM_MAP),!0),t=hr.join(os.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME),r=hr.join(t,_i.PRIVATEKEY_PEM_NAME),n=hr.join(t,_i.NATS_CERTIFICATE_PEM_NAME),s=hr.join(t,_i.NATS_CA_PEM_NAME),i=Ls.CONFIG_PARAMS,a={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(a[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(a[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,a[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,a[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),qw.updateConfigValue(void 0,void 0,a,!1,!0)}o(L$,"updateConfigCert");function D$(e){return e.startsWith("-----BEGIN")?e:eue(e,"utf8")}o(D$,"readPEM");var S$=vS.createSecureContext;vS.createSecureContext=function(e){if(!e.cert||!e.key)return S$(e);let t={...e};delete t.key,delete t.cert;let r=S$(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var uue=w$.prototype._init;w$.prototype._init=function(e,t){uue.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,a)=>{this.sni_context=a?.context||a,this.certCbDone()})}};var Ml=new Map;function M$(e,t){let r=new Map,n,s=!1;return i.initialize=a=>i.ready?i.ready:(a&&(a.secureContexts=r,a.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),Ml.clear();let d=0;if(MS===void 0){c();return}for await(let f of MS.system.hdb_certificate.search([])){let m=f.certificate,h=new ko(m);f.is_authority&&(h.asString=m,Ml.set(h.subject,m))}for await(let f of MS.system.hdb_certificate.search([]))try{if(f.is_authority)continue;let m=e==="operations-api",h=f.is_self_signed?1:2;m&&f.uses?.includes?.("operations")&&(h+=1);let p=await v$(f.private_key_name),_=f.certificate,g=new ko(_);if(Ml.has(g.issuer)&&(_+=`
|
|
23
|
-
`+Ml.get(g.issuer)),!p||!_)throw new Error("Missing private key or certificate for secure server");let y={ciphers:f.ciphers,ticketKeys:tue(),availableCAs:Ml,ca:t&&Array.from(Ml.values()),cert:_,key:p,key_file:f.private_key_name,is_self_signed:f.is_self_signed};a&&(y.sessionIdContext=a.sessionIdContext);let T=vS.createSecureContext(y);T.name=f.name,T.options=y,T.quality=h,T.certificateAuthorities=Array.from(Ml),T.certStart=_.toString().slice(0,100);let R=f.hostnames??Xw(g);Array.isArray(R)||(R=[R]);let N;for(let O of R)if(O){O[0]==="*"&&(s=!0,O=O.slice(1)),O===$w()&&(h+=2),T$.isIP(O)&&(N=!0);let F=r.get(O)?.quality??0;h>F&&r.set(O,T)}else Qa.error("No hostname found for certificate at",vS.certificate);Qa.trace("Adding TLS",T.name,"for",a.ports||"client","cert named",f.name,"hostnames",R,"quality",h,"best quality",d),h>d&&(i.defaultContext=n=T,d=h,a&&(a.defaultContext=T))}catch(m){Qa.error("Error applying TLS for",f.name,m)}a?.secureContextsListeners.forEach(f=>f()),c(n)}catch(d){l(d)}}o(u,"updateTLS"),MS?.system.hdb_certificate.subscribe({listener:o(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(a,c){Qa.info("TLS requested for",a||"(no SNI)");let l=a;for(;;){let d=r.get(l);if(d)return Qa.debug("Found certificate for",a,d.certStart),d.updatedContext&&(d=d.updatedContext),c(null,d);if(s&&l){let f=l.indexOf(".",1);f<0?l="":l=l.slice(f)}else break}a?Qa.debug("No certificate found to match",a,"using the default certificate"):Qa.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):Qa.info("No default certificate found"),c(null,u)}o(i,"SNICallback")}o(M$,"createTLSSelector");async function v$(e){let t=Xa.get(e);return!t&&e?await Bn.readFile(hr.join(os.get(vl.ROOTPATH),Ls.LICENSE_KEY_DIR_NAME,e),"utf8"):t}o(v$,"getPrivateKeyByName");async function U$(){Za();let e=[];for await(let t of Jr.search([]))e.push(t);return e}o(U$,"listCertificates");async function due(e){let t=Kw(e,Ei.object({name:Ei.string().required(),certificate:Ei.string().required(),is_authority:Ei.boolean().required(),private_key:Ei.string(),hosts:Ei.array(),uses:Ei.array()}));if(t)throw new Ja(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,a=new ko(n),c=!1,l=!1,u;for(let[h,p]of Xa)!s&&!c&&a.checkPrivateKey(R$(p))&&(c=!0,u=h),s&&s===p&&(l=!0,u=h);if(!i&&!s&&!c)throw new Ja("A suitable private key was not found for this certificate");let d;if(!r){try{d=Jw(a)}catch(h){ht.error(h)}if(d==null)throw new Ja("Error extracting certificate host name, please provide a name parameter")}let f=fue(r??d);s&&!c&&!l&&(await Bn.writeFile(hr.join(os.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME,f+".pem"),s),Xa.set(f,s));let m={name:r??d,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(m.private_key_name=u??f+".pem"),e.ciphers&&(m.ciphers=e.ciphers),await Ld(m),"Successfully added certificate: "+f}o(due,"addCertificate");function fue(e){return e.replace(/[^a-z0-9\.]/gi,"-")}o(fue,"sanitizeName");async function mue(e){let t=Kw(e,Ei.object({name:Ei.string().required()}));if(t)throw new Ja(t.message);let{name:r}=e;Za();let n=await Jr.get(r);if(!n)throw new Ja(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Jr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(ht.info("Removing private key named",s),await Bn.remove(hr.join(os.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME,s)))}return await Jr.delete(r),"Successfully removed "+r}o(mue,"removeCertificate");function Jw(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||Xw(e)[0]}o(Jw,"getPrimaryHostName");function Xw(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]:[]}o(Xw,"hostnamesFromCert");async function hue(e){if(e.bypass_auth!==!0)throw new Ja("Unauthorized","401");let t=Kw(e,Ei.object({name:Ei.string().required()}));if(t)throw new Ja(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await E$()).privateKey;if(r===".jwtPublic")return(await E$()).publicKey;if(Xa.get(r))return Xa.get(e.name);throw new Ja("Key not found")}o(hue,"getKey");function pue(e){return[e.subject?.CN,...e.subjectaltname.split(",").filter(t=>t.trim().startsWith("DNS:")).map(t=>t.trim().substring(4))]}o(pue,"getHostnamesFromCertificate")});var nV={};Oe(nV,{CONFIRMATION_STATUS_POSITION:()=>tV,LATENCY_POSITION:()=>YS,NodeReplicationConnection:()=>vd,OPERATION_REQUEST:()=>rO,RECEIVED_TIME_POSITION:()=>VS,RECEIVED_VERSION_POSITION:()=>$S,RECEIVING_STATUS_POSITION:()=>KS,RECEIVING_STATUS_RECEIVING:()=>rV,RECEIVING_STATUS_WAITING:()=>nO,SENDING_TIME_POSITION:()=>Qh,createWebSocket:()=>WS,databaseSubscriptions:()=>tc,replicateOverWS:()=>Jh,tableUpdateListeners:()=>iO});async function WS(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=Ze(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!eO){let l=(0,Q$.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),eO=u.secureContexts}if(i=eO.get(s),i&&ae.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let a={};r&&(a.Authorization=r);let c={headers:a,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,X$.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(qS?.caCount!==qo.size&&(qS=J$.createSecureContext({...i.options,ca:[...qo,...i.options.availableCAs.values()]}),qS.caCount=qo.size),c.secureContext=qS),new z$.WebSocket(e,"harperdb-replication-v1",c)}function Jh(e,t,r){let n=t.port||t.securePort,s=Ul.pid%1e3+"-"+j$.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3);ae.debug?.(s,"Initializing replication connection",r);let i=0,a=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(a.buffer,0,1024),u=t.database,d=t.databaseSubscriptions||tc,f,m,h=!1,p=t.subscription;p?.then&&p.then(E=>{p=E,p.auditStore&&(f=p.auditStore)});let _=t.tables||u&&nt()[u],g;if(!r){ae.error?.(s,"No authorization provided"),Ss(1008,"Unauthorized");return}let y=new Map,T=[];g=r.name,g&&t.connection&&(t.connection.nodeName=g);let R,N,O,F,Z,G,Y,q=6e4,K,ce=0,le=0,se=0,pe=W$.default.get(U.REPLICATION_BLOBTIMEOUT)??12e4,Ne=new Map,Ue=[],xe=0,Rr;if(t.url){let E=o(()=>{Z&&le===e._socket?.bytesRead&&se===e._socket?.bytesWritten?e.terminate():(Z=performance.now(),e.ping(),le=e._socket?.bytesRead,se=e._socket?.bytesWritten)},"sendPing");O=setInterval(E,K$).unref(),E()}else Jt();e._socket?.setMaxListeners(200);function Jt(){clearTimeout(F),le=e._socket?.bytesRead,se=e._socket?.bytesWritten,F=setTimeout(()=>{le===e._socket?.bytesRead&&se===e._socket?.bytesWritten&&(ae.warn?.(`Timeout waiting for ping from ${g}, terminating connection and reconnecting`),e.terminate())},K$*2).unref()}o(Jt,"resetPingTimer");function Mt(){if(!(!g||!u))return m||(m=Nd(f,u,g)),m}o(Mt,"getSharedStatus"),u&&ga(u);let Xt,Mf,Cc=[],Gt=[],vf,Uf=[],IE=[],NE=[],Fy=150,xf=25,Pe=0,wE=0,Bf=!1,po,Lr,yr,Ff;e.on("message",E=>{ce=performance.now();try{let S=E.dataView=new $c(E.buffer,E.byteOffset,E.byteLength);if(E[0]>127){let P=(0,et.decode)(E),[L,D,H]=P;switch(L){case B$:{if(D){if(g){if(g!==D){ae.error?.(s,`Node name mismatch, expecting to connect to ${g}, but peer reported name as ${D}, disconnecting`),e.send((0,et.encode)([Dd])),Ss(1008,"Node name mismatch");return}}else if(g=D,t.connection?.tentativeNode){let B=t.connection.tentativeNode;B.name=g,t.connection.tentativeNode=null,Ho(g,B)}if(t.connection&&(t.connection.nodeName=g),ae.debug?.(s,"received node name:",g,"db:",u??P[2]),!u)try{ga(u=P[2]),u==="system"&&(Xt=za(t,(B,de)=>{hu(de)&&Sa(de)}),e.on("close",()=>{Xt?.remove()}))}catch(B){ae.warn?.(s,"Error setting database",B),e.send((0,et.encode)([Dd])),Ss(1008,B.message);return}Dr()}break}case $$:{ae.debug?.(s,"Received table definitions for",D.map(B=>B.table));for(let B of D){let de=P[2];B.database=de;let me;hu(de)&&(de==="system"?ke[de]?.[B.table]||(me=V(B,ke[de]?.[B.table])):me=V(B,ke[de]?.[B.table]),f||(f=me?.auditStore),_||(_=nt()?.[de]))}break}case Dd:Ss();break;case rO:try{let B=r?.replicates||r?.subscribers||r?.name;ae.debug?.("Received operation request",D,"from",g),server.operation(D,{user:r},!B).then(de=>{Array.isArray(de)&&(de={results:de}),de.requestId=D.requestId,e.send((0,et.encode)([FS,de]))},de=>{e.send((0,et.encode)([FS,{requestId:D.requestId,error:(0,Md.errorToString)(de)}]))})}catch(B){e.send((0,et.encode)([FS,{requestId:D.requestId,error:(0,Md.errorToString)(B)}]))}break;case FS:let{resolve:C,reject:x}=y.get(D.requestId);D.error?x(new Error(D.error)):C(D),y.delete(D.requestId);break;case Zw:let z=P[3];if(!_){u?ae.error?.(s,"No database found for",u):ae.error?.(s,"Database name never received"),Ss();return}let ne=_[z];ne=V({table:z,database:u,attributes:D.attributes,schemaDefined:D.schemaDefined},ne),Cc[H]={name:z,decoder:new et.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:D.typedStructs,structures:D.structures}),getEntry(B){return ne.primaryStore.getEntry(B)},rootStore:ne.primaryStore.rootStore};break;case F$:Ff=f?o$(D,f):new Map,vf=P[2],ae.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${vf}`);break;case H$:let re=H;NE[re]=D;break;case q$:Mt()[tV]=D,ae.trace?.(s,"received and broadcasting committed update",D),Mt().buffer.notify();break;case G$:R=D,p.send({type:"end_txn",localTime:R,remoteNodeIds:T}),Mt(),replication_shared_status[$S]=last_sequence_id_received,replication_shared_status[VS]=Date.now(),replication_shared_status[KS]=nO;break;case HS:{let B=P[1],{fileId:de,size:me,finished:Se,error:ee}=B,j=Ne.get(de);ae.debug?.("Received blob",de,"has stream",!!j,"connectedToBlob",!!j?.connectedToBlob,"length",P[2].length,"finished",Se),j||(j=new tO.PassThrough,j.expectedSize=me,Ne.set(de,j)),j.lastChunk=Date.now();let he=P[2];st(he.byteLength,"bytes-received",`${g}.${u}`,"replication","blob");try{Se?(ee?(j.on("error",()=>{}),j.destroy(new Error("Blob error: "+ee+" for record "+(j.recordId??"unknown")+" from "+g))):j.end(he),j.connectedToBlob&&Ne.delete(de)):j.write(he)}catch(Te){ae.error?.(`Error receiving blob for ${j.recordId} from ${g} and streaming to storage`,Te),Ne.delete(de)}break}case k$:{let B=D,de;try{let me=P[3],Se=Gt[H]||(Gt[H]=_[P[4]]);if(!Se)return ae.warn?.("Unknown table id trying to handle record request",H);let ee=Se.primaryStore.getBinaryFast(Symbol.for("structures")),j=ee?.length??0;if(j>0&&j!==wE){wE=j;let Te=(0,et.decode)(ee);e.send((0,et.encode)([Zw,{typedStructs:Te.typed,structures:Te.named},H,Se.tableName]))}let he=Se.primaryStore.getBinaryFast(me);if(he){let Te=Se.primaryStore.decoder.decode(he,{valueAsBuffer:!0}),fe=ct||{};fe.version=(0,Z$.getLastVersion)(),ct&&ct[wu]&Vr&&(Te=Buffer.from(Te),fm(()=>Se.primaryStore.decoder.decode(he),We=>_a(We,me),Se.primaryStore.rootStore)),de=(0,et.encode)([BS,B,{value:Te,expiresAt:fe.expiresAt,version:fe.version,residencyId:fe.residencyId,nodeId:fe.nodeId,user:fe.user}])}else de=(0,et.encode)([BS,B])}catch(me){de=(0,et.encode)([BS,B,{error:me.message}])}e.send(de);break}case BS:{let{resolve:B,reject:de,tableId:me,key:Se}=y.get(P[1]),ee=P[2];if(ee?.error)de(new Error(ee.error));else if(ee){let j;i_(()=>{let he=Cc[me].decoder.decode(ee.value);ee.value=he,ee.key=Se,B(ee)||j&&setTimeout(()=>j.forEach(r_),6e4).unref()},f?.rootStore,he=>{let Te=Pc(he,Se);return j||(j=[]),j.push(Te),Te})}else B();y.delete(P[1]);break}case x$:{yr=D;let B,de,me=!1;if(p){if(u!==p.databaseName&&!p.then){ae.error?.("Subscription request for wrong database",u,p.databaseName);return}}else p=d.get(u);if(ae.debug?.(s,"received subscription request for",u,"at",yr),!p){let Ee;p=new Promise(ft=>{ae.debug?.("Waiting for subscription to database "+u),Ee=ft}),p.ready=Ee,tc.set(u,p)}if(r.name)de=Kt().subscribe(r.name),de.then(async Ee=>{B=Ee;for await(let ft of B){let tt=ft.value;if(!(tt?.replicates===!0||tt?.replicates?.receives||tt?.subscriptions?.some(cr=>(cr.database||cr.schema)===u&&cr.publish!==!1))){me=!0,e.send((0,et.encode)([Dd])),Ss(1008,`Unauthorized database subscription to ${u}`);return}}},Ee=>{ae.error?.(s,"Error subscribing to HDB nodes",Ee)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,et.encode)([Dd])),Ss(1008,`Unauthorized database subscription to ${u}`);return}if(Lr&&(ae.debug?.(s,"stopping previous subscription",u),Lr.emit("close")),yr.length===0)return;let Se=yr[0],ee=o(Ee=>{if(Ee&&(Se.replicateByDefault?!Se.tables.includes(Ee.tableName):Se.tables.includes(Ee.tableName)))return{table:Ee}},"tableToTableEntry"),j={txnTime:0},he,Te,fe=1/0,We,Et=o((Ee,ft)=>{if(Ee.type==="end_txn"){j.txnTime&&(a[i]!==66&&ae.error?.("Invalid encoding of message"),pu(9),pu(E_),Dc(We=ft),ut()),i=c,j.txnTime=0;return}let tt=Ee.nodeId,cr=Ee.tableId,vt=Te[cr];if(!vt&&(vt=Te[cr]=ee(p.tableById[cr]),!vt))return ae.debug?.("Not subscribed to table",cr);let Ts=vt.table,Ut=Ts.primaryStore,Qs=Ut.encoder;(Ee.extendedType&R_||!Qs.typedStructs)&&(Qs._mergeStructures(Qs.getStructures()),Qs.typedStructs&&(Qs.lastTypedStructuresLength=Qs.typedStructs.length));let Eu=he[tt];if(!(Eu&&Eu.startTime<ft&&(!Eu.endTime||Eu.endTime>ft)))return GS&&ae.trace?.(s,"skipping replication update",Ee.recordId,"to:",g,"from:",tt,"subscribed:",he),eM();GS&&ae.trace?.(s,"sending replication update",Ee.recordId,"to:",g,"from:",tt,"subscribed:",he);let Hy=Ee.version,Mc=Ee.residencyId,ky=mu(Mc,Ts),CE;if(ky&&!ky.includes(g)){let Js=mu(Ee.previousResidencyId,Ts);if(Js&&!Js.includes(g)&&(Ee.type==="put"||Ee.type==="patch")||Ts.getResidencyById)return eM();let kf=Ee.recordId;ae.trace?.(s,"sending invalidation",kf,g,"from",tt);let Gf=0;Mc&&(Gf|=Vc),Ee.previousResidencyId&&(Gf|=Kc);let $y,PE=null;for(let tM in Ts.indices){if(!PE){if($y=Ee.getValue(Ut,!0),!$y)break;PE={}}PE[tM]=$y[tM]}CE=Yc(Ee.version,cr,kf,null,tt,Ee.user,Ee.type==="put"||Ee.type==="patch"?"invalidate":Ee.type,Qs.encode(PE),Gf,Mc,Ee.previousResidencyId,Ee.expiresAt)}function eM(){return ae.trace?.(s,"skipping audit record",Ee.recordId),G||(G=setTimeout(()=>{G=null,(We||0)+V$/2<fe&&(GS&&ae.trace?.(s,"sending skipped sequence update",fe),e.send((0,et.encode)([G$,fe])))},V$).unref()),new Promise(setImmediate)}o(eM,"skipAuditRecord");let Gy=Qs.typedStructs,qy=Qs.structures;if((Gy?.length!=vt.typed_length||qy?.length!=vt.structure_length)&&(vt.typed_length=Gy?.length,vt.structure_length=qy.length,ae.debug?.(s,"send table struct",vt.typed_length,vt.structure_length),vt.sentName||(vt.sentName=!0),e.send((0,et.encode)([Zw,{typedStructs:Gy,structures:qy,attributes:Ts.attributes,schemaDefined:Ts.schemaDefined},cr,vt.table.tableName]))),Mc&&!IE[Mc]&&(e.send((0,et.encode)([H$,ky,Mc])),IE[Mc]=!0),j.txnTime!==Hy&&(j.txnTime&&(GS&&ae.trace?.(s,"new txn time, sending queued txn",j.txnTime),a[i]!==66&&ae.error?.("Invalid encoding of message"),ut()),j.txnTime=Hy,i=c,Dc(Hy)),CE)pu(CE.length),Lc(CE);else{let Js=Ee.encoded;Ee.extendedType&Vr&&fm(()=>Ee.getValue(Ut),Gf=>_a(Gf,Ee.recordId),Ut.rootStore);let kf=Js[0]===66?8:0;pu(Js.length-kf),Lc(Js,kf),ae.trace?.("wrote record",Ee.recordId,"length:",Js.length)}return e._socket.writableNeedDrain?new Promise(Js=>{ae.debug?.(`Waiting for remote node ${g} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Js)}):xe>xf?new Promise(Js=>{Rr=Js}):new Promise(setImmediate)},"sendAuditRecord"),ut=o(()=>{c-i>8?(e.send(a.subarray(i,c)),ae.debug?.(s,"Sent message, size:",c-i),st(c-i,"bytes-sent",`${g}.${u}`,"replication","egress")):ae.debug?.(s,"skipping empty transaction")},"sendQueuedData");Lr=new sO.EventEmitter,Lr.once("close",()=>{me=!0,B?.end()});for(let{startTime:Ee}of yr)Ee<fe&&(fe=Ee);(de||Promise.resolve()).then(async()=>{p=await p,f=p.auditStore,Te=p.tableById.map(ee),he=[];for(let{name:ft,startTime:tt,endTime:cr}of yr){let vt=CS(ft,f);ae.debug?.("subscription to",ft,"using local id",vt,"starting",tt),he[vt]={startTime:tt,endTime:cr}}Sa(u),Xt||(Xt=bl(ft=>{ft.databaseName===u&&Sa(u)}),Mf=Sh(ft=>{ft===u&&(e.send((0,et.encode)([Dd])),Ss())}),e.on("close",()=>{Xt?.remove(),Mf?.remove()})),e.send((0,et.encode)([F$,Gh(p.auditStore),yr.map(({name:ft})=>ft)]));let Ee=!0;do{isFinite(fe)||(ae.warn?.("Invalid sequence id "+fe),Ss(1008,"Invalid sequence id"+fe));let ft;if(Ee&&!me&&(Ee=!1,fe===0)){ae.info?.("Replicating all tables to",g);let tt=fe,cr=zS(f);for(let vt in _){if(!ee(vt))continue;let Ts=_[vt];for(let Ut of Ts.primaryStore.getRange({snapshot:!1,versions:!0})){if(me)return;if(Ut.localTime>=fe){ae.trace?.(s,"Copying record from",u,vt,Ut.key,Ut.localTime),tt=Math.max(Ut.localTime,tt),Mt()[Qh]=1;let Qs=Yc(Ut.version,Ts.tableId,Ut.key,null,cr,null,"put",fm(()=>Ts.primaryStore.encoder.encode(Ut.value),Eu=>_a(Eu,Ut.key)),Ut.metadataFlags&-256,Ut.residencyId,null,Ut.expiresAt);await Et({recordId:Ut.key,tableId:Ts.tableId,type:"put",getValue(){return Ut.value},encoded:Qs,version:Ut.version,residencyId:Ut.residencyId,nodeId:cr,extendedType:Ut.metadataFlags},Ut.localTime)}}}c-i>8&&Et({type:"end_txn"},fe),Mt()[Qh]=0,fe=tt}for(let{key:tt,value:cr}of f.getRange({start:fe||1,exclusiveStart:!0,snapshot:!1})){if(me)return;let vt=At(cr);ae.debug?.("sending audit record",new Date(tt)),Mt()[Qh]=tt,fe=tt,await Et(vt,tt),Lr.startTime=tt}c-i>8&&Et({type:"end_txn"},fe),Mt()[Qh]=0,await SU(f)}while(!me)}).catch(Ee=>{ae.error?.(s,"Error handling subscription to node",Ee),Ss(1008,"Error handling subscription to node")});break}}return}S.position=8;let A=!0,b,I;do{Mt();let P=S.readInt();if(P===9&&S.getUint8(S.position)==E_){S.position++,R=I=S.readFloat64(),m[$S]=R,m[VS]=Date.now(),m[KS]=nO,ae.trace?.("received remote sequence update",R,u);break}let L=S.position,D=At(E,L,L+P),H=Cc[D.tableId];H||ae.error?.(`No table found with an id of ${D.tableId}`);let C;D.residencyId&&(C=NE[D.residencyId],ae.trace?.(s,"received residency list",C,D.type,D.recordId));try{let x=D.recordId;i_(()=>{b={table:H.name,id:D.recordId,type:D.type,nodeId:Ff.get(D.nodeId),residencyList:C,timestamp:D.version,value:D.getValue(H),user:D.user,beginTxn:A,expiresAt:D.expiresAt}},f?.rootStore,z=>Pc(z,x))}catch(x){throw x.message+="typed structures for current decoder"+JSON.stringify(H.decoder.typedStructs),x}A=!1,ae.trace?.(s,"received replication message",D.type,"id",b.id,"version",new Date(D.version),"nodeId",b.nodeId),m[$S]=D.version,m[VS]=Date.now(),m[KS]=rV,p.send(b),S.position=L+P}while(S.position<E.byteLength);Pe++,st(E.byteLength,"bytes-received",`${g}.${u}.${b?.table||"unknown_table"}`,"replication","ingest"),Pe>Fy&&!Bf&&(Bf=!0,e.pause(),ae.debug?.(`Commit backlog causing replication back-pressure, requesting that ${g} pause replication`)),p.send({type:"end_txn",localTime:R,remoteNodeIds:T,async onCommit(){if(b){let P=Date.now()-b.timestamp;st(P,"replication-latency",g+"."+u+"."+b.table,b.type,"ingest")}Pe--,Bf&&(Bf=!1,e.resume(),ae.debug?.(`Replication resuming ${g}`)),Ue.length>0&&await Promise.all(Ue),ae.trace?.("All blobs finished"),!N&&I&&(ae.trace?.(s,"queuing confirmation of a commit at",I),setTimeout(()=>{e.send((0,et.encode)([q$,N])),ae.trace?.(s,"sent confirmation of a commit at",N),N=null},_ue)),N=I,ae.debug?.("last sequence committed",new Date(I),u)}})}catch(S){ae.error?.(s,"Error handling incoming replication message",S)}}),e.on("ping",Jt),e.on("pong",()=>{if(t.connection){let E=performance.now()-Z;t.connection.latency=E,Mt()&&(m[YS]=E),t.isSubscriptionConnection&&Dl({name:g,database:u,url:t.url,latency:E})}Z=null}),e.on("close",(E,S)=>{clearInterval(O),clearTimeout(F),clearInterval(Y),Lr&&Lr.emit("close"),po&&po.end();for(let[A,{reject:b}]of y)b(new Error(`Connection closed ${S?.toString()} ${E}`));ae.debug?.(s,"closed",E,S?.toString())});function Ss(E,S){try{e.isFinished=!0,ae.debug?.(s,"closing",g,u,E,S),e.close(E,S),t.connection?.emit("finished")}catch(A){ae.error?.(s,"Error closing connection",A)}}o(Ss,"close");let Ea=new Set;async function _a(E,S){let A=n_(E);if(Ea.has(A)){ae.debug?.("Blob already being sent",A);return}Ea.add(A);try{let b;xe++;for await(let I of E.stream())b&&(ae.debug?.("Sending blob chunk",A,"length",b.length),e.send((0,et.encode)([HS,{fileId:A,size:E.size},b]))),b=I,e._socket.writableNeedDrain&&(ae.debug?.("draining",A),await new Promise(P=>e._socket.once("drain",P)),ae.debug?.("drained",A)),st(I.length,"bytes-sent",`${g}.${u}`,"replication","blob");ae.debug?.("Sending final blob chunk",A,"length",b.length),e.send((0,et.encode)([HS,{fileId:A,size:E.size,finished:!0},b]))}catch(b){ae.warn?.("Error sending blob",b,"blob id",A,"for record",S),e.send((0,et.encode)([HS,{fileId:A,finished:!0,error:(0,Md.errorToString)(b)},Buffer.alloc(0)]))}finally{Ea.delete(A),xe--,xe<xf&&Rr?.()}}o(_a,"sendBlobs");function Pc(E,S){let A=n_(E),b=Ne.get(A);ae.debug?.("Received transaction with blob",A,"has stream",!!b,"ended",!!b?.writableEnded),b?b.writableEnded&&Ne.delete(A):(b=new tO.PassThrough,Ne.set(A,b)),b.connectedToBlob=!0,b.lastChunk=Date.now(),b.recordId=S,E.size===void 0&&b.expectedSize&&(E.size=b.expectedSize);let I=b.blob??createBlob(b,E);b.blob=I;let P=Ao(()=>dm(I).saving,p.auditStore?.rootStore);return P&&(P.blobId=A,Ue.push(P),P.finally(()=>{ae.debug?.(`Finished receiving blob stream ${A}`),Ue.splice(Ue.indexOf(P),1)})),I}o(Pc,"receiveBlobs");function Dr(){if(h||(h=!0,t.connection?.on("subscriptions-updated",Dr)),!f&&p&&(f=p.auditStore),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let E=new Map;f||(f=p?.auditStore);try{for(let b of p?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let I of b.value.nodes||[])I.lastTxnTime>(E.get(I.id)??0)&&E.set(I.id,I.lastTxnTime)}catch(b){if(!b.message.includes("Can not re"))throw b}let S=t.connection?.nodeSubscriptions?.[0];T=[];let A=t.connection?.nodeSubscriptions.map((b,I)=>{let P=[],{replicateByDefault:L}=b;if(b.subscriptions){for(let x of b.subscriptions)if(x.subscribe&&(x.schema||x.database)===u){let z=x.table;_?.[z]?.replicate!==!1&&P.push(z)}L=!1}else for(let x in _)(L?_[x].replicate===!1:_[x].replicate)&&P.push(x);let D=f&&CS(b.name,f),H=p?.dbisDB?.get([Symbol.for("seq"),D])??1,C=Math.max(H?.seqId??1,(typeof b.startTime=="string"?new Date(b.startTime).getTime():b.startTime)??1);if(ae.debug?.("Starting time recorded in db",b.name,D,u,H?.seqId,"start time:",C,new Date(C)),S!==b){let x=f&&CS(S.name,f),z=p?.dbisDB?.get([Symbol.for("seq"),x])??1;for(let ne of z?.nodes||[])ne.name===b.name&&(C=ne.seqId,ae.debug?.("Using sequence id from proxy node",S.name,C))}if(D===void 0?ae.warn("Starting subscription request from node",b,"but no node id found"):T.push(D),E.get(D)>C&&(C=E.get(D),ae.debug?.("Updating start time from more recent txn recorded",S.name,C)),C===1&&kS)try{new URL(kS).hostname===b.name?(ae.warn?.(`Requesting full copy of database ${u} from ${kS}`),C=0):C=Date.now()-6e4}catch(x){ae.error?.("Error parsing leader URL",kS,x)}return ae.trace?.(s,"defining subscription request",b.name,u,new Date(C)),{name:b.name,replicateByDefault:L,tables:P,startTime:C,endTime:b.endTime}});if(A)if(ae.debug?.(s,"sending subscription request",A,p?.dbisDB?.path),clearTimeout(K),A.length>0)e.send((0,et.encode)([x$,A]));else{let b=o(()=>{let I=performance.now();K=setTimeout(()=>{ce<=I?Ss(1008,"Connection has no subscriptions and is no longer used"):b()},q).unref()},"scheduleClose");b()}}o(Dr,"sendSubscriptionRequestUpdate");function mu(E,S){if(!E)return;let A=Uf[E];return A||(A=S.getResidencyRecord(E),Uf[E]=A),A}o(mu,"getResidence");function hu(E){return!(ec&&ec!="*"&&!ec[E]&&!ec.includes?.(E)&&!ec.some?.(S=>S.name===E))}o(hu,"checkDatabaseAccess");function ga(E){if(p=p||d.get(E),!hu(E))throw new Error(`Access to database "${E}" is not permitted`);p||ae.warn?.(`No database named "${E}" was declared and registered`),f=p?.auditStore,_||(_=nt()?.[E]);let S=Ze();if(S===g)throw S?new Error("Should not connect to self",S):new Error("Node name not defined");return OE(S,E),!0}o(ga,"setDatabase");function OE(E,S){let A=nt()?.[S],b=[];for(let I in A){let P=A[I];b.push({table:I,schemaDefined:P.schemaDefined,attributes:P.attributes.map(L=>({name:L.name,type:L.type,isPrimaryKey:L.isPrimaryKey}))})}ae.trace?.("Sending database info for node",E,"database name",S),e.send((0,et.encode)([B$,E,S,b]))}o(OE,"sendNodeDBName");function Sa(E){let S=nt()?.[E],A=[];for(let b in S){if(yr&&!yr.some(P=>P.replicateByDefault?!P.tables.includes(b):P.tables.includes(b)))continue;let I=S[b];A.push({table:b,schemaDefined:I.schemaDefined,attributes:I.attributes.map(P=>({name:P.name,type:P.type,isPrimaryKey:P.isPrimaryKey}))})}e.send((0,et.encode)([$$,A,E]))}o(Sa,"sendDBSchema"),Y=setInterval(()=>{for(let[E,S]of Ne)S.lastChunk+pe<Date.now()&&(ae.warn?.(`Timeout waiting for blob stream to finish ${E} for record ${S.recordId??"unknown"} from ${g}`),Ne.delete(E),S.end())},pe).unref();let Ta=1,Hf=[];return{end(){po&&po.end(),Lr&&Lr.emit("close")},getRecord(E){let S=Ta++;return new Promise((A,b)=>{let I=[k$,S,E.table.tableId,E.id];Hf[E.table.tableId]||(I.push(E.table.tableName),Hf[E.table.tableId]=!0),e.send((0,et.encode)(I)),ce=performance.now(),y.set(S,{tableId:E.table.tableId,key:E.id,resolve(P){let{table:L,entry:D}=E;if(A(P),P)return L._recordRelocate(D,P)},reject:b})})},sendOperation(E){let S=Ta++;return E.requestId=S,e.send((0,et.encode)([rO,E])),new Promise((A,b)=>{y.set(S,{resolve:A,reject:b})})}};function pu(E){Ra(5),E<128?a[c++]=E:E<16384?(l.setUint16(c,E|32768),c+=2):E<1056964608?(l.setUint32(c,E|3221225472),c+=4):(a[c]=255,l.setUint32(c+1,E),c+=5)}function Lc(E,S=0,A=E.length){let b=A-S;Ra(b),E.copy(a,c,S,A),c+=b}function Dc(E){Ra(8),l.setFloat64(c,E),c+=8}function Ra(E){if(E+16>a.length-c){let S=Buffer.allocUnsafeSlow(c+E-i+65536>>10<<11);a.copy(S,0,i,c),c=c-i,i=0,a=S,l=new DataView(a.buffer,0,a.length)}}function V(E,S){let A=E.database??"data";if(A!=="data"&&!ke[A]){ae.warn?.("Database not found",E.database);return}S||(S={});let b=S.schemaDefined,I=!1,P=E.schemaDefined,L=S.attributes||[];for(let D=0;D<E.attributes?.length;D++){let H=E.attributes[D],C=L.find(x=>x.name===H.name);(!C||C.type!==H.type)&&(b?ae.error?.(`Schema for '${u}.${E.table}' is defined locally, but attribute '${H.name}: ${H.type}' from '${g}' does not match local attribute ${C?"'"+C.name+": "+C.type+"'":"which does not exist"}`):(I=!0,P||(H.indexed=!0),C?L[L.indexOf(C)]=H:L.push(H)))}return I?(ae.debug?.("(Re)creating",E),ze({table:E.table,database:E.database,schemaDefined:E.schemaDefined,attributes:L,...S})):S}}var W$,et,z$,j$,Md,sO,Q$,J$,Ul,X$,tO,Z$,eV,ae,x$,B$,F$,Dd,H$,Zw,k$,BS,rO,FS,G$,q$,$$,HS,tV,$S,VS,Qh,YS,KS,nO,rV,Eue,kS,iO,tc,GS,V$,_ue,K$,eO,qS,Y$,vd,oO=ue(()=>{De();Li();Bw();tb();is();W$=w(oe());k();Wc();et=require("msgpackr"),z$=require("ws"),j$=require("worker_threads"),Md=w(Q());Wh();sO=require("events"),Q$=w(as()),J$=w(require("node:tls"));Ll();Ul=w(require("node:process")),X$=require("node:net");Wi();Kn();tO=require("node:stream"),Z$=require("lmdb"),eV=w(require("minimist")),ae=(0,Md.forComponent)("replication").conditional,x$=129,B$=140,F$=141,Dd=142,H$=130,Zw=132,k$=133,BS=134,rO=136,FS=137,G$=143,q$=144,$$=145,HS=146,tV=0,$S=1,VS=2,Qh=3,YS=4,KS=5,nO=0,rV=1,Eue=(0,eV.default)(Ul.argv),kS=Eue.HDB_LEADER_URL??Ul.env.HDB_LEADER_URL,iO=new Map,tc=new Map,GS=!0,V$=300,_ue=2,K$=3e4;o(WS,"createWebSocket");Y$=500,vd=class extends sO.EventEmitter{static{o(this,"NodeReplicationConnection")}socket;startTime;retryTime=Y$;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;url;subscription;databaseName;nodeName;authorization;constructor(t,r,n,s,i){super(),this.url=t,this.subscription=r,this.databaseName=n,this.authorization=i,this.nodeName=this.nodeName??pi(t)}async connect(){this.session||this.resetSession();let t=[];this.socket=await WS(this.url,{serverName:this.nodeName,authorization:this.authorization});let r;ae.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${Ul.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ae[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=Y$,this.nodeSubscriptions&&Dl({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,r=Jh(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(r)}),this.socket.on("error",n=>{n.code==="SELF_SIGNED_CERT_IN_CHAIN"?(ae.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),n.isHandled=!0):n.code!=="ECONNREFUSED"&&(n.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?ae.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`):ae.error?.(`Error in connection to ${this.url} due to ${n.message}`)),this.sessionReject(n)}),this.socket.on("close",(n,s)=>{if(this.isConnected&&(this.nodeSubscriptions&&Cd({name:this.nodeName,database:this.databaseName,url:this.url,finished:this.socket.isFinished}),this.isConnected=!1),this.removeAllListeners("subscriptions-updated"),this.socket.isFinished){this.isFinished=!0,r?.end(),this.emit("finished");return}if(++this.retries%20===1){let i=s?.toString();ae.warn?.(`${r?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${i?'"'+i+'" ':""}(code: ${n})`)}r=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((t,r)=>{this.sessionResolve=t,this.sessionReject=r})}subscribe(t,r){this.nodeSubscriptions=t,this.replicateTablesByDefault=r,this.emit("subscriptions-updated",t)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(t){return this.session.then(r=>r.getRecord(t))}};o(Jh,"replicateOverWS")});var Go={};Oe(Go,{clearThisNodeName:()=>Nue,disableReplication:()=>Rue,enabledDatabases:()=>ec,forEachReplicatedDatabase:()=>za,getThisNodeId:()=>zS,getThisNodeName:()=>Ze,getThisNodeUrl:()=>ja,hostnameToUrl:()=>ZS,lastTimeInAuditStore:()=>qh,monitorNodeCAs:()=>fV,replicateOperation:()=>Oue,replicationCertificateAuthorities:()=>qo,sendOperationToNode:()=>Xh,servers:()=>Sue,setReplicator:()=>hV,start:()=>Tue,startOnMainThread:()=>kw,subscribeToNode:()=>Yh,unsubscribeFromNode:()=>DS,urlToNodeName:()=>pi});function Tue(e){if(!e.port&&!e.securePort&&(e.port=Ds.default.get(U.OPERATIONSAPI_NETWORK_PORT),e.securePort=Ds.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),!Ze())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of Vh(e))t.set(pi(s.url),s);yue(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=Le.ws(async(s,i,a,c)=>{if(Ct.debug("Incoming WS connection received "+i.url),i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,a);await a,s._socket.unref(),Jh(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&Ct.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Le.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){Ct.debug("Incoming replication WS connection received, authorized: "+s.authorized),!s.authorized&&s._nodeRequest.socket.authorizationError&&Ct.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let a=Kt().primaryStore;if(s.authorized&&s.peerCertificate.subjectaltname){let c=(0,uV.getHostnamesFromCertificate)(s.peerCertificate),l;for(let u of c)if(l=u&&(a.get(u)||t.get(u)),l)break;if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){Ct.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else Ct.warn(`No node found for certificate common name/SANs: ${c}, available nodes are ${Array.from(a.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=a.get(s.ip)||t.get(s.ip);c?s.user=c:Ct.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...a.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=o(()=>{let a=new Set(s.secureContexts.values());s.defaultContext&&a.add(s.defaultContext);for(let c of a)try{let l=Array.from(qo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=XS.createSecureContext(u)}catch(l){Ct.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Ds.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1&&i()}fV(()=>{for(let s of n)s()})}function fV(e){let t=0;wd(r=>{r?.ca&&(qo.add(r.ca),qo.size!==t&&(t=qo.size,e?.()))})}function Rue(e=!0){dV=e}function yue(e){dV||(nt(),ec=e.databases,za(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||tc;for(let[s,i]of QS){let a=i.get(r);a&&(a.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];hV(r,s,e),iO.get(s)?.forEach(i=>i(s))}}))}function hV(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 mV extends xr{static{o(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||tc,a=i.get(e),c=a?.tableById||[];c[t.tableId]=t;let l=a?.ready;if(Ct.trace("Setting up replicator subscription to database",e),!a?.auditStore)return this.subscription=a=new Vn,i.set(e,a),a.tableById=c,a.auditStore=t.auditStore,a.dbisDB=t.dbisDB,a.databaseName=e,l&&l(a),a;this.subscription=a}static subscribeOnThisThread(i,a){return!0}static async load(i){if(i){let a=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),a]);if(c){let l,u=new Set;do{let d,f="",m=1/0;for(let p of c){if(u.has(p)||p===Le.hostname)continue;let _=bue(p,mV.subscription,e);if(_?.isConnected){let g=Nd(t.auditStore,e,p)[YS];(!d||g<m)&&(d=_,f=p,m=g)}}if(!d)throw l||new cV.ServerError(`No connection to any other nodes are available: ${c}`,502);let h={requestId:gue++,table:t,entry:i,id:i.key};u.add(f);try{return await d.getRecord(h)}catch(p){if(d.isConnected)throw p;Ct.warn("Error in load from node",JS,p),l||(l=p)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function Aue(e,t,r,n,s){let i=QS.get(e);i||QS.set(e,i=new Map);let a=i.get(r);if(a)return a;if(t)return i.set(r,a=new vd(e,t,r,n,s)),a.connect(),a.once("finished",()=>i.delete(r)),a}function bue(e,t,r){let n=sV.get(e);n||(n=new Map,sV.set(e,n));let s=n.get(r);if(s)return s;let i=Kt().primaryStore.get(e);return i?.url&&(s=new vd(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function Xh(e,t,r){r||(r={}),r.serverName=e.name;let n=await WS(e.url,r),s=Jh(n,{},{});return new Promise((i,a)=>{n.on("open",()=>{Ct.debug("Sending operation connection to "+e.url+" opened",t),i(s.sendOperation(t))}),n.on("error",c=>{a(c)}),n.on("close",c=>{Ct.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function Yh(e){try{lV.isMainThread&&Ct.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=tc.get(e.database);if(!t){let n;t=new Promise(s=>{Ct.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,tc.set(e.database,t)}let r=Aue(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=>$h(n,e.database)),e.replicateByDefault)}catch(t){Ct.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function DS({name:e,url:t,database:r}){Ct.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(Kt().primaryStore.getRange({})));let n=QS.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Iue(){if(aO!==void 0)return aO;let e=Ds.default.get(U.OPERATIONSAPI_TLS_CERTIFICATE)||Ds.default.get(U.TLS_CERTIFICATE);if(e)return aO=new oV.X509Certificate((0,aV.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function Ze(){return JS||(JS=Ds.default.get("replication_hostname")??pi(Ds.default.get("replication_url"))??Iue()??iV("operationsapi_network_secureport")??iV("operationsapi_network_port")??"127.0.0.1")}function Nue(){JS=void 0}function iV(e){let t=Ds.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function jS(e){let t=Ds.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function zS(e){return Gh(e)?.[Ze()]}function ja(){let e=Ds.default.get("replication_url");return e||ZS(Ze())}function ZS(e){let t=jS("replication_port");if(t)return`ws://${e}:${t}`;if(t=jS("replication_secureport"),t)return`wss://${e}:${t}`;if(t=jS("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=jS("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function pi(e){if(e)return new URL(e).hostname}function za(e,t){for(let n of Object.getOwnPropertyNames(ke))r(n);return Sh(n=>{r(n)}),bl((n,s)=>{r(n.databaseName)});function r(n){let s=ke[n];Ct.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):wue(n)&&t(s,n,!1)}o(r,"forDatabase")}function wue(e){let t=ke[e];for(let r in t)if(t[r].replicate)return!0}function qh(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function Oue(e){let t={message:""};if(e.replicated){e.replicated=!1,Ct.trace?.("Replicating operation",e.operation,"to nodes",Le.nodes.map(n=>n.name));let r=await Promise.allSettled(Le.nodes.map(n=>Xh(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Le.nodes[s]?.name,i})}return t}var Ds,Ct,oV,aV,XS,cV,lV,uV,dV,gue,Sue,qo,ec,QS,sV,aO,JS,is=ue(()=>{De();Pa();Tu();oO();Mr();Ds=w(oe()),Ct=w(Q()),oV=require("crypto"),aV=require("fs");Wh();Ll();k();Bw();XS=w(require("node:tls")),cV=w(ge()),lV=require("worker_threads"),uV=w(as()),gue=1,Sue=[],qo=Ds.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1?new Set(XS.rootCertificates):new Set;o(Tue,"start");o(fV,"monitorNodeCAs");o(Rue,"disableReplication");o(yue,"assignReplicationSource");o(hV,"setReplicator");QS=new Map;o(Aue,"getSubscriptionConnection");sV=new Map;o(bue,"getRetrievalConnectionByName");o(Xh,"sendOperationToNode");o(Yh,"subscribeToNode");o(DS,"unsubscribeFromNode");o(Iue,"getCommonNameFromCert");o(Ze,"getThisNodeName");o(Nue,"clearThisNodeName");Object.defineProperty(Le,"hostname",{get(){return Ze()}});o(iV,"getHostFromListeningPort");o(jS,"getPortFromListeningPort");o(zS,"getThisNodeId");Le.replication={getThisNodeId:zS,exportIdMapping:Gh};o(ja,"getThisNodeUrl");o(ZS,"hostnameToUrl");o(pi,"urlToNodeName");o(za,"forEachReplicatedDatabase");o(wue,"hasExplicitlyReplicatedTable");o(qh,"lastTimeInAuditStore");o(Oue,"replicateOperation")});var ep=M((Rve,SV)=>{"use strict";var Ud=Cq(),{validateBySchema:Zh}=lt(),{commonValidators:xd,schemaRegex:cO}=Hi(),pr=require("joi"),Cue=Q(),Pue=require("uuid").v4,rT=Co(),Bd=(k(),v(W)),Lue=require("util"),rc=Jn(),{handleHDBError:$o,hdbErrors:Due,ClientError:xl}=ge(),{HDB_ERROR_MSGS:eT,HTTP_STATUS_CODES:Vo}=Due,{SchemaEventMsg:nT}=oi(),pV=mr(),{getDatabases:Mue}=(De(),v(mt)),{transformReq:Fd}=ie(),{replicateOperation:EV}=(is(),v(Go)),{cleanupOrphans:vue}=(Kn(),v(o_)),tT=pr.string().min(1).max(xd.schema_length.maximum).pattern(cO).messages({"string.pattern.base":"{:#label} "+xd.schema_format.message}),Uue=pr.string().min(1).max(xd.schema_length.maximum).pattern(cO).messages({"string.pattern.base":"{:#label} "+xd.schema_format.message}).required(),xue=pr.string().min(1).max(xd.schema_length.maximum).pattern(cO).messages({"string.pattern.base":"{:#label} "+xd.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();SV.exports={createSchema:Bue,createSchemaStructure:_V,createTable:Fue,createTableStructure:gV,createAttribute:$ue,dropSchema:Hue,dropTable:kue,dropAttribute:Gue,getBackup:Vue,cleanupOrphanBlobs:Kue};async function Bue(e){let t=await _V(e);return rT.signalSchemaChange(new nT(process.pid,e.operation,e.schema)),t}o(Bue,"createSchema");async function _V(e){let t=Zh(e,pr.object({database:tT,schema:tT}));if(t)throw new xl(t.message);if(Fd(e),!await Ud.checkSchemaExists(e.schema))throw $o(new Error,eT.SCHEMA_EXISTS_ERR(e.schema),Vo.BAD_REQUEST,Bd.LOG_LEVELS.ERROR,eT.SCHEMA_EXISTS_ERR(e.schema),!0);return await rc.createSchema(e),`database '${e.schema}' successfully created`}o(_V,"createSchemaStructure");async function Fue(e){return Fd(e),e.hash_attribute=e.primary_key??e.hash_attribute,await gV(e)}o(Fue,"createTable");async function gV(e){let t=Zh(e,pr.object({database:tT,schema:tT,table:Uue,residence:pr.array().items(pr.string().min(1)).optional(),hash_attribute:xue}));if(t)throw new xl(t.message);if(!await Ud.checkSchemaTableExists(e.schema,e.table))throw $o(new Error,eT.TABLE_EXISTS_ERR(e.schema,e.table),Vo.BAD_REQUEST,Bd.LOG_LEVELS.ERROR,eT.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Pue(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await rc.createTable(n,e);else throw $o(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Vo.BAD_REQUEST);else await rc.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}o(gV,"createTableStructure");async function Hue(e){let t=Zh(e,pr.object({database:pr.string(),schema:pr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new xl(t.message);Fd(e);let r=await Ud.checkSchemaExists(e.schema);if(r)throw $o(new Error,r,Vo.NOT_FOUND,Bd.LOG_LEVELS.ERROR,r,!0);let n=await Ud.schemaDescribe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await rc.dropSchema(e),rT.signalSchemaChange(new nT(process.pid,e.operation,e.schema)),await pV.purgeSchemaTableStreams(e.schema,s);let i=await EV(e);return i.message=`successfully deleted '${e.schema}'`,i}o(Hue,"dropSchema");async function kue(e){let t=Zh(e,pr.object({database:pr.string(),schema:pr.string(),table:pr.string().required()}));if(t)throw new xl(t.message);Fd(e);let r=await Ud.checkSchemaTableExists(e.schema,e.table);if(r)throw $o(new Error,r,Vo.NOT_FOUND,Bd.LOG_LEVELS.ERROR,r,!0);await rc.dropTable(e),await pV.purgeTableStream(e.schema,e.table);let n=await EV(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}o(kue,"dropTable");async function Gue(e){let t=Zh(e,pr.object({database:pr.string(),schema:pr.string(),table:pr.string().required(),attribute:pr.string().required()}));if(t)throw new xl(t.message);Fd(e);let r=await Ud.checkSchemaTableExists(e.schema,e.table);if(r)throw $o(new Error,r,Vo.NOT_FOUND,Bd.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw $o(new Error,"You cannot drop a hash attribute",Vo.BAD_REQUEST,void 0,void 0,!0);if(Bd.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw $o(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Vo.BAD_REQUEST,void 0,void 0,!0);try{return await rc.dropAttribute(e),que(e),rT.signalSchemaChange(new nT(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw Cue.error(`Got an error deleting attribute ${Lue.inspect(e)}.`),n}}o(Gue,"dropAttribute");function que(e){let t=Object.values(global.hdb_schema[e.schema][e.table].attributes);for(let r=0;r<t.length;r++)t[r].attribute===e.attribute&&global.hdb_schema[e.schema][e.table].attributes.splice(r,1)}o(que,"dropAttributeFromGlobal");async function $ue(e){Fd(e);let t=Mue()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw $o(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Vo.BAD_REQUEST,void 0,void 0,!0);return await rc.createAttribute(e),rT.signalSchemaChange(new nT(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}o($ue,"createAttribute");function Vue(e){return rc.getBackup(e)}o(Vue,"getBackup");function Kue(e){if(!e.database)throw new xl('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new xl(`Unknown database '${e.database}'`);return vue(databases[e.database],e.database),{message:"Orphaned blobs cleanup started, check logs for progress"}}o(Kue,"cleanupOrphanBlobs")});var RV=M((Ave,TV)=>{"use strict";var{OPERATIONS_ENUM:Yue}=(k(),v(W)),lO=class{static{o(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Yue.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};TV.exports=lO});var uO=M((Nve,NV)=>{"use strict";var Wue=Jn(),Ive=RV(),sT=ie(),iT=(k(),v(W)),zue=oe(),{handleHDBError:yV,hdbErrors:jue}=ge(),{HDB_ERROR_MSGS:AV,HTTP_STATUS_CODES:bV}=jue,Que=Object.values(iT.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),IV="To use this operation audit log must be enabled in harperdb-config.yaml";NV.exports=Jue;async function Jue(e){if(sT.isEmpty(e.schema))throw new Error(AV.SCHEMA_REQUIRED_ERR);if(sT.isEmpty(e.table))throw new Error(AV.TABLE_REQUIRED_ERR);if(!zue.get(iT.CONFIG_PARAMS.LOGGING_AUDITLOG))throw yV(new Error,IV,bV.BAD_REQUEST,iT.LOG_LEVELS.ERROR,IV,!0);let t=sT.checkSchemaTableExist(e.schema,e.table);if(t)throw yV(new Error,t,bV.NOT_FOUND,iT.LOG_LEVELS.ERROR,t,!0);if(!sT.isEmpty(e.search_type)&&Que.indexOf(e.search_type)<0)throw new Error(`Invalid searchType '${read_audit_log_object.search_type}'`);return await Wue.readAuditLog(e)}o(Jue,"readAuditLog")});var OV=M((Ove,wV)=>{"use strict";var{OPERATIONS_ENUM:Xue}=(k(),v(W)),dO=class{static{o(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Xue.GET_BACKUP,this.schema=t,this.table=r}};wV.exports=dO});var LV=M((Dve,PV)=>{"use strict";var Zue=Jn(),Pve=OV(),fO=ie(),ede=(k(),v(W)),Lve=oe(),{handleHDBError:tde,hdbErrors:rde}=ge(),{HDB_ERROR_MSGS:CV,HTTP_STATUS_CODES:nde}=rde;PV.exports=sde;async function sde(e){if(fO.isEmpty(e.schema))throw new Error(CV.SCHEMA_REQUIRED_ERR);if(fO.isEmpty(e.table))throw new Error(CV.TABLE_REQUIRED_ERR);let t=fO.checkSchemaTableExist(e.schema,e.table);if(t)throw tde(new Error,t,nde.NOT_FOUND,ede.LOG_LEVELS.ERROR,t,!0);return await Zue.getBackup(readAuditLogObject)}o(sde,"getBackup")});var UV=M((vve,vV)=>{"use strict";var ide=oe(),nc=require("joi"),ode=lt(),DV=require("moment"),ade=require("fs-extra"),mO=require("path"),cde=require("lodash"),tp=(k(),v(W)),{LOG_LEVELS:Bl}=(k(),v(W)),lde="YYYY-MM-DD hh:mm:ss",ude=mO.resolve(__dirname,"../logs");vV.exports=function(e){return ode.validateBySchema(e,dde)};var dde=nc.object({from:nc.custom(MV),until:nc.custom(MV),level:nc.valid(Bl.NOTIFY,Bl.FATAL,Bl.ERROR,Bl.WARN,Bl.INFO,Bl.DEBUG,Bl.TRACE),order:nc.valid("asc","desc"),limit:nc.number().min(1),start:nc.number().min(0),log_name:nc.custom(fde)});function MV(e,t){if(DV(e,DV.ISO_8601).format(lde)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}o(MV,"validateDatetime");function fde(e,t){if(cde.invert(tp.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=ide.get(tp.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?tp.LOG_NAMES.HDB:e,i=s===tp.LOG_NAMES.INSTALL?mO.join(ude,tp.LOG_NAMES.INSTALL):mO.join(n,s);return ade.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}o(fde,"validateReadLogPath")});var pO=M((xve,BV)=>{"use strict";var oT=(k(),v(W)),mde=Q(),hde=oe(),pde=UV(),hO=require("path"),xV=require("fs-extra"),{once:Ede}=require("events"),{handleHDBError:_de,hdbErrors:gde}=ge(),{PACKAGE_ROOT:Sde}=Rt(),{replicateOperation:Tde}=(is(),v(Go)),Rde=hO.join(Sde,"logs"),yde=1e3,Ade=200;BV.exports=bde;async function bde(e){let t=pde(e);if(t)throw _de(t,t.message,gde.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=Tde(e),n=hde.get(oT.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e.log_name===void 0?oT.LOG_NAMES.HDB:e.log_name,i=s===oT.LOG_NAMES.INSTALL?hO.join(Rde,oT.LOG_NAMES.INSTALL):hO.join(n,s),a=e.level!==void 0,c=a?e.level:void 0,l=e.from!==void 0,u=l?new Date(e.from):void 0,d=e.until!==void 0,f=d?new Date(e.until):void 0,m=e.limit===void 0?yde:e.limit,h=e.order===void 0?void 0:e.order,p=e.start===void 0?0:e.start,_=p+m,g=0;h==="desc"&&!u&&!f&&(g=Math.max(xV.statSync(i).size-(_+5)*Ade,0));let y=xV.createReadStream(i,{start:g});y.on("error",G=>{mde.error(G)});let T=0,R=[],N="",O;y.on("data",G=>{let Y=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;G=N+G;let q=0,K;for(;(K=Y.exec(G))&&!y.destroyed;){O&&(O.message=G.slice(q,K.index),F(O));let[ce,le,se]=K,pe=se.split("] ["),Ne=pe[0],Ue=pe[1];pe.splice(0,2),O={timestamp:le,thread:Ne,level:Ue,tags:pe,message:""},q=K.index+ce.length}N=G.slice(q)}),y.on("end",G=>{y.destroyed||O&&(O.message=N.trim(),F(O))}),y.resume();function F(G){let Y,q,K;switch(!0){case(a&&l&&d):Y=new Date(G.timestamp),q=new Date(u),K=new Date(f),G.level===c&&Y>=q&&Y<=K&&T<p?T++:G.level===c&&Y>=q&&Y<=K&&(ro(G,h,R),T++,T===_&&y.destroy());break;case(a&&l):Y=new Date(G.timestamp),q=new Date(u),G.level===c&&Y>=q&&T<p?T++:G.level===c&&Y>=q&&(ro(G,h,R),T++,T===_&&y.destroy());break;case(a&&d):Y=new Date(G.timestamp),K=new Date(f),G.level===c&&Y<=K&&T<p?T++:G.level===c&&Y<=K&&(ro(G,h,R),T++,T===_&&y.destroy());break;case(l&&d):Y=new Date(G.timestamp),q=new Date(u),K=new Date(f),Y>=q&&Y<=K&&T<p?T++:Y>=q&&Y<=K&&(ro(G,h,R),T++,T===_&&y.destroy());break;case a:G.level===c&&T<p?T++:G.level===c&&(ro(G,h,R),T++,T===_&&y.destroy());break;case l:Y=new Date(G.timestamp),q=new Date(u),Y>=q&&T<p?T++:Y>=q&&T>=p&&(ro(G,h,R),T++,T===_&&y.destroy());break;case d:Y=new Date(G.timestamp),K=new Date(f),Y<=K&&T<p?T++:Y<=K&&T>=p&&(ro(G,h,R),T++,T===_&&y.destroy());break;default:T<p?T++:(ro(G,h,R),T++,T===_&&y.destroy())}}o(F,"onLogMessage"),await Ede(y,"close");let Z=await r;if(Z.replicated){for(let G of R)G.node=server.hostname;for(let G of Z.replicated){let Y=G.node;if(G.status==="failed")ro({timestamp:new Date().toISOString(),level:"error",node:Y,message:`Error retrieving logs: ${G.reason}`},h,R);else for(let q of G.results)q.node=Y,ro(q,h,R)}}return R}o(bde,"readLog");function ro(e,t,r){t==="desc"?Ide(e,r):t==="asc"?Nde(e,r):r.push(e)}o(ro,"pushLineToResult");function Ide(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)>r?n=i+1:s=i}t.splice(n,0,e)}o(Ide,"insertDescending");function Nde(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)<r?n=i+1:s=i}t.splice(n,0,e)}o(Nde,"insertAscending")});var aT=M((qve,GV)=>{"use strict";var EO=require("joi"),{string:Hd,boolean:FV,date:wde}=EO.types(),Ode=lt(),{validateSchemaExists:Fve,validateTableExists:Hve,validateSchemaName:kve}=Hi(),Cde=(k(),v(W)),Pde=It(),HV=oe();HV.initSync();var Gve=Hd.invalid(HV.get(Cde.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Pde.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),kV={operation:Hd.valid("add_node","update_node","set_node_replication"),node_name:Hd.optional(),subscriptions:EO.array().items({table:Hd.optional(),schema:Hd.optional(),database:Hd.optional(),subscribe:FV.required(),publish:FV.required().custom(Dde),start_time:wde.iso()})};function Lde(e){return Ode.validateBySchema(e,EO.object(kV))}o(Lde,"addUpdateNodeValidator");function Dde(e,t){if(t.state.ancestors[2].operation==="add_node"&&e===!1&&t.state.ancestors[0].subscribe===!1)return t.message(`'subscriptions[${t.state.path[1]}]' subscribe and/or publish must be set to true when adding a node`)}o(Dde,"checkForFalsy");GV.exports={addUpdateNodeValidator:Lde,validationSchema:kV}});var kd=M((Vve,qV)=>{"use strict";var _O=class{static{o(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},gO=class{static{o(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};qV.exports={Node:_O,NodeSubscription:gO}});var VV=M((Yve,$V)=>{"use strict";var Mde=(k(),v(W)).OPERATIONS_ENUM,SO=class{static{o(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Mde.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};$V.exports=SO});var rp=M((zve,KV)=>{"use strict";var TO=class{static{o(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},RO=class{static{o(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,a,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=a,c!==void 0&&(this.attributes=c)}};KV.exports={RemotePayloadObject:TO,RemotePayloadSubscription:RO}});var WV=M((Qve,YV)=>{"use strict";var yO=class{static{o(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,a=0){this.schema=t,this.table=r,this.table_size=n,this.record_count=s,this.transaction_log_size=i,this.transaction_log_record_count=a}};YV.exports=yO});var jV=M((rUe,zV)=>{"use strict";var vde=WV(),Xve=qt(),Zve=_t(),Ude=Q(),{getSchemaPath:eUe,getTransactionAuditStorePath:tUe}=yt(),{getDatabases:xde}=(De(),v(mt));zV.exports=Bde;async function Bde(e){let t=new vde;try{let r=xde()[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){Ude.warn(`unable to stat table dbi due to ${r}`)}return t}o(Bde,"lmdbGetTableSize")});var JV=M((sUe,QV)=>{"use strict";var AO=class{static{o(this,"SystemInformationObject")}constructor(t,r,n,s,i,a,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=a,this.harperdb_processes=c}};QV.exports=AO});var qd=M((uUe,t1)=>{"use strict";var Fde=require("fs-extra"),Hde=require("path"),hn=require("systeminformation"),sc=Q(),XV=mr(),oUe=It(),Gd=(k(),v(W)),kde=jV(),Gde=Ua(),{getThreadInfo:ZV}=rt(),np=oe();np.initSync();var qde=JV(),{openEnvironment:aUe}=_t(),{getSchemaPath:cUe}=yt(),{database:lUe,databases:bO}=(De(),v(mt)),cT;t1.exports={getHDBProcessInfo:OO,getNetworkInfo:PO,getDiskInfo:CO,getMemoryInfo:wO,getCPUInfo:NO,getTimeInfo:IO,getSystemInformation:LO,systemInformation:$de,getTableSize:DO,getMetrics:MO};function IO(){return hn.time()}o(IO,"getTimeInfo");async function NO(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:a,governor:c,socket:l,cache:u,...d}=await hn.cpu();d.cpu_speed=await hn.cpuCurrentSpeed();let{rawCurrentload:f,rawCurrentloadIdle:m,rawCurrentloadIrq:h,rawCurrentloadNice:p,rawCurrentloadSystem:_,rawCurrentloadUser:g,cpus:y,...T}=await hn.currentLoad();return T.cpus=[],y.forEach(R=>{let{rawLoad:N,rawLoadIdle:O,rawLoadIrq:F,rawLoadNice:Z,rawLoadSystem:G,rawLoadUser:Y,...q}=R;T.cpus.push(q)}),d.current_load=T,d}catch(e){return sc.error(`error in getCPUInfo: ${e}`),{}}}o(NO,"getCPUInfo");async function wO(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await hn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return sc.error(`error in getMemoryInfo: ${e}`),{}}}o(wO,"getMemoryInfo");async function OO(){let e={core:[],clustering:[]};try{let t=await hn.processes(),r;try{r=Number.parseInt(await Fde.readFile(Hde.join(np.get(Gd.CONFIG_PARAMS.ROOTPATH),Gd.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===Gd.NODE_ERROR_CODES.ENOENT)sc.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 sc.error(`error in getHDBProcessInfo: ${t}`),e}}o(OO,"getHDBProcessInfo");async function CO(){let e={};try{if(!np.get(Gd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await hn.disksIO();e.io=i;let{rxSec:a,txSec:c,wxSec:l,...u}=await hn.fsStats();return e.read_write=u,e.size=await hn.fsSize(),e}catch(t){return sc.error(`error in getDiskInfo: ${t}`),e}}o(CO,"getDiskInfo");async function PO(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return np.get(Gd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await hn.networkInterfaceDefault(),e.latency=await hn.inetChecksite("google.com"),(await hn.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:a,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrierChanges:f,...m}=n;e.interfaces.push(m)}),(await hn.networkStats()).forEach(n=>{let{rxSec:s,txSec:i,ms:a,...c}=n;e.stats.push(c)})),e}catch(t){return sc.error(`error in getNetworkInfo: ${t}`),e}}o(PO,"getNetworkInfo");async function LO(){if(cT!==void 0)return cT;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:a,...c}=await hn.osInfo();e=c;let l=await hn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,cT=e,cT}catch(t){return sc.error(`error in getSystemInformation: ${t}`),e}}o(LO,"getSystemInformation");async function DO(){let e=[],t=await Gde.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await kde(n));return e}o(DO,"getTableSize");async function MO(){let e={};for(let t in bO){let r=e[t]={},n=r.tables={};for(let s in bO[t])try{let i=bO[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,d,f]=l.trim().split(" ");return{pid:u,thread:d,txnid:f}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}}let a=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=a[l];n[s]=c}catch(i){sc.notify(`Error getting stats for table ${s}: ${i}`)}}return e}o(MO,"getMetrics");async function e1(){if(np.get(Gd.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await XV.getNATSReferences(),t=await XV.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let a={stream_name:n.config.name,database:n.config.subjects[0].split(".")[1],table:n.config.subjects[0].split(".")[2],state:n.state,consumers:s};r.push(a)}return r}}o(e1,"getNatsStreamInfo");async function $de(e){let t=new qde;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await LO(),t.time=IO(),t.cpu=await NO(),t.memory=await wO(),t.disk=await CO(),t.network=await PO(),t.harperdb_processes=await OO(),t.table_size=await DO(),t.metrics=await MO(),t.threads=await ZV(),t.replication=await e1(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await LO();break;case"time":t.time=IO();break;case"cpu":t.cpu=await NO();break;case"memory":t.memory=await wO();break;case"disk":t.disk=await CO();break;case"network":t.network=await PO();break;case"harperdb_processes":t.harperdb_processes=await OO();break;case"table_size":t.table_size=await DO();break;case"database_metrics":case"metrics":t.metrics=await MO();break;case"threads":t.threads=await ZV();break;case"replication":t.replication=await e1();break;default:break}return t}o($de,"systemInformation")});var Ko=M((pUe,i1)=>{"use strict";var Vde=Mn(),vO=ie(),Kde=require("util"),Fl=(k(),v(W)),r1=oe();r1.initSync();var Yde=Ew(),n1=on(),{Node:fUe,NodeSubscription:mUe}=kd(),Wde=Vu(),zde=VV(),{RemotePayloadObject:jde,RemotePayloadSubscription:Qde}=rp(),{handleHDBError:Jde,hdbErrors:Xde}=ge(),{HTTP_STATUS_CODES:Zde,HDB_ERROR_MSGS:efe}=Xde,tfe=ai(),rfe=qd(),{packageJson:nfe}=Rt(),{getDatabases:sfe}=(De(),v(mt)),hUe=Kde.promisify(Yde.authorize),ife=n1.searchByHash,ofe=n1.searchByValue;i1.exports={isEmpty:afe,getNodeRecord:cfe,upsertNodeRecord:lfe,buildNodePayloads:ufe,checkClusteringEnabled:dfe,getAllNodeRecords:ffe,getSystemInfo:mfe,reverseSubscription:s1};function afe(e){return e==null}o(afe,"isEmpty");async function cfe(e){let t=new Wde(Fl.SYSTEM_SCHEMA_NAME,Fl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return ife(t)}o(cfe,"getNodeRecord");async function lfe(e){let t=new zde(Fl.SYSTEM_SCHEMA_NAME,Fl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Vde.upsert(t)}o(lfe,"upsertNodeRecord");function s1(e){if(vO.isEmpty(e.subscribe)||vO.isEmpty(e.publish))throw new Error("Received invalid subscription object");let{schema:t,table:r,hash_attribute:n}=e,s={schema:t,table:r,hash_attribute:n};return e.subscribe===!0&&e.publish===!1?(s.subscribe=!1,s.publish=!0):e.subscribe===!1&&e.publish===!0?(s.subscribe=!0,s.publish=!1):(s.subscribe=e.subscribe,s.publish=e.publish),s}o(s1,"reverseSubscription");function ufe(e,t,r,n){let s=[];for(let i=0,a=e.length;i<a;i++){let c=e[i],{schema:l,table:u}=c,d=vO.getTableHashAttribute(l,u),{subscribe:f,publish:m}=s1(c),h=sfe()[l]?.[u],p=new Qde(l,u,d,m,f,c.start_time,h.schemaDefined?h.attributes:void 0);s.push(p)}return new jde(r,t,s,n)}o(ufe,"buildNodePayloads");function dfe(){if(!r1.get(Fl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw Jde(new Error,efe.CLUSTERING_NOT_ENABLED,Zde.BAD_REQUEST,void 0,void 0,!0)}o(dfe,"checkClusteringEnabled");async function ffe(){let e=new tfe(Fl.SYSTEM_SCHEMA_NAME,Fl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await ofe(e))}o(ffe,"getAllNodeRecords");async function mfe(){let e=await rfe.getSystemInformation();return{hdb_version:nfe.version,node_version:e.node_version,platform:e.platform}}o(mfe,"getSystemInfo")});var UO=M((_Ue,m1)=>{"use strict";var lT=mr(),o1=ie(),a1=It(),c1=(k(),v(W)),uT=Q(),l1=ep(),hfe=km(),{RemotePayloadObject:pfe}=rp(),{handleHDBError:u1,hdbErrors:Efe}=ge(),{HTTP_STATUS_CODES:d1}=Efe,{NodeSubscription:f1}=kd();m1.exports=_fe;async function _fe(e,t){let r;try{r=await lT.request(`${t}.${a1.REQUEST_SUFFIX}`,new pfe(c1.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),uT.trace("Response from remote describe all request:",r)}catch(a){uT.error(`addNode received error from describe all request to remote node: ${a}`);let c=lT.requestErrorHandler(a,"add_node",t);throw u1(new Error,c,d1.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===a1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let a=`Error returned from remote node ${t}: ${r.message}`;throw u1(new Error,a,d1.INTERNAL_SERVER_ERROR,"error",a)}let n=r.message,s=[],i=[];for(let a of e){let{table:c}=a,l=a.database??a.schema??"data";if(l===c1.SYSTEM_SCHEMA_NAME){await lT.createLocalTableStream(l,c);let p=new f1(l,c,a.publish,a.subscribe);p.start_time=a.start_time,i.push(p);continue}let u=o1.doesSchemaExist(l),d=n[l]!==void 0,f=c?o1.doesTableExist(l,c):!0,m=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!f&&!m){s.push(a);continue}if(!u&&d&&(uT.trace(`addNode creating schema: ${l}`),await l1.createSchema({operation:"create_schema",schema:l})),!f&&m){uT.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let p=new hfe(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(p.attributes=n[l][c].attributes),await l1.createTable(p)}await lT.createLocalTableStream(l,c);let h=new f1(l,c,a.publish,a.subscribe);h.start_time=a.start_time,i.push(h)}return{added:i,skipped:s}}o(_fe,"reviewSubscriptions")});var $d={};Oe($d,{addNodeBack:()=>xO,removeNodeBack:()=>BO,setNode:()=>Rfe});async function Rfe(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=pi(t)):t=ZS(r);let n=(0,p1.validateBySchema)(e,Tfe);if(n)throw(0,Yo.handleHDBError)(n,n.message,Sfe.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new Yo.ClientError("url or hostname is required for remove_node operation");let h=r,p=Kt(),_=await p.get(h);if(!_)throw new Yo.ClientError(h+" does not exist");try{await Xh({url:_.url},{operation:$.REMOVE_NODE_BACK,name:_?.subscriptions?.length>0?Ze():h},void 0)}catch(g){cs.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 p.delete(h),`Successfully removed '${h}' from cluster`}if(!t)throw new Yo.ClientError("url required for this operation");let s=ja();if(s==null)throw new Yo.ClientError("replication url is missing from harperdb-config.yaml");let i,a,c;if(t?.startsWith("wss:")){i=await(0,Ms.getReplicationCert)();let h=await(0,Ms.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(a=await(0,Ms.createCsr)(),cs.info("Sending CSR to target node:",t)):h&&(c=h.certificate,cs.info("Sending CA named",h.name,"to target node",t))}let l={operation:$.ADD_NODE_BACK,hostname:(0,oc.get)(U.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:a,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,oc.get)(U.REPLICATION_SHARD)!==void 0&&(l.shard=(0,oc.get)(U.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(h1):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let h=h1(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,d;try{u=await Xh({url:t},l,e)}catch(h){h.message=`Error returned from ${t}: `+h.message,cs.warn("Error adding node:",t,"to cluster:",h),d=h}if(a&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw d?(d.message+=" and connection was required to sign certificate",d):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);a&&(cs.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ms.setCertTable)({name:gfe.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ms.setCertTable)({name:Ze(),uses:["https","operations","wss"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let f={url:t,ca:u?.usingCA};if(e.hostname&&(f.name=e.hostname),e.subscriptions?f.subscriptions=e.subscriptions:f.replicates=!0,e.start_time&&(f.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(f.authorization=e.authorization),e.revoked_certificates&&(f.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?f.shard=u.shard:e.shard!==void 0&&(f.shard=e.shard),f.replicates){let h={url:s,ca:c,replicates:!0,subscriptions:null};(0,oc.get)(U.REPLICATION_SHARD)!==void 0&&(h.shard=(0,oc.get)(U.REPLICATION_SHARD)),e.retain_authorization&&(h.authorization=e.authorization),e.start_time&&(h.start_time=e.start_time),await Ho(Ze(),h)}await Ho(u?u.nodeName:f.name??pi(t),f);let m;return e.operation==="update_node"?m=`Successfully updated '${t}'`:m=`Successfully added '${t}' to cluster`,d&&(m+=" but there was an error updating target node: "+d.message),m}async function xO(e){cs.trace("addNodeBack received request:",e);let t=await(0,Ms.signCertificate)(e),r;e.csr?(r=t.signingCA,cs.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,cs.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,Ms.getReplicationCertAuth)();if(n.replicates){let i={url:ja(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,oc.get)(U.REPLICATION_SHARD)!==void 0&&(i.shard=(0,oc.get)(U.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Ho(Ze(),i)}return await Ho(e.hostname,n),t.nodeName=Ze(),t.usingCA=s?.certificate,cs.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function BO(e){cs.trace("removeNodeBack received request:",e),await Kt().delete(e.name)}function h1(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ms,p1,ic,oc,cs,Yo,gfe,Sfe,Tfe,Vd=ue(()=>{Ms=w(as()),p1=w(lt()),ic=w(require("joi")),oc=w(oe());k();Wh();Ll();is();cs=w(Q()),Yo=w(ge()),{pki:gfe}=require("node-forge"),{HTTP_STATUS_CODES:Sfe}=Yo.hdbErrors,Tfe=ic.default.object({hostname:ic.default.string(),verify_tls:ic.default.boolean(),replicates:ic.default.boolean(),subscriptions:ic.default.array(),revoked_certificates:ic.default.array(),shard:ic.default.number()});o(Rfe,"setNode");o(xO,"addNodeBack");o(BO,"removeNodeBack");o(h1,"reverseSubscription")});var pT=M((NUe,_1)=>{"use strict";var{handleHDBError:dT,hdbErrors:yfe}=ge(),{HTTP_STATUS_CODES:fT}=yfe,{addUpdateNodeValidator:Afe}=aT(),mT=Q(),hT=(k(),v(W)),E1=It(),bfe=ie(),sp=mr(),ip=Ko(),FO=oe(),Ife=UO(),{Node:Nfe,NodeSubscription:wfe}=kd(),{broadcast:Ofe}=rt(),{setNode:Cfe}=(Vd(),v($d)),bUe=oe(),IUe=(k(),v(W)),Pfe="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Lfe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Dfe=FO.get(hT.CONFIG_PARAMS.CLUSTERING_NODENAME);_1.exports=Mfe;async function Mfe(e,t=!1){if(mT.trace("addNode called with:",e),FO.get(hT.CONFIG_PARAMS.REPLICATION_URL)||FO.get(hT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Cfe(e);ip.checkClusteringEnabled();let r=Afe(e);if(r)throw dT(r,r.message,fT.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let f=await ip.getNodeRecord(n);if(!bfe.isEmptyOrZeroLength(f))throw dT(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,fT.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Ife(e.subscriptions,n),a={message:void 0,added:s,skipped:i};if(s.length===0)return a.message=Pfe,a;let c=ip.buildNodePayloads(s,Dfe,hT.OPERATIONS_ENUM.ADD_NODE,await ip.getSystemInfo()),l=[];for(let f=0,m=s.length;f<m;f++){let h=s[f];s[f].start_time===void 0&&delete s[f].start_time,l.push(new wfe(h.schema,h.table,h.publish,h.subscribe))}mT.trace("addNode sending remote payload:",c);let u;try{u=await sp.request(`${n}.${E1.REQUEST_SUFFIX}`,c)}catch(f){mT.error(`addNode received error from request: ${f}`);for(let h=0,p=s.length;h<p;h++){let _=s[h];_.publish=!1,_.subscribe=!1,await sp.updateRemoteConsumer(_,n)}let m=sp.requestErrorHandler(f,"add_node",n);throw dT(new Error,m,fT.INTERNAL_SERVER_ERROR,"error",m)}if(u.status===E1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${n}: ${u.message}`;throw dT(new Error,f,fT.INTERNAL_SERVER_ERROR,"error",f)}mT.trace(u);for(let f=0,m=s.length;f<m;f++){let h=s[f];await sp.updateRemoteConsumer(h,n),h.subscribe===!0&&await sp.updateConsumerIterator(h.schema,h.table,n,"start")}let d=new Nfe(n,l,u.system_info);return await ip.upsertNodeRecord(d),Ofe({type:"nats_update"}),i.length>0?a.message=Lfe:a.message=`Successfully added '${n}' to manifest`,a}o(Mfe,"addNode")});var qO=M((CUe,S1)=>{"use strict";var{handleHDBError:HO,hdbErrors:vfe}=ge(),{HTTP_STATUS_CODES:kO}=vfe,{addUpdateNodeValidator:Ufe}=aT(),op=Q(),ET=(k(),v(W)),g1=It(),OUe=ie(),ap=mr(),cp=Ko(),GO=oe(),{cloneDeep:xfe}=require("lodash"),Bfe=UO(),{Node:Ffe,NodeSubscription:Hfe}=kd(),{broadcast:kfe}=rt(),{setNode:Gfe}=(Vd(),v($d)),qfe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",$fe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Vfe=GO.get(ET.CONFIG_PARAMS.CLUSTERING_NODENAME);S1.exports=Kfe;async function Kfe(e){if(op.trace("updateNode called with:",e),GO.get(ET.CONFIG_PARAMS.REPLICATION_URL)??GO.get(ET.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Gfe(e);cp.checkClusteringEnabled();let t=Ufe(e);if(t)throw HO(t,t.message,kO.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await cp.getNodeRecord(r);s.length>0&&(n=xfe(s));let{added:i,skipped:a}=await Bfe(e.subscriptions,r),c={message:void 0,updated:i,skipped:a};if(i.length===0)return c.message=qfe,c;let l=cp.buildNodePayloads(i,Vfe,ET.OPERATIONS_ENUM.UPDATE_NODE,await cp.getSystemInfo());for(let d=0,f=i.length;d<f;d++){let m=i[d];op.trace(`updateNode updating work stream for node: ${r} subscription:`,m),i[d].start_time===void 0&&delete i[d].start_time}op.trace("updateNode sending remote payload:",l);let u;try{u=await ap.request(`${r}.${g1.REQUEST_SUFFIX}`,l)}catch(d){op.error(`updateNode received error from request: ${d}`);let f=ap.requestErrorHandler(d,"update_node",r);throw HO(new Error,f,kO.INTERNAL_SERVER_ERROR,"error",f)}if(u.status===g1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw HO(new Error,d,kO.INTERNAL_SERVER_ERROR,"error",d)}op.trace(u);for(let d=0,f=i.length;d<f;d++){let m=i[d];await ap.updateRemoteConsumer(m,r),m.subscribe===!0?await ap.updateConsumerIterator(m.schema,m.table,r,"start"):await ap.updateConsumerIterator(m.schema,m.table,r,"stop")}return n||(n=[new Ffe(r,[],u.system_info)]),await Yfe(n[0],i,u.system_info),a.length>0?c.message=$fe:c.message=`Successfully updated '${r}'`,c}o(Kfe,"updateNode");async function Yfe(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let a=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let d=n.subscriptions[l];if(d.schema===a.schema&&d.table===a.table){d.publish=a.publish,d.subscribe=a.subscribe,c=!0;break}}c||n.subscriptions.push(new Hfe(a.schema,a.table,a.publish,a.subscribe))}n.system_info=r,await cp.upsertNodeRecord(n),kfe({type:"nats_update"})}o(Yfe,"updateNodeTable")});var b1=M((LUe,A1)=>{"use strict";var y1=require("joi"),{string:T1}=y1.types(),Wfe=lt(),R1=(k(),v(W)),zfe=oe(),jfe=It();A1.exports=Qfe;function Qfe(e){let t=T1.invalid(zfe.get(R1.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(jfe.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=y1.object({operation:T1.valid(R1.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return Wfe.validateBySchema(e,r)}o(Qfe,"removeNodeValidator")});var _T=M((MUe,C1)=>{"use strict";var{handleHDBError:I1,hdbErrors:Jfe}=ge(),{HTTP_STATUS_CODES:N1}=Jfe,Xfe=b1(),lp=Q(),w1=Ko(),Zfe=ie(),Kd=(k(),v(W)),O1=It(),$O=mr(),VO=oe(),{RemotePayloadObject:eme}=rp(),{NodeSubscription:tme}=kd(),rme=Hm(),nme=pl(),{broadcast:sme}=rt(),{setNode:ime}=(Vd(),v($d)),ome=VO.get(Kd.CONFIG_PARAMS.CLUSTERING_NODENAME);C1.exports=ame;async function ame(e){if(lp.trace("removeNode called with:",e),VO.get(Kd.CONFIG_PARAMS.REPLICATION_URL)??VO.get(Kd.CONFIG_PARAMS.REPLICATION_HOSTNAME))return ime(e);w1.checkClusteringEnabled();let t=Xfe(e);if(t)throw I1(t,t.message,N1.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await w1.getNodeRecord(r);if(Zfe.isEmptyOrZeroLength(n))throw I1(new Error,`Node '${r}' was not found.`,N1.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new eme(Kd.OPERATIONS_ENUM.REMOVE_NODE,ome,[]),i,a=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await $O.updateConsumerIterator(d.schema,d.table,r,"stop");try{await $O.updateRemoteConsumer(new tme(d.schema,d.table,!1,!1),r)}catch(f){lp.error(f)}}try{i=await $O.request(`${r}.${O1.REQUEST_SUFFIX}`,s),lp.trace("Remove node reply from remote node:",r,i)}catch(l){lp.error("removeNode received error from request:",l),a=!0}let c=new rme(Kd.SYSTEM_SCHEMA_NAME,Kd.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await nme.deleteRecord(c),sme({type:"nats_update"}),i?.status===O1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||a?(lp.error("Error returned from remote node:",r,i?.message),`Successfully removed '${r}' from local manifest, however there was an error reaching remote node. Check the logs for more details.`):`Successfully removed '${r}' from manifest`}o(ame,"removeNode")});var D1=M((UUe,L1)=>{"use strict";var P1=require("joi"),{string:cme,array:lme}=P1.types(),ume=lt(),dme=aT();L1.exports=fme;function fme(e){let t=P1.object({operation:cme.valid("configure_cluster").required(),connections:lme.items(dme.validationSchema).required()});return ume.validateBySchema(e,t)}o(fme,"configureClusterValidator")});var KO=M((BUe,B1)=>{"use strict";var M1=(k(),v(W)),gT=Q(),mme=ie(),hme=oe(),pme=_T(),Eme=pT(),_me=Ko(),gme=D1(),{handleHDBError:v1,hdbErrors:Sme}=ge(),{HTTP_STATUS_CODES:U1}=Sme,Tme="Configure cluster complete.",Rme="Failed to configure the cluster. Check the logs for more details.",yme="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";B1.exports=Ame;async function Ame(e){gT.trace("configure cluster called with:",e);let t=gme(e);if(t)throw v1(t,t.message,U1.BAD_REQUEST,void 0,void 0,!0);let r=await _me.getAllNodeRecords(),n=[];if(hme.get(M1.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,f=r.length;d<f;d++){let m=await x1(pme,{operation:M1.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(m)}gT.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let f=e.connections[d],m=await x1(Eme,f,f.node_name);s.push(m)}gT.trace("All results from configure_cluster add node:",s);let a=[],c=[],l=!1,u=n.concat(s);for(let d=0,f=u.length;d<f;d++){let m=u[d];m.status==="rejected"&&(gT.error(m.node_name,m?.error?.message,m?.error?.stack),a.includes(m.node_name)||a.push(m.node_name)),(m?.result?.message?.includes?.("Successfully")||m?.result?.includes?.("Successfully"))&&(l=!0),!(typeof m.result=="string"&&m.result.includes("Successfully removed")||m.status==="rejected")&&c.push({node_name:m?.node_name,response:m?.result})}if(mme.isEmptyOrZeroLength(a))return{message:Tme,connections:c};if(l)return{message:yme,failed_nodes:a,connections:c};throw v1(new Error,Rme,U1.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}o(Ame,"configureCluster");async function x1(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}o(x1,"functionWrapper")});var G1=M((HUe,k1)=>{"use strict";var up=require("joi"),bme=lt(),{validateSchemaExists:F1,validateTableExists:Ime,validateSchemaName:H1}=Hi(),Nme=up.object({operation:up.string().valid("purge_stream"),schema:up.string().custom(F1).custom(H1).optional(),database:up.string().custom(F1).custom(H1).optional(),table:up.string().custom(Ime).required()});function wme(e){return bme.validateBySchema(e,Nme)}o(wme,"purgeStreamValidator");k1.exports=wme});var YO=M((GUe,q1)=>{"use strict";var{handleHDBError:Ome,hdbErrors:Cme}=ge(),{HTTP_STATUS_CODES:Pme}=Cme,Lme=G1(),Dme=mr(),Mme=Ko();q1.exports=vme;async function vme(e){e.schema=e.schema??e.database;let t=Lme(e);if(t)throw Ome(t,t.message,Pme.BAD_REQUEST,void 0,void 0,!0);Mme.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Dme.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}o(vme,"purgeStream")});var jO=M(($Ue,j1)=>{"use strict";var zO=Ko(),Ume=mr(),TT=oe(),Yd=(k(),v(W)),Hl=It(),xme=ie(),WO=Q(),{RemotePayloadObject:Bme}=rp(),{ErrorCode:$1}=require("nats"),{parentPort:V1}=require("worker_threads"),{onMessageByType:Fme}=rt(),{getThisNodeName:Hme}=(is(),v(Go)),{requestClusterStatus:kme}=(Wh(),v(h$)),{getReplicationSharedStatus:Gme,getHDBNodeTable:qme}=(Ll(),v(Fw)),{CONFIRMATION_STATUS_POSITION:$me,RECEIVED_VERSION_POSITION:Vme,RECEIVED_TIME_POSITION:Kme,SENDING_TIME_POSITION:Yme,RECEIVING_STATUS_POSITION:Wme,RECEIVING_STATUS_RECEIVING:zme}=(oO(),v(nV)),K1=TT.get(Yd.CONFIG_PARAMS.CLUSTERING_ENABLED),Y1=TT.get(Yd.CONFIG_PARAMS.CLUSTERING_NODENAME);j1.exports={clusterStatus:jme,buildNodeStatus:z1};var W1;Fme("cluster-status",async e=>{W1(e)});async function jme(){if(TT.get(Yd.CONFIG_PARAMS.REPLICATION_URL)||TT.get(Yd.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(V1){V1.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{W1=i});for(let i of n.connections){let a=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let f of Object.values(databases[l]||{}))if(u=f.auditStore,u)break;if(!u)continue;let d=Gme(u,l,a);c.lastCommitConfirmed=ST(d[$me]),c.lastReceivedRemoteTime=ST(d[Vme]),c.lastReceivedLocalTime=ST(d[Kme]),c.sendingMessage=ST(d[Yme]),c.lastReceivedStatus=d[Wme]===zme?"Receiving":"Waiting"}}}else n=kme();n.node_name=Hme();let s=qme().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:Y1,is_enabled:K1,connections:[]};if(!K1)return e;let t=await zO.getAllNodeRecords();if(xme.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(z1(t[n],e.connections));return await Promise.allSettled(r),e}o(jme,"clusterStatus");function ST(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}o(ST,"asDate");async function z1(e,t){let r=e.name,n=new Bme(Yd.OPERATIONS_ENUM.CLUSTER_STATUS,Y1,void 0,await zO.getSystemInfo()),s,i,a=Hl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Ume.request(Hl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Hl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(a=Hl.CLUSTER_STATUS_STATUSES.CLOSED,WO.error(`Error getting node status from ${r} `,s))}catch(l){WO.warn(`Error getting node status from ${r}`,l),l.code===$1.NoResponders?a=Hl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===$1.Timeout?a=Hl.CLUSTER_STATUS_STATUSES.TIMEOUT:a=Hl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Qme(r,a,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==Yd.PRE_4_0_0_VERSION&&await zO.upsertNodeRecord(l)}catch(l){WO.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}o(z1,"buildNodeStatus");function Qme(e,t,r,n,s,i,a,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=a,this.system_info=c}o(Qme,"NodeStatusObject")});var JO=M((KUe,Q1)=>{"use strict";var{handleHDBError:Jme,hdbErrors:Xme}=ge(),{HTTP_STATUS_CODES:Zme}=Xme,ehe=mr(),the=Ko(),QO=ie(),RT=require("joi"),rhe=lt(),nhe=2e3,she=RT.object({timeout:RT.number().min(1),connected_nodes:RT.boolean(),routes:RT.boolean()});Q1.exports=ihe;async function ihe(e){the.checkClusteringEnabled();let t=rhe.validateBySchema(e,she);if(t)throw Jme(t,t.message,Zme.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||QO.autoCastBoolean(n),a=s===void 0||QO.autoCastBoolean(s),c={nodes:[]},l=await ehe.getServerList(r??nhe),u={};if(i)for(let d=0,f=l.length;d<f;d++){let m=l[d].statsz;m&&(u[l[d].server.name]=m.routes)}for(let d=0,f=l.length;d<f;d++){if(l[d].statsz)continue;let m=l[d].server,h=l[d].data;if(m.name.endsWith("-hub")){let p={name:m.name.slice(0,-4),response_time:l[d].response_time};i&&(p.connected_nodes=[],u[m.name]&&u[m.name].forEach(_=>{p.connected_nodes.includes(_.name.slice(0,-4))||p.connected_nodes.push(_.name.slice(0,-4))})),a&&(p.routes=h.cluster?.urls?h.cluster?.urls.map(_=>({host:_.split(":")[0],port:QO.autoCast(_.split(":")[1])})):[]),c.nodes.push(p)}}return c}o(ihe,"clusterNetwork")});var eK=M((WUe,Z1)=>{"use strict";var XO=require("joi"),J1=lt(),{routeConstraints:X1}=VI();Z1.exports={setRoutesValidator:ohe,deleteRoutesValidator:ahe};function ohe(e){let t=XO.object({server:XO.valid("hub","leaf"),routes:X1.required()});return J1.validateBySchema(e,t)}o(ohe,"setRoutesValidator");function ahe(e){let t=XO.object({routes:X1.required()});return J1.validateBySchema(e,t)}o(ahe,"deleteRoutesValidator")});var yT=M((jUe,aK)=>{"use strict";var Wo=bt(),ZO=ie(),vs=(k(),v(W)),Wd=oe(),tK=eK(),{handleHDBError:rK,hdbErrors:che}=ge(),{HTTP_STATUS_CODES:nK}=che,sK="cluster routes successfully set",iK="cluster routes successfully deleted";aK.exports={setRoutes:uhe,getRoutes:dhe,deleteRoutes:fhe};function lhe(e){let t=Wo.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let a=0,c=e.routes.length;a<c;a++){let l=e.routes[a];l.port=ZO.autoCast(l.port);let u=r.some(f=>f.host===l.host&&f.port===l.port),d=n.some(f=>f.host===l.host&&f.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?Wo.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):Wo.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:sK,set:i,skipped:s}}o(lhe,"setRoutesNats");function uhe(e){let t=tK.setRoutesValidator(e);if(t)throw rK(t,t.message,nK.BAD_REQUEST,void 0,void 0,!0);if(Wd.get(vs.CONFIG_PARAMS.CLUSTERING_ENABLED))return lhe(e);let r=[],n=[],s=Wd.get(vs.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{oK(s,i)?n.push(i):(s.push(i),r.push(i))}),Wo.updateConfigValue(vs.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:sK,set:r,skipped:n}}o(uhe,"setRoutes");function oK(e,t){return typeof t=="string"?e.includes(t):typeof t=="object"&&t!==null?e.some(r=>(r.host===t.host||r.hostname===t.hostname)&&r.port===t.port):!1}o(oK,"existsInArray");function dhe(){if(Wd.get(vs.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=Wo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Wd.get(vs.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}o(dhe,"getRoutes");function fhe(e){let t=tK.deleteRoutesValidator(e);if(t)throw rK(t,t.message,nK.BAD_REQUEST,void 0,void 0,!0);if(Wd.get(vs.CONFIG_PARAMS.CLUSTERING_ENABLED))return mhe(e);let r=[],n=[],s=Wd.get(vs.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(a=>{oK(e.routes,a)?r.push(a):(i.push(a),n.push(a))}),Wo.updateConfigValue(vs.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:iK,deleted:r,skipped:n}}o(fhe,"deleteRoutes");function mhe(e){let t=Wo.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],a=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let d=e.routes[l],f=!1;for(let m=0,h=r.length;m<h;m++){let p=r[m];if(d.host===p.host&&d.port===p.port){r.splice(m,1),f=!0,a=!0,s.push(d);break}}if(!f){let m=!0;for(let h=0,p=n.length;h<p;h++){let _=n[h];if(d.host===_.host&&d.port===_.port){n.splice(h,1),c=!0,m=!1,s.push(d);break}}m&&i.push(d)}}return a&&(r=ZO.isEmptyOrZeroLength(r)?null:r,Wo.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=ZO.isEmptyOrZeroLength(n)?null:n,Wo.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:iK,deleted:s,skipped:i}}o(mhe,"deleteRoutesNats")});var lK=M((JUe,cK)=>{"use strict";var dp=require("alasql"),kl=require("recursive-iterator"),gi=Q(),hhe=ie(),fp=(k(),v(W)),eC=class{static{o(this,"sqlStatementBucket")}constructor(t){this.ast=t,this.affected_attributes=new Map,this.table_lookup=new Map,this.schema_lookup=new Map,this.table_to_schema_lookup=new Map,Ehe(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=>fp.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=>!fp.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,a=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[a]&&t[i].tables[a][fp.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[a].attribute_permissions.length>0?c=phe(t[i].tables[a].attribute_permissions):c=global.hdb_schema[i][a].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(a).filter(u=>!fp.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new dp.yy.Column({columnid:u});s.tableid&&(d.tableid=s.tableid),this.ast.columns.push(d),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(a,l)}}),this.ast}};function phe(e){return e.filter(t=>t[fp.PERMS_CRUD_ENUM.READ])}o(phe,"filterReadRestrictedAttrs");function Ehe(e,t,r,n,s){_he(e,t,r,n,s)}o(Ehe,"interpretAST");function mp(e,t,r,n,s){if(!(!e||!e.databaseid)&&(t.has(e.databaseid)||t.set(e.databaseid,new Map),t.get(e.databaseid).has(e.tableid)||t.get(e.databaseid).set(e.tableid,[]),e.as&&(r.has(e.as)||r.set(e.as,e.tableid),n&&!n.has(e.as)&&n.set(e.as,e.databaseid)),s)){let i=e.databaseid,a=e.tableid;e.as&&(a=e.as),s.set(a,i)}}o(mp,"addSchemaTableToMap");function _he(e,t,r,n,s){if(!e){gi.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof dp.yy.Insert?Rhe(e,t,r):e instanceof dp.yy.Select?ghe(e,t,r,n,s):e instanceof dp.yy.Update?She(e,t,r):e instanceof dp.yy.Delete?The(e,t,r):gi.error("AST in getRecordAttributesAST() is not a valid SQL type.")}o(_he,"getRecordAttributesAST");function ghe(e,t,r,n,s){if(!e){gi.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(hhe.isEmptyOrZeroLength(i)){gi.error("No schema specified");return}e.from.forEach(c=>{mp(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),mp(c.table,t,r,n,s)});let a=new kl(e.columns);for(let{node:c}of a)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{gi.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 kl(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let d=u.tableid?u.tableid:l;if(!t.get(i).has(d))if(r.has(d))d=r.get(d);else{gi.info(`table specified as ${d} not found.`);continue}t.get(i).get(d).indexOf(u.columnid)<0&&t.get(i).get(d).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new kl(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,f=s.get(d);if(!t.get(f).has(d))if(r.has(d))d=r.get(d);else{gi.info(`table specified as ${d} not found.`);continue}t.get(f).get(d).indexOf(u.columnid)<0&&t.get(f).get(d).push(u.columnid)}}),e.order){let c=new kl(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,d=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(d).has(u))if(r.has(u))u=r.get(u);else{gi.info(`table specified as ${u} not found.`);return}t.get(d).get(u).indexOf(l.columnid)<0&&t.get(d).get(u).push(l.columnid)}}}o(ghe,"getSelectAttributes");function She(e,t,r){if(!e){gi.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new kl(e.columns),s=e.table.databaseid;mp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&tC(e.table.tableid,s,i.columnid,t,r)}o(She,"getUpdateAttributes");function The(e,t,r){if(!e){gi.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new kl(e.where),s=e.table.databaseid;mp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&tC(e.table.tableid,s,i.columnid,t,r)}o(The,"getDeleteAttributes");function Rhe(e,t,r){if(!e){gi.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new kl(e.columns),s=e.into.databaseid;mp(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&tC(e.into.tableid,s,i.columnid,t,r)}o(Rhe,"getInsertAttributes");function tC(e,t,r,n,s){if(!n.get(t))return;let i=e;n.get(t).has(i)||(i=s.get(i)),n.get(t).get(i).push(r)}o(tC,"pushAttribute");cK.exports=eC});var dK=M((ZUe,uK)=>{"use strict";var AT=(k(),v(W)),bT=class{static{o(this,"BaseLicense")}constructor(t=0,r=AT.RAM_ALLOCATION_ENUM.DEFAULT,n=AT.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},rC=class extends bT{static{o(this,"ExtendedLicense")}constructor(t=0,r=AT.RAM_ALLOCATION_ENUM.DEFAULT,n=AT.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};uK.exports={BaseLicense:bT,ExtendedLicense:rC}});var Qd=M((t0e,_K)=>{"use strict";var jd=require("fs-extra"),IT=(mg(),v(fg)),mK=require("crypto"),yhe=require("moment"),Ahe=require("uuid").v4,pn=Q(),sC=require("path"),bhe=ie(),Gl=(k(),v(W)),{totalmem:fK}=require("os"),Ihe=dK().ExtendedLicense,zd="invalid license key format",Nhe="061183",whe="mofi25",Ohe="aes-256-cbc",Che=16,Phe=32,hK=oe(),{resolvePath:pK}=bt();hK.initSync();var nC;_K.exports={validateLicense:EK,generateFingerPrint:Dhe,licenseSearch:aC,getLicense:Uhe,checkMemoryLimit:xhe};function iC(){return sC.join(hK.getHdbBasePath(),Gl.LICENSE_KEY_DIR_NAME,Gl.LICENSE_FILE_NAME)}o(iC,"getLicenseDirPath");function Lhe(){let e=iC();return pK(sC.join(e,Gl.LICENSE_FILE_NAME))}o(Lhe,"getLicenseFilePath");function oC(){let e=iC();return pK(sC.join(e,Gl.REG_KEY_FILE_NAME))}o(oC,"getFingerPrintFilePath");async function Dhe(){let e=oC();try{return await jd.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Mhe();throw pn.error(`Error writing fingerprint file to ${e}`),pn.error(t),new Error("There was an error generating the fingerprint")}}o(Dhe,"generateFingerPrint");async function Mhe(){let e=Ahe(),t=IT.hash(e,IT.HASH_FUNCTION.MD5),r=oC();try{await jd.mkdirp(iC()),await jd.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw pn.error(`Error writing fingerprint file to ${r}`),pn.error(n),new Error("There was an error generating the fingerprint")}return t}o(Mhe,"writeFingerprint");function EK(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:Gl.RAM_ALLOCATION_ENUM.DEFAULT,version:Gl.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return pn.error("empty license key passed to validate."),r;let n=oC(),s=!1;try{s=jd.statSync(n)}catch(i){pn.error(i)}if(s){let i;try{i=jd.readFileSync(n,"utf8")}catch{pn.error("error validating this machine in the license"),r.valid_machine=!1;return}let a=e.split(whe),c=a[1];c=Buffer.concat([Buffer.from(c)],Che);let l=Buffer.concat([Buffer.from(i)],Phe),u=mK.createDecipheriv(Ohe,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let d=null;try{d=u.update(a[0],"hex","utf8"),d.trim(),d+=u.final("utf8")}catch{let h=vhe(a[0],i);if(h)d=h;else throw r.valid_license=!1,r.valid_machine=!1,console.error(zd),pn.error(zd),new Error(zd)}let f;if(isNaN(d))try{f=JSON.parse(d),r.version=f.version,r.exp_date=f.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),f.ram_allocation&&(r.ram_allocation=f.ram_allocation)}catch{throw console.error(zd),pn.error(zd),new Error(zd)}else r.exp_date=d;r.exp_date<yhe().valueOf()&&(r.valid_date=!1),IT.validate(a[1],`${Nhe}${i}${t}`,IT.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||pn.error("Invalid licence"),r}o(EK,"validateLicense");function vhe(e,t){try{let r=mK.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{pn.warn("Check old license failed")}}o(vhe,"checkOldLicense");function aC(){let e=new Ihe,t=[];try{t=jd.readFileSync(Lhe(),"utf-8").split(`\r
|
|
23
|
+
`+Ml.get(g.issuer)),!p||!_)throw new Error("Missing private key or certificate for secure server");let y={ciphers:f.ciphers,ticketKeys:tue(),availableCAs:Ml,ca:t&&Array.from(Ml.values()),cert:_,key:p,key_file:f.private_key_name,is_self_signed:f.is_self_signed};a&&(y.sessionIdContext=a.sessionIdContext);let T=vS.createSecureContext(y);T.name=f.name,T.options=y,T.quality=h,T.certificateAuthorities=Array.from(Ml),T.certStart=_.toString().slice(0,100);let R=f.hostnames??Xw(g);Array.isArray(R)||(R=[R]);let N;for(let O of R)if(O){O[0]==="*"&&(s=!0,O=O.slice(1)),O===$w()&&(h+=2),T$.isIP(O)&&(N=!0);let F=r.get(O)?.quality??0;h>F&&r.set(O,T)}else Qa.error("No hostname found for certificate at",vS.certificate);Qa.trace("Adding TLS",T.name,"for",a.ports||"client","cert named",f.name,"hostnames",R,"quality",h,"best quality",d),h>d&&(i.defaultContext=n=T,d=h,a&&(a.defaultContext=T))}catch(m){Qa.error("Error applying TLS for",f.name,m)}a?.secureContextsListeners.forEach(f=>f()),c(n)}catch(d){l(d)}}o(u,"updateTLS"),MS?.system.hdb_certificate.subscribe({listener:o(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(a,c){Qa.info("TLS requested for",a||"(no SNI)");let l=a;for(;;){let d=r.get(l);if(d)return Qa.debug("Found certificate for",a,d.certStart),d.updatedContext&&(d=d.updatedContext),c(null,d);if(s&&l){let f=l.indexOf(".",1);f<0?l="":l=l.slice(f)}else break}a?Qa.debug("No certificate found to match",a,"using the default certificate"):Qa.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):Qa.info("No default certificate found"),c(null,u)}o(i,"SNICallback")}o(M$,"createTLSSelector");async function v$(e){let t=Xa.get(e);return!t&&e?await Bn.readFile(hr.join(os.get(vl.ROOTPATH),Ls.LICENSE_KEY_DIR_NAME,e),"utf8"):t}o(v$,"getPrivateKeyByName");async function U$(){Za();let e=[];for await(let t of Jr.search([]))e.push(t);return e}o(U$,"listCertificates");async function due(e){let t=Kw(e,Ei.object({name:Ei.string().required(),certificate:Ei.string().required(),is_authority:Ei.boolean().required(),private_key:Ei.string(),hosts:Ei.array(),uses:Ei.array()}));if(t)throw new Ja(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,a=new ko(n),c=!1,l=!1,u;for(let[h,p]of Xa)!s&&!c&&a.checkPrivateKey(R$(p))&&(c=!0,u=h),s&&s===p&&(l=!0,u=h);if(!i&&!s&&!c)throw new Ja("A suitable private key was not found for this certificate");let d;if(!r){try{d=Jw(a)}catch(h){ht.error(h)}if(d==null)throw new Ja("Error extracting certificate host name, please provide a name parameter")}let f=fue(r??d);s&&!c&&!l&&(await Bn.writeFile(hr.join(os.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME,f+".pem"),s),Xa.set(f,s));let m={name:r??d,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(m.private_key_name=u??f+".pem"),e.ciphers&&(m.ciphers=e.ciphers),await Ld(m),"Successfully added certificate: "+f}o(due,"addCertificate");function fue(e){return e.replace(/[^a-z0-9\.]/gi,"-")}o(fue,"sanitizeName");async function mue(e){let t=Kw(e,Ei.object({name:Ei.string().required()}));if(t)throw new Ja(t.message);let{name:r}=e;Za();let n=await Jr.get(r);if(!n)throw new Ja(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Jr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(ht.info("Removing private key named",s),await Bn.remove(hr.join(os.getHdbBasePath(),Ls.LICENSE_KEY_DIR_NAME,s)))}return await Jr.delete(r),"Successfully removed "+r}o(mue,"removeCertificate");function Jw(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||Xw(e)[0]}o(Jw,"getPrimaryHostName");function Xw(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]:[]}o(Xw,"hostnamesFromCert");async function hue(e){if(e.bypass_auth!==!0)throw new Ja("Unauthorized","401");let t=Kw(e,Ei.object({name:Ei.string().required()}));if(t)throw new Ja(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await E$()).privateKey;if(r===".jwtPublic")return(await E$()).publicKey;if(Xa.get(r))return Xa.get(e.name);throw new Ja("Key not found")}o(hue,"getKey");function pue(e){return[e.subject?.CN,...e.subjectaltname.split(",").filter(t=>t.trim().startsWith("DNS:")).map(t=>t.trim().substring(4))]}o(pue,"getHostnamesFromCertificate")});var nV={};Oe(nV,{CONFIRMATION_STATUS_POSITION:()=>tV,LATENCY_POSITION:()=>YS,NodeReplicationConnection:()=>vd,OPERATION_REQUEST:()=>rO,RECEIVED_TIME_POSITION:()=>VS,RECEIVED_VERSION_POSITION:()=>$S,RECEIVING_STATUS_POSITION:()=>KS,RECEIVING_STATUS_RECEIVING:()=>rV,RECEIVING_STATUS_WAITING:()=>nO,SENDING_TIME_POSITION:()=>Qh,createWebSocket:()=>WS,databaseSubscriptions:()=>tc,replicateOverWS:()=>Jh,tableUpdateListeners:()=>iO});async function WS(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=Ze(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!eO){let l=(0,Q$.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),eO=u.secureContexts}if(i=eO.get(s),i&&ae.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let a={};r&&(a.Authorization=r);let c={headers:a,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,X$.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(qS?.caCount!==qo.size&&(qS=J$.createSecureContext({...i.options,ca:[...qo,...i.options.availableCAs.values()]}),qS.caCount=qo.size),c.secureContext=qS),new z$.WebSocket(e,"harperdb-replication-v1",c)}function Jh(e,t,r){let n=t.port||t.securePort,s=Ul.pid%1e3+"-"+j$.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3);ae.debug?.(s,"Initializing replication connection",r);let i=0,a=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(a.buffer,0,1024),u=t.database,d=t.databaseSubscriptions||tc,f,m,h=!1,p=t.subscription;p?.then&&p.then(E=>{p=E,p.auditStore&&(f=p.auditStore)});let _=t.tables||u&&nt()[u],g;if(!r){ae.error?.(s,"No authorization provided"),Ss(1008,"Unauthorized");return}let y=new Map,T=[];g=r.name,g&&t.connection&&(t.connection.nodeName=g);let R,N,O,F,Z,G,Y,q=6e4,K,ce=0,le=0,se=0,pe=W$.default.get(U.REPLICATION_BLOBTIMEOUT)??12e4,Ne=new Map,Ue=[],xe=0,Rr;if(t.url){let E=o(()=>{Z&&le===e._socket?.bytesRead&&se===e._socket?.bytesWritten?e.terminate():(Z=performance.now(),e.ping(),le=e._socket?.bytesRead,se=e._socket?.bytesWritten)},"sendPing");O=setInterval(E,K$).unref(),E()}else Jt();e._socket?.setMaxListeners(200);function Jt(){clearTimeout(F),le=e._socket?.bytesRead,se=e._socket?.bytesWritten,F=setTimeout(()=>{le===e._socket?.bytesRead&&se===e._socket?.bytesWritten&&(ae.warn?.(`Timeout waiting for ping from ${g}, terminating connection and reconnecting`),e.terminate())},K$*2).unref()}o(Jt,"resetPingTimer");function Mt(){if(!(!g||!u))return m||(m=Nd(f,u,g)),m}o(Mt,"getSharedStatus"),u&&ga(u);let Xt,Mf,Cc=[],Gt=[],vf,Uf=[],IE=[],NE=[],Fy=150,xf=25,Pe=0,wE=0,Bf=!1,po,Lr,yr,Ff;e.on("message",E=>{ce=performance.now();try{let S=E.dataView=new $c(E.buffer,E.byteOffset,E.byteLength);if(E[0]>127){let P=(0,et.decode)(E),[L,D,H]=P;switch(L){case B$:{if(D){if(g){if(g!==D){ae.error?.(s,`Node name mismatch, expecting to connect to ${g}, but peer reported name as ${D}, disconnecting`),e.send((0,et.encode)([Dd])),Ss(1008,"Node name mismatch");return}}else if(g=D,t.connection?.tentativeNode){let B=t.connection.tentativeNode;B.name=g,t.connection.tentativeNode=null,Ho(g,B)}if(t.connection&&(t.connection.nodeName=g),ae.debug?.(s,"received node name:",g,"db:",u??P[2]),!u)try{ga(u=P[2]),u==="system"&&(Xt=za(t,(B,de)=>{hu(de)&&Sa(de)}),e.on("close",()=>{Xt?.remove()}))}catch(B){ae.warn?.(s,"Error setting database",B),e.send((0,et.encode)([Dd])),Ss(1008,B.message);return}Dr()}break}case $$:{ae.debug?.(s,"Received table definitions for",D.map(B=>B.table));for(let B of D){let de=P[2];B.database=de;let me;hu(de)&&(de==="system"?ke[de]?.[B.table]||(me=V(B,ke[de]?.[B.table])):me=V(B,ke[de]?.[B.table]),f||(f=me?.auditStore),_||(_=nt()?.[de]))}break}case Dd:Ss();break;case rO:try{let B=r?.replicates||r?.subscribers||r?.name;ae.debug?.("Received operation request",D,"from",g),server.operation(D,{user:r},!B).then(de=>{Array.isArray(de)&&(de={results:de}),de.requestId=D.requestId,e.send((0,et.encode)([FS,de]))},de=>{e.send((0,et.encode)([FS,{requestId:D.requestId,error:(0,Md.errorToString)(de)}]))})}catch(B){e.send((0,et.encode)([FS,{requestId:D.requestId,error:(0,Md.errorToString)(B)}]))}break;case FS:let{resolve:C,reject:x}=y.get(D.requestId);D.error?x(new Error(D.error)):C(D),y.delete(D.requestId);break;case Zw:let z=P[3];if(!_){u?ae.error?.(s,"No database found for",u):ae.error?.(s,"Database name never received"),Ss();return}let ne=_[z];ne=V({table:z,database:u,attributes:D.attributes,schemaDefined:D.schemaDefined},ne),Cc[H]={name:z,decoder:new et.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:D.typedStructs,structures:D.structures}),getEntry(B){return ne.primaryStore.getEntry(B)},rootStore:ne.primaryStore.rootStore};break;case F$:Ff=f?o$(D,f):new Map,vf=P[2],ae.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${vf}`);break;case H$:let re=H;NE[re]=D;break;case q$:Mt()[tV]=D,ae.trace?.(s,"received and broadcasting committed update",D),Mt().buffer.notify();break;case G$:R=D,p.send({type:"end_txn",localTime:R,remoteNodeIds:T}),Mt(),m[$S]=last_sequence_id_received,m[VS]=Date.now(),m[KS]=nO;break;case HS:{let B=P[1],{fileId:de,size:me,finished:Se,error:ee}=B,j=Ne.get(de);ae.debug?.("Received blob",de,"has stream",!!j,"connectedToBlob",!!j?.connectedToBlob,"length",P[2].length,"finished",Se),j||(j=new tO.PassThrough,j.expectedSize=me,Ne.set(de,j)),j.lastChunk=Date.now();let he=P[2];st(he.byteLength,"bytes-received",`${g}.${u}`,"replication","blob");try{Se?(ee?(j.on("error",()=>{}),j.destroy(new Error("Blob error: "+ee+" for record "+(j.recordId??"unknown")+" from "+g))):j.end(he),j.connectedToBlob&&Ne.delete(de)):j.write(he)}catch(Te){ae.error?.(`Error receiving blob for ${j.recordId} from ${g} and streaming to storage`,Te),Ne.delete(de)}break}case k$:{let B=D,de;try{let me=P[3],Se=Gt[H]||(Gt[H]=_[P[4]]);if(!Se)return ae.warn?.("Unknown table id trying to handle record request",H);let ee=Se.primaryStore.getBinaryFast(Symbol.for("structures")),j=ee?.length??0;if(j>0&&j!==wE){wE=j;let Te=(0,et.decode)(ee);e.send((0,et.encode)([Zw,{typedStructs:Te.typed,structures:Te.named},H,Se.tableName]))}let he=Se.primaryStore.getBinaryFast(me);if(he){let Te=Se.primaryStore.decoder.decode(he,{valueAsBuffer:!0}),fe=ct||{};fe.version=(0,Z$.getLastVersion)(),ct&&ct[wu]&Vr&&(Te=Buffer.from(Te),fm(()=>Se.primaryStore.decoder.decode(he),We=>_a(We,me),Se.primaryStore.rootStore)),de=(0,et.encode)([BS,B,{value:Te,expiresAt:fe.expiresAt,version:fe.version,residencyId:fe.residencyId,nodeId:fe.nodeId,user:fe.user}])}else de=(0,et.encode)([BS,B])}catch(me){de=(0,et.encode)([BS,B,{error:me.message}])}e.send(de);break}case BS:{let{resolve:B,reject:de,tableId:me,key:Se}=y.get(P[1]),ee=P[2];if(ee?.error)de(new Error(ee.error));else if(ee){let j;i_(()=>{let he=Cc[me].decoder.decode(ee.value);ee.value=he,ee.key=Se,B(ee)||j&&setTimeout(()=>j.forEach(r_),6e4).unref()},f?.rootStore,he=>{let Te=Pc(he,Se);return j||(j=[]),j.push(Te),Te})}else B();y.delete(P[1]);break}case x$:{yr=D;let B,de,me=!1;if(p){if(u!==p.databaseName&&!p.then){ae.error?.("Subscription request for wrong database",u,p.databaseName);return}}else p=d.get(u);if(ae.debug?.(s,"received subscription request for",u,"at",yr),!p){let Ee;p=new Promise(ft=>{ae.debug?.("Waiting for subscription to database "+u),Ee=ft}),p.ready=Ee,tc.set(u,p)}if(r.name)de=Kt().subscribe(r.name),de.then(async Ee=>{B=Ee;for await(let ft of B){let tt=ft.value;if(!(tt?.replicates===!0||tt?.replicates?.receives||tt?.subscriptions?.some(cr=>(cr.database||cr.schema)===u&&cr.publish!==!1))){me=!0,e.send((0,et.encode)([Dd])),Ss(1008,`Unauthorized database subscription to ${u}`);return}}},Ee=>{ae.error?.(s,"Error subscribing to HDB nodes",Ee)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,et.encode)([Dd])),Ss(1008,`Unauthorized database subscription to ${u}`);return}if(Lr&&(ae.debug?.(s,"stopping previous subscription",u),Lr.emit("close")),yr.length===0)return;let Se=yr[0],ee=o(Ee=>{if(Ee&&(Se.replicateByDefault?!Se.tables.includes(Ee.tableName):Se.tables.includes(Ee.tableName)))return{table:Ee}},"tableToTableEntry"),j={txnTime:0},he,Te,fe=1/0,We,Et=o((Ee,ft)=>{if(Ee.type==="end_txn"){j.txnTime&&(a[i]!==66&&ae.error?.("Invalid encoding of message"),pu(9),pu(E_),Dc(We=ft),ut()),i=c,j.txnTime=0;return}let tt=Ee.nodeId,cr=Ee.tableId,vt=Te[cr];if(!vt&&(vt=Te[cr]=ee(p.tableById[cr]),!vt))return ae.debug?.("Not subscribed to table",cr);let Ts=vt.table,Ut=Ts.primaryStore,Qs=Ut.encoder;(Ee.extendedType&R_||!Qs.typedStructs)&&(Qs._mergeStructures(Qs.getStructures()),Qs.typedStructs&&(Qs.lastTypedStructuresLength=Qs.typedStructs.length));let Eu=he[tt];if(!(Eu&&Eu.startTime<ft&&(!Eu.endTime||Eu.endTime>ft)))return GS&&ae.trace?.(s,"skipping replication update",Ee.recordId,"to:",g,"from:",tt,"subscribed:",he),eM();GS&&ae.trace?.(s,"sending replication update",Ee.recordId,"to:",g,"from:",tt,"subscribed:",he);let Hy=Ee.version,Mc=Ee.residencyId,ky=mu(Mc,Ts),CE;if(ky&&!ky.includes(g)){let Js=mu(Ee.previousResidencyId,Ts);if(Js&&!Js.includes(g)&&(Ee.type==="put"||Ee.type==="patch")||Ts.getResidencyById)return eM();let kf=Ee.recordId;ae.trace?.(s,"sending invalidation",kf,g,"from",tt);let Gf=0;Mc&&(Gf|=Vc),Ee.previousResidencyId&&(Gf|=Kc);let $y,PE=null;for(let tM in Ts.indices){if(!PE){if($y=Ee.getValue(Ut,!0),!$y)break;PE={}}PE[tM]=$y[tM]}CE=Yc(Ee.version,cr,kf,null,tt,Ee.user,Ee.type==="put"||Ee.type==="patch"?"invalidate":Ee.type,Qs.encode(PE),Gf,Mc,Ee.previousResidencyId,Ee.expiresAt)}function eM(){return ae.trace?.(s,"skipping audit record",Ee.recordId),G||(G=setTimeout(()=>{G=null,(We||0)+V$/2<fe&&(GS&&ae.trace?.(s,"sending skipped sequence update",fe),e.send((0,et.encode)([G$,fe])))},V$).unref()),new Promise(setImmediate)}o(eM,"skipAuditRecord");let Gy=Qs.typedStructs,qy=Qs.structures;if((Gy?.length!=vt.typed_length||qy?.length!=vt.structure_length)&&(vt.typed_length=Gy?.length,vt.structure_length=qy.length,ae.debug?.(s,"send table struct",vt.typed_length,vt.structure_length),vt.sentName||(vt.sentName=!0),e.send((0,et.encode)([Zw,{typedStructs:Gy,structures:qy,attributes:Ts.attributes,schemaDefined:Ts.schemaDefined},cr,vt.table.tableName]))),Mc&&!IE[Mc]&&(e.send((0,et.encode)([H$,ky,Mc])),IE[Mc]=!0),j.txnTime!==Hy&&(j.txnTime&&(GS&&ae.trace?.(s,"new txn time, sending queued txn",j.txnTime),a[i]!==66&&ae.error?.("Invalid encoding of message"),ut()),j.txnTime=Hy,i=c,Dc(Hy)),CE)pu(CE.length),Lc(CE);else{let Js=Ee.encoded;Ee.extendedType&Vr&&fm(()=>Ee.getValue(Ut),Gf=>_a(Gf,Ee.recordId),Ut.rootStore);let kf=Js[0]===66?8:0;pu(Js.length-kf),Lc(Js,kf),ae.trace?.("wrote record",Ee.recordId,"length:",Js.length)}return e._socket.writableNeedDrain?new Promise(Js=>{ae.debug?.(`Waiting for remote node ${g} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Js)}):xe>xf?new Promise(Js=>{Rr=Js}):new Promise(setImmediate)},"sendAuditRecord"),ut=o(()=>{c-i>8?(e.send(a.subarray(i,c)),ae.debug?.(s,"Sent message, size:",c-i),st(c-i,"bytes-sent",`${g}.${u}`,"replication","egress")):ae.debug?.(s,"skipping empty transaction")},"sendQueuedData");Lr=new sO.EventEmitter,Lr.once("close",()=>{me=!0,B?.end()});for(let{startTime:Ee}of yr)Ee<fe&&(fe=Ee);(de||Promise.resolve()).then(async()=>{p=await p,f=p.auditStore,Te=p.tableById.map(ee),he=[];for(let{name:ft,startTime:tt,endTime:cr}of yr){let vt=CS(ft,f);ae.debug?.("subscription to",ft,"using local id",vt,"starting",tt),he[vt]={startTime:tt,endTime:cr}}Sa(u),Xt||(Xt=bl(ft=>{ft.databaseName===u&&Sa(u)}),Mf=Sh(ft=>{ft===u&&(e.send((0,et.encode)([Dd])),Ss())}),e.on("close",()=>{Xt?.remove(),Mf?.remove()})),e.send((0,et.encode)([F$,Gh(p.auditStore),yr.map(({name:ft})=>ft)]));let Ee=!0;do{isFinite(fe)||(ae.warn?.("Invalid sequence id "+fe),Ss(1008,"Invalid sequence id"+fe));let ft;if(Ee&&!me&&(Ee=!1,fe===0)){ae.info?.("Replicating all tables to",g);let tt=fe,cr=zS(f);for(let vt in _){if(!ee(vt))continue;let Ts=_[vt];for(let Ut of Ts.primaryStore.getRange({snapshot:!1,versions:!0})){if(me)return;if(Ut.localTime>=fe){ae.trace?.(s,"Copying record from",u,vt,Ut.key,Ut.localTime),tt=Math.max(Ut.localTime,tt),Mt()[Qh]=1;let Qs=Yc(Ut.version,Ts.tableId,Ut.key,null,cr,null,"put",fm(()=>Ts.primaryStore.encoder.encode(Ut.value),Eu=>_a(Eu,Ut.key)),Ut.metadataFlags&-256,Ut.residencyId,null,Ut.expiresAt);await Et({recordId:Ut.key,tableId:Ts.tableId,type:"put",getValue(){return Ut.value},encoded:Qs,version:Ut.version,residencyId:Ut.residencyId,nodeId:cr,extendedType:Ut.metadataFlags},Ut.localTime)}}}c-i>8&&Et({type:"end_txn"},fe),Mt()[Qh]=0,fe=tt}for(let{key:tt,value:cr}of f.getRange({start:fe||1,exclusiveStart:!0,snapshot:!1})){if(me)return;let vt=At(cr);ae.debug?.("sending audit record",new Date(tt)),Mt()[Qh]=tt,fe=tt,await Et(vt,tt),Lr.startTime=tt}c-i>8&&Et({type:"end_txn"},fe),Mt()[Qh]=0,await SU(f)}while(!me)}).catch(Ee=>{ae.error?.(s,"Error handling subscription to node",Ee),Ss(1008,"Error handling subscription to node")});break}}return}S.position=8;let A=!0,b,I;do{Mt();let P=S.readInt();if(P===9&&S.getUint8(S.position)==E_){S.position++,R=I=S.readFloat64(),m[$S]=R,m[VS]=Date.now(),m[KS]=nO,ae.trace?.("received remote sequence update",R,u);break}let L=S.position,D=At(E,L,L+P),H=Cc[D.tableId];H||ae.error?.(`No table found with an id of ${D.tableId}`);let C;D.residencyId&&(C=NE[D.residencyId],ae.trace?.(s,"received residency list",C,D.type,D.recordId));try{let x=D.recordId;i_(()=>{b={table:H.name,id:D.recordId,type:D.type,nodeId:Ff.get(D.nodeId),residencyList:C,timestamp:D.version,value:D.getValue(H),user:D.user,beginTxn:A,expiresAt:D.expiresAt}},f?.rootStore,z=>Pc(z,x))}catch(x){throw x.message+="typed structures for current decoder"+JSON.stringify(H.decoder.typedStructs),x}A=!1,ae.trace?.(s,"received replication message",D.type,"id",b.id,"version",new Date(D.version),"nodeId",b.nodeId),m[$S]=D.version,m[VS]=Date.now(),m[KS]=rV,p.send(b),S.position=L+P}while(S.position<E.byteLength);Pe++,st(E.byteLength,"bytes-received",`${g}.${u}.${b?.table||"unknown_table"}`,"replication","ingest"),Pe>Fy&&!Bf&&(Bf=!0,e.pause(),ae.debug?.(`Commit backlog causing replication back-pressure, requesting that ${g} pause replication`)),p.send({type:"end_txn",localTime:R,remoteNodeIds:T,async onCommit(){if(b){let P=Date.now()-b.timestamp;st(P,"replication-latency",g+"."+u+"."+b.table,b.type,"ingest")}Pe--,Bf&&(Bf=!1,e.resume(),ae.debug?.(`Replication resuming ${g}`)),Ue.length>0&&await Promise.all(Ue),ae.trace?.("All blobs finished"),!N&&I&&(ae.trace?.(s,"queuing confirmation of a commit at",I),setTimeout(()=>{e.send((0,et.encode)([q$,N])),ae.trace?.(s,"sent confirmation of a commit at",N),N=null},_ue)),N=I,ae.debug?.("last sequence committed",new Date(I),u)}})}catch(S){ae.error?.(s,"Error handling incoming replication message",S)}}),e.on("ping",Jt),e.on("pong",()=>{if(t.connection){let E=performance.now()-Z;t.connection.latency=E,Mt()&&(m[YS]=E),t.isSubscriptionConnection&&Dl({name:g,database:u,url:t.url,latency:E})}Z=null}),e.on("close",(E,S)=>{clearInterval(O),clearTimeout(F),clearInterval(Y),Lr&&Lr.emit("close"),po&&po.end();for(let[A,{reject:b}]of y)b(new Error(`Connection closed ${S?.toString()} ${E}`));ae.debug?.(s,"closed",E,S?.toString())});function Ss(E,S){try{e.isFinished=!0,ae.debug?.(s,"closing",g,u,E,S),e.close(E,S),t.connection?.emit("finished")}catch(A){ae.error?.(s,"Error closing connection",A)}}o(Ss,"close");let Ea=new Set;async function _a(E,S){let A=n_(E);if(Ea.has(A)){ae.debug?.("Blob already being sent",A);return}Ea.add(A);try{let b;xe++;for await(let I of E.stream())b&&(ae.debug?.("Sending blob chunk",A,"length",b.length),e.send((0,et.encode)([HS,{fileId:A,size:E.size},b]))),b=I,e._socket.writableNeedDrain&&(ae.debug?.("draining",A),await new Promise(P=>e._socket.once("drain",P)),ae.debug?.("drained",A)),st(I.length,"bytes-sent",`${g}.${u}`,"replication","blob");ae.debug?.("Sending final blob chunk",A,"length",b.length),e.send((0,et.encode)([HS,{fileId:A,size:E.size,finished:!0},b]))}catch(b){ae.warn?.("Error sending blob",b,"blob id",A,"for record",S),e.send((0,et.encode)([HS,{fileId:A,finished:!0,error:(0,Md.errorToString)(b)},Buffer.alloc(0)]))}finally{Ea.delete(A),xe--,xe<xf&&Rr?.()}}o(_a,"sendBlobs");function Pc(E,S){let A=n_(E),b=Ne.get(A);ae.debug?.("Received transaction with blob",A,"has stream",!!b,"ended",!!b?.writableEnded),b?b.writableEnded&&Ne.delete(A):(b=new tO.PassThrough,Ne.set(A,b)),b.connectedToBlob=!0,b.lastChunk=Date.now(),b.recordId=S,E.size===void 0&&b.expectedSize&&(E.size=b.expectedSize);let I=b.blob??createBlob(b,E);b.blob=I;let P=Ao(()=>dm(I).saving,p.auditStore?.rootStore);return P&&(P.blobId=A,Ue.push(P),P.finally(()=>{ae.debug?.(`Finished receiving blob stream ${A}`),Ue.splice(Ue.indexOf(P),1)})),I}o(Pc,"receiveBlobs");function Dr(){if(h||(h=!0,t.connection?.on("subscriptions-updated",Dr)),!f&&p&&(f=p.auditStore),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let E=new Map;f||(f=p?.auditStore);try{for(let b of p?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let I of b.value.nodes||[])I.lastTxnTime>(E.get(I.id)??0)&&E.set(I.id,I.lastTxnTime)}catch(b){if(!b.message.includes("Can not re"))throw b}let S=t.connection?.nodeSubscriptions?.[0];T=[];let A=t.connection?.nodeSubscriptions.map((b,I)=>{let P=[],{replicateByDefault:L}=b;if(b.subscriptions){for(let x of b.subscriptions)if(x.subscribe&&(x.schema||x.database)===u){let z=x.table;_?.[z]?.replicate!==!1&&P.push(z)}L=!1}else for(let x in _)(L?_[x].replicate===!1:_[x].replicate)&&P.push(x);let D=f&&CS(b.name,f),H=p?.dbisDB?.get([Symbol.for("seq"),D])??1,C=Math.max(H?.seqId??1,(typeof b.startTime=="string"?new Date(b.startTime).getTime():b.startTime)??1);if(ae.debug?.("Starting time recorded in db",b.name,D,u,H?.seqId,"start time:",C,new Date(C)),S!==b){let x=f&&CS(S.name,f),z=p?.dbisDB?.get([Symbol.for("seq"),x])??1;for(let ne of z?.nodes||[])ne.name===b.name&&(C=ne.seqId,ae.debug?.("Using sequence id from proxy node",S.name,C))}if(D===void 0?ae.warn("Starting subscription request from node",b,"but no node id found"):T.push(D),E.get(D)>C&&(C=E.get(D),ae.debug?.("Updating start time from more recent txn recorded",S.name,C)),C===1&&kS)try{new URL(kS).hostname===b.name?(ae.warn?.(`Requesting full copy of database ${u} from ${kS}`),C=0):C=Date.now()-6e4}catch(x){ae.error?.("Error parsing leader URL",kS,x)}return ae.trace?.(s,"defining subscription request",b.name,u,new Date(C)),{name:b.name,replicateByDefault:L,tables:P,startTime:C,endTime:b.endTime}});if(A)if(ae.debug?.(s,"sending subscription request",A,p?.dbisDB?.path),clearTimeout(K),A.length>0)e.send((0,et.encode)([x$,A]));else{let b=o(()=>{let I=performance.now();K=setTimeout(()=>{ce<=I?Ss(1008,"Connection has no subscriptions and is no longer used"):b()},q).unref()},"scheduleClose");b()}}o(Dr,"sendSubscriptionRequestUpdate");function mu(E,S){if(!E)return;let A=Uf[E];return A||(A=S.getResidencyRecord(E),Uf[E]=A),A}o(mu,"getResidence");function hu(E){return!(ec&&ec!="*"&&!ec[E]&&!ec.includes?.(E)&&!ec.some?.(S=>S.name===E))}o(hu,"checkDatabaseAccess");function ga(E){if(p=p||d.get(E),!hu(E))throw new Error(`Access to database "${E}" is not permitted`);p||ae.warn?.(`No database named "${E}" was declared and registered`),f=p?.auditStore,_||(_=nt()?.[E]);let S=Ze();if(S===g)throw S?new Error("Should not connect to self",S):new Error("Node name not defined");return OE(S,E),!0}o(ga,"setDatabase");function OE(E,S){let A=nt()?.[S],b=[];for(let I in A){let P=A[I];b.push({table:I,schemaDefined:P.schemaDefined,attributes:P.attributes.map(L=>({name:L.name,type:L.type,isPrimaryKey:L.isPrimaryKey}))})}ae.trace?.("Sending database info for node",E,"database name",S),e.send((0,et.encode)([B$,E,S,b]))}o(OE,"sendNodeDBName");function Sa(E){let S=nt()?.[E],A=[];for(let b in S){if(yr&&!yr.some(P=>P.replicateByDefault?!P.tables.includes(b):P.tables.includes(b)))continue;let I=S[b];A.push({table:b,schemaDefined:I.schemaDefined,attributes:I.attributes.map(P=>({name:P.name,type:P.type,isPrimaryKey:P.isPrimaryKey}))})}e.send((0,et.encode)([$$,A,E]))}o(Sa,"sendDBSchema"),Y=setInterval(()=>{for(let[E,S]of Ne)S.lastChunk+pe<Date.now()&&(ae.warn?.(`Timeout waiting for blob stream to finish ${E} for record ${S.recordId??"unknown"} from ${g}`),Ne.delete(E),S.end())},pe).unref();let Ta=1,Hf=[];return{end(){po&&po.end(),Lr&&Lr.emit("close")},getRecord(E){let S=Ta++;return new Promise((A,b)=>{let I=[k$,S,E.table.tableId,E.id];Hf[E.table.tableId]||(I.push(E.table.tableName),Hf[E.table.tableId]=!0),e.send((0,et.encode)(I)),ce=performance.now(),y.set(S,{tableId:E.table.tableId,key:E.id,resolve(P){let{table:L,entry:D}=E;if(A(P),P)return L._recordRelocate(D,P)},reject:b})})},sendOperation(E){let S=Ta++;return E.requestId=S,e.send((0,et.encode)([rO,E])),new Promise((A,b)=>{y.set(S,{resolve:A,reject:b})})}};function pu(E){Ra(5),E<128?a[c++]=E:E<16384?(l.setUint16(c,E|32768),c+=2):E<1056964608?(l.setUint32(c,E|3221225472),c+=4):(a[c]=255,l.setUint32(c+1,E),c+=5)}function Lc(E,S=0,A=E.length){let b=A-S;Ra(b),E.copy(a,c,S,A),c+=b}function Dc(E){Ra(8),l.setFloat64(c,E),c+=8}function Ra(E){if(E+16>a.length-c){let S=Buffer.allocUnsafeSlow(c+E-i+65536>>10<<11);a.copy(S,0,i,c),c=c-i,i=0,a=S,l=new DataView(a.buffer,0,a.length)}}function V(E,S){let A=E.database??"data";if(A!=="data"&&!ke[A]){ae.warn?.("Database not found",E.database);return}S||(S={});let b=S.schemaDefined,I=!1,P=E.schemaDefined,L=S.attributes||[];for(let D=0;D<E.attributes?.length;D++){let H=E.attributes[D],C=L.find(x=>x.name===H.name);(!C||C.type!==H.type)&&(b?ae.error?.(`Schema for '${u}.${E.table}' is defined locally, but attribute '${H.name}: ${H.type}' from '${g}' does not match local attribute ${C?"'"+C.name+": "+C.type+"'":"which does not exist"}`):(I=!0,P||(H.indexed=!0),C?L[L.indexOf(C)]=H:L.push(H)))}return I?(ae.debug?.("(Re)creating",E),ze({table:E.table,database:E.database,schemaDefined:E.schemaDefined,attributes:L,...S})):S}}var W$,et,z$,j$,Md,sO,Q$,J$,Ul,X$,tO,Z$,eV,ae,x$,B$,F$,Dd,H$,Zw,k$,BS,rO,FS,G$,q$,$$,HS,tV,$S,VS,Qh,YS,KS,nO,rV,Eue,kS,iO,tc,GS,V$,_ue,K$,eO,qS,Y$,vd,oO=ue(()=>{De();Li();Bw();tb();is();W$=w(oe());k();Wc();et=require("msgpackr"),z$=require("ws"),j$=require("worker_threads"),Md=w(Q());Wh();sO=require("events"),Q$=w(as()),J$=w(require("node:tls"));Ll();Ul=w(require("node:process")),X$=require("node:net");Wi();Kn();tO=require("node:stream"),Z$=require("lmdb"),eV=w(require("minimist")),ae=(0,Md.forComponent)("replication").conditional,x$=129,B$=140,F$=141,Dd=142,H$=130,Zw=132,k$=133,BS=134,rO=136,FS=137,G$=143,q$=144,$$=145,HS=146,tV=0,$S=1,VS=2,Qh=3,YS=4,KS=5,nO=0,rV=1,Eue=(0,eV.default)(Ul.argv),kS=Eue.HDB_LEADER_URL??Ul.env.HDB_LEADER_URL,iO=new Map,tc=new Map,GS=!0,V$=300,_ue=2,K$=3e4;o(WS,"createWebSocket");Y$=500,vd=class extends sO.EventEmitter{static{o(this,"NodeReplicationConnection")}socket;startTime;retryTime=Y$;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;url;subscription;databaseName;nodeName;authorization;constructor(t,r,n,s,i){super(),this.url=t,this.subscription=r,this.databaseName=n,this.authorization=i,this.nodeName=this.nodeName??pi(t)}async connect(){this.session||this.resetSession();let t=[];this.socket=await WS(this.url,{serverName:this.nodeName,authorization:this.authorization});let r;ae.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${Ul.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ae[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=Y$,this.nodeSubscriptions&&Dl({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,r=Jh(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(r)}),this.socket.on("error",n=>{n.code==="SELF_SIGNED_CERT_IN_CHAIN"?(ae.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),n.isHandled=!0):n.code!=="ECONNREFUSED"&&(n.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?ae.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`):ae.error?.(`Error in connection to ${this.url} due to ${n.message}`)),this.sessionReject(n)}),this.socket.on("close",(n,s)=>{if(this.isConnected&&(this.nodeSubscriptions&&Cd({name:this.nodeName,database:this.databaseName,url:this.url,finished:this.socket.isFinished}),this.isConnected=!1),this.removeAllListeners("subscriptions-updated"),this.socket.isFinished){this.isFinished=!0,r?.end(),this.emit("finished");return}if(++this.retries%20===1){let i=s?.toString();ae.warn?.(`${r?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${i?'"'+i+'" ':""}(code: ${n})`)}r=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((t,r)=>{this.sessionResolve=t,this.sessionReject=r})}subscribe(t,r){this.nodeSubscriptions=t,this.replicateTablesByDefault=r,this.emit("subscriptions-updated",t)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(t){return this.session.then(r=>r.getRecord(t))}};o(Jh,"replicateOverWS")});var Go={};Oe(Go,{clearThisNodeName:()=>Nue,disableReplication:()=>Rue,enabledDatabases:()=>ec,forEachReplicatedDatabase:()=>za,getThisNodeId:()=>zS,getThisNodeName:()=>Ze,getThisNodeUrl:()=>ja,hostnameToUrl:()=>ZS,lastTimeInAuditStore:()=>qh,monitorNodeCAs:()=>fV,replicateOperation:()=>Oue,replicationCertificateAuthorities:()=>qo,sendOperationToNode:()=>Xh,servers:()=>Sue,setReplicator:()=>hV,start:()=>Tue,startOnMainThread:()=>kw,subscribeToNode:()=>Yh,unsubscribeFromNode:()=>DS,urlToNodeName:()=>pi});function Tue(e){if(!e.port&&!e.securePort&&(e.port=Ds.default.get(U.OPERATIONSAPI_NETWORK_PORT),e.securePort=Ds.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),!Ze())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of Vh(e))t.set(pi(s.url),s);yue(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=Le.ws(async(s,i,a,c)=>{if(Ct.debug("Incoming WS connection received "+i.url),i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,a);await a,s._socket.unref(),Jh(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&Ct.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Le.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){Ct.debug("Incoming replication WS connection received, authorized: "+s.authorized),!s.authorized&&s._nodeRequest.socket.authorizationError&&Ct.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let a=Kt().primaryStore;if(s.authorized&&s.peerCertificate.subjectaltname){let c=(0,uV.getHostnamesFromCertificate)(s.peerCertificate),l;for(let u of c)if(l=u&&(a.get(u)||t.get(u)),l)break;if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){Ct.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else Ct.warn(`No node found for certificate common name/SANs: ${c}, available nodes are ${Array.from(a.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=a.get(s.ip)||t.get(s.ip);c?s.user=c:Ct.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...a.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=o(()=>{let a=new Set(s.secureContexts.values());s.defaultContext&&a.add(s.defaultContext);for(let c of a)try{let l=Array.from(qo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=XS.createSecureContext(u)}catch(l){Ct.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Ds.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1&&i()}fV(()=>{for(let s of n)s()})}function fV(e){let t=0;wd(r=>{r?.ca&&(qo.add(r.ca),qo.size!==t&&(t=qo.size,e?.()))})}function Rue(e=!0){dV=e}function yue(e){dV||(nt(),ec=e.databases,za(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||tc;for(let[s,i]of QS){let a=i.get(r);a&&(a.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];hV(r,s,e),iO.get(s)?.forEach(i=>i(s))}}))}function hV(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 mV extends xr{static{o(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||tc,a=i.get(e),c=a?.tableById||[];c[t.tableId]=t;let l=a?.ready;if(Ct.trace("Setting up replicator subscription to database",e),!a?.auditStore)return this.subscription=a=new Vn,i.set(e,a),a.tableById=c,a.auditStore=t.auditStore,a.dbisDB=t.dbisDB,a.databaseName=e,l&&l(a),a;this.subscription=a}static subscribeOnThisThread(i,a){return!0}static async load(i){if(i){let a=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),a]);if(c){let l,u=new Set;do{let d,f="",m=1/0;for(let p of c){if(u.has(p)||p===Le.hostname)continue;let _=bue(p,mV.subscription,e);if(_?.isConnected){let g=Nd(t.auditStore,e,p)[YS];(!d||g<m)&&(d=_,f=p,m=g)}}if(!d)throw l||new cV.ServerError(`No connection to any other nodes are available: ${c}`,502);let h={requestId:gue++,table:t,entry:i,id:i.key};u.add(f);try{return await d.getRecord(h)}catch(p){if(d.isConnected)throw p;Ct.warn("Error in load from node",JS,p),l||(l=p)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function Aue(e,t,r,n,s){let i=QS.get(e);i||QS.set(e,i=new Map);let a=i.get(r);if(a)return a;if(t)return i.set(r,a=new vd(e,t,r,n,s)),a.connect(),a.once("finished",()=>i.delete(r)),a}function bue(e,t,r){let n=sV.get(e);n||(n=new Map,sV.set(e,n));let s=n.get(r);if(s)return s;let i=Kt().primaryStore.get(e);return i?.url&&(s=new vd(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function Xh(e,t,r){r||(r={}),r.serverName=e.name;let n=await WS(e.url,r),s=Jh(n,{},{});return new Promise((i,a)=>{n.on("open",()=>{Ct.debug("Sending operation connection to "+e.url+" opened",t),i(s.sendOperation(t))}),n.on("error",c=>{a(c)}),n.on("close",c=>{Ct.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function Yh(e){try{lV.isMainThread&&Ct.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=tc.get(e.database);if(!t){let n;t=new Promise(s=>{Ct.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,tc.set(e.database,t)}let r=Aue(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=>$h(n,e.database)),e.replicateByDefault)}catch(t){Ct.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function DS({name:e,url:t,database:r}){Ct.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(Kt().primaryStore.getRange({})));let n=QS.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Iue(){if(aO!==void 0)return aO;let e=Ds.default.get(U.OPERATIONSAPI_TLS_CERTIFICATE)||Ds.default.get(U.TLS_CERTIFICATE);if(e)return aO=new oV.X509Certificate((0,aV.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function Ze(){return JS||(JS=Ds.default.get("replication_hostname")??pi(Ds.default.get("replication_url"))??Iue()??iV("operationsapi_network_secureport")??iV("operationsapi_network_port")??"127.0.0.1")}function Nue(){JS=void 0}function iV(e){let t=Ds.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function jS(e){let t=Ds.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function zS(e){return Gh(e)?.[Ze()]}function ja(){let e=Ds.default.get("replication_url");return e||ZS(Ze())}function ZS(e){let t=jS("replication_port");if(t)return`ws://${e}:${t}`;if(t=jS("replication_secureport"),t)return`wss://${e}:${t}`;if(t=jS("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=jS("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function pi(e){if(e)return new URL(e).hostname}function za(e,t){for(let n of Object.getOwnPropertyNames(ke))r(n);return Sh(n=>{r(n)}),bl((n,s)=>{r(n.databaseName)});function r(n){let s=ke[n];Ct.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):wue(n)&&t(s,n,!1)}o(r,"forDatabase")}function wue(e){let t=ke[e];for(let r in t)if(t[r].replicate)return!0}function qh(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function Oue(e){let t={message:""};if(e.replicated){e.replicated=!1,Ct.trace?.("Replicating operation",e.operation,"to nodes",Le.nodes.map(n=>n.name));let r=await Promise.allSettled(Le.nodes.map(n=>Xh(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Le.nodes[s]?.name,i})}return t}var Ds,Ct,oV,aV,XS,cV,lV,uV,dV,gue,Sue,qo,ec,QS,sV,aO,JS,is=ue(()=>{De();Pa();Tu();oO();Mr();Ds=w(oe()),Ct=w(Q()),oV=require("crypto"),aV=require("fs");Wh();Ll();k();Bw();XS=w(require("node:tls")),cV=w(ge()),lV=require("worker_threads"),uV=w(as()),gue=1,Sue=[],qo=Ds.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1?new Set(XS.rootCertificates):new Set;o(Tue,"start");o(fV,"monitorNodeCAs");o(Rue,"disableReplication");o(yue,"assignReplicationSource");o(hV,"setReplicator");QS=new Map;o(Aue,"getSubscriptionConnection");sV=new Map;o(bue,"getRetrievalConnectionByName");o(Xh,"sendOperationToNode");o(Yh,"subscribeToNode");o(DS,"unsubscribeFromNode");o(Iue,"getCommonNameFromCert");o(Ze,"getThisNodeName");o(Nue,"clearThisNodeName");Object.defineProperty(Le,"hostname",{get(){return Ze()}});o(iV,"getHostFromListeningPort");o(jS,"getPortFromListeningPort");o(zS,"getThisNodeId");Le.replication={getThisNodeId:zS,exportIdMapping:Gh};o(ja,"getThisNodeUrl");o(ZS,"hostnameToUrl");o(pi,"urlToNodeName");o(za,"forEachReplicatedDatabase");o(wue,"hasExplicitlyReplicatedTable");o(qh,"lastTimeInAuditStore");o(Oue,"replicateOperation")});var ep=M((Rve,SV)=>{"use strict";var Ud=Cq(),{validateBySchema:Zh}=lt(),{commonValidators:xd,schemaRegex:cO}=Hi(),pr=require("joi"),Cue=Q(),Pue=require("uuid").v4,rT=Co(),Bd=(k(),v(W)),Lue=require("util"),rc=Jn(),{handleHDBError:$o,hdbErrors:Due,ClientError:xl}=ge(),{HDB_ERROR_MSGS:eT,HTTP_STATUS_CODES:Vo}=Due,{SchemaEventMsg:nT}=oi(),pV=mr(),{getDatabases:Mue}=(De(),v(mt)),{transformReq:Fd}=ie(),{replicateOperation:EV}=(is(),v(Go)),{cleanupOrphans:vue}=(Kn(),v(o_)),tT=pr.string().min(1).max(xd.schema_length.maximum).pattern(cO).messages({"string.pattern.base":"{:#label} "+xd.schema_format.message}),Uue=pr.string().min(1).max(xd.schema_length.maximum).pattern(cO).messages({"string.pattern.base":"{:#label} "+xd.schema_format.message}).required(),xue=pr.string().min(1).max(xd.schema_length.maximum).pattern(cO).messages({"string.pattern.base":"{:#label} "+xd.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();SV.exports={createSchema:Bue,createSchemaStructure:_V,createTable:Fue,createTableStructure:gV,createAttribute:$ue,dropSchema:Hue,dropTable:kue,dropAttribute:Gue,getBackup:Vue,cleanupOrphanBlobs:Kue};async function Bue(e){let t=await _V(e);return rT.signalSchemaChange(new nT(process.pid,e.operation,e.schema)),t}o(Bue,"createSchema");async function _V(e){let t=Zh(e,pr.object({database:tT,schema:tT}));if(t)throw new xl(t.message);if(Fd(e),!await Ud.checkSchemaExists(e.schema))throw $o(new Error,eT.SCHEMA_EXISTS_ERR(e.schema),Vo.BAD_REQUEST,Bd.LOG_LEVELS.ERROR,eT.SCHEMA_EXISTS_ERR(e.schema),!0);return await rc.createSchema(e),`database '${e.schema}' successfully created`}o(_V,"createSchemaStructure");async function Fue(e){return Fd(e),e.hash_attribute=e.primary_key??e.hash_attribute,await gV(e)}o(Fue,"createTable");async function gV(e){let t=Zh(e,pr.object({database:tT,schema:tT,table:Uue,residence:pr.array().items(pr.string().min(1)).optional(),hash_attribute:xue}));if(t)throw new xl(t.message);if(!await Ud.checkSchemaTableExists(e.schema,e.table))throw $o(new Error,eT.TABLE_EXISTS_ERR(e.schema,e.table),Vo.BAD_REQUEST,Bd.LOG_LEVELS.ERROR,eT.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Pue(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await rc.createTable(n,e);else throw $o(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Vo.BAD_REQUEST);else await rc.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}o(gV,"createTableStructure");async function Hue(e){let t=Zh(e,pr.object({database:pr.string(),schema:pr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new xl(t.message);Fd(e);let r=await Ud.checkSchemaExists(e.schema);if(r)throw $o(new Error,r,Vo.NOT_FOUND,Bd.LOG_LEVELS.ERROR,r,!0);let n=await Ud.schemaDescribe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await rc.dropSchema(e),rT.signalSchemaChange(new nT(process.pid,e.operation,e.schema)),await pV.purgeSchemaTableStreams(e.schema,s);let i=await EV(e);return i.message=`successfully deleted '${e.schema}'`,i}o(Hue,"dropSchema");async function kue(e){let t=Zh(e,pr.object({database:pr.string(),schema:pr.string(),table:pr.string().required()}));if(t)throw new xl(t.message);Fd(e);let r=await Ud.checkSchemaTableExists(e.schema,e.table);if(r)throw $o(new Error,r,Vo.NOT_FOUND,Bd.LOG_LEVELS.ERROR,r,!0);await rc.dropTable(e),await pV.purgeTableStream(e.schema,e.table);let n=await EV(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}o(kue,"dropTable");async function Gue(e){let t=Zh(e,pr.object({database:pr.string(),schema:pr.string(),table:pr.string().required(),attribute:pr.string().required()}));if(t)throw new xl(t.message);Fd(e);let r=await Ud.checkSchemaTableExists(e.schema,e.table);if(r)throw $o(new Error,r,Vo.NOT_FOUND,Bd.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw $o(new Error,"You cannot drop a hash attribute",Vo.BAD_REQUEST,void 0,void 0,!0);if(Bd.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw $o(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Vo.BAD_REQUEST,void 0,void 0,!0);try{return await rc.dropAttribute(e),que(e),rT.signalSchemaChange(new nT(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw Cue.error(`Got an error deleting attribute ${Lue.inspect(e)}.`),n}}o(Gue,"dropAttribute");function que(e){let t=Object.values(global.hdb_schema[e.schema][e.table].attributes);for(let r=0;r<t.length;r++)t[r].attribute===e.attribute&&global.hdb_schema[e.schema][e.table].attributes.splice(r,1)}o(que,"dropAttributeFromGlobal");async function $ue(e){Fd(e);let t=Mue()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw $o(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Vo.BAD_REQUEST,void 0,void 0,!0);return await rc.createAttribute(e),rT.signalSchemaChange(new nT(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}o($ue,"createAttribute");function Vue(e){return rc.getBackup(e)}o(Vue,"getBackup");function Kue(e){if(!e.database)throw new xl('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new xl(`Unknown database '${e.database}'`);return vue(databases[e.database],e.database),{message:"Orphaned blobs cleanup started, check logs for progress"}}o(Kue,"cleanupOrphanBlobs")});var RV=M((Ave,TV)=>{"use strict";var{OPERATIONS_ENUM:Yue}=(k(),v(W)),lO=class{static{o(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Yue.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};TV.exports=lO});var uO=M((Nve,NV)=>{"use strict";var Wue=Jn(),Ive=RV(),sT=ie(),iT=(k(),v(W)),zue=oe(),{handleHDBError:yV,hdbErrors:jue}=ge(),{HDB_ERROR_MSGS:AV,HTTP_STATUS_CODES:bV}=jue,Que=Object.values(iT.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),IV="To use this operation audit log must be enabled in harperdb-config.yaml";NV.exports=Jue;async function Jue(e){if(sT.isEmpty(e.schema))throw new Error(AV.SCHEMA_REQUIRED_ERR);if(sT.isEmpty(e.table))throw new Error(AV.TABLE_REQUIRED_ERR);if(!zue.get(iT.CONFIG_PARAMS.LOGGING_AUDITLOG))throw yV(new Error,IV,bV.BAD_REQUEST,iT.LOG_LEVELS.ERROR,IV,!0);let t=sT.checkSchemaTableExist(e.schema,e.table);if(t)throw yV(new Error,t,bV.NOT_FOUND,iT.LOG_LEVELS.ERROR,t,!0);if(!sT.isEmpty(e.search_type)&&Que.indexOf(e.search_type)<0)throw new Error(`Invalid searchType '${read_audit_log_object.search_type}'`);return await Wue.readAuditLog(e)}o(Jue,"readAuditLog")});var OV=M((Ove,wV)=>{"use strict";var{OPERATIONS_ENUM:Xue}=(k(),v(W)),dO=class{static{o(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Xue.GET_BACKUP,this.schema=t,this.table=r}};wV.exports=dO});var LV=M((Dve,PV)=>{"use strict";var Zue=Jn(),Pve=OV(),fO=ie(),ede=(k(),v(W)),Lve=oe(),{handleHDBError:tde,hdbErrors:rde}=ge(),{HDB_ERROR_MSGS:CV,HTTP_STATUS_CODES:nde}=rde;PV.exports=sde;async function sde(e){if(fO.isEmpty(e.schema))throw new Error(CV.SCHEMA_REQUIRED_ERR);if(fO.isEmpty(e.table))throw new Error(CV.TABLE_REQUIRED_ERR);let t=fO.checkSchemaTableExist(e.schema,e.table);if(t)throw tde(new Error,t,nde.NOT_FOUND,ede.LOG_LEVELS.ERROR,t,!0);return await Zue.getBackup(readAuditLogObject)}o(sde,"getBackup")});var UV=M((vve,vV)=>{"use strict";var ide=oe(),nc=require("joi"),ode=lt(),DV=require("moment"),ade=require("fs-extra"),mO=require("path"),cde=require("lodash"),tp=(k(),v(W)),{LOG_LEVELS:Bl}=(k(),v(W)),lde="YYYY-MM-DD hh:mm:ss",ude=mO.resolve(__dirname,"../logs");vV.exports=function(e){return ode.validateBySchema(e,dde)};var dde=nc.object({from:nc.custom(MV),until:nc.custom(MV),level:nc.valid(Bl.NOTIFY,Bl.FATAL,Bl.ERROR,Bl.WARN,Bl.INFO,Bl.DEBUG,Bl.TRACE),order:nc.valid("asc","desc"),limit:nc.number().min(1),start:nc.number().min(0),log_name:nc.custom(fde)});function MV(e,t){if(DV(e,DV.ISO_8601).format(lde)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}o(MV,"validateDatetime");function fde(e,t){if(cde.invert(tp.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=ide.get(tp.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?tp.LOG_NAMES.HDB:e,i=s===tp.LOG_NAMES.INSTALL?mO.join(ude,tp.LOG_NAMES.INSTALL):mO.join(n,s);return ade.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}o(fde,"validateReadLogPath")});var pO=M((xve,BV)=>{"use strict";var oT=(k(),v(W)),mde=Q(),hde=oe(),pde=UV(),hO=require("path"),xV=require("fs-extra"),{once:Ede}=require("events"),{handleHDBError:_de,hdbErrors:gde}=ge(),{PACKAGE_ROOT:Sde}=Rt(),{replicateOperation:Tde}=(is(),v(Go)),Rde=hO.join(Sde,"logs"),yde=1e3,Ade=200;BV.exports=bde;async function bde(e){let t=pde(e);if(t)throw _de(t,t.message,gde.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=Tde(e),n=hde.get(oT.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e.log_name===void 0?oT.LOG_NAMES.HDB:e.log_name,i=s===oT.LOG_NAMES.INSTALL?hO.join(Rde,oT.LOG_NAMES.INSTALL):hO.join(n,s),a=e.level!==void 0,c=a?e.level:void 0,l=e.from!==void 0,u=l?new Date(e.from):void 0,d=e.until!==void 0,f=d?new Date(e.until):void 0,m=e.limit===void 0?yde:e.limit,h=e.order===void 0?void 0:e.order,p=e.start===void 0?0:e.start,_=p+m,g=0;h==="desc"&&!u&&!f&&(g=Math.max(xV.statSync(i).size-(_+5)*Ade,0));let y=xV.createReadStream(i,{start:g});y.on("error",G=>{mde.error(G)});let T=0,R=[],N="",O;y.on("data",G=>{let Y=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;G=N+G;let q=0,K;for(;(K=Y.exec(G))&&!y.destroyed;){O&&(O.message=G.slice(q,K.index),F(O));let[ce,le,se]=K,pe=se.split("] ["),Ne=pe[0],Ue=pe[1];pe.splice(0,2),O={timestamp:le,thread:Ne,level:Ue,tags:pe,message:""},q=K.index+ce.length}N=G.slice(q)}),y.on("end",G=>{y.destroyed||O&&(O.message=N.trim(),F(O))}),y.resume();function F(G){let Y,q,K;switch(!0){case(a&&l&&d):Y=new Date(G.timestamp),q=new Date(u),K=new Date(f),G.level===c&&Y>=q&&Y<=K&&T<p?T++:G.level===c&&Y>=q&&Y<=K&&(ro(G,h,R),T++,T===_&&y.destroy());break;case(a&&l):Y=new Date(G.timestamp),q=new Date(u),G.level===c&&Y>=q&&T<p?T++:G.level===c&&Y>=q&&(ro(G,h,R),T++,T===_&&y.destroy());break;case(a&&d):Y=new Date(G.timestamp),K=new Date(f),G.level===c&&Y<=K&&T<p?T++:G.level===c&&Y<=K&&(ro(G,h,R),T++,T===_&&y.destroy());break;case(l&&d):Y=new Date(G.timestamp),q=new Date(u),K=new Date(f),Y>=q&&Y<=K&&T<p?T++:Y>=q&&Y<=K&&(ro(G,h,R),T++,T===_&&y.destroy());break;case a:G.level===c&&T<p?T++:G.level===c&&(ro(G,h,R),T++,T===_&&y.destroy());break;case l:Y=new Date(G.timestamp),q=new Date(u),Y>=q&&T<p?T++:Y>=q&&T>=p&&(ro(G,h,R),T++,T===_&&y.destroy());break;case d:Y=new Date(G.timestamp),K=new Date(f),Y<=K&&T<p?T++:Y<=K&&T>=p&&(ro(G,h,R),T++,T===_&&y.destroy());break;default:T<p?T++:(ro(G,h,R),T++,T===_&&y.destroy())}}o(F,"onLogMessage"),await Ede(y,"close");let Z=await r;if(Z.replicated){for(let G of R)G.node=server.hostname;for(let G of Z.replicated){let Y=G.node;if(G.status==="failed")ro({timestamp:new Date().toISOString(),level:"error",node:Y,message:`Error retrieving logs: ${G.reason}`},h,R);else for(let q of G.results)q.node=Y,ro(q,h,R)}}return R}o(bde,"readLog");function ro(e,t,r){t==="desc"?Ide(e,r):t==="asc"?Nde(e,r):r.push(e)}o(ro,"pushLineToResult");function Ide(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)>r?n=i+1:s=i}t.splice(n,0,e)}o(Ide,"insertDescending");function Nde(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)<r?n=i+1:s=i}t.splice(n,0,e)}o(Nde,"insertAscending")});var aT=M((qve,GV)=>{"use strict";var EO=require("joi"),{string:Hd,boolean:FV,date:wde}=EO.types(),Ode=lt(),{validateSchemaExists:Fve,validateTableExists:Hve,validateSchemaName:kve}=Hi(),Cde=(k(),v(W)),Pde=It(),HV=oe();HV.initSync();var Gve=Hd.invalid(HV.get(Cde.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Pde.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),kV={operation:Hd.valid("add_node","update_node","set_node_replication"),node_name:Hd.optional(),subscriptions:EO.array().items({table:Hd.optional(),schema:Hd.optional(),database:Hd.optional(),subscribe:FV.required(),publish:FV.required().custom(Dde),start_time:wde.iso()})};function Lde(e){return Ode.validateBySchema(e,EO.object(kV))}o(Lde,"addUpdateNodeValidator");function Dde(e,t){if(t.state.ancestors[2].operation==="add_node"&&e===!1&&t.state.ancestors[0].subscribe===!1)return t.message(`'subscriptions[${t.state.path[1]}]' subscribe and/or publish must be set to true when adding a node`)}o(Dde,"checkForFalsy");GV.exports={addUpdateNodeValidator:Lde,validationSchema:kV}});var kd=M((Vve,qV)=>{"use strict";var _O=class{static{o(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},gO=class{static{o(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};qV.exports={Node:_O,NodeSubscription:gO}});var VV=M((Yve,$V)=>{"use strict";var Mde=(k(),v(W)).OPERATIONS_ENUM,SO=class{static{o(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Mde.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};$V.exports=SO});var rp=M((zve,KV)=>{"use strict";var TO=class{static{o(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},RO=class{static{o(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,a,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=a,c!==void 0&&(this.attributes=c)}};KV.exports={RemotePayloadObject:TO,RemotePayloadSubscription:RO}});var WV=M((Qve,YV)=>{"use strict";var yO=class{static{o(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,a=0){this.schema=t,this.table=r,this.table_size=n,this.record_count=s,this.transaction_log_size=i,this.transaction_log_record_count=a}};YV.exports=yO});var jV=M((rUe,zV)=>{"use strict";var vde=WV(),Xve=qt(),Zve=_t(),Ude=Q(),{getSchemaPath:eUe,getTransactionAuditStorePath:tUe}=yt(),{getDatabases:xde}=(De(),v(mt));zV.exports=Bde;async function Bde(e){let t=new vde;try{let r=xde()[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){Ude.warn(`unable to stat table dbi due to ${r}`)}return t}o(Bde,"lmdbGetTableSize")});var JV=M((sUe,QV)=>{"use strict";var AO=class{static{o(this,"SystemInformationObject")}constructor(t,r,n,s,i,a,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=a,this.harperdb_processes=c}};QV.exports=AO});var qd=M((uUe,t1)=>{"use strict";var Fde=require("fs-extra"),Hde=require("path"),hn=require("systeminformation"),sc=Q(),XV=mr(),oUe=It(),Gd=(k(),v(W)),kde=jV(),Gde=Ua(),{getThreadInfo:ZV}=rt(),np=oe();np.initSync();var qde=JV(),{openEnvironment:aUe}=_t(),{getSchemaPath:cUe}=yt(),{database:lUe,databases:bO}=(De(),v(mt)),cT;t1.exports={getHDBProcessInfo:OO,getNetworkInfo:PO,getDiskInfo:CO,getMemoryInfo:wO,getCPUInfo:NO,getTimeInfo:IO,getSystemInformation:LO,systemInformation:$de,getTableSize:DO,getMetrics:MO};function IO(){return hn.time()}o(IO,"getTimeInfo");async function NO(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:a,governor:c,socket:l,cache:u,...d}=await hn.cpu();d.cpu_speed=await hn.cpuCurrentSpeed();let{rawCurrentload:f,rawCurrentloadIdle:m,rawCurrentloadIrq:h,rawCurrentloadNice:p,rawCurrentloadSystem:_,rawCurrentloadUser:g,cpus:y,...T}=await hn.currentLoad();return T.cpus=[],y.forEach(R=>{let{rawLoad:N,rawLoadIdle:O,rawLoadIrq:F,rawLoadNice:Z,rawLoadSystem:G,rawLoadUser:Y,...q}=R;T.cpus.push(q)}),d.current_load=T,d}catch(e){return sc.error(`error in getCPUInfo: ${e}`),{}}}o(NO,"getCPUInfo");async function wO(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await hn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return sc.error(`error in getMemoryInfo: ${e}`),{}}}o(wO,"getMemoryInfo");async function OO(){let e={core:[],clustering:[]};try{let t=await hn.processes(),r;try{r=Number.parseInt(await Fde.readFile(Hde.join(np.get(Gd.CONFIG_PARAMS.ROOTPATH),Gd.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===Gd.NODE_ERROR_CODES.ENOENT)sc.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 sc.error(`error in getHDBProcessInfo: ${t}`),e}}o(OO,"getHDBProcessInfo");async function CO(){let e={};try{if(!np.get(Gd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await hn.disksIO();e.io=i;let{rxSec:a,txSec:c,wxSec:l,...u}=await hn.fsStats();return e.read_write=u,e.size=await hn.fsSize(),e}catch(t){return sc.error(`error in getDiskInfo: ${t}`),e}}o(CO,"getDiskInfo");async function PO(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return np.get(Gd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await hn.networkInterfaceDefault(),e.latency=await hn.inetChecksite("google.com"),(await hn.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:a,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrierChanges:f,...m}=n;e.interfaces.push(m)}),(await hn.networkStats()).forEach(n=>{let{rxSec:s,txSec:i,ms:a,...c}=n;e.stats.push(c)})),e}catch(t){return sc.error(`error in getNetworkInfo: ${t}`),e}}o(PO,"getNetworkInfo");async function LO(){if(cT!==void 0)return cT;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:a,...c}=await hn.osInfo();e=c;let l=await hn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,cT=e,cT}catch(t){return sc.error(`error in getSystemInformation: ${t}`),e}}o(LO,"getSystemInformation");async function DO(){let e=[],t=await Gde.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await kde(n));return e}o(DO,"getTableSize");async function MO(){let e={};for(let t in bO){let r=e[t]={},n=r.tables={};for(let s in bO[t])try{let i=bO[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,d,f]=l.trim().split(" ");return{pid:u,thread:d,txnid:f}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}}let a=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=a[l];n[s]=c}catch(i){sc.notify(`Error getting stats for table ${s}: ${i}`)}}return e}o(MO,"getMetrics");async function e1(){if(np.get(Gd.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await XV.getNATSReferences(),t=await XV.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let a={stream_name:n.config.name,database:n.config.subjects[0].split(".")[1],table:n.config.subjects[0].split(".")[2],state:n.state,consumers:s};r.push(a)}return r}}o(e1,"getNatsStreamInfo");async function $de(e){let t=new qde;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await LO(),t.time=IO(),t.cpu=await NO(),t.memory=await wO(),t.disk=await CO(),t.network=await PO(),t.harperdb_processes=await OO(),t.table_size=await DO(),t.metrics=await MO(),t.threads=await ZV(),t.replication=await e1(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await LO();break;case"time":t.time=IO();break;case"cpu":t.cpu=await NO();break;case"memory":t.memory=await wO();break;case"disk":t.disk=await CO();break;case"network":t.network=await PO();break;case"harperdb_processes":t.harperdb_processes=await OO();break;case"table_size":t.table_size=await DO();break;case"database_metrics":case"metrics":t.metrics=await MO();break;case"threads":t.threads=await ZV();break;case"replication":t.replication=await e1();break;default:break}return t}o($de,"systemInformation")});var Ko=M((pUe,i1)=>{"use strict";var Vde=Mn(),vO=ie(),Kde=require("util"),Fl=(k(),v(W)),r1=oe();r1.initSync();var Yde=Ew(),n1=on(),{Node:fUe,NodeSubscription:mUe}=kd(),Wde=Vu(),zde=VV(),{RemotePayloadObject:jde,RemotePayloadSubscription:Qde}=rp(),{handleHDBError:Jde,hdbErrors:Xde}=ge(),{HTTP_STATUS_CODES:Zde,HDB_ERROR_MSGS:efe}=Xde,tfe=ai(),rfe=qd(),{packageJson:nfe}=Rt(),{getDatabases:sfe}=(De(),v(mt)),hUe=Kde.promisify(Yde.authorize),ife=n1.searchByHash,ofe=n1.searchByValue;i1.exports={isEmpty:afe,getNodeRecord:cfe,upsertNodeRecord:lfe,buildNodePayloads:ufe,checkClusteringEnabled:dfe,getAllNodeRecords:ffe,getSystemInfo:mfe,reverseSubscription:s1};function afe(e){return e==null}o(afe,"isEmpty");async function cfe(e){let t=new Wde(Fl.SYSTEM_SCHEMA_NAME,Fl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return ife(t)}o(cfe,"getNodeRecord");async function lfe(e){let t=new zde(Fl.SYSTEM_SCHEMA_NAME,Fl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Vde.upsert(t)}o(lfe,"upsertNodeRecord");function s1(e){if(vO.isEmpty(e.subscribe)||vO.isEmpty(e.publish))throw new Error("Received invalid subscription object");let{schema:t,table:r,hash_attribute:n}=e,s={schema:t,table:r,hash_attribute:n};return e.subscribe===!0&&e.publish===!1?(s.subscribe=!1,s.publish=!0):e.subscribe===!1&&e.publish===!0?(s.subscribe=!0,s.publish=!1):(s.subscribe=e.subscribe,s.publish=e.publish),s}o(s1,"reverseSubscription");function ufe(e,t,r,n){let s=[];for(let i=0,a=e.length;i<a;i++){let c=e[i],{schema:l,table:u}=c,d=vO.getTableHashAttribute(l,u),{subscribe:f,publish:m}=s1(c),h=sfe()[l]?.[u],p=new Qde(l,u,d,m,f,c.start_time,h.schemaDefined?h.attributes:void 0);s.push(p)}return new jde(r,t,s,n)}o(ufe,"buildNodePayloads");function dfe(){if(!r1.get(Fl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw Jde(new Error,efe.CLUSTERING_NOT_ENABLED,Zde.BAD_REQUEST,void 0,void 0,!0)}o(dfe,"checkClusteringEnabled");async function ffe(){let e=new tfe(Fl.SYSTEM_SCHEMA_NAME,Fl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await ofe(e))}o(ffe,"getAllNodeRecords");async function mfe(){let e=await rfe.getSystemInformation();return{hdb_version:nfe.version,node_version:e.node_version,platform:e.platform}}o(mfe,"getSystemInfo")});var UO=M((_Ue,m1)=>{"use strict";var lT=mr(),o1=ie(),a1=It(),c1=(k(),v(W)),uT=Q(),l1=ep(),hfe=km(),{RemotePayloadObject:pfe}=rp(),{handleHDBError:u1,hdbErrors:Efe}=ge(),{HTTP_STATUS_CODES:d1}=Efe,{NodeSubscription:f1}=kd();m1.exports=_fe;async function _fe(e,t){let r;try{r=await lT.request(`${t}.${a1.REQUEST_SUFFIX}`,new pfe(c1.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),uT.trace("Response from remote describe all request:",r)}catch(a){uT.error(`addNode received error from describe all request to remote node: ${a}`);let c=lT.requestErrorHandler(a,"add_node",t);throw u1(new Error,c,d1.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===a1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let a=`Error returned from remote node ${t}: ${r.message}`;throw u1(new Error,a,d1.INTERNAL_SERVER_ERROR,"error",a)}let n=r.message,s=[],i=[];for(let a of e){let{table:c}=a,l=a.database??a.schema??"data";if(l===c1.SYSTEM_SCHEMA_NAME){await lT.createLocalTableStream(l,c);let p=new f1(l,c,a.publish,a.subscribe);p.start_time=a.start_time,i.push(p);continue}let u=o1.doesSchemaExist(l),d=n[l]!==void 0,f=c?o1.doesTableExist(l,c):!0,m=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!f&&!m){s.push(a);continue}if(!u&&d&&(uT.trace(`addNode creating schema: ${l}`),await l1.createSchema({operation:"create_schema",schema:l})),!f&&m){uT.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let p=new hfe(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(p.attributes=n[l][c].attributes),await l1.createTable(p)}await lT.createLocalTableStream(l,c);let h=new f1(l,c,a.publish,a.subscribe);h.start_time=a.start_time,i.push(h)}return{added:i,skipped:s}}o(_fe,"reviewSubscriptions")});var $d={};Oe($d,{addNodeBack:()=>xO,removeNodeBack:()=>BO,setNode:()=>Rfe});async function Rfe(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=pi(t)):t=ZS(r);let n=(0,p1.validateBySchema)(e,Tfe);if(n)throw(0,Yo.handleHDBError)(n,n.message,Sfe.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new Yo.ClientError("url or hostname is required for remove_node operation");let h=r,p=Kt(),_=await p.get(h);if(!_)throw new Yo.ClientError(h+" does not exist");try{await Xh({url:_.url},{operation:$.REMOVE_NODE_BACK,name:_?.subscriptions?.length>0?Ze():h},void 0)}catch(g){cs.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 p.delete(h),`Successfully removed '${h}' from cluster`}if(!t)throw new Yo.ClientError("url required for this operation");let s=ja();if(s==null)throw new Yo.ClientError("replication url is missing from harperdb-config.yaml");let i,a,c;if(t?.startsWith("wss:")){i=await(0,Ms.getReplicationCert)();let h=await(0,Ms.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(a=await(0,Ms.createCsr)(),cs.info("Sending CSR to target node:",t)):h&&(c=h.certificate,cs.info("Sending CA named",h.name,"to target node",t))}let l={operation:$.ADD_NODE_BACK,hostname:(0,oc.get)(U.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:a,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,oc.get)(U.REPLICATION_SHARD)!==void 0&&(l.shard=(0,oc.get)(U.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(h1):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let h=h1(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,d;try{u=await Xh({url:t},l,e)}catch(h){h.message=`Error returned from ${t}: `+h.message,cs.warn("Error adding node:",t,"to cluster:",h),d=h}if(a&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw d?(d.message+=" and connection was required to sign certificate",d):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);a&&(cs.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ms.setCertTable)({name:gfe.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ms.setCertTable)({name:Ze(),uses:["https","operations","wss"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let f={url:t,ca:u?.usingCA};if(e.hostname&&(f.name=e.hostname),e.subscriptions?f.subscriptions=e.subscriptions:f.replicates=!0,e.start_time&&(f.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(f.authorization=e.authorization),e.revoked_certificates&&(f.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?f.shard=u.shard:e.shard!==void 0&&(f.shard=e.shard),f.replicates){let h={url:s,ca:c,replicates:!0,subscriptions:null};(0,oc.get)(U.REPLICATION_SHARD)!==void 0&&(h.shard=(0,oc.get)(U.REPLICATION_SHARD)),e.retain_authorization&&(h.authorization=e.authorization),e.start_time&&(h.start_time=e.start_time),await Ho(Ze(),h)}await Ho(u?u.nodeName:f.name??pi(t),f);let m;return e.operation==="update_node"?m=`Successfully updated '${t}'`:m=`Successfully added '${t}' to cluster`,d&&(m+=" but there was an error updating target node: "+d.message),m}async function xO(e){cs.trace("addNodeBack received request:",e);let t=await(0,Ms.signCertificate)(e),r;e.csr?(r=t.signingCA,cs.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,cs.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,Ms.getReplicationCertAuth)();if(n.replicates){let i={url:ja(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,oc.get)(U.REPLICATION_SHARD)!==void 0&&(i.shard=(0,oc.get)(U.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Ho(Ze(),i)}return await Ho(e.hostname,n),t.nodeName=Ze(),t.usingCA=s?.certificate,cs.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function BO(e){cs.trace("removeNodeBack received request:",e),await Kt().delete(e.name)}function h1(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ms,p1,ic,oc,cs,Yo,gfe,Sfe,Tfe,Vd=ue(()=>{Ms=w(as()),p1=w(lt()),ic=w(require("joi")),oc=w(oe());k();Wh();Ll();is();cs=w(Q()),Yo=w(ge()),{pki:gfe}=require("node-forge"),{HTTP_STATUS_CODES:Sfe}=Yo.hdbErrors,Tfe=ic.default.object({hostname:ic.default.string(),verify_tls:ic.default.boolean(),replicates:ic.default.boolean(),subscriptions:ic.default.array(),revoked_certificates:ic.default.array(),shard:ic.default.number()});o(Rfe,"setNode");o(xO,"addNodeBack");o(BO,"removeNodeBack");o(h1,"reverseSubscription")});var pT=M((NUe,_1)=>{"use strict";var{handleHDBError:dT,hdbErrors:yfe}=ge(),{HTTP_STATUS_CODES:fT}=yfe,{addUpdateNodeValidator:Afe}=aT(),mT=Q(),hT=(k(),v(W)),E1=It(),bfe=ie(),sp=mr(),ip=Ko(),FO=oe(),Ife=UO(),{Node:Nfe,NodeSubscription:wfe}=kd(),{broadcast:Ofe}=rt(),{setNode:Cfe}=(Vd(),v($d)),bUe=oe(),IUe=(k(),v(W)),Pfe="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Lfe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Dfe=FO.get(hT.CONFIG_PARAMS.CLUSTERING_NODENAME);_1.exports=Mfe;async function Mfe(e,t=!1){if(mT.trace("addNode called with:",e),FO.get(hT.CONFIG_PARAMS.REPLICATION_URL)||FO.get(hT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Cfe(e);ip.checkClusteringEnabled();let r=Afe(e);if(r)throw dT(r,r.message,fT.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let f=await ip.getNodeRecord(n);if(!bfe.isEmptyOrZeroLength(f))throw dT(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,fT.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Ife(e.subscriptions,n),a={message:void 0,added:s,skipped:i};if(s.length===0)return a.message=Pfe,a;let c=ip.buildNodePayloads(s,Dfe,hT.OPERATIONS_ENUM.ADD_NODE,await ip.getSystemInfo()),l=[];for(let f=0,m=s.length;f<m;f++){let h=s[f];s[f].start_time===void 0&&delete s[f].start_time,l.push(new wfe(h.schema,h.table,h.publish,h.subscribe))}mT.trace("addNode sending remote payload:",c);let u;try{u=await sp.request(`${n}.${E1.REQUEST_SUFFIX}`,c)}catch(f){mT.error(`addNode received error from request: ${f}`);for(let h=0,p=s.length;h<p;h++){let _=s[h];_.publish=!1,_.subscribe=!1,await sp.updateRemoteConsumer(_,n)}let m=sp.requestErrorHandler(f,"add_node",n);throw dT(new Error,m,fT.INTERNAL_SERVER_ERROR,"error",m)}if(u.status===E1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${n}: ${u.message}`;throw dT(new Error,f,fT.INTERNAL_SERVER_ERROR,"error",f)}mT.trace(u);for(let f=0,m=s.length;f<m;f++){let h=s[f];await sp.updateRemoteConsumer(h,n),h.subscribe===!0&&await sp.updateConsumerIterator(h.schema,h.table,n,"start")}let d=new Nfe(n,l,u.system_info);return await ip.upsertNodeRecord(d),Ofe({type:"nats_update"}),i.length>0?a.message=Lfe:a.message=`Successfully added '${n}' to manifest`,a}o(Mfe,"addNode")});var qO=M((CUe,S1)=>{"use strict";var{handleHDBError:HO,hdbErrors:vfe}=ge(),{HTTP_STATUS_CODES:kO}=vfe,{addUpdateNodeValidator:Ufe}=aT(),op=Q(),ET=(k(),v(W)),g1=It(),OUe=ie(),ap=mr(),cp=Ko(),GO=oe(),{cloneDeep:xfe}=require("lodash"),Bfe=UO(),{Node:Ffe,NodeSubscription:Hfe}=kd(),{broadcast:kfe}=rt(),{setNode:Gfe}=(Vd(),v($d)),qfe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",$fe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Vfe=GO.get(ET.CONFIG_PARAMS.CLUSTERING_NODENAME);S1.exports=Kfe;async function Kfe(e){if(op.trace("updateNode called with:",e),GO.get(ET.CONFIG_PARAMS.REPLICATION_URL)??GO.get(ET.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Gfe(e);cp.checkClusteringEnabled();let t=Ufe(e);if(t)throw HO(t,t.message,kO.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await cp.getNodeRecord(r);s.length>0&&(n=xfe(s));let{added:i,skipped:a}=await Bfe(e.subscriptions,r),c={message:void 0,updated:i,skipped:a};if(i.length===0)return c.message=qfe,c;let l=cp.buildNodePayloads(i,Vfe,ET.OPERATIONS_ENUM.UPDATE_NODE,await cp.getSystemInfo());for(let d=0,f=i.length;d<f;d++){let m=i[d];op.trace(`updateNode updating work stream for node: ${r} subscription:`,m),i[d].start_time===void 0&&delete i[d].start_time}op.trace("updateNode sending remote payload:",l);let u;try{u=await ap.request(`${r}.${g1.REQUEST_SUFFIX}`,l)}catch(d){op.error(`updateNode received error from request: ${d}`);let f=ap.requestErrorHandler(d,"update_node",r);throw HO(new Error,f,kO.INTERNAL_SERVER_ERROR,"error",f)}if(u.status===g1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw HO(new Error,d,kO.INTERNAL_SERVER_ERROR,"error",d)}op.trace(u);for(let d=0,f=i.length;d<f;d++){let m=i[d];await ap.updateRemoteConsumer(m,r),m.subscribe===!0?await ap.updateConsumerIterator(m.schema,m.table,r,"start"):await ap.updateConsumerIterator(m.schema,m.table,r,"stop")}return n||(n=[new Ffe(r,[],u.system_info)]),await Yfe(n[0],i,u.system_info),a.length>0?c.message=$fe:c.message=`Successfully updated '${r}'`,c}o(Kfe,"updateNode");async function Yfe(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let a=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let d=n.subscriptions[l];if(d.schema===a.schema&&d.table===a.table){d.publish=a.publish,d.subscribe=a.subscribe,c=!0;break}}c||n.subscriptions.push(new Hfe(a.schema,a.table,a.publish,a.subscribe))}n.system_info=r,await cp.upsertNodeRecord(n),kfe({type:"nats_update"})}o(Yfe,"updateNodeTable")});var b1=M((LUe,A1)=>{"use strict";var y1=require("joi"),{string:T1}=y1.types(),Wfe=lt(),R1=(k(),v(W)),zfe=oe(),jfe=It();A1.exports=Qfe;function Qfe(e){let t=T1.invalid(zfe.get(R1.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(jfe.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=y1.object({operation:T1.valid(R1.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return Wfe.validateBySchema(e,r)}o(Qfe,"removeNodeValidator")});var _T=M((MUe,C1)=>{"use strict";var{handleHDBError:I1,hdbErrors:Jfe}=ge(),{HTTP_STATUS_CODES:N1}=Jfe,Xfe=b1(),lp=Q(),w1=Ko(),Zfe=ie(),Kd=(k(),v(W)),O1=It(),$O=mr(),VO=oe(),{RemotePayloadObject:eme}=rp(),{NodeSubscription:tme}=kd(),rme=Hm(),nme=pl(),{broadcast:sme}=rt(),{setNode:ime}=(Vd(),v($d)),ome=VO.get(Kd.CONFIG_PARAMS.CLUSTERING_NODENAME);C1.exports=ame;async function ame(e){if(lp.trace("removeNode called with:",e),VO.get(Kd.CONFIG_PARAMS.REPLICATION_URL)??VO.get(Kd.CONFIG_PARAMS.REPLICATION_HOSTNAME))return ime(e);w1.checkClusteringEnabled();let t=Xfe(e);if(t)throw I1(t,t.message,N1.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await w1.getNodeRecord(r);if(Zfe.isEmptyOrZeroLength(n))throw I1(new Error,`Node '${r}' was not found.`,N1.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new eme(Kd.OPERATIONS_ENUM.REMOVE_NODE,ome,[]),i,a=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await $O.updateConsumerIterator(d.schema,d.table,r,"stop");try{await $O.updateRemoteConsumer(new tme(d.schema,d.table,!1,!1),r)}catch(f){lp.error(f)}}try{i=await $O.request(`${r}.${O1.REQUEST_SUFFIX}`,s),lp.trace("Remove node reply from remote node:",r,i)}catch(l){lp.error("removeNode received error from request:",l),a=!0}let c=new rme(Kd.SYSTEM_SCHEMA_NAME,Kd.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await nme.deleteRecord(c),sme({type:"nats_update"}),i?.status===O1.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||a?(lp.error("Error returned from remote node:",r,i?.message),`Successfully removed '${r}' from local manifest, however there was an error reaching remote node. Check the logs for more details.`):`Successfully removed '${r}' from manifest`}o(ame,"removeNode")});var D1=M((UUe,L1)=>{"use strict";var P1=require("joi"),{string:cme,array:lme}=P1.types(),ume=lt(),dme=aT();L1.exports=fme;function fme(e){let t=P1.object({operation:cme.valid("configure_cluster").required(),connections:lme.items(dme.validationSchema).required()});return ume.validateBySchema(e,t)}o(fme,"configureClusterValidator")});var KO=M((BUe,B1)=>{"use strict";var M1=(k(),v(W)),gT=Q(),mme=ie(),hme=oe(),pme=_T(),Eme=pT(),_me=Ko(),gme=D1(),{handleHDBError:v1,hdbErrors:Sme}=ge(),{HTTP_STATUS_CODES:U1}=Sme,Tme="Configure cluster complete.",Rme="Failed to configure the cluster. Check the logs for more details.",yme="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";B1.exports=Ame;async function Ame(e){gT.trace("configure cluster called with:",e);let t=gme(e);if(t)throw v1(t,t.message,U1.BAD_REQUEST,void 0,void 0,!0);let r=await _me.getAllNodeRecords(),n=[];if(hme.get(M1.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,f=r.length;d<f;d++){let m=await x1(pme,{operation:M1.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(m)}gT.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let f=e.connections[d],m=await x1(Eme,f,f.node_name);s.push(m)}gT.trace("All results from configure_cluster add node:",s);let a=[],c=[],l=!1,u=n.concat(s);for(let d=0,f=u.length;d<f;d++){let m=u[d];m.status==="rejected"&&(gT.error(m.node_name,m?.error?.message,m?.error?.stack),a.includes(m.node_name)||a.push(m.node_name)),(m?.result?.message?.includes?.("Successfully")||m?.result?.includes?.("Successfully"))&&(l=!0),!(typeof m.result=="string"&&m.result.includes("Successfully removed")||m.status==="rejected")&&c.push({node_name:m?.node_name,response:m?.result})}if(mme.isEmptyOrZeroLength(a))return{message:Tme,connections:c};if(l)return{message:yme,failed_nodes:a,connections:c};throw v1(new Error,Rme,U1.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}o(Ame,"configureCluster");async function x1(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}o(x1,"functionWrapper")});var G1=M((HUe,k1)=>{"use strict";var up=require("joi"),bme=lt(),{validateSchemaExists:F1,validateTableExists:Ime,validateSchemaName:H1}=Hi(),Nme=up.object({operation:up.string().valid("purge_stream"),schema:up.string().custom(F1).custom(H1).optional(),database:up.string().custom(F1).custom(H1).optional(),table:up.string().custom(Ime).required()});function wme(e){return bme.validateBySchema(e,Nme)}o(wme,"purgeStreamValidator");k1.exports=wme});var YO=M((GUe,q1)=>{"use strict";var{handleHDBError:Ome,hdbErrors:Cme}=ge(),{HTTP_STATUS_CODES:Pme}=Cme,Lme=G1(),Dme=mr(),Mme=Ko();q1.exports=vme;async function vme(e){e.schema=e.schema??e.database;let t=Lme(e);if(t)throw Ome(t,t.message,Pme.BAD_REQUEST,void 0,void 0,!0);Mme.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Dme.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}o(vme,"purgeStream")});var jO=M(($Ue,j1)=>{"use strict";var zO=Ko(),Ume=mr(),TT=oe(),Yd=(k(),v(W)),Hl=It(),xme=ie(),WO=Q(),{RemotePayloadObject:Bme}=rp(),{ErrorCode:$1}=require("nats"),{parentPort:V1}=require("worker_threads"),{onMessageByType:Fme}=rt(),{getThisNodeName:Hme}=(is(),v(Go)),{requestClusterStatus:kme}=(Wh(),v(h$)),{getReplicationSharedStatus:Gme,getHDBNodeTable:qme}=(Ll(),v(Fw)),{CONFIRMATION_STATUS_POSITION:$me,RECEIVED_VERSION_POSITION:Vme,RECEIVED_TIME_POSITION:Kme,SENDING_TIME_POSITION:Yme,RECEIVING_STATUS_POSITION:Wme,RECEIVING_STATUS_RECEIVING:zme}=(oO(),v(nV)),K1=TT.get(Yd.CONFIG_PARAMS.CLUSTERING_ENABLED),Y1=TT.get(Yd.CONFIG_PARAMS.CLUSTERING_NODENAME);j1.exports={clusterStatus:jme,buildNodeStatus:z1};var W1;Fme("cluster-status",async e=>{W1(e)});async function jme(){if(TT.get(Yd.CONFIG_PARAMS.REPLICATION_URL)||TT.get(Yd.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(V1){V1.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{W1=i});for(let i of n.connections){let a=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let f of Object.values(databases[l]||{}))if(u=f.auditStore,u)break;if(!u)continue;let d=Gme(u,l,a);c.lastCommitConfirmed=ST(d[$me]),c.lastReceivedRemoteTime=ST(d[Vme]),c.lastReceivedLocalTime=ST(d[Kme]),c.sendingMessage=ST(d[Yme]),c.lastReceivedStatus=d[Wme]===zme?"Receiving":"Waiting"}}}else n=kme();n.node_name=Hme();let s=qme().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:Y1,is_enabled:K1,connections:[]};if(!K1)return e;let t=await zO.getAllNodeRecords();if(xme.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(z1(t[n],e.connections));return await Promise.allSettled(r),e}o(jme,"clusterStatus");function ST(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}o(ST,"asDate");async function z1(e,t){let r=e.name,n=new Bme(Yd.OPERATIONS_ENUM.CLUSTER_STATUS,Y1,void 0,await zO.getSystemInfo()),s,i,a=Hl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Ume.request(Hl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Hl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(a=Hl.CLUSTER_STATUS_STATUSES.CLOSED,WO.error(`Error getting node status from ${r} `,s))}catch(l){WO.warn(`Error getting node status from ${r}`,l),l.code===$1.NoResponders?a=Hl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===$1.Timeout?a=Hl.CLUSTER_STATUS_STATUSES.TIMEOUT:a=Hl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Qme(r,a,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==Yd.PRE_4_0_0_VERSION&&await zO.upsertNodeRecord(l)}catch(l){WO.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}o(z1,"buildNodeStatus");function Qme(e,t,r,n,s,i,a,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=a,this.system_info=c}o(Qme,"NodeStatusObject")});var JO=M((KUe,Q1)=>{"use strict";var{handleHDBError:Jme,hdbErrors:Xme}=ge(),{HTTP_STATUS_CODES:Zme}=Xme,ehe=mr(),the=Ko(),QO=ie(),RT=require("joi"),rhe=lt(),nhe=2e3,she=RT.object({timeout:RT.number().min(1),connected_nodes:RT.boolean(),routes:RT.boolean()});Q1.exports=ihe;async function ihe(e){the.checkClusteringEnabled();let t=rhe.validateBySchema(e,she);if(t)throw Jme(t,t.message,Zme.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||QO.autoCastBoolean(n),a=s===void 0||QO.autoCastBoolean(s),c={nodes:[]},l=await ehe.getServerList(r??nhe),u={};if(i)for(let d=0,f=l.length;d<f;d++){let m=l[d].statsz;m&&(u[l[d].server.name]=m.routes)}for(let d=0,f=l.length;d<f;d++){if(l[d].statsz)continue;let m=l[d].server,h=l[d].data;if(m.name.endsWith("-hub")){let p={name:m.name.slice(0,-4),response_time:l[d].response_time};i&&(p.connected_nodes=[],u[m.name]&&u[m.name].forEach(_=>{p.connected_nodes.includes(_.name.slice(0,-4))||p.connected_nodes.push(_.name.slice(0,-4))})),a&&(p.routes=h.cluster?.urls?h.cluster?.urls.map(_=>({host:_.split(":")[0],port:QO.autoCast(_.split(":")[1])})):[]),c.nodes.push(p)}}return c}o(ihe,"clusterNetwork")});var eK=M((WUe,Z1)=>{"use strict";var XO=require("joi"),J1=lt(),{routeConstraints:X1}=VI();Z1.exports={setRoutesValidator:ohe,deleteRoutesValidator:ahe};function ohe(e){let t=XO.object({server:XO.valid("hub","leaf"),routes:X1.required()});return J1.validateBySchema(e,t)}o(ohe,"setRoutesValidator");function ahe(e){let t=XO.object({routes:X1.required()});return J1.validateBySchema(e,t)}o(ahe,"deleteRoutesValidator")});var yT=M((jUe,aK)=>{"use strict";var Wo=bt(),ZO=ie(),vs=(k(),v(W)),Wd=oe(),tK=eK(),{handleHDBError:rK,hdbErrors:che}=ge(),{HTTP_STATUS_CODES:nK}=che,sK="cluster routes successfully set",iK="cluster routes successfully deleted";aK.exports={setRoutes:uhe,getRoutes:dhe,deleteRoutes:fhe};function lhe(e){let t=Wo.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let a=0,c=e.routes.length;a<c;a++){let l=e.routes[a];l.port=ZO.autoCast(l.port);let u=r.some(f=>f.host===l.host&&f.port===l.port),d=n.some(f=>f.host===l.host&&f.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?Wo.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):Wo.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:sK,set:i,skipped:s}}o(lhe,"setRoutesNats");function uhe(e){let t=tK.setRoutesValidator(e);if(t)throw rK(t,t.message,nK.BAD_REQUEST,void 0,void 0,!0);if(Wd.get(vs.CONFIG_PARAMS.CLUSTERING_ENABLED))return lhe(e);let r=[],n=[],s=Wd.get(vs.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{oK(s,i)?n.push(i):(s.push(i),r.push(i))}),Wo.updateConfigValue(vs.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:sK,set:r,skipped:n}}o(uhe,"setRoutes");function oK(e,t){return typeof t=="string"?e.includes(t):typeof t=="object"&&t!==null?e.some(r=>(r.host===t.host||r.hostname===t.hostname)&&r.port===t.port):!1}o(oK,"existsInArray");function dhe(){if(Wd.get(vs.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=Wo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Wd.get(vs.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}o(dhe,"getRoutes");function fhe(e){let t=tK.deleteRoutesValidator(e);if(t)throw rK(t,t.message,nK.BAD_REQUEST,void 0,void 0,!0);if(Wd.get(vs.CONFIG_PARAMS.CLUSTERING_ENABLED))return mhe(e);let r=[],n=[],s=Wd.get(vs.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(a=>{oK(e.routes,a)?r.push(a):(i.push(a),n.push(a))}),Wo.updateConfigValue(vs.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:iK,deleted:r,skipped:n}}o(fhe,"deleteRoutes");function mhe(e){let t=Wo.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],a=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let d=e.routes[l],f=!1;for(let m=0,h=r.length;m<h;m++){let p=r[m];if(d.host===p.host&&d.port===p.port){r.splice(m,1),f=!0,a=!0,s.push(d);break}}if(!f){let m=!0;for(let h=0,p=n.length;h<p;h++){let _=n[h];if(d.host===_.host&&d.port===_.port){n.splice(h,1),c=!0,m=!1,s.push(d);break}}m&&i.push(d)}}return a&&(r=ZO.isEmptyOrZeroLength(r)?null:r,Wo.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=ZO.isEmptyOrZeroLength(n)?null:n,Wo.updateConfigValue(vs.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:iK,deleted:s,skipped:i}}o(mhe,"deleteRoutesNats")});var lK=M((JUe,cK)=>{"use strict";var dp=require("alasql"),kl=require("recursive-iterator"),gi=Q(),hhe=ie(),fp=(k(),v(W)),eC=class{static{o(this,"sqlStatementBucket")}constructor(t){this.ast=t,this.affected_attributes=new Map,this.table_lookup=new Map,this.schema_lookup=new Map,this.table_to_schema_lookup=new Map,Ehe(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=>fp.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=>!fp.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,a=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[a]&&t[i].tables[a][fp.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[a].attribute_permissions.length>0?c=phe(t[i].tables[a].attribute_permissions):c=global.hdb_schema[i][a].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(a).filter(u=>!fp.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new dp.yy.Column({columnid:u});s.tableid&&(d.tableid=s.tableid),this.ast.columns.push(d),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(a,l)}}),this.ast}};function phe(e){return e.filter(t=>t[fp.PERMS_CRUD_ENUM.READ])}o(phe,"filterReadRestrictedAttrs");function Ehe(e,t,r,n,s){_he(e,t,r,n,s)}o(Ehe,"interpretAST");function mp(e,t,r,n,s){if(!(!e||!e.databaseid)&&(t.has(e.databaseid)||t.set(e.databaseid,new Map),t.get(e.databaseid).has(e.tableid)||t.get(e.databaseid).set(e.tableid,[]),e.as&&(r.has(e.as)||r.set(e.as,e.tableid),n&&!n.has(e.as)&&n.set(e.as,e.databaseid)),s)){let i=e.databaseid,a=e.tableid;e.as&&(a=e.as),s.set(a,i)}}o(mp,"addSchemaTableToMap");function _he(e,t,r,n,s){if(!e){gi.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof dp.yy.Insert?Rhe(e,t,r):e instanceof dp.yy.Select?ghe(e,t,r,n,s):e instanceof dp.yy.Update?She(e,t,r):e instanceof dp.yy.Delete?The(e,t,r):gi.error("AST in getRecordAttributesAST() is not a valid SQL type.")}o(_he,"getRecordAttributesAST");function ghe(e,t,r,n,s){if(!e){gi.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(hhe.isEmptyOrZeroLength(i)){gi.error("No schema specified");return}e.from.forEach(c=>{mp(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),mp(c.table,t,r,n,s)});let a=new kl(e.columns);for(let{node:c}of a)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{gi.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 kl(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let d=u.tableid?u.tableid:l;if(!t.get(i).has(d))if(r.has(d))d=r.get(d);else{gi.info(`table specified as ${d} not found.`);continue}t.get(i).get(d).indexOf(u.columnid)<0&&t.get(i).get(d).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new kl(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,f=s.get(d);if(!t.get(f).has(d))if(r.has(d))d=r.get(d);else{gi.info(`table specified as ${d} not found.`);continue}t.get(f).get(d).indexOf(u.columnid)<0&&t.get(f).get(d).push(u.columnid)}}),e.order){let c=new kl(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,d=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(d).has(u))if(r.has(u))u=r.get(u);else{gi.info(`table specified as ${u} not found.`);return}t.get(d).get(u).indexOf(l.columnid)<0&&t.get(d).get(u).push(l.columnid)}}}o(ghe,"getSelectAttributes");function She(e,t,r){if(!e){gi.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new kl(e.columns),s=e.table.databaseid;mp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&tC(e.table.tableid,s,i.columnid,t,r)}o(She,"getUpdateAttributes");function The(e,t,r){if(!e){gi.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new kl(e.where),s=e.table.databaseid;mp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&tC(e.table.tableid,s,i.columnid,t,r)}o(The,"getDeleteAttributes");function Rhe(e,t,r){if(!e){gi.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new kl(e.columns),s=e.into.databaseid;mp(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&tC(e.into.tableid,s,i.columnid,t,r)}o(Rhe,"getInsertAttributes");function tC(e,t,r,n,s){if(!n.get(t))return;let i=e;n.get(t).has(i)||(i=s.get(i)),n.get(t).get(i).push(r)}o(tC,"pushAttribute");cK.exports=eC});var dK=M((ZUe,uK)=>{"use strict";var AT=(k(),v(W)),bT=class{static{o(this,"BaseLicense")}constructor(t=0,r=AT.RAM_ALLOCATION_ENUM.DEFAULT,n=AT.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},rC=class extends bT{static{o(this,"ExtendedLicense")}constructor(t=0,r=AT.RAM_ALLOCATION_ENUM.DEFAULT,n=AT.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};uK.exports={BaseLicense:bT,ExtendedLicense:rC}});var Qd=M((t0e,_K)=>{"use strict";var jd=require("fs-extra"),IT=(mg(),v(fg)),mK=require("crypto"),yhe=require("moment"),Ahe=require("uuid").v4,pn=Q(),sC=require("path"),bhe=ie(),Gl=(k(),v(W)),{totalmem:fK}=require("os"),Ihe=dK().ExtendedLicense,zd="invalid license key format",Nhe="061183",whe="mofi25",Ohe="aes-256-cbc",Che=16,Phe=32,hK=oe(),{resolvePath:pK}=bt();hK.initSync();var nC;_K.exports={validateLicense:EK,generateFingerPrint:Dhe,licenseSearch:aC,getLicense:Uhe,checkMemoryLimit:xhe};function iC(){return sC.join(hK.getHdbBasePath(),Gl.LICENSE_KEY_DIR_NAME,Gl.LICENSE_FILE_NAME)}o(iC,"getLicenseDirPath");function Lhe(){let e=iC();return pK(sC.join(e,Gl.LICENSE_FILE_NAME))}o(Lhe,"getLicenseFilePath");function oC(){let e=iC();return pK(sC.join(e,Gl.REG_KEY_FILE_NAME))}o(oC,"getFingerPrintFilePath");async function Dhe(){let e=oC();try{return await jd.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Mhe();throw pn.error(`Error writing fingerprint file to ${e}`),pn.error(t),new Error("There was an error generating the fingerprint")}}o(Dhe,"generateFingerPrint");async function Mhe(){let e=Ahe(),t=IT.hash(e,IT.HASH_FUNCTION.MD5),r=oC();try{await jd.mkdirp(iC()),await jd.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw pn.error(`Error writing fingerprint file to ${r}`),pn.error(n),new Error("There was an error generating the fingerprint")}return t}o(Mhe,"writeFingerprint");function EK(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:Gl.RAM_ALLOCATION_ENUM.DEFAULT,version:Gl.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return pn.error("empty license key passed to validate."),r;let n=oC(),s=!1;try{s=jd.statSync(n)}catch(i){pn.error(i)}if(s){let i;try{i=jd.readFileSync(n,"utf8")}catch{pn.error("error validating this machine in the license"),r.valid_machine=!1;return}let a=e.split(whe),c=a[1];c=Buffer.concat([Buffer.from(c)],Che);let l=Buffer.concat([Buffer.from(i)],Phe),u=mK.createDecipheriv(Ohe,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let d=null;try{d=u.update(a[0],"hex","utf8"),d.trim(),d+=u.final("utf8")}catch{let h=vhe(a[0],i);if(h)d=h;else throw r.valid_license=!1,r.valid_machine=!1,console.error(zd),pn.error(zd),new Error(zd)}let f;if(isNaN(d))try{f=JSON.parse(d),r.version=f.version,r.exp_date=f.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),f.ram_allocation&&(r.ram_allocation=f.ram_allocation)}catch{throw console.error(zd),pn.error(zd),new Error(zd)}else r.exp_date=d;r.exp_date<yhe().valueOf()&&(r.valid_date=!1),IT.validate(a[1],`${Nhe}${i}${t}`,IT.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||pn.error("Invalid licence"),r}o(EK,"validateLicense");function vhe(e,t){try{let r=mK.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{pn.warn("Check old license failed")}}o(vhe,"checkOldLicense");function aC(){let e=new Ihe,t=[];try{t=jd.readFileSync(Lhe(),"utf-8").split(`\r
|
|
24
24
|
`)}catch(r){r.code==="ENOENT"?pn.debug("no license file found"):pn.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(bhe.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=EK(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){pn.error("There was an error parsing the license string."),pn.error(s),e.ram_allocation=Gl.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return nC=e,e}o(aC,"licenseSearch");async function Uhe(){return nC||await aC(),nC}o(Uhe,"getLicense");function xhe(){let e=aC().ram_allocation,t=process.constrainedMemory?.()||fK();if(t=Math.round(Math.min(t,fK())/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.`}o(xhe,"checkMemoryLimit")});var uC=M((n0e,RK)=>{var NT=Qd(),gK=require("chalk"),ls=Q(),SK=require("prompt"),{promisify:Bhe}=require("util"),cC=(k(),v(W)),Fhe=require("fs-extra"),Hhe=require("path"),khe=ie(),{packageJson:Ghe}=Rt(),TK=oe();TK.initSync();var qhe=require("moment"),$he=Bhe(SK.get),Vhe=Hhe.join(TK.getHdbBasePath(),cC.LICENSE_KEY_DIR_NAME,cC.LICENSE_FILE_NAME,cC.LICENSE_FILE_NAME);RK.exports={getFingerprint:Yhe,setLicense:Khe,parseLicense:lC,register:Whe,getRegistrationInfo:jhe};async function Khe(e){if(e&&e.key&&e.company){try{ls.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await lC(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw ls.error(r),ls.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}o(Khe,"setLicense");async function Yhe(){let e={};try{e=await NT.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw ls.error(r),ls.error(t),new Error(r)}return e}o(Yhe,"getFingerprint");async function lC(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");ls.info("Validating license input...");let r=NT.validateLicense(e,t);if(ls.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(ls.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(ls.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{ls.info("writing license to disk"),await Fhe.writeFile(Vhe,JSON.stringify({license_key:e,company:t}))}catch(n){throw ls.error("Failed to write License"),n}return"Registration successful."}o(lC,"parseLicense");async function Whe(){let e=await zhe();return lC(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}o(Whe,"register");async function zhe(){let e=await NT.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:gK.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:gK.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{SK.start()}catch(n){ls.error(n)}let r;try{r=await $he(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}o(zhe,"promptForRegistration");async function jhe(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await NT.getLicense()}catch(r){throw ls.error(`There was an error when searching licenses due to: ${r.message}`),r}if(khe.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=Ghe.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=qhe.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}o(jhe,"getRegistrationInfo")});var AK=M((i0e,yK)=>{"use strict";var Qhe=It(),dC=class{static{o(this,"HubConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f,m,h,p){this.port=t,a===null&&(a=void 0),this.server_name=r+Qhe.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c}},this.cluster={name:d,port:f,routes:m,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l}},this.accounts={SYS:{users:h},HDB:{users:p}},this.system_account="SYS"}};yK.exports=dC});var NK=M((a0e,IK)=>{"use strict";var bK=It(),fC=class{static{o(this,"LeafConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f){this.port=t,f===null&&(f=void 0),this.server_name=r+bK.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+bK.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:d,ca_file:f,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:f,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:f,insecure:!0},urls:a,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};IK.exports=fC});var OK=M((l0e,wK)=>{"use strict";var mC=class{static{o(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};wK.exports=mC});var PK=M((d0e,CK)=>{"use strict";var Jhe=It(),hC=class{static{o(this,"SysUserObject")}constructor(t,r){this.user=t+Jhe.SERVER_SUFFIX.ADMIN,this.password=r}};CK.exports=hC});var PT=M((m0e,MK)=>{"use strict";var ql=require("path"),$l=require("fs-extra"),Xhe=AK(),Zhe=NK(),epe=OK(),tpe=PK(),pC=ts(),Xd=ie(),Fn=bt(),OT=(k(),v(W)),hp=It(),{CONFIG_PARAMS:nr}=OT,Zd=Q(),pp=oe(),LK=$i(),EC=mr(),rpe=as(),Jd="clustering",npe=1e4,DK=50;MK.exports={generateNatsConfig:ipe,removeNatsConfig:ope,getHubConfigPath:spe};function spe(){let e=pp.get(nr.ROOTPATH);return ql.join(e,Jd,hp.NATS_CONFIG_FILES.HUB_SERVER)}o(spe,"getHubConfigPath");async function ipe(e=!1,t=void 0){console.error("Warning: NATS replication is deprecated and will be removed in version 5.0 of Harper");let r=pp.get(nr.ROOTPATH);$l.ensureDirSync(ql.join(r,"clustering","leaf")),pp.initSync();let n=Fn.getConfigFromFile(nr.CLUSTERING_TLS_CERT_AUTH),s=Fn.getConfigFromFile(nr.CLUSTERING_TLS_PRIVATEKEY),i=Fn.getConfigFromFile(nr.CLUSTERING_TLS_CERTIFICATE);!await $l.exists(i)&&!await $l.exists(!n)&&await rpe.createNatsCerts();let a=ql.join(r,Jd,hp.PID_FILES.HUB),c=ql.join(r,Jd,hp.PID_FILES.LEAF),l=Fn.getConfigFromFile(nr.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=ql.join(r,Jd,hp.NATS_CONFIG_FILES.HUB_SERVER),d=ql.join(r,Jd,hp.NATS_CONFIG_FILES.LEAF_SERVER),f=Fn.getConfigFromFile(nr.CLUSTERING_TLS_INSECURE),m=Fn.getConfigFromFile(nr.CLUSTERING_TLS_VERIFY),h=Fn.getConfigFromFile(nr.CLUSTERING_NODENAME),p=Fn.getConfigFromFile(nr.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await EC.checkNATSServerInstalled()||CT("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let _=await pC.listUsers(),g=Fn.getConfigFromFile(nr.CLUSTERING_USER),y=await pC.getClusterUser();(Xd.isEmpty(y)||y.active!==!0)&&CT(`Invalid cluster user '${cluster_username}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await wT(nr.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await wT(nr.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await wT(nr.CLUSTERING_HUBSERVER_NETWORK_PORT),await wT(nr.CLUSTERING_LEAFSERVER_NETWORK_PORT));let T=[],R=[];for(let[q,K]of _.entries())K.role?.role===OT.ROLE_TYPES_ENUM.CLUSTER_USER&&K.active&&(T.push(new tpe(K.username,LK.decrypt(K.hash))),R.push(new epe(K.username,LK.decrypt(K.hash))));let N=[],{hub_routes:O}=Fn.getClusteringRoutes();if(!Xd.isEmptyOrZeroLength(O))for(let q of O)N.push(`tls://${y.sys_name_encoded}:${y.uri_encoded_d_hash}@${q.host}:${q.port}`);let F=new Xhe(Fn.getConfigFromFile(nr.CLUSTERING_HUBSERVER_NETWORK_PORT),h,a,i,s,n,f,m,p,Fn.getConfigFromFile(nr.CLUSTERING_HUBSERVER_CLUSTER_NAME),Fn.getConfigFromFile(nr.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,T,R);n==null&&(delete F.tls.ca_file,delete F.leafnodes.tls.ca_file),t=Xd.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===OT.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await $l.writeJson(u,F),Zd.trace(`Hub server config written to ${u}`));let Z=`tls://${y.sys_name_encoded}:${y.uri_encoded_d_hash}@0.0.0.0:${p}`,G=`tls://${y.uri_encoded_name}:${y.uri_encoded_d_hash}@0.0.0.0:${p}`,Y=new Zhe(Fn.getConfigFromFile(nr.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[Z],[G],T,R,i,s,n,f);n==null&&delete Y.tls.ca_file,(t===void 0||t===OT.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await $l.writeJson(d,Y),Zd.trace(`Leaf server config written to ${d}`))}o(ipe,"generateNatsConfig");async function wT(e){let t=pp.get(e);return Xd.isEmpty(t)&&CT(`port undefined for '${e}'`),await Xd.isPortTaken(t)&&CT(`'${e}' port '${t}' is is in use by another process, check to see if HarperDB is already running or another process is using this port.`),!0}o(wT,"isPortAvailable");function CT(e){let t=`Error generating clustering config: ${e}`;Zd.error(t),console.error(t),process.exit(1)}o(CT,"generateNatsConfigError");async function ope(e){let{port:t,config_file:r}=EC.getServerConfig(e),{username:n,decrypt_hash:s}=await pC.getClusterUser(),i=0,a=2e3;for(;i<DK;){try{let d=await EC.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){Zd.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=DK)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=a*(i*2);u>3e4&&Zd.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await Xd.asyncSetTimeout(u)}let c="0".repeat(npe),l=ql.join(pp.get(nr.ROOTPATH),Jd,r);await $l.writeFile(l,c),await $l.remove(l),Zd.notify(e,"started.")}o(ope,"removeNatsConfig")});var HK=M((p0e,FK)=>{"use strict";var us=oe(),ape=Qd(),Ke=(k(),v(W)),Ep=It(),zo=require("path"),{PACKAGE_ROOT:DT}=Rt(),vK=oe(),LT=ie(),ef="/dev/null",cpe=zo.join(DT,"launchServiceScripts"),UK=zo.join(DT,"utility/scripts"),lpe=zo.join(UK,Ke.HDB_RESTART_SCRIPT),xK=zo.resolve(DT,"dependencies",`${process.platform}-${process.arch}`,Ep.NATS_BINARY_NAME);function BK(){let t=ape.licenseSearch().ram_allocation||Ke.RAM_ALLOCATION_ENUM.DEFAULT,r=Ke.MEM_SETTING_KEY+t,n={[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return LT.noBootFile()&&(n[Ke.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=LT.getEnvCliRootPath()),{name:Ke.PROCESS_DESCRIPTORS.HDB,script:Ke.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:DT}}o(BK,"generateMainServerConfig");var upe=9930;function dpe(){us.initSync(!0);let e=us.get(Ke.CONFIG_PARAMS.ROOTPATH),t=zo.join(e,"clustering",Ep.NATS_CONFIG_FILES.HUB_SERVER),r=zo.join(us.get(Ke.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ke.LOG_NAMES.HDB),n=vK.get(Ke.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Ep.LOG_LEVEL_FLAGS[us.get(Ke.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==upe?"-"+n:""),script:xK,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return us.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=ef,i.error_file=ef),i}o(dpe,"generateNatsHubServerConfig");var fpe=9940;function mpe(){us.initSync(!0);let e=us.get(Ke.CONFIG_PARAMS.ROOTPATH),t=zo.join(e,"clustering",Ep.NATS_CONFIG_FILES.LEAF_SERVER),r=zo.join(us.get(Ke.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ke.LOG_NAMES.HDB),n=vK.get(Ke.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Ep.LOG_LEVEL_FLAGS[us.get(Ke.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==fpe?"-"+n:""),script:xK,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return us.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=ef,i.error_file=ef),i}o(mpe,"generateNatsLeafServerConfig");function hpe(){us.initSync();let e=zo.join(us.get(Ke.CONFIG_PARAMS.LOGGING_ROOT),Ke.LOG_NAMES.HDB),t={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ke.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:cpe,autorestart:!1};return us.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=ef,t.error_file=ef),t}o(hpe,"generateClusteringUpgradeV4ServiceConfig");function ppe(){let e={[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.RESTART_HDB};return LT.noBootFile()&&(e[Ke.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=LT.getEnvCliRootPath()),{...{name:Ke.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:UK},script:lpe}}o(ppe,"generateRestart");function Epe(){return{apps:[BK()]}}o(Epe,"generateAllServiceConfigs");FK.exports={generateAllServiceConfigs:Epe,generateMainServerConfig:BK,generateRestart:ppe,generateNatsHubServerConfig:dpe,generateNatsLeafServerConfig:mpe,generateClusteringUpgradeV4ServiceConfig:hpe}});var gp=M((g0e,ZK)=>{"use strict";var at=(k(),v(W)),_pe=ie(),Qo=PT(),MT=mr(),jo=It(),ac=HK(),vT=oe(),Vl=Q(),gpe=Ko(),{startWorker:kK,onMessageFromWorkers:Spe}=rt(),Tpe=qd(),_0e=require("util"),Rpe=require("child_process"),ype=require("fs"),{execFile:Ape}=Rpe,Je;ZK.exports={enterPM2Mode:bpe,start:cc,stop:_C,reload:qK,restart:$K,list:gC,describe:YK,connect:Jo,kill:Cpe,startAllServices:Ppe,startService:SC,getUniqueServicesList:WK,restartAllServices:Lpe,isServiceRegistered:zK,reloadStopStart:jK,restartHdb:KK,deleteProcess:wpe,startClusteringProcesses:JK,startClusteringThreads:XK,isHdbRestartRunning:Ope,isClusteringRunning:Mpe,stopClustering:Dpe,reloadClustering:vpe,expectedRestartOfChildren:VK};var _p=!1;Spe(e=>{e.type==="restart"&&vT.initSync(!0)});function bpe(){_p=!0}o(bpe,"enterPM2Mode");function Jo(){return Je||(Je=require("pm2")),new Promise((e,t)=>{Je.connect((r,n)=>{r&&t(r),e(n)})})}o(Jo,"connect");var En,Ipe=10,GK;function cc(e,t=!1){if(_p)return Npe(e);let r=Ape(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let a=En.indexOf(r);a>-1&&En.splice(a,1),!GK&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<Ipe&&(ype.existsSync(Qo.getHubConfigPath())?cc(e):(await Qo.generateNatsConfig(!0),cc(e),await new Promise(c=>setTimeout(c,3e3)),await Qo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Qo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let a=vT.get(at.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,d;for(;l=c.exec(i);){if(l.index&&jo.LOG_LEVEL_HIERARCHY[a]>=jo.LOG_LEVEL_HIERARCHY[d||"info"]){let h=d===jo.LOG_LEVELS.ERR||d===jo.LOG_LEVELS.WRN?Vl.OUTPUTS.STDERR:Vl.OUTPUTS.STDOUT;Vl.logCustomLevel(d||"info",h,n,i.slice(u,l.index).trim())}let[f,m]=l;u=l.index+f.length,d=jo.LOG_LEVELS[m]}if(jo.LOG_LEVEL_HIERARCHY[a]>=jo.LOG_LEVEL_HIERARCHY[d||"info"]){let f=d===jo.LOG_LEVELS.ERR||d===jo.LOG_LEVELS.WRN?Vl.OUTPUTS.STDERR:Vl.OUTPUTS.STDOUT;Vl.logCustomLevel(d||"info",f,n,i.slice(u).trim())}}if(o(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!En&&(En=[],!t)){let i=o(()=>{GK=!0,En&&(En.map(a=>a.kill()),process.exit(0))},"killChildren");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}En.push(r)}o(cc,"start");function Npe(e){return new Promise(async(t,r)=>{try{await Jo()}catch(n){r(n)}Je.start(e,(n,s)=>{n&&(Je.disconnect(),r(n)),Je.disconnect(),t(s)})})}o(Npe,"startWithPM2");function _C(e){if(!_p){for(let t of En||[])t.name===e&&(En.splice(En.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Jo()}catch(n){r(n)}Je.stop(e,async(n,s)=>{n&&(Je.disconnect(),r(n)),Je.delete(e,(i,a)=>{i&&(Je.disconnect(),r(n)),Je.disconnect(),t(a)})})})}o(_C,"stop");function qK(e){return new Promise(async(t,r)=>{try{await Jo()}catch(n){r(n)}Je.reload(e,(n,s)=>{n&&(Je.disconnect(),r(n)),Je.disconnect(),t(s)})})}o(qK,"reload");function $K(e){if(!_p){VK();for(let t of En||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Jo()}catch(n){r(n)}Je.restart(e,(n,s)=>{Je.disconnect(),t(s)})})}o($K,"restart");function VK(){for(let e of En||[])e.config&&(e.config.restarts=0)}o(VK,"expectedRestartOfChildren");function wpe(e){return new Promise(async(t,r)=>{try{await Jo()}catch(n){r(n)}Je.delete(e,(n,s)=>{n&&(Je.disconnect(),r(n)),Je.disconnect(),t(s)})})}o(wpe,"deleteProcess");async function KK(){await cc(ac.generateRestart())}o(KK,"restartHdb");async function Ope(){let e=await gC();for(let t in e)if(e[t].name===at.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}o(Ope,"isHdbRestartRunning");function gC(){return new Promise(async(e,t)=>{try{await Jo()}catch(r){t(r)}Je.list((r,n)=>{r&&(Je.disconnect(),t(r)),Je.disconnect(),e(n)})})}o(gC,"list");function YK(e){return new Promise(async(t,r)=>{try{await Jo()}catch(n){r(n)}Je.describe(e,(n,s)=>{n&&(Je.disconnect(),r(n)),Je.disconnect(),t(s)})})}o(YK,"describe");function Cpe(){if(!_p){for(let e of En||[])e.kill();En=[];return}return new Promise(async(e,t)=>{try{await Jo()}catch(r){t(r)}Je.killDaemon((r,n)=>{r&&(Je.disconnect(),t(r)),Je.disconnect(),e(n)})})}o(Cpe,"kill");async function Ppe(){try{await JK(),await XK(),await cc(ac.generateAllServiceConfigs())}catch(e){throw Je?.disconnect(),e}}o(Ppe,"startAllServices");async function SC(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case at.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=ac.generateMainServerConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=ac.generateNatsIngestServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=ac.generateNatsReplyServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=ac.generateNatsHubServerConfig(),await cc(r,t),await Qo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=ac.generateNatsLeafServerConfig(),await cc(r,t),await Qo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=ac.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await cc(r)}catch(r){throw Je?.disconnect(),r}}o(SC,"startService");async function WK(){try{let e=await gC(),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}}o(WK,"getUniqueServicesList");async function Lpe(e=[]){try{let t=!1,r=await WK();for(let n=0,s=Object.values(r).length;n<s;n++){let a=Object.values(r)[n].name;e.includes(a)||(a===at.PROCESS_DESCRIPTORS.HDB?t=!0:await $K(a))}t&&await jK(at.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Je?.disconnect(),t}}o(Lpe,"restartAllServices");async function zK(e){if(En?.find(r=>r.name===e))return!0;let t=await Tpe.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}o(zK,"isServiceRegistered");async function jK(e){let t=vT.get(at.CONFIG_PARAMS.THREADS_COUNT)??vT.get(at.CONFIG_PARAMS.THREADS),r=await YK(e),n=_pe.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await _C(e),await SC(e)):e===at.PROCESS_DESCRIPTORS.HDB?await KK():await qK(e)}o(jK,"reloadStopStart");var QK;async function JK(e=!1){for(let t in at.CLUSTERING_PROCESSES){let r=at.CLUSTERING_PROCESSES[t];await SC(r,e)}}o(JK,"startClusteringProcesses");async function XK(){QK=kK(at.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await MT.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await MT.updateLocalStreams();let e=await gpe.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===at.PRE_4_0_0_VERSION){Vl.info("Starting clustering upgrade 4.0.0 process"),kK(at.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}o(XK,"startClusteringThreads");async function Dpe(){for(let e in at.CLUSTERING_PROCESSES)if(e!==at.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===at.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await QK.terminate();else{let t=at.CLUSTERING_PROCESSES[e];await _C(t)}}o(Dpe,"stopClustering");async function Mpe(){for(let e in at.CLUSTERING_PROCESSES){let t=at.CLUSTERING_PROCESSES[e];if(await zK(t)===!1)return!1}return!0}o(Mpe,"isClusteringRunning");async function vpe(){await Qo.generateNatsConfig(!0),await MT.reloadNATSHub(),await MT.reloadNATSLeaf(),await Qo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Qo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}o(vpe,"reloadClustering")});var yC={};Oe(yC,{compactOnStart:()=>Upe,copyDb:()=>iY});async function Upe(){lc.notify("Running compact on start"),console.log("Running compact on start");let e=(0,TC.get)(U.ROOTPATH),t=new Map,r=nt();(0,RC.updateConfigValue)(U.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,UT.join)(e,"backup",n+".mdb"),a=(0,UT.join)(e,vc,n+"-copy.mdb"),c=0;try{c=await eY(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){lc.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{dbPath:s,copyDest:a,backupDest:i,recordCount:c}),await iY(n,a),console.log("Backing up",n,"to",i);try{await(0,Kl.move)(s,i,{overwrite:!0})}catch(l){console.log("Error moving database",s,"to",i,l)}console.log("Moving copy compacted",n,"to",s),await(0,Kl.move)(a,s,{overwrite:!0}),await(0,Kl.remove)((0,UT.join)(e,vc,`${n}-copy.mdb-lock`))}try{cd()}catch(n){lc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}try{cd()}catch(n){lc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){lc.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,RC.updateConfigValue)(U.STORAGE_COMPACTONSTART,!1);for(let[s,{dbPath:i,backupDest:a}]of t){console.error("Moving backup database",a,"back to",i);try{await(0,Kl.move)(a,i,{overwrite:!0})}catch(c){console.error(c)}}throw cd(),n}for(let[n,{backupDest:s,recordCount:i}]of t){let a=await eY(n);if(console.log("Database",n,"after compact has a total record count of",a),i!==a){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: ${a}.
|
|
26
26
|
Database backup has not been removed and can be found here: ${s}`;lc.error(c),console.error(c)}(0,TC.get)(U.STORAGE_COMPACTONSTARTKEEPBACKUP)!==!0&&(console.log("Removing backup",s),await(0,Kl.remove)(s))}}async function eY(e){let t=await(0,sY.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}function tf(){}async function iY(e,t){console.log(`Copying database ${e} to ${t}`);let r=nt()[e];if(!r)throw new Error(`Source database not found: ${e}`);let n;for(let f in r){let m=r[f];m.primaryStore.put=tf,m.primaryStore.remove=tf;for(let h in m.indices){let p=m.indices[h];p.put=tf,p.remove=tf}m.auditStore&&(m.auditStore.put=tf,m.auditStore.remove=tf),n=m.primaryStore.rootStore}if(!n)throw new Error(`Source database does not have any tables: ${e}`);let s=n.dbisDb,i=n.auditStore,a=(0,tY.open)(new rY.default(t)),c=a.openDB(xT.INTERNAL_DBIS_NAME),l,u=0,d=s.useReadTransaction();try{for(let{key:m,value:h}of s.getRange({transaction:d})){let p=h.is_hash_attribute||h.isPrimaryKey,_,g;if(p&&(_=h.compression,g=Gg(),g?h.compression=g:delete h.compression,_?.dictionary?.toString()===g?.dictionary?.toString()&&(_=null,g=null)),c.put(m,h),!(p||h.indexed))continue;let y=new nY.default(!p,p);y.encoding="binary",y.compression=_;let T=n.openDB(m,y);T.decoder=null,T.decoderCopies=!1,T.encoding="binary",y.compression=g;let R=a.openDB(m,y);R.encoder=null,console.log("copying",m,"from",e,"to",t),await f(T,R,p,d)}if(i){let m=n.openDB(xT.AUDIT_STORE_NAME,Em);console.log("copying audit log for",e,"to",t),f(i,m,!1,d)}async function f(m,h,p,_){let g=0,y=0,T=0,R=1e7,N=null;for(;R-- >0;)try{for(let O of m.getKeys({start:N,transaction:_}))try{N=O;let{value:F,version:Z}=m.getEntry(O,{transaction:_});if(F?.length<14&&p){T++;continue}l=h.put(O,F,p?Z:void 0),g++,_.openTimer&&(_.openTimer=0),y+=(O?.length||10)+F.length,u++>5e3&&(await l,console.log("copied",g,"entries",T,"delete records,",y,"bytes"),u=0)}catch(F){console.error("Error copying record",typeof O=="symbol"?"symbol":O,"from",e,"to",t,F)}console.log("finish copying, copied",g,"entries",T,"delete records,",y,"bytes");return}catch{if(typeof N=="string"){if(N==="z")return console.error("Reached end of dbi",N,"for",e,"to",t);N=N.slice(0,-2)+"z"}else if(typeof N=="number")N++;else return console.error("Unknown key type",N,"for",e,"to",t)}}o(f,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{d.done(),a.close()}}var tY,UT,Kl,TC,rY,nY,xT,sY,RC,lc,AC=ue(()=>{De();tY=require("lmdb"),UT=require("path"),Kl=require("fs-extra"),TC=w(oe()),rY=w(Nm()),nY=w(Im()),xT=w(qt());k();Li();sY=w(Ua()),RC=w(bt()),lc=w(Q());o(Upe,"compactOnStart");o(eY,"getTotalDBRecordCount");o(tf,"noop");o(iY,"copyDb")});var nf=M((w0e,fY)=>{"use strict";var xpe=require("minimist"),{isMainThread:IC,parentPort:Tp,threadId:b0e}=require("worker_threads"),dt=(k(),v(W)),no=Q(),NC=ie(),FT=PT(),BT=mr(),I0e=It(),lY=bt(),Si=gp(),oY=qd(),{compactOnStart:Bpe}=(AC(),v(yC)),Fpe=Uc(),{restartWorkers:HT,onMessageByType:Hpe}=rt(),{handleHDBError:kpe,hdbErrors:Gpe}=ge(),{HTTP_STATUS_CODES:qpe}=Gpe,Rp=oe(),{sendOperationToNode:aY,getThisNodeName:$pe,monitorNodeCAs:Vpe}=(is(),v(Go)),{getHDBNodeTable:N0e}=(Ll(),v(Fw));Rp.initSync();var Sp=`Restarting HarperDB. This may take up to ${dt.RESTART_TIMEOUT_MS/1e3} seconds.`,Kpe="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",cY="Clustering is not enabled so cannot be restarted",Ype="Invalid service",rf,Us;fY.exports={restart:uY,restartService:wC};IC&&Hpe(dt.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await wC({service:e.workerType}):uY({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function uY(e){Us=Object.keys(e).length===0,rf=await Si.isServiceRegistered(dt.PROCESS_DESCRIPTORS.HDB);let t=xpe(process.argv);if(t.service){await wC(t);return}if(Us&&!rf){console.error(Kpe);return}if(Us&&console.log(Sp),rf){Si.enterPM2Mode(),no.notify(Sp);let r=Fpe(Object.keys(dt.CONFIG_PARAM_MAP),!0);return NC.isEmptyOrZeroLength(Object.keys(r))||lY.updateConfigValue(void 0,void 0,r,!0,!0),Wpe(),Sp}return IC?(no.notify(Sp),Rp.get(dt.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await Bpe(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{HT()},50)):Tp.postMessage({type:dt.ITC_EVENT_TYPES.RESTART}),Sp}o(uY,"restart");async function wC(e){let{service:t}=e;if(dt.HDB_PROCESS_SERVICES[t]===void 0)throw kpe(new Error,Ype,qpe.BAD_REQUEST,void 0,void 0,!0);if(Si.expectedRestartOfChildren(),rf=await Si.isServiceRegistered(dt.PROCESS_DESCRIPTORS.HDB),!IC){e.replicated&&Vpe(),Tp.postMessage({type:dt.ITC_EVENT_TYPES.RESTART,workerType:t}),Tp.ref(),await new Promise(s=>{Tp.on("message",i=>{i.type==="restart-complete"&&(s(),Tp.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===$pe())continue;let i;try{({job_id:i}=await aY(s,e))}catch(a){n.push({node:s.name,message:a.message});continue}n.push(await new Promise((a,c)=>{let u=2400,d=setInterval(async()=>{if(u--<=0){clearInterval(d);let h=new Error("Timed out waiting for restart job to complete");h.replicated=n,c(h)}let m=(await aY(s,{operation:"get_job",id:i})).results[0];if(m.status==="COMPLETE"&&(clearInterval(d),a({node:s.name,message:m.message})),m.status==="ERROR"){clearInterval(d);let h=new Error(m.message);h.replicated=n,c(h)}},250)}))}return{replicated:n}}return}let r;switch(t){case dt.HDB_PROCESS_SERVICES.clustering:if(!Rp.get(dt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=cY;break}Us&&console.log("Restarting clustering"),no.notify("Restarting clustering"),await dY();break;case dt.HDB_PROCESS_SERVICES.clustering_config:case dt.HDB_PROCESS_SERVICES["clustering config"]:if(!Rp.get(dt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=cY;break}Us&&console.log("Restarting clusteringConfig"),no.notify("Restarting clustering_config"),await Si.reloadClustering();break;case"custom_functions":case"custom functions":case dt.HDB_PROCESS_SERVICES.harperdb:case dt.HDB_PROCESS_SERVICES.http_workers:case dt.HDB_PROCESS_SERVICES.http:if(Us&&!rf){r=`Restart ${t} is not available from the CLI when running in non-pm2 mode. Either call restart ${t} from the API or stop and start HarperDB.`;break}Us&&console.log("Restarting httpWorkers"),no.notify("Restarting http_workers"),Us?await Si.restart(dt.PROCESS_DESCRIPTORS.HDB):await HT("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(no.error(r),Us&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}o(wC,"restartService");async function Wpe(){await dY(),await Si.restart(dt.PROCESS_DESCRIPTORS.HDB),await NC.asyncSetTimeout(2e3),Rp.get(dt.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await bC(),Us&&(await BT.closeConnection(),process.exit(0))}o(Wpe,"restartPM2Mode");async function dY(){if(!lY.getConfigFromFile(dt.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await oY.getHDBProcessInfo()).clustering.length===0)no.trace("Clustering not running, restart will start clustering services"),await FT.generateNatsConfig(!0),await Si.startClusteringProcesses(),await Si.startClusteringThreads(),await bC(),Us&&await BT.closeConnection();else{await FT.generateNatsConfig(!0),rf?(no.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await Si.restart(dt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Si.restart(dt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await oY.getHDBProcessInfo()).clustering.forEach(s=>{no.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await NC.asyncSetTimeout(3e3),await bC(),await BT.updateLocalStreams(),Us&&await BT.closeConnection(),no.trace("Restart clustering restarting ingest and reply service threads");let t=HT(dt.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=HT(dt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}o(dY,"restartClustering");async function bC(){await FT.removeNatsConfig(dt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await FT.removeNatsConfig(dt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}o(bC,"removeNatsConfig")});var AY=M((P0e,yY)=>{"use strict";var C0e=require("lodash"),Hn=(k(),v(W)),{handleHDBError:mY,hdbErrors:zpe}=ge(),{HDB_ERROR_MSGS:jpe,HTTP_STATUS_CODES:Qpe}=zpe,OC=Q();yY.exports={getRolePermissions:Xpe};var Yl=Object.create(null),Jpe=o(e=>({key:e,perms:{}}),"permsTemplateObj"),_Y=o((e=!1)=>({describe:e,tables:{}}),"schemaPermsTemplate"),gY=o((e=!1,t=!1,r=!1,n=!1)=>({[Hn.PERMS_CRUD_ENUM.READ]:e,[Hn.PERMS_CRUD_ENUM.INSERT]:t,[Hn.PERMS_CRUD_ENUM.UPDATE]:r,[Hn.PERMS_CRUD_ENUM.DELETE]:n}),"permissionsTemplate"),CC=o((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...gY(t,r,n,s)}),"tablePermsTemplate"),hY=o((e,t=gY())=>({attribute_name:e,describe:RY(t),[yp]:t[yp],[PC]:t[PC],[LC]:t[LC]}),"attrPermsTemplate"),pY=o((e,t=!1)=>({attribute_name:e,describe:t,[yp]:t}),"timestampAttrPermsTemplate"),{READ:yp,INSERT:PC,UPDATE:LC}=Hn.PERMS_CRUD_ENUM,SY=Object.values(Hn.PERMS_CRUD_ENUM),TY=[yp,PC,LC];function Xpe(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[Hn.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(Yl[t]&&Yl[t].key===n)return Yl[t].perms;let s=Zpe(e,r);return Yl[t]?Yl[t].key=n:Yl[t]=Jpe(n),Yl[t].perms=s,s}catch(r){if(!e[Hn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[Hn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<Hn.PERMS_UPDATE_RELEASE_TIMESTAMP){let n=`Role permissions for role '${role_name}' must be updated to align with new structure from the 2.2.0 release.`;throw OC.error(n),OC.debug(r),mY(new Error,jpe.OUTDATED_PERMS_TRANSLATION_ERROR,Qpe.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
|