harperdb 4.5.34 → 4.5.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/harperdb.js +3 -3
- package/bin/lite.js +3 -3
- package/launchServiceScripts/launchNatsIngestService.js +3 -3
- package/launchServiceScripts/launchNatsReplyService.js +3 -3
- package/launchServiceScripts/launchUpdateNodes4-0-0.js +3 -3
- package/npm-shrinkwrap.json +211 -211
- package/package.json +1 -1
- package/server/jobs/jobProcess.js +3 -3
- package/server/threads/threadServer.js +3 -3
- package/studio/build-local/asset-manifest.json +2 -2
- package/studio/build-local/index.html +1 -1
- package/studio/build-local/static/js/{main.ce641166.js → main.eae3e997.js} +2 -2
- package/utility/scripts/restartHdb.js +3 -3
- /package/studio/build-local/static/js/{main.ce641166.js.LICENSE.txt → main.eae3e997.js.LICENSE.txt} +0 -0
|
@@ -21,9 +21,9 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
|
|
|
21
21
|
`,""));return r.replace(`
|
|
22
22
|
`,"")}a(FH,"runCommand");async function bne(){try{await ene.access(oO)}catch{return!1}let e=await FH(`${oO} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return tne.eq(t,Rne)}a(bne,"checkNATSServerInstalled");async function dO(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let o=await HH.getClusterUser();if(nl(o))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=o.username,r=o.decrypt_hash}js.trace("create nats connection called");let i=await _ne({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:wr.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:wr.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:wr.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),js.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(o=>{o&&js.error("Error with Nats client connection, connection closed",o),i===Jr&&GH()}),i}a(dO,"createConnection");function GH(){Jr=void 0,el=void 0,tl=void 0,rl=void 0}a(GH,"clearClientCache");async function One(){Jr&&(await Jr.drain(),Jr=void 0,el=void 0,tl=void 0,rl=void 0)}a(One,"closeConnection");var Jr,rl;async function K_(){return rl||(rl=dO(wr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),Jr=await rl),Jr||rl}a(K_,"getConnection");async function Y_(){if(el)return el;nl(Jr)&&await K_();let{domain:e}=Hu(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(nl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return el=await Jr.jetstreamManager({domain:e,timeout:6e4}),el}a(Y_,"getJetStreamManager");async function qH(){if(tl)return tl;nl(Jr)&&await K_();let{domain:e}=Hu(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(nl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return tl=Jr.jetstream({domain:e,timeout:6e4}),tl}a(qH,"getJetStream");async function xi(){let e=Jr||await K_(),t=el||await Y_(),r=tl||await qH();return{connection:e,jsm:t,js:r}}a(xi,"getNATSReferences");async function Nne(e){let t=wr.get(Qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await HH.getClusterUser(),s=await dO(t,r,n),i=uO(),o=s.subscribe(i),c=[],l,u=(async()=>{for await(let f of o){let d=kH.decode(f.data);d.response_time=Date.now()-l,c.push(d)}})();return l=Date.now(),await s.publish("$SYS.REQ.SERVER.PING.VARZ",void 0,{reply:i}),await s.publish("$SYS.REQ.SERVER.PING",void 0,{reply:i}),await s.flush(),await QE.async_set_timeout(e),await o.drain(),await s.close(),await u,c}a(Nne,"getServerList");async function fO(e,t){let{jsm:r}=await xi(),n=wr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=wr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=wr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:hne.File,retention:mne.Limits,subjects:t,discard:pne.Old,max_msgs:s,max_bytes:i,max_age:n})}a(fO,"createLocalStream");async function $H(){let{jsm:e}=await xi(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}a($H,"listStreams");async function wne(e){let{jsm:t}=await xi();await t.streams.delete(e)}a(wne,"deleteLocalStream");async function Ine(e){let{connection:t}=await xi(),r=[],n=uO(),s=t.subscribe(n),i=(async()=>{for await(let o of s)r.push(kH.decode(o.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}a(Ine,"listRemoteStreams");async function Cne(e,t=void 0,r=void 0){let{jsm:n,js:s}=await xi(),i=vH(),o={durable_name:i,ack_policy:cO.Explicit};t&&(o.deliver_policy=lO.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];let u=[];for await(let f of l){let d=aO(f.data),_={nats_timestamp:f.info.timestampNanos,nats_sequence:f.info.streamSequence,entry:d};if(f.headers&&(_.origin=f.headers.get(Hr.MSG_HEADERS.ORIGIN)),u.push(_),f.ack(),f.info.pending===0)break}return await c.delete(),u}a(Cne,"viewStream");async function*Pne(e,t=void 0,r=void 0){let{jsm:n,js:s}=await xi(),i=vH(),o={durable_name:i,ack_policy:cO.Explicit};t&&(o.deliver_policy=lO.StartTime,o.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,o);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];for await(let u of l){let f=aO(u.data);f[0]||(f=[f]);for(let d of f){let _={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:d};u.headers&&(_.origin=u.headers.get(Hr.MSG_HEADERS.ORIGIN)),yield _}if(u.ack(),u.info.pending===0)break}await c.delete()}a(Pne,"viewStreamIterator");async function Dne(e,t,r,n){js.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=VH(n,r);let{js:s}=await xi(),i=await JE(),o=`${e}.${i}`,c=await Tne(()=>n instanceof Uint8Array?n:BH.encode(n));try{js.trace(`publishToStream publishing to subject: ${o}`),Sne(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(o,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return YH(async()=>{try{await s.publish(o,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){js.trace(`publishToStream creating stream: ${t}`);let f=o.split(".");f[2]="*",await fO(t,[o]),await s.publish(o,c,{headers:r})}else throw l}});throw l}}a(Dne,"publishToStream");function VH(e,t){t===void 0&&(t=gne());let r=wr.get(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(Hr.MSG_HEADERS.ORIGIN)&&r&&t.append(Hr.MSG_HEADERS.ORIGIN,r),t}a(VH,"addNatsMsgHeader");function Hu(e){e=e.toLowerCase();let t=V_.join(wr.get(Qe.CONFIG_PARAMS.ROOTPATH),Ane);if(e===Qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return nl(iO)&&(iO={port:q_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:q_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Hr.SERVER_SUFFIX.HUB,config_file:Hr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:V_.join(t,Hr.PID_FILES.HUB),hdb_nats_path:t}),iO;if(e===Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return nl(sO)&&(sO={port:q_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:q_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Hr.SERVER_SUFFIX.LEAF,config_file:Hr.NATS_CONFIG_FILES.LEAF_SERVER,domain:q_.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Hr.SERVER_SUFFIX.LEAF,pid_file_path:V_.join(t,Hr.PID_FILES.LEAF),hdb_nats_path:t}),sO;js.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}a(Hu,"getServerConfig");async function KH(e,t,r,n){try{await e.consumers.add(t,{ack_policy:cO.Explicit,durable_name:r,deliver_policy:lO.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}a(KH,"createConsumer");async function Lne(e,t,r){await e.consumers.delete(t,r)}a(Lne,"removeConsumer");function Mne(e){return e.split(".")[1]}a(Mne,"extractServerName");async function vne(e,t,r=6e4,n=uO()){if(!QE.isObject(t))throw new Error("data param must be an object");let s=BH.encode(t),{connection:i}=await xi(),o={timeout:r};n&&(o.reply=n,o.noMux=!0);let c=await i.request(e,s,o);return aO(c.data)}a(vne,"request");function _O(e){return new Promise(async(t,r)=>{let n=ine(oO,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",o=>{r(o)}),n.stdout.on("data",o=>{i+=o.toString()}),n.stderr.on("data",o=>{s+=o.toString()}),n.stderr.on("close",o=>{s&&r(s),t(i)})})}a(_O,"reloadNATS");async function Une(){let{pid_file_path:e}=Hu(Qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await _O(e)}a(Une,"reloadNATSHub");async function xne(){let{pid_file_path:e}=Hu(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await _O(e)}a(xne,"reloadNATSLeaf");function Bne(e,t,r){let n;switch(e.code){case MH.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case MH.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}a(Bne,"requestErrorHandler");async function Hne(e,t){let r=t+Hr.SERVER_SUFFIX.LEAF,{connection:n}=await xi(),{jsm:s}=await Yne(r),{schema:i,table:o}=e,c=jE.createNatsTableStreamName(i,o),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await YH(async()=>{if(e.subscribe===!0)await KH(s,c,n.info.server_name,l);else try{await Lne(s,c,n.info.server_name)}catch(u){js.trace(u)}})}a(Hne,"updateRemoteConsumer");async function kne(e,t,r,n){let s=jE.createNatsTableStreamName(e,t),i=r+Hr.SERVER_SUFFIX.LEAF,o={type:Qe.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!xH&&dne()<wr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=nO();await c(o)}await lne(o),n==="stop"&&await QE.async_set_timeout(1e3)}a(kne,"updateConsumerIterator");function YH(e){return cne.writeTransaction(Qe.SYSTEM_SCHEMA_NAME,Qe.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}a(YH,"exclusiveLock");async function WH(e,t){let r=jE.createNatsTableStreamName(e,t),n=await JE(),s=$ne(e,t,n);await fO(r,[s])}a(WH,"createLocalTableStream");async function Fne(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await WH(n,s)}}a(Fne,"createTableStreams");async function zH(e,t,r=void 0){if(wr.get(Qe.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=jE.createNatsTableStreamName(e,t),{domain:s}=Hu(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await K_()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")js.warn(n);else throw n}}a(zH,"purgeTableStream");async function Gne(e,t){if(wr.get(Qe.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await zH(e,t[r])}a(Gne,"purgeSchemaTableStreams");async function qne(e){return(await Y_()).streams.info(e)}a(qne,"getStreamInfo");function $ne(e,t,r){return`${Hr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}a($ne,"createSubjectName");async function JE(){if($_)return $_;if($_=(await Y_())?.nc?.info?.server_name,$_===void 0)throw new Error("Unable to get jetstream manager server name");return $_}a(JE,"getJsmServerName");async function Vne(){let e=await Y_(),t=await JE(),r=await $H();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let o=Kne(n),c=i.split(".");if(c[c.length-1]===t&&!o||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let f=u.join(".");js.trace(`Updating stream subject name from: ${i} to: ${f}`),s.subjects[0]=f,await e.streams.update(s.name,s)}}a(Vne,"updateLocalStreams");function Kne(e){let{config:t}=e,r=!1,n=wr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=wr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=wr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);return i=i===null?-1:i,n!==t.max_age&&(t.max_age=n,r=!0),s!==t.max_bytes&&(t.max_bytes=s,r=!0),i!==t.max_msgs&&(t.max_msgs=i,r=!0),r}a(Kne,"updateStreamLimits");async function Yne(e){let t,r;try{t=await Jr.jetstream({domain:e}),r=await Jr.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw js.error("Unable to connect to:",e),n}return{js:t,jsm:r}}a(Yne,"connectToRemoteJS")});function hO(e){let t=e.get(XE),r=t?(0,ku.unpack)(t):null;r||(r={remoteNameToId:{}});let n=et(),s=!1;r.nodeName=et();let i=r.remoteNameToId;if(i[n]!==0){let o=0,c;for(let l in i){let u=i[l];u===0?c=l:u>o&&(o=u)}if(c){o++,i[c]=o;let l=[Symbol.for("seq"),o];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:z_(e)??1,nodes:[]})})}i[n]=0,e.putSync(XE,(0,ku.pack)(r))}return r}function W_(e){return hO(e).remoteNameToId}function JH(e,t){let r=hO(t),n=r.remoteNameToId,s=new Map,i=!1;for(let o in e){let c=e[o],l=n[o];if(l==null){let u=0;for(let f in n){let d=n[f];d>u&&(u=d)}l=u+1,n[o]=l,i=!0}s.set(c,l)}return i&&t.putSync(XE,(0,ku.pack)(r)),s}function ZE(e,t){let r=hO(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let o in n){let c=n[o];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(XE,(0,ku.pack)(r))}return jH.trace?.("The remote node name map",e,n,s),s}var jH,ku,XE,mO=Re(()=>{jH=M(Gs());Es();ku=require("msgpackr"),XE=Symbol.for("remote-ids");a(hO,"getIdMappingRecord");a(W_,"exportIdMapping");a(JH,"remoteToLocalNodeId");a(ZE,"getIdOfRemoteNode")});var pO={};Ue(pO,{commits_awaiting_replication:()=>Fu,getHDBNodeTable:()=>ir,getReplicationSharedStatus:()=>eg,iterateRoutes:()=>j_,shouldReplicateToNode:()=>Q_,subscribeToNodeUpdates:()=>Gu});function ir(){return XH||(XH=_t({table:"hdb_nodes",database:"system",attributes:[{name:"name",isPrimaryKey:!0},{attribute:"subscriptions"},{attribute:"system_info"},{attribute:"url"},{attribute:"routes"},{attribute:"ca"},{attribute:"ca_info"},{attribute:"replicates"},{attribute:"revoked_certificates"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]}))}function eg(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Gu(e){ir().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;rk.debug?.("adding node",n,"on node",et()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==et()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of ir().search({}))if(i.shard!=null){let o=s.get(i.shard);o||s.set(i.shard,o=[]),o.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function Q_(e,t){let r=Sa.default.get(x.REPLICATION_DATABASES);return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&(r==="*"||r?.find?.(n=>n.name===t&&(!n.sharded||e.shard===Sa.default.get(x.REPLICATION_SHARD))))&&ir().primaryStore.get(et())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function Wne(){Gu(e=>{Ta({},(t,r)=>{let n=e.name,s=ZH.get(n);if(s||ZH.set(n,s=new Map),s.has(r))return;let i;for(let o in t)if(i=t[o].auditStore,i)break;if(i){let o=eg(i,r,n,()=>{let c=o[0],l=o.lastTime;for(let{txnTime:u,onConfirm:f}of Fu.get(r)||[])u>l&&u<=c&&f();o.lastTime=c});o.lastTime=0,s.set(r,o)}})})}function*j_(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=Sa.default.get(x.REPLICATION_SECUREPORT)??(!Sa.default.get(x.REPLICATION_PORT)&&Sa.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||Sa.default.get(x.REPLICATION_PORT)||Sa.default.get(x.OPERATIONSAPI_NETWORK_PORT);let o=i?.lastIndexOf?.(":");o>0&&(i=+i.slice(o+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){ek.isMainThread&&console.error("Invalid route, must specify a url or host (with port)");continue}yield{replicates:!t.subscriptions,url:r,subscription:t.subscriptions,routes:t.routes,start_time:t.startTime,revoked_certificates:t.revokedCertificates}}}var ek,tk,Sa,rk,XH,ZH,Fu,sl=Re(()=>{xe();Es();sp();ek=require("worker_threads"),tk=M(he()),Sa=M(le());k();rk=M(Gs());server.nodes=[];a(ir,"getHDBNodeTable");a(eg,"getReplicationSharedStatus");a(Gu,"subscribeToNodeUpdates");a(Q_,"shouldReplicateToNode");ZH=new Map;XD((e,t,r)=>{if(r>server.nodes.length)throw new tk.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);Fu||(Fu=new Map,Wne());let n=Fu.get(e);return n||(n=[],Fu.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:a(()=>{++i===r&&s()},"onConfirm")})})});a(Wne,"startSubscriptionToReplications");a(j_,"iterateRoutes")});var ik={};Ue(ik,{connectedToNode:()=>il,disconnectedFromNode:()=>$u,ensureNode:()=>Ro,requestClusterStatus:()=>sk,startOnMainThread:()=>SO});async function SO(e){let t=0,r=Xe();for(let i of Object.getOwnPropertyNames(r)){let o=r[i];for(let c in o){let l=o[c];if(l.auditStore){tg.set(i,z_(l.auditStore));break}}}Hi.whenThreadsStarted.then(async()=>{let i=[];for await(let o of r.system.hdb_nodes?.search([])||[])i.push(o);for(let o of j_(e))try{let c=!o.subscriptions;if(c){let u=et(),f=ir().primaryStore.get(u);if(f!==null){let d=e.url??Aa();(f===void 0||f.url!==d||f.shard!==e.shard)&&await Ro(u,{name:u,url:d,shard:e.shard,replicates:!0})}}let l=o.trusted!==!1;if(c&&o.replicates==null&&(o.replicates=!0),i.find(u=>u.url===o.url))continue;s(o)}catch(c){console.error(c)}Gu(s)});let n;function s(i,o=i?.name){let c=et()&&o===et()||Aa()&&i?.url===Aa();if(c){let d=!!i?.replicates;if(n!==void 0&&n!==d)for(let _ of ir().search([]))_.replicates&&_.name!==o&&s(_,_.name);n=d}if(nt.trace("Setting up node replication for",i),!i){for(let[d,_]of Bi){let h;for(let[m,{worker:S,nodes:g}]of _){let R=g[0];if(R&&R.name==o){h=!0;for(let[E,{worker:T}]of _)_.delete(E),nt.warn("Node was deleted, unsubscribing from node",o,E,d),T?.postMessage({type:"unsubscribe-from-node",node:o,database:E,url:d});break}}if(h){Bi.get(d).iterator.remove(),Bi.delete(d);return}}return}if(c)return;if(!i.url){nt.info(`Node ${i.name} is missing url`);return}let l=Bi.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(nt.info(`Added node ${i.name} at ${i.url} for process ${et()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[d,_]of qu)if(i.url===_.url){qu.delete(d);break}qu.set(i.name,i)}let u=Xe();if(l||(l=new Map,Bi.set(i.url,l)),l.iterator=Ta(e,(d,_,h)=>{h?f(_,!0):f(_,!1)}),i.subscriptions)for(let d of i.subscriptions){let _=d.database||d.schema;u[_]||(nt.warn(`Database ${_} not found for node ${i.name}, making a subscription anyway`),f(_,!1))}function f(d,_){nt.trace("Setting up replication for database",d,"on node",i.name);let h=l.get(d),m,S=[{replicateByDefault:_,...i}];tg.has(d)&&(S.push({replicateByDefault:_,name:et(),start_time:tg.get(d),end_time:Date.now(),replicates:!0}),tg.delete(d));let g=Q_(i,d),R=Hi.workers.filter(E=>E.name==="http");if(h?(m=h.worker,h.nodes=S):g&&(t=t%R.length,m=R[t++],l.set(d,{worker:m,nodes:S,url:i.url}),m?.on("exit",()=>{l.get(d)?.worker===m&&(l.delete(d),f(d,_))})),g)setTimeout(()=>{let E={type:"subscribe-to-node",database:d,nodes:S};m?m.postMessage(E):J_(E)},zne);else{nt.info("Node no longer should be used, unsubscribing from node",i.replicates,!!u[d],ir().primaryStore.get(et())?.replicates),ir().primaryStore.get(et())?.replicates||(n=!1);let E={type:"unsubscribe-from-node",database:d,url:i.url,name:i.name};m?m.postMessage(E):ng(E)}}a(f,"onDatabase")}a(s,"onNodeUpdate"),$u=a(function(i){try{nt.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let o=Array.from(qu.keys()),c=o.sort(),l=c.indexOf(i.name||Js(i.url));if(l===-1){nt.warn("Disconnected node not found in node map",i.name,o);return}let u=Bi.get(i.url),f=u?.get(i.database);if(!f){nt.warn("Disconnected node not found in replication map",i.database,u);return}if(f.connected=!1,i.finished||!gO.default.get(x.REPLICATION_FAILOVER))return;let d=f.nodes[0];if(!(d.replicates===!0||d.replicates?.sends||d.subscriptions?.length))return;let _=d.shard,h=(l+1)%c.length;for(;l!==h;){let m=c[h],S=qu.get(m);u=Bi.get(S.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==_){h=(h+1)%c.length;continue}let{worker:R,nodes:E}=g,T=!1;for(let N of f.nodes){if(E.some(v=>v.name===N.name)){nt.info(`Disconnected node is already failing over to ${m} for ${i.database}`);continue}N.end_time<Date.now()||(E.push(N),T=!0)}if(f.nodes=[f.nodes[0]],!T){nt.info(`Disconnected node ${i.name} has no nodes to fail over to ${m}`);return}nt.info(`Failing over ${i.database} from ${i.name} to ${m}`),R?R.postMessage({type:"subscribe-to-node",database:i.database,nodes:E}):J_({database:i.database,nodes:E});return}nt.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(o){nt.error("Error failing over node",o)}},"disconnectedFromNode"),il=a(function(i){let o=Bi.get(i.url),c=o?.get(i.database);if(!c){nt.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,o);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){nt.info("Connected node has no nodes",i.database,c);return}if(!l.name){nt.debug("Connected node is not named yet",i.database,c);return}c.nodes=[l];let u=!1;for(let f of Bi.values()){let d=f.get(i.database);if(!d||d==c)continue;let{worker:_,nodes:h,connected:m}=d;if(h)if(m===!1&&h[0].shard===l.shard)u=!0,c.nodes.push(h[0]);else{let S=h.filter(g=>g.name!==l.name);S.length<h.length&&(d.nodes=S,_.postMessage({type:"subscribe-to-node",database:i.database,nodes:h}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,Hi.onMessageByType)("disconnected-from-node",$u),(0,Hi.onMessageByType)("connected-to-node",il),(0,Hi.onMessageByType)("request-cluster-status",sk)}function sk(e,t){let r=[];for(let[n,s]of qu)try{let i=Bi.get(s.url);nt.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let o=[];if(i){for(let[l,{worker:u,connected:f,nodes:d,latency:_}]of i)o.push({database:l,connected:f,latency:_,thread_id:u?.threadId,nodes:d.filter(h=>!(h.end_time<Date.now())).map(h=>h.name)});let c=(0,EO.cloneDeep)(s);c.database_sockets=o,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){nt.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Ro(e,t){let r=ir();e=e??Js(t.url),t.name=e;try{if(t.ca){let s=new nk.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subject_alt_name:s.subjectAltName,serial_number:s.serialNumber,valid_from:s.validFrom,valid_to:s.validTo}}}catch(s){nt.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(nt.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!gO.default.get(x.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],o=(0,EO.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of o)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...o,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}nt.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var Hi,rg,nt,EO,gO,nk,zne,Bi,$u,il,qu,tg,X_=Re(()=>{xe();Hi=M(ot());Es();rg=require("worker_threads");sl();nt=M(ee()),EO=require("lodash"),gO=M(le());k();nk=require("crypto"),zne=200,Bi=new Map,qu=new Map,tg=new Map;a(SO,"startOnMainThread");a(sk,"requestClusterStatus");rg.parentPort&&($u=a(e=>{rg.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),il=a(e=>{rg.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Hi.onMessageByType)("subscribe-to-node",e=>{J_(e)}),(0,Hi.onMessageByType)("unsubscribe-from-node",e=>{ng(e)}));a(Ro,"ensureNode")});var ei=C(Ik=>{"use strict";var or=require("path"),{watch:Qne}=require("chokidar"),bn=require("fs-extra"),Vu=require("node-forge"),dk=require("net"),{generateKeyPair:AO,X509Certificate:yo,createPrivateKey:fk}=require("crypto"),jne=require("util");AO=jne.promisify(AO);var bt=Vu.pki,Xs=require("joi"),{v4:_k}=require("uuid"),{validateBySchema:OO}=it(),Tt=ee(),Jn=le(),gs=(k(),P(q)),{CONFIG_PARAMS:al}=gs,Zs=OA(),{ClientError:ya}=he(),sg=require("node:tls"),{relative:hk,join:Jne}=require("node:path"),{CERT_PREFERENCE_APP:wIe,CERTIFICATE_VALUES:ok}=Zs,Xne=hc(),RO=Ct(),{table:Zne,getDatabases:ese,databases:TO}=(xe(),P(ct)),{getJWTRSAKeys:ak}=(vu(),P(F_));Object.assign(Ik,{generateKeys:IO,updateConfigCert:Rk,createCsr:ase,signCertificate:cse,setCertTable:Ku,loadCertificates:Sk,reviewSelfSignedCert:PO,createTLSSelector:bk,listCertificates:Nk,addCertificate:hse,removeCertificate:pse,createNatsCerts:dse,generateCertsKeys:use,getReplicationCert:eh,getReplicationCertAuth:ose,renewSelfSigned:fse,hostnamesFromCert:DO,getKey:Ese});var{urlToNodeName:mk,getThisNodeUrl:tse,getThisNodeName:og,clearThisNodeName:rse}=(Es(),P(Na)),{readFileSync:nse,statSync:pk}=require("node:fs"),IIe=le(),{getTicketKeys:sse,onMessageFromWorkers:ise}=ot(),Ra=ee(),{isMainThread:Ek}=require("worker_threads"),{TLSSocket:gk,createSecureContext:CIe}=require("node:tls"),NO=3650,Z_=["127.0.0.1","localhost","::1"],wO=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];ise(async e=>{e.type===gs.ITC_EVENT_TYPES.RESTART&&(Jn.initSync(!0),await PO())});var kr;function Oa(){return kr||(kr=ese().system.hdb_certificate,kr||(kr=Zne({table:"hdb_certificate",database:"system",attributes:[{name:"name",isPrimaryKey:!0},{attribute:"uses"},{attribute:"certificate"},{attribute:"is_authority"},{attribute:"private_key_name"},{attribute:"details"},{attribute:"is_self_signed"},{attribute:"__updatedtime__"}]}))),kr}a(Oa,"getCertTable");async function eh(){let e=bk("operations-api"),t={secureContexts:null,setSecureContext:a(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(og());if(!r)return;let n=new yo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}a(eh,"getReplicationCert");async function ose(){Oa();let e=(await eh()).options.cert,r=new yo(e).issuer.match(/CN=(.*)/)?.[1];return kr.get(r)}a(ose,"getReplicationCertAuth");var ck,ba=new Map;function Sk(){if(ck)return;ck=!0;let e=[{configKey:al.TLS},{configKey:al.OPERATIONSAPI_TLS}];Oa();let t=or.dirname(RO.getConfigFilePath()),r;for(let{configKey:n}of e){let s=RO.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let o=i.privateKey,c=o&&hk(Jne(t,"keys"),o);c&&lk(o,l=>{ba.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&Ek){let f;lk(u,d=>{if(ok.cert===d)return;let _=i.hostname??i.hostnames??i.host??i.hosts;_&&!Array.isArray(_)&&(_=[_]);let h=yk(u),m=new yo(h),S;try{S=wk(m)}catch(T){logger.error("error extracting host name from certificate",T);return}if(S==null){logger.error("No host name found on certificate");return}if(m.checkIssued(new yo(ok.cert)))return;let g=kr.primaryStore.get(S),R=pk(u).mtimeMs,E=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&R<=E){R<E&&Tt.info(`Certificate ${S} at ${u} is older (${new Date(R)}) than the certificate in the database (${E>1?new Date(E):"only self signed certificate available"})`);return}r=kr.put({name:S,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:_,file_timestamp:R,details:{issuer:m.issuer.replace(/\n/g," "),subject:m.subject?.replace(/\n/g," "),subject_alt_name:m.subjectAltName,serial_number:m.serialNumber,valid_from:m.validFrom,valid_to:m.validTo}})},l?"certificate authority":"certificate")}}}}}return r}a(Sk,"loadCertificates");function lk(e,t,r){let n,s=a((i,o)=>{try{let c=o.mtimeMs;c&&c!==n&&(n&&Ek&&Tt.warn(`Reloading ${r}:`,i),n=c,t(yk(i)))}catch(c){Tt.error(`Error loading ${r}:`,i,c)}},"loadFile");bn.existsSync(e)?s(e,pk(e)):Tt.error(`${r} file not found:`,e),Qne(e,{persistent:!1}).on("change",s)}a(lk,"loadAndWatch");function yO(){let e=tse();if(e==null){let t=Z_[0];return Tt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return mk(e)}a(yO,"getHost");function ig(){let e=og();if(e==null){let t=Z_[0];return Tt.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}a(ig,"getCommonName");async function ase(){let e=await eh(),t=bt.certificateFromPem(e.options.cert),r=bt.privateKeyFromPem(e.options.key);Tt.info("Creating CSR with cert named:",e.name);let n=bt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:ig()},...wO];Tt.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:Tk()}];return Tt.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Vu.pki.certificationRequestToPem(n)}a(ase,"createCsr");function Tk(){let e=Z_.includes(ig())?Z_:[...Z_,ig()];return e.includes(yO())||e.push(yO()),[{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=>dk.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}a(Tk,"certExtensions");async function cse(e){let t={},r=or.join(Jn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Oa();for await(let f of kr.search([]))if(f.is_authority&&!f.details.issuer.includes("HarperDB-Certificate-Authority")){if(ba.has(f.private_key_name)){n=ba.get(f.private_key_name),s=f;break}else if(f.private_key_name&&await bn.exists(or.join(r,f.private_key_name))){n=bn.readFile(or.join(r,f.private_key_name)),s=f;break}}if(!n){let f=await bO();s=f.ca,n=f.private_key}n=bt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=bt.certificateFromPem(s.certificate);Tt.info("Signing CSR with cert named",s.name);let o=bt.certificationRequestFromPem(e.csr);try{o.verify()}catch(f){return Tt.error(f),new Error("Error verifying CSR: "+f.message)}let c=Vu.pki.createCertificate();c.serialNumber=Math.random().toString().slice(2,10),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+NO),Tt.info("sign cert setting validity:",c.validity),Tt.info("sign cert setting subject from CSR:",o.subject.attributes),c.setSubject(o.subject.attributes),Tt.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=o.getAttribute({name:"extensionRequest"}).extensions;Tt.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=o.publicKey,c.sign(n,Vu.md.sha256.create()),t.certificate=bt.certificateToPem(c)}else Tt.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}a(cse,"signCertificate");async function lse(e,t){await Ku({name:og(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Ku({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:bt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}a(lse,"createCertificateTable");async function Ku(e){let t=new yo(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},Oa(),await kr.patch(e)}a(Ku,"setCertTable");async function IO(){let e=await AO("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{public_key:bt.publicKeyFromPem(e.publicKey),private_key:bt.privateKeyFromPem(e.privateKey)}}a(IO,"generateKeys");async function CO(e,t,r){let n=bt.createCertificate();if(!t){let o=await eh();t=bt.certificateFromPem(o.options.cert).publicKey}n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+NO);let i=[{name:"commonName",value:ig()},...wO];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(Tk()),n.sign(e,Vu.md.sha256.create()),bt.certificateToPem(n)}a(CO,"generateCertificates");async function bO(){let e=await Nk(),t;for(let r of e){if(!r.is_authority)continue;let n=await Ok(r.private_key_name);if(r.private_key_name&&n&&new yo(r.certificate).checkPrivateKey(fk(n))){Tt.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;Tt.trace("No CA found with matching private key")}a(bO,"getCertAuthority");async function Ak(e,t,r=!0){let n=bt.createCertificate();n.publicKey=t,n.serialNumber=Math.random().toString().slice(2,10),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+NO);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${Jn.get(al.REPLICATION_HOSTNAME)??mk(Jn.get(al.REPLICATION_URL))??_k().split("-")[0]}`},...wO];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Vu.md.sha256.create());let o=or.join(Jn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),c=or.join(o,Zs.PRIVATEKEY_PEM_NAME);return r&&await bn.writeFile(c,bt.privateKeyToPem(e)),n}a(Ak,"generateCertAuthority");async function use(){let{private_key:e,public_key:t}=await IO(),r=await Ak(e,t),n=await CO(e,t,r);await lse(n,r),Rk()}a(use,"generateCertsKeys");async function dse(){let e=await CO(bt.privateKeyFromPem(Zs.CERTIFICATE_VALUES.key),void 0,bt.certificateFromPem(Zs.CERTIFICATE_VALUES.cert)),t=or.join(Jn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),r=or.join(t,Zs.NATS_CERTIFICATE_PEM_NAME);await bn.exists(r)||await bn.writeFile(r,e);let n=or.join(t,Zs.NATS_CA_PEM_NAME);await bn.exists(n)||await bn.writeFile(n,Zs.CERTIFICATE_VALUES.cert)}a(dse,"createNatsCerts");async function fse(){Oa();for await(let e of kr.search([{attribute:"is_self_signed",value:!0}]))await kr.delete(e.name);await PO()}a(fse,"renewSelfSigned");async function PO(){rse(),await Sk(),Oa();let e=await bO();if(!e){Tt.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=a(u=>{try{return{key:bt.privateKeyFromPem(bn.readFileSync(u)),keyPath:u}}catch(f){return Tt.warn(`Failed to parse private key from ${u}:`,f.message),{key:null,keyPath:u}}},"tryToParseKey"),n=Jn.get(al.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let f=r(u.privateKey);if(s=f.key,i=f.keyPath,f.key)break}}else{let u=Jn.get(al.TLS_PRIVATEKEY),f=r(u);s=f.key,i=f.keyPath}let o=or.join(Jn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),c=hk(o,i);s||(Tt.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{private_key:s}=await IO(),bn.existsSync(or.join(o,Zs.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${_k().split("-")[0]}.pem`),await bn.writeFile(or.join(o,c),bt.privateKeyToPem(s)));let l=await Ak(s,bt.setRsaPublicKey(s.n,s.e),!1);await Ku({name:l.subject.getField("CN").value,uses:["https"],certificate:bt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await eh()){let r=og();Tt.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await bO();let n=bt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await CO(bt.privateKeyFromPem(e.private_key),s,n);await Ku({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}a(PO,"reviewSelfSignedCert");function Rk(){let e=Xne(Object.keys(gs.CONFIG_PARAM_MAP),!0),t=or.join(Jn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME),r=or.join(t,Zs.PRIVATEKEY_PEM_NAME),n=or.join(t,Zs.NATS_CERTIFICATE_PEM_NAME),s=or.join(t,Zs.NATS_CA_PEM_NAME),i=gs.CONFIG_PARAMS,o={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(o[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(o[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(o[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,o[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,o[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),RO.updateConfigValue(void 0,void 0,o,!1,!0)}a(Rk,"updateConfigCert");function yk(e){return e.startsWith("-----BEGIN")?e:nse(e,"utf8")}a(yk,"readPEM");var uk=sg.createSecureContext;sg.createSecureContext=function(e){if(!e.cert||!e.key)return uk(e);let t={...e};delete t.key,delete t.cert;let r=uk(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var _se=gk.prototype._init;gk.prototype._init=function(e,t){_se.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,o)=>{this.sni_context=o?.context||o,this.certCbDone()})}};var ol=new Map;function bk(e,t){let r=new Map,n,s=!1;return i.initialize=o=>i.ready?i.ready:(o&&(o.secureContexts=r,o.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),ol.clear();let f=0;for await(let d of TO.system.hdb_certificate.search([])){let _=d.certificate,h=new yo(_);d.is_authority&&(h.asString=_,ol.set(h.subject,_))}for await(let d of TO.system.hdb_certificate.search([]))try{if(d.is_authority)continue;let _=e==="operations-api",h=d.is_self_signed?1:2;_&&d.uses?.includes?.("operations")&&(h+=1);let m=await Ok(d.private_key_name),S=d.certificate,g=new yo(S);if(ol.has(g.issuer)&&(S+=`
|
|
23
23
|
`+ol.get(g.issuer)),!m||!S)throw new Error("Missing private key or certificate for secure server");let R={ciphers:d.ciphers,ticketKeys:sse(),availableCAs:ol,ca:t&&Array.from(ol.values()),cert:S,key:m,key_file:d.private_key_name,is_self_signed:d.is_self_signed};o&&(R.sessionIdContext=o.sessionIdContext);let E=sg.createSecureContext(R);E.name=d.name,E.options=R,E.quality=h,E.certificateAuthorities=Array.from(ol),E.certStart=S.toString().slice(0,100);let T=d.hostnames??DO(g);Array.isArray(T)||(T=[T]);let N;for(let v of T)if(v){v[0]==="*"&&(s=!0,v=v.slice(1)),v===yO()&&(h+=2),dk.isIP(v)&&(N=!0);let H=r.get(v)?.quality??0;h>H&&r.set(v,E)}else Ra.error("No hostname found for certificate at",sg.certificate);Ra.trace("Adding TLS",E.name,"for",o.ports||"client","cert named",d.name,"hostnames",T,"quality",h,"best quality",f),h>f&&(i.defaultContext=n=E,f=h,o&&(o.defaultContext=E))}catch(_){Ra.error("Error applying TLS for",d.name,_)}o?.secureContextsListeners.forEach(d=>d()),c(n)}catch(f){l(f)}}a(u,"updateTLS"),TO.system.hdb_certificate.subscribe({listener:a(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(o,c){Ra.info("TLS requested for",o||"(no SNI)");let l=o;for(;;){let f=r.get(l);if(f)return Ra.debug("Found certificate for",o,f.certStart),f.updatedContext&&(f=f.updatedContext),c(null,f);if(s&&l){let d=l.indexOf(".",1);d<0?l="":l=l.slice(d)}else break}o?Ra.debug("No certificate found to match",o,"using the default certificate"):Ra.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):Ra.info("No default certificate found"),c(null,u)}a(i,"SNICallback")}a(bk,"createTLSSelector");async function Ok(e){let t=ba.get(e);return!t&&e?await bn.readFile(or.join(Jn.get(al.ROOTPATH),gs.LICENSE_KEY_DIR_NAME,e),"utf8"):t}a(Ok,"getPrivateKeyByName");async function Nk(){Oa();let e=[];for await(let t of kr.search([]))e.push(t);return e}a(Nk,"listCertificates");async function hse(e){let t=OO(e,Xs.object({name:Xs.string().required(),certificate:Xs.string().required(),is_authority:Xs.boolean().required(),private_key:Xs.string(),hosts:Xs.array(),uses:Xs.array()}));if(t)throw new ya(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,o=new yo(n),c=!1,l=!1,u;for(let[h,m]of ba)!s&&!c&&o.checkPrivateKey(fk(m))&&(c=!0,u=h),s&&s===m&&(l=!0,u=h);if(!i&&!s&&!c)throw new ya("A suitable private key was not found for this certificate");let f;if(!r){try{f=wk(o)}catch(h){Tt.error(h)}if(f==null)throw new ya("Error extracting certificate common name, please provide a name parameter")}let d=mse(r??f);s&&!c&&!l&&(await bn.writeFile(or.join(Jn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME,d+".pem"),s),ba.set(d,s));let _={name:r??f,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(_.private_key_name=u??d+".pem"),e.ciphers&&(_.ciphers=e.ciphers),await Ku(_),"Successfully added certificate: "+d}a(hse,"addCertificate");function mse(e){return e.replace(/[^a-z0-9\.]/gi,"-")}a(mse,"sanitizeName");async function pse(e){let t=OO(e,Xs.object({name:Xs.string().required()}));if(t)throw new ya(t.message);let{name:r}=e;Oa();let n=await kr.get(r);if(!n)throw new ya(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await kr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(Tt.info("Removing private key named",s),await bn.remove(or.join(Jn.getHdbBasePath(),gs.LICENSE_KEY_DIR_NAME,s)))}return await kr.delete(r),"Successfully removed "+r}a(pse,"removeCertificate");function wk(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||DO(e)[0]}a(wk,"getPrimaryHostName");function DO(e){if(e.subjectAltName)return e.subjectAltName.split(",").map(r=>{let n=r.indexOf(":");if(r=r.slice(n+1),r=r.trim(),r[0]==='"')try{r=JSON.parse(r)}catch{}return r.indexOf("=")>-1?r.match(/CN=([^,]*)/)?.[1]:r}).filter(r=>r);let t=certObj.subject?.match(/CN=(.*)/)?.[1];return t?[t]:[]}a(DO,"hostnamesFromCert");async function Ese(e){if(e.bypass_auth!==!0)throw new ya("Unauthorized","401");let t=OO(e,Xs.object({name:Xs.string().required()}));if(t)throw new ya(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await ak()).privateKey;if(r===".jwtPublic")return(await ak()).publicKey;if(ba.get(r))return ba.get(e.name);throw new ya("Key not found")}a(Ese,"getKey")});var jk={};Ue(jk,{CONFIRMATION_STATUS_POSITION:()=>Wk,NodeReplicationConnection:()=>Wu,OPERATION_REQUEST:()=>UO,RECEIVED_TIME_POSITION:()=>BO,RECEIVED_VERSION_POSITION:()=>xO,RECEIVING_STATUS_POSITION:()=>HO,RECEIVING_STATUS_RECEIVING:()=>Qk,RECEIVING_STATUS_WAITING:()=>zk,SENDING_TIME_POSITION:()=>th,createWebSocket:()=>hg,database_subscriptions:()=>Ia,replicateOverWS:()=>rh,table_update_listeners:()=>FO});async function hg(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=et(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!MO){let l=(0,$k.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),MO=u.secureContexts}if(i=MO.get(s),i&&ce.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let o={};r&&(o.Authorization=r);let c={headers:o,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,Kk.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(fg?.caCount!==bo.size&&(fg=Vk.createSecureContext({...i.options,ca:[...bo,...i.options.availableCAs.values()]}),fg.caCount=bo.size),c.secureContext=fg),new Gk.WebSocket(e,"harperdb-replication-v1",c)}function rh(e,t,r){let n=t.port||t.securePort,s=cl.pid%1e3+"-"+qk.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3),i=0,o=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(o.buffer,0,1024),u=t.database,f=t.databaseSubscriptions||Ia,d,_,h=!1,m=t.subscription;m?.then&&m.then(A=>m=A);let S=t.tables||u&&Xe()[u];if(!r){ce.error?.("No authorization provided"),cn(1008,"Unauthorized");return}let g=new Map,R=[],E=r.name;E&&t.connection&&(t.connection.nodeName=E);let T,N,v,H,X,W,$,se=6e4,z,fe=0,ue=0,Z=0,Ae=Fk.default.get(x.REPLICATION_BLOBTIMEOUT)??12e4,me=new Map,ye=[],Ht=0,dt;if(t.url){let A=a(()=>{X&&ue===e._socket?.bytesRead&&Z===e._socket?.bytesWritten?e.terminate():(X=performance.now(),e.ping(),ue=e._socket?.bytesRead,Z=e._socket?.bytesWritten)},"send_ping");v=setInterval(A,Hk).unref(),A()}else Ln();e._socket?.setMaxListeners(200);function Ln(){clearTimeout(H),ue=e._socket?.bytesRead,Z=e._socket?.bytesWritten,H=setTimeout(()=>{ue===e._socket?.bytesRead&&Z===e._socket?.bytesWritten&&(ce.warn?.(`Timeout waiting for ping from ${E}, terminating connection and reconnecting`),e.terminate())},Hk*2).unref()}a(Ln,"resetPingTimer");function an(){return _||(_=eg(d,u,E)),_}a(an,"getSharedStatus"),u&&Jo(u);let Cr,Jd,ac=[],ZT=[],eA,kt=[],Xd=[],Zd=[],tA=150,Pm=25,ef=0,Ce=0,tf=!1,Zi,Pr,Mn,cc;e.on("message",A=>{fe=performance.now();try{let y=A.dataView=new ll(A.buffer,A.byteOffset,A.byteLength);if(A[0]>127){let B=(0,Ze.decode)(A),[w,D,G]=B;switch(w){case Pk:{if(D){if(E){if(E!==D){ce.error?.(s,`Node name mismatch, expecting to connect to ${E}, but peer reported name as ${D}, disconnecting`),e.send((0,Ze.encode)([Yu])),cn(1008,"Node name mismatch");return}}else if(E=D,t.connection?.tentativeNode){let oe=t.connection.tentativeNode;oe.name=E,t.connection.tentativeNode=null,Ro(E,oe)}if(t.connection&&(t.connection.nodeName=E),ce.debug?.(s,"received node name:",E,"db:",u),!u)try{Jo(u=B[2]),u==="system"&&(Cr=Ta(t,(oe,V)=>{jo(V)&&sf(V)}),e.on("close",()=>{Cr?.remove()}))}catch(oe){ce.warn?.(s,"Error setting database",oe),e.send((0,Ze.encode)([Yu])),cn(1008,oe.message);return}Qo()}break}case xk:{ce.debug?.(s,"Received table definitions for",D.map(oe=>oe.table));for(let oe of D){let V=B[2];oe.database=V;let J;jo(V)&&(V==="system"?We[V]?.[oe.table]||(J=L(oe,We[V]?.[oe.table])):J=L(oe,We[V]?.[oe.table]),d||(d=J?.auditStore),S||(S=Xe()?.[V]))}break}case Yu:cn();break;case UO:try{let oe=r?.replicates||r?.subscribers||r?.name;server.operation(D,{user:r},!oe).then(V=>{Array.isArray(V)&&(V={results:V}),V.requestId=D.requestId,e.send((0,Ze.encode)([cg,V]))},V=>{e.send((0,Ze.encode)([cg,{requestId:D.requestId,error:V instanceof Error?V.toString():V}]))})}catch(oe){e.send((0,Ze.encode)([cg,{requestId:D.requestId,error:oe instanceof Error?oe.toString():oe}]))}break;case cg:let{resolve:j,reject:Q}=g.get(D.requestId);D.error?Q(new Error(D.error)):j(D),g.delete(D.requestId);break;case LO:let F=B[3];S||(u?ce.error?.(s,"No tables found for",u):ce.error?.(s,"Database name never received"));let ve=S[F];ve=L({table:F,database:u,attributes:D.attributes,schemaDefined:D.schemaDefined},ve),ac[G]={name:F,decoder:new Ze.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:D.typedStructs,structures:D.structures}),getEntry(oe){return ve.primaryStore.getEntry(oe)},rootStore:ve.primaryStore.rootStore};break;case Dk:cc=d?JH(D,d):new Map,eA=B[2],ce.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${eA}`);break;case Lk:let Ee=G;Zd[Ee]=D;break;case Uk:an()[Wk]=D,ce.trace?.(s,"received and broadcasting committed update",D),an().buffer.notify();break;case vk:T=D,m.send({type:"end_txn",localTime:T,remoteNodeIds:R});break;case lg:{let oe=B[1],{fileId:V,size:J,finished:de,error:pe}=oe,ae=me.get(V);ce.debug?.("Received blob",V,"has stream",!!ae,"connectedToBlob",!!ae?.connectedToBlob,"length",B[2].length,"finished",de),ae||(ae=new vO.PassThrough,ae.expectedSize=J,me.set(V,ae)),ae.lastChunk=Date.now();let Ie=B[2];Mt(Ie.byteLength,"bytes-received",`${E}.${u}`,"replication","blob");try{de?(pe?(ae.on("error",()=>{}),ae.destroy(new Error("Blob error: "+pe+" for record "+(ae.recordId??"unknown")+" from "+E))):ae.end(Ie),ae.connectedToBlob&&me.delete(V)):ae.write(Ie)}catch(He){ce.error?.(`Error receiving blob for ${ae.recordId} from ${E} and streaming to storage`,He),me.delete(V)}break}case Mk:{let oe=D,V;try{let J=B[3],de=ZT[G]||(ZT[G]=S[B[4]]);if(!de)return ce.warn?.("Unknown table id trying to handle record request",G);let pe=de.primaryStore.getBinaryFast(Symbol.for("structures")),ae=pe?.length;if(ae>0&&ae!==Ce){Ce=ae;let He=(0,Ze.decode)(pe);e.send((0,Ze.encode)([LO,{typedStructs:He.typed,structures:He.named},G,de.tableName]))}let Ie=de.primaryStore.getBinaryFast(J);if(Ie){let He=de.primaryStore.decoder.decode(Ie,{valueAsBuffer:!0}),De=He.value;He[Pc]&Ur&&(De=Buffer.from(De),xf(()=>de.primaryStore.decoder.decode(Ie),rt=>lc(rt,J),de.primaryStore.rootStore)),V=(0,Ze.encode)([ag,oe,{value:De,expiresAt:He.expiresAt,version:He.version,residencyId:He.residencyId,nodeId:He.nodeId,user:He.user}])}else V=(0,Ze.encode)([ag,oe])}catch(J){V=(0,Ze.encode)([ag,oe,{error:J.message}])}e.send(V);break}case ag:{let{resolve:oe,reject:V,tableId:J,key:de}=g.get(B[1]),pe=B[2];if(pe?.error)V(new Error(pe.error));else if(pe){let ae;Tp(()=>{let Ie=ac[J].decoder.decode(pe.value);pe.value=Ie,pe.key=de,oe(pe)||ae&&setTimeout(()=>ae.forEach(Ep),6e4).unref()},d?.rootStore,Ie=>{let He=rf(Ie,de);return ae||(ae=[]),ae.push(He),He})}else oe();g.delete(B[1]);break}case Ck:{Mn=D;let oe,V,J=!1;if(m){if(u!==m.databaseName&&!m.then){ce.error?.("Subscription request for wrong database",u,m.databaseName);return}}else m=f.get(u);if(ce.debug?.(s,"received subscription request for",u,"at",Mn),!m){let Oe;m=new Promise(Ft=>{ce.debug?.("Waiting for subscription to database "+u),Oe=Ft}),m.ready=Oe,Ia.set(u,m)}if(r.name)V=ir().subscribe(r.name),V.then(async Oe=>{oe=Oe;for await(let Ft of oe){let Nt=Ft.value;if(!(Nt?.replicates===!0||Nt?.replicates?.receives||Nt?.subscriptions?.some(yr=>(yr.database||yr.schema)===u&&yr.publish!==!1))){J=!0,e.send((0,Ze.encode)([Yu])),cn(1008,`Unauthorized database subscription to ${u}`);return}}},Oe=>{ce.error?.(s,"Error subscribing to HDB nodes",Oe)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,Ze.encode)([Yu])),cn(1008,`Unauthorized database subscription to ${u}`);return}if(Pr&&(ce.debug?.(s,"stopping previous subscription",u),Pr.emit("close")),Mn.length===0)return;let de=Mn[0],pe=a(Oe=>{if(Oe&&(de.replicateByDefault?!de.tables.includes(Oe.tableName):de.tables.includes(Oe.tableName)))return{table:Oe}},"tableToTableEntry"),ae={txnTime:0},Ie,He,De=1/0,rt,vn=a((Oe,Ft)=>{if(Oe.type==="end_txn"){ae.txnTime&&(o[i]!==66&&ce.error?.("Invalid encoding of message"),eo(9),eo(_g),p(rt=Ft),fi()),i=c,ae.txnTime=0;return}let Nt=Oe.nodeId,yr=Oe.tableId,Rt=He[yr];if(!Rt&&(Rt=He[yr]=pe(m.tableById[yr]),!Rt))return ce.debug?.("Not subscribed to table",yr);let ls=Rt.table,wt=ls.primaryStore,Us=wt.encoder;(Oe.extendedType&Cp||!Us.typedStructs)&&(Us._mergeStructures(Us.getStructures()),Us.typedStructs&&(Us.lastTypedStructuresLength=Us.typedStructs.length));let Yl=Ie[Nt];if(!(Yl&&Yl.startTime<Ft&&(!Yl.endTime||Yl.endTime>Ft)))return dg&&ce.trace?.(s,"skipping replication update",Oe.recordId,"to:",E,"from:",Nt,"subscribed:",Ie),dP();dg&&ce.trace?.(s,"sending replication update",Oe.recordId,"to:",E,"from:",Nt,"subscribed:",Ie);let rA=Oe.version;ae.txnTime!==rA&&(ae.txnTime&&(dg&&ce.trace?.(s,"new txn time, sending queued txn",ae.txnTime),o[i]!==66&&ce.error?.("Invalid encoding of message"),fi()),ae.txnTime=rA,i=c,p(rA));let fc=Oe.residencyId,nA=nf(fc,ls),Lm;if(nA&&!nA.includes(E)){let xs=nf(Oe.previousResidencyId,ls);if(xs&&!xs.includes(E)&&(Oe.type==="put"||Oe.type==="patch")||ls.getResidencyById)return dP();let of=Oe.recordId;ce.trace?.(s,"sending invalidation",of,E,"from",Nt);let af=0;fc&&(af|=Mc),Oe.previousResidencyId&&(af|=vc);let oA,Mm=null;for(let fP in ls.indices){if(!Mm){if(oA=Oe.getValue(wt,!0),!oA)break;Mm={}}Mm[fP]=oA[fP]}Lm=Dc(Oe.version,yr,of,null,Nt,Oe.user,Oe.type==="put"||Oe.type==="patch"?"invalidate":Oe.type,Us.encode(Mm),af,fc,Oe.previousResidencyId,Oe.expiresAt)}function dP(){return ce.trace?.(s,"skipping audit record",Oe.recordId),W||(W=setTimeout(()=>{W=null,(rt||0)+Bk/2<De&&(dg&&ce.trace?.(s,"sending skipped sequence update",De),e.send((0,Ze.encode)([vk,De])))},Bk).unref()),new Promise(setImmediate)}a(dP,"skipAuditRecord");let sA=Us.typedStructs,iA=Us.structures;if((sA?.length!=Rt.typed_length||iA?.length!=Rt.structure_length)&&(Rt.typed_length=sA?.length,Rt.structure_length=iA.length,ce.debug?.(s,"send table struct",Rt.typed_length,Rt.structure_length),Rt.sentName||(Rt.sentName=!0),e.send((0,Ze.encode)([LO,{typedStructs:sA,structures:iA,attributes:ls.attributes,schemaDefined:ls.schemaDefined},yr,Rt.table.tableName]))),fc&&!Xd[fc]&&(e.send((0,Ze.encode)([Lk,nA,fc])),Xd[fc]=!0),Lm)eo(Lm.length),K(Lm);else{let xs=Oe.encoded;Oe.extendedType&Ur&&xf(()=>Oe.getValue(wt),af=>lc(af,Oe.recordId),wt.rootStore);let of=xs[0]===66?8:0;eo(xs.length-of),K(xs,of),ce.trace?.("wrote record",Oe.recordId,"length:",xs.length)}return e._socket.writableNeedDrain?new Promise(xs=>{ce.debug?.(`Waiting for remote node ${E} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",xs)}):Ht>Pm?new Promise(xs=>{dt=xs}):new Promise(setImmediate)},"sendAuditRecord"),fi=a(()=>{c-i>8?(e.send(o.subarray(i,c)),ce.debug?.(s,"Sent message, size:",c-i),Mt(c-i,"bytes-sent",`${E}.${u}`,"replication","egress")):ce.debug?.(s,"skipping empty transaction")},"sendQueuedData");Pr=new kO.EventEmitter,Pr.once("close",()=>{J=!0,oe?.end()});for(let{startTime:Oe}of Mn)Oe<De&&(De=Oe);(V||Promise.resolve()).then(async()=>{m=await m,d=m.auditStore,He=m.tableById.map(pe),Ie=[];for(let{name:Ft,startTime:Nt,endTime:yr}of Mn){let Rt=ZE(Ft,d);ce.debug?.("subscription to",Ft,"using local id",Rt,"starting",Nt),Ie[Rt]={startTime:Nt,endTime:yr}}sf(u),Cr||(Cr=ul(Ft=>{Ft.databaseName===u&&sf(u)}),Jd=nh(Ft=>{Ft===u&&(e.send((0,Ze.encode)([Yu])),cn())}),e.on("close",()=>{Cr?.remove(),Jd?.remove()})),e.send((0,Ze.encode)([Dk,W_(m.auditStore),Mn.map(({name:Ft})=>Ft)]));let Oe=!0;do{isFinite(De)||(ce.warn?.("Invalid sequence id "+De),cn(1008,"Invalid sequence id"+De));let Ft;if(Oe&&!J&&(Oe=!1,De===0)){let Nt=De,yr=mg(d);for(let Rt in S){if(!pe(Rt))continue;let ls=S[Rt];ce.warn?.(`Fully copying ${Rt} table to ${E}`);for(let wt of ls.primaryStore.getRange({snapshot:!1,versions:!0})){if(J)return;if(wt.localTime>=De){ce.trace?.(s,"Copying record from",u,Rt,wt.key,wt.localTime),Nt=Math.max(wt.localTime,Nt),Ft=!0,an()[th]=1;let Us=Dc(wt.version,ls.tableId,wt.key,null,yr,null,"put",xf(()=>ls.primaryStore.encoder.encode(wt.value),Yl=>lc(Yl,wt.key)),wt.metadataFlags&-256,wt.residencyId,null,wt.expiresAt);await vn({recordId:wt.key,tableId:ls.tableId,type:"put",getValue(){return wt.value},encoded:Us,version:wt.version,residencyId:wt.residencyId,nodeId:yr,extendedType:wt.metadataFlags},wt.localTime)}}}Ft&&vn({type:"end_txn"},De),an()[th]=0,De=Nt}for(let{key:Nt,value:yr}of d.getRange({start:De||1,exclusiveStart:!0,snapshot:!1})){if(J)return;let Rt=St(yr);ce.debug?.("sending audit record",new Date(Nt)),an()[th]=Nt,De=Nt,await vn(Rt,Nt),Pr.startTime=Nt,Ft=!0}Ft&&vn({type:"end_txn"},De),an()[th]=0,await Jk(d)}while(!J)}).catch(Oe=>{ce.error?.(s,"Error handling subscription to node",Oe),cn(1008,"Error handling subscription to node")});break}}return}y.position=8;let I=!0,b,U;do{an();let B=y.readInt();if(B===9&&y.getUint8(y.position)==_g){y.position++,T=U=y.readFloat64(),_[xO]=T,_[BO]=Date.now(),_[HO]=zk,ce.trace?.("received remote sequence update",T,u);break}let w=y.position,D=St(A,w,w+B),G=ac[D.tableId];G||ce.error?.(`No table found with an id of ${D.tableId}`);let j;D.residencyId&&(j=Zd[D.residencyId],ce.trace?.(s,"received residency list",j,D.type,D.recordId));try{let Q=D.recordId;Tp(()=>{b={table:G.name,id:Q,type:D.type,nodeId:cc.get(D.nodeId),residencyList:j,timestamp:D.version,value:D.getValue(G),user:D.user,beginTxn:I,expiresAt:D.expiresAt}},d?.rootStore,F=>rf(F,Q))}catch(Q){throw Q.message+="typed structures for current decoder"+JSON.stringify(G.decoder.typedStructs),Q}I=!1,ce.trace?.(s,"received replication message",D.type,"id",b.id,"version",new Date(D.version),"nodeId",b.nodeId),_[xO]=D.version,_[BO]=Date.now(),_[HO]=Qk,m.send(b),y.position=w+B}while(y.position<A.byteLength);ef++,Mt(A.byteLength,"bytes-received",`${E}.${u}.${b?.table||"unknown_table"}`,"replication","ingest"),ef>tA&&!tf&&(tf=!0,e.pause(),ce.debug?.(`Commit backlog causing replication back-pressure, requesting that ${E} pause replication`)),m.send({type:"end_txn",localTime:T,remoteNodeIds:R,async onCommit(){if(b){let B=Date.now()-b.timestamp;Mt(B,"replication-latency",E+"."+u+"."+b.table,b.type,"ingest")}ef--,tf&&(tf=!1,e.resume(),ce.debug?.(`Replication resuming ${E}`)),ye.length>0&&await Promise.all(ye),ce.trace?.("All blobs finished"),!N&&U&&(ce.trace?.(s,"queuing confirmation of a commit at",U),setTimeout(()=>{e.send((0,Ze.encode)([Uk,N])),ce.trace?.(s,"sent confirmation of a commit at",N),N=null},Sse)),N=U,ce.debug?.("last sequence committed",new Date(U),u)}})}catch(y){ce.error?.(s,"Error handling incoming replication message",y)}}),e.on("ping",Ln),e.on("pong",()=>{t.connection&&(t.connection.latency=performance.now()-X,t.isSubscriptionConnection&&il({name:E,database:u,url:t.url,latency:t.connection.latency})),X=null}),e.on("close",(A,y)=>{clearInterval(v),clearTimeout(H),clearInterval($),Pr&&Pr.emit("close"),Zi&&Zi.end();for(let[I,{reject:b}]of g)b(new Error(`Connection closed ${y?.toString()} ${A}`));ce.debug?.(s,"closed",A,y?.toString())});function cn(A,y){e.isFinished=!0,e.close(A,y),t.connection?.emit("finished")}a(cn,"close");let Dr=new Set;async function lc(A,y){let I=gp(A);if(Dr.has(I)){ce.debug?.("Blob already being sent",I);return}Dr.add(I);try{let b;Ht++;for await(let U of A.stream())b&&(ce.debug?.("Sending blob chunk",I,"length",b.length),e.send((0,Ze.encode)([lg,{fileId:I,size:A.size},b]))),b=U,e._socket.writableNeedDrain&&(ce.debug?.("draining",I),await new Promise(B=>e._socket.once("drain",B)),ce.debug?.("drained",I)),Mt(U.length,"bytes-sent",`${E}.${u}`,"replication","blob");ce.debug?.("Sending final blob chunk",I,"length",b.length),e.send((0,Ze.encode)([lg,{fileId:I,size:A.size,finished:!0},b]))}catch(b){ce.warn?.("Error sending blob",b,"blob id",I,"for record",y),e.send((0,Ze.encode)([lg,{fileId:I,finished:!0,error:b.toString()},Buffer.alloc(0)]))}finally{Dr.delete(I),Ht--,Ht<Pm&&dt?.()}}a(lc,"sendBlobs");function rf(A,y){let I=gp(A),b=me.get(I);ce.debug?.("Received transaction for record",y,"with blob",I,"has stream",!!b,"ended",!!b?.writableEnded),b?b.writableEnded&&me.delete(I):(b=new vO.PassThrough,me.set(I,b)),b.connectedToBlob=!0,b.lastChunk=Date.now(),b.recordId=y,A.size===void 0&&b.expectedSize&&(A.size=b.expectedSize);let U=b.blob??createBlob(b,A);b.blob=U;let B=io(()=>Uf(U).saving,m.auditStore?.rootStore);return B&&(B.blobId=I,ye.push(B),B.finally(()=>{ce.debug?.(`Finished receiving blob stream ${I}`),ye.splice(ye.indexOf(B),1)})),U}a(rf,"receiveBlobs");function Qo(){if(h||(h=!0,t.connection?.on("subscriptions-updated",Qo)),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let A=new Map;d||(d=m?.auditStore);try{for(let b of m?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let U of b.value.nodes||[])U.lastTxnTime>(A.get(U.id)??0)&&A.set(U.id,U.lastTxnTime)}catch(b){if(!b.message.includes("Can not re"))throw b}let y=t.connection?.nodeSubscriptions?.[0];R=[];let I=t.connection?.nodeSubscriptions?.map((b,U)=>{let B=[],{replicateByDefault:w}=b;if(b.subscriptions){for(let Q of b.subscriptions)if(Q.subscribe&&(Q.schema||Q.database)===u){let F=Q.table;S?.[F]?.replicate!==!1&&B.push(F)}w=!1}else for(let Q in S)(w?S[Q].replicate===!1:S[Q].replicate)&&B.push(Q);let D=d&&ZE(b.name,d),G=m?.dbisDB?.get([Symbol.for("seq"),D])??1,j=Math.max(G?.seqId??1,(typeof b.start_time=="string"?new Date(b.start_time).getTime():b.start_time)??1);if(ce.debug?.("Starting time recorded in db",b.name,D,u,G?.seqId,"start time:",j,new Date(j)),y!==b){let Q=d&&ZE(y.name,d),F=m?.dbisDB?.get([Symbol.for("seq"),Q])??1;for(let ve of F?.nodes||[])ve.name===b.name&&(j=ve.seqId,ce.debug?.("Using sequence id from proxy node",y.name,j))}if(D===void 0?ce.warn("Starting subscription request from node",b,"but no node id found"):R.push(D),A.get(D)>j&&(j=A.get(D),ce.debug?.("Updating start time from more recent txn recorded",y.name,j)),j===1&&ug)try{new URL(ug).hostname===b.name&&E===b.name?(ce.warn?.(`Requesting full copy of database ${u} from ${ug}`),j=0):j=Date.now()-6e4}catch(Q){ce.error?.("Error parsing leader URL",ug,Q)}return ce.trace?.(s,"defining subscription request",b.name,u,new Date(j)),{name:b.name,replicateByDefault:w,tables:B,startTime:j,endTime:b.end_time}});if(I)if(ce.debug?.(s,"sending subscription request",I,m?.dbisDB?.path),clearTimeout(z),I.length>0)e.send((0,Ze.encode)([Ck,I]));else{let b=a(()=>{let U=performance.now();z=setTimeout(()=>{fe<=U?cn(1008,"Connection has no subscriptions and is no longer used"):b()},se).unref()},"schedule_close");b()}}a(Qo,"sendSubscriptionRequestUpdate");function nf(A,y){if(!A)return;let I=kt[A];return I||(I=y.getResidencyRecord(A),kt[A]=I),I}a(nf,"getResidence");function jo(A){return!(wa&&wa!="*"&&!wa[A]&&!wa.includes?.(A)&&!wa.some?.(y=>y.name===A))}a(jo,"checkDatabaseAccess");function Jo(A){if(m=m||f.get(A),!jo(A))throw new Error(`Access to database "${A}" is not permitted`);m||ce.warn?.(`No database named "${A}" was declared and registered`),d=m?.auditStore,S||(S=Xe()?.[A]);let y=et();if(y===E)throw y?new Error("Should not connect to self",y):new Error("Node name not defined");return Dm(y,A),!0}a(Jo,"setDatabase");function Dm(A,y){let I=Xe()?.[y],b=[];for(let U in I){let B=I[U];b.push({table:U,schemaDefined:B.schemaDefined,attributes:B.attributes.map(w=>({name:w.name,type:w.type,isPrimaryKey:w.isPrimaryKey}))})}ce.trace?.("Sending database info for node",A,"database name",y),e.send((0,Ze.encode)([Pk,A,y,b]))}a(Dm,"sendNodeDBName");function sf(A){let y=Xe()?.[A],I=[];for(let b in y){if(Mn&&!Mn.some(B=>B.replicateByDefault?!B.tables.includes(b):B.tables.includes(b)))continue;let U=y[b];I.push({table:b,schemaDefined:U.schemaDefined,attributes:U.attributes.map(B=>({name:B.name,type:B.type,isPrimaryKey:B.isPrimaryKey}))})}e.send((0,Ze.encode)([xk,I,A]))}a(sf,"sendDBSchema"),$=setInterval(()=>{for(let[A,y]of me)y.lastChunk+Ae<Date.now()&&(ce.warn?.(`Timeout waiting for blob stream to finish ${A} for record ${y.recordId??"unknown"} from ${E}`),me.delete(A),y.end())},Ae).unref();let uc=1,dc=[];return{end(){Zi&&Zi.end(),Pr&&Pr.emit("close")},getRecord(A){let y=uc++;return new Promise((I,b)=>{let U=[Mk,y,A.table.tableId,A.id];dc[A.table.tableId]||(U.push(A.table.tableName),dc[A.table.tableId]=!0),e.send((0,Ze.encode)(U)),fe=performance.now(),g.set(y,{tableId:A.table.tableId,key:A.id,resolve(B){let{table:w,entry:D}=A;if(I(B),B)return w._recordRelocate(D,B)},reject:b})})},sendOperation(A){let y=uc++;return A.requestId=y,e.send((0,Ze.encode)([UO,A])),new Promise((I,b)=>{g.set(y,{resolve:I,reject:b})})}};function eo(A){O(5),A<128?o[c++]=A:A<16384?(l.setUint16(c,A|32768),c+=2):A<1056964608?(l.setUint32(c,A|3221225472),c+=4):(o[c]=255,l.setUint32(c+1,A),c+=5)}function K(A,y=0,I=A.length){let b=I-y;O(b),A.copy(o,c,y,I),c+=b}function p(A){O(8),l.setFloat64(c,A),c+=8}function O(A){if(A+16>o.length-c){let y=Buffer.allocUnsafeSlow(c+A-i+65536>>10<<11);o.copy(y,0,i,c),c=c-i,i=0,o=y,l=new DataView(o.buffer,0,o.length)}}function L(A,y){let I=A.database??"data";if(I!=="data"&&!We[I]){ce.warn?.("Database not found",A.database);return}y||(y={});let b=y.schemaDefined,U=!1,B=A.schemaDefined,w=y.attributes||[];for(let D=0;D<A.attributes?.length;D++){let G=A.attributes[D],j=w.find(Q=>Q.name===G.name);(!j||j.type!==G.type)&&(b?ce.error?.(`Schema for '${u}.${A.table}' is defined locally, but attribute '${G.name}: ${G.type}' from '${E}' does not match local attribute ${j?"'"+j.name+": "+j.type+"'":"which does not exist"}`):(U=!0,B||(G.indexed=!0),j?w[w.indexOf(j)]=G:w.push(G)))}return U?(ce.debug?.("(Re)creating",A),_t({table:A.table,database:A.database,schemaDefined:A.schemaDefined,attributes:w,...y})):y}}var Fk,Ze,Gk,qk,ce,kO,$k,Vk,cl,Kk,vO,Yk,Ck,Pk,Dk,Yu,Lk,LO,Mk,ag,UO,cg,vk,Uk,xk,lg,Wk,xO,BO,th,HO,zk,Qk,gse,ug,FO,Ia,dg,Bk,Sse,Hk,MO,fg,kk,Wu,GO=Re(()=>{xe();Ri();mO();qO();Es();Fk=M(le());k();fu();Ze=require("msgpackr"),Gk=require("ws"),qk=require("worker_threads"),ce=M(Gs());X_();kO=require("events"),$k=M(ei()),Vk=M(require("node:tls"));sl();cl=M(require("node:process")),Kk=require("node:net");Mi();gn();vO=require("node:stream"),Yk=M(require("minimist")),Ck=129,Pk=140,Dk=141,Yu=142,Lk=130,LO=132,Mk=133,ag=134,UO=136,cg=137,vk=143,Uk=144,xk=145,lg=146,Wk=0,xO=1,BO=2,th=3,HO=4,zk=0,Qk=1,gse=(0,Yk.default)(cl.argv),ug=gse.HDB_LEADER_URL??cl.env.HDB_LEADER_URL,FO=new Map,Ia=new Map,dg=!0,Bk=300,Sse=2,Hk=3e4;a(hg,"createWebSocket");kk=500,Wu=class extends kO.EventEmitter{constructor(r,n,s,i,o){super();this.url=r;this.subscription=n;this.databaseName=s;this.nodeName=i;this.authorization=o;this.nodeName=this.nodeName??Js(r)}static{a(this,"NodeReplicationConnection")}socket;startTime;retryTime=kk;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;async connect(){this.session||this.resetSession();let r=[];this.socket=await hg(this.url,{serverName:this.nodeName,authorization:this.authorization});let n;ce.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${cl.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ce[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=kk,this.nodeSubscriptions&&il({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,n=rh(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(n)}),this.socket.on("error",s=>{s.code==="SELF_SIGNED_CERT_IN_CHAIN"?(ce.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),s.isHandled=!0):s.code!=="ECONNREFUSED"&&(s.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?ce.error?.(`Can not connect to ${this.url}, the certificate provided by ${this.url} is not trusted, this node needs to be added to the cluster, or a certificate authority needs to be added`):ce.error?.(`Error in connection to ${this.url} due to ${s.message}`)),this.sessionReject(s)}),this.socket.on("close",(s,i)=>{if(this.isConnected&&(this.nodeSubscriptions&&$u({name:this.nodeName,database:this.databaseName,url:this.url,finished:this.socket.isFinished}),this.isConnected=!1),this.removeAllListeners("subscriptions-updated"),this.socket.isFinished){this.isFinished=!0,n?.end(),this.emit("finished");return}if(++this.retries%20===1){let o=i?.toString();ce.warn?.(`${n?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${o?'"'+o+'" ':""}(code: ${s})`)}n=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((r,n)=>{this.sessionResolve=r,this.sessionReject=n})}subscribe(r,n){this.nodeSubscriptions=r,this.replicateTablesByDefault=n,this.emit("subscriptions-updated",r)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(r){return this.session.then(n=>n.getRecord(r))}};a(rh,"replicateOverWS")});var Na={};Ue(Na,{clearThisNodeName:()=>Ise,disableReplication:()=>yse,enabled_databases:()=>wa,forEachReplicatedDatabase:()=>Ta,getThisNodeId:()=>mg,getThisNodeName:()=>et,getThisNodeUrl:()=>Aa,hostnameToUrl:()=>Tg,lastTimeInAuditStore:()=>z_,monitorNodeCAs:()=>iF,replicateOperation:()=>Pse,replication_certificate_authorities:()=>bo,sendOperationToNode:()=>sh,servers:()=>Ase,setReplicator:()=>aF,start:()=>Rse,startOnMainThread:()=>SO,subscribeToNode:()=>J_,unsubscribeFromNode:()=>ng,urlToNodeName:()=>Js});function Rse(e){if(e.port||(e.port=Ss.default.get(x.OPERATIONSAPI_NETWORK_PORT)),e.securePort||(e.securePort=Ss.default.get(x.OPERATIONSAPI_NETWORK_SECUREPORT)),!et())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of j_(e))t.set(Js(s.url),s);bse(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=Ye.ws(async(s,i,o,c)=>{if(i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,o);await o,s._socket.unref(),rh(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&ar.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Ye.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){!s.authorized&&s._nodeRequest.socket.authorizationError&&ar.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let o=ir().primaryStore;if(s.authorized&&s.peerCertificate.subject){let c=s.peerCertificate.subject,l=c&&(o.get(c.CN)||t.get(c.CN));if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){ar.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else ar.warn(`No node found for certificate common name ${c.CN}, available nodes are ${Array.from(o.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=o.get(s.ip)||t.get(s.ip);c?s.user=c:ar.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...o.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=a(()=>{let o=new Set(s.secureContexts.values());s.defaultContext&&o.add(s.defaultContext);for(let c of o)try{let l=Array.from(bo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=Sg.createSecureContext(u)}catch(l){ar.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Ss.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1&&i()}iF(()=>{for(let s of n)s()})}function iF(e){let t=0;Gu(r=>{r?.ca&&(bo.add(r.ca),bo.size!==t&&(t=bo.size,e?.()))})}function yse(e=!0){sF=e}function bse(e){sF||(Xe(),wa=e.databases,Ta(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||Ia;for(let[s,i]of Eg){let o=i.get(r);o&&(o.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];aF(r,s,e),FO.get(s)?.forEach(i=>i(s))}}))}function aF(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 oF extends Kr{static{a(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||Ia,o=i.get(e),c=o?.tableById||[];c[t.tableId]=t;let l=o?.ready;if(ar.trace("Setting up replicator subscription to database",e),!o?.auditStore)return this.subscription=o=new Hn,i.set(e,o),o.tableById=c,o.auditStore=t.auditStore,o.dbisDB=t.dbisDB,o.databaseName=e,l&&l(o),o;this.subscription=o}static subscribeOnThisThread(i,o){return!0}static async load(i){if(i){let o=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),o]);if(c){let l,u=new Set;do{let f;for(let _ of c){if(_===Ye.hostname)continue;let h=Nse(_,oF.subscription,e);h?.isConnected&&!u.has(h)&&(!f||h.latency<f.latency)&&(f=h)}if(!f)throw l||new rF.ServerError("No connection to any other nodes are available",502);let d={requestId:Tse++,table:t,entry:i,id:i.key};u.add(f);try{return await f.getRecord(d)}catch(_){if(f.isConnected)throw _;ar.warn("Error in load from node",gg,_),l||(l=_)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function Ose(e,t,r,n,s){let i=Eg.get(e);i||(i=new Map,Eg.set(e,i));let o=i.get(r);if(o)return o;if(t)return i.set(r,o=new Wu(e,t,r,n,s)),o.connect(),o.once("finished",()=>i.delete(r)),o}function Nse(e,t,r){let n=Xk.get(e);n||(n=new Map,Xk.set(e,n));let s=n.get(r);if(s)return s;let i=ir().primaryStore.get(e);return i?.url&&(s=new Wu(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function sh(e,t,r){r||(r={}),r.serverName=e.name;let n=await hg(e.url,r),s=rh(n,{},{});return new Promise((i,o)=>{n.on("open",()=>{i(s.sendOperation(t))}),n.on("error",c=>{o(c)}),n.on("close",c=>{ar.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function J_(e){try{nF.isMainThread&&ar.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=Ia.get(e.database);if(!t){let n;t=new Promise(s=>{ar.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,Ia.set(e.database,t)}let r=Ose(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=>Q_(n,e.database)),e.replicateByDefault)}catch(t){ar.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function ng({name:e,url:t,database:r}){ar.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(ir().primaryStore.getRange({})));let n=Eg.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function wse(){if($O!==void 0)return $O;let e=Ss.default.get(x.OPERATIONSAPI_TLS_CERTIFICATE)||Ss.default.get(x.TLS_CERTIFICATE);if(e)return $O=new eF.X509Certificate((0,tF.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function et(){return gg||(gg=Ss.default.get("replication_hostname")??Js(Ss.default.get("replication_url"))??wse()??Zk("operationsapi_network_secureport")??Zk("operationsapi_network_port")??"127.0.0.1")}function Ise(){gg=void 0}function Zk(e){let t=Ss.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function pg(e){let t=Ss.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function mg(e){return W_(e)?.[et()]}function Aa(){let e=Ss.default.get("replication_url");return e||Tg(et())}function Tg(e){let t=pg("replication_port");if(t)return`ws://${e}:${t}`;if(t=pg("replication_secureport"),t)return`wss://${e}:${t}`;if(t=pg("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=pg("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function Js(e){if(e)return new URL(e).hostname}function Ta(e,t){for(let n of Object.getOwnPropertyNames(We))r(n);return nh(n=>{r(n)}),ul((n,s)=>{r(n.databaseName)});function r(n){let s=We[n];ar.trace("Checking replication status of ",n,e?.databases),e?.databases===void 0||e.databases==="*"||e.databases.includes(n)||e.databases.some?.(i=>i.name===n)||!s?t(s,n,!0):Cse(n)&&t(s,n,!1)}a(r,"forDatabase")}function Cse(e){let t=We[e];for(let r in t)if(t[r].replicate)return!0}function z_(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function Pse(e){let t={message:""};if(e.replicated){e.replicated=!1,ar.trace?.("Replicating operation",e.operation,"to nodes",Ye.nodes.map(n=>n.name));let r=await Promise.allSettled(Ye.nodes.map(n=>sh(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Ye.nodes[s]?.name,i})}return t}var Ss,ar,eF,tF,Sg,rF,nF,sF,Tse,Ase,bo,wa,Eg,Xk,$O,gg,Es=Re(()=>{xe();oa();Xl();GO();Mr();Ss=M(le()),ar=M(ee()),eF=require("crypto"),tF=require("fs");X_();sl();k();mO();Sg=M(require("node:tls")),rF=M(he()),nF=require("worker_threads"),Tse=1,Ase=[],bo=Ss.default.get(x.REPLICATION_ENABLEROOTCAS)!==!1?new Set(Sg.rootCertificates):new Set;a(Rse,"start");a(iF,"monitorNodeCAs");a(yse,"disableReplication");a(bse,"assignReplicationSource");a(aF,"setReplicator");Eg=new Map;a(Ose,"getSubscriptionConnection");Xk=new Map;a(Nse,"getRetrievalConnectionByName");a(sh,"sendOperationToNode");a(J_,"subscribeToNode");a(ng,"unsubscribeFromNode");a(wse,"getCommonNameFromCert");a(et,"getThisNodeName");a(Ise,"clearThisNodeName");Object.defineProperty(Ye,"hostname",{get(){return et()}});a(Zk,"getHostFromListeningPort");a(pg,"getPortFromListeningPort");a(mg,"getThisNodeId");Ye.replication={getThisNodeId:mg,exportIdMapping:W_};a(Aa,"getThisNodeUrl");a(Tg,"hostnameToUrl");a(Js,"urlToNodeName");a(Ta,"forEachReplicatedDatabase");a(Cse,"hasExplicitlyReplicatedTable");a(z_,"lastTimeInAuditStore");a(Pse,"replicateOperation")});var oh=C((rCe,fF)=>{"use strict";var zu=TH(),{validateBySchema:ih}=it(),{common_validators:Qu,schema_regex:VO}=Ni(),cr=require("joi"),Dse=ee(),Lse=require("uuid").v4,yg=go(),ju=(k(),P(q)),Mse=require("util"),Ca=Vn(),{handleHDBError:Oo,hdb_errors:vse,ClientError:dl}=he(),{HDB_ERROR_MSGS:Ag,HTTP_STATUS_CODES:No}=vse,{SchemaEventMsg:bg}=Ys(),cF=gr(),{getDatabases:Use}=(xe(),P(ct)),{transformReq:Ju}=ie(),{replicateOperation:lF}=(Es(),P(Na)),{cleanupOrphans:tCe}=(gn(),P(uu)),Rg=cr.string().min(1).max(Qu.schema_length.maximum).pattern(VO).messages({"string.pattern.base":"{:#label} "+Qu.schema_format.message}),xse=cr.string().min(1).max(Qu.schema_length.maximum).pattern(VO).messages({"string.pattern.base":"{:#label} "+Qu.schema_format.message}).required(),Bse=cr.string().min(1).max(Qu.schema_length.maximum).pattern(VO).messages({"string.pattern.base":"{:#label} "+Qu.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();fF.exports={createSchema:Hse,createSchemaStructure:uF,createTable:kse,createTableStructure:dF,createAttribute:Vse,dropSchema:Fse,dropTable:Gse,dropAttribute:qse,getBackup:Kse,cleanupOrphanBlobs:Yse};async function Hse(e){let t=await uF(e);return yg.signalSchemaChange(new bg(process.pid,e.operation,e.schema)),t}a(Hse,"createSchema");async function uF(e){let t=ih(e,cr.object({database:Rg,schema:Rg}));if(t)throw new dl(t.message);if(Ju(e),!await zu.checkSchemaExists(e.schema))throw Oo(new Error,Ag.SCHEMA_EXISTS_ERR(e.schema),No.BAD_REQUEST,ju.LOG_LEVELS.ERROR,Ag.SCHEMA_EXISTS_ERR(e.schema),!0);return await Ca.createSchema(e),`database '${e.schema}' successfully created`}a(uF,"createSchemaStructure");async function kse(e){return Ju(e),e.hash_attribute=e.primary_key??e.hash_attribute,await dF(e)}a(kse,"createTable");async function dF(e){let t=ih(e,cr.object({database:Rg,schema:Rg,table:xse,residence:cr.array().items(cr.string().min(1)).optional(),hash_attribute:Bse}));if(t)throw new dl(t.message);if(!await zu.checkSchemaTableExists(e.schema,e.table))throw Oo(new Error,Ag.TABLE_EXISTS_ERR(e.schema,e.table),No.BAD_REQUEST,ju.LOG_LEVELS.ERROR,Ag.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Lse(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await Ca.createTable(n,e);else throw Oo(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",No.BAD_REQUEST);else await Ca.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}a(dF,"createTableStructure");async function Fse(e){let t=ih(e,cr.object({database:cr.string(),schema:cr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new dl(t.message);Ju(e);let r=await zu.checkSchemaExists(e.schema);if(r)throw Oo(new Error,r,No.NOT_FOUND,ju.LOG_LEVELS.ERROR,r,!0);let n=await zu.schema_describe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await Ca.dropSchema(e),yg.signalSchemaChange(new bg(process.pid,e.operation,e.schema)),await cF.purgeSchemaTableStreams(e.schema,s);let i=await lF(e);return i.message=`successfully deleted '${e.schema}'`,i}a(Fse,"dropSchema");async function Gse(e){let t=ih(e,cr.object({database:cr.string(),schema:cr.string(),table:cr.string().required()}));if(t)throw new dl(t.message);Ju(e);let r=await zu.checkSchemaTableExists(e.schema,e.table);if(r)throw Oo(new Error,r,No.NOT_FOUND,ju.LOG_LEVELS.ERROR,r,!0);await Ca.dropTable(e),await cF.purgeTableStream(e.schema,e.table);let n=await lF(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}a(Gse,"dropTable");async function qse(e){let t=ih(e,cr.object({database:cr.string(),schema:cr.string(),table:cr.string().required(),attribute:cr.string().required()}));if(t)throw new dl(t.message);Ju(e);let r=await zu.checkSchemaTableExists(e.schema,e.table);if(r)throw Oo(new Error,r,No.NOT_FOUND,ju.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Oo(new Error,"You cannot drop a hash attribute",No.BAD_REQUEST,void 0,void 0,!0);if(ju.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Oo(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,No.BAD_REQUEST,void 0,void 0,!0);try{return await Ca.dropAttribute(e),$se(e),yg.signalSchemaChange(new bg(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw Dse.error(`Got an error deleting attribute ${Mse.inspect(e)}.`),n}}a(qse,"dropAttribute");function $se(e){let t=Object.values(global.hdb_schema[e.schema][e.table].attributes);for(let r=0;r<t.length;r++)t[r].attribute===e.attribute&&global.hdb_schema[e.schema][e.table].attributes.splice(r,1)}a($se,"dropAttributeFromGlobal");async function Vse(e){Ju(e);let t=Use()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Oo(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,No.BAD_REQUEST,void 0,void 0,!0);return await Ca.createAttribute(e),yg.signalSchemaChange(new bg(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}a(Vse,"createAttribute");function Kse(e){return Ca.getBackup(e)}a(Kse,"getBackup");function Yse(e){if(!e.database)throw new dl('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new dl(`Unknown database '${e.database}'`);let{cleanupOrphans:r}=(gn(),P(uu));return r(databases[e.database],e.database),{message:"Orphaned blobs cleanup started, check logs for progress"}}a(Yse,"cleanupOrphanBlobs")});var hF=C((sCe,_F)=>{"use strict";var{OPERATIONS_ENUM:Wse}=(k(),P(q)),KO=class{static{a(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Wse.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};_F.exports=KO});var YO=C((aCe,SF)=>{"use strict";var zse=Vn(),oCe=hF(),Og=ie(),Ng=(k(),P(q)),Qse=le(),{handleHDBError:mF,hdb_errors:jse}=he(),{HDB_ERROR_MSGS:pF,HTTP_STATUS_CODES:EF}=jse,Jse=Object.values(Ng.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),gF="To use this operation audit log must be enabled in harperdb-config.yaml";SF.exports=Xse;async function Xse(e){if(Og.isEmpty(e.schema))throw new Error(pF.SCHEMA_REQUIRED_ERR);if(Og.isEmpty(e.table))throw new Error(pF.TABLE_REQUIRED_ERR);if(!Qse.get(Ng.CONFIG_PARAMS.LOGGING_AUDITLOG))throw mF(new Error,gF,EF.BAD_REQUEST,Ng.LOG_LEVELS.ERROR,gF,!0);let t=Og.checkSchemaTableExist(e.schema,e.table);if(t)throw mF(new Error,t,EF.NOT_FOUND,Ng.LOG_LEVELS.ERROR,t,!0);if(!Og.isEmpty(e.search_type)&&Jse.indexOf(e.search_type)<0)throw new Error(`Invalid search_type '${e.search_type}'`);return await zse.readAuditLog(e)}a(Xse,"readAuditLog")});var AF=C((lCe,TF)=>{"use strict";var{OPERATIONS_ENUM:Zse}=(k(),P(q)),WO=class{static{a(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=Zse.GET_BACKUP,this.schema=t,this.table=r}};TF.exports=WO});var bF=C((_Ce,yF)=>{"use strict";var eie=Vn(),dCe=AF(),zO=ie(),tie=(k(),P(q)),fCe=le(),{handleHDBError:rie,hdb_errors:nie}=he(),{HDB_ERROR_MSGS:RF,HTTP_STATUS_CODES:sie}=nie;yF.exports=iie;async function iie(e){if(zO.isEmpty(e.schema))throw new Error(RF.SCHEMA_REQUIRED_ERR);if(zO.isEmpty(e.table))throw new Error(RF.TABLE_REQUIRED_ERR);let t=zO.checkSchemaTableExist(e.schema,e.table);if(t)throw rie(new Error,t,sie.NOT_FOUND,tie.LOG_LEVELS.ERROR,t,!0);return await eie.getBackup(read_audit_log_object)}a(iie,"getBackup")});var IF=C((mCe,wF)=>{"use strict";var oie=le(),Pa=require("joi"),aie=it(),OF=require("moment"),cie=require("fs-extra"),QO=require("path"),lie=require("lodash"),ah=(k(),P(q)),{LOG_LEVELS:fl}=(k(),P(q)),uie="YYYY-MM-DD hh:mm:ss",die=QO.resolve(__dirname,"../logs");wF.exports=function(e){return aie.validateBySchema(e,fie)};var fie=Pa.object({from:Pa.custom(NF),until:Pa.custom(NF),level:Pa.valid(fl.NOTIFY,fl.FATAL,fl.ERROR,fl.WARN,fl.INFO,fl.DEBUG,fl.TRACE),order:Pa.valid("asc","desc"),limit:Pa.number().min(1),start:Pa.number().min(0),log_name:Pa.custom(_ie)});function NF(e,t){if(OF(e,OF.ISO_8601).format(uie)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}a(NF,"validateDatetime");function _ie(e,t){if(lie.invert(ah.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=oie.get(ah.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?ah.LOG_NAMES.HDB:e,i=s===ah.LOG_NAMES.INSTALL?QO.join(die,ah.LOG_NAMES.INSTALL):QO.join(n,s);return cie.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}a(_ie,"validateReadLogPath")});var JO=C((ECe,PF)=>{"use strict";var wg=(k(),P(q)),hie=ee(),mie=le(),pie=IF(),jO=require("path"),CF=require("fs-extra"),{once:Eie}=require("events"),{handleHDBError:gie,hdb_errors:Sie}=he(),{PACKAGE_ROOT:Tie}=Et(),Aie=jO.join(Tie,"logs"),Rie=1e3,yie=200;PF.exports=bie;async function bie(e){let t=pie(e);if(t)throw gie(t,t.message,Sie.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=mie.get(wg.HDB_SETTINGS_NAMES.LOG_PATH_KEY),n=e.log_name===void 0?wg.LOG_NAMES.HDB:e.log_name,s=n===wg.LOG_NAMES.INSTALL?jO.join(Aie,wg.LOG_NAMES.INSTALL):jO.join(r,n),i=e.level!==void 0,o=i?e.level:void 0,c=e.from!==void 0,l=c?new Date(e.from):void 0,u=e.until!==void 0,f=u?new Date(e.until):void 0,d=e.limit===void 0?Rie:e.limit,_=e.order===void 0?void 0:e.order,h=e.start===void 0?0:e.start,m=h+d,S=0;_==="desc"&&!l&&!f&&(S=Math.max(CF.statSync(s).size-(m+5)*yie,0));let g=CF.createReadStream(s,{start:S});g.on("error",H=>{hie.error(H)});let R=0,E=[],T="",N;g.on("data",H=>{let X=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;H=T+H;let W=0,$;for(;($=X.exec(H))&&!g.destroyed;){N&&(N.message=H.slice(W,$.index),v(N));let[se,z,fe]=$,ue=fe.split("] ["),Z=ue[0],Ae=ue[1];ue.splice(0,2),N={timestamp:z,thread:Z,level:Ae,tags:ue,message:""},W=$.index+se.length}T=H.slice(W)}),g.on("end",H=>{g.destroyed||N&&(N.message=T.trim(),v(N))}),g.resume();function v(H){let X,W,$;switch(!0){case(i&&c&&u):X=new Date(H.timestamp),W=new Date(l),$=new Date(f),H.level===o&&X>=W&&X<=$&&R<h?R++:H.level===o&&X>=W&&X<=$&&(Da(H,_,E),R++,R===m&&g.destroy());break;case(i&&c):X=new Date(H.timestamp),W=new Date(l),H.level===o&&X>=W&&R<h?R++:H.level===o&&X>=W&&(Da(H,_,E),R++,R===m&&g.destroy());break;case(i&&u):X=new Date(H.timestamp),$=new Date(f),H.level===o&&X<=$&&R<h?R++:H.level===o&&X<=$&&(Da(H,_,E),R++,R===m&&g.destroy());break;case(c&&u):X=new Date(H.timestamp),W=new Date(l),$=new Date(f),X>=W&&X<=$&&R<h?R++:X>=W&&X<=$&&(Da(H,_,E),R++,R===m&&g.destroy());break;case i:H.level===o&&R<h?R++:H.level===o&&(Da(H,_,E),R++,R===m&&g.destroy());break;case c:X=new Date(H.timestamp),W=new Date(l),X>=W&&R<h?R++:X>=W&&R>=h&&(Da(H,_,E),R++,R===m&&g.destroy());break;case u:X=new Date(H.timestamp),$=new Date(f),X<=$&&R<h?R++:X<=$&&R>=h&&(Da(H,_,E),R++,R===m&&g.destroy());break;default:R<h?R++:(Da(H,_,E),R++,R===m&&g.destroy())}}return a(v,"onLogMessage"),await Eie(g,"close"),E}a(bie,"readLog");function Da(e,t,r){t==="desc"?Oie(e,r):t==="asc"?Nie(e,r):r.push(e)}a(Da,"pushLineToResult");function Oie(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)>r?n=i+1:s=i}t.splice(n,0,e)}a(Oie,"insertDescending");function Nie(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)<r?n=i+1:s=i}t.splice(n,0,e)}a(Nie,"insertAscending")});var Ig=C((yCe,vF)=>{"use strict";var XO=require("joi"),{string:Xu,boolean:DF,date:wie}=XO.types(),Iie=it(),{validateSchemaExists:SCe,validateTableExists:TCe,validateSchemaName:ACe}=Ni(),Cie=(k(),P(q)),Pie=Lt(),LF=le();LF.initSync();var RCe=Xu.invalid(LF.get(Cie.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Pie.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),MF={operation:Xu.valid("add_node","update_node","set_node_replication"),node_name:Xu.optional(),subscriptions:XO.array().items({table:Xu.optional(),schema:Xu.optional(),database:Xu.optional(),subscribe:DF.required(),publish:DF.required().custom(Lie),start_time:wie.iso()})};function Die(e){return Iie.validateBySchema(e,XO.object(MF))}a(Die,"addUpdateNodeValidator");function Lie(e,t){if(t.state.ancestors[2].operation==="add_node"&&e===!1&&t.state.ancestors[0].subscribe===!1)return t.message(`'subscriptions[${t.state.path[1]}]' subscribe and/or publish must be set to true when adding a node`)}a(Lie,"checkForFalsy");vF.exports={addUpdateNodeValidator:Die,validation_schema:MF}});var Zu=C((OCe,UF)=>{"use strict";var ZO=class{static{a(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},eN=class{static{a(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};UF.exports={Node:ZO,NodeSubscription:eN}});var BF=C((wCe,xF)=>{"use strict";var Mie=(k(),P(q)).OPERATIONS_ENUM,tN=class{static{a(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Mie.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};xF.exports=tN});var ch=C((CCe,HF)=>{"use strict";var rN=class{static{a(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},nN=class{static{a(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,o,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=o,c!==void 0&&(this.attributes=c)}};HF.exports={RemotePayloadObject:rN,RemotePayloadSubscription:nN}});var FF=C((DCe,kF)=>{"use strict";var sN=class{static{a(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,o=0){this.schema=t,this.table=r,this.table_size=n,this.record_count=s,this.transaction_log_size=i,this.transaction_log_record_count=o}};kF.exports=sN});var qF=C((BCe,GF)=>{"use strict";var vie=FF(),MCe=Gt(),vCe=ht(),Uie=ee(),{getSchemaPath:UCe,getTransactionAuditStorePath:xCe}=gt(),{getDatabases:xie}=(xe(),P(ct));GF.exports=Bie;async function Bie(e){let t=new vie;try{let r=xie()[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){Uie.warn(`unable to stat table dbi due to ${r}`)}return t}a(Bie,"lmdbGetTableSize")});var VF=C((kCe,$F)=>{"use strict";var iN=class{static{a(this,"SystemInformationObject")}constructor(t,r,n,s,i,o,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=o,this.harperdb_processes=c}};$F.exports=iN});var td=C((KCe,zF)=>{"use strict";var Hie=require("fs-extra"),kie=require("path"),Xr=require("systeminformation"),La=ee(),KF=gr(),GCe=Lt(),ed=(k(),P(q)),Fie=qF(),Gie=po(),{getThreadInfo:YF}=ot(),lh=le();lh.initSync();var qie=VF(),{openEnvironment:qCe}=ht(),{getSchemaPath:$Ce}=gt(),{database:VCe,databases:oN}=(xe(),P(ct)),Cg;zF.exports={getHDBProcessInfo:uN,getNetworkInfo:fN,getDiskInfo:dN,getMemoryInfo:lN,getCPUInfo:cN,getTimeInfo:aN,getSystemInformation:_N,systemInformation:$ie,getTableSize:hN,getMetrics:mN};function aN(){return Xr.time()}a(aN,"getTimeInfo");async function cN(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:o,governor:c,socket:l,cache:u,...f}=await Xr.cpu();f.cpu_speed=await Xr.cpuCurrentSpeed();let{raw_currentload:d,raw_currentload_idle:_,raw_currentload_irq:h,raw_currentload_nice:m,raw_currentload_system:S,raw_currentload_user:g,cpus:R,...E}=await Xr.currentLoad();return E.cpus=[],R.forEach(T=>{let{raw_load:N,raw_load_idle:v,raw_load_irq:H,raw_load_nice:X,raw_load_system:W,raw_load_user:$,...se}=T;E.cpus.push(se)}),f.current_load=E,f}catch(e){return La.error(`error in getCPUInfo: ${e}`),{}}}a(cN,"getCPUInfo");async function lN(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await Xr.mem();return Object.assign(s,process.memoryUsage())}catch(e){return La.error(`error in getMemoryInfo: ${e}`),{}}}a(lN,"getMemoryInfo");async function uN(){let e={core:[],clustering:[]};try{let t=await Xr.processes(),r;try{r=Number.parseInt(await Hie.readFile(kie.join(lh.get(ed.CONFIG_PARAMS.ROOTPATH),ed.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===ed.NODE_ERROR_CODES.ENOENT)La.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 La.error(`error in getHDBProcessInfo: ${t}`),e}}a(uN,"getHDBProcessInfo");async function dN(){let e={};try{if(!lh.get(ed.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await Xr.disksIO();e.io=i;let{rx_sec:o,tx_sec:c,wx_sec:l,...u}=await Xr.fsStats();return e.read_write=u,e.size=await Xr.fsSize(),e}catch(t){return La.error(`error in getDiskInfo: ${t}`),e}}a(dN,"getDiskInfo");async function fN(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return lh.get(ed.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await Xr.networkInterfaceDefault(),e.latency=await Xr.inetChecksite("google.com"),(await Xr.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:o,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:f,carrier_changes:d,..._}=n;e.interfaces.push(_)}),(await Xr.networkStats()).forEach(n=>{let{rx_sec:s,tx_sec:i,ms:o,...c}=n;e.stats.push(c)})),e}catch(t){return La.error(`error in getNetworkInfo: ${t}`),e}}a(fN,"getNetworkInfo");async function _N(){if(Cg!==void 0)return Cg;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:o,...c}=await Xr.osInfo();e=c;let l=await Xr.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,Cg=e,Cg}catch(t){return La.error(`error in getSystemInformation: ${t}`),e}}a(_N,"getSystemInformation");async function hN(){let e=[],t=await Gie.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await Fie(n));return e}a(hN,"getTableSize");async function mN(){let e={};for(let t in oN){let r=e[t]={},n=r.tables={};for(let s in oN[t])try{let i=oN[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,f,d]=l.trim().split(" ");return{pid:u,thread:f,txnid:d}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:_}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:f,entryCount:d,overflowPages:_}}let o=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=o[l];n[s]=c}catch(i){La.notify(`Error getting stats for table ${s}: ${i}`)}}return e}a(mN,"getMetrics");async function WF(){if(lh.get(ed.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await KF.getNATSReferences(),t=await KF.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let o={stream_name:n.config.name,database:n.config.subjects[0].split(".")[1],table:n.config.subjects[0].split(".")[2],state:n.state,consumers:s};r.push(o)}return r}}a(WF,"getNatsStreamInfo");async function $ie(e){let t=new qie;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await _N(),t.time=aN(),t.cpu=await cN(),t.memory=await lN(),t.disk=await dN(),t.network=await fN(),t.harperdb_processes=await uN(),t.table_size=await hN(),t.metrics=await mN(),t.threads=await YF(),t.replication=await WF(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await _N();break;case"time":t.time=aN();break;case"cpu":t.cpu=await cN();break;case"memory":t.memory=await lN();break;case"disk":t.disk=await dN();break;case"network":t.network=await fN();break;case"harperdb_processes":t.harperdb_processes=await uN();break;case"table_size":t.table_size=await hN();break;case"database_metrics":case"metrics":t.metrics=await mN();break;case"threads":t.threads=await YF();break;case"replication":t.replication=await WF();break;default:break}return t}a($ie,"systemInformation")});var ki=C((jCe,XF)=>{"use strict";var Vie=An(),pN=ie(),Kie=require("util"),_l=(k(),P(q)),QF=le();QF.initSync();var Yie=zb(),jF=Wr(),{Node:WCe,NodeSubscription:zCe}=Zu(),Wie=yu(),zie=BF(),{RemotePayloadObject:Qie,RemotePayloadSubscription:jie}=ch(),{handleHDBError:Jie,hdb_errors:Xie}=he(),{HTTP_STATUS_CODES:Zie,HDB_ERROR_MSGS:eoe}=Xie,toe=Ws(),roe=td(),{packageJson:noe}=Et(),{getDatabases:soe}=(xe(),P(ct)),QCe=Kie.promisify(Yie.authorize),ioe=jF.searchByHash,ooe=jF.searchByValue;XF.exports={isEmpty:aoe,getNodeRecord:coe,upsertNodeRecord:loe,buildNodePayloads:uoe,checkClusteringEnabled:doe,getAllNodeRecords:foe,getSystemInfo:_oe,reverseSubscription:JF};function aoe(e){return e==null}a(aoe,"isEmpty");async function coe(e){let t=new Wie(_l.SYSTEM_SCHEMA_NAME,_l.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return ioe(t)}a(coe,"getNodeRecord");async function loe(e){let t=new zie(_l.SYSTEM_SCHEMA_NAME,_l.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return Vie.upsert(t)}a(loe,"upsertNodeRecord");function JF(e){if(pN.isEmpty(e.subscribe)||pN.isEmpty(e.publish))throw new Error("Received invalid subscription object");let{schema:t,table:r,hash_attribute:n}=e,s={schema:t,table:r,hash_attribute:n};return e.subscribe===!0&&e.publish===!1?(s.subscribe=!1,s.publish=!0):e.subscribe===!1&&e.publish===!0?(s.subscribe=!0,s.publish=!1):(s.subscribe=e.subscribe,s.publish=e.publish),s}a(JF,"reverseSubscription");function uoe(e,t,r,n){let s=[];for(let i=0,o=e.length;i<o;i++){let c=e[i],{schema:l,table:u}=c,f=pN.getTableHashAttribute(l,u),{subscribe:d,publish:_}=JF(c),h=soe()[l]?.[u],m=new jie(l,u,f,_,d,c.start_time,h.schemaDefined?h.attributes:void 0);s.push(m)}return new Qie(r,t,s,n)}a(uoe,"buildNodePayloads");function doe(){if(!QF.get(_l.CONFIG_PARAMS.CLUSTERING_ENABLED))throw Jie(new Error,eoe.CLUSTERING_NOT_ENABLED,Zie.BAD_REQUEST,void 0,void 0,!0)}a(doe,"checkClusteringEnabled");async function foe(){let e=new toe(_l.SYSTEM_SCHEMA_NAME,_l.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await ooe(e))}a(foe,"getAllNodeRecords");async function _oe(){let e=await roe.getSystemInformation();return{hdb_version:noe.version,node_version:e.node_version,platform:e.platform}}a(_oe,"getSystemInfo")});var EN=C((XCe,oG)=>{"use strict";var Pg=gr(),ZF=ie(),eG=Lt(),tG=(k(),P(q)),Dg=ee(),rG=oh(),hoe=A_(),{RemotePayloadObject:moe}=ch(),{handleHDBError:nG,hdb_errors:poe}=he(),{HTTP_STATUS_CODES:sG}=poe,{NodeSubscription:iG}=Zu();oG.exports=Eoe;async function Eoe(e,t){let r;try{r=await Pg.request(`${t}.${eG.REQUEST_SUFFIX}`,new moe(tG.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),Dg.trace("Response from remote describe all request:",r)}catch(o){Dg.error(`addNode received error from describe all request to remote node: ${o}`);let c=Pg.requestErrorHandler(o,"add_node",t);throw nG(new Error,c,sG.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===eG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let o=`Error returned from remote node ${t}: ${r.message}`;throw nG(new Error,o,sG.INTERNAL_SERVER_ERROR,"error",o)}let n=r.message,s=[],i=[];for(let o of e){let{table:c}=o,l=o.database??o.schema??"data";if(l===tG.SYSTEM_SCHEMA_NAME){await Pg.createLocalTableStream(l,c);let m=new iG(l,c,o.publish,o.subscribe);m.start_time=o.start_time,i.push(m);continue}let u=ZF.doesSchemaExist(l),f=n[l]!==void 0,d=c?ZF.doesTableExist(l,c):!0,_=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!f||!d&&!_){s.push(o);continue}if(!u&&f&&(Dg.trace(`addNode creating schema: ${l}`),await rG.createSchema({operation:"create_schema",schema:l})),!d&&_){Dg.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let m=new hoe(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(m.attributes=n[l][c].attributes),await rG.createTable(m)}await Pg.createLocalTableStream(l,c);let h=new iG(l,c,o.publish,o.subscribe);h.start_time=o.start_time,i.push(h)}return{added:i,skipped:s}}a(Eoe,"reviewSubscriptions")});var hl={};Ue(hl,{addNodeBack:()=>Roe,removeNodeBack:()=>yoe,setNode:()=>Aoe});async function Aoe(e){e.node_name&&!e.hostname&&(e.hostname=e.node_name),e.verify_tls!==void 0&&(e.rejectUnauthorized=e.verify_tls);let{url:t,hostname:r}=e;t?r||(r=e.hostname=Js(t)):t=Tg(r);let n=(0,cG.validateBySchema)(e,Toe);if(n)throw(0,wo.handleHDBError)(n,n.message,Soe.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new wo.ClientError("url or hostname is required for remove_node operation");let h=r,m=ir(),S=await m.get(h);if(!S)throw new wo.ClientError(h+" does not exist");try{await sh({url:S.url},{operation:Wt.REMOVE_NODE_BACK,name:S?.subscriptions?.length>0?et():h},void 0)}catch(g){Xn.warn(`Error removing node from target node ${h}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,g)}return await m.delete(h),`Successfully removed '${h}' from cluster`}if(!t)throw new wo.ClientError("url required for this operation");let s=Aa();if(s==null)throw new wo.ClientError("replication url is missing from harperdb-config.yaml");let i,o,c;if(t?.startsWith("wss:")){i=await(0,Ts.getReplicationCert)();let h=await(0,Ts.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(o=await(0,Ts.createCsr)(),Xn.info("Sending CSR to target node:",t)):h&&(c=h.certificate,Xn.info("Sending CA named",h.name,"to target node",t))}let l={operation:Wt.ADD_NODE_BACK,hostname:(0,va.get)(x.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:o,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,va.get)(x.REPLICATION_SHARD)!==void 0&&(l.shard=(0,va.get)(x.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(aG):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let h=aG(e);l.subscribe=h.subscribe,l.publish=h.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,f;try{u=await sh({url:t},l,e)}catch(h){h.message=`Error returned from ${t}: `+h.message,Xn.warn("Error adding node:",t,"to cluster:",h),f=h}if(o&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw f?(f.message+=" and connection was required to sign certificate",f):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);o&&(Xn.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Ts.setCertTable)({name:goe.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Ts.setCertTable)({name:et(),uses:["https","operations","wss"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let d={url:t,ca:u?.usingCA};if(e.hostname&&(d.name=e.hostname),e.subscriptions?d.subscriptions=e.subscriptions:d.replicates=!0,e.start_time&&(d.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(d.authorization=e.authorization),e.revoked_certificates&&(d.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?d.shard=u.shard:e.shard!==void 0&&(d.shard=e.shard),d.replicates){let h={url:s,ca:c,replicates:!0,subscriptions:null};(0,va.get)(x.REPLICATION_SHARD)!==void 0&&(h.shard=(0,va.get)(x.REPLICATION_SHARD)),e.retain_authorization&&(h.authorization=e.authorization),e.start_time&&(h.start_time=e.start_time),await Ro(et(),h)}await Ro(u?u.nodeName:d.name??Js(t),d);let _;return e.operation==="update_node"?_=`Successfully updated '${t}'`:_=`Successfully added '${t}' to cluster`,f&&(_+=" but there was an error updating target node: "+f.message),_}async function Roe(e){Xn.trace("addNodeBack received request:",e);let t=await(0,Ts.signCertificate)(e),r;e.csr?(r=t.signingCA,Xn.info("addNodeBack received CSR from node:",e.url,"this node will use and respond with CA that was used to issue CSR")):(r=e?.cert_auth,Xn.info("addNodeBack received CA from node:",e.url));let n={url:e.url,ca:r};e.subscriptions?n.subscriptions=e.subscriptions:(n.replicates=!0,n.subscriptions=null),e.start_time&&(n.start_time=e.start_time),e.authorization&&(n.authorization=e.authorization),e.shard!==void 0&&(n.shard=e.shard);let s=await(0,Ts.getReplicationCertAuth)();if(n.replicates){let i={url:Aa(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,va.get)(x.REPLICATION_SHARD)!==void 0&&(i.shard=(0,va.get)(x.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Ro(et(),i)}return await Ro(e.hostname,n),t.nodeName=et(),t.usingCA=s?.certificate,Xn.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function yoe(e){Xn.trace("removeNodeBack received request:",e),await ir().delete(e.name)}function aG(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Ts,cG,Ma,va,Xn,wo,goe,Soe,Toe,ml=Re(()=>{Ts=M(ei()),cG=M(it()),Ma=M(require("joi")),va=M(le());k();X_();sl();Es();Xn=M(ee()),wo=M(he()),{pki:goe}=require("node-forge"),{HTTP_STATUS_CODES:Soe}=wo.hdb_errors,Toe=Ma.default.object({hostname:Ma.default.string(),verify_tls:Ma.default.boolean(),replicates:Ma.default.boolean(),subscriptions:Ma.default.array(),revoked_certificates:Ma.default.array(),shard:Ma.default.number()});a(Aoe,"setNode");a(Roe,"addNodeBack");a(yoe,"removeNodeBack");a(aG,"reverseSubscription")});var fh=C((aPe,uG)=>{"use strict";var{handleHDBError:Lg,hdb_errors:boe}=he(),{HTTP_STATUS_CODES:Mg}=boe,{addUpdateNodeValidator:Ooe}=Ig(),vg=ee(),Ug=(k(),P(q)),lG=Lt(),Noe=ie(),uh=gr(),dh=ki(),gN=le(),woe=EN(),{Node:Ioe,NodeSubscription:Coe}=Zu(),{broadcast:Poe}=ot(),{setNode:Doe}=(ml(),P(hl)),iPe=le(),oPe=(k(),P(q)),Loe="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Moe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",voe=gN.get(Ug.CONFIG_PARAMS.CLUSTERING_NODENAME);uG.exports=Uoe;async function Uoe(e,t=!1){if(vg.trace("addNode called with:",e),gN.get(Ug.CONFIG_PARAMS.REPLICATION_URL)||gN.get(Ug.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Doe(e);dh.checkClusteringEnabled();let r=Ooe(e);if(r)throw Lg(r,r.message,Mg.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let d=await dh.getNodeRecord(n);if(!Noe.isEmptyOrZeroLength(d))throw Lg(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,Mg.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await woe(e.subscriptions,n),o={message:void 0,added:s,skipped:i};if(s.length===0)return o.message=Loe,o;let c=dh.buildNodePayloads(s,voe,Ug.OPERATIONS_ENUM.ADD_NODE,await dh.getSystemInfo()),l=[];for(let d=0,_=s.length;d<_;d++){let h=s[d];s[d].start_time===void 0&&delete s[d].start_time,l.push(new Coe(h.schema,h.table,h.publish,h.subscribe))}vg.trace("addNode sending remote payload:",c);let u;try{u=await uh.request(`${n}.${lG.REQUEST_SUFFIX}`,c)}catch(d){vg.error(`addNode received error from request: ${d}`);for(let h=0,m=s.length;h<m;h++){let S=s[h];S.publish=!1,S.subscribe=!1,await uh.updateRemoteConsumer(S,n)}let _=uh.requestErrorHandler(d,"add_node",n);throw Lg(new Error,_,Mg.INTERNAL_SERVER_ERROR,"error",_)}if(u.status===lG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${n}: ${u.message}`;throw Lg(new Error,d,Mg.INTERNAL_SERVER_ERROR,"error",d)}vg.trace(u);for(let d=0,_=s.length;d<_;d++){let h=s[d];await uh.updateRemoteConsumer(h,n),h.subscribe===!0&&await uh.updateConsumerIterator(h.schema,h.table,n,"start")}let f=new Ioe(n,l,u.system_info);return await dh.upsertNodeRecord(f),Poe({type:"nats_update"}),i.length>0?o.message=Moe:o.message=`Successfully added '${n}' to manifest`,o}a(Uoe,"addNode")});var RN=C((uPe,fG)=>{"use strict";var{handleHDBError:SN,hdb_errors:xoe}=he(),{HTTP_STATUS_CODES:TN}=xoe,{addUpdateNodeValidator:Boe}=Ig(),_h=ee(),xg=(k(),P(q)),dG=Lt(),lPe=ie(),hh=gr(),mh=ki(),AN=le(),{cloneDeep:Hoe}=require("lodash"),koe=EN(),{Node:Foe,NodeSubscription:Goe}=Zu(),{broadcast:qoe}=ot(),{setNode:$oe}=(ml(),P(hl)),Voe="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",Koe="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Yoe=AN.get(xg.CONFIG_PARAMS.CLUSTERING_NODENAME);fG.exports=Woe;async function Woe(e){if(_h.trace("updateNode called with:",e),AN.get(xg.CONFIG_PARAMS.REPLICATION_URL)??AN.get(xg.CONFIG_PARAMS.REPLICATION_HOSTNAME))return $oe(e);mh.checkClusteringEnabled();let t=Boe(e);if(t)throw SN(t,t.message,TN.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await mh.getNodeRecord(r);s.length>0&&(n=Hoe(s));let{added:i,skipped:o}=await koe(e.subscriptions,r),c={message:void 0,updated:i,skipped:o};if(i.length===0)return c.message=Voe,c;let l=mh.buildNodePayloads(i,Yoe,xg.OPERATIONS_ENUM.UPDATE_NODE,await mh.getSystemInfo());for(let f=0,d=i.length;f<d;f++){let _=i[f];_h.trace(`updateNode updating work stream for node: ${r} subscription:`,_),i[f].start_time===void 0&&delete i[f].start_time}_h.trace("updateNode sending remote payload:",l);let u;try{u=await hh.request(`${r}.${dG.REQUEST_SUFFIX}`,l)}catch(f){_h.error(`updateNode received error from request: ${f}`);let d=hh.requestErrorHandler(f,"update_node",r);throw SN(new Error,d,TN.INTERNAL_SERVER_ERROR,"error",d)}if(u.status===dG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${r}: ${u.message}`;throw SN(new Error,f,TN.INTERNAL_SERVER_ERROR,"error",f)}_h.trace(u);for(let f=0,d=i.length;f<d;f++){let _=i[f];await hh.updateRemoteConsumer(_,r),_.subscribe===!0?await hh.updateConsumerIterator(_.schema,_.table,r,"start"):await hh.updateConsumerIterator(_.schema,_.table,r,"stop")}return n||(n=[new Foe(r,[],u.system_info)]),await zoe(n[0],i,u.system_info),o.length>0?c.message=Koe:c.message=`Successfully updated '${r}'`,c}a(Woe,"updateNode");async function zoe(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let o=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let f=n.subscriptions[l];if(f.schema===o.schema&&f.table===o.table){f.publish=o.publish,f.subscribe=o.subscribe,c=!0;break}}c||n.subscriptions.push(new Goe(o.schema,o.table,o.publish,o.subscribe))}n.system_info=r,await mh.upsertNodeRecord(n),qoe({type:"nats_update"})}a(zoe,"updateNodeTable")});var EG=C((fPe,pG)=>{"use strict";var mG=require("joi"),{string:_G}=mG.types(),Qoe=it(),hG=(k(),P(q)),joe=le(),Joe=Lt();pG.exports=Xoe;function Xoe(e){let t=_G.invalid(joe.get(hG.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(Joe.NATS_TERM_CONSTRAINTS_RX).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >","any.invalid":"'node_name' cannot be this nodes name"}).empty(null),r=mG.object({operation:_G.valid(hG.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return Qoe.validateBySchema(e,r)}a(Xoe,"removeNodeValidator")});var Eh=C((hPe,RG)=>{"use strict";var{handleHDBError:gG,hdb_errors:Zoe}=he(),{HTTP_STATUS_CODES:SG}=Zoe,eae=EG(),ph=ee(),TG=ki(),tae=ie(),rd=(k(),P(q)),AG=Lt(),yN=gr(),bN=le(),{RemotePayloadObject:rae}=ch(),{NodeSubscription:nae}=Zu(),sae=T_(),iae=qc(),{broadcast:oae}=ot(),{setNode:aae}=(ml(),P(hl)),cae=bN.get(rd.CONFIG_PARAMS.CLUSTERING_NODENAME);RG.exports=lae;async function lae(e){if(ph.trace("removeNode called with:",e),bN.get(rd.CONFIG_PARAMS.REPLICATION_URL)??bN.get(rd.CONFIG_PARAMS.REPLICATION_HOSTNAME))return aae(e);TG.checkClusteringEnabled();let t=eae(e);if(t)throw gG(t,t.message,SG.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await TG.getNodeRecord(r);if(tae.isEmptyOrZeroLength(n))throw gG(new Error,`Node '${r}' was not found.`,SG.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new rae(rd.OPERATIONS_ENUM.REMOVE_NODE,cae,[]),i,o=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let f=n.subscriptions[l];f.subscribe===!0&&await yN.updateConsumerIterator(f.schema,f.table,r,"stop");try{await yN.updateRemoteConsumer(new nae(f.schema,f.table,!1,!1),r)}catch(d){ph.error(d)}}try{i=await yN.request(`${r}.${AG.REQUEST_SUFFIX}`,s),ph.trace("Remove node reply from remote node:",r,i)}catch(l){ph.error("removeNode received error from request:",l),o=!0}let c=new sae(rd.SYSTEM_SCHEMA_NAME,rd.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await iae.deleteRecord(c),oae({type:"nats_update"}),i?.status===AG.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||o?(ph.error("Error returned from remote node:",r,i?.message),`Successfully removed '${r}' from local manifest, however there was an error reaching remote node. Check the logs for more details.`):`Successfully removed '${r}' from manifest`}a(lae,"removeNode")});var OG=C((pPe,bG)=>{"use strict";var yG=require("joi"),{string:uae,array:dae}=yG.types(),fae=it(),_ae=Ig();bG.exports=hae;function hae(e){let t=yG.object({operation:uae.valid("configure_cluster").required(),connections:dae.items(_ae.validation_schema).required()});return fae.validateBySchema(e,t)}a(hae,"configureClusterValidator")});var ON=C((gPe,PG)=>{"use strict";var NG=(k(),P(q)),Bg=ee(),mae=ie(),pae=le(),Eae=Eh(),gae=fh(),Sae=ki(),Tae=OG(),{handleHDBError:wG,hdb_errors:Aae}=he(),{HTTP_STATUS_CODES:IG}=Aae,Rae="Configure cluster complete.",yae="Failed to configure the cluster. Check the logs for more details.",bae="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";PG.exports=Oae;async function Oae(e){Bg.trace("configure cluster called with:",e);let t=Tae(e);if(t)throw wG(t,t.message,IG.BAD_REQUEST,void 0,void 0,!0);let r=await Sae.getAllNodeRecords(),n=[];if(pae.get(NG.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let f=0,d=r.length;f<d;f++){let _=await CG(Eae,{operation:NG.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[f].name},r[f].name);n.push(_)}Bg.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let f=0;f<i;f++){let d=e.connections[f],_=await CG(gae,d,d.node_name);s.push(_)}Bg.trace("All results from configure_cluster add node:",s);let o=[],c=[],l=!1,u=n.concat(s);for(let f=0,d=u.length;f<d;f++){let _=u[f];_.status==="rejected"&&(Bg.error(_.node_name,_?.error?.message,_?.error?.stack),o.includes(_.node_name)||o.push(_.node_name)),(_?.result?.message?.includes?.("Successfully")||_?.result?.includes?.("Successfully"))&&(l=!0),!(typeof _.result=="string"&&_.result.includes("Successfully removed")||_.status==="rejected")&&c.push({node_name:_?.node_name,response:_?.result})}if(mae.isEmptyOrZeroLength(o))return{message:Rae,connections:c};if(l)return{message:bae,failed_nodes:o,connections:c};throw wG(new Error,yae,IG.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}a(Oae,"configureCluster");async function CG(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}a(CG,"functionWrapper")});var vG=C((TPe,MG)=>{"use strict";var gh=require("joi"),Nae=it(),{validateSchemaExists:DG,validateTableExists:wae,validateSchemaName:LG}=Ni(),Iae=gh.object({operation:gh.string().valid("purge_stream"),schema:gh.string().custom(DG).custom(LG).optional(),database:gh.string().custom(DG).custom(LG).optional(),table:gh.string().custom(wae).required()});function Cae(e){return Nae.validateBySchema(e,Iae)}a(Cae,"purgeStreamValidator");MG.exports=Cae});var NN=C((RPe,UG)=>{"use strict";var{handleHDBError:Pae,hdb_errors:Dae}=he(),{HTTP_STATUS_CODES:Lae}=Dae,Mae=vG(),vae=gr(),Uae=ki();UG.exports=xae;async function xae(e){e.schema=e.schema??e.database;let t=Mae(e);if(t)throw Pae(t,t.message,Lae.BAD_REQUEST,void 0,void 0,!0);Uae.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await vae.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}a(xae,"purgeStream")});var Fg=C((bPe,qG)=>{"use strict";var IN=ki(),Bae=gr(),kg=le(),nd=(k(),P(q)),pl=Lt(),Hae=ie(),wN=ee(),{RemotePayloadObject:kae}=ch(),{ErrorCode:xG}=require("nats"),{parentPort:BG}=require("worker_threads"),{onMessageByType:Fae}=ot(),{getThisNodeName:Gae}=(Es(),P(Na)),{requestClusterStatus:qae}=(X_(),P(ik)),{getReplicationSharedStatus:$ae,getHDBNodeTable:Vae}=(sl(),P(pO)),{CONFIRMATION_STATUS_POSITION:Kae,RECEIVED_VERSION_POSITION:Yae,RECEIVED_TIME_POSITION:Wae,SENDING_TIME_POSITION:zae,RECEIVING_STATUS_POSITION:Qae,RECEIVING_STATUS_RECEIVING:jae}=(GO(),P(jk)),HG=kg.get(nd.CONFIG_PARAMS.CLUSTERING_ENABLED),kG=kg.get(nd.CONFIG_PARAMS.CLUSTERING_NODENAME);qG.exports={clusterStatus:Jae,buildNodeStatus:GG};var FG;Fae("cluster-status",async e=>{FG(e)});async function Jae(){if(kg.get(nd.CONFIG_PARAMS.REPLICATION_URL)||kg.get(nd.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(BG){BG.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{FG=i});for(let i of n.connections){let o=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let d of Object.values(databases[l]||{}))if(u=d.auditStore,u)break;if(!u)continue;let f=$ae(u,l,o);c.lastCommitConfirmed=Hg(f[Kae]),c.lastReceivedRemoteTime=Hg(f[Yae]),c.lastReceivedLocalTime=Hg(f[Wae]),c.sendingMessage=Hg(f[zae]),c.lastReceivedStatus=f[Qae]===jae?"Receiving":"Waiting"}}}else n=qae();n.node_name=Gae();let s=Vae().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:kG,is_enabled:HG,connections:[]};if(!HG)return e;let t=await IN.getAllNodeRecords();if(Hae.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(GG(t[n],e.connections));return await Promise.allSettled(r),e}a(Jae,"clusterStatus");function Hg(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}a(Hg,"asDate");async function GG(e,t){let r=e.name,n=new kae(nd.OPERATIONS_ENUM.CLUSTER_STATUS,kG,void 0,await IN.getSystemInfo()),s,i,o=pl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Bae.request(pl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===pl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(o=pl.CLUSTER_STATUS_STATUSES.CLOSED,wN.error(`Error getting node status from ${r} `,s))}catch(l){wN.warn(`Error getting node status from ${r}`,l),l.code===xG.NoResponders?o=pl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===xG.Timeout?o=pl.CLUSTER_STATUS_STATUSES.TIMEOUT:o=pl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new Xae(r,o,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==nd.PRE_4_0_0_VERSION&&await IN.upsertNodeRecord(l)}catch(l){wN.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}a(GG,"buildNodeStatus");function Xae(e,t,r,n,s,i,o,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=o,this.system_info=c}a(Xae,"NodeStatusObject")});var PN=C((NPe,$G)=>{"use strict";var{handleHDBError:Zae,hdb_errors:ece}=he(),{HTTP_STATUS_CODES:tce}=ece,rce=gr(),nce=ki(),CN=ie(),Gg=require("joi"),sce=it(),ice=2e3,oce=Gg.object({timeout:Gg.number().min(1),connected_nodes:Gg.boolean(),routes:Gg.boolean()});$G.exports=ace;async function ace(e){nce.checkClusteringEnabled();let t=sce.validateBySchema(e,oce);if(t)throw Zae(t,t.message,tce.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||CN.autoCastBoolean(n),o=s===void 0||CN.autoCastBoolean(s),c={nodes:[]},l=await rce.getServerList(r??ice),u={};if(i)for(let f=0,d=l.length;f<d;f++){let _=l[f].statsz;_&&(u[l[f].server.name]=_.routes)}for(let f=0,d=l.length;f<d;f++){if(l[f].statsz)continue;let _=l[f].server,h=l[f].data;if(_.name.endsWith("-hub")){let m={name:_.name.slice(0,-4),response_time:l[f].response_time};i&&(m.connected_nodes=[],u[_.name]&&u[_.name].forEach(S=>{m.connected_nodes.includes(S.name.slice(0,-4))||m.connected_nodes.push(S.name.slice(0,-4))})),o&&(m.routes=h.cluster?.urls?h.cluster?.urls.map(S=>({host:S.split(":")[0],port:CN.autoCast(S.split(":")[1])})):[]),c.nodes.push(m)}}return c}a(ace,"clusterNetwork")});var WG=C((IPe,YG)=>{"use strict";var DN=require("joi"),VG=it(),{route_constraints:KG}=wA();YG.exports={setRoutesValidator:cce,deleteRoutesValidator:lce};function cce(e){let t=DN.object({server:DN.valid("hub","leaf"),routes:KG.required()});return VG.validateBySchema(e,t)}a(cce,"setRoutesValidator");function lce(e){let t=DN.object({routes:KG.required()});return VG.validateBySchema(e,t)}a(lce,"deleteRoutesValidator")});var qg=C((PPe,eq)=>{"use strict";var Io=Ct(),LN=ie(),As=(k(),P(q)),sd=le(),zG=WG(),{handleHDBError:QG,hdb_errors:uce}=he(),{HTTP_STATUS_CODES:jG}=uce,JG="cluster routes successfully set",XG="cluster routes successfully deleted";eq.exports={setRoutes:fce,getRoutes:_ce,deleteRoutes:hce};function dce(e){let t=Io.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let o=0,c=e.routes.length;o<c;o++){let l=e.routes[o];l.port=LN.autoCast(l.port);let u=r.some(d=>d.host===l.host&&d.port===l.port),f=n.some(d=>d.host===l.host&&d.port===l.port);u||f?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?Io.updateConfigValue(As.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):Io.updateConfigValue(As.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:JG,set:i,skipped:s}}a(dce,"setRoutesNats");function fce(e){let t=zG.setRoutesValidator(e);if(t)throw QG(t,t.message,jG.BAD_REQUEST,void 0,void 0,!0);if(sd.get(As.CONFIG_PARAMS.CLUSTERING_ENABLED))return dce(e);let r=[],n=[],s=sd.get(As.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{ZG(s,i)?n.push(i):(s.push(i),r.push(i))}),Io.updateConfigValue(As.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:JG,set:r,skipped:n}}a(fce,"setRoutes");function ZG(e,t){return typeof t=="string"?e.includes(t):typeof t=="object"&&t!==null?e.some(r=>(r.host===t.host||r.hostname===t.hostname)&&r.port===t.port):!1}a(ZG,"existsInArray");function _ce(){if(sd.get(As.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=Io.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return sd.get(As.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}a(_ce,"getRoutes");function hce(e){let t=zG.deleteRoutesValidator(e);if(t)throw QG(t,t.message,jG.BAD_REQUEST,void 0,void 0,!0);if(sd.get(As.CONFIG_PARAMS.CLUSTERING_ENABLED))return mce(e);let r=[],n=[],s=sd.get(As.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(o=>{ZG(e.routes,o)?r.push(o):(i.push(o),n.push(o))}),Io.updateConfigValue(As.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:XG,deleted:r,skipped:n}}a(hce,"deleteRoutes");function mce(e){let t=Io.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],o=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let f=e.routes[l],d=!1;for(let _=0,h=r.length;_<h;_++){let m=r[_];if(f.host===m.host&&f.port===m.port){r.splice(_,1),d=!0,o=!0,s.push(f);break}}if(!d){let _=!0;for(let h=0,m=n.length;h<m;h++){let S=n[h];if(f.host===S.host&&f.port===S.port){n.splice(h,1),c=!0,_=!1,s.push(f);break}}_&&i.push(f)}}return o&&(r=LN.isEmptyOrZeroLength(r)?null:r,Io.updateConfigValue(As.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=LN.isEmptyOrZeroLength(n)?null:n,Io.updateConfigValue(As.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:XG,deleted:s,skipped:i}}a(mce,"deleteRoutesNats")});var rq=C((LPe,tq)=>{"use strict";var Sh=require("alasql"),El=require("recursive-iterator"),ti=ee(),pce=ie(),Th=(k(),P(q)),MN=class{static{a(this,"sql_statement_bucket")}constructor(t){this.ast=t,this.affected_attributes=new Map,this.table_lookup=new Map,this.schema_lookup=new Map,this.table_to_schema_lookup=new Map,gce(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=>Th.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=>!Th.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,o=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[o]&&t[i].tables[o][Th.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[o].attribute_permissions.length>0?c=Ece(t[i].tables[o].attribute_permissions):c=global.hdb_schema[i][o].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(o).filter(u=>!Th.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let f=new Sh.yy.Column({columnid:u});s.tableid&&(f.tableid=s.tableid),this.ast.columns.push(f),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(o,l)}}),this.ast}};function Ece(e){return e.filter(t=>t[Th.PERMS_CRUD_ENUM.READ])}a(Ece,"filterReadRestrictedAttrs");function gce(e,t,r,n,s){Sce(e,t,r,n,s)}a(gce,"interpretAST");function Ah(e,t,r,n,s){if(!(!e||!e.databaseid)&&(t.has(e.databaseid)||t.set(e.databaseid,new Map),t.get(e.databaseid).has(e.tableid)||t.get(e.databaseid).set(e.tableid,[]),e.as&&(r.has(e.as)||r.set(e.as,e.tableid),n&&!n.has(e.as)&&n.set(e.as,e.databaseid)),s)){let i=e.databaseid,o=e.tableid;e.as&&(o=e.as),s.set(o,i)}}a(Ah,"addSchemaTableToMap");function Sce(e,t,r,n,s){if(!e){ti.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof Sh.yy.Insert?yce(e,t,r):e instanceof Sh.yy.Select?Tce(e,t,r,n,s):e instanceof Sh.yy.Update?Ace(e,t,r):e instanceof Sh.yy.Delete?Rce(e,t,r):ti.error("AST in getRecordAttributesAST() is not a valid SQL type.")}a(Sce,"getRecordAttributesAST");function Tce(e,t,r,n,s){if(!e){ti.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(pce.isEmptyOrZeroLength(i)){ti.error("No schema specified");return}e.from.forEach(c=>{Ah(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),Ah(c.table,t,r,n,s)});let o=new El(e.columns);for(let{node:c}of o)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{ti.info(`table specified as ${l} not found.`);return}t.get(u).get(l).indexOf(c.columnid)<0&&t.get(u).get(l).push(c.columnid)}if(e.where){let c=new El(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let f=u.tableid?u.tableid:l;if(!t.get(i).has(f))if(r.has(f))f=r.get(f);else{ti.info(`table specified as ${f} not found.`);continue}t.get(i).get(f).indexOf(u.columnid)<0&&t.get(i).get(f).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new El(c.on);for(let{node:u}of l)if(u&&u.columnid){let f=u.tableid,d=s.get(f);if(!t.get(d).has(f))if(r.has(f))f=r.get(f);else{ti.info(`table specified as ${f} not found.`);continue}t.get(d).get(f).indexOf(u.columnid)<0&&t.get(d).get(f).push(u.columnid)}}),e.order){let c=new El(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,f=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(f).has(u))if(r.has(u))u=r.get(u);else{ti.info(`table specified as ${u} not found.`);return}t.get(f).get(u).indexOf(l.columnid)<0&&t.get(f).get(u).push(l.columnid)}}}a(Tce,"getSelectAttributes");function Ace(e,t,r){if(!e){ti.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new El(e.columns),s=e.table.databaseid;Ah(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&vN(e.table.tableid,s,i.columnid,t,r)}a(Ace,"getUpdateAttributes");function Rce(e,t,r){if(!e){ti.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new El(e.where),s=e.table.databaseid;Ah(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&vN(e.table.tableid,s,i.columnid,t,r)}a(Rce,"getDeleteAttributes");function yce(e,t,r){if(!e){ti.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new El(e.columns),s=e.into.databaseid;Ah(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&vN(e.into.tableid,s,i.columnid,t,r)}a(yce,"getInsertAttributes");function vN(e,t,r,n,s){if(!n.get(t))return;let i=e;n.get(t).has(i)||(i=s.get(i)),n.get(t).get(i).push(r)}a(vN,"pushAttribute");tq.exports=MN});var sq=C((vPe,nq)=>{"use strict";var $g=(k(),P(q)),Vg=class{static{a(this,"BaseLicense")}constructor(t=0,r=$g.RAM_ALLOCATION_ENUM.DEFAULT,n=$g.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},UN=class extends Vg{static{a(this,"ExtendedLicense")}constructor(t=0,r=$g.RAM_ALLOCATION_ENUM.DEFAULT,n=$g.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};nq.exports={BaseLicense:Vg,ExtendedLicense:UN}});var ad=C((xPe,uq)=>{"use strict";var od=require("fs-extra"),Kg=(Qp(),P(zp)),oq=require("crypto"),bce=require("moment"),Oce=require("uuid").v4,Zr=ee(),BN=require("path"),Nce=ie(),gl=(k(),P(q)),{totalmem:iq}=require("os"),wce=sq().ExtendedLicense,id="invalid license key format",Ice="061183",Cce="mofi25",Pce="aes-256-cbc",Dce=16,Lce=32,aq=le(),{resolvePath:cq}=Ct();aq.initSync();var xN;uq.exports={validateLicense:lq,generateFingerPrint:vce,licenseSearch:FN,getLicense:Bce,checkMemoryLimit:Hce};function HN(){return BN.join(aq.getHdbBasePath(),gl.LICENSE_KEY_DIR_NAME,gl.LICENSE_FILE_NAME)}a(HN,"getLicenseDirPath");function Mce(){let e=HN();return cq(BN.join(e,gl.LICENSE_FILE_NAME))}a(Mce,"getLicenseFilePath");function kN(){let e=HN();return cq(BN.join(e,gl.REG_KEY_FILE_NAME))}a(kN,"getFingerPrintFilePath");async function vce(){let e=kN();try{return await od.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Uce();throw Zr.error(`Error writing fingerprint file to ${e}`),Zr.error(t),new Error("There was an error generating the fingerprint")}}a(vce,"generateFingerPrint");async function Uce(){let e=Oce(),t=Kg.hash(e,Kg.HASH_FUNCTION.MD5),r=kN();try{await od.mkdirp(HN()),await od.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw Zr.error(`Error writing fingerprint file to ${r}`),Zr.error(n),new Error("There was an error generating the fingerprint")}return t}a(Uce,"writeFingerprint");function lq(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 Zr.error("empty license key passed to validate."),r;let n=kN(),s=!1;try{s=od.statSync(n)}catch(i){Zr.error(i)}if(s){let i;try{i=od.readFileSync(n,"utf8")}catch{Zr.error("error validating this machine in the license"),r.valid_machine=!1;return}let o=e.split(Cce),c=o[1];c=Buffer.concat([Buffer.from(c)],Dce);let l=Buffer.concat([Buffer.from(i)],Lce),u=oq.createDecipheriv(Pce,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let f=null;try{f=u.update(o[0],"hex","utf8"),f.trim(),f+=u.final("utf8")}catch{let h=xce(o[0],i);if(h)f=h;else throw r.valid_license=!1,r.valid_machine=!1,console.error(id),Zr.error(id),new Error(id)}let d;if(isNaN(f))try{d=JSON.parse(f),r.version=d.version,r.exp_date=d.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),d.ram_allocation&&(r.ram_allocation=d.ram_allocation)}catch{throw console.error(id),Zr.error(id),new Error(id)}else r.exp_date=f;r.exp_date<bce().valueOf()&&(r.valid_date=!1),Kg.validate(o[1],`${Ice}${i}${t}`,Kg.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||Zr.error("Invalid licence"),r}a(lq,"validateLicense");function xce(e,t){try{let r=oq.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{Zr.warn("Check old license failed")}}a(xce,"checkOldLicense");function FN(){let e=new wce,t=[];try{t=od.readFileSync(Mce(),"utf-8").split(`\r
|
|
24
|
-
`)}catch(r){r.code==="ENOENT"?Zr.debug("no license file found"):Zr.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(Nce.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=lq(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){Zr.error("There was an error parsing the license string."),Zr.error(s),e.ram_allocation=gl.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return xN=e,e}a(FN,"licenseSearch");async function Bce(){return xN||await FN(),xN}a(Bce,"getLicense");function Hce(){let e=FN().ram_allocation,t=process.constrainedMemory?.()||iq();if(t=Math.round(Math.min(t,iq())/2**20),t>e)return`This server has more memory (${t}MB) than HarperDB is licensed for (${e}MB), this should only be used for educational and development purposes.`}a(Hce,"checkMemoryLimit")});var $N=C((HPe,hq)=>{var Yg=ad(),dq=require("chalk"),Zn=ee(),fq=require("prompt"),{promisify:kce}=require("util"),GN=(k(),P(q)),Fce=require("fs-extra"),Gce=require("path"),qce=ie(),{packageJson:$ce}=Et(),_q=le();_q.initSync();var Vce=require("moment"),Kce=kce(fq.get),Yce=Gce.join(_q.getHdbBasePath(),GN.LICENSE_KEY_DIR_NAME,GN.LICENSE_FILE_NAME,GN.LICENSE_FILE_NAME);hq.exports={getFingerprint:zce,setLicense:Wce,parseLicense:qN,register:Qce,getRegistrationInfo:Jce};async function Wce(e){if(e&&e.key&&e.company){try{Zn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await qN(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw Zn.error(r),Zn.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(Wce,"setLicense");async function zce(){let e={};try{e=await Yg.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw Zn.error(r),Zn.error(t),new Error(r)}return e}a(zce,"getFingerprint");async function qN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");Zn.info("Validating license input...");let r=Yg.validateLicense(e,t);if(Zn.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(Zn.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(Zn.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{Zn.info("writing license to disk"),await Fce.writeFile(Yce,JSON.stringify({license_key:e,company:t}))}catch(n){throw Zn.error("Failed to write License"),n}return"Registration successful."}a(qN,"parseLicense");async function Qce(){let e=await jce();return qN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Qce,"register");async function jce(){let e=await Yg.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:dq.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:dq.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{fq.start()}catch(n){Zn.error(n)}let r;try{r=await Kce(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(jce,"promptForRegistration");async function Jce(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await Yg.getLicense()}catch(r){throw Zn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(qce.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=$ce.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=Vce.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(Jce,"getRegistrationInfo")});var pq=C((FPe,mq)=>{"use strict";var Xce=Lt(),VN=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d,_,h,m){this.port=t,o===null&&(o=void 0),this.server_name=r+Xce.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c}},this.cluster={name:f,port:d,routes:_,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l}},this.accounts={SYS:{users:h},HDB:{users:m}},this.system_account="SYS"}};mq.exports=VN});var Sq=C((qPe,gq)=>{"use strict";var Eq=Lt(),KN=class{static{a(this,"LeafConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d){this.port=t,d===null&&(d=void 0),this.server_name=r+Eq.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+Eq.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:f,ca_file:d,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:d,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:d,insecure:!0},urls:o,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};gq.exports=KN});var Aq=C((VPe,Tq)=>{"use strict";var YN=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};Tq.exports=YN});var yq=C((YPe,Rq)=>{"use strict";var Zce=Lt(),WN=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+Zce.SERVER_SUFFIX.ADMIN,this.password=r}};Rq.exports=WN});var jg=C((zPe,Nq)=>{"use strict";var Sl=require("path"),Tl=require("fs-extra"),ele=pq(),tle=Sq(),rle=Aq(),nle=yq(),zN=Kn(),ld=ie(),On=Ct(),zg=(k(),P(q)),Rh=Lt(),{CONFIG_PARAMS:Jt}=zg,ud=ee(),yh=le(),bq=mo(),QN=gr(),sle=ei(),cd="clustering",ile=1e4,Oq=50;Nq.exports={generateNatsConfig:ale,removeNatsConfig:cle,getHubConfigPath:ole};function ole(){let e=yh.get(Jt.ROOTPATH);return Sl.join(e,cd,Rh.NATS_CONFIG_FILES.HUB_SERVER)}a(ole,"getHubConfigPath");async function ale(e=!1,t=void 0){let r=yh.get(Jt.ROOTPATH);Tl.ensureDirSync(Sl.join(r,"clustering","leaf")),yh.initSync();let n=On.getConfigFromFile(Jt.CLUSTERING_TLS_CERT_AUTH),s=On.getConfigFromFile(Jt.CLUSTERING_TLS_PRIVATEKEY),i=On.getConfigFromFile(Jt.CLUSTERING_TLS_CERTIFICATE);!await Tl.exists(i)&&!await Tl.exists(!n)&&await sle.createNatsCerts();let o=Sl.join(r,cd,Rh.PID_FILES.HUB),c=Sl.join(r,cd,Rh.PID_FILES.LEAF),l=On.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=Sl.join(r,cd,Rh.NATS_CONFIG_FILES.HUB_SERVER),f=Sl.join(r,cd,Rh.NATS_CONFIG_FILES.LEAF_SERVER),d=On.getConfigFromFile(Jt.CLUSTERING_TLS_INSECURE),_=On.getConfigFromFile(Jt.CLUSTERING_TLS_VERIFY),h=On.getConfigFromFile(Jt.CLUSTERING_NODENAME),m=On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await QN.checkNATSServerInstalled()||Qg("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await zN.listUsers(),g=On.getConfigFromFile(Jt.CLUSTERING_USER),R=await zN.getClusterUser();(ld.isEmpty(R)||R.active!==!0)&&Qg(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await Wg(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await Wg(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await Wg(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),await Wg(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[se,z]of S.entries())z.role?.role===zg.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(E.push(new nle(z.username,bq.decrypt(z.hash))),T.push(new rle(z.username,bq.decrypt(z.hash))));let N=[],{hub_routes:v}=On.getClusteringRoutes();if(!ld.isEmptyOrZeroLength(v))for(let se of v)N.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${se.host}:${se.port}`);let H=new ele(On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),h,o,i,s,n,d,_,m,On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NAME),On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete H.tls.ca_file,delete H.leafnodes.tls.ca_file),t=ld.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===zg.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Tl.writeJson(u,H),ud.trace(`Hub server config written to ${u}`));let X=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,W=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,$=new tle(On.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[X],[W],E,T,i,s,n,d);n==null&&delete $.tls.ca_file,(t===void 0||t===zg.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Tl.writeJson(f,$),ud.trace(`Leaf server config written to ${f}`))}a(ale,"generateNatsConfig");async function Wg(e){let t=yh.get(e);return ld.isEmpty(t)&&Qg(`port undefined for '${e}'`),await ld.isPortTaken(t)&&Qg(`'${e}' port '${t}' is is in use by another process, check to see if HarperDB is already running or another process is using this port.`),!0}a(Wg,"isPortAvailable");function Qg(e){let t=`Error generating clustering config: ${e}`;ud.error(t),console.error(t),process.exit(1)}a(Qg,"generateNatsConfigError");async function cle(e){let{port:t,config_file:r}=QN.getServerConfig(e),{username:n,decrypt_hash:s}=await zN.getClusterUser(),i=0,o=2e3;for(;i<Oq;){try{let f=await QN.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){ud.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=Oq)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=o*(i*2);u>3e4&&ud.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await ld.async_set_timeout(u)}let c="0".repeat(ile),l=Sl.join(yh.get(Jt.ROOTPATH),cd,r);await Tl.writeFile(l,c),await Tl.remove(l),ud.notify(e,"started.")}a(cle,"removeNatsConfig")});var Lq=C((jPe,Dq)=>{"use strict";var es=le(),lle=ad(),Ve=(k(),P(q)),bh=Lt(),Co=require("path"),{PACKAGE_ROOT:Xg}=Et(),wq=le(),Jg=ie(),dd="/dev/null",ule=Co.join(Xg,"launchServiceScripts"),Iq=Co.join(Xg,"utility/scripts"),dle=Co.join(Iq,Ve.HDB_RESTART_SCRIPT),Cq=Co.resolve(Xg,"dependencies",`${process.platform}-${process.arch}`,bh.NATS_BINARY_NAME);function Pq(){let t=lle.licenseSearch().ram_allocation||Ve.RAM_ALLOCATION_ENUM.DEFAULT,r=Ve.MEM_SETTING_KEY+t,n={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return Jg.noBootFile()&&(n[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Jg.getEnvCliRootPath()),{name:Ve.PROCESS_DESCRIPTORS.HDB,script:Ve.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:Xg}}a(Pq,"generateMainServerConfig");var fle=9930;function _le(){es.initSync(!0);let e=es.get(Ve.CONFIG_PARAMS.ROOTPATH),t=Co.join(e,"clustering",bh.NATS_CONFIG_FILES.HUB_SERVER),r=Co.join(es.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=wq.get(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=bh.LOG_LEVEL_FLAGS[es.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==fle?"-"+n:""),script:Cq,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=dd,i.error_file=dd),i}a(_le,"generateNatsHubServerConfig");var hle=9940;function mle(){es.initSync(!0);let e=es.get(Ve.CONFIG_PARAMS.ROOTPATH),t=Co.join(e,"clustering",bh.NATS_CONFIG_FILES.LEAF_SERVER),r=Co.join(es.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=wq.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=bh.LOG_LEVEL_FLAGS[es.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==hle?"-"+n:""),script:Cq,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=dd,i.error_file=dd),i}a(mle,"generateNatsLeafServerConfig");function ple(){es.initSync();let e=Co.join(es.get(Ve.CONFIG_PARAMS.LOGGING_ROOT),Ve.LOG_NAMES.HDB),t={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ve.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:ule,autorestart:!1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=dd,t.error_file=dd),t}a(ple,"generateClusteringUpgradeV4ServiceConfig");function Ele(){let e={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.RESTART_HDB};return Jg.noBootFile()&&(e[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Jg.getEnvCliRootPath()),{...{name:Ve.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:Iq},script:dle}}a(Ele,"generateRestart");function gle(){return{apps:[Pq()]}}a(gle,"generateAllServiceConfigs");Dq.exports={generateAllServiceConfigs:gle,generateMainServerConfig:Pq,generateRestart:Ele,generateNatsHubServerConfig:_le,generateNatsLeafServerConfig:mle,generateClusteringUpgradeV4ServiceConfig:ple}});var fd=C((ZPe,Yq)=>{"use strict";var tt=(k(),P(q)),Sle=ie(),Do=jg(),Zg=gr(),Po=Lt(),Ua=Lq(),eS=le(),Al=ee(),Tle=ki(),{startWorker:Mq,onMessageFromWorkers:Ale}=ot(),Rle=td(),XPe=require("util"),yle=require("child_process"),ble=require("fs"),{execFile:Ole}=yle,je;Yq.exports={enterPM2Mode:Nle,start:xa,stop:jN,reload:Uq,restart:xq,list:JN,describe:kq,connect:Lo,kill:Dle,startAllServices:Lle,startService:XN,getUniqueServicesList:Fq,restartAllServices:Mle,isServiceRegistered:Gq,reloadStopStart:qq,restartHdb:Hq,deleteProcess:Cle,startClusteringProcesses:Vq,startClusteringThreads:Kq,isHdbRestartRunning:Ple,isClusteringRunning:Ule,stopClustering:vle,reloadClustering:xle,expectedRestartOfChildren:Bq};var Oh=!1;Ale(e=>{e.type==="restart"&&eS.initSync(!0)});function Nle(){Oh=!0}a(Nle,"enterPM2Mode");function Lo(){return je||(je=require("pm2")),new Promise((e,t)=>{je.connect((r,n)=>{r&&t(r),e(n)})})}a(Lo,"connect");var en,wle=10,vq;function xa(e,t=!1){if(Oh)return Ile(e);let r=Ole(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=en.indexOf(r);o>-1&&en.splice(o,1),!vq&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<wle&&(ble.existsSync(Do.getHubConfigPath())?xa(e):(await Do.generateNatsConfig(!0),xa(e),await new Promise(c=>setTimeout(c,3e3)),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=eS.get(tt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&Po.LOG_LEVEL_HIERARCHY[o]>=Po.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===Po.LOG_LEVELS.ERR||f===Po.LOG_LEVELS.WRN?Al.OUTPUTS.STDERR:Al.OUTPUTS.STDOUT;Al.logCustomLevel(f||"info",h,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=Po.LOG_LEVELS[_]}if(Po.LOG_LEVEL_HIERARCHY[o]>=Po.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===Po.LOG_LEVELS.ERR||f===Po.LOG_LEVELS.WRN?Al.OUTPUTS.STDERR:Al.OUTPUTS.STDOUT;Al.logCustomLevel(f||"info",d,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!en&&(en=[],!t)){let i=a(()=>{vq=!0,en&&(en.map(o=>o.kill()),process.exit(0))},"kill_children");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}en.push(r)}a(xa,"start");function Ile(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.start(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(Ile,"startWithPM2");function jN(e){if(!Oh){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 Lo()}catch(n){r(n)}je.stop(e,async(n,s)=>{n&&(je.disconnect(),r(n)),je.delete(e,(i,o)=>{i&&(je.disconnect(),r(n)),je.disconnect(),t(o)})})})}a(jN,"stop");function Uq(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.reload(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(Uq,"reload");function xq(e){if(!Oh){Bq();for(let t of en||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.restart(e,(n,s)=>{je.disconnect(),t(s)})})}a(xq,"restart");function Bq(){for(let e of en||[])e.config&&(e.config.restarts=0)}a(Bq,"expectedRestartOfChildren");function Cle(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.delete(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(Cle,"deleteProcess");async function Hq(){await xa(Ua.generateRestart())}a(Hq,"restartHdb");async function Ple(){let e=await JN();for(let t in e)if(e[t].name===tt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(Ple,"isHdbRestartRunning");function JN(){return new Promise(async(e,t)=>{try{await Lo()}catch(r){t(r)}je.list((r,n)=>{r&&(je.disconnect(),t(r)),je.disconnect(),e(n)})})}a(JN,"list");function kq(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.describe(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(kq,"describe");function Dle(){if(!Oh){for(let e of en||[])e.kill();en=[];return}return new Promise(async(e,t)=>{try{await Lo()}catch(r){t(r)}je.killDaemon((r,n)=>{r&&(je.disconnect(),t(r)),je.disconnect(),e(n)})})}a(Dle,"kill");async function Lle(){try{await Vq(),await Kq(),await xa(Ua.generateAllServiceConfigs())}catch(e){throw je?.disconnect(),e}}a(Lle,"startAllServices");async function XN(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case tt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Ua.generateMainServerConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Ua.generateNatsIngestServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Ua.generateNatsReplyServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Ua.generateNatsHubServerConfig(),await xa(r,t),await Do.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Ua.generateNatsLeafServerConfig(),await xa(r,t),await Do.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Ua.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await xa(r)}catch(r){throw je?.disconnect(),r}}a(XN,"startService");async function Fq(){try{let e=await JN(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw je?.disconnect(),e}}a(Fq,"getUniqueServicesList");async function Mle(e=[]){try{let t=!1,r=await Fq();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===tt.PROCESS_DESCRIPTORS.HDB?t=!0:await xq(o))}t&&await qq(tt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw je?.disconnect(),t}}a(Mle,"restartAllServices");async function Gq(e){if(en?.find(r=>r.name===e))return!0;let t=await Rle.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(Gq,"isServiceRegistered");async function qq(e){let t=eS.get(tt.CONFIG_PARAMS.THREADS_COUNT)??eS.get(tt.CONFIG_PARAMS.THREADS),r=await kq(e),n=Sle.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await jN(e),await XN(e)):e===tt.PROCESS_DESCRIPTORS.HDB?await Hq():await Uq(e)}a(qq,"reloadStopStart");var $q;async function Vq(e=!1){for(let t in tt.CLUSTERING_PROCESSES){let r=tt.CLUSTERING_PROCESSES[t];await XN(r,e)}}a(Vq,"startClusteringProcesses");async function Kq(){$q=Mq(tt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await Zg.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await Zg.updateLocalStreams();let e=await Tle.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===tt.PRE_4_0_0_VERSION){Al.info("Starting clustering upgrade 4.0.0 process"),Mq(tt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(Kq,"startClusteringThreads");async function vle(){for(let e in tt.CLUSTERING_PROCESSES)if(e!==tt.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===tt.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await $q.terminate();else{let t=tt.CLUSTERING_PROCESSES[e];await jN(t)}}a(vle,"stopClustering");async function Ule(){for(let e in tt.CLUSTERING_PROCESSES){let t=tt.CLUSTERING_PROCESSES[e];if(await Gq(t)===!1)return!1}return!0}a(Ule,"isClusteringRunning");async function xle(){await Do.generateNatsConfig(!0),await Zg.reloadNATSHub(),await Zg.reloadNATSLeaf(),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(xle,"reloadClustering")});var tw={};Ue(tw,{compactOnStart:()=>Ble,copyDb:()=>Xq});async function Ble(){Ba.notify("Running compact on start"),console.log("Running compact on start");let e=(0,ZN.get)(x.ROOTPATH),t=new Map,r=Xe();(0,ew.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,tS.join)(e,"backup",n+".mdb"),o=(0,tS.join)(e,_c,n+"-copy.mdb"),c=0;try{c=await Wq(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){Ba.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{db_path:s,copy_dest:o,backup_dest:i,record_count:c}),await Xq(n,o),console.log("Backing up",n,"to",i),await(0,Rl.move)(s,i,{overwrite:!0})}try{hd()}catch(n){Ba.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}for(let[n,{db_path:s,copy_dest:i}]of t)console.log("Moving copy compacted",n,"to",s),await(0,Rl.move)(i,s,{overwrite:!0}),await(0,Rl.remove)((0,tS.join)(e,_c,`${n}-copy.mdb-lock`));try{hd()}catch(n){Ba.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){Ba.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,ew.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);for(let[s,{db_path:i,backup_dest:o}]of t){console.error("Moving backup database",o,"back to",i);try{await(0,Rl.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw hd(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await Wq(n);if(console.log("Database",n,"after compact has a total record count of",c),i!==c){o=!1;let l=`There is a discrepancy between pre and post compact record count for database ${n}.
|
|
25
|
-
Total record count before compaction: ${i}, total after: ${
|
|
26
|
-
Database backup has not been removed and can be found here: ${s}`;Ba.error(
|
|
24
|
+
`)}catch(r){r.code==="ENOENT"?Zr.debug("no license file found"):Zr.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(Nce.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=lq(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){Zr.error("There was an error parsing the license string."),Zr.error(s),e.ram_allocation=gl.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return xN=e,e}a(FN,"licenseSearch");async function Bce(){return xN||await FN(),xN}a(Bce,"getLicense");function Hce(){let e=FN().ram_allocation,t=process.constrainedMemory?.()||iq();if(t=Math.round(Math.min(t,iq())/2**20),t>e)return`This server has more memory (${t}MB) than HarperDB is licensed for (${e}MB), this should only be used for educational and development purposes.`}a(Hce,"checkMemoryLimit")});var $N=C((HPe,hq)=>{var Yg=ad(),dq=require("chalk"),Zn=ee(),fq=require("prompt"),{promisify:kce}=require("util"),GN=(k(),P(q)),Fce=require("fs-extra"),Gce=require("path"),qce=ie(),{packageJson:$ce}=Et(),_q=le();_q.initSync();var Vce=require("moment"),Kce=kce(fq.get),Yce=Gce.join(_q.getHdbBasePath(),GN.LICENSE_KEY_DIR_NAME,GN.LICENSE_FILE_NAME,GN.LICENSE_FILE_NAME);hq.exports={getFingerprint:zce,setLicense:Wce,parseLicense:qN,register:Qce,getRegistrationInfo:Jce};async function Wce(e){if(e&&e.key&&e.company){try{Zn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await qN(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw Zn.error(r),Zn.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(Wce,"setLicense");async function zce(){let e={};try{e=await Yg.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw Zn.error(r),Zn.error(t),new Error(r)}return e}a(zce,"getFingerprint");async function qN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");Zn.info("Validating license input...");let r=Yg.validateLicense(e,t);if(Zn.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(Zn.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(Zn.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{Zn.info("writing license to disk"),await Fce.writeFile(Yce,JSON.stringify({license_key:e,company:t}))}catch(n){throw Zn.error("Failed to write License"),n}return"Registration successful."}a(qN,"parseLicense");async function Qce(){let e=await jce();return qN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Qce,"register");async function jce(){let e=await Yg.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:dq.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:dq.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{fq.start()}catch(n){Zn.error(n)}let r;try{r=await Kce(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(jce,"promptForRegistration");async function Jce(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await Yg.getLicense()}catch(r){throw Zn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(qce.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=$ce.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=Vce.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(Jce,"getRegistrationInfo")});var pq=C((FPe,mq)=>{"use strict";var Xce=Lt(),VN=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d,_,h,m){this.port=t,o===null&&(o=void 0),this.server_name=r+Xce.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c}},this.cluster={name:f,port:d,routes:_,tls:{cert_file:s,key_file:i,ca_file:o,insecure:c,verify:l}},this.accounts={SYS:{users:h},HDB:{users:m}},this.system_account="SYS"}};mq.exports=VN});var Sq=C((qPe,gq)=>{"use strict";var Eq=Lt(),KN=class{static{a(this,"LeafConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d){this.port=t,d===null&&(d=void 0),this.server_name=r+Eq.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+Eq.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:f,ca_file:d,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:d,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:d,insecure:!0},urls:o,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};gq.exports=KN});var Aq=C((VPe,Tq)=>{"use strict";var YN=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};Tq.exports=YN});var yq=C((YPe,Rq)=>{"use strict";var Zce=Lt(),WN=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+Zce.SERVER_SUFFIX.ADMIN,this.password=r}};Rq.exports=WN});var jg=C((zPe,Nq)=>{"use strict";var Sl=require("path"),Tl=require("fs-extra"),ele=pq(),tle=Sq(),rle=Aq(),nle=yq(),zN=Kn(),ld=ie(),On=Ct(),zg=(k(),P(q)),Rh=Lt(),{CONFIG_PARAMS:Jt}=zg,ud=ee(),yh=le(),bq=mo(),QN=gr(),sle=ei(),cd="clustering",ile=1e4,Oq=50;Nq.exports={generateNatsConfig:ale,removeNatsConfig:cle,getHubConfigPath:ole};function ole(){let e=yh.get(Jt.ROOTPATH);return Sl.join(e,cd,Rh.NATS_CONFIG_FILES.HUB_SERVER)}a(ole,"getHubConfigPath");async function ale(e=!1,t=void 0){let r=yh.get(Jt.ROOTPATH);Tl.ensureDirSync(Sl.join(r,"clustering","leaf")),yh.initSync();let n=On.getConfigFromFile(Jt.CLUSTERING_TLS_CERT_AUTH),s=On.getConfigFromFile(Jt.CLUSTERING_TLS_PRIVATEKEY),i=On.getConfigFromFile(Jt.CLUSTERING_TLS_CERTIFICATE);!await Tl.exists(i)&&!await Tl.exists(!n)&&await sle.createNatsCerts();let o=Sl.join(r,cd,Rh.PID_FILES.HUB),c=Sl.join(r,cd,Rh.PID_FILES.LEAF),l=On.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=Sl.join(r,cd,Rh.NATS_CONFIG_FILES.HUB_SERVER),f=Sl.join(r,cd,Rh.NATS_CONFIG_FILES.LEAF_SERVER),d=On.getConfigFromFile(Jt.CLUSTERING_TLS_INSECURE),_=On.getConfigFromFile(Jt.CLUSTERING_TLS_VERIFY),h=On.getConfigFromFile(Jt.CLUSTERING_NODENAME),m=On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await QN.checkNATSServerInstalled()||Qg("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await zN.listUsers(),g=On.getConfigFromFile(Jt.CLUSTERING_USER),R=await zN.getClusterUser();(ld.isEmpty(R)||R.active!==!0)&&Qg(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await Wg(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await Wg(Jt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await Wg(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),await Wg(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[se,z]of S.entries())z.role?.role===zg.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(E.push(new nle(z.username,bq.decrypt(z.hash))),T.push(new rle(z.username,bq.decrypt(z.hash))));let N=[],{hub_routes:v}=On.getClusteringRoutes();if(!ld.isEmptyOrZeroLength(v))for(let se of v)N.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${se.host}:${se.port}`);let H=new ele(On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_NETWORK_PORT),h,o,i,s,n,d,_,m,On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NAME),On.getConfigFromFile(Jt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete H.tls.ca_file,delete H.leafnodes.tls.ca_file),t=ld.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===zg.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Tl.writeJson(u,H),ud.trace(`Hub server config written to ${u}`));let X=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,W=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,$=new tle(On.getConfigFromFile(Jt.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[X],[W],E,T,i,s,n,d);n==null&&delete $.tls.ca_file,(t===void 0||t===zg.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Tl.writeJson(f,$),ud.trace(`Leaf server config written to ${f}`))}a(ale,"generateNatsConfig");async function Wg(e){let t=yh.get(e);return ld.isEmpty(t)&&Qg(`port undefined for '${e}'`),await ld.isPortTaken(t)&&Qg(`'${e}' port '${t}' is is in use by another process, check to see if HarperDB is already running or another process is using this port.`),!0}a(Wg,"isPortAvailable");function Qg(e){let t=`Error generating clustering config: ${e}`;ud.error(t),console.error(t),process.exit(1)}a(Qg,"generateNatsConfigError");async function cle(e){let{port:t,config_file:r}=QN.getServerConfig(e),{username:n,decrypt_hash:s}=await zN.getClusterUser(),i=0,o=2e3;for(;i<Oq;){try{let f=await QN.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){ud.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=Oq)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=o*(i*2);u>3e4&&ud.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await ld.async_set_timeout(u)}let c="0".repeat(ile),l=Sl.join(yh.get(Jt.ROOTPATH),cd,r);await Tl.writeFile(l,c),await Tl.remove(l),ud.notify(e,"started.")}a(cle,"removeNatsConfig")});var Lq=C((jPe,Dq)=>{"use strict";var es=le(),lle=ad(),Ve=(k(),P(q)),bh=Lt(),Co=require("path"),{PACKAGE_ROOT:Xg}=Et(),wq=le(),Jg=ie(),dd="/dev/null",ule=Co.join(Xg,"launchServiceScripts"),Iq=Co.join(Xg,"utility/scripts"),dle=Co.join(Iq,Ve.HDB_RESTART_SCRIPT),Cq=Co.resolve(Xg,"dependencies",`${process.platform}-${process.arch}`,bh.NATS_BINARY_NAME);function Pq(){let t=lle.licenseSearch().ram_allocation||Ve.RAM_ALLOCATION_ENUM.DEFAULT,r=Ve.MEM_SETTING_KEY+t,n={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return Jg.noBootFile()&&(n[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Jg.getEnvCliRootPath()),{name:Ve.PROCESS_DESCRIPTORS.HDB,script:Ve.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:Xg}}a(Pq,"generateMainServerConfig");var fle=9930;function _le(){es.initSync(!0);let e=es.get(Ve.CONFIG_PARAMS.ROOTPATH),t=Co.join(e,"clustering",bh.NATS_CONFIG_FILES.HUB_SERVER),r=Co.join(es.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=wq.get(Ve.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=bh.LOG_LEVEL_FLAGS[es.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==fle?"-"+n:""),script:Cq,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=dd,i.error_file=dd),i}a(_le,"generateNatsHubServerConfig");var hle=9940;function mle(){es.initSync(!0);let e=es.get(Ve.CONFIG_PARAMS.ROOTPATH),t=Co.join(e,"clustering",bh.NATS_CONFIG_FILES.LEAF_SERVER),r=Co.join(es.get(Ve.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ve.LOG_NAMES.HDB),n=wq.get(Ve.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=bh.LOG_LEVEL_FLAGS[es.get(Ve.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==hle?"-"+n:""),script:Cq,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=dd,i.error_file=dd),i}a(mle,"generateNatsLeafServerConfig");function ple(){es.initSync();let e=Co.join(es.get(Ve.CONFIG_PARAMS.LOGGING_ROOT),Ve.LOG_NAMES.HDB),t={name:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ve.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:ule,autorestart:!1};return es.get(Ve.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=dd,t.error_file=dd),t}a(ple,"generateClusteringUpgradeV4ServiceConfig");function Ele(){let e={[Ve.PROCESS_NAME_ENV_PROP]:Ve.PROCESS_DESCRIPTORS.RESTART_HDB};return Jg.noBootFile()&&(e[Ve.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Jg.getEnvCliRootPath()),{...{name:Ve.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:Iq},script:dle}}a(Ele,"generateRestart");function gle(){return{apps:[Pq()]}}a(gle,"generateAllServiceConfigs");Dq.exports={generateAllServiceConfigs:gle,generateMainServerConfig:Pq,generateRestart:Ele,generateNatsHubServerConfig:_le,generateNatsLeafServerConfig:mle,generateClusteringUpgradeV4ServiceConfig:ple}});var fd=C((ZPe,Yq)=>{"use strict";var tt=(k(),P(q)),Sle=ie(),Do=jg(),Zg=gr(),Po=Lt(),Ua=Lq(),eS=le(),Al=ee(),Tle=ki(),{startWorker:Mq,onMessageFromWorkers:Ale}=ot(),Rle=td(),XPe=require("util"),yle=require("child_process"),ble=require("fs"),{execFile:Ole}=yle,je;Yq.exports={enterPM2Mode:Nle,start:xa,stop:jN,reload:Uq,restart:xq,list:JN,describe:kq,connect:Lo,kill:Dle,startAllServices:Lle,startService:XN,getUniqueServicesList:Fq,restartAllServices:Mle,isServiceRegistered:Gq,reloadStopStart:qq,restartHdb:Hq,deleteProcess:Cle,startClusteringProcesses:Vq,startClusteringThreads:Kq,isHdbRestartRunning:Ple,isClusteringRunning:Ule,stopClustering:vle,reloadClustering:xle,expectedRestartOfChildren:Bq};var Oh=!1;Ale(e=>{e.type==="restart"&&eS.initSync(!0)});function Nle(){Oh=!0}a(Nle,"enterPM2Mode");function Lo(){return je||(je=require("pm2")),new Promise((e,t)=>{je.connect((r,n)=>{r&&t(r),e(n)})})}a(Lo,"connect");var en,wle=10,vq;function xa(e,t=!1){if(Oh)return Ile(e);let r=Ole(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=en.indexOf(r);o>-1&&en.splice(o,1),!vq&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<wle&&(ble.existsSync(Do.getHubConfigPath())?xa(e):(await Do.generateNatsConfig(!0),xa(e),await new Promise(c=>setTimeout(c,3e3)),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=eS.get(tt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&Po.LOG_LEVEL_HIERARCHY[o]>=Po.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===Po.LOG_LEVELS.ERR||f===Po.LOG_LEVELS.WRN?Al.OUTPUTS.STDERR:Al.OUTPUTS.STDOUT;Al.logCustomLevel(f||"info",h,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=Po.LOG_LEVELS[_]}if(Po.LOG_LEVEL_HIERARCHY[o]>=Po.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===Po.LOG_LEVELS.ERR||f===Po.LOG_LEVELS.WRN?Al.OUTPUTS.STDERR:Al.OUTPUTS.STDOUT;Al.logCustomLevel(f||"info",d,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!en&&(en=[],!t)){let i=a(()=>{vq=!0,en&&(en.map(o=>o.kill()),process.exit(0))},"kill_children");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}en.push(r)}a(xa,"start");function Ile(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.start(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(Ile,"startWithPM2");function jN(e){if(!Oh){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 Lo()}catch(n){r(n)}je.stop(e,async(n,s)=>{n&&(je.disconnect(),r(n)),je.delete(e,(i,o)=>{i&&(je.disconnect(),r(n)),je.disconnect(),t(o)})})})}a(jN,"stop");function Uq(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.reload(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(Uq,"reload");function xq(e){if(!Oh){Bq();for(let t of en||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.restart(e,(n,s)=>{je.disconnect(),t(s)})})}a(xq,"restart");function Bq(){for(let e of en||[])e.config&&(e.config.restarts=0)}a(Bq,"expectedRestartOfChildren");function Cle(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.delete(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(Cle,"deleteProcess");async function Hq(){await xa(Ua.generateRestart())}a(Hq,"restartHdb");async function Ple(){let e=await JN();for(let t in e)if(e[t].name===tt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(Ple,"isHdbRestartRunning");function JN(){return new Promise(async(e,t)=>{try{await Lo()}catch(r){t(r)}je.list((r,n)=>{r&&(je.disconnect(),t(r)),je.disconnect(),e(n)})})}a(JN,"list");function kq(e){return new Promise(async(t,r)=>{try{await Lo()}catch(n){r(n)}je.describe(e,(n,s)=>{n&&(je.disconnect(),r(n)),je.disconnect(),t(s)})})}a(kq,"describe");function Dle(){if(!Oh){for(let e of en||[])e.kill();en=[];return}return new Promise(async(e,t)=>{try{await Lo()}catch(r){t(r)}je.killDaemon((r,n)=>{r&&(je.disconnect(),t(r)),je.disconnect(),e(n)})})}a(Dle,"kill");async function Lle(){try{await Vq(),await Kq(),await xa(Ua.generateAllServiceConfigs())}catch(e){throw je?.disconnect(),e}}a(Lle,"startAllServices");async function XN(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case tt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Ua.generateMainServerConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Ua.generateNatsIngestServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Ua.generateNatsReplyServiceConfig();break;case tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Ua.generateNatsHubServerConfig(),await xa(r,t),await Do.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Ua.generateNatsLeafServerConfig(),await xa(r,t),await Do.removeNatsConfig(e);return;case tt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Ua.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await xa(r)}catch(r){throw je?.disconnect(),r}}a(XN,"startService");async function Fq(){try{let e=await JN(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw je?.disconnect(),e}}a(Fq,"getUniqueServicesList");async function Mle(e=[]){try{let t=!1,r=await Fq();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===tt.PROCESS_DESCRIPTORS.HDB?t=!0:await xq(o))}t&&await qq(tt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw je?.disconnect(),t}}a(Mle,"restartAllServices");async function Gq(e){if(en?.find(r=>r.name===e))return!0;let t=await Rle.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(Gq,"isServiceRegistered");async function qq(e){let t=eS.get(tt.CONFIG_PARAMS.THREADS_COUNT)??eS.get(tt.CONFIG_PARAMS.THREADS),r=await kq(e),n=Sle.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await jN(e),await XN(e)):e===tt.PROCESS_DESCRIPTORS.HDB?await Hq():await Uq(e)}a(qq,"reloadStopStart");var $q;async function Vq(e=!1){for(let t in tt.CLUSTERING_PROCESSES){let r=tt.CLUSTERING_PROCESSES[t];await XN(r,e)}}a(Vq,"startClusteringProcesses");async function Kq(){$q=Mq(tt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:tt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await Zg.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await Zg.updateLocalStreams();let e=await Tle.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===tt.PRE_4_0_0_VERSION){Al.info("Starting clustering upgrade 4.0.0 process"),Mq(tt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(Kq,"startClusteringThreads");async function vle(){for(let e in tt.CLUSTERING_PROCESSES)if(e!==tt.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===tt.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await $q.terminate();else{let t=tt.CLUSTERING_PROCESSES[e];await jN(t)}}a(vle,"stopClustering");async function Ule(){for(let e in tt.CLUSTERING_PROCESSES){let t=tt.CLUSTERING_PROCESSES[e];if(await Gq(t)===!1)return!1}return!0}a(Ule,"isClusteringRunning");async function xle(){await Do.generateNatsConfig(!0),await Zg.reloadNATSHub(),await Zg.reloadNATSLeaf(),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Do.removeNatsConfig(tt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(xle,"reloadClustering")});var tw={};Ue(tw,{compactOnStart:()=>Ble,copyDb:()=>Xq});async function Ble(){Ba.notify("Running compact on start"),console.log("Running compact on start");let e=(0,ZN.get)(x.ROOTPATH),t=new Map,r=Xe();(0,ew.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,tS.join)(e,"backup",n+".mdb"),o=(0,tS.join)(e,_c,n+"-copy.mdb"),c=0;try{c=await Wq(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){Ba.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{db_path:s,copy_dest:o,backup_dest:i,record_count:c}),await Xq(n,o),console.log("Backing up",n,"to",i),await(0,Rl.move)(s,i,{overwrite:!0}),console.log("Moving copy compacted",n,"to",s),await(0,Rl.move)(o,s,{overwrite:!0}),await(0,Rl.remove)((0,tS.join)(e,_c,`${n}-copy.mdb-lock`))}try{hd()}catch(n){Ba.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}try{hd()}catch(n){Ba.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){Ba.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,ew.updateConfigValue)(x.STORAGE_COMPACTONSTART,!1);for(let[s,{db_path:i,backup_dest:o}]of t){console.error("Moving backup database",o,"back to",i);try{await(0,Rl.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw hd(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=await Wq(n);if(console.log("Database",n,"after compact has a total record count of",o),i!==o){let c=`There is a discrepancy between pre and post compact record count for database ${n}.
|
|
25
|
+
Total record count before compaction: ${i}, total after: ${o}.
|
|
26
|
+
Database backup has not been removed and can be found here: ${s}`;Ba.error(c),console.error(c)}(0,ZN.get)(x.STORAGE_COMPACTONSTARTKEEPBACKUP)!==!0&&(console.log("Removing backup",s),await(0,Rl.remove)(s))}}async function Wq(e){let t=await(0,Jq.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}function _d(){}async function Xq(e,t){console.log(`Copying database ${e} to ${t}`);let r=Xe()[e];if(!r)throw new Error(`Source database not found: ${e}`);let n;for(let d in r){let _=r[d];_.primaryStore.put=_d,_.primaryStore.remove=_d;for(let h in _.indices){let m=_.indices[h];m.put=_d,m.remove=_d}_.auditStore&&(_.auditStore.put=_d,_.auditStore.remove=_d),n=_.primaryStore.rootStore}if(!n)throw new Error(`Source database does not have any tables: ${e}`);let s=n.dbisDb,i=n.auditStore,o=(0,zq.open)(new Qq.default(t)),c=o.openDB(rS.INTERNAL_DBIS_NAME),l,u=0,f=s.useReadTransaction();try{for(let{key:_,value:h}of s.getRange({transaction:f})){let m=h.is_hash_attribute||h.isPrimaryKey,S,g;if(m&&(S=h.compression,g=nS(),g?h.compression=g:delete h.compression,S?.dictionary?.toString()===g?.dictionary?.toString()&&(S=null,g=null)),c.put(_,h),!(m||h.indexed))continue;let R=new jq.default(!m,m);R.encoding="binary",R.compression=S;let E=n.openDB(_,R);E.decoder=null,E.decoderCopies=!1,E.encoding="binary",R.compression=g;let T=o.openDB(_,R);T.encoder=null,console.log("copying",_,"from",e,"to",t),await d(E,T,m,f)}if(i){let _=n.openDB(rS.AUDIT_STORE_NAME,Nh);console.log("copying audit log for",e,"to",t),d(i,_,!1,f)}async function d(_,h,m,S){let g=0,R=0,E=0,T=1e7,N=null;for(;T-- >0;)try{for(let v of _.getKeys({start:N,transaction:S}))try{N=v;let{value:H,version:X}=_.getEntry(v,{transaction:S});if(H?.length<14&&m){E++;continue}l=h.put(v,H,m?X:void 0),g++,S.openTimer&&(S.openTimer=0),R+=(v?.length||10)+H.length,u++>5e3&&(await l,console.log("copied",g,"entries, skipped",E,"delete records,",R,"bytes"),u=0)}catch(H){console.error("Error copying record",typeof v=="symbol"?"symbol":v,"from",e,"to",t,H)}console.log("finish copying, copied",g,"entries, skipped",E,"delete records,",R,"bytes");return}catch{if(typeof N=="string"){if(N==="z")return console.error("Reached end of dbi",N,"for",e,"to",t);N=N.slice(0,-2)+"z"}else if(typeof N=="number")N++;else return console.error("Unknown key type",N,"for",e,"to",t)}}a(d,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{f.done(),o.close()}}var zq,tS,Rl,ZN,Qq,jq,rS,Jq,ew,Ba,rw=Re(()=>{xe();zq=require("lmdb"),tS=require("path"),Rl=require("fs-extra"),ZN=M(le()),Qq=M(zf()),jq=M(Wf()),rS=M(Gt());k();Ri();Jq=M(po()),ew=M(Ct()),Ba=M(ee());a(Ble,"compactOnStart");a(Wq,"getTotalDBRecordCount");a(_d,"noop");a(Xq,"copyDb")});var pd=C((cDe,i$)=>{"use strict";var Hle=require("minimist"),{isMainThread:sw,parentPort:Ih,threadId:iDe}=require("worker_threads"),at=(k(),P(q)),Fi=ee(),iw=ie(),iS=jg(),sS=gr(),oDe=Lt(),r$=Ct(),ri=fd(),Zq=td(),{compactOnStart:kle}=(rw(),P(tw)),Fle=hc(),{restartWorkers:oS,onMessageByType:Gle}=ot(),{handleHDBError:qle,hdb_errors:$le}=he(),{HTTP_STATUS_CODES:Vle}=$le,Ch=le(),{sendOperationToNode:e$,getThisNodeName:Kle,monitorNodeCAs:Yle}=(Es(),P(Na)),{getHDBNodeTable:aDe}=(sl(),P(pO));Ch.initSync();var wh=`Restarting HarperDB. This may take up to ${at.RESTART_TIMEOUT_MS/1e3} seconds.`,Wle="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",t$="Clustering is not enabled so cannot be restarted",zle="Invalid service",md,Rs;i$.exports={restart:n$,restartService:ow};sw&&Gle(at.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await ow({service:e.workerType}):n$({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function n$(e){Rs=Object.keys(e).length===0,md=await ri.isServiceRegistered(at.PROCESS_DESCRIPTORS.HDB);let t=Hle(process.argv);if(t.service){await ow(t);return}if(Rs&&!md){console.error(Wle);return}if(Rs&&console.log(wh),md){ri.enterPM2Mode(),Fi.notify(wh);let r=Fle(Object.keys(at.CONFIG_PARAM_MAP),!0);return iw.isEmptyOrZeroLength(Object.keys(r))||r$.updateConfigValue(void 0,void 0,r,!0,!0),Qle(),wh}return sw?(Fi.notify(wh),Ch.get(at.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await kle(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{oS()},50)):Ih.postMessage({type:at.ITC_EVENT_TYPES.RESTART}),wh}a(n$,"restart");async function ow(e){let{service:t}=e;if(at.HDB_PROCESS_SERVICES[t]===void 0)throw qle(new Error,zle,Vle.BAD_REQUEST,void 0,void 0,!0);if(ri.expectedRestartOfChildren(),md=await ri.isServiceRegistered(at.PROCESS_DESCRIPTORS.HDB),!sw){e.replicated&&Yle(),Ih.postMessage({type:at.ITC_EVENT_TYPES.RESTART,workerType:t}),Ih.ref(),await new Promise(s=>{Ih.on("message",i=>{i.type==="restart-complete"&&(s(),Ih.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===Kle())continue;let i;try{({job_id:i}=await e$(s,e))}catch(o){n.push({node:s.name,message:o.message});continue}n.push(await new Promise((o,c)=>{let u=2400,f=setInterval(async()=>{if(u--<=0){clearInterval(f);let h=new Error("Timed out waiting for restart job to complete");h.replicated=n,c(h)}let _=(await e$(s,{operation:"get_job",id:i})).results[0];if(_.status==="COMPLETE"&&(clearInterval(f),o({node:s.name,message:_.message})),_.status==="ERROR"){clearInterval(f);let h=new Error(_.message);h.replicated=n,c(h)}},250)}))}return{replicated:n}}return}let r;switch(t){case at.HDB_PROCESS_SERVICES.clustering:if(!Ch.get(at.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=t$;break}Rs&&console.log("Restarting clustering"),Fi.notify("Restarting clustering"),await s$();break;case at.HDB_PROCESS_SERVICES.clustering_config:case at.HDB_PROCESS_SERVICES["clustering config"]:if(!Ch.get(at.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=t$;break}Rs&&console.log("Restarting clustering_config"),Fi.notify("Restarting clustering_config"),await ri.reloadClustering();break;case"custom_functions":case"custom functions":case at.HDB_PROCESS_SERVICES.harperdb:case at.HDB_PROCESS_SERVICES.http_workers:case at.HDB_PROCESS_SERVICES.http:if(Rs&&!md){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}Rs&&console.log("Restarting http_workers"),Fi.notify("Restarting http_workers"),Rs?await ri.restart(at.PROCESS_DESCRIPTORS.HDB):await oS("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Fi.error(r),Rs&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(ow,"restartService");async function Qle(){await s$(),await ri.restart(at.PROCESS_DESCRIPTORS.HDB),await iw.async_set_timeout(2e3),Ch.get(at.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await nw(),Rs&&(await sS.closeConnection(),process.exit(0))}a(Qle,"restartPM2Mode");async function s$(){if(!r$.getConfigFromFile(at.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await Zq.getHDBProcessInfo()).clustering.length===0)Fi.trace("Clustering not running, restart will start clustering services"),await iS.generateNatsConfig(!0),await ri.startClusteringProcesses(),await ri.startClusteringThreads(),await nw(),Rs&&await sS.closeConnection();else{await iS.generateNatsConfig(!0),md?(Fi.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await ri.restart(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await ri.restart(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await Zq.getHDBProcessInfo()).clustering.forEach(s=>{Fi.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await iw.async_set_timeout(3e3),await nw(),await sS.updateLocalStreams(),Rs&&await sS.closeConnection(),Fi.trace("Restart clustering restarting ingest and reply service threads");let t=oS(at.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=oS(at.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(s$,"restartClustering");async function nw(){await iS.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await iS.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(nw,"removeNatsConfig")});var p$=C((dDe,m$)=>{"use strict";var uDe=require("lodash"),Nn=(k(),P(q)),{handleHDBError:o$,hdb_errors:jle}=he(),{HDB_ERROR_MSGS:Jle,HTTP_STATUS_CODES:Xle}=jle,aw=ee();m$.exports={getRolePermissions:eue};var yl=Object.create(null),Zle=a(e=>({key:e,perms:{}}),"perms_template_obj"),u$=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),d$=a((e=!1,t=!1,r=!1,n=!1)=>({[Nn.PERMS_CRUD_ENUM.READ]:e,[Nn.PERMS_CRUD_ENUM.INSERT]:t,[Nn.PERMS_CRUD_ENUM.UPDATE]:r,[Nn.PERMS_CRUD_ENUM.DELETE]:n}),"permissions_template"),cw=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...d$(t,r,n,s)}),"table_perms_template"),a$=a((e,t=d$())=>({attribute_name:e,describe:h$(t),[Ph]:t[Ph],[lw]:t[lw],[uw]:t[uw]}),"attr_perms_template"),c$=a((e,t=!1)=>({attribute_name:e,describe:t,[Ph]:t}),"timestamp_attr_perms_template"),{READ:Ph,INSERT:lw,UPDATE:uw}=Nn.PERMS_CRUD_ENUM,f$=Object.values(Nn.PERMS_CRUD_ENUM),_$=[Ph,lw,uw];function eue(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[Nn.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(yl[t]&&yl[t].key===n)return yl[t].perms;let s=tue(e,r);return yl[t]?yl[t].key=n:yl[t]=Zle(n),yl[t].perms=s,s}catch(r){if(!e[Nn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[Nn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<Nn.PERMS_UPDATE_RELEASE_TIMESTAMP){let n=`Role permissions for role '${t}' must be updated to align with new structure from the 2.2.0 release.`;throw aw.error(n),aw.debug(r),o$(new Error,Jle.OUTDATED_PERMS_TRANSLATION_ERROR,Xle.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
|
|
27
27
|
${r.stack}`;throw aw.error(n),o$(new Error)}}}a(eue,"getRolePermissions");function tue(e,t){let r=Object.create(null);r.super_user=!1;let n=e.permission;r[Nn.SYSTEM_SCHEMA_NAME]=n[Nn.SYSTEM_SCHEMA_NAME],r.structure_user=n.structure_user;let s=Array.isArray(e.permission.structure_user)||e.permission.structure_user===!0?e.permission.structure_user:[];return Object.keys(t).forEach(i=>{if(s===!0||s.indexOf(i)>-1){r[i]=rue(t[i]);return}r[i]=u$(),n[i]?(n[i].describe&&(r[i].describe=!0),Object.keys(t[i]).forEach(o=>{if(n[i].tables[o]){let c=n[i].tables[o],l=t[i][o],u=nue(c,l);r[i].describe||f$.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=cw()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=cw()})}),r}a(tue,"translateRolePermissions");function rue(e){let t=u$(!0);return Object.keys(e).forEach(r=>{t.tables[r]=cw(!0,!0,!0,!0,!0)}),t}a(rue,"createStructureUserPermissions");function nue(e,t){let{attribute_permissions:r}=e;if(r?.length>0){let s={...e};s.attribute_permissions=[];let i=r.reduce((u,f)=>{let{attribute_name:d}=f,_=f;return Nn.TIME_STAMP_NAMES.includes(d)&&(_=c$(d,f[Ph])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=a$(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=h$(f),s.attribute_permissions.push(f),c||sue(f,l)}else if(u!==o){let f;Nn.TIME_STAMP_NAMES.includes(u)?f=c$(u):f=a$(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=l$(s),s}else return e.describe=l$(e),e}a(nue,"getTableAttrPerms");function l$(e){return f$.filter(t=>e[t]).length>0}a(l$,"getSchemaTableDescribePerm");function h$(e){return _$.filter(t=>e[t]).length>0}a(h$,"getAttributeDescribePerm");function sue(e,t){_$.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(sue,"checkForHashPerms")});var Dh={};Ue(Dh,{authentication:()=>y$,bypassAuth:()=>fue,login:()=>hue,logout:()=>mue,start:()=>_ue});function fue(){R$=!0}async function y$(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let h=e.isOperationsServer?cue?aue:[]:oue?iue:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let m=tn.get(x.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",S=new Ao([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",m],["Access-Control-Allow-Origin",i]]);return aS&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),aS&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(aS){i||(i=r.host);let h=(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session=",m=s?.split(/;\s+/)||[];for(let S of m)if(S.startsWith(h)){let g=S.indexOf(";");l=S.slice(h.length,g===-1?S.length:g),u=await E$.get(l);break}e.session=u||(u={})}let f=a((h,m,S)=>{let g=new Ed.AuthAuditLog(h,m,Xo.AUTHENTICATION,r["x-forwarded-for"]??e.ip,e.method,e.pathname);g.auth_strategy=S,l&&(g.session_id=l),r.referer&&(g.referer=r.referer),r.origin&&(g.origin=r.origin),m===Bs.SUCCESS?dw.notify(g):dw.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&dw.error("Authorization error:",e._nodeRequest.socket.authorizationError),e.mtlsConfig&&e.authorized&&e.peerCertificate.subject){let h=e.mtlsConfig.user;h!==null?((h===void 0||h==="Common Name"||h==="CN")&&(h=e.peerCertificate.subject.CN),e.user=await Ye.getUser(h,null,e),f(h,Bs.SUCCESS,"mTLS")):(0,Ed.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let d;if(!e.user)if(n){if(d=bl.get(n),!d){let h=n.indexOf(" "),m=n.slice(0,h),S=n.slice(h+1),g,R;try{switch(m){case"Basic":let E=atob(S),T=E.indexOf(":");g=E.slice(0,T),R=E.slice(T+1),d=g||R?await Ye.getUser(g,R,e):null;break;case"Bearer":try{d=await Wb(S)}catch(N){if(N.message==="invalid token")try{return await GE(S),c({status:-1})}catch{throw N}}break}}catch(E){return uue&&(bl.get(S)||(bl.set(S,S),f(g,Bs.FAILURE,m))),c({status:401,body:ua({error:E.message},e)})}bl.set(n,d),lue&&f(d.username,Bs.SUCCESS,m)}e.user=d}else u?.user?e.user=await Ye.getUser(u.user,null,e):(R$&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,S$.getSuperUser)());aS&&(e.session.update=function(h){let m=tn.get(x.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,T$.v4)();let S=tn.get(x.AUTHENTICATION_COOKIE_DOMAINS),g=m?new Date(Date.now()+(0,fw.convertToMS)(m)).toUTCString():due,R=S?.find(N=>r.host?.endsWith(N)),T=`${(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session="}${l}; Path=/; Expires=${g}; ${R?"Domain="+R+"; ":""}HttpOnly${e.protocol==="https"?"; SameSite=None; Secure":""}`;o?o.push("Set-Cookie",T):_?.headers?.set&&_.headers.set("Set-Cookie",T)}return e.protocol==="https"&&(o?(i&&o.push("Access-Control-Expose-Headers","X-Hdb-Session"),o.push("X-Hdb-Session","Secure")):_?.headers?.set&&(i&&_.headers.set("Access-Control-Expose-Headers","X-Hdb-Session"),_.headers.set("X-Hdb-Session","Secure"))),h.id=l,E$.put(h,{expiresAt:m?Date.now()+(0,fw.convertToMS)(m):void 0})},e.login=async function(h,m){let S=e.user=await Ye.authenticateUser(h,m,e);e.session.update({user:S&&(S.getId?.()??S.username)})});let _=await t(e);return _&&(_.status===401&&(r["user-agent"]?.startsWith("Mozilla")&&r.accept?.startsWith("text/html")&&_s.loginPath?(_.status=302,_.headers.set("Location",_s.loginPath(e))):_.headers.set("WWW-Authenticate","Basic")),c(_))}catch(l){throw c(l)}function c(l){let u=o.length;if(u>0){let f=l.headers;f||(l.headers=f=new Ao);for(let d=0;d<u;){let _=o[d++];f.set(_,o[d++])}}return o=null,l}a(c,"applyResponseHeaders")}function _ue({server:e,port:t,securePort:r}){e.http(y$,t||r?{port:t,securePort:r}:{port:"all"}),g$||(g$=!0,setInterval(()=>{bl=new Map},tn.get(x.AUTHENTICATION_CACHETTL)).unref(),A$.user.addListener(()=>{bl=new Map}))}async function hue(e){if(!e.baseRequest?.login)throw new Error("No session for login");return e.baseResponse.headers.set=(t,r)=>{e.fastifyResponse.header(t,r)},await e.baseRequest.login(e.username,e.password??""),"Login successful"}async function mue(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var S$,T$,tn,Ed,A$,fw,dw,iue,oue,aue,cue,E$,aS,R$,lue,uue,due,bl,g$,cS=Re(()=>{S$=M(Kn());Mr();su();vu();xe();T$=require("uuid"),tn=M(le());k();Ed=M(ee()),A$=M(d_());U_();fw=M(ie());oo();dw=(0,Ed.loggerWithTag)("auth-event");tn.initSync();iue=tn.get(x.HTTP_CORSACCESSLIST),oue=tn.get(x.HTTP_CORS),aue=tn.get(x.OPERATIONSAPI_NETWORK_CORSACCESSLIST),cue=tn.get(x.OPERATIONSAPI_NETWORK_CORS),E$=_t({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),aS=tn.get(x.AUTHENTICATION_ENABLESESSIONS)??!0,R$=process.env.AUTHENTICATION_AUTHORIZELOCAL??tn.get(x.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,lue=tn.get(x.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,uue=tn.get(x.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,due="Tue, 01 Oct 8307 19:33:20 GMT",bl=new Map;Ye.onInvalidatedUser(()=>{bl=new Map});a(fue,"bypassAuth");a(y$,"authentication");a(_ue,"start");a(hue,"login");a(mue,"logout")});var P$=C((ADe,C$)=>{"use strict";var Ne=require("joi"),b$=require("fs-extra"),O$=require("path"),ts=it(),N$=le(),w$=(k(),P(q)),I$=ee(),{hdb_errors:pue}=he(),{HDB_ERROR_MSGS:rn}=pue,Mo=/^[a-zA-Z0-9-_]+$/,Eue=/^[a-zA-Z0-9-_]+$/;C$.exports={getDropCustomFunctionValidator:Sue,setCustomFunctionValidator:Tue,addComponentValidator:bue,dropCustomFunctionProjectValidator:Oue,packageComponentValidator:Nue,deployComponentValidator:wue,setComponentFileValidator:Aue,getComponentFileValidator:yue,dropComponentFileValidator:Rue,addSSHKeyValidator:Iue,updateSSHKeyValidator:Cue,deleteSSHKeyValidator:Pue,setSSHKnownHostsValidator:Due};function lS(e,t,r){try{let n=N$.get(w$.CONFIG_PARAMS.COMPONENTSROOT),s=O$.join(n,t);return b$.existsSync(s)?e?t:r.message(rn.PROJECT_EXISTS):e?r.message(rn.NO_PROJECT):t}catch(n){return I$.error(n),r.message(rn.VALIDATION_ERR)}}a(lS,"checkProjectExists");function Lh(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(Lh,"checkFilePath");function gue(e,t,r,n){try{let s=N$.get(w$.CONFIG_PARAMS.COMPONENTSROOT),i=O$.join(s,e,t,r+".js");return b$.existsSync(i)?r:n.message(rn.NO_FILE)}catch(s){return I$.error(s),n.message(rn.VALIDATION_ERR)}}a(gue,"checkFileExists");function Sue(e){let t=Ne.object({project:Ne.string().pattern(Mo).custom(lS.bind(null,!0)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(Mo).custom(gue.bind(null,e.project,e.type)).custom(Lh).required().messages({"string.pattern.base":rn.BAD_FILE_NAME})});return ts.validateBySchema(e,t)}a(Sue,"getDropCustomFunctionValidator");function Tue(e){let t=Ne.object({project:Ne.string().pattern(Mo).custom(lS.bind(null,!0)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(Lh).required(),function_content:Ne.string().required()});return ts.validateBySchema(e,t)}a(Tue,"setCustomFunctionValidator");function Aue(e){let t=Ne.object({project:Ne.string().pattern(Mo).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),file:Ne.string().custom(Lh).required(),payload:Ne.string().allow("").optional(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return ts.validateBySchema(e,t)}a(Aue,"setComponentFileValidator");function Rue(e){let t=Ne.object({project:Ne.string().pattern(Mo).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),file:Ne.string().custom(Lh).optional()});return ts.validateBySchema(e,t)}a(Rue,"dropComponentFileValidator");function yue(e){let t=Ne.object({project:Ne.string().required(),file:Ne.string().custom(Lh).required(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return ts.validateBySchema(e,t)}a(yue,"getComponentFileValidator");function bue(e){let t=Ne.object({project:Ne.string().pattern(Mo).custom(lS.bind(null,!1)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME})});return ts.validateBySchema(e,t)}a(bue,"addComponentValidator");function Oue(e){let t=Ne.object({project:Ne.string().pattern(Mo).custom(lS.bind(null,!0)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME})});return ts.validateBySchema(e,t)}a(Oue,"dropCustomFunctionProjectValidator");function Nue(e){let t=Ne.object({project:Ne.string().pattern(Mo).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return ts.validateBySchema(e,t)}a(Nue,"packageComponentValidator");function wue(e){let t=Ne.object({project:Ne.string().pattern(Mo).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),package:Ne.string().optional(),restart:Ne.alternatives().try(Ne.boolean(),Ne.string().valid("rolling")).optional()});return ts.validateBySchema(e,t)}a(wue,"deployComponentValidator");function Iue(e){let t=Ne.object({name:Ne.string().pattern(Eue).required().messages({"string.pattern.base":rn.BAD_SSH_KEY_NAME}),key:Ne.string().required(),host:Ne.string().required(),hostname:Ne.string().required(),known_hosts:Ne.string().optional()});return ts.validateBySchema(e,t)}a(Iue,"addSSHKeyValidator");function Cue(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return ts.validateBySchema(e,t)}a(Cue,"updateSSHKeyValidator");function Pue(e){let t=Ne.object({name:Ne.string().required()});return ts.validateBySchema(e,t)}a(Pue,"deleteSSHKeyValidator");function Due(e){let t=Ne.object({known_hosts:Ne.string().required()});return ts.validateBySchema(e,t)}a(Due,"setSSHKnownHostsValidator")});var Uh=C((yDe,U$)=>{"use strict";var uS=require("joi"),Ha=require("path"),gd=require("fs-extra"),{exec:Lue,spawn:Mue}=require("child_process"),vue=require("util"),Uue=vue.promisify(Lue),Sd=(k(),P(q)),{PACKAGE_ROOT:xue}=Et(),{handleHDBError:Mh,hdb_errors:Bue}=he(),{HTTP_STATUS_CODES:vh}=Bue,Ol=le(),Hue=it(),ka=ee(),{once:kue}=require("events");Ol.initSync();var _w=Ol.get(Sd.CONFIG_PARAMS.COMPONENTSROOT),D$="npm install --force --omit=dev --json",Fue=`${D$} --dry-run`,Gue=Ol.get(Sd.CONFIG_PARAMS.ROOTPATH),dS=Ha.join(Gue,"ssh");U$.exports={installModules:Kue,auditModules:Yue,installAllRootModules:que,uninstallRootModule:$ue,linkHarperdb:Vue,runCommand:Td};async function que(e=!1,t=Ol.get(Sd.CONFIG_PARAMS.ROOTPATH)){await fS();let r=!1,n=process.env;gd.pathExistsSync(dS)&&gd.readdirSync(dS).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+Ha.join(dS,"config")+" -o UserKnownHostsFile="+Ha.join(dS,"known_hosts"),...process.env},r=!0)});try{let s=Ol.get(Sd.CONFIG_PARAMS.ROOTPATH),i=Ha.join(s,"node_modules","harperdb");gd.lstatSync(i).isSymbolicLink()&&gd.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&ka.error("Error removing symlink:",s)}await Td(e?"npm install --force --ignore-scripts":"npm install --force",t,n)}a(que,"installAllRootModules");async function $ue(e){await Td(`npm uninstall ${e}`,Ol.get(Sd.CONFIG_PARAMS.ROOTPATH))}a($ue,"uninstallRootModule");async function Vue(){await fS(),await Td(`npm link ${xue}`,Ol.get(Sd.CONFIG_PARAMS.ROOTPATH))}a(Vue,"linkHarperdb");async function Td(e,t=void 0,r=process.env){ka.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=Mue(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();ka.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();ka.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await kue(n,"close");if(o!==0)throw new Error(`Command \`${e}\` exited with code ${o}.${i===""?"":` Error: ${i}`}`);return s||void 0}a(Td,"runCommand");async function Kue(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";ka.warn(t,e.projects);let r=v$(e);if(r)throw Mh(r,r.message,vh.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?Fue:D$;await fS(),await M$(n);let o={};for(let c=0,l=n.length;c<l;c++){let u=n[c];o[u]={npm_output:null,npm_error:null};let f=Ha.join(_w,u),d,_=null;try{let{stdout:h,stderr:m}=await Uue(i,{cwd:f});d=h?h.replace(`
|
|
28
28
|
`,""):null,_=m?m.replace(`
|
|
29
29
|
`,""):null}catch(h){h.stderr?o[u].npm_error=L$(h.stderr):o[u].npm_error=h.message;continue}try{o[u].npm_output=JSON.parse(d)}catch{o[u].npm_output=d}try{o[u].npm_error=JSON.parse(_)}catch{o[u].npm_error=_}}return ka.info(`finished installModules with response ${o}`),o.warning=t,o}a(Kue,"installModules");function L$(e){let t='"error": {',r=e.indexOf('"error": {'),n=e.indexOf(`}
|