harperdb 4.6.16 → 4.6.17

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.
@@ -16,9 +16,9 @@
16
16
  `,""));return r.replace(`
17
17
  `,"")}o(Zk,"runCommand");async function xoe(){try{await foe.access(ON)}catch{return!1}let e=await Zk(`${ON} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return moe.eq(t,voe)}o(xoe,"checkNATSServerInstalled");async function MN(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let a=await Jk.getClusterUser();if(pl(a))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=a.username,r=a.decrypt_hash}mi.trace("create nats connection called");let i=await Ioe({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:Hr.get(je.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:Hr.get(je.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:Hr.get(je.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),mi.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(a=>{a&&mi.error("Error with Nats client connection, connection closed",a),i===fn&&eG()}),i}o(MN,"createConnection");function eG(){fn=void 0,fl=void 0,ml=void 0,hl=void 0}o(eG,"clearClientCache");async function Boe(){fn&&(await fn.drain(),fn=void 0,fl=void 0,ml=void 0,hl=void 0)}o(Boe,"closeConnection");var fn,hl;async function dh(){return hl||(hl=MN(Hr.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),fn=await hl),fn||hl}o(dh,"getConnection");async function fh(){if(fl)return fl;pl(fn)&&await dh();let{domain:e}=nd(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(pl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return fl=await fn.jetstreamManager({domain:e,timeout:6e4}),fl}o(fh,"getJetStreamManager");async function tG(){if(ml)return ml;pl(fn)&&await dh();let{domain:e}=nd(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(pl(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return ml=fn.jetstream({domain:e,timeout:6e4}),ml}o(tG,"getJetStream");async function zi(){let e=fn||await dh(),t=fl||await fh(),r=ml||await tG();return{connection:e,jsm:t,js:r}}o(zi,"getNATSReferences");async function Foe(e){let t=Hr.get(je.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await Jk.getClusterUser(),s=await MN(t,r,n),i=DN(),a=s.subscribe(i),c=[],l,u=(async()=>{for await(let d of a){let f=Xk.decode(d.data);f.response_time=Date.now()-l,c.push(f)}})();return l=Date.now(),await s.publish("$SYS.REQ.SERVER.PING.VARZ",void 0,{reply:i}),await s.publish("$SYS.REQ.SERVER.PING",void 0,{reply:i}),await s.flush(),await Og.asyncSetTimeout(e),await a.drain(),await s.close(),await u,c}o(Foe,"getServerList");async function vN(e,t){let{jsm:r}=await zi(),n=Hr.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Hr.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=Hr.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:Noe.File,retention:woe.Limits,subjects:t,discard:Ooe.Old,maxMsgs:s,maxBytes:i,maxAge:n})}o(vN,"createLocalStream");async function rG(){let{jsm:e}=await zi(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}o(rG,"listStreams");async function Hoe(e){let{jsm:t}=await zi();await t.streams.delete(e)}o(Hoe,"deleteLocalStream");async function koe(e){let{connection:t}=await zi(),r=[],n=DN(),s=t.subscribe(n),i=(async()=>{for await(let a of s)r.push(Xk.decode(a.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}o(koe,"listRemoteStreams");async function Goe(e,t=void 0,r=void 0){let{jsm:n,js:s}=await zi(),i=Wk(),a={durable_name:i,ack_policy:PN.Explicit};t&&(a.deliver_policy=LN.StartTime,a.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,a);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];let u=[];for await(let d of l){let f=CN(d.data),m={nats_timestamp:d.info.timestampNanos,nats_sequence:d.info.streamSequence,entry:f};if(d.headers&&(m.origin=d.headers.get(jr.MSG_HEADERS.ORIGIN)),u.push(m),d.ack(),d.info.pending===0)break}return await c.delete(),u}o(Goe,"viewStream");async function*qoe(e,t=void 0,r=void 0){let{jsm:n,js:s}=await zi(),i=Wk(),a={durable_name:i,ack_policy:PN.Explicit};t&&(a.deliver_policy=LN.StartTime,a.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,a);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];for await(let u of l){let d=CN(u.data);d[0]||(d=[d]);for(let f of d){let m={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:f};u.headers&&(m.origin=u.headers.get(jr.MSG_HEADERS.ORIGIN)),yield m}if(u.ack(),u.info.pending===0)break}await c.delete()}o(qoe,"viewStreamIterator");async function $oe(e,t,r,n){mi.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=nG(n,r);let{js:s}=await zi(),i=await Pg(),a=`${e}.${i}`,c=await Doe(()=>n instanceof Uint8Array?n:Qk.encode(n));try{mi.trace(`publishToStream publishing to subject: ${a}`),Loe(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(a,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return iG(async()=>{try{await s.publish(a,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){mi.trace(`publishToStream creating stream: ${t}`);let d=a.split(".");d[2]="*",await vN(t,[a]),await s.publish(a,c,{headers:r})}else throw l}});throw l}}o($oe,"publishToStream");function nG(e,t){t===void 0&&(t=Poe());let r=Hr.get(je.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(jr.MSG_HEADERS.ORIGIN)&&r&&t.append(jr.MSG_HEADERS.ORIGIN,r),t}o(nG,"addNatsMsgHeader");function nd(e){e=e.toLowerCase();let t=uh.join(Hr.get(je.CONFIG_PARAMS.ROOTPATH),Moe);if(e===je.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return pl(wN)&&(wN={port:ch.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:ch.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_NODENAME)+jr.SERVER_SUFFIX.HUB,config_file:jr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:uh.join(t,jr.PID_FILES.HUB),hdbNatsPath:t}),wN;if(e===je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return pl(NN)&&(NN={port:ch.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:ch.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_NODENAME)+jr.SERVER_SUFFIX.LEAF,config_file:jr.NATS_CONFIG_FILES.LEAF_SERVER,domain:ch.getConfigFromFile(je.CONFIG_PARAMS.CLUSTERING_NODENAME)+jr.SERVER_SUFFIX.LEAF,pid_file_path:uh.join(t,jr.PID_FILES.LEAF),hdbNatsPath:t}),NN;mi.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}o(nd,"getServerConfig");async function sG(e,t,r,n){try{await e.consumers.add(t,{ack_policy:PN.Explicit,durable_name:r,deliver_policy:LN.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}o(sG,"createConsumer");async function Voe(e,t,r){await e.consumers.delete(t,r)}o(Voe,"removeConsumer");function Koe(e){return e.split(".")[1]}o(Koe,"extractServerName");async function Yoe(e,t,r=6e4,n=DN()){if(!Og.isObject(t))throw new Error("data param must be an object");let s=Qk.encode(t),{connection:i}=await zi(),a={timeout:r};n&&(a.reply=n,a.noMux=!0);let c=await i.request(e,s,a);return CN(c.data)}o(Yoe,"request");function UN(e){return new Promise(async(t,r)=>{let n=_oe(ON,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",a=>{r(a)}),n.stdout.on("data",a=>{i+=a.toString()}),n.stderr.on("data",a=>{s+=a.toString()}),n.stderr.on("close",a=>{s&&r(s),t(i)})})}o(UN,"reloadNATS");async function Woe(){let{pid_file_path:e}=nd(je.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await UN(e)}o(Woe,"reloadNATSHub");async function zoe(){let{pid_file_path:e}=nd(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await UN(e)}o(zoe,"reloadNATSLeaf");function joe(e,t,r){let n;switch(e.code){case Yk.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case Yk.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}o(joe,"requestErrorHandler");async function Qoe(e,t){let r=t+jr.SERVER_SUFFIX.LEAF,{connection:n}=await zi(),{jsm:s}=await sae(r),{schema:i,table:a}=e,c=Cg.createNatsTableStreamName(i,a),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await iG(async()=>{if(e.subscribe===!0)await sG(s,c,n.info.server_name,l);else try{await Voe(s,c,n.info.server_name)}catch(u){mi.trace(u)}})}o(Qoe,"updateRemoteConsumer");async function Joe(e,t,r,n){let s=Cg.createNatsTableStreamName(e,t),i=r+jr.SERVER_SUFFIX.LEAF,a={type:je.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!jk&&Aoe()<Hr.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=IN();await c(a)}await Roe(a),n==="stop"&&await Og.asyncSetTimeout(1e3)}o(Joe,"updateConsumerIterator");function iG(e){return Toe.writeTransaction(je.SYSTEM_SCHEMA_NAME,je.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}o(iG,"exclusiveLock");async function oG(e,t){let r=Cg.createNatsTableStreamName(e,t),n=await Pg(),s=tae(e,t,n);await vN(r,[s])}o(oG,"createLocalTableStream");async function Xoe(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await oG(n,s)}}o(Xoe,"createTableStreams");async function aG(e,t,r=void 0){if(Hr.get(je.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=Cg.createNatsTableStreamName(e,t),{domain:s}=nd(je.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await dh()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")mi.warn(n);else throw n}}o(aG,"purgeTableStream");async function Zoe(e,t){if(Hr.get(je.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await aG(e,t[r])}o(Zoe,"purgeSchemaTableStreams");async function eae(e){return(await fh()).streams.info(e)}o(eae,"getStreamInfo");function tae(e,t,r){return`${jr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}o(tae,"createSubjectName");async function Pg(){if(lh)return lh;if(lh=(await fh())?.nc?.info?.server_name,lh===void 0)throw new Error("Unable to get jetstream manager server name");return lh}o(Pg,"getJsmServerName");async function rae(){let e=await fh(),t=await Pg(),r=await rG();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let a=nae(n),c=i.split(".");if(c[c.length-1]===t&&!a||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let d=u.join(".");mi.trace(`Updating stream subject name from: ${i} to: ${d}`),s.subjects[0]=d,await e.streams.update(s.name,s)}}o(rae,"updateLocalStreams");function nae(e){let{config:t}=e,r=!1,n=Hr.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=Hr.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=Hr.get(je.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);return i=i===null?-1:i,n!==t.max_age&&(t.max_age=n,r=!0),s!==t.max_bytes&&(t.max_bytes=s,r=!0),i!==t.max_msgs&&(t.max_msgs=i,r=!0),r}o(nae,"updateStreamLimits");async function sae(e){let t,r;try{t=await fn.jetstream({domain:e}),r=await fn.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw mi.error("Unable to connect to:",e),n}return{js:t,jsm:r}}o(sae,"connectToRemoteJS")});function xN(e){let t=e.get(Lg),r=t?(0,sd.unpack)(t):null;r||(r={remoteNameToId:{}});let n=Ze(),s=!1;r.nodeName=Ze();let i=r.remoteNameToId;if(i[n]!==0){let a=0,c;for(let l in i){let u=i[l];u===0?c=l:u>a&&(a=u)}if(c){a++,i[c]=a;let l=[Symbol.for("seq"),a];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:hh(e)??1,nodes:[]})})}i[n]=0,e.putSync(Lg,(0,sd.pack)(r))}return r}function mh(e){return xN(e).remoteNameToId}function uG(e,t){let r=xN(t),n=r.remoteNameToId,s=new Map,i=!1;for(let a in e){let c=e[a],l=n[a];if(l==null){let u=0;for(let d in n){let f=n[d];f>u&&(u=f)}l=u+1,n[a]=l,i=!0}s.set(c,l)}return i&&t.putSync(Lg,(0,sd.pack)(r)),s}function Dg(e,t){let r=xN(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let a in n){let c=n[a];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(Lg,(0,sd.pack)(r))}return lG.trace?.("The remote node name map",e,n,s),s}var lG,sd,Lg,BN=ue(()=>{lG=w(ei());rs();sd=require("msgpackr"),Lg=Symbol.for("remote-ids");o(xN,"getIdMappingRecord");o(mh,"exportIdMapping");o(uG,"remoteToLocalNodeId");o(Dg,"getIdOfRemoteNode")});function kN(e,t,r,n,s){let i=e.primaryStore.env.path,a=e.primaryStore.tableId,c;s?.crossThreads===!1?(c=fG,iae(e.primaryStore,e.auditStore)):(c=dG,e.primaryStore.env.hasSubscriptionCommitListener||(e.primaryStore.env.hasSubscriptionCommitListener=!0,e.primaryStore.on("committed",()=>{mG(dG[i])})));let l=c[i]||(c[i]=[]);if(l.auditStore=e.auditStore,l.lastTxnTime==null&&(l.lastTxnTime=Date.now()),s?.scope==="full-database")return;let u=l[a];u||(u=l[a]=new Map,u.envs=l,u.tableId=a,u.store=e.primaryStore),t=Nu(t);let d=new HN(r);d.startTime=n;let f=u.get(t);return f?f.push(d):(u.set(t,f=[d]),f.tables=u,f.key=t),d.subscriptions=f,d}function mG(e){if(!e)return;let t=e.auditStore;t.resetReadTxn(),hG(e.auditStore);let r;for(let{key:n,value:s}of t.getRange({start:e.lastTxnTime,exclusiveStart:!0})){e.lastTxnTime=n;let i=At(s),a=e[i.tableId];if(!a)continue;let c=i.recordId,l=Nu(c),u=0;do{let d=a.get(l);if(d){for(let m of d)if(!(u>0&&!(m.includeDescendants&&!(m.onlyChildren&&u>1)))){if(m.startTime>=n){(0,FN.info)("omitting",c,m.startTime,n);continue}try{let h;m.supportsTransactions&&m.txnInProgress!==i.version&&(h=!0,m.txnInProgress||(r?r.push(m):r=[m]),m.txnInProgress=i.version),m.listener(c,i,n,h)}catch(h){console.error(h),(0,FN.info)(h)}}}if(l==null)break;let f=l.lastIndexOf?.("/",l.length-2);f!==l.length-1&&u++,f>-1?l=l.slice(0,f+1):l=null}while(!0)}if(r)for(let n of r)n.txnInProgress=null,n.listener(null,{type:"end_txn"},e.lastTxnTime,!0)}function iae(e,t){let r=t||e,n=r.env;if(!n.hasAfterCommitListener){n.hasAfterCommitListener=!0;let s=n.path;r.on("aftercommit",({next:i,last:a,txnId:c})=>{let l=fG[s];if(!l)return;let u=o(()=>{r.threadLocalWrites||(r.threadLocalWrites=new Float64Array(r.getUserSharedBuffer("last-thread-local-write",new ArrayBuffer(8)))),l.txnTime=r.threadLocalWrites[0]||Date.now();try{mG(l)}finally{r.threadLocalWrites[0]=l.lastTxnTime,r.unlock("thread-local-writes")}},"acquiredLock");r.attemptLock("thread-local-writes",u)&&u()})}}function hG(e){e.nextTransaction?.resolve();let t;e.nextTransaction=new Promise(r=>{t=r}),e.nextTransaction.resolve=t}function pG(e){return e.nextTransaction||(kN({primaryStore:e,auditStore:e},null,null,0,{scope:"full-database"}),hG(e)),e.nextTransaction}var FN,dG,fG,HN,GN=ue(()=>{FN=w(Q());Tu();wu();Mi();dG=Object.create(null),fG=Object.create(null);o(kN,"addSubscription");HN=class extends Vn{static{o(this,"Subscription")}listener;subscriptions;startTime;includeDescendants;supportsTransactions;onlyChildren;constructor(t){super(),this.listener=t,this.on("close",()=>this.end())}end(){if(this.subscriptions){if(this.subscriptions.splice(this.subscriptions.indexOf(this),1),this.subscriptions.length===0){let t=this.subscriptions.tables;if(t){let r=this.subscriptions.key;if(t.delete(r),t.size===0){let n=t.envs,s=t.dbi;delete n[s]}}}this.subscriptions=null}}toJSON(){return{name:"subscription"}}};o(mG,"notifyFromTransactionData");o(iae,"listenToCommits");o(hG,"nextTransaction");o(pG,"whenNextTransaction")});var qN={};Oe(qN,{commitsAwaitingReplication:()=>id,getHDBNodeTable:()=>$t,getReplicationSharedStatus:()=>od,iterateRoutes:()=>Eh,shouldReplicateToNode:()=>ph,subscribeToNodeUpdates:()=>ad});function $t(){return EG||(EG=ze({table:"hdb_nodes",database:"system",attributes:[{name:"name",isPrimaryKey:!0},{attribute:"subscriptions"},{attribute:"system_info"},{attribute:"url"},{attribute:"routes"},{attribute:"ca"},{attribute:"ca_info"},{attribute:"replicates"},{attribute:"revoked_certificates"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]}))}function od(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function ad(e){$t().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;TG.debug?.("adding node",n,"on node",Ze()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==Ze()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of $t().search({}))if(i.shard!=null){let a=s.get(i.shard);a||s.set(i.shard,a=[]),a.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function ph(e,t){let r=ka.default.get(U.REPLICATION_DATABASES);return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&(r==="*"||r?.find?.(n=>n.name===t&&(!n.sharded||e.shard===ka.default.get(U.REPLICATION_SHARD))))&&$t().primaryStore.get(Ze())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function oae(){ad(e=>{Ga({},(t,r)=>{let n=e.name,s=_G.get(n);if(s||_G.set(n,s=new Map),s.has(r))return;let i;for(let a in t)if(i=t[a].auditStore,i)break;if(i){let a=od(i,r,n,()=>{let c=a[0],l=a.lastTime;for(let{txnTime:u,onConfirm:d}of id.get(r)||[])u>l&&u<=c&&d();a.lastTime=c});a.lastTime=0,s.set(r,a)}})})}function*Eh(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=ka.default.get(U.REPLICATION_SECUREPORT)??(!ka.default.get(U.REPLICATION_PORT)&&ka.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||ka.default.get(U.REPLICATION_PORT)||ka.default.get(U.OPERATIONSAPI_NETWORK_PORT);let a=i?.lastIndexOf?.(":");a>0&&(i=+i.slice(a+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){gG.isMainThread&&console.error("Invalid route, must specify a url or host (with port)");continue}yield{replicates:!t.subscriptions,url:r,subscription:t.subscriptions,routes:t.routes,startTime:t.startTime,revoked_certificates:t.revokedCertificates}}}var gG,SG,ka,TG,EG,_G,id,El=ue(()=>{De();rs();tm();gG=require("worker_threads"),SG=w(ge()),ka=w(oe());k();TG=w(ei());server.nodes=[];o($t,"getHDBNodeTable");o(od,"getReplicationSharedStatus");o(ad,"subscribeToNodeUpdates");o(ph,"shouldReplicateToNode");_G=new Map;XM((e,t,r)=>{if(r>server.nodes.length)throw new SG.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);id||(id=new Map,oae());let n=id.get(e);return n||(n=[],id.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:o(()=>{++i===r&&s()},"onConfirm")})})});o(oae,"startSubscriptionToReplications");o(Eh,"iterateRoutes")});var AG={};Oe(AG,{connectedToNode:()=>_l,disconnectedFromNode:()=>ld,ensureNode:()=>Mo,requestClusterStatus:()=>yG,startOnMainThread:()=>KN});async function KN(e){let t=0,r=st();for(let i of Object.getOwnPropertyNames(r)){let a=r[i];for(let c in a){let l=a[c];if(l.auditStore){Mg.set(i,hh(l.auditStore));break}}}Qi.whenThreadsStarted.then(async()=>{let i=[];for await(let l of r.system.hdb_nodes?.search([])||[])i.push(l);let a=Ze();function c(){let l=$t().primaryStore.get(a);if(l!==null){let u=e.url??qa();if(l===void 0||l.url!==u||l.shard!==e.shard)return Mo(a,{name:a,url:u,shard:e.shard,replicates:!0})}}o(c,"ensureThisNode"),$t().primaryStore.get(a)&&c();for(let l of Eh(e))try{let u=!l.subscriptions;if(u&&await c(),u&&l.replicates==null&&(l.replicates=!0),i.find(d=>d.url===l.url))continue;s(l)}catch(u){console.error(u)}ad(s)});let n;function s(i,a=i?.name){let c=Ze()&&a===Ze()||qa()&&i?.url===qa();if(c){let f=!!i?.replicates;if(n!==void 0&&n!==f)for(let m of $t().search([]))m.replicates&&m.name!==a&&s(m,m.name);n=f}if(ot.trace("Setting up node replication for",i),!i){for(let[f,m]of ji){let h;for(let[p,{worker:_,nodes:g}]of m){let y=g[0];if(y&&y.name==a){h=!0;for(let[T,{worker:R}]of m)m.delete(T),ot.warn("Node was deleted, unsubscribing from node",a,T,f),R?.postMessage({type:"unsubscribe-from-node",node:a,database:T,url:f});break}}if(h){ji.get(f).iterator.remove(),ji.delete(f);return}}return}if(c)return;if(!i.url){ot.info(`Node ${i.name} is missing url`);return}let l=ji.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(ot.info(`Added node ${i.name} at ${i.url} for process ${Ze()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[f,m]of cd)if(i.url===m.url){cd.delete(f);break}cd.set(i.name,i)}let u=st();if(l||(l=new Map,ji.set(i.url,l)),l.iterator=Ga(e,(f,m,h)=>{h?d(m,!0):d(m,!1)}),i.subscriptions)for(let f of i.subscriptions){let m=f.database||f.schema;u[m]||(ot.warn(`Database ${m} not found for node ${i.name}, making a subscription anyway`),d(m,!1))}function d(f,m){ot.trace("Setting up replication for database",f,"on node",i.name);let h=l.get(f),p,_=[{replicateByDefault:m,...i}];Mg.has(f)&&(_.push({replicateByDefault:m,name:Ze(),startTime:Mg.get(f),endTime:Date.now(),replicates:!0}),Mg.delete(f));let g=ph(i,f),y=Qi.workers.filter(T=>T.name==="http");if(h?(p=h.worker,h.nodes=_):g&&(t=t%y.length,p=y[t++],l.set(f,{worker:p,nodes:_,url:i.url}),p?.on("exit",()=>{l.get(f)?.worker===p&&(l.delete(f),d(f,m))})),g)setTimeout(()=>{let T={type:"subscribe-to-node",database:f,nodes:_};p?p.postMessage(T):_h(T)},aae);else{ot.info("Node no longer should be used, unsubscribing from node",{replicates:i.replicates,databaseName:f,node:i,subscriptions:i.subscriptions,hasDatabase:!!u[f],thisReplicates:$t().primaryStore.get(Ze())?.replicates}),$t().primaryStore.get(Ze())?.replicates||(n=!1,ot.info("Disabling replication, this node name",Ze(),$t().primaryStore.get(Ze()),f));let T={type:"unsubscribe-from-node",database:f,url:i.url,name:i.name};p?p.postMessage(T):Ug(T)}}o(d,"onDatabase")}o(s,"onNodeUpdate"),ld=o(function(i){try{ot.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let a=Array.from(cd.keys()),c=a.sort(),l=c.indexOf(i.name||hi(i.url));if(l===-1){ot.warn("Disconnected node not found in node map",i.name,a);return}let u=ji.get(i.url),d=u?.get(i.database);if(!d){ot.warn("Disconnected node not found in replication map",i.database,u);return}if(d.connected=!1,i.finished||!VN.default.get(U.REPLICATION_FAILOVER))return;let f=d.nodes[0];if(!(f.replicates===!0||f.replicates?.sends||f.subscriptions?.length))return;let m=f.shard,h=(l+1)%c.length;for(;l!==h;){let p=c[h],_=cd.get(p);u=ji.get(_.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==m){h=(h+1)%c.length;continue}let{worker:y,nodes:T}=g,R=!1;for(let N of d.nodes){if(T.some(O=>O.name===N.name)){ot.info(`Disconnected node is already failing over to ${p} for ${i.database}`);continue}N.endTime<Date.now()||(T.push(N),R=!0)}if(d.nodes=[d.nodes[0]],!R){ot.info(`Disconnected node ${i.name} has no nodes to fail over to ${p}`);return}ot.info(`Failing over ${i.database} from ${i.name} to ${p}`),y?y.postMessage({type:"subscribe-to-node",database:i.database,nodes:T}):_h({database:i.database,nodes:T});return}ot.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(a){ot.error("Error failing over node",a)}},"disconnectedFromNode"),_l=o(function(i){let a=ji.get(i.url),c=a?.get(i.database);if(!c){ot.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,a);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){ot.warn("Newly connected node has no node subscriptions",i.database,c);return}if(!l.name){ot.debug("Connected node is not named yet",i.database,c);return}c.nodes=[l];let u=!1;for(let d of ji.values()){let f=d.get(i.database);if(!f||f==c)continue;let{worker:m,nodes:h,connected:p}=f;if(h)if(p===!1&&h[0].shard===l.shard)u=!0,c.nodes.push(h[0]);else{let _=h.filter(g=>g&&g.name!==l.name);_.length<h.length&&(f.nodes=_,m.postMessage({type:"subscribe-to-node",database:i.database,nodes:h}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,Qi.onMessageByType)("disconnected-from-node",ld),(0,Qi.onMessageByType)("connected-to-node",_l),(0,Qi.onMessageByType)("request-cluster-status",yG)}function yG(e,t){let r=[];for(let[n,s]of cd)try{let i=ji.get(s.url);ot.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let a=[];if(i){for(let[l,{worker:u,connected:d,nodes:f,latency:m}]of i)a.push({database:l,connected:d,latency:m,threadId:u?.threadId,nodes:f.filter(h=>!(h.endTime<Date.now())).map(h=>h.name)});let c=(0,$N.cloneDeep)(s);c.database_sockets=a,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){ot.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Mo(e,t){let r=$t();e=e??hi(t.url),t.name=e;try{if(t.ca){let s=new RG.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subjectAltName:s.subjectAltName,serialNumber:s.serialNumber,validFrom:s.validFrom,validTo:s.validTo}}}catch(s){ot.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(ot.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!VN.default.get(U.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],a=(0,$N.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of a)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...a,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}ot.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var Qi,vg,ot,$N,VN,RG,aae,ji,ld,_l,cd,Mg,gh=ue(()=>{De();Qi=w(nt());rs();vg=require("worker_threads");El();ot=w(Q()),$N=require("lodash"),VN=w(oe());k();RG=require("crypto"),aae=200,ji=new Map,cd=new Map,Mg=new Map;o(KN,"startOnMainThread");o(yG,"requestClusterStatus");vg.parentPort&&(ld=o(e=>{vg.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),_l=o(e=>{vg.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,Qi.onMessageByType)("subscribe-to-node",e=>{_h(e)}),(0,Qi.onMessageByType)("unsubscribe-from-node",e=>{Ug(e)}));o(Mo,"ensureNode")});var ss=M(Vt=>{"use strict";var hr=require("path"),{watch:cae}=require("chokidar"),Mn=require("fs-extra"),ud=require("node-forge"),CG=require("net"),{generateKeyPair:YN,X509Certificate:vo,createPrivateKey:PG}=require("crypto"),lae=require("util");YN=lae.promisify(YN);var wt=ud.pki,pi=require("joi"),{v4:LG}=require("uuid"),{validateBySchema:QN}=lt(),{forComponent:uae}=Q(),ns=oe(),ws=(k(),v(W)),{CONFIG_PARAMS:Sl}=ws,Ei=bb(),{ClientError:Va}=ge(),Bg=require("node:tls"),{relative:DG,join:dae}=require("node:path"),{CERT_PREFERENCE_APP:NDe,CERTIFICATE_VALUES:bG}=Ei,fae=Uc(),WN=bt(),{table:mae,getDatabases:hae,databases:xg}=(De(),v(mt)),{getJWTRSAKeys:IG}=(Zu(),v(oh)),ht=uae("tls");Vt.generateKeys=ZN;Vt.updateConfigCert=kG;Vt.createCsr=Rae;Vt.signCertificate=yae;Vt.setCertTable=dd;Vt.loadCertificates=BG;Vt.reviewSelfSignedCert=tw;Vt.createTLSSelector=qG;Vt.listCertificates=VG;Vt.addCertificate=Oae;Vt.removeCertificate=Pae;Vt.createNatsCerts=Iae;Vt.generateCertsKeys=bae;Vt.getReplicationCert=Th;Vt.getReplicationCertAuth=Tae;Vt.renewSelfSigned=Nae;Vt.hostnamesFromCert=nw;Vt.getKey=Lae;Vt.getHostnamesFromCertificate=Dae;Vt.getPrimaryHostName=rw;var{urlToNodeName:MG,getThisNodeUrl:pae,getThisNodeName:Hg,clearThisNodeName:Eae}=(rs(),v(Uo)),{readFileSync:_ae,statSync:vG}=require("node:fs"),wDe=oe(),{getTicketKeys:gae,onMessageFromWorkers:Sae}=nt(),$a=Q(),{isMainThread:UG}=require("worker_threads"),{TLSSocket:xG,createSecureContext:ODe}=require("node:tls"),JN=3650,Sh=["127.0.0.1","localhost","::1"],XN=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];Sae(async e=>{e.type===ws.ITC_EVENT_TYPES.RESTART&&(ns.initSync(!0),await tw())});var Qr;function Ya(){return Qr||(Qr=hae().system.hdb_certificate,Qr||(Qr=mae({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__"}]}))),Qr}o(Ya,"getCertTable");async function Th(){let e=qG("operations-api"),t={secureContexts:null,setSecureContext:o(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(Hg());if(!r)return;let n=new vo(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}o(Th,"getReplicationCert");async function Tae(){Ya();let e=(await Th()).options.cert,r=new vo(e).issuer.match(/CN=(.*)/)?.[1];return Qr.get(r)}o(Tae,"getReplicationCertAuth");var NG,Ka=new Map;function BG(){if(NG)return;NG=!0;let e=[{configKey:Sl.TLS},{configKey:Sl.OPERATIONSAPI_TLS}];Ya();let t=hr.dirname(WN.getConfigFilePath()),r;for(let{configKey:n}of e){let s=WN.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let a=i.privateKey,c=a&&DG(dae(t,"keys"),a);c&&wG(a,l=>{Ka.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&UG){let d;wG(u,f=>{if(bG.cert===f)return;let m=i.hostname??i.hostnames??i.host??i.hosts;m&&!Array.isArray(m)&&(m=[m]);let h=GG(u),p=new vo(h),_;try{_=rw(p)}catch(R){ht.error("error extracting host name from certificate",R);return}if(_==null){ht.error("No host name found on certificate");return}if(p.checkIssued(new vo(bG.cert)))return;let g=Qr.primaryStore.get(_),y=vG(u).mtimeMs,T=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&y<=T){y<T&&ht.info(`Certificate ${_} at ${u} is older (${new Date(y)}) than the certificate in the database (${T>1?new Date(T):"only self signed certificate available"})`);return}r=Qr.put({name:_,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:m,fileTimestamp:y,details:{issuer:p.issuer.replace(/\n/g," "),subject:p.subject?.replace(/\n/g," "),subject_alt_name:p.subjectAltName,serial_number:p.serialNumber,valid_from:p.validFrom,valid_to:p.validTo}})},l?"certificate authority":"certificate")}}}}}return r}o(BG,"loadCertificates");function wG(e,t,r){let n,s=o((i,a)=>{try{let c=a.mtimeMs;c&&c!==n&&(n&&UG&&ht.warn(`Reloading ${r}:`,i),n=c,t(GG(i)))}catch(c){ht.error(`Error loading ${r}:`,i,c)}},"loadFile");Mn.existsSync(e)?s(e,vG(e)):ht.error(`${r} file not found:`,e),cae(e,{persistent:!1}).on("change",s)}o(wG,"loadAndWatch");function zN(){let e=pae();if(e==null){let t=Sh[0];return ht.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return MG(e)}o(zN,"getHost");function Fg(){let e=Hg();if(e==null){let t=Sh[0];return ht.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}o(Fg,"getCommonName");async function Rae(){let e=await Th(),t=wt.certificateFromPem(e.options.cert),r=wt.privateKeyFromPem(e.options.key);ht.info("Creating CSR with cert named:",e.name);let n=wt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:Fg()},...XN];ht.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:FG()}];return ht.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),ud.pki.certificationRequestToPem(n)}o(Rae,"createCsr");function FG(){let e=Sh.includes(Fg())?Sh:[...Sh,Fg()];return e.includes(zN())||e.push(zN()),[{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=>CG.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}o(FG,"certExtensions");async function yae(e){let t={},r=hr.join(ns.getHdbBasePath(),ws.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Ya();for await(let d of Qr.search([]))if(d.is_authority&&!d.details.issuer.includes("HarperDB-Certificate-Authority")){if(Ka.has(d.private_key_name)){n=Ka.get(d.private_key_name),s=d;break}else if(d.private_key_name&&await Mn.exists(hr.join(r,d.private_key_name))){n=Mn.readFile(hr.join(r,d.private_key_name)),s=d;break}}if(!n){let d=await jN();s=d.ca,n=d.private_key}n=wt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=wt.certificateFromPem(s.certificate);ht.info("Signing CSR with cert named",s.name);let a=wt.certificationRequestFromPem(e.csr);try{a.verify()}catch(d){return ht.error(d),new Error("Error verifying CSR: "+d.message)}let c=ud.pki.createCertificate();c.serialNumber="0"+Math.random().toString().slice(2,9),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+JN),ht.info("sign cert setting validity:",c.validity),ht.info("sign cert setting subject from CSR:",a.subject.attributes),c.setSubject(a.subject.attributes),ht.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=a.getAttribute({name:"extensionRequest"}).extensions;ht.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=a.publicKey,c.sign(n,ud.md.sha256.create()),t.certificate=wt.certificateToPem(c)}else ht.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}o(yae,"signCertificate");async function Aae(e,t){await dd({name:Hg(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await dd({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:wt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}o(Aae,"createCertificateTable");async function dd(e){let t=new vo(e.certificate);e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},Ya(),await Qr.patch(e)}o(dd,"setCertTable");async function ZN(){let e=await YN("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{publicKey:wt.publicKeyFromPem(e.publicKey),privateKey:wt.privateKeyFromPem(e.privateKey)}}o(ZN,"generateKeys");async function ew(e,t,r){let n=wt.createCertificate();if(!t){let a=await Th();t=wt.certificateFromPem(a.options.cert).publicKey}n.publicKey=t,n.serialNumber="0"+Math.random().toString().slice(2,9),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+JN);let i=[{name:"commonName",value:Fg()},...XN];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(FG()),n.sign(e,ud.md.sha256.create()),wt.certificateToPem(n)}o(ew,"generateCertificates");async function jN(){let e=await VG(),t;for(let r of e){if(!r.is_authority)continue;let n=await $G(r.private_key_name);if(r.private_key_name&&n&&new vo(r.certificate).checkPrivateKey(PG(n))){ht.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;ht.trace("No CA found with matching private key")}o(jN,"getCertAuthority");async function HG(e,t,r=!0){let n=wt.createCertificate();n.publicKey=t,n.serialNumber="0"+Math.random().toString().slice(2,9),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+JN);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${ns.get(Sl.REPLICATION_HOSTNAME)??MG(ns.get(Sl.REPLICATION_URL))??LG().split("-")[0]}`},...XN];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,ud.md.sha256.create());let a=hr.join(ns.getHdbBasePath(),ws.LICENSE_KEY_DIR_NAME),c=hr.join(a,Ei.PRIVATEKEY_PEM_NAME);return r&&await Mn.writeFile(c,wt.privateKeyToPem(e)),n}o(HG,"generateCertAuthority");async function bae(){let{privateKey:e,publicKey:t}=await ZN(),r=await HG(e,t),n=await ew(e,t,r);await Aae(n,r),kG()}o(bae,"generateCertsKeys");async function Iae(){let e=await ew(wt.privateKeyFromPem(Ei.CERTIFICATE_VALUES.key),void 0,wt.certificateFromPem(Ei.CERTIFICATE_VALUES.cert)),t=hr.join(ns.getHdbBasePath(),ws.LICENSE_KEY_DIR_NAME),r=hr.join(t,Ei.NATS_CERTIFICATE_PEM_NAME);await Mn.exists(r)||await Mn.writeFile(r,e);let n=hr.join(t,Ei.NATS_CA_PEM_NAME);await Mn.exists(n)||await Mn.writeFile(n,Ei.CERTIFICATE_VALUES.cert)}o(Iae,"createNatsCerts");async function Nae(){Ya();for await(let e of Qr.search([{attribute:"is_self_signed",value:!0}]))await Qr.delete(e.name);await tw()}o(Nae,"renewSelfSigned");async function tw(){Eae(),await BG(),Ya();let e=await jN();if(!e){ht.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=o(u=>{try{return{key:wt.privateKeyFromPem(Mn.readFileSync(u)),keyPath:u}}catch(d){return ht.warn(`Failed to parse private key from ${u}:`,d.message),{key:null,keyPath:u}}},"tryToParseKey"),n=ns.get(Sl.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let d=r(u.privateKey);if(s=d.key,i=d.keyPath,d.key)break}}else{let u=ns.get(Sl.TLS_PRIVATEKEY),d=r(u);s=d.key,i=d.keyPath}let a=hr.join(ns.getHdbBasePath(),ws.LICENSE_KEY_DIR_NAME),c=DG(a,i);s||(ht.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{privateKey:s}=await ZN(),Mn.existsSync(hr.join(a,Ei.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${LG().split("-")[0]}.pem`),await Mn.writeFile(hr.join(a,c),wt.privateKeyToPem(s)));let l=await HG(s,wt.setRsaPublicKey(s.n,s.e),!1);await dd({name:l.subject.getField("CN").value,uses:["https"],certificate:wt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await Th()){let r=Hg();ht.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await jN();let n=wt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await ew(wt.privateKeyFromPem(e.private_key),s,n);await dd({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}o(tw,"reviewSelfSignedCert");function kG(){let e=fae(Object.keys(ws.CONFIG_PARAM_MAP),!0),t=hr.join(ns.getHdbBasePath(),ws.LICENSE_KEY_DIR_NAME),r=hr.join(t,Ei.PRIVATEKEY_PEM_NAME),n=hr.join(t,Ei.NATS_CERTIFICATE_PEM_NAME),s=hr.join(t,Ei.NATS_CA_PEM_NAME),i=ws.CONFIG_PARAMS,a={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(a[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(a[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,a[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,a[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),WN.updateConfigValue(void 0,void 0,a,!1,!0)}o(kG,"updateConfigCert");function GG(e){return e.startsWith("-----BEGIN")?e:_ae(e,"utf8")}o(GG,"readPEM");var OG=Bg.createSecureContext;Bg.createSecureContext=function(e){if(!e.cert||!e.key)return OG(e);let t={...e};delete t.key,delete t.cert;let r=OG(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var wae=xG.prototype._init;xG.prototype._init=function(e,t){wae.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,a)=>{this.sni_context=a?.context||a,this.certCbDone()})}};var gl=new Map;function qG(e,t){let r=new Map,n,s=!1;return i.initialize=a=>i.ready?i.ready:(a&&(a.secureContexts=r,a.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),gl.clear();let d=0;if(xg===void 0){c();return}for await(let f of xg.system.hdb_certificate.search([])){let m=f.certificate,h=new vo(m);f.is_authority&&(h.asString=m,gl.set(h.subject,m))}for await(let f of xg.system.hdb_certificate.search([]))try{if(f.is_authority)continue;let m=e==="operations-api",h=f.is_self_signed?1:2;m&&f.uses?.includes?.("operations")&&(h+=1);let p=await $G(f.private_key_name),_=f.certificate,g=new vo(_);if(gl.has(g.issuer)&&(_+=`
18
18
  `+gl.get(g.issuer)),!p||!_)throw new Error("Missing private key or certificate for secure server");let y={ciphers:f.ciphers,ticketKeys:gae(),availableCAs:gl,ca:t&&Array.from(gl.values()),cert:_,key:p,key_file:f.private_key_name,is_self_signed:f.is_self_signed};a&&(y.sessionIdContext=a.sessionIdContext);let T=Bg.createSecureContext(y);T.name=f.name,T.options=y,T.quality=h,T.certificateAuthorities=Array.from(gl),T.certStart=_.toString().slice(0,100);let R=f.hostnames??nw(g);Array.isArray(R)||(R=[R]);let N;for(let O of R)if(O){O[0]==="*"&&(s=!0,O=O.slice(1)),O===zN()&&(h+=2),CG.isIP(O)&&(N=!0);let F=r.get(O)?.quality??0;h>F&&r.set(O,T)}else $a.error("No hostname found for certificate at",Bg.certificate);$a.trace("Adding TLS",T.name,"for",a.ports||"client","cert named",f.name,"hostnames",R,"quality",h,"best quality",d),h>d&&(i.defaultContext=n=T,d=h,a&&(a.defaultContext=T))}catch(m){$a.error("Error applying TLS for",f.name,m)}a?.secureContextsListeners.forEach(f=>f()),c(n)}catch(d){l(d)}}o(u,"updateTLS"),xg?.system.hdb_certificate.subscribe({listener:o(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(a,c){$a.info("TLS requested for",a||"(no SNI)");let l=a;for(;;){let d=r.get(l);if(d)return $a.debug("Found certificate for",a,d.certStart),d.updatedContext&&(d=d.updatedContext),c(null,d);if(s&&l){let f=l.indexOf(".",1);f<0?l="":l=l.slice(f)}else break}a?$a.debug("No certificate found to match",a,"using the default certificate"):$a.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):$a.info("No default certificate found"),c(null,u)}o(i,"SNICallback")}o(qG,"createTLSSelector");async function $G(e){let t=Ka.get(e);return!t&&e?await Mn.readFile(hr.join(ns.get(Sl.ROOTPATH),ws.LICENSE_KEY_DIR_NAME,e),"utf8"):t}o($G,"getPrivateKeyByName");async function VG(){Ya();let e=[];for await(let t of Qr.search([]))e.push(t);return e}o(VG,"listCertificates");async function Oae(e){let t=QN(e,pi.object({name:pi.string().required(),certificate:pi.string().required(),is_authority:pi.boolean().required(),private_key:pi.string(),hosts:pi.array(),uses:pi.array()}));if(t)throw new Va(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,a=new vo(n),c=!1,l=!1,u;for(let[h,p]of Ka)!s&&!c&&a.checkPrivateKey(PG(p))&&(c=!0,u=h),s&&s===p&&(l=!0,u=h);if(!i&&!s&&!c)throw new Va("A suitable private key was not found for this certificate");let d;if(!r){try{d=rw(a)}catch(h){ht.error(h)}if(d==null)throw new Va("Error extracting certificate host name, please provide a name parameter")}let f=Cae(r??d);s&&!c&&!l&&(await Mn.writeFile(hr.join(ns.getHdbBasePath(),ws.LICENSE_KEY_DIR_NAME,f+".pem"),s),Ka.set(f,s));let m={name:r??d,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(m.private_key_name=u??f+".pem"),e.ciphers&&(m.ciphers=e.ciphers),await dd(m),"Successfully added certificate: "+f}o(Oae,"addCertificate");function Cae(e){return e.replace(/[^a-z0-9\.]/gi,"-")}o(Cae,"sanitizeName");async function Pae(e){let t=QN(e,pi.object({name:pi.string().required()}));if(t)throw new Va(t.message);let{name:r}=e;Ya();let n=await Qr.get(r);if(!n)throw new Va(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Qr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(ht.info("Removing private key named",s),await Mn.remove(hr.join(ns.getHdbBasePath(),ws.LICENSE_KEY_DIR_NAME,s)))}return await Qr.delete(r),"Successfully removed "+r}o(Pae,"removeCertificate");function rw(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||nw(e)[0]}o(rw,"getPrimaryHostName");function nw(e){if(e.subjectAltName)return e.subjectAltName.split(",").map(r=>{let n=r.indexOf(":");if(r=r.slice(n+1),r=r.trim(),r[0]==='"')try{r=JSON.parse(r)}catch{}return r.indexOf("=")>-1?r.match(/CN=([^,]*)/)?.[1]:r}).filter(r=>r);let t=certObj.subject?.match(/CN=(.*)/)?.[1];return t?[t]:[]}o(nw,"hostnamesFromCert");async function Lae(e){if(e.bypass_auth!==!0)throw new Va("Unauthorized","401");let t=QN(e,pi.object({name:pi.string().required()}));if(t)throw new Va(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await IG()).privateKey;if(r===".jwtPublic")return(await IG()).publicKey;if(Ka.get(r))return Ka.get(e.name);throw new Va("Key not found")}o(Lae,"getKey");function Dae(e){return[e.subject?.CN,...e.subjectaltname.split(",").filter(t=>t.trim().startsWith("DNS:")).map(t=>t.trim().substring(4))]}o(Dae,"getHostnamesFromCertificate")});var mq={};Oe(mq,{CONFIRMATION_STATUS_POSITION:()=>uq,LATENCY_POSITION:()=>Wg,NodeReplicationConnection:()=>hd,OPERATION_REQUEST:()=>aw,RECEIVED_TIME_POSITION:()=>lw,RECEIVED_VERSION_POSITION:()=>cw,RECEIVING_STATUS_POSITION:()=>uw,RECEIVING_STATUS_RECEIVING:()=>fq,RECEIVING_STATUS_WAITING:()=>dq,SENDING_TIME_POSITION:()=>Rh,createWebSocket:()=>zg,databaseSubscriptions:()=>za,replicateOverWS:()=>yh,tableUpdateListeners:()=>fw});async function zg(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=Ze(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!iw){let l=(0,iq.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),iw=u.secureContexts}if(i=iw.get(s),i&&ae.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let a={};r&&(a.Authorization=r);let c={headers:a,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,aq.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(Kg?.caCount!==xo.size&&(Kg=oq.createSecureContext({...i.options,ca:[...xo,...i.options.availableCAs.values()]}),Kg.caCount=xo.size),c.secureContext=Kg),new nq.WebSocket(e,"harperdb-replication-v1",c)}function yh(e,t,r){let n=t.port||t.securePort,s=Rl.pid%1e3+"-"+sq.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3);ae.debug?.(s,"Initializing replication connection",r);let i=0,a=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(a.buffer,0,1024),u=t.database,d=t.databaseSubscriptions||za,f,m,h=!1,p=t.subscription;p?.then&&p.then(E=>{p=E,p.auditStore&&(f=p.auditStore)});let _=t.tables||u&&st()[u],g;if(!r){ae.error?.(s,"No authorization provided"),Ss(1008,"Unauthorized");return}let y=new Map,T=[];g=r.name,g&&t.connection&&(t.connection.nodeName=g);let R,N,O,F,Z,G,Y,q=6e4,K,ce=0,le=0,se=0,pe=rq.default.get(U.REPLICATION_BLOBTIMEOUT)??12e4,Ne=new Map,Ue=[],xe=0,Rr;if(t.url){let E=o(()=>{Z&&le===e._socket?.bytesRead&&se===e._socket?.bytesWritten?e.terminate():(Z=performance.now(),e.ping(),le=e._socket?.bytesRead,se=e._socket?.bytesWritten)},"sendPing");O=setInterval(E,eq).unref(),E()}else Jt();e._socket?.setMaxListeners(200);function Jt(){clearTimeout(F),le=e._socket?.bytesRead,se=e._socket?.bytesWritten,F=setTimeout(()=>{le===e._socket?.bytesRead&&se===e._socket?.bytesWritten&&(ae.warn?.(`Timeout waiting for ping from ${g}, terminating connection and reconnecting`),e.terminate())},eq*2).unref()}o(Jt,"resetPingTimer");function kt(){if(!(!g||!u))return m||(m=od(f,u,g)),m}o(kt,"getSharedStatus"),u&&ga(u);let Xt,Mf,Cc=[],Gt=[],vf,Uf=[],bE=[],IE=[],Dy=150,xf=25,Pe=0,NE=0,Bf=!1,po,Lr,yr,Ff;e.on("message",E=>{ce=performance.now();try{let S=E.dataView=new bl(E.buffer,E.byteOffset,E.byteLength);if(E[0]>127){let P=(0,et.decode)(E),[L,D,H]=P;switch(L){case YG:{if(D){if(g){if(g!==D){ae.error?.(s,`Node name mismatch, expecting to connect to ${g}, but peer reported name as ${D}, disconnecting`),e.send((0,et.encode)([fd])),Ss(1008,"Node name mismatch");return}}else if(g=D,t.connection?.tentativeNode){let B=t.connection.tentativeNode;B.name=g,t.connection.tentativeNode=null,Mo(g,B)}if(t.connection&&(t.connection.nodeName=g),ae.debug?.(s,"received node name:",g,"db:",u??P[2]),!u)try{ga(u=P[2]),u==="system"&&(Xt=Ga(t,(B,de)=>{hu(de)&&Sa(de)}),e.on("close",()=>{Xt?.remove()}))}catch(B){ae.warn?.(s,"Error setting database",B),e.send((0,et.encode)([fd])),Ss(1008,B.message);return}Dr()}break}case XG:{ae.debug?.(s,"Received table definitions for",D.map(B=>B.table));for(let B of D){let de=P[2];B.database=de;let me;hu(de)&&(de==="system"?ke[de]?.[B.table]||(me=V(B,ke[de]?.[B.table])):me=V(B,ke[de]?.[B.table]),f||(f=me?.auditStore),_||(_=st()?.[de]))}break}case fd:Ss();break;case aw:try{let B=r?.replicates||r?.subscribers||r?.name;ae.debug?.("Received operation request",D,"from",g),server.operation(D,{user:r},!B).then(de=>{Array.isArray(de)&&(de={results:de}),de.requestId=D.requestId,e.send((0,et.encode)([Gg,de]))},de=>{e.send((0,et.encode)([Gg,{requestId:D.requestId,error:(0,md.errorToString)(de)}]))})}catch(B){e.send((0,et.encode)([Gg,{requestId:D.requestId,error:(0,md.errorToString)(B)}]))}break;case Gg:let{resolve:C,reject:x}=y.get(D.requestId);D.error?x(new Error(D.error)):C(D),y.delete(D.requestId);break;case sw:let z=P[3];if(!_){u?ae.error?.(s,"No database found for",u):ae.error?.(s,"Database name never received"),Ss();return}let ne=_[z];ne=V({table:z,database:u,attributes:D.attributes,schemaDefined:D.schemaDefined},ne),Cc[H]={name:z,decoder:new et.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:D.typedStructs,structures:D.structures}),getEntry(B){return ne.primaryStore.getEntry(B)},rootStore:ne.primaryStore.rootStore};break;case WG:Ff=f?uG(D,f):new Map,vf=P[2],ae.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${vf}`);break;case zG:let re=H;IE[re]=D;break;case JG:kt()[uq]=D,ae.trace?.(s,"received and broadcasting committed update",D),kt().buffer.notify();break;case QG:R=D,p.send({type:"end_txn",localTime:R,remoteNodeIds:T});break;case qg:{let B=P[1],{fileId:de,size:me,finished:Se,error:ee}=B,j=Ne.get(de);ae.debug?.("Received blob",de,"has stream",!!j,"connectedToBlob",!!j?.connectedToBlob,"length",P[2].length,"finished",Se),j||(j=new ow.PassThrough,j.expectedSize=me,Ne.set(de,j)),j.lastChunk=Date.now();let he=P[2];it(he.byteLength,"bytes-received",`${g}.${u}`,"replication","blob");try{Se?(ee?(j.on("error",()=>{}),j.destroy(new Error("Blob error: "+ee+" for record "+(j.recordId??"unknown")+" from "+g))):j.end(he),j.connectedToBlob&&Ne.delete(de)):j.write(he)}catch(Te){ae.error?.(`Error receiving blob for ${j.recordId} from ${g} and streaming to storage`,Te),Ne.delete(de)}break}case jG:{let B=D,de;try{let me=P[3],Se=Gt[H]||(Gt[H]=_[P[4]]);if(!Se)return ae.warn?.("Unknown table id trying to handle record request",H);let ee=Se.primaryStore.getBinaryFast(Symbol.for("structures")),j=ee?.length??0;if(j>0&&j!==NE){NE=j;let Te=(0,et.decode)(ee);e.send((0,et.encode)([sw,{typedStructs:Te.typed,structures:Te.named},H,Se.tableName]))}let he=Se.primaryStore.getBinaryFast(me);if(he){let Te=Se.primaryStore.decoder.decode(he,{valueAsBuffer:!0}),fe=ut||{};fe.version=(0,cq.getLastVersion)(),ut&&ut[pd]&Vr&&(Te=Buffer.from(Te),cm(()=>Se.primaryStore.decoder.decode(he),We=>_a(We,me),Se.primaryStore.rootStore)),de=(0,et.encode)([kg,B,{value:Te,expiresAt:fe.expiresAt,version:fe.version,residencyId:fe.residencyId,nodeId:fe.nodeId,user:fe.user}])}else de=(0,et.encode)([kg,B])}catch(me){de=(0,et.encode)([kg,B,{error:me.message}])}e.send(de);break}case kg:{let{resolve:B,reject:de,tableId:me,key:Se}=y.get(P[1]),ee=P[2];if(ee?.error)de(new Error(ee.error));else if(ee){let j;XE(()=>{let he=Cc[me].decoder.decode(ee.value);ee.value=he,ee.key=Se,B(ee)||j&&setTimeout(()=>j.forEach(jE),6e4).unref()},f?.rootStore,he=>{let Te=Pc(he,Se);return j||(j=[]),j.push(Te),Te})}else B();y.delete(P[1]);break}case KG:{yr=D;let B,de,me=!1;if(p){if(u!==p.databaseName&&!p.then){ae.error?.("Subscription request for wrong database",u,p.databaseName);return}}else p=d.get(u);if(ae.debug?.(s,"received subscription request for",u,"at",yr),!p){let Ee;p=new Promise(tt=>{ae.debug?.("Waiting for subscription to database "+u),Ee=tt}),p.ready=Ee,za.set(u,p)}if(r.name)de=$t().subscribe(r.name),de.then(async Ee=>{B=Ee;for await(let tt of B){let rt=tt.value;if(!(rt?.replicates===!0||rt?.replicates?.receives||rt?.subscriptions?.some(cr=>(cr.database||cr.schema)===u&&cr.publish!==!1))){me=!0,e.send((0,et.encode)([fd])),Ss(1008,`Unauthorized database subscription to ${u}`);return}}},Ee=>{ae.error?.(s,"Error subscribing to HDB nodes",Ee)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,et.encode)([fd])),Ss(1008,`Unauthorized database subscription to ${u}`);return}if(Lr&&(ae.debug?.(s,"stopping previous subscription",u),Lr.emit("close")),yr.length===0)return;let Se=yr[0],ee=o(Ee=>{if(Ee&&(Se.replicateByDefault?!Se.tables.includes(Ee.tableName):Se.tables.includes(Ee.tableName)))return{table:Ee}},"tableToTableEntry"),j={txnTime:0},he,Te,fe=1/0,We,Et=o((Ee,tt)=>{if(Ee.type==="end_txn"){j.txnTime&&(a[i]!==66&&ae.error?.("Invalid encoding of message"),pu(9),pu(Yg),Dc(We=tt),dt()),i=c,j.txnTime=0;return}let rt=Ee.nodeId,cr=Ee.tableId,Mt=Te[cr];if(!Mt&&(Mt=Te[cr]=ee(p.tableById[cr]),!Mt))return ae.debug?.("Not subscribed to table",cr);let Ts=Mt.table,vt=Ts.primaryStore,Qs=vt.encoder;(Ee.extendedType&Qg||!Qs.typedStructs)&&(Qs._mergeStructures(Qs.getStructures()),Qs.typedStructs&&(Qs.lastTypedStructuresLength=Qs.typedStructs.length));let Eu=he[rt];if(!(Eu&&Eu.startTime<tt&&(!Eu.endTime||Eu.endTime>tt)))return Vg&&ae.trace?.(s,"skipping replication update",Ee.recordId,"to:",g,"from:",rt,"subscribed:",he),XD();Vg&&ae.trace?.(s,"sending replication update",Ee.recordId,"to:",g,"from:",rt,"subscribed:",he);let My=Ee.version;j.txnTime!==My&&(j.txnTime&&(Vg&&ae.trace?.(s,"new txn time, sending queued txn",j.txnTime),a[i]!==66&&ae.error?.("Invalid encoding of message"),dt()),j.txnTime=My,i=c,Dc(My));let Mc=Ee.residencyId,vy=mu(Mc,Ts),OE;if(vy&&!vy.includes(g)){let Js=mu(Ee.previousResidencyId,Ts);if(Js&&!Js.includes(g)&&(Ee.type==="put"||Ee.type==="patch")||Ts.getResidencyById)return XD();let kf=Ee.recordId;ae.trace?.(s,"sending invalidation",kf,g,"from",rt);let Gf=0;Mc&&(Gf|=yl),Ee.previousResidencyId&&(Gf|=Al);let By,CE=null;for(let ZD in Ts.indices){if(!CE){if(By=Ee.getValue(vt,!0),!By)break;CE={}}CE[ZD]=By[ZD]}OE=Tl(Ee.version,cr,kf,null,rt,Ee.user,Ee.type==="put"||Ee.type==="patch"?"invalidate":Ee.type,Qs.encode(CE),Gf,Mc,Ee.previousResidencyId,Ee.expiresAt)}function XD(){return ae.trace?.(s,"skipping audit record",Ee.recordId),G||(G=setTimeout(()=>{G=null,(We||0)+ZG/2<fe&&(Vg&&ae.trace?.(s,"sending skipped sequence update",fe),e.send((0,et.encode)([QG,fe])))},ZG).unref()),new Promise(setImmediate)}o(XD,"skipAuditRecord");let Uy=Qs.typedStructs,xy=Qs.structures;if((Uy?.length!=Mt.typed_length||xy?.length!=Mt.structure_length)&&(Mt.typed_length=Uy?.length,Mt.structure_length=xy.length,ae.debug?.(s,"send table struct",Mt.typed_length,Mt.structure_length),Mt.sentName||(Mt.sentName=!0),e.send((0,et.encode)([sw,{typedStructs:Uy,structures:xy,attributes:Ts.attributes,schemaDefined:Ts.schemaDefined},cr,Mt.table.tableName]))),Mc&&!bE[Mc]&&(e.send((0,et.encode)([zG,vy,Mc])),bE[Mc]=!0),OE)pu(OE.length),Lc(OE);else{let Js=Ee.encoded;Ee.extendedType&Vr&&cm(()=>Ee.getValue(vt),Gf=>_a(Gf,Ee.recordId),vt.rootStore);let kf=Js[0]===66?8:0;pu(Js.length-kf),Lc(Js,kf),ae.trace?.("wrote record",Ee.recordId,"length:",Js.length)}return e._socket.writableNeedDrain?new Promise(Js=>{ae.debug?.(`Waiting for remote node ${g} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Js)}):xe>xf?new Promise(Js=>{Rr=Js}):new Promise(setImmediate)},"sendAuditRecord"),dt=o(()=>{c-i>8?(e.send(a.subarray(i,c)),ae.debug?.(s,"Sent message, size:",c-i),it(c-i,"bytes-sent",`${g}.${u}`,"replication","egress")):ae.debug?.(s,"skipping empty transaction")},"sendQueuedData");Lr=new dw.EventEmitter,Lr.once("close",()=>{me=!0,B?.end()});for(let{startTime:Ee}of yr)Ee<fe&&(fe=Ee);(de||Promise.resolve()).then(async()=>{p=await p,f=p.auditStore,Te=p.tableById.map(ee),he=[];for(let{name:tt,startTime:rt,endTime:cr}of yr){let Mt=Dg(tt,f);ae.debug?.("subscription to",tt,"using local id",Mt,"starting",rt),he[Mt]={startTime:rt,endTime:cr}}Sa(u),Xt||(Xt=Il(tt=>{tt.databaseName===u&&Sa(u)}),Mf=Ah(tt=>{tt===u&&(e.send((0,et.encode)([fd])),Ss())}),e.on("close",()=>{Xt?.remove(),Mf?.remove()})),e.send((0,et.encode)([WG,mh(p.auditStore),yr.map(({name:tt})=>tt)]));let Ee=!0;do{isFinite(fe)||(ae.warn?.("Invalid sequence id "+fe),Ss(1008,"Invalid sequence id"+fe));let tt;if(Ee&&!me&&(Ee=!1,fe===0)){ae.info?.("Replicating all tables to",g);let rt=fe,cr=jg(f);for(let Mt in _){if(!ee(Mt))continue;let Ts=_[Mt];for(let vt of Ts.primaryStore.getRange({snapshot:!1,versions:!0})){if(me)return;if(vt.localTime>=fe){ae.trace?.(s,"Copying record from",u,Mt,vt.key,vt.localTime),rt=Math.max(vt.localTime,rt),tt=!0,kt()[Rh]=1;let Qs=Tl(vt.version,Ts.tableId,vt.key,null,cr,null,"put",cm(()=>Ts.primaryStore.encoder.encode(vt.value),Eu=>_a(Eu,vt.key)),vt.metadataFlags&-256,vt.residencyId,null,vt.expiresAt);await Et({recordId:vt.key,tableId:Ts.tableId,type:"put",getValue(){return vt.value},encoded:Qs,version:vt.version,residencyId:vt.residencyId,nodeId:cr,extendedType:vt.metadataFlags},vt.localTime)}}}tt&&Et({type:"end_txn"},fe),kt()[Rh]=0,fe=rt}for(let{key:rt,value:cr}of f.getRange({start:fe||1,exclusiveStart:!0,snapshot:!1})){if(me)return;let Mt=At(cr);ae.debug?.("sending audit record",new Date(rt)),kt()[Rh]=rt,fe=rt,await Et(Mt,rt),Lr.startTime=rt,tt=!0}tt&&Et({type:"end_txn"},fe),kt()[Rh]=0,await pG(f)}while(!me)}).catch(Ee=>{ae.error?.(s,"Error handling subscription to node",Ee),Ss(1008,"Error handling subscription to node")});break}}return}S.position=8;let A=!0,b,I;do{kt();let P=S.readInt();if(P===9&&S.getUint8(S.position)==Yg){S.position++,R=I=S.readFloat64(),m[cw]=R,m[lw]=Date.now(),m[uw]=dq,ae.trace?.("received remote sequence update",R,u);break}let L=S.position,D=At(E,L,L+P),H=Cc[D.tableId];H||ae.error?.(`No table found with an id of ${D.tableId}`);let C;D.residencyId&&(C=IE[D.residencyId],ae.trace?.(s,"received residency list",C,D.type,D.recordId));try{let x=D.recordId;XE(()=>{b={table:H.name,id:D.recordId,type:D.type,nodeId:Ff.get(D.nodeId),residencyList:C,timestamp:D.version,value:D.getValue(H),user:D.user,beginTxn:A,expiresAt:D.expiresAt}},f?.rootStore,z=>Pc(z,x))}catch(x){throw x.message+="typed structures for current decoder"+JSON.stringify(H.decoder.typedStructs),x}A=!1,ae.trace?.(s,"received replication message",D.type,"id",b.id,"version",new Date(D.version),"nodeId",b.nodeId),m[cw]=D.version,m[lw]=Date.now(),m[uw]=fq,p.send(b),S.position=L+P}while(S.position<E.byteLength);Pe++,it(E.byteLength,"bytes-received",`${g}.${u}.${b?.table||"unknown_table"}`,"replication","ingest"),Pe>Dy&&!Bf&&(Bf=!0,e.pause(),ae.debug?.(`Commit backlog causing replication back-pressure, requesting that ${g} pause replication`)),p.send({type:"end_txn",localTime:R,remoteNodeIds:T,async onCommit(){if(b){let P=Date.now()-b.timestamp;it(P,"replication-latency",g+"."+u+"."+b.table,b.type,"ingest")}Pe--,Bf&&(Bf=!1,e.resume(),ae.debug?.(`Replication resuming ${g}`)),Ue.length>0&&await Promise.all(Ue),ae.trace?.("All blobs finished"),!N&&I&&(ae.trace?.(s,"queuing confirmation of a commit at",I),setTimeout(()=>{e.send((0,et.encode)([JG,N])),ae.trace?.(s,"sent confirmation of a commit at",N),N=null},vae)),N=I,ae.debug?.("last sequence committed",new Date(I),u)}})}catch(S){ae.error?.(s,"Error handling incoming replication message",S)}}),e.on("ping",Jt),e.on("pong",()=>{if(t.connection){let E=performance.now()-Z;t.connection.latency=E,kt()&&(m[Wg]=E),t.isSubscriptionConnection&&_l({name:g,database:u,url:t.url,latency:E})}Z=null}),e.on("close",(E,S)=>{clearInterval(O),clearTimeout(F),clearInterval(Y),Lr&&Lr.emit("close"),po&&po.end();for(let[A,{reject:b}]of y)b(new Error(`Connection closed ${S?.toString()} ${E}`));ae.debug?.(s,"closed",E,S?.toString())});function Ss(E,S){try{e.isFinished=!0,ae.debug?.(s,"closing",g,u,E,S),e.close(E,S),t.connection?.emit("finished")}catch(A){ae.error?.(s,"Error closing connection",A)}}o(Ss,"close");let Ea=new Set;async function _a(E,S){let A=QE(E);if(Ea.has(A)){ae.debug?.("Blob already being sent",A);return}Ea.add(A);try{let b;xe++;for await(let I of E.stream())b&&(ae.debug?.("Sending blob chunk",A,"length",b.length),e.send((0,et.encode)([qg,{fileId:A,size:E.size},b]))),b=I,e._socket.writableNeedDrain&&(ae.debug?.("draining",A),await new Promise(P=>e._socket.once("drain",P)),ae.debug?.("drained",A)),it(I.length,"bytes-sent",`${g}.${u}`,"replication","blob");ae.debug?.("Sending final blob chunk",A,"length",b.length),e.send((0,et.encode)([qg,{fileId:A,size:E.size,finished:!0},b]))}catch(b){ae.warn?.("Error sending blob",b,"blob id",A,"for record",S),e.send((0,et.encode)([qg,{fileId:A,finished:!0,error:(0,md.errorToString)(b)},Buffer.alloc(0)]))}finally{Ea.delete(A),xe--,xe<xf&&Rr?.()}}o(_a,"sendBlobs");function Pc(E,S){let A=QE(E),b=Ne.get(A);ae.debug?.("Received transaction with blob",A,"has stream",!!b,"ended",!!b?.writableEnded),b?b.writableEnded&&Ne.delete(A):(b=new ow.PassThrough,Ne.set(A,b)),b.connectedToBlob=!0,b.lastChunk=Date.now(),b.recordId=S,E.size===void 0&&b.expectedSize&&(E.size=b.expectedSize);let I=b.blob??createBlob(b,E);b.blob=I;let P=So(()=>am(I).saving,p.auditStore?.rootStore);return P&&(P.blobId=A,Ue.push(P),P.finally(()=>{ae.debug?.(`Finished receiving blob stream ${A}`),Ue.splice(Ue.indexOf(P),1)})),I}o(Pc,"receiveBlobs");function Dr(){if(h||(h=!0,t.connection?.on("subscriptions-updated",Dr)),!f&&p&&(f=p.auditStore),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let E=new Map;f||(f=p?.auditStore);try{for(let b of p?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let I of b.value.nodes||[])I.lastTxnTime>(E.get(I.id)??0)&&E.set(I.id,I.lastTxnTime)}catch(b){if(!b.message.includes("Can not re"))throw b}let S=t.connection?.nodeSubscriptions?.[0];T=[];let A=t.connection?.nodeSubscriptions.map((b,I)=>{let P=[],{replicateByDefault:L}=b;if(b.subscriptions){for(let x of b.subscriptions)if(x.subscribe&&(x.schema||x.database)===u){let z=x.table;_?.[z]?.replicate!==!1&&P.push(z)}L=!1}else for(let x in _)(L?_[x].replicate===!1:_[x].replicate)&&P.push(x);let D=f&&Dg(b.name,f),H=p?.dbisDB?.get([Symbol.for("seq"),D])??1,C=Math.max(H?.seqId??1,(typeof b.startTime=="string"?new Date(b.startTime).getTime():b.startTime)??1);if(ae.debug?.("Starting time recorded in db",b.name,D,u,H?.seqId,"start time:",C,new Date(C)),S!==b){let x=f&&Dg(S.name,f),z=p?.dbisDB?.get([Symbol.for("seq"),x])??1;for(let ne of z?.nodes||[])ne.name===b.name&&(C=ne.seqId,ae.debug?.("Using sequence id from proxy node",S.name,C))}if(D===void 0?ae.warn("Starting subscription request from node",b,"but no node id found"):T.push(D),E.get(D)>C&&(C=E.get(D),ae.debug?.("Updating start time from more recent txn recorded",S.name,C)),C===1&&$g)try{new URL($g).hostname===b.name?(ae.warn?.(`Requesting full copy of database ${u} from ${$g}`),C=0):C=Date.now()-6e4}catch(x){ae.error?.("Error parsing leader URL",$g,x)}return ae.trace?.(s,"defining subscription request",b.name,u,new Date(C)),{name:b.name,replicateByDefault:L,tables:P,startTime:C,endTime:b.endTime}});if(A)if(ae.debug?.(s,"sending subscription request",A,p?.dbisDB?.path),clearTimeout(K),A.length>0)e.send((0,et.encode)([KG,A]));else{let b=o(()=>{let I=performance.now();K=setTimeout(()=>{ce<=I?Ss(1008,"Connection has no subscriptions and is no longer used"):b()},q).unref()},"scheduleClose");b()}}o(Dr,"sendSubscriptionRequestUpdate");function mu(E,S){if(!E)return;let A=Uf[E];return A||(A=S.getResidencyRecord(E),Uf[E]=A),A}o(mu,"getResidence");function hu(E){return!(Wa&&Wa!="*"&&!Wa[E]&&!Wa.includes?.(E)&&!Wa.some?.(S=>S.name===E))}o(hu,"checkDatabaseAccess");function ga(E){if(p=p||d.get(E),!hu(E))throw new Error(`Access to database "${E}" is not permitted`);p||ae.warn?.(`No database named "${E}" was declared and registered`),f=p?.auditStore,_||(_=st()?.[E]);let S=Ze();if(S===g)throw S?new Error("Should not connect to self",S):new Error("Node name not defined");return wE(S,E),!0}o(ga,"setDatabase");function wE(E,S){let A=st()?.[S],b=[];for(let I in A){let P=A[I];b.push({table:I,schemaDefined:P.schemaDefined,attributes:P.attributes.map(L=>({name:L.name,type:L.type,isPrimaryKey:L.isPrimaryKey}))})}ae.trace?.("Sending database info for node",E,"database name",S),e.send((0,et.encode)([YG,E,S,b]))}o(wE,"sendNodeDBName");function Sa(E){let S=st()?.[E],A=[];for(let b in S){if(yr&&!yr.some(P=>P.replicateByDefault?!P.tables.includes(b):P.tables.includes(b)))continue;let I=S[b];A.push({table:b,schemaDefined:I.schemaDefined,attributes:I.attributes.map(P=>({name:P.name,type:P.type,isPrimaryKey:P.isPrimaryKey}))})}e.send((0,et.encode)([XG,A,E]))}o(Sa,"sendDBSchema"),Y=setInterval(()=>{for(let[E,S]of Ne)S.lastChunk+pe<Date.now()&&(ae.warn?.(`Timeout waiting for blob stream to finish ${E} for record ${S.recordId??"unknown"} from ${g}`),Ne.delete(E),S.end())},pe).unref();let Ta=1,Hf=[];return{end(){po&&po.end(),Lr&&Lr.emit("close")},getRecord(E){let S=Ta++;return new Promise((A,b)=>{let I=[jG,S,E.table.tableId,E.id];Hf[E.table.tableId]||(I.push(E.table.tableName),Hf[E.table.tableId]=!0),e.send((0,et.encode)(I)),ce=performance.now(),y.set(S,{tableId:E.table.tableId,key:E.id,resolve(P){let{table:L,entry:D}=E;if(A(P),P)return L._recordRelocate(D,P)},reject:b})})},sendOperation(E){let S=Ta++;return E.requestId=S,e.send((0,et.encode)([aw,E])),new Promise((A,b)=>{y.set(S,{resolve:A,reject:b})})}};function pu(E){Ra(5),E<128?a[c++]=E:E<16384?(l.setUint16(c,E|32768),c+=2):E<1056964608?(l.setUint32(c,E|3221225472),c+=4):(a[c]=255,l.setUint32(c+1,E),c+=5)}function Lc(E,S=0,A=E.length){let b=A-S;Ra(b),E.copy(a,c,S,A),c+=b}function Dc(E){Ra(8),l.setFloat64(c,E),c+=8}function Ra(E){if(E+16>a.length-c){let S=Buffer.allocUnsafeSlow(c+E-i+65536>>10<<11);a.copy(S,0,i,c),c=c-i,i=0,a=S,l=new DataView(a.buffer,0,a.length)}}function V(E,S){let A=E.database??"data";if(A!=="data"&&!ke[A]){ae.warn?.("Database not found",E.database);return}S||(S={});let b=S.schemaDefined,I=!1,P=E.schemaDefined,L=S.attributes||[];for(let D=0;D<E.attributes?.length;D++){let H=E.attributes[D],C=L.find(x=>x.name===H.name);(!C||C.type!==H.type)&&(b?ae.error?.(`Schema for '${u}.${E.table}' is defined locally, but attribute '${H.name}: ${H.type}' from '${g}' does not match local attribute ${C?"'"+C.name+": "+C.type+"'":"which does not exist"}`):(I=!0,P||(H.indexed=!0),C?L[L.indexOf(C)]=H:L.push(H)))}return I?(ae.debug?.("(Re)creating",E),ze({table:E.table,database:E.database,schemaDefined:E.schemaDefined,attributes:L,...S})):S}}var rq,et,nq,sq,md,dw,iq,oq,Rl,aq,ow,cq,lq,ae,KG,YG,WG,fd,zG,sw,jG,kg,aw,Gg,QG,JG,XG,qg,uq,cw,lw,Rh,Wg,uw,dq,fq,Mae,$g,fw,za,Vg,ZG,vae,eq,iw,Kg,tq,hd,mw=ue(()=>{De();Mi();BN();GN();rs();rq=w(oe());k();$c();et=require("msgpackr"),nq=require("ws"),sq=require("worker_threads"),md=w(Q());gh();dw=require("events"),iq=w(ss()),oq=w(require("node:tls"));El();Rl=w(require("node:process")),aq=require("node:net");Yi();Kn();ow=require("node:stream"),cq=require("lmdb"),lq=w(require("minimist")),ae=(0,md.forComponent)("replication").conditional,KG=129,YG=140,WG=141,fd=142,zG=130,sw=132,jG=133,kg=134,aw=136,Gg=137,QG=143,JG=144,XG=145,qg=146,uq=0,cw=1,lw=2,Rh=3,Wg=4,uw=5,dq=0,fq=1,Mae=(0,lq.default)(Rl.argv),$g=Mae.HDB_LEADER_URL??Rl.env.HDB_LEADER_URL,fw=new Map,za=new Map,Vg=!0,ZG=300,vae=2,eq=3e4;o(zg,"createWebSocket");tq=500,hd=class extends dw.EventEmitter{static{o(this,"NodeReplicationConnection")}socket;startTime;retryTime=tq;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;url;subscription;databaseName;nodeName;authorization;constructor(t,r,n,s,i){super(),this.url=t,this.subscription=r,this.databaseName=n,this.authorization=i,this.nodeName=this.nodeName??hi(t)}async connect(){this.session||this.resetSession();let t=[];this.socket=await zg(this.url,{serverName:this.nodeName,authorization:this.authorization});let r;ae.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${Rl.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ae[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=tq,this.nodeSubscriptions&&_l({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,r=yh(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(r)}),this.socket.on("error",n=>{n.code==="SELF_SIGNED_CERT_IN_CHAIN"?(ae.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),n.isHandled=!0):n.code!=="ECONNREFUSED"&&(n.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?ae.error?.(`Can not connect to ${this.url}, the certificate provided by ${this.url} is not trusted, this node needs to be added to the cluster, or a certificate authority needs to be added`):ae.error?.(`Error in connection to ${this.url} due to ${n.message}`)),this.sessionReject(n)}),this.socket.on("close",(n,s)=>{if(this.isConnected&&(this.nodeSubscriptions&&ld({name:this.nodeName,database:this.databaseName,url:this.url,finished:this.socket.isFinished}),this.isConnected=!1),this.removeAllListeners("subscriptions-updated"),this.socket.isFinished){this.isFinished=!0,r?.end(),this.emit("finished");return}if(++this.retries%20===1){let i=s?.toString();ae.warn?.(`${r?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${i?'"'+i+'" ':""}(code: ${n})`)}r=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((t,r)=>{this.sessionResolve=t,this.sessionReject=r})}subscribe(t,r){this.nodeSubscriptions=t,this.replicateTablesByDefault=r,this.emit("subscriptions-updated",t)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(t){return this.session.then(r=>r.getRecord(t))}};o(yh,"replicateOverWS")});var Uo={};Oe(Uo,{clearThisNodeName:()=>$ae,disableReplication:()=>Fae,enabledDatabases:()=>Wa,forEachReplicatedDatabase:()=>Ga,getThisNodeId:()=>jg,getThisNodeName:()=>Ze,getThisNodeUrl:()=>qa,hostnameToUrl:()=>tS,lastTimeInAuditStore:()=>hh,monitorNodeCAs:()=>yq,replicateOperation:()=>Kae,replicationCertificateAuthorities:()=>xo,sendOperationToNode:()=>bh,servers:()=>xae,setReplicator:()=>bq,start:()=>Bae,startOnMainThread:()=>KN,subscribeToNode:()=>_h,unsubscribeFromNode:()=>Ug,urlToNodeName:()=>hi});function Bae(e){if(!e.port&&!e.securePort&&(e.port=Os.default.get(U.OPERATIONSAPI_NETWORK_PORT),e.securePort=Os.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),!Ze())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of Eh(e))t.set(hi(s.url),s);Hae(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=Le.ws(async(s,i,a,c)=>{if(Ot.debug("Incoming WS connection received "+i.url),i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,a);await a,s._socket.unref(),yh(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&Ot.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Le.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){Ot.debug("Incoming replication WS connection received, authorized: "+s.authorized),!s.authorized&&s._nodeRequest.socket.authorizationError&&Ot.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let a=$t().primaryStore;if(s.authorized&&s.peerCertificate.subjectaltname){let c=(0,Tq.getHostnamesFromCertificate)(s.peerCertificate),l;for(let u of c)if(l=u&&(a.get(u)||t.get(u)),l)break;if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){Ot.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else Ot.warn(`No node found for certificate common name/SANs: ${c}, available nodes are ${Array.from(a.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=a.get(s.ip)||t.get(s.ip);c?s.user=c:Ot.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...a.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=o(()=>{let a=new Set(s.secureContexts.values());s.defaultContext&&a.add(s.defaultContext);for(let c of a)try{let l=Array.from(xo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=eS.createSecureContext(u)}catch(l){Ot.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Os.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1&&i()}yq(()=>{for(let s of n)s()})}function yq(e){let t=0;ad(r=>{r?.ca&&(xo.add(r.ca),xo.size!==t&&(t=xo.size,e?.()))})}function Fae(e=!0){Rq=e}function Hae(e){Rq||(st(),Wa=e.databases,Ga(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||za;for(let[s,i]of Xg){let a=i.get(r);a&&(a.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];bq(r,s,e),fw.get(s)?.forEach(i=>i(s))}}))}function bq(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 Aq extends Fr{static{o(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||za,a=i.get(e),c=a?.tableById||[];c[t.tableId]=t;let l=a?.ready;if(Ot.trace("Setting up replicator subscription to database",e),!a?.auditStore)return this.subscription=a=new Vn,i.set(e,a),a.tableById=c,a.auditStore=t.auditStore,a.dbisDB=t.dbisDB,a.databaseName=e,l&&l(a),a;this.subscription=a}static subscribeOnThisThread(i,a){return!0}static async load(i){if(i){let a=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),a]);if(c){let l,u=new Set;do{let d,f="",m=1/0;for(let p of c){if(u.has(p)||p===Le.hostname)continue;let _=Gae(p,Aq.subscription,e);if(_?.isConnected){let g=od(t.auditStore,e,p)[Wg];(!d||g<m)&&(d=_,f=p,m=g)}}if(!d)throw l||new gq.ServerError(`No connection to any other nodes are available: ${c}`,502);let h={requestId:Uae++,table:t,entry:i,id:i.key};u.add(f);try{return await d.getRecord(h)}catch(p){if(d.isConnected)throw p;Ot.warn("Error in load from node",Zg,p),l||(l=p)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function kae(e,t,r,n,s){let i=Xg.get(e);i||Xg.set(e,i=new Map);let a=i.get(r);if(a)return a;if(t)return i.set(r,a=new hd(e,t,r,n,s)),a.connect(),a.once("finished",()=>i.delete(r)),a}function Gae(e,t,r){let n=hq.get(e);n||(n=new Map,hq.set(e,n));let s=n.get(r);if(s)return s;let i=$t().primaryStore.get(e);return i?.url&&(s=new hd(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function bh(e,t,r){r||(r={}),r.serverName=e.name;let n=await zg(e.url,r),s=yh(n,{},{});return new Promise((i,a)=>{n.on("open",()=>{Ot.debug("Sending operation connection to "+e.url+" opened",t),i(s.sendOperation(t))}),n.on("error",c=>{a(c)}),n.on("close",c=>{Ot.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function _h(e){try{Sq.isMainThread&&Ot.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=za.get(e.database);if(!t){let n;t=new Promise(s=>{Ot.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,za.set(e.database,t)}let r=kae(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=>ph(n,e.database)),e.replicateByDefault)}catch(t){Ot.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function Ug({name:e,url:t,database:r}){Ot.trace("Unsubscribing from node",e,t,r,"nodes",Array.from($t().primaryStore.getRange({})));let n=Xg.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function qae(){if(hw!==void 0)return hw;let e=Os.default.get(U.OPERATIONSAPI_TLS_CERTIFICATE)||Os.default.get(U.TLS_CERTIFICATE);if(e)return hw=new Eq.X509Certificate((0,_q.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function Ze(){return Zg||(Zg=Os.default.get("replication_hostname")??hi(Os.default.get("replication_url"))??qae()??pq("operationsapi_network_secureport")??pq("operationsapi_network_port")??"127.0.0.1")}function $ae(){Zg=void 0}function pq(e){let t=Os.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function Jg(e){let t=Os.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function jg(e){return mh(e)?.[Ze()]}function qa(){let e=Os.default.get("replication_url");return e||tS(Ze())}function tS(e){let t=Jg("replication_port");if(t)return`ws://${e}:${t}`;if(t=Jg("replication_secureport"),t)return`wss://${e}:${t}`;if(t=Jg("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=Jg("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function hi(e){if(e)return new URL(e).hostname}function Ga(e,t){for(let n of Object.getOwnPropertyNames(ke))r(n);return Ah(n=>{r(n)}),Il((n,s)=>{r(n.databaseName)});function r(n){let s=ke[n];Ot.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):Vae(n)&&t(s,n,!1)}o(r,"forDatabase")}function Vae(e){let t=ke[e];for(let r in t)if(t[r].replicate)return!0}function hh(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function Kae(e){let t={message:""};if(e.replicated){e.replicated=!1,Ot.trace?.("Replicating operation",e.operation,"to nodes",Le.nodes.map(n=>n.name));let r=await Promise.allSettled(Le.nodes.map(n=>bh(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Le.nodes[s]?.name,i})}return t}var Os,Ot,Eq,_q,eS,gq,Sq,Tq,Rq,Uae,xae,xo,Wa,Xg,hq,hw,Zg,rs=ue(()=>{De();xa();Tu();mw();Mr();Os=w(oe()),Ot=w(Q()),Eq=require("crypto"),_q=require("fs");gh();El();k();BN();eS=w(require("node:tls")),gq=w(ge()),Sq=require("worker_threads"),Tq=w(ss()),Uae=1,xae=[],xo=Os.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1?new Set(eS.rootCertificates):new Set;o(Bae,"start");o(yq,"monitorNodeCAs");o(Fae,"disableReplication");o(Hae,"assignReplicationSource");o(bq,"setReplicator");Xg=new Map;o(kae,"getSubscriptionConnection");hq=new Map;o(Gae,"getRetrievalConnectionByName");o(bh,"sendOperationToNode");o(_h,"subscribeToNode");o(Ug,"unsubscribeFromNode");o(qae,"getCommonNameFromCert");o(Ze,"getThisNodeName");o($ae,"clearThisNodeName");Object.defineProperty(Le,"hostname",{get(){return Ze()}});o(pq,"getHostFromListeningPort");o(Jg,"getPortFromListeningPort");o(jg,"getThisNodeId");Le.replication={getThisNodeId:jg,exportIdMapping:mh};o(qa,"getThisNodeUrl");o(tS,"hostnameToUrl");o(hi,"urlToNodeName");o(Ga,"forEachReplicatedDatabase");o(Vae,"hasExplicitlyReplicatedTable");o(hh,"lastTimeInAuditStore");o(Kae,"replicateOperation")});var Nh=M((eMe,Cq)=>{"use strict";var Ed=Mk(),{validateBySchema:Ih}=lt(),{commonValidators:_d,schemaRegex:pw}=Bi(),pr=require("joi"),Yae=Q(),Wae=require("uuid").v4,sS=Co(),gd=(k(),v(W)),zae=require("util"),ja=jn(),{handleHDBError:Bo,hdbErrors:jae,ClientError:Nl}=ge(),{HDB_ERROR_MSGS:rS,HTTP_STATUS_CODES:Fo}=jae,{SchemaEventMsg:iS}=ai(),Iq=mr(),{getDatabases:Qae}=(De(),v(mt)),{transformReq:Sd}=ie(),{replicateOperation:Nq}=(rs(),v(Uo)),{cleanupOrphans:Jae}=(Kn(),v(ZE)),nS=pr.string().min(1).max(_d.schema_length.maximum).pattern(pw).messages({"string.pattern.base":"{:#label} "+_d.schema_format.message}),Xae=pr.string().min(1).max(_d.schema_length.maximum).pattern(pw).messages({"string.pattern.base":"{:#label} "+_d.schema_format.message}).required(),Zae=pr.string().min(1).max(_d.schema_length.maximum).pattern(pw).messages({"string.pattern.base":"{:#label} "+_d.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();Cq.exports={createSchema:ece,createSchemaStructure:wq,createTable:tce,createTableStructure:Oq,createAttribute:oce,dropSchema:rce,dropTable:nce,dropAttribute:sce,getBackup:ace,cleanupOrphanBlobs:cce};async function ece(e){let t=await wq(e);return sS.signalSchemaChange(new iS(process.pid,e.operation,e.schema)),t}o(ece,"createSchema");async function wq(e){let t=Ih(e,pr.object({database:nS,schema:nS}));if(t)throw new Nl(t.message);if(Sd(e),!await Ed.checkSchemaExists(e.schema))throw Bo(new Error,rS.SCHEMA_EXISTS_ERR(e.schema),Fo.BAD_REQUEST,gd.LOG_LEVELS.ERROR,rS.SCHEMA_EXISTS_ERR(e.schema),!0);return await ja.createSchema(e),`database '${e.schema}' successfully created`}o(wq,"createSchemaStructure");async function tce(e){return Sd(e),e.hash_attribute=e.primary_key??e.hash_attribute,await Oq(e)}o(tce,"createTable");async function Oq(e){let t=Ih(e,pr.object({database:nS,schema:nS,table:Xae,residence:pr.array().items(pr.string().min(1)).optional(),hash_attribute:Zae}));if(t)throw new Nl(t.message);if(!await Ed.checkSchemaTableExists(e.schema,e.table))throw Bo(new Error,rS.TABLE_EXISTS_ERR(e.schema,e.table),Fo.BAD_REQUEST,gd.LOG_LEVELS.ERROR,rS.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Wae(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await ja.createTable(n,e);else throw Bo(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Fo.BAD_REQUEST);else await ja.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}o(Oq,"createTableStructure");async function rce(e){let t=Ih(e,pr.object({database:pr.string(),schema:pr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Nl(t.message);Sd(e);let r=await Ed.checkSchemaExists(e.schema);if(r)throw Bo(new Error,r,Fo.NOT_FOUND,gd.LOG_LEVELS.ERROR,r,!0);let n=await Ed.schemaDescribe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await ja.dropSchema(e),sS.signalSchemaChange(new iS(process.pid,e.operation,e.schema)),await Iq.purgeSchemaTableStreams(e.schema,s);let i=await Nq(e);return i.message=`successfully deleted '${e.schema}'`,i}o(rce,"dropSchema");async function nce(e){let t=Ih(e,pr.object({database:pr.string(),schema:pr.string(),table:pr.string().required()}));if(t)throw new Nl(t.message);Sd(e);let r=await Ed.checkSchemaTableExists(e.schema,e.table);if(r)throw Bo(new Error,r,Fo.NOT_FOUND,gd.LOG_LEVELS.ERROR,r,!0);await ja.dropTable(e),await Iq.purgeTableStream(e.schema,e.table);let n=await Nq(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}o(nce,"dropTable");async function sce(e){let t=Ih(e,pr.object({database:pr.string(),schema:pr.string(),table:pr.string().required(),attribute:pr.string().required()}));if(t)throw new Nl(t.message);Sd(e);let r=await Ed.checkSchemaTableExists(e.schema,e.table);if(r)throw Bo(new Error,r,Fo.NOT_FOUND,gd.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw Bo(new Error,"You cannot drop a hash attribute",Fo.BAD_REQUEST,void 0,void 0,!0);if(gd.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw Bo(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Fo.BAD_REQUEST,void 0,void 0,!0);try{return await ja.dropAttribute(e),ice(e),sS.signalSchemaChange(new iS(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw Yae.error(`Got an error deleting attribute ${zae.inspect(e)}.`),n}}o(sce,"dropAttribute");function ice(e){let t=Object.values(global.hdb_schema[e.schema][e.table].attributes);for(let r=0;r<t.length;r++)t[r].attribute===e.attribute&&global.hdb_schema[e.schema][e.table].attributes.splice(r,1)}o(ice,"dropAttributeFromGlobal");async function oce(e){Sd(e);let t=Qae()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw Bo(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Fo.BAD_REQUEST,void 0,void 0,!0);return await ja.createAttribute(e),sS.signalSchemaChange(new iS(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}o(oce,"createAttribute");function ace(e){return ja.getBackup(e)}o(ace,"getBackup");function cce(e){if(!e.database)throw new Nl('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new Nl(`Unknown database '${e.database}'`);return Jae(databases[e.database],e.database),{message:"Orphaned blobs cleanup started, check logs for progress"}}o(cce,"cleanupOrphanBlobs")});var Lq=M((rMe,Pq)=>{"use strict";var{OPERATIONS_ENUM:lce}=(k(),v(W)),Ew=class{static{o(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=lce.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};Pq.exports=Ew});var _w=M((iMe,xq)=>{"use strict";var uce=jn(),sMe=Lq(),oS=ie(),aS=(k(),v(W)),dce=oe(),{handleHDBError:Dq,hdbErrors:fce}=ge(),{HDB_ERROR_MSGS:Mq,HTTP_STATUS_CODES:vq}=fce,mce=Object.values(aS.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),Uq="To use this operation audit log must be enabled in harperdb-config.yaml";xq.exports=hce;async function hce(e){if(oS.isEmpty(e.schema))throw new Error(Mq.SCHEMA_REQUIRED_ERR);if(oS.isEmpty(e.table))throw new Error(Mq.TABLE_REQUIRED_ERR);if(!dce.get(aS.CONFIG_PARAMS.LOGGING_AUDITLOG))throw Dq(new Error,Uq,vq.BAD_REQUEST,aS.LOG_LEVELS.ERROR,Uq,!0);let t=oS.checkSchemaTableExist(e.schema,e.table);if(t)throw Dq(new Error,t,vq.NOT_FOUND,aS.LOG_LEVELS.ERROR,t,!0);if(!oS.isEmpty(e.search_type)&&mce.indexOf(e.search_type)<0)throw new Error(`Invalid searchType '${read_audit_log_object.search_type}'`);return await uce.readAuditLog(e)}o(hce,"readAuditLog")});var Fq=M((aMe,Bq)=>{"use strict";var{OPERATIONS_ENUM:pce}=(k(),v(W)),gw=class{static{o(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=pce.GET_BACKUP,this.schema=t,this.table=r}};Bq.exports=gw});var Gq=M((dMe,kq)=>{"use strict";var Ece=jn(),lMe=Fq(),Sw=ie(),_ce=(k(),v(W)),uMe=oe(),{handleHDBError:gce,hdbErrors:Sce}=ge(),{HDB_ERROR_MSGS:Hq,HTTP_STATUS_CODES:Tce}=Sce;kq.exports=Rce;async function Rce(e){if(Sw.isEmpty(e.schema))throw new Error(Hq.SCHEMA_REQUIRED_ERR);if(Sw.isEmpty(e.table))throw new Error(Hq.TABLE_REQUIRED_ERR);let t=Sw.checkSchemaTableExist(e.schema,e.table);if(t)throw gce(new Error,t,Tce.NOT_FOUND,_ce.LOG_LEVELS.ERROR,t,!0);return await Ece.getBackup(readAuditLogObject)}o(Rce,"getBackup")});var Kq=M((mMe,Vq)=>{"use strict";var yce=oe(),Qa=require("joi"),Ace=lt(),qq=require("moment"),bce=require("fs-extra"),Tw=require("path"),Ice=require("lodash"),wh=(k(),v(W)),{LOG_LEVELS:wl}=(k(),v(W)),Nce="YYYY-MM-DD hh:mm:ss",wce=Tw.resolve(__dirname,"../logs");Vq.exports=function(e){return Ace.validateBySchema(e,Oce)};var Oce=Qa.object({from:Qa.custom($q),until:Qa.custom($q),level:Qa.valid(wl.NOTIFY,wl.FATAL,wl.ERROR,wl.WARN,wl.INFO,wl.DEBUG,wl.TRACE),order:Qa.valid("asc","desc"),limit:Qa.number().min(1),start:Qa.number().min(0),log_name:Qa.custom(Cce)});function $q(e,t){if(qq(e,qq.ISO_8601).format(Nce)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}o($q,"validateDatetime");function Cce(e,t){if(Ice.invert(wh.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=yce.get(wh.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?wh.LOG_NAMES.HDB:e,i=s===wh.LOG_NAMES.INSTALL?Tw.join(wce,wh.LOG_NAMES.INSTALL):Tw.join(n,s);return bce.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}o(Cce,"validateReadLogPath")});var yw=M((pMe,Wq)=>{"use strict";var cS=(k(),v(W)),Pce=Q(),Lce=oe(),Dce=Kq(),Rw=require("path"),Yq=require("fs-extra"),{once:Mce}=require("events"),{handleHDBError:vce,hdbErrors:Uce}=ge(),{PACKAGE_ROOT:xce}=Rt(),{replicateOperation:Bce}=(rs(),v(Uo)),Fce=Rw.join(xce,"logs"),Hce=1e3,kce=200;Wq.exports=Gce;async function Gce(e){let t=Dce(e);if(t)throw vce(t,t.message,Uce.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=Bce(e),n=Lce.get(cS.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e.log_name===void 0?cS.LOG_NAMES.HDB:e.log_name,i=s===cS.LOG_NAMES.INSTALL?Rw.join(Fce,cS.LOG_NAMES.INSTALL):Rw.join(n,s),a=e.level!==void 0,c=a?e.level:void 0,l=e.from!==void 0,u=l?new Date(e.from):void 0,d=e.until!==void 0,f=d?new Date(e.until):void 0,m=e.limit===void 0?Hce:e.limit,h=e.order===void 0?void 0:e.order,p=e.start===void 0?0:e.start,_=p+m,g=0;h==="desc"&&!u&&!f&&(g=Math.max(Yq.statSync(i).size-(_+5)*kce,0));let y=Yq.createReadStream(i,{start:g});y.on("error",G=>{Pce.error(G)});let T=0,R=[],N="",O;y.on("data",G=>{let Y=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;G=N+G;let q=0,K;for(;(K=Y.exec(G))&&!y.destroyed;){O&&(O.message=G.slice(q,K.index),F(O));let[ce,le,se]=K,pe=se.split("] ["),Ne=pe[0],Ue=pe[1];pe.splice(0,2),O={timestamp:le,thread:Ne,level:Ue,tags:pe,message:""},q=K.index+ce.length}N=G.slice(q)}),y.on("end",G=>{y.destroyed||O&&(O.message=N.trim(),F(O))}),y.resume();function F(G){let Y,q,K;switch(!0){case(a&&l&&d):Y=new Date(G.timestamp),q=new Date(u),K=new Date(f),G.level===c&&Y>=q&&Y<=K&&T<p?T++:G.level===c&&Y>=q&&Y<=K&&(Ji(G,h,R),T++,T===_&&y.destroy());break;case(a&&l):Y=new Date(G.timestamp),q=new Date(u),G.level===c&&Y>=q&&T<p?T++:G.level===c&&Y>=q&&(Ji(G,h,R),T++,T===_&&y.destroy());break;case(a&&d):Y=new Date(G.timestamp),K=new Date(f),G.level===c&&Y<=K&&T<p?T++:G.level===c&&Y<=K&&(Ji(G,h,R),T++,T===_&&y.destroy());break;case(l&&d):Y=new Date(G.timestamp),q=new Date(u),K=new Date(f),Y>=q&&Y<=K&&T<p?T++:Y>=q&&Y<=K&&(Ji(G,h,R),T++,T===_&&y.destroy());break;case a:G.level===c&&T<p?T++:G.level===c&&(Ji(G,h,R),T++,T===_&&y.destroy());break;case l:Y=new Date(G.timestamp),q=new Date(u),Y>=q&&T<p?T++:Y>=q&&T>=p&&(Ji(G,h,R),T++,T===_&&y.destroy());break;case d:Y=new Date(G.timestamp),K=new Date(f),Y<=K&&T<p?T++:Y<=K&&T>=p&&(Ji(G,h,R),T++,T===_&&y.destroy());break;default:T<p?T++:(Ji(G,h,R),T++,T===_&&y.destroy())}}o(F,"onLogMessage"),await Mce(y,"close");let Z=await r;if(Z.replicated){for(let G of R)G.node=server.hostname;for(let G of Z.replicated){let Y=G.node;if(G.status==="failed")Ji({timestamp:new Date().toISOString(),level:"error",node:Y,message:`Error retrieving logs: ${G.reason}`},h,R);else for(let q of G.results)q.node=Y,Ji(q,h,R)}}return R}o(Gce,"readLog");function Ji(e,t,r){t==="desc"?qce(e,r):t==="asc"?$ce(e,r):r.push(e)}o(Ji,"pushLineToResult");function qce(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)>r?n=i+1:s=i}t.splice(n,0,e)}o(qce,"insertDescending");function $ce(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)<r?n=i+1:s=i}t.splice(n,0,e)}o($ce,"insertAscending")});var lS=M((RMe,Jq)=>{"use strict";var Aw=require("joi"),{string:Td,boolean:zq,date:Vce}=Aw.types(),Kce=lt(),{validateSchemaExists:_Me,validateTableExists:gMe,validateSchemaName:SMe}=Bi(),Yce=(k(),v(W)),Wce=It(),jq=oe();jq.initSync();var TMe=Td.invalid(jq.get(Yce.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Wce.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),Qq={operation:Td.valid("add_node","update_node","set_node_replication"),node_name:Td.optional(),subscriptions:Aw.array().items({table:Td.optional(),schema:Td.optional(),database:Td.optional(),subscribe:zq.required(),publish:zq.required().custom(jce),start_time:Vce.iso()})};function zce(e){return Kce.validateBySchema(e,Aw.object(Qq))}o(zce,"addUpdateNodeValidator");function jce(e,t){if(t.state.ancestors[2].operation==="add_node"&&e===!1&&t.state.ancestors[0].subscribe===!1)return t.message(`'subscriptions[${t.state.path[1]}]' subscribe and/or publish must be set to true when adding a node`)}o(jce,"checkForFalsy");Jq.exports={addUpdateNodeValidator:zce,validationSchema:Qq}});var Rd=M((AMe,Xq)=>{"use strict";var bw=class{static{o(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},Iw=class{static{o(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};Xq.exports={Node:bw,NodeSubscription:Iw}});var e$=M((IMe,Zq)=>{"use strict";var Qce=(k(),v(W)).OPERATIONS_ENUM,Nw=class{static{o(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Qce.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};Zq.exports=Nw});var Oh=M((wMe,t$)=>{"use strict";var ww=class{static{o(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},Ow=class{static{o(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,a,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=a,c!==void 0&&(this.attributes=c)}};t$.exports={RemotePayloadObject:ww,RemotePayloadSubscription:Ow}});var n$=M((CMe,r$)=>{"use strict";var Cw=class{static{o(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,a=0){this.schema=t,this.table=r,this.table_size=n,this.record_count=s,this.transaction_log_size=i,this.transaction_log_record_count=a}};r$.exports=Cw});var i$=M((UMe,s$)=>{"use strict";var Jce=n$(),LMe=qt(),DMe=_t(),Xce=Q(),{getSchemaPath:MMe,getTransactionAuditStorePath:vMe}=yt(),{getDatabases:Zce}=(De(),v(mt));s$.exports=ele;async function ele(e){let t=new Jce;try{let r=Zce()[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){Xce.warn(`unable to stat table dbi due to ${r}`)}return t}o(ele,"lmdbGetTableSize")});var a$=M((BMe,o$)=>{"use strict";var Pw=class{static{o(this,"SystemInformationObject")}constructor(t,r,n,s,i,a,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=a,this.harperdb_processes=c}};o$.exports=Pw});var Ad=M(($Me,d$)=>{"use strict";var tle=require("fs-extra"),rle=require("path"),mn=require("systeminformation"),Ja=Q(),c$=mr(),HMe=It(),yd=(k(),v(W)),nle=i$(),sle=Ca(),{getThreadInfo:l$}=nt(),Ch=oe();Ch.initSync();var ile=a$(),{openEnvironment:kMe}=_t(),{getSchemaPath:GMe}=yt(),{database:qMe,databases:Lw}=(De(),v(mt)),uS;d$.exports={getHDBProcessInfo:Uw,getNetworkInfo:Bw,getDiskInfo:xw,getMemoryInfo:vw,getCPUInfo:Mw,getTimeInfo:Dw,getSystemInformation:Fw,systemInformation:ole,getTableSize:Hw,getMetrics:kw};function Dw(){return mn.time()}o(Dw,"getTimeInfo");async function Mw(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:a,governor:c,socket:l,cache:u,...d}=await mn.cpu();d.cpu_speed=await mn.cpuCurrentSpeed();let{rawCurrentload:f,rawCurrentloadIdle:m,rawCurrentloadIrq:h,rawCurrentloadNice:p,rawCurrentloadSystem:_,rawCurrentloadUser:g,cpus:y,...T}=await mn.currentLoad();return T.cpus=[],y.forEach(R=>{let{rawLoad:N,rawLoadIdle:O,rawLoadIrq:F,rawLoadNice:Z,rawLoadSystem:G,rawLoadUser:Y,...q}=R;T.cpus.push(q)}),d.current_load=T,d}catch(e){return Ja.error(`error in getCPUInfo: ${e}`),{}}}o(Mw,"getCPUInfo");async function vw(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await mn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return Ja.error(`error in getMemoryInfo: ${e}`),{}}}o(vw,"getMemoryInfo");async function Uw(){let e={core:[],clustering:[]};try{let t=await mn.processes(),r;try{r=Number.parseInt(await tle.readFile(rle.join(Ch.get(yd.CONFIG_PARAMS.ROOTPATH),yd.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===yd.NODE_ERROR_CODES.ENOENT)Ja.warn("Unable to locate 'hdb.pid' file, try stopping and starting HarperDB. This could be because HarperDB is not running.");else throw n}t.list.forEach(n=>{n.pid===r?e.core.push(n):n.name==="nats-server"&&e.clustering.push(n)});for(let n of e.core)for(let s of t.list)s.pid===n.parentPid&&(s.name==="PM2"||s.command==="PM2")&&(n.parent="PM2");return e}catch(t){return Ja.error(`error in getHDBProcessInfo: ${t}`),e}}o(Uw,"getHDBProcessInfo");async function xw(){let e={};try{if(!Ch.get(yd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await mn.disksIO();e.io=i;let{rxSec:a,txSec:c,wxSec:l,...u}=await mn.fsStats();return e.read_write=u,e.size=await mn.fsSize(),e}catch(t){return Ja.error(`error in getDiskInfo: ${t}`),e}}o(xw,"getDiskInfo");async function Bw(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return Ch.get(yd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await mn.networkInterfaceDefault(),e.latency=await mn.inetChecksite("google.com"),(await mn.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:a,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrierChanges:f,...m}=n;e.interfaces.push(m)}),(await mn.networkStats()).forEach(n=>{let{rxSec:s,txSec:i,ms:a,...c}=n;e.stats.push(c)})),e}catch(t){return Ja.error(`error in getNetworkInfo: ${t}`),e}}o(Bw,"getNetworkInfo");async function Fw(){if(uS!==void 0)return uS;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:a,...c}=await mn.osInfo();e=c;let l=await mn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,uS=e,uS}catch(t){return Ja.error(`error in getSystemInformation: ${t}`),e}}o(Fw,"getSystemInformation");async function Hw(){let e=[],t=await sle.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await nle(n));return e}o(Hw,"getTableSize");async function kw(){let e={};for(let t in Lw){let r=e[t]={},n=r.tables={};for(let s in Lw[t])try{let i=Lw[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,d,f]=l.trim().split(" ");return{pid:u,thread:d,txnid:f}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}}let a=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=a[l];n[s]=c}catch(i){Ja.notify(`Error getting stats for table ${s}: ${i}`)}}return e}o(kw,"getMetrics");async function u$(){if(Ch.get(yd.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await c$.getNATSReferences(),t=await c$.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let a={stream_name:n.config.name,database:n.config.subjects[0].split(".")[1],table:n.config.subjects[0].split(".")[2],state:n.state,consumers:s};r.push(a)}return r}}o(u$,"getNatsStreamInfo");async function ole(e){let t=new ile;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await Fw(),t.time=Dw(),t.cpu=await Mw(),t.memory=await vw(),t.disk=await xw(),t.network=await Bw(),t.harperdb_processes=await Uw(),t.table_size=await Hw(),t.metrics=await kw(),t.threads=await l$(),t.replication=await u$(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await Fw();break;case"time":t.time=Dw();break;case"cpu":t.cpu=await Mw();break;case"memory":t.memory=await vw();break;case"disk":t.disk=await xw();break;case"network":t.network=await Bw();break;case"harperdb_processes":t.harperdb_processes=await Uw();break;case"table_size":t.table_size=await Hw();break;case"database_metrics":case"metrics":t.metrics=await kw();break;case"threads":t.threads=await l$();break;case"replication":t.replication=await u$();break;default:break}return t}o(ole,"systemInformation")});var Ho=M((zMe,p$)=>{"use strict";var ale=Pn(),Gw=ie(),cle=require("util"),Ol=(k(),v(W)),f$=oe();f$.initSync();var lle=EN(),m$=sn(),{Node:KMe,NodeSubscription:YMe}=Rd(),ule=Gu(),dle=e$(),{RemotePayloadObject:fle,RemotePayloadSubscription:mle}=Oh(),{handleHDBError:hle,hdbErrors:ple}=ge(),{HTTP_STATUS_CODES:Ele,HDB_ERROR_MSGS:_le}=ple,gle=ci(),Sle=Ad(),{packageJson:Tle}=Rt(),{getDatabases:Rle}=(De(),v(mt)),WMe=cle.promisify(lle.authorize),yle=m$.searchByHash,Ale=m$.searchByValue;p$.exports={isEmpty:ble,getNodeRecord:Ile,upsertNodeRecord:Nle,buildNodePayloads:wle,checkClusteringEnabled:Ole,getAllNodeRecords:Cle,getSystemInfo:Ple,reverseSubscription:h$};function ble(e){return e==null}o(ble,"isEmpty");async function Ile(e){let t=new ule(Ol.SYSTEM_SCHEMA_NAME,Ol.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return yle(t)}o(Ile,"getNodeRecord");async function Nle(e){let t=new dle(Ol.SYSTEM_SCHEMA_NAME,Ol.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return ale.upsert(t)}o(Nle,"upsertNodeRecord");function h$(e){if(Gw.isEmpty(e.subscribe)||Gw.isEmpty(e.publish))throw new Error("Received invalid subscription object");let{schema:t,table:r,hash_attribute:n}=e,s={schema:t,table:r,hash_attribute:n};return e.subscribe===!0&&e.publish===!1?(s.subscribe=!1,s.publish=!0):e.subscribe===!1&&e.publish===!0?(s.subscribe=!0,s.publish=!1):(s.subscribe=e.subscribe,s.publish=e.publish),s}o(h$,"reverseSubscription");function wle(e,t,r,n){let s=[];for(let i=0,a=e.length;i<a;i++){let c=e[i],{schema:l,table:u}=c,d=Gw.getTableHashAttribute(l,u),{subscribe:f,publish:m}=h$(c),h=Rle()[l]?.[u],p=new mle(l,u,d,m,f,c.start_time,h.schemaDefined?h.attributes:void 0);s.push(p)}return new fle(r,t,s,n)}o(wle,"buildNodePayloads");function Ole(){if(!f$.get(Ol.CONFIG_PARAMS.CLUSTERING_ENABLED))throw hle(new Error,_le.CLUSTERING_NOT_ENABLED,Ele.BAD_REQUEST,void 0,void 0,!0)}o(Ole,"checkClusteringEnabled");async function Cle(){let e=new gle(Ol.SYSTEM_SCHEMA_NAME,Ol.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await Ale(e))}o(Cle,"getAllNodeRecords");async function Ple(){let e=await Sle.getSystemInformation();return{hdb_version:Tle.version,node_version:e.node_version,platform:e.platform}}o(Ple,"getSystemInfo")});var qw=M((QMe,A$)=>{"use strict";var dS=mr(),E$=ie(),_$=It(),g$=(k(),v(W)),fS=Q(),S$=Nh(),Lle=qm(),{RemotePayloadObject:Dle}=Oh(),{handleHDBError:T$,hdbErrors:Mle}=ge(),{HTTP_STATUS_CODES:R$}=Mle,{NodeSubscription:y$}=Rd();A$.exports=vle;async function vle(e,t){let r;try{r=await dS.request(`${t}.${_$.REQUEST_SUFFIX}`,new Dle(g$.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),fS.trace("Response from remote describe all request:",r)}catch(a){fS.error(`addNode received error from describe all request to remote node: ${a}`);let c=dS.requestErrorHandler(a,"add_node",t);throw T$(new Error,c,R$.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===_$.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let a=`Error returned from remote node ${t}: ${r.message}`;throw T$(new Error,a,R$.INTERNAL_SERVER_ERROR,"error",a)}let n=r.message,s=[],i=[];for(let a of e){let{table:c}=a,l=a.database??a.schema??"data";if(l===g$.SYSTEM_SCHEMA_NAME){await dS.createLocalTableStream(l,c);let p=new y$(l,c,a.publish,a.subscribe);p.start_time=a.start_time,i.push(p);continue}let u=E$.doesSchemaExist(l),d=n[l]!==void 0,f=c?E$.doesTableExist(l,c):!0,m=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!f&&!m){s.push(a);continue}if(!u&&d&&(fS.trace(`addNode creating schema: ${l}`),await S$.createSchema({operation:"create_schema",schema:l})),!f&&m){fS.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let p=new Lle(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(p.attributes=n[l][c].attributes),await S$.createTable(p)}await dS.createLocalTableStream(l,c);let h=new y$(l,c,a.publish,a.subscribe);h.start_time=a.start_time,i.push(h)}return{added:i,skipped:s}}o(vle,"reviewSubscriptions")});var bd={};Oe(bd,{addNodeBack:()=>$w,removeNodeBack:()=>Vw,setNode:()=>Fle});async function Fle(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=hi(t)):t=tS(r);let n=(0,I$.validateBySchema)(e,Ble);if(n)throw(0,ko.handleHDBError)(n,n.message,xle.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new ko.ClientError("url or hostname is required for remove_node operation");let h=r,p=$t(),_=await p.get(h);if(!_)throw new ko.ClientError(h+" does not exist");try{await bh({url:_.url},{operation:$.REMOVE_NODE_BACK,name:_?.subscriptions?.length>0?Ze():h},void 0)}catch(g){is.warn(`Error removing node from target node ${h}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,g)}return await p.delete(h),`Successfully removed '${h}' from cluster`}if(!t)throw new ko.ClientError("url required for this operation");let s=qa();if(s==null)throw new ko.ClientError("replication url is missing from harperdb-config.yaml");let i,a,c;if(t?.startsWith("wss:")){i=await(0,Cs.getReplicationCert)();let h=await(0,Cs.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(a=await(0,Cs.createCsr)(),is.info("Sending CSR to target node:",t)):h&&(c=h.certificate,is.info("Sending CA named",h.name,"to target node",t))}let l={operation:$.ADD_NODE_BACK,hostname:(0,Za.get)(U.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:a,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,Za.get)(U.REPLICATION_SHARD)!==void 0&&(l.shard=(0,Za.get)(U.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(b$):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let h=b$(e);l.subscribe=h.subscribe,l.publish=h.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,d;try{u=await bh({url:t},l,e)}catch(h){h.message=`Error returned from ${t}: `+h.message,is.warn("Error adding node:",t,"to cluster:",h),d=h}if(a&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw d?(d.message+=" and connection was required to sign certificate",d):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);a&&(is.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,Cs.setCertTable)({name:Ule.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,Cs.setCertTable)({name:Ze(),uses:["https","operations","wss"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let f={url:t,ca:u?.usingCA};if(e.hostname&&(f.name=e.hostname),e.subscriptions?f.subscriptions=e.subscriptions:f.replicates=!0,e.start_time&&(f.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(f.authorization=e.authorization),e.revoked_certificates&&(f.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?f.shard=u.shard:e.shard!==void 0&&(f.shard=e.shard),f.replicates){let h={url:s,ca:c,replicates:!0,subscriptions:null};(0,Za.get)(U.REPLICATION_SHARD)!==void 0&&(h.shard=(0,Za.get)(U.REPLICATION_SHARD)),e.retain_authorization&&(h.authorization=e.authorization),e.start_time&&(h.start_time=e.start_time),await Mo(Ze(),h)}await Mo(u?u.nodeName:f.name??hi(t),f);let m;return e.operation==="update_node"?m=`Successfully updated '${t}'`:m=`Successfully added '${t}' to cluster`,d&&(m+=" but there was an error updating target node: "+d.message),m}async function $w(e){is.trace("addNodeBack received request:",e);let t=await(0,Cs.signCertificate)(e),r;e.csr?(r=t.signingCA,is.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,is.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,Cs.getReplicationCertAuth)();if(n.replicates){let i={url:qa(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,Za.get)(U.REPLICATION_SHARD)!==void 0&&(i.shard=(0,Za.get)(U.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Mo(Ze(),i)}return await Mo(e.hostname,n),t.nodeName=Ze(),t.usingCA=s?.certificate,is.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function Vw(e){is.trace("removeNodeBack received request:",e),await $t().delete(e.name)}function b$(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var Cs,I$,Xa,Za,is,ko,Ule,xle,Ble,Id=ue(()=>{Cs=w(ss()),I$=w(lt()),Xa=w(require("joi")),Za=w(oe());k();gh();El();rs();is=w(Q()),ko=w(ge()),{pki:Ule}=require("node-forge"),{HTTP_STATUS_CODES:xle}=ko.hdbErrors,Ble=Xa.default.object({hostname:Xa.default.string(),verify_tls:Xa.default.boolean(),replicates:Xa.default.boolean(),subscriptions:Xa.default.array(),revoked_certificates:Xa.default.array(),shard:Xa.default.number()});o(Fle,"setNode");o($w,"addNodeBack");o(Vw,"removeNodeBack");o(b$,"reverseSubscription")});var _S=M((ive,w$)=>{"use strict";var{handleHDBError:mS,hdbErrors:Hle}=ge(),{HTTP_STATUS_CODES:hS}=Hle,{addUpdateNodeValidator:kle}=lS(),pS=Q(),ES=(k(),v(W)),N$=It(),Gle=ie(),Ph=mr(),Lh=Ho(),Kw=oe(),qle=qw(),{Node:$le,NodeSubscription:Vle}=Rd(),{broadcast:Kle}=nt(),{setNode:Yle}=(Id(),v(bd)),nve=oe(),sve=(k(),v(W)),Wle="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",zle="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",jle=Kw.get(ES.CONFIG_PARAMS.CLUSTERING_NODENAME);w$.exports=Qle;async function Qle(e,t=!1){if(pS.trace("addNode called with:",e),Kw.get(ES.CONFIG_PARAMS.REPLICATION_URL)||Kw.get(ES.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Yle(e);Lh.checkClusteringEnabled();let r=kle(e);if(r)throw mS(r,r.message,hS.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let f=await Lh.getNodeRecord(n);if(!Gle.isEmptyOrZeroLength(f))throw mS(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,hS.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await qle(e.subscriptions,n),a={message:void 0,added:s,skipped:i};if(s.length===0)return a.message=Wle,a;let c=Lh.buildNodePayloads(s,jle,ES.OPERATIONS_ENUM.ADD_NODE,await Lh.getSystemInfo()),l=[];for(let f=0,m=s.length;f<m;f++){let h=s[f];s[f].start_time===void 0&&delete s[f].start_time,l.push(new Vle(h.schema,h.table,h.publish,h.subscribe))}pS.trace("addNode sending remote payload:",c);let u;try{u=await Ph.request(`${n}.${N$.REQUEST_SUFFIX}`,c)}catch(f){pS.error(`addNode received error from request: ${f}`);for(let h=0,p=s.length;h<p;h++){let _=s[h];_.publish=!1,_.subscribe=!1,await Ph.updateRemoteConsumer(_,n)}let m=Ph.requestErrorHandler(f,"add_node",n);throw mS(new Error,m,hS.INTERNAL_SERVER_ERROR,"error",m)}if(u.status===N$.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${n}: ${u.message}`;throw mS(new Error,f,hS.INTERNAL_SERVER_ERROR,"error",f)}pS.trace(u);for(let f=0,m=s.length;f<m;f++){let h=s[f];await Ph.updateRemoteConsumer(h,n),h.subscribe===!0&&await Ph.updateConsumerIterator(h.schema,h.table,n,"start")}let d=new $le(n,l,u.system_info);return await Lh.upsertNodeRecord(d),Kle({type:"nats_update"}),i.length>0?a.message=zle:a.message=`Successfully added '${n}' to manifest`,a}o(Qle,"addNode")});var jw=M((cve,C$)=>{"use strict";var{handleHDBError:Yw,hdbErrors:Jle}=ge(),{HTTP_STATUS_CODES:Ww}=Jle,{addUpdateNodeValidator:Xle}=lS(),Dh=Q(),gS=(k(),v(W)),O$=It(),ave=ie(),Mh=mr(),vh=Ho(),zw=oe(),{cloneDeep:Zle}=require("lodash"),eue=qw(),{Node:tue,NodeSubscription:rue}=Rd(),{broadcast:nue}=nt(),{setNode:sue}=(Id(),v(bd)),iue="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",oue="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",aue=zw.get(gS.CONFIG_PARAMS.CLUSTERING_NODENAME);C$.exports=cue;async function cue(e){if(Dh.trace("updateNode called with:",e),zw.get(gS.CONFIG_PARAMS.REPLICATION_URL)??zw.get(gS.CONFIG_PARAMS.REPLICATION_HOSTNAME))return sue(e);vh.checkClusteringEnabled();let t=Xle(e);if(t)throw Yw(t,t.message,Ww.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await vh.getNodeRecord(r);s.length>0&&(n=Zle(s));let{added:i,skipped:a}=await eue(e.subscriptions,r),c={message:void 0,updated:i,skipped:a};if(i.length===0)return c.message=iue,c;let l=vh.buildNodePayloads(i,aue,gS.OPERATIONS_ENUM.UPDATE_NODE,await vh.getSystemInfo());for(let d=0,f=i.length;d<f;d++){let m=i[d];Dh.trace(`updateNode updating work stream for node: ${r} subscription:`,m),i[d].start_time===void 0&&delete i[d].start_time}Dh.trace("updateNode sending remote payload:",l);let u;try{u=await Mh.request(`${r}.${O$.REQUEST_SUFFIX}`,l)}catch(d){Dh.error(`updateNode received error from request: ${d}`);let f=Mh.requestErrorHandler(d,"update_node",r);throw Yw(new Error,f,Ww.INTERNAL_SERVER_ERROR,"error",f)}if(u.status===O$.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw Yw(new Error,d,Ww.INTERNAL_SERVER_ERROR,"error",d)}Dh.trace(u);for(let d=0,f=i.length;d<f;d++){let m=i[d];await Mh.updateRemoteConsumer(m,r),m.subscribe===!0?await Mh.updateConsumerIterator(m.schema,m.table,r,"start"):await Mh.updateConsumerIterator(m.schema,m.table,r,"stop")}return n||(n=[new tue(r,[],u.system_info)]),await lue(n[0],i,u.system_info),a.length>0?c.message=oue:c.message=`Successfully updated '${r}'`,c}o(cue,"updateNode");async function lue(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let a=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let d=n.subscriptions[l];if(d.schema===a.schema&&d.table===a.table){d.publish=a.publish,d.subscribe=a.subscribe,c=!0;break}}c||n.subscriptions.push(new rue(a.schema,a.table,a.publish,a.subscribe))}n.system_info=r,await vh.upsertNodeRecord(n),nue({type:"nats_update"})}o(lue,"updateNodeTable")});var v$=M((uve,M$)=>{"use strict";var D$=require("joi"),{string:P$}=D$.types(),uue=lt(),L$=(k(),v(W)),due=oe(),fue=It();M$.exports=mue;function mue(e){let t=P$.invalid(due.get(L$.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(fue.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=D$.object({operation:P$.valid(L$.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return uue.validateBySchema(e,r)}o(mue,"removeNodeValidator")});var SS=M((fve,H$)=>{"use strict";var{handleHDBError:U$,hdbErrors:hue}=ge(),{HTTP_STATUS_CODES:x$}=hue,pue=v$(),Uh=Q(),B$=Ho(),Eue=ie(),Nd=(k(),v(W)),F$=It(),Qw=mr(),Jw=oe(),{RemotePayloadObject:_ue}=Oh(),{NodeSubscription:gue}=Rd(),Sue=Gm(),Tue=Jc(),{broadcast:Rue}=nt(),{setNode:yue}=(Id(),v(bd)),Aue=Jw.get(Nd.CONFIG_PARAMS.CLUSTERING_NODENAME);H$.exports=bue;async function bue(e){if(Uh.trace("removeNode called with:",e),Jw.get(Nd.CONFIG_PARAMS.REPLICATION_URL)??Jw.get(Nd.CONFIG_PARAMS.REPLICATION_HOSTNAME))return yue(e);B$.checkClusteringEnabled();let t=pue(e);if(t)throw U$(t,t.message,x$.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await B$.getNodeRecord(r);if(Eue.isEmptyOrZeroLength(n))throw U$(new Error,`Node '${r}' was not found.`,x$.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new _ue(Nd.OPERATIONS_ENUM.REMOVE_NODE,Aue,[]),i,a=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await Qw.updateConsumerIterator(d.schema,d.table,r,"stop");try{await Qw.updateRemoteConsumer(new gue(d.schema,d.table,!1,!1),r)}catch(f){Uh.error(f)}}try{i=await Qw.request(`${r}.${F$.REQUEST_SUFFIX}`,s),Uh.trace("Remove node reply from remote node:",r,i)}catch(l){Uh.error("removeNode received error from request:",l),a=!0}let c=new Sue(Nd.SYSTEM_SCHEMA_NAME,Nd.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await Tue.deleteRecord(c),Rue({type:"nats_update"}),i?.status===F$.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||a?(Uh.error("Error returned from remote node:",r,i?.message),`Successfully removed '${r}' from local manifest, however there was an error reaching remote node. Check the logs for more details.`):`Successfully removed '${r}' from manifest`}o(bue,"removeNode")});var q$=M((hve,G$)=>{"use strict";var k$=require("joi"),{string:Iue,array:Nue}=k$.types(),wue=lt(),Oue=lS();G$.exports=Cue;function Cue(e){let t=k$.object({operation:Iue.valid("configure_cluster").required(),connections:Nue.items(Oue.validationSchema).required()});return wue.validateBySchema(e,t)}o(Cue,"configureClusterValidator")});var Xw=M((Eve,W$)=>{"use strict";var $$=(k(),v(W)),TS=Q(),Pue=ie(),Lue=oe(),Due=SS(),Mue=_S(),vue=Ho(),Uue=q$(),{handleHDBError:V$,hdbErrors:xue}=ge(),{HTTP_STATUS_CODES:K$}=xue,Bue="Configure cluster complete.",Fue="Failed to configure the cluster. Check the logs for more details.",Hue="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";W$.exports=kue;async function kue(e){TS.trace("configure cluster called with:",e);let t=Uue(e);if(t)throw V$(t,t.message,K$.BAD_REQUEST,void 0,void 0,!0);let r=await vue.getAllNodeRecords(),n=[];if(Lue.get($$.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,f=r.length;d<f;d++){let m=await Y$(Due,{operation:$$.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(m)}TS.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let f=e.connections[d],m=await Y$(Mue,f,f.node_name);s.push(m)}TS.trace("All results from configure_cluster add node:",s);let a=[],c=[],l=!1,u=n.concat(s);for(let d=0,f=u.length;d<f;d++){let m=u[d];m.status==="rejected"&&(TS.error(m.node_name,m?.error?.message,m?.error?.stack),a.includes(m.node_name)||a.push(m.node_name)),(m?.result?.message?.includes?.("Successfully")||m?.result?.includes?.("Successfully"))&&(l=!0),!(typeof m.result=="string"&&m.result.includes("Successfully removed")||m.status==="rejected")&&c.push({node_name:m?.node_name,response:m?.result})}if(Pue.isEmptyOrZeroLength(a))return{message:Bue,connections:c};if(l)return{message:Hue,failed_nodes:a,connections:c};throw V$(new Error,Fue,K$.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}o(kue,"configureCluster");async function Y$(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}o(Y$,"functionWrapper")});var J$=M((gve,Q$)=>{"use strict";var xh=require("joi"),Gue=lt(),{validateSchemaExists:z$,validateTableExists:que,validateSchemaName:j$}=Bi(),$ue=xh.object({operation:xh.string().valid("purge_stream"),schema:xh.string().custom(z$).custom(j$).optional(),database:xh.string().custom(z$).custom(j$).optional(),table:xh.string().custom(que).required()});function Vue(e){return Gue.validateBySchema(e,$ue)}o(Vue,"purgeStreamValidator");Q$.exports=Vue});var Zw=M((Tve,X$)=>{"use strict";var{handleHDBError:Kue,hdbErrors:Yue}=ge(),{HTTP_STATUS_CODES:Wue}=Yue,zue=J$(),jue=mr(),Que=Ho();X$.exports=Jue;async function Jue(e){e.schema=e.schema??e.database;let t=zue(e);if(t)throw Kue(t,t.message,Wue.BAD_REQUEST,void 0,void 0,!0);Que.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await jue.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}o(Jue,"purgeStream")});var rO=M((yve,iV)=>{"use strict";var tO=Ho(),Xue=mr(),yS=oe(),wd=(k(),v(W)),Cl=It(),Zue=ie(),eO=Q(),{RemotePayloadObject:ede}=Oh(),{ErrorCode:Z$}=require("nats"),{parentPort:eV}=require("worker_threads"),{onMessageByType:tde}=nt(),{getThisNodeName:rde}=(rs(),v(Uo)),{requestClusterStatus:nde}=(gh(),v(AG)),{getReplicationSharedStatus:sde,getHDBNodeTable:ide}=(El(),v(qN)),{CONFIRMATION_STATUS_POSITION:ode,RECEIVED_VERSION_POSITION:ade,RECEIVED_TIME_POSITION:cde,SENDING_TIME_POSITION:lde,RECEIVING_STATUS_POSITION:ude,RECEIVING_STATUS_RECEIVING:dde}=(mw(),v(mq)),tV=yS.get(wd.CONFIG_PARAMS.CLUSTERING_ENABLED),rV=yS.get(wd.CONFIG_PARAMS.CLUSTERING_NODENAME);iV.exports={clusterStatus:fde,buildNodeStatus:sV};var nV;tde("cluster-status",async e=>{nV(e)});async function fde(){if(yS.get(wd.CONFIG_PARAMS.REPLICATION_URL)||yS.get(wd.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(eV){eV.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{nV=i});for(let i of n.connections){let a=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let f of Object.values(databases[l]||{}))if(u=f.auditStore,u)break;if(!u)continue;let d=sde(u,l,a);c.lastCommitConfirmed=RS(d[ode]),c.lastReceivedRemoteTime=RS(d[ade]),c.lastReceivedLocalTime=RS(d[cde]),c.sendingMessage=RS(d[lde]),c.lastReceivedStatus=d[ude]===dde?"Receiving":"Waiting"}}}else n=nde();n.node_name=rde();let s=ide().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:rV,is_enabled:tV,connections:[]};if(!tV)return e;let t=await tO.getAllNodeRecords();if(Zue.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(sV(t[n],e.connections));return await Promise.allSettled(r),e}o(fde,"clusterStatus");function RS(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}o(RS,"asDate");async function sV(e,t){let r=e.name,n=new ede(wd.OPERATIONS_ENUM.CLUSTER_STATUS,rV,void 0,await tO.getSystemInfo()),s,i,a=Cl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await Xue.request(Cl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===Cl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(a=Cl.CLUSTER_STATUS_STATUSES.CLOSED,eO.error(`Error getting node status from ${r} `,s))}catch(l){eO.warn(`Error getting node status from ${r}`,l),l.code===Z$.NoResponders?a=Cl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===Z$.Timeout?a=Cl.CLUSTER_STATUS_STATUSES.TIMEOUT:a=Cl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new mde(r,a,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==wd.PRE_4_0_0_VERSION&&await tO.upsertNodeRecord(l)}catch(l){eO.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}o(sV,"buildNodeStatus");function mde(e,t,r,n,s,i,a,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=a,this.system_info=c}o(mde,"NodeStatusObject")});var sO=M((bve,oV)=>{"use strict";var{handleHDBError:hde,hdbErrors:pde}=ge(),{HTTP_STATUS_CODES:Ede}=pde,_de=mr(),gde=Ho(),nO=ie(),AS=require("joi"),Sde=lt(),Tde=2e3,Rde=AS.object({timeout:AS.number().min(1),connected_nodes:AS.boolean(),routes:AS.boolean()});oV.exports=yde;async function yde(e){gde.checkClusteringEnabled();let t=Sde.validateBySchema(e,Rde);if(t)throw hde(t,t.message,Ede.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||nO.autoCastBoolean(n),a=s===void 0||nO.autoCastBoolean(s),c={nodes:[]},l=await _de.getServerList(r??Tde),u={};if(i)for(let d=0,f=l.length;d<f;d++){let m=l[d].statsz;m&&(u[l[d].server.name]=m.routes)}for(let d=0,f=l.length;d<f;d++){if(l[d].statsz)continue;let m=l[d].server,h=l[d].data;if(m.name.endsWith("-hub")){let p={name:m.name.slice(0,-4),response_time:l[d].response_time};i&&(p.connected_nodes=[],u[m.name]&&u[m.name].forEach(_=>{p.connected_nodes.includes(_.name.slice(0,-4))||p.connected_nodes.push(_.name.slice(0,-4))})),a&&(p.routes=h.cluster?.urls?h.cluster?.urls.map(_=>({host:_.split(":")[0],port:nO.autoCast(_.split(":")[1])})):[]),c.nodes.push(p)}}return c}o(yde,"clusterNetwork")});var uV=M((Nve,lV)=>{"use strict";var iO=require("joi"),aV=lt(),{routeConstraints:cV}=Nb();lV.exports={setRoutesValidator:Ade,deleteRoutesValidator:bde};function Ade(e){let t=iO.object({server:iO.valid("hub","leaf"),routes:cV.required()});return aV.validateBySchema(e,t)}o(Ade,"setRoutesValidator");function bde(e){let t=iO.object({routes:cV.required()});return aV.validateBySchema(e,t)}o(bde,"deleteRoutesValidator")});var bS=M((Ove,_V)=>{"use strict";var Go=bt(),oO=ie(),Ps=(k(),v(W)),Od=oe(),dV=uV(),{handleHDBError:fV,hdbErrors:Ide}=ge(),{HTTP_STATUS_CODES:mV}=Ide,hV="cluster routes successfully set",pV="cluster routes successfully deleted";_V.exports={setRoutes:wde,getRoutes:Ode,deleteRoutes:Cde};function Nde(e){let t=Go.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let a=0,c=e.routes.length;a<c;a++){let l=e.routes[a];l.port=oO.autoCast(l.port);let u=r.some(f=>f.host===l.host&&f.port===l.port),d=n.some(f=>f.host===l.host&&f.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?Go.updateConfigValue(Ps.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):Go.updateConfigValue(Ps.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:hV,set:i,skipped:s}}o(Nde,"setRoutesNats");function wde(e){let t=dV.setRoutesValidator(e);if(t)throw fV(t,t.message,mV.BAD_REQUEST,void 0,void 0,!0);if(Od.get(Ps.CONFIG_PARAMS.CLUSTERING_ENABLED))return Nde(e);let r=[],n=[],s=Od.get(Ps.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{EV(s,i)?n.push(i):(s.push(i),r.push(i))}),Go.updateConfigValue(Ps.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:hV,set:r,skipped:n}}o(wde,"setRoutes");function EV(e,t){return typeof t=="string"?e.includes(t):typeof t=="object"&&t!==null?e.some(r=>(r.host===t.host||r.hostname===t.hostname)&&r.port===t.port):!1}o(EV,"existsInArray");function Ode(){if(Od.get(Ps.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=Go.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Od.get(Ps.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}o(Ode,"getRoutes");function Cde(e){let t=dV.deleteRoutesValidator(e);if(t)throw fV(t,t.message,mV.BAD_REQUEST,void 0,void 0,!0);if(Od.get(Ps.CONFIG_PARAMS.CLUSTERING_ENABLED))return Pde(e);let r=[],n=[],s=Od.get(Ps.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(a=>{EV(e.routes,a)?r.push(a):(i.push(a),n.push(a))}),Go.updateConfigValue(Ps.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:pV,deleted:r,skipped:n}}o(Cde,"deleteRoutes");function Pde(e){let t=Go.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],a=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let d=e.routes[l],f=!1;for(let m=0,h=r.length;m<h;m++){let p=r[m];if(d.host===p.host&&d.port===p.port){r.splice(m,1),f=!0,a=!0,s.push(d);break}}if(!f){let m=!0;for(let h=0,p=n.length;h<p;h++){let _=n[h];if(d.host===_.host&&d.port===_.port){n.splice(h,1),c=!0,m=!1,s.push(d);break}}m&&i.push(d)}}return a&&(r=oO.isEmptyOrZeroLength(r)?null:r,Go.updateConfigValue(Ps.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=oO.isEmptyOrZeroLength(n)?null:n,Go.updateConfigValue(Ps.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:pV,deleted:s,skipped:i}}o(Pde,"deleteRoutesNats")});var SV=M((Pve,gV)=>{"use strict";var Bh=require("alasql"),Pl=require("recursive-iterator"),_i=Q(),Lde=ie(),Fh=(k(),v(W)),aO=class{static{o(this,"sqlStatementBucket")}constructor(t){this.ast=t,this.affected_attributes=new Map,this.table_lookup=new Map,this.schema_lookup=new Map,this.table_to_schema_lookup=new Map,Mde(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=>Fh.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=>!Fh.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,a=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[a]&&t[i].tables[a][Fh.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[a].attribute_permissions.length>0?c=Dde(t[i].tables[a].attribute_permissions):c=global.hdb_schema[i][a].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(a).filter(u=>!Fh.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new Bh.yy.Column({columnid:u});s.tableid&&(d.tableid=s.tableid),this.ast.columns.push(d),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(a,l)}}),this.ast}};function Dde(e){return e.filter(t=>t[Fh.PERMS_CRUD_ENUM.READ])}o(Dde,"filterReadRestrictedAttrs");function Mde(e,t,r,n,s){vde(e,t,r,n,s)}o(Mde,"interpretAST");function Hh(e,t,r,n,s){if(!(!e||!e.databaseid)&&(t.has(e.databaseid)||t.set(e.databaseid,new Map),t.get(e.databaseid).has(e.tableid)||t.get(e.databaseid).set(e.tableid,[]),e.as&&(r.has(e.as)||r.set(e.as,e.tableid),n&&!n.has(e.as)&&n.set(e.as,e.databaseid)),s)){let i=e.databaseid,a=e.tableid;e.as&&(a=e.as),s.set(a,i)}}o(Hh,"addSchemaTableToMap");function vde(e,t,r,n,s){if(!e){_i.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof Bh.yy.Insert?Fde(e,t,r):e instanceof Bh.yy.Select?Ude(e,t,r,n,s):e instanceof Bh.yy.Update?xde(e,t,r):e instanceof Bh.yy.Delete?Bde(e,t,r):_i.error("AST in getRecordAttributesAST() is not a valid SQL type.")}o(vde,"getRecordAttributesAST");function Ude(e,t,r,n,s){if(!e){_i.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(Lde.isEmptyOrZeroLength(i)){_i.error("No schema specified");return}e.from.forEach(c=>{Hh(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),Hh(c.table,t,r,n,s)});let a=new Pl(e.columns);for(let{node:c}of a)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{_i.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 Pl(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let d=u.tableid?u.tableid:l;if(!t.get(i).has(d))if(r.has(d))d=r.get(d);else{_i.info(`table specified as ${d} not found.`);continue}t.get(i).get(d).indexOf(u.columnid)<0&&t.get(i).get(d).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new Pl(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,f=s.get(d);if(!t.get(f).has(d))if(r.has(d))d=r.get(d);else{_i.info(`table specified as ${d} not found.`);continue}t.get(f).get(d).indexOf(u.columnid)<0&&t.get(f).get(d).push(u.columnid)}}),e.order){let c=new Pl(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,d=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(d).has(u))if(r.has(u))u=r.get(u);else{_i.info(`table specified as ${u} not found.`);return}t.get(d).get(u).indexOf(l.columnid)<0&&t.get(d).get(u).push(l.columnid)}}}o(Ude,"getSelectAttributes");function xde(e,t,r){if(!e){_i.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new Pl(e.columns),s=e.table.databaseid;Hh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&cO(e.table.tableid,s,i.columnid,t,r)}o(xde,"getUpdateAttributes");function Bde(e,t,r){if(!e){_i.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new Pl(e.where),s=e.table.databaseid;Hh(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&cO(e.table.tableid,s,i.columnid,t,r)}o(Bde,"getDeleteAttributes");function Fde(e,t,r){if(!e){_i.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new Pl(e.columns),s=e.into.databaseid;Hh(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&cO(e.into.tableid,s,i.columnid,t,r)}o(Fde,"getInsertAttributes");function cO(e,t,r,n,s){if(!n.get(t))return;let i=e;n.get(t).has(i)||(i=s.get(i)),n.get(t).get(i).push(r)}o(cO,"pushAttribute");gV.exports=aO});var RV=M((Dve,TV)=>{"use strict";var IS=(k(),v(W)),NS=class{static{o(this,"BaseLicense")}constructor(t=0,r=IS.RAM_ALLOCATION_ENUM.DEFAULT,n=IS.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},lO=class extends NS{static{o(this,"ExtendedLicense")}constructor(t=0,r=IS.RAM_ALLOCATION_ENUM.DEFAULT,n=IS.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};TV.exports={BaseLicense:NS,ExtendedLicense:lO}});var Ld=M((vve,wV)=>{"use strict";var Pd=require("fs-extra"),wS=(y_(),v(R_)),AV=require("crypto"),Hde=require("moment"),kde=require("uuid").v4,hn=Q(),dO=require("path"),Gde=ie(),Ll=(k(),v(W)),{totalmem:yV}=require("os"),qde=RV().ExtendedLicense,Cd="invalid license key format",$de="061183",Vde="mofi25",Kde="aes-256-cbc",Yde=16,Wde=32,bV=oe(),{resolvePath:IV}=bt();bV.initSync();var uO;wV.exports={validateLicense:NV,generateFingerPrint:jde,licenseSearch:hO,getLicense:Xde,checkMemoryLimit:Zde};function fO(){return dO.join(bV.getHdbBasePath(),Ll.LICENSE_KEY_DIR_NAME,Ll.LICENSE_FILE_NAME)}o(fO,"getLicenseDirPath");function zde(){let e=fO();return IV(dO.join(e,Ll.LICENSE_FILE_NAME))}o(zde,"getLicenseFilePath");function mO(){let e=fO();return IV(dO.join(e,Ll.REG_KEY_FILE_NAME))}o(mO,"getFingerPrintFilePath");async function jde(){let e=mO();try{return await Pd.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Qde();throw hn.error(`Error writing fingerprint file to ${e}`),hn.error(t),new Error("There was an error generating the fingerprint")}}o(jde,"generateFingerPrint");async function Qde(){let e=kde(),t=wS.hash(e,wS.HASH_FUNCTION.MD5),r=mO();try{await Pd.mkdirp(fO()),await Pd.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw hn.error(`Error writing fingerprint file to ${r}`),hn.error(n),new Error("There was an error generating the fingerprint")}return t}o(Qde,"writeFingerprint");function NV(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:Ll.RAM_ALLOCATION_ENUM.DEFAULT,version:Ll.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return hn.error("empty license key passed to validate."),r;let n=mO(),s=!1;try{s=Pd.statSync(n)}catch(i){hn.error(i)}if(s){let i;try{i=Pd.readFileSync(n,"utf8")}catch{hn.error("error validating this machine in the license"),r.valid_machine=!1;return}let a=e.split(Vde),c=a[1];c=Buffer.concat([Buffer.from(c)],Yde);let l=Buffer.concat([Buffer.from(i)],Wde),u=AV.createDecipheriv(Kde,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let d=null;try{d=u.update(a[0],"hex","utf8"),d.trim(),d+=u.final("utf8")}catch{let h=Jde(a[0],i);if(h)d=h;else throw r.valid_license=!1,r.valid_machine=!1,console.error(Cd),hn.error(Cd),new Error(Cd)}let f;if(isNaN(d))try{f=JSON.parse(d),r.version=f.version,r.exp_date=f.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),f.ram_allocation&&(r.ram_allocation=f.ram_allocation)}catch{throw console.error(Cd),hn.error(Cd),new Error(Cd)}else r.exp_date=d;r.exp_date<Hde().valueOf()&&(r.valid_date=!1),wS.validate(a[1],`${$de}${i}${t}`,wS.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||hn.error("Invalid licence"),r}o(NV,"validateLicense");function Jde(e,t){try{let r=AV.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{hn.warn("Check old license failed")}}o(Jde,"checkOldLicense");function hO(){let e=new qde,t=[];try{t=Pd.readFileSync(zde(),"utf-8").split(`\r
19
- `)}catch(r){r.code==="ENOENT"?hn.debug("no license file found"):hn.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(Gde.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=NV(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){hn.error("There was an error parsing the license string."),hn.error(s),e.ram_allocation=Ll.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return uO=e,e}o(hO,"licenseSearch");async function Xde(){return uO||await hO(),uO}o(Xde,"getLicense");function Zde(){let e=hO().ram_allocation,t=process.constrainedMemory?.()||yV();if(t=Math.round(Math.min(t,yV())/2**20),t>e)return`This server has more memory (${t}MB) than HarperDB is licensed for (${e}MB), this should only be used for educational and development purposes.`}o(Zde,"checkMemoryLimit")});var _O=M((xve,LV)=>{var OS=Ld(),OV=require("chalk"),os=Q(),CV=require("prompt"),{promisify:efe}=require("util"),pO=(k(),v(W)),tfe=require("fs-extra"),rfe=require("path"),nfe=ie(),{packageJson:sfe}=Rt(),PV=oe();PV.initSync();var ife=require("moment"),ofe=efe(CV.get),afe=rfe.join(PV.getHdbBasePath(),pO.LICENSE_KEY_DIR_NAME,pO.LICENSE_FILE_NAME,pO.LICENSE_FILE_NAME);LV.exports={getFingerprint:lfe,setLicense:cfe,parseLicense:EO,register:ufe,getRegistrationInfo:ffe};async function cfe(e){if(e&&e.key&&e.company){try{os.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await EO(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw os.error(r),os.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}o(cfe,"setLicense");async function lfe(){let e={};try{e=await OS.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw os.error(r),os.error(t),new Error(r)}return e}o(lfe,"getFingerprint");async function EO(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");os.info("Validating license input...");let r=OS.validateLicense(e,t);if(os.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(os.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(os.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{os.info("writing license to disk"),await tfe.writeFile(afe,JSON.stringify({license_key:e,company:t}))}catch(n){throw os.error("Failed to write License"),n}return"Registration successful."}o(EO,"parseLicense");async function ufe(){let e=await dfe();return EO(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}o(ufe,"register");async function dfe(){let e=await OS.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:OV.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:OV.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{CV.start()}catch(n){os.error(n)}let r;try{r=await ofe(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}o(dfe,"promptForRegistration");async function ffe(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await OS.getLicense()}catch(r){throw os.error(`There was an error when searching licenses due to: ${r.message}`),r}if(nfe.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=sfe.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=ife.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}o(ffe,"getRegistrationInfo")});var MV=M((Fve,DV)=>{"use strict";var mfe=It(),gO=class{static{o(this,"HubConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f,m,h,p){this.port=t,a===null&&(a=void 0),this.server_name=r+mfe.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c}},this.cluster={name:d,port:f,routes:m,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l}},this.accounts={SYS:{users:h},HDB:{users:p}},this.system_account="SYS"}};DV.exports=gO});var xV=M((kve,UV)=>{"use strict";var vV=It(),SO=class{static{o(this,"LeafConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f){this.port=t,f===null&&(f=void 0),this.server_name=r+vV.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+vV.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:d,ca_file:f,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:f,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:f,insecure:!0},urls:a,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};UV.exports=SO});var FV=M((qve,BV)=>{"use strict";var TO=class{static{o(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};BV.exports=TO});var kV=M((Vve,HV)=>{"use strict";var hfe=It(),RO=class{static{o(this,"SysUserObject")}constructor(t,r){this.user=t+hfe.SERVER_SUFFIX.ADMIN,this.password=r}};HV.exports=RO});var DS=M((Yve,$V)=>{"use strict";var Dl=require("path"),Ml=require("fs-extra"),pfe=MV(),Efe=xV(),_fe=FV(),gfe=kV(),yO=Xn(),Md=ie(),vn=bt(),PS=(k(),v(W)),kh=It(),{CONFIG_PARAMS:rr}=PS,vd=Q(),Gh=oe(),GV=ki(),AO=mr(),Sfe=ss(),Dd="clustering",Tfe=1e4,qV=50;$V.exports={generateNatsConfig:yfe,removeNatsConfig:Afe,getHubConfigPath:Rfe};function Rfe(){let e=Gh.get(rr.ROOTPATH);return Dl.join(e,Dd,kh.NATS_CONFIG_FILES.HUB_SERVER)}o(Rfe,"getHubConfigPath");async function yfe(e=!1,t=void 0){console.error("Warning: NATS replication is deprecated and will be removed in version 5.0 of Harper");let r=Gh.get(rr.ROOTPATH);Ml.ensureDirSync(Dl.join(r,"clustering","leaf")),Gh.initSync();let n=vn.getConfigFromFile(rr.CLUSTERING_TLS_CERT_AUTH),s=vn.getConfigFromFile(rr.CLUSTERING_TLS_PRIVATEKEY),i=vn.getConfigFromFile(rr.CLUSTERING_TLS_CERTIFICATE);!await Ml.exists(i)&&!await Ml.exists(!n)&&await Sfe.createNatsCerts();let a=Dl.join(r,Dd,kh.PID_FILES.HUB),c=Dl.join(r,Dd,kh.PID_FILES.LEAF),l=vn.getConfigFromFile(rr.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=Dl.join(r,Dd,kh.NATS_CONFIG_FILES.HUB_SERVER),d=Dl.join(r,Dd,kh.NATS_CONFIG_FILES.LEAF_SERVER),f=vn.getConfigFromFile(rr.CLUSTERING_TLS_INSECURE),m=vn.getConfigFromFile(rr.CLUSTERING_TLS_VERIFY),h=vn.getConfigFromFile(rr.CLUSTERING_NODENAME),p=vn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await AO.checkNATSServerInstalled()||LS("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let _=await yO.listUsers(),g=vn.getConfigFromFile(rr.CLUSTERING_USER),y=await yO.getClusterUser();(Md.isEmpty(y)||y.active!==!0)&&LS(`Invalid cluster user '${cluster_username}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await CS(rr.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await CS(rr.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await CS(rr.CLUSTERING_HUBSERVER_NETWORK_PORT),await CS(rr.CLUSTERING_LEAFSERVER_NETWORK_PORT));let T=[],R=[];for(let[q,K]of _.entries())K.role?.role===PS.ROLE_TYPES_ENUM.CLUSTER_USER&&K.active&&(T.push(new gfe(K.username,GV.decrypt(K.hash))),R.push(new _fe(K.username,GV.decrypt(K.hash))));let N=[],{hub_routes:O}=vn.getClusteringRoutes();if(!Md.isEmptyOrZeroLength(O))for(let q of O)N.push(`tls://${y.sys_name_encoded}:${y.uri_encoded_d_hash}@${q.host}:${q.port}`);let F=new pfe(vn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_NETWORK_PORT),h,a,i,s,n,f,m,p,vn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_CLUSTER_NAME),vn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,T,R);n==null&&(delete F.tls.ca_file,delete F.leafnodes.tls.ca_file),t=Md.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===PS.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Ml.writeJson(u,F),vd.trace(`Hub server config written to ${u}`));let Z=`tls://${y.sys_name_encoded}:${y.uri_encoded_d_hash}@0.0.0.0:${p}`,G=`tls://${y.uri_encoded_name}:${y.uri_encoded_d_hash}@0.0.0.0:${p}`,Y=new Efe(vn.getConfigFromFile(rr.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[Z],[G],T,R,i,s,n,f);n==null&&delete Y.tls.ca_file,(t===void 0||t===PS.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Ml.writeJson(d,Y),vd.trace(`Leaf server config written to ${d}`))}o(yfe,"generateNatsConfig");async function CS(e){let t=Gh.get(e);return Md.isEmpty(t)&&LS(`port undefined for '${e}'`),await Md.isPortTaken(t)&&LS(`'${e}' port '${t}' is is in use by another process, check to see if HarperDB is already running or another process is using this port.`),!0}o(CS,"isPortAvailable");function LS(e){let t=`Error generating clustering config: ${e}`;vd.error(t),console.error(t),process.exit(1)}o(LS,"generateNatsConfigError");async function Afe(e){let{port:t,config_file:r}=AO.getServerConfig(e),{username:n,decrypt_hash:s}=await yO.getClusterUser(),i=0,a=2e3;for(;i<qV;){try{let d=await AO.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){vd.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=qV)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=a*(i*2);u>3e4&&vd.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await Md.asyncSetTimeout(u)}let c="0".repeat(Tfe),l=Dl.join(Gh.get(rr.ROOTPATH),Dd,r);await Ml.writeFile(l,c),await Ml.remove(l),vd.notify(e,"started.")}o(Afe,"removeNatsConfig")});var jV=M((zve,zV)=>{"use strict";var as=oe(),bfe=Ld(),Ke=(k(),v(W)),qh=It(),qo=require("path"),{PACKAGE_ROOT:vS}=Rt(),VV=oe(),MS=ie(),Ud="/dev/null",Ife=qo.join(vS,"launchServiceScripts"),KV=qo.join(vS,"utility/scripts"),Nfe=qo.join(KV,Ke.HDB_RESTART_SCRIPT),YV=qo.resolve(vS,"dependencies",`${process.platform}-${process.arch}`,qh.NATS_BINARY_NAME);function WV(){let t=bfe.licenseSearch().ram_allocation||Ke.RAM_ALLOCATION_ENUM.DEFAULT,r=Ke.MEM_SETTING_KEY+t,n={[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return MS.noBootFile()&&(n[Ke.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=MS.getEnvCliRootPath()),{name:Ke.PROCESS_DESCRIPTORS.HDB,script:Ke.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:vS}}o(WV,"generateMainServerConfig");var wfe=9930;function Ofe(){as.initSync(!0);let e=as.get(Ke.CONFIG_PARAMS.ROOTPATH),t=qo.join(e,"clustering",qh.NATS_CONFIG_FILES.HUB_SERVER),r=qo.join(as.get(Ke.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ke.LOG_NAMES.HDB),n=VV.get(Ke.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=qh.LOG_LEVEL_FLAGS[as.get(Ke.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==wfe?"-"+n:""),script:YV,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return as.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Ud,i.error_file=Ud),i}o(Ofe,"generateNatsHubServerConfig");var Cfe=9940;function Pfe(){as.initSync(!0);let e=as.get(Ke.CONFIG_PARAMS.ROOTPATH),t=qo.join(e,"clustering",qh.NATS_CONFIG_FILES.LEAF_SERVER),r=qo.join(as.get(Ke.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ke.LOG_NAMES.HDB),n=VV.get(Ke.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=qh.LOG_LEVEL_FLAGS[as.get(Ke.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Cfe?"-"+n:""),script:YV,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return as.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Ud,i.error_file=Ud),i}o(Pfe,"generateNatsLeafServerConfig");function Lfe(){as.initSync();let e=qo.join(as.get(Ke.CONFIG_PARAMS.LOGGING_ROOT),Ke.LOG_NAMES.HDB),t={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ke.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:Ife,autorestart:!1};return as.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=Ud,t.error_file=Ud),t}o(Lfe,"generateClusteringUpgradeV4ServiceConfig");function Dfe(){let e={[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.RESTART_HDB};return MS.noBootFile()&&(e[Ke.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=MS.getEnvCliRootPath()),{...{name:Ke.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:KV},script:Nfe}}o(Dfe,"generateRestart");function Mfe(){return{apps:[WV()]}}o(Mfe,"generateAllServiceConfigs");zV.exports={generateAllServiceConfigs:Mfe,generateMainServerConfig:WV,generateRestart:Dfe,generateNatsHubServerConfig:Ofe,generateNatsLeafServerConfig:Pfe,generateClusteringUpgradeV4ServiceConfig:Lfe}});var Vh=M((Jve,l1)=>{"use strict";var at=(k(),v(W)),vfe=ie(),Vo=DS(),US=mr(),$o=It(),ec=jV(),xS=oe(),vl=Q(),Ufe=Ho(),{startWorker:QV,onMessageFromWorkers:xfe}=nt(),Bfe=Ad(),Qve=require("util"),Ffe=require("child_process"),Hfe=require("fs"),{execFile:kfe}=Ffe,Qe;l1.exports={enterPM2Mode:Gfe,start:tc,stop:bO,reload:XV,restart:ZV,list:IO,describe:r1,connect:Ko,kill:Yfe,startAllServices:Wfe,startService:NO,getUniqueServicesList:n1,restartAllServices:zfe,isServiceRegistered:s1,reloadStopStart:i1,restartHdb:t1,deleteProcess:Vfe,startClusteringProcesses:a1,startClusteringThreads:c1,isHdbRestartRunning:Kfe,isClusteringRunning:Qfe,stopClustering:jfe,reloadClustering:Jfe,expectedRestartOfChildren:e1};var $h=!1;xfe(e=>{e.type==="restart"&&xS.initSync(!0)});function Gfe(){$h=!0}o(Gfe,"enterPM2Mode");function Ko(){return Qe||(Qe=require("pm2")),new Promise((e,t)=>{Qe.connect((r,n)=>{r&&t(r),e(n)})})}o(Ko,"connect");var pn,qfe=10,JV;function tc(e,t=!1){if($h)return $fe(e);let r=kfe(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let a=pn.indexOf(r);a>-1&&pn.splice(a,1),!JV&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<qfe&&(Hfe.existsSync(Vo.getHubConfigPath())?tc(e):(await Vo.generateNatsConfig(!0),tc(e),await new Promise(c=>setTimeout(c,3e3)),await Vo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Vo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let a=xS.get(at.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,d;for(;l=c.exec(i);){if(l.index&&$o.LOG_LEVEL_HIERARCHY[a]>=$o.LOG_LEVEL_HIERARCHY[d||"info"]){let h=d===$o.LOG_LEVELS.ERR||d===$o.LOG_LEVELS.WRN?vl.OUTPUTS.STDERR:vl.OUTPUTS.STDOUT;vl.logCustomLevel(d||"info",h,n,i.slice(u,l.index).trim())}let[f,m]=l;u=l.index+f.length,d=$o.LOG_LEVELS[m]}if($o.LOG_LEVEL_HIERARCHY[a]>=$o.LOG_LEVEL_HIERARCHY[d||"info"]){let f=d===$o.LOG_LEVELS.ERR||d===$o.LOG_LEVELS.WRN?vl.OUTPUTS.STDERR:vl.OUTPUTS.STDOUT;vl.logCustomLevel(d||"info",f,n,i.slice(u).trim())}}if(o(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!pn&&(pn=[],!t)){let i=o(()=>{JV=!0,pn&&(pn.map(a=>a.kill()),process.exit(0))},"killChildren");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}pn.push(r)}o(tc,"start");function $fe(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.start(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}o($fe,"startWithPM2");function bO(e){if(!$h){for(let t of pn||[])t.name===e&&(pn.splice(pn.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.stop(e,async(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.delete(e,(i,a)=>{i&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(a)})})})}o(bO,"stop");function XV(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.reload(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}o(XV,"reload");function ZV(e){if(!$h){e1();for(let t of pn||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.restart(e,(n,s)=>{Qe.disconnect(),t(s)})})}o(ZV,"restart");function e1(){for(let e of pn||[])e.config&&(e.config.restarts=0)}o(e1,"expectedRestartOfChildren");function Vfe(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.delete(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}o(Vfe,"deleteProcess");async function t1(){await tc(ec.generateRestart())}o(t1,"restartHdb");async function Kfe(){let e=await IO();for(let t in e)if(e[t].name===at.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}o(Kfe,"isHdbRestartRunning");function IO(){return new Promise(async(e,t)=>{try{await Ko()}catch(r){t(r)}Qe.list((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}o(IO,"list");function r1(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.describe(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}o(r1,"describe");function Yfe(){if(!$h){for(let e of pn||[])e.kill();pn=[];return}return new Promise(async(e,t)=>{try{await Ko()}catch(r){t(r)}Qe.killDaemon((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}o(Yfe,"kill");async function Wfe(){try{await a1(),await c1(),await tc(ec.generateAllServiceConfigs())}catch(e){throw Qe?.disconnect(),e}}o(Wfe,"startAllServices");async function NO(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case at.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=ec.generateMainServerConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=ec.generateNatsIngestServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=ec.generateNatsReplyServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=ec.generateNatsHubServerConfig(),await tc(r,t),await Vo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=ec.generateNatsLeafServerConfig(),await tc(r,t),await Vo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=ec.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await tc(r)}catch(r){throw Qe?.disconnect(),r}}o(NO,"startService");async function n1(){try{let e=await IO(),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 Qe?.disconnect(),e}}o(n1,"getUniqueServicesList");async function zfe(e=[]){try{let t=!1,r=await n1();for(let n=0,s=Object.values(r).length;n<s;n++){let a=Object.values(r)[n].name;e.includes(a)||(a===at.PROCESS_DESCRIPTORS.HDB?t=!0:await ZV(a))}t&&await i1(at.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Qe?.disconnect(),t}}o(zfe,"restartAllServices");async function s1(e){if(pn?.find(r=>r.name===e))return!0;let t=await Bfe.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}o(s1,"isServiceRegistered");async function i1(e){let t=xS.get(at.CONFIG_PARAMS.THREADS_COUNT)??xS.get(at.CONFIG_PARAMS.THREADS),r=await r1(e),n=vfe.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await bO(e),await NO(e)):e===at.PROCESS_DESCRIPTORS.HDB?await t1():await XV(e)}o(i1,"reloadStopStart");var o1;async function a1(e=!1){for(let t in at.CLUSTERING_PROCESSES){let r=at.CLUSTERING_PROCESSES[t];await NO(r,e)}}o(a1,"startClusteringProcesses");async function c1(){o1=QV(at.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await US.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await US.updateLocalStreams();let e=await Ufe.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===at.PRE_4_0_0_VERSION){vl.info("Starting clustering upgrade 4.0.0 process"),QV(at.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}o(c1,"startClusteringThreads");async function jfe(){for(let e in at.CLUSTERING_PROCESSES)if(e!==at.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===at.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await o1.terminate();else{let t=at.CLUSTERING_PROCESSES[e];await bO(t)}}o(jfe,"stopClustering");async function Qfe(){for(let e in at.CLUSTERING_PROCESSES){let t=at.CLUSTERING_PROCESSES[e];if(await s1(t)===!1)return!1}return!0}o(Qfe,"isClusteringRunning");async function Jfe(){await Vo.generateNatsConfig(!0),await US.reloadNATSHub(),await US.reloadNATSLeaf(),await Vo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Vo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}o(Jfe,"reloadClustering")});var CO={};Oe(CO,{compactOnStart:()=>Xfe,copyDb:()=>p1});async function Xfe(){rc.notify("Running compact on start"),console.log("Running compact on start");let e=(0,wO.get)(U.ROOTPATH),t=new Map,r=st();(0,OO.updateConfigValue)(U.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,BS.join)(e,"backup",n+".mdb"),a=(0,BS.join)(e,vc,n+"-copy.mdb"),c=0;try{c=await u1(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){rc.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{dbPath:s,copyDest:a,backupDest:i,recordCount:c}),await p1(n,a),console.log("Backing up",n,"to",i);try{await(0,Ul.move)(s,i,{overwrite:!0})}catch(l){console.log("Error moving database",s,"to",i,l)}}try{Bd()}catch(n){rc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}for(let[n,{dbPath:s,copyDest:i}]of t)console.log("Moving copy compacted",n,"to",s),await(0,Ul.move)(i,s,{overwrite:!0}),await(0,Ul.remove)((0,BS.join)(e,vc,`${n}-copy.mdb-lock`));try{Bd()}catch(n){rc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){rc.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,OO.updateConfigValue)(U.STORAGE_COMPACTONSTART,!1);for(let[s,{dbPath:i,backupDest:a}]of t){console.error("Moving backup database",a,"back to",i);try{await(0,Ul.move)(a,i,{overwrite:!0})}catch(c){console.error(c)}}throw Bd(),n}for(let[n,{backupDest:s,recordCount:i}]of t){let a=!0,c=await u1(n);if(console.log("Database",n,"after compact has a total record count of",c),i!==c){a=!1;let l=`There is a discrepancy between pre and post compact record count for database ${n}.
20
- Total record count before compaction: ${i}, total after: ${c}.
21
- Database backup has not been removed and can be found here: ${s}`;rc.error(l),console.error(l)}(0,wO.get)(U.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||a===!1||(console.log("Removing backup",s),await(0,Ul.remove)(s))}}async function u1(e){let t=await(0,h1.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}function xd(){}async function p1(e,t){console.log(`Copying database ${e} to ${t}`);let r=st()[e];if(!r)throw new Error(`Source database not found: ${e}`);let n;for(let f in r){let m=r[f];m.primaryStore.put=xd,m.primaryStore.remove=xd;for(let h in m.indices){let p=m.indices[h];p.put=xd,p.remove=xd}m.auditStore&&(m.auditStore.put=xd,m.auditStore.remove=xd),n=m.primaryStore.rootStore}if(!n)throw new Error(`Source database does not have any tables: ${e}`);let s=n.dbisDb,i=n.auditStore,a=(0,d1.open)(new f1.default(t)),c=a.openDB(FS.INTERNAL_DBIS_NAME),l,u=0,d=s.useReadTransaction();try{for(let{key:m,value:h}of s.getRange({transaction:d})){let p=h.is_hash_attribute||h.isPrimaryKey,_,g;if(p&&(_=h.compression,g=HS(),g?h.compression=g:delete h.compression,_?.dictionary?.toString()===g?.dictionary?.toString()&&(_=null,g=null)),c.put(m,h),!(p||h.indexed))continue;let y=new m1.default(!p,p);y.encoding="binary",y.compression=_;let T=n.openDB(m,y);T.decoder=null,T.decoderCopies=!1,T.encoding="binary",y.compression=g;let R=a.openDB(m,y);R.encoder=null,console.log("copying",m,"from",e,"to",t),await f(T,R,p,d)}if(i){let m=n.openDB(FS.AUDIT_STORE_NAME,Kh);console.log("copying audit log for",e,"to",t),f(i,m,!1,d)}async function f(m,h,p,_){let g=0,y=0,T=0,R=1e7,N=null;for(;R-- >0;)try{for(let O of m.getKeys({start:N,transaction:_}))try{N=O;let{value:F,version:Z}=m.getEntry(O,{transaction:_});if(F?.length<14&&p){T++;continue}l=h.put(O,F,p?Z:void 0),g++,_.openTimer&&(_.openTimer=0),y+=(O?.length||10)+F.length,u++>5e3&&(await l,console.log("copied",g,"entries",T,"delete records,",y,"bytes"),u=0)}catch(F){console.error("Error copying record",typeof O=="symbol"?"symbol":O,"from",e,"to",t,F)}console.log("finish copying, copied",g,"entries",T,"delete records,",y,"bytes");return}catch{if(typeof N=="string"){if(N==="z")return console.error("Reached end of dbi",N,"for",e,"to",t);N=N.slice(0,-2)+"z"}else if(typeof N=="number")N++;else return console.error("Unknown key type",N,"for",e,"to",t)}}o(f,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{d.done(),a.close()}}var d1,BS,Ul,wO,f1,m1,FS,h1,OO,rc,PO=ue(()=>{De();d1=require("lmdb"),BS=require("path"),Ul=require("fs-extra"),wO=w(oe()),f1=w(hm()),m1=w(mm()),FS=w(qt());k();Mi();h1=w(Ca()),OO=w(bt()),rc=w(Q());o(Xfe,"compactOnStart");o(u1,"getTotalDBRecordCount");o(xd,"noop");o(p1,"copyDb")});var Hd=M((oUe,y1)=>{"use strict";var Zfe=require("minimist"),{isMainThread:DO,parentPort:Wh,threadId:nUe}=require("worker_threads"),ft=(k(),v(W)),Xi=Q(),MO=ie(),GS=DS(),kS=mr(),sUe=It(),S1=bt(),gi=Vh(),E1=Ad(),{compactOnStart:eme}=(PO(),v(CO)),tme=Uc(),{restartWorkers:qS,onMessageByType:rme}=nt(),{handleHDBError:nme,hdbErrors:sme}=ge(),{HTTP_STATUS_CODES:ime}=sme,zh=oe(),{sendOperationToNode:_1,getThisNodeName:ome,monitorNodeCAs:ame}=(rs(),v(Uo)),{getHDBNodeTable:iUe}=(El(),v(qN));zh.initSync();var Yh=`Restarting HarperDB. This may take up to ${ft.RESTART_TIMEOUT_MS/1e3} seconds.`,cme="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",g1="Clustering is not enabled so cannot be restarted",lme="Invalid service",Fd,Ls;y1.exports={restart:T1,restartService:vO};DO&&rme(ft.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await vO({service:e.workerType}):T1({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function T1(e){Ls=Object.keys(e).length===0,Fd=await gi.isServiceRegistered(ft.PROCESS_DESCRIPTORS.HDB);let t=Zfe(process.argv);if(t.service){await vO(t);return}if(Ls&&!Fd){console.error(cme);return}if(Ls&&console.log(Yh),Fd){gi.enterPM2Mode(),Xi.notify(Yh);let r=tme(Object.keys(ft.CONFIG_PARAM_MAP),!0);return MO.isEmptyOrZeroLength(Object.keys(r))||S1.updateConfigValue(void 0,void 0,r,!0,!0),ume(),Yh}return DO?(Xi.notify(Yh),zh.get(ft.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await eme(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{qS()},50)):Wh.postMessage({type:ft.ITC_EVENT_TYPES.RESTART}),Yh}o(T1,"restart");async function vO(e){let{service:t}=e;if(ft.HDB_PROCESS_SERVICES[t]===void 0)throw nme(new Error,lme,ime.BAD_REQUEST,void 0,void 0,!0);if(gi.expectedRestartOfChildren(),Fd=await gi.isServiceRegistered(ft.PROCESS_DESCRIPTORS.HDB),!DO){e.replicated&&ame(),Wh.postMessage({type:ft.ITC_EVENT_TYPES.RESTART,workerType:t}),Wh.ref(),await new Promise(s=>{Wh.on("message",i=>{i.type==="restart-complete"&&(s(),Wh.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===ome())continue;let i;try{({job_id:i}=await _1(s,e))}catch(a){n.push({node:s.name,message:a.message});continue}n.push(await new Promise((a,c)=>{let u=2400,d=setInterval(async()=>{if(u--<=0){clearInterval(d);let h=new Error("Timed out waiting for restart job to complete");h.replicated=n,c(h)}let m=(await _1(s,{operation:"get_job",id:i})).results[0];if(m.status==="COMPLETE"&&(clearInterval(d),a({node:s.name,message:m.message})),m.status==="ERROR"){clearInterval(d);let h=new Error(m.message);h.replicated=n,c(h)}},250)}))}return{replicated:n}}return}let r;switch(t){case ft.HDB_PROCESS_SERVICES.clustering:if(!zh.get(ft.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=g1;break}Ls&&console.log("Restarting clustering"),Xi.notify("Restarting clustering"),await R1();break;case ft.HDB_PROCESS_SERVICES.clustering_config:case ft.HDB_PROCESS_SERVICES["clustering config"]:if(!zh.get(ft.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=g1;break}Ls&&console.log("Restarting clusteringConfig"),Xi.notify("Restarting clustering_config"),await gi.reloadClustering();break;case"custom_functions":case"custom functions":case ft.HDB_PROCESS_SERVICES.harperdb:case ft.HDB_PROCESS_SERVICES.http_workers:case ft.HDB_PROCESS_SERVICES.http:if(Ls&&!Fd){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}Ls&&console.log("Restarting httpWorkers"),Xi.notify("Restarting http_workers"),Ls?await gi.restart(ft.PROCESS_DESCRIPTORS.HDB):await qS("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Xi.error(r),Ls&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}o(vO,"restartService");async function ume(){await R1(),await gi.restart(ft.PROCESS_DESCRIPTORS.HDB),await MO.asyncSetTimeout(2e3),zh.get(ft.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await LO(),Ls&&(await kS.closeConnection(),process.exit(0))}o(ume,"restartPM2Mode");async function R1(){if(!S1.getConfigFromFile(ft.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await E1.getHDBProcessInfo()).clustering.length===0)Xi.trace("Clustering not running, restart will start clustering services"),await GS.generateNatsConfig(!0),await gi.startClusteringProcesses(),await gi.startClusteringThreads(),await LO(),Ls&&await kS.closeConnection();else{await GS.generateNatsConfig(!0),Fd?(Xi.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await gi.restart(ft.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await gi.restart(ft.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await E1.getHDBProcessInfo()).clustering.forEach(s=>{Xi.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await MO.asyncSetTimeout(3e3),await LO(),await kS.updateLocalStreams(),Ls&&await kS.closeConnection(),Xi.trace("Restart clustering restarting ingest and reply service threads");let t=qS(ft.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=qS(ft.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}o(R1,"restartClustering");async function LO(){await GS.removeNatsConfig(ft.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await GS.removeNatsConfig(ft.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}o(LO,"removeNatsConfig")});var M1=M((lUe,D1)=>{"use strict";var cUe=require("lodash"),Un=(k(),v(W)),{handleHDBError:A1,hdbErrors:dme}=ge(),{HDB_ERROR_MSGS:fme,HTTP_STATUS_CODES:mme}=dme,UO=Q();D1.exports={getRolePermissions:pme};var xl=Object.create(null),hme=o(e=>({key:e,perms:{}}),"permsTemplateObj"),w1=o((e=!1)=>({describe:e,tables:{}}),"schemaPermsTemplate"),O1=o((e=!1,t=!1,r=!1,n=!1)=>({[Un.PERMS_CRUD_ENUM.READ]:e,[Un.PERMS_CRUD_ENUM.INSERT]:t,[Un.PERMS_CRUD_ENUM.UPDATE]:r,[Un.PERMS_CRUD_ENUM.DELETE]:n}),"permissionsTemplate"),xO=o((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...O1(t,r,n,s)}),"tablePermsTemplate"),b1=o((e,t=O1())=>({attribute_name:e,describe:L1(t),[jh]:t[jh],[BO]:t[BO],[FO]:t[FO]}),"attrPermsTemplate"),I1=o((e,t=!1)=>({attribute_name:e,describe:t,[jh]:t}),"timestampAttrPermsTemplate"),{READ:jh,INSERT:BO,UPDATE:FO}=Un.PERMS_CRUD_ENUM,C1=Object.values(Un.PERMS_CRUD_ENUM),P1=[jh,BO,FO];function pme(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[Un.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(xl[t]&&xl[t].key===n)return xl[t].perms;let s=Eme(e,r);return xl[t]?xl[t].key=n:xl[t]=hme(n),xl[t].perms=s,s}catch(r){if(!e[Un.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[Un.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<Un.PERMS_UPDATE_RELEASE_TIMESTAMP){let n=`Role permissions for role '${role_name}' must be updated to align with new structure from the 2.2.0 release.`;throw UO.error(n),UO.debug(r),A1(new Error,fme.OUTDATED_PERMS_TRANSLATION_ERROR,mme.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
19
+ `)}catch(r){r.code==="ENOENT"?hn.debug("no license file found"):hn.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(Gde.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=NV(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){hn.error("There was an error parsing the license string."),hn.error(s),e.ram_allocation=Ll.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return uO=e,e}o(hO,"licenseSearch");async function Xde(){return uO||await hO(),uO}o(Xde,"getLicense");function Zde(){let e=hO().ram_allocation,t=process.constrainedMemory?.()||yV();if(t=Math.round(Math.min(t,yV())/2**20),t>e)return`This server has more memory (${t}MB) than HarperDB is licensed for (${e}MB), this should only be used for educational and development purposes.`}o(Zde,"checkMemoryLimit")});var _O=M((xve,LV)=>{var OS=Ld(),OV=require("chalk"),os=Q(),CV=require("prompt"),{promisify:efe}=require("util"),pO=(k(),v(W)),tfe=require("fs-extra"),rfe=require("path"),nfe=ie(),{packageJson:sfe}=Rt(),PV=oe();PV.initSync();var ife=require("moment"),ofe=efe(CV.get),afe=rfe.join(PV.getHdbBasePath(),pO.LICENSE_KEY_DIR_NAME,pO.LICENSE_FILE_NAME,pO.LICENSE_FILE_NAME);LV.exports={getFingerprint:lfe,setLicense:cfe,parseLicense:EO,register:ufe,getRegistrationInfo:ffe};async function cfe(e){if(e&&e.key&&e.company){try{os.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await EO(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw os.error(r),os.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}o(cfe,"setLicense");async function lfe(){let e={};try{e=await OS.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw os.error(r),os.error(t),new Error(r)}return e}o(lfe,"getFingerprint");async function EO(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");os.info("Validating license input...");let r=OS.validateLicense(e,t);if(os.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(os.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(os.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{os.info("writing license to disk"),await tfe.writeFile(afe,JSON.stringify({license_key:e,company:t}))}catch(n){throw os.error("Failed to write License"),n}return"Registration successful."}o(EO,"parseLicense");async function ufe(){let e=await dfe();return EO(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}o(ufe,"register");async function dfe(){let e=await OS.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:OV.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:OV.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{CV.start()}catch(n){os.error(n)}let r;try{r=await ofe(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}o(dfe,"promptForRegistration");async function ffe(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await OS.getLicense()}catch(r){throw os.error(`There was an error when searching licenses due to: ${r.message}`),r}if(nfe.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=sfe.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=ife.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}o(ffe,"getRegistrationInfo")});var MV=M((Fve,DV)=>{"use strict";var mfe=It(),gO=class{static{o(this,"HubConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f,m,h,p){this.port=t,a===null&&(a=void 0),this.server_name=r+mfe.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c}},this.cluster={name:d,port:f,routes:m,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l}},this.accounts={SYS:{users:h},HDB:{users:p}},this.system_account="SYS"}};DV.exports=gO});var xV=M((kve,UV)=>{"use strict";var vV=It(),SO=class{static{o(this,"LeafConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f){this.port=t,f===null&&(f=void 0),this.server_name=r+vV.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+vV.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:d,ca_file:f,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:f,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:f,insecure:!0},urls:a,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};UV.exports=SO});var FV=M((qve,BV)=>{"use strict";var TO=class{static{o(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};BV.exports=TO});var kV=M((Vve,HV)=>{"use strict";var hfe=It(),RO=class{static{o(this,"SysUserObject")}constructor(t,r){this.user=t+hfe.SERVER_SUFFIX.ADMIN,this.password=r}};HV.exports=RO});var DS=M((Yve,$V)=>{"use strict";var Dl=require("path"),Ml=require("fs-extra"),pfe=MV(),Efe=xV(),_fe=FV(),gfe=kV(),yO=Xn(),Md=ie(),vn=bt(),PS=(k(),v(W)),kh=It(),{CONFIG_PARAMS:rr}=PS,vd=Q(),Gh=oe(),GV=ki(),AO=mr(),Sfe=ss(),Dd="clustering",Tfe=1e4,qV=50;$V.exports={generateNatsConfig:yfe,removeNatsConfig:Afe,getHubConfigPath:Rfe};function Rfe(){let e=Gh.get(rr.ROOTPATH);return Dl.join(e,Dd,kh.NATS_CONFIG_FILES.HUB_SERVER)}o(Rfe,"getHubConfigPath");async function yfe(e=!1,t=void 0){console.error("Warning: NATS replication is deprecated and will be removed in version 5.0 of Harper");let r=Gh.get(rr.ROOTPATH);Ml.ensureDirSync(Dl.join(r,"clustering","leaf")),Gh.initSync();let n=vn.getConfigFromFile(rr.CLUSTERING_TLS_CERT_AUTH),s=vn.getConfigFromFile(rr.CLUSTERING_TLS_PRIVATEKEY),i=vn.getConfigFromFile(rr.CLUSTERING_TLS_CERTIFICATE);!await Ml.exists(i)&&!await Ml.exists(!n)&&await Sfe.createNatsCerts();let a=Dl.join(r,Dd,kh.PID_FILES.HUB),c=Dl.join(r,Dd,kh.PID_FILES.LEAF),l=vn.getConfigFromFile(rr.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=Dl.join(r,Dd,kh.NATS_CONFIG_FILES.HUB_SERVER),d=Dl.join(r,Dd,kh.NATS_CONFIG_FILES.LEAF_SERVER),f=vn.getConfigFromFile(rr.CLUSTERING_TLS_INSECURE),m=vn.getConfigFromFile(rr.CLUSTERING_TLS_VERIFY),h=vn.getConfigFromFile(rr.CLUSTERING_NODENAME),p=vn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await AO.checkNATSServerInstalled()||LS("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let _=await yO.listUsers(),g=vn.getConfigFromFile(rr.CLUSTERING_USER),y=await yO.getClusterUser();(Md.isEmpty(y)||y.active!==!0)&&LS(`Invalid cluster user '${cluster_username}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await CS(rr.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await CS(rr.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await CS(rr.CLUSTERING_HUBSERVER_NETWORK_PORT),await CS(rr.CLUSTERING_LEAFSERVER_NETWORK_PORT));let T=[],R=[];for(let[q,K]of _.entries())K.role?.role===PS.ROLE_TYPES_ENUM.CLUSTER_USER&&K.active&&(T.push(new gfe(K.username,GV.decrypt(K.hash))),R.push(new _fe(K.username,GV.decrypt(K.hash))));let N=[],{hub_routes:O}=vn.getClusteringRoutes();if(!Md.isEmptyOrZeroLength(O))for(let q of O)N.push(`tls://${y.sys_name_encoded}:${y.uri_encoded_d_hash}@${q.host}:${q.port}`);let F=new pfe(vn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_NETWORK_PORT),h,a,i,s,n,f,m,p,vn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_CLUSTER_NAME),vn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,T,R);n==null&&(delete F.tls.ca_file,delete F.leafnodes.tls.ca_file),t=Md.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===PS.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Ml.writeJson(u,F),vd.trace(`Hub server config written to ${u}`));let Z=`tls://${y.sys_name_encoded}:${y.uri_encoded_d_hash}@0.0.0.0:${p}`,G=`tls://${y.uri_encoded_name}:${y.uri_encoded_d_hash}@0.0.0.0:${p}`,Y=new Efe(vn.getConfigFromFile(rr.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[Z],[G],T,R,i,s,n,f);n==null&&delete Y.tls.ca_file,(t===void 0||t===PS.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Ml.writeJson(d,Y),vd.trace(`Leaf server config written to ${d}`))}o(yfe,"generateNatsConfig");async function CS(e){let t=Gh.get(e);return Md.isEmpty(t)&&LS(`port undefined for '${e}'`),await Md.isPortTaken(t)&&LS(`'${e}' port '${t}' is is in use by another process, check to see if HarperDB is already running or another process is using this port.`),!0}o(CS,"isPortAvailable");function LS(e){let t=`Error generating clustering config: ${e}`;vd.error(t),console.error(t),process.exit(1)}o(LS,"generateNatsConfigError");async function Afe(e){let{port:t,config_file:r}=AO.getServerConfig(e),{username:n,decrypt_hash:s}=await yO.getClusterUser(),i=0,a=2e3;for(;i<qV;){try{let d=await AO.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){vd.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=qV)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=a*(i*2);u>3e4&&vd.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await Md.asyncSetTimeout(u)}let c="0".repeat(Tfe),l=Dl.join(Gh.get(rr.ROOTPATH),Dd,r);await Ml.writeFile(l,c),await Ml.remove(l),vd.notify(e,"started.")}o(Afe,"removeNatsConfig")});var jV=M((zve,zV)=>{"use strict";var as=oe(),bfe=Ld(),Ke=(k(),v(W)),qh=It(),qo=require("path"),{PACKAGE_ROOT:vS}=Rt(),VV=oe(),MS=ie(),Ud="/dev/null",Ife=qo.join(vS,"launchServiceScripts"),KV=qo.join(vS,"utility/scripts"),Nfe=qo.join(KV,Ke.HDB_RESTART_SCRIPT),YV=qo.resolve(vS,"dependencies",`${process.platform}-${process.arch}`,qh.NATS_BINARY_NAME);function WV(){let t=bfe.licenseSearch().ram_allocation||Ke.RAM_ALLOCATION_ENUM.DEFAULT,r=Ke.MEM_SETTING_KEY+t,n={[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return MS.noBootFile()&&(n[Ke.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=MS.getEnvCliRootPath()),{name:Ke.PROCESS_DESCRIPTORS.HDB,script:Ke.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:vS}}o(WV,"generateMainServerConfig");var wfe=9930;function Ofe(){as.initSync(!0);let e=as.get(Ke.CONFIG_PARAMS.ROOTPATH),t=qo.join(e,"clustering",qh.NATS_CONFIG_FILES.HUB_SERVER),r=qo.join(as.get(Ke.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ke.LOG_NAMES.HDB),n=VV.get(Ke.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=qh.LOG_LEVEL_FLAGS[as.get(Ke.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==wfe?"-"+n:""),script:YV,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return as.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Ud,i.error_file=Ud),i}o(Ofe,"generateNatsHubServerConfig");var Cfe=9940;function Pfe(){as.initSync(!0);let e=as.get(Ke.CONFIG_PARAMS.ROOTPATH),t=qo.join(e,"clustering",qh.NATS_CONFIG_FILES.LEAF_SERVER),r=qo.join(as.get(Ke.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ke.LOG_NAMES.HDB),n=VV.get(Ke.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=qh.LOG_LEVEL_FLAGS[as.get(Ke.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Cfe?"-"+n:""),script:YV,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return as.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Ud,i.error_file=Ud),i}o(Pfe,"generateNatsLeafServerConfig");function Lfe(){as.initSync();let e=qo.join(as.get(Ke.CONFIG_PARAMS.LOGGING_ROOT),Ke.LOG_NAMES.HDB),t={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ke.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:Ife,autorestart:!1};return as.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=Ud,t.error_file=Ud),t}o(Lfe,"generateClusteringUpgradeV4ServiceConfig");function Dfe(){let e={[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.RESTART_HDB};return MS.noBootFile()&&(e[Ke.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=MS.getEnvCliRootPath()),{...{name:Ke.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:KV},script:Nfe}}o(Dfe,"generateRestart");function Mfe(){return{apps:[WV()]}}o(Mfe,"generateAllServiceConfigs");zV.exports={generateAllServiceConfigs:Mfe,generateMainServerConfig:WV,generateRestart:Dfe,generateNatsHubServerConfig:Ofe,generateNatsLeafServerConfig:Pfe,generateClusteringUpgradeV4ServiceConfig:Lfe}});var Vh=M((Jve,l1)=>{"use strict";var at=(k(),v(W)),vfe=ie(),Vo=DS(),US=mr(),$o=It(),ec=jV(),xS=oe(),vl=Q(),Ufe=Ho(),{startWorker:QV,onMessageFromWorkers:xfe}=nt(),Bfe=Ad(),Qve=require("util"),Ffe=require("child_process"),Hfe=require("fs"),{execFile:kfe}=Ffe,Qe;l1.exports={enterPM2Mode:Gfe,start:tc,stop:bO,reload:XV,restart:ZV,list:IO,describe:r1,connect:Ko,kill:Yfe,startAllServices:Wfe,startService:NO,getUniqueServicesList:n1,restartAllServices:zfe,isServiceRegistered:s1,reloadStopStart:i1,restartHdb:t1,deleteProcess:Vfe,startClusteringProcesses:a1,startClusteringThreads:c1,isHdbRestartRunning:Kfe,isClusteringRunning:Qfe,stopClustering:jfe,reloadClustering:Jfe,expectedRestartOfChildren:e1};var $h=!1;xfe(e=>{e.type==="restart"&&xS.initSync(!0)});function Gfe(){$h=!0}o(Gfe,"enterPM2Mode");function Ko(){return Qe||(Qe=require("pm2")),new Promise((e,t)=>{Qe.connect((r,n)=>{r&&t(r),e(n)})})}o(Ko,"connect");var pn,qfe=10,JV;function tc(e,t=!1){if($h)return $fe(e);let r=kfe(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let a=pn.indexOf(r);a>-1&&pn.splice(a,1),!JV&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<qfe&&(Hfe.existsSync(Vo.getHubConfigPath())?tc(e):(await Vo.generateNatsConfig(!0),tc(e),await new Promise(c=>setTimeout(c,3e3)),await Vo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Vo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let a=xS.get(at.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,d;for(;l=c.exec(i);){if(l.index&&$o.LOG_LEVEL_HIERARCHY[a]>=$o.LOG_LEVEL_HIERARCHY[d||"info"]){let h=d===$o.LOG_LEVELS.ERR||d===$o.LOG_LEVELS.WRN?vl.OUTPUTS.STDERR:vl.OUTPUTS.STDOUT;vl.logCustomLevel(d||"info",h,n,i.slice(u,l.index).trim())}let[f,m]=l;u=l.index+f.length,d=$o.LOG_LEVELS[m]}if($o.LOG_LEVEL_HIERARCHY[a]>=$o.LOG_LEVEL_HIERARCHY[d||"info"]){let f=d===$o.LOG_LEVELS.ERR||d===$o.LOG_LEVELS.WRN?vl.OUTPUTS.STDERR:vl.OUTPUTS.STDOUT;vl.logCustomLevel(d||"info",f,n,i.slice(u).trim())}}if(o(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!pn&&(pn=[],!t)){let i=o(()=>{JV=!0,pn&&(pn.map(a=>a.kill()),process.exit(0))},"killChildren");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}pn.push(r)}o(tc,"start");function $fe(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.start(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}o($fe,"startWithPM2");function bO(e){if(!$h){for(let t of pn||[])t.name===e&&(pn.splice(pn.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.stop(e,async(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.delete(e,(i,a)=>{i&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(a)})})})}o(bO,"stop");function XV(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.reload(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}o(XV,"reload");function ZV(e){if(!$h){e1();for(let t of pn||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.restart(e,(n,s)=>{Qe.disconnect(),t(s)})})}o(ZV,"restart");function e1(){for(let e of pn||[])e.config&&(e.config.restarts=0)}o(e1,"expectedRestartOfChildren");function Vfe(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.delete(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}o(Vfe,"deleteProcess");async function t1(){await tc(ec.generateRestart())}o(t1,"restartHdb");async function Kfe(){let e=await IO();for(let t in e)if(e[t].name===at.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}o(Kfe,"isHdbRestartRunning");function IO(){return new Promise(async(e,t)=>{try{await Ko()}catch(r){t(r)}Qe.list((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}o(IO,"list");function r1(e){return new Promise(async(t,r)=>{try{await Ko()}catch(n){r(n)}Qe.describe(e,(n,s)=>{n&&(Qe.disconnect(),r(n)),Qe.disconnect(),t(s)})})}o(r1,"describe");function Yfe(){if(!$h){for(let e of pn||[])e.kill();pn=[];return}return new Promise(async(e,t)=>{try{await Ko()}catch(r){t(r)}Qe.killDaemon((r,n)=>{r&&(Qe.disconnect(),t(r)),Qe.disconnect(),e(n)})})}o(Yfe,"kill");async function Wfe(){try{await a1(),await c1(),await tc(ec.generateAllServiceConfigs())}catch(e){throw Qe?.disconnect(),e}}o(Wfe,"startAllServices");async function NO(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case at.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=ec.generateMainServerConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=ec.generateNatsIngestServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=ec.generateNatsReplyServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=ec.generateNatsHubServerConfig(),await tc(r,t),await Vo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=ec.generateNatsLeafServerConfig(),await tc(r,t),await Vo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=ec.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await tc(r)}catch(r){throw Qe?.disconnect(),r}}o(NO,"startService");async function n1(){try{let e=await IO(),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 Qe?.disconnect(),e}}o(n1,"getUniqueServicesList");async function zfe(e=[]){try{let t=!1,r=await n1();for(let n=0,s=Object.values(r).length;n<s;n++){let a=Object.values(r)[n].name;e.includes(a)||(a===at.PROCESS_DESCRIPTORS.HDB?t=!0:await ZV(a))}t&&await i1(at.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Qe?.disconnect(),t}}o(zfe,"restartAllServices");async function s1(e){if(pn?.find(r=>r.name===e))return!0;let t=await Bfe.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}o(s1,"isServiceRegistered");async function i1(e){let t=xS.get(at.CONFIG_PARAMS.THREADS_COUNT)??xS.get(at.CONFIG_PARAMS.THREADS),r=await r1(e),n=vfe.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await bO(e),await NO(e)):e===at.PROCESS_DESCRIPTORS.HDB?await t1():await XV(e)}o(i1,"reloadStopStart");var o1;async function a1(e=!1){for(let t in at.CLUSTERING_PROCESSES){let r=at.CLUSTERING_PROCESSES[t];await NO(r,e)}}o(a1,"startClusteringProcesses");async function c1(){o1=QV(at.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await US.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await US.updateLocalStreams();let e=await Ufe.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===at.PRE_4_0_0_VERSION){vl.info("Starting clustering upgrade 4.0.0 process"),QV(at.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}o(c1,"startClusteringThreads");async function jfe(){for(let e in at.CLUSTERING_PROCESSES)if(e!==at.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===at.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await o1.terminate();else{let t=at.CLUSTERING_PROCESSES[e];await bO(t)}}o(jfe,"stopClustering");async function Qfe(){for(let e in at.CLUSTERING_PROCESSES){let t=at.CLUSTERING_PROCESSES[e];if(await s1(t)===!1)return!1}return!0}o(Qfe,"isClusteringRunning");async function Jfe(){await Vo.generateNatsConfig(!0),await US.reloadNATSHub(),await US.reloadNATSLeaf(),await Vo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Vo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}o(Jfe,"reloadClustering")});var CO={};Oe(CO,{compactOnStart:()=>Xfe,copyDb:()=>p1});async function Xfe(){rc.notify("Running compact on start"),console.log("Running compact on start");let e=(0,wO.get)(U.ROOTPATH),t=new Map,r=st();(0,OO.updateConfigValue)(U.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,BS.join)(e,"backup",n+".mdb"),a=(0,BS.join)(e,vc,n+"-copy.mdb"),c=0;try{c=await u1(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){rc.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{dbPath:s,copyDest:a,backupDest:i,recordCount:c}),await p1(n,a),console.log("Backing up",n,"to",i);try{await(0,Ul.move)(s,i,{overwrite:!0})}catch(l){console.log("Error moving database",s,"to",i,l)}console.log("Moving copy compacted",n,"to",s),await(0,Ul.move)(a,s,{overwrite:!0}),await(0,Ul.remove)((0,BS.join)(e,vc,`${n}-copy.mdb-lock`))}try{Bd()}catch(n){rc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}try{Bd()}catch(n){rc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){rc.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,OO.updateConfigValue)(U.STORAGE_COMPACTONSTART,!1);for(let[s,{dbPath:i,backupDest:a}]of t){console.error("Moving backup database",a,"back to",i);try{await(0,Ul.move)(a,i,{overwrite:!0})}catch(c){console.error(c)}}throw Bd(),n}for(let[n,{backupDest:s,recordCount:i}]of t){let a=await u1(n);if(console.log("Database",n,"after compact has a total record count of",a),i!==a){let c=`There is a discrepancy between pre and post compact record count for database ${n}.
20
+ Total record count before compaction: ${i}, total after: ${a}.
21
+ Database backup has not been removed and can be found here: ${s}`;rc.error(c),console.error(c)}(0,wO.get)(U.STORAGE_COMPACTONSTARTKEEPBACKUP)!==!0&&(console.log("Removing backup",s),await(0,Ul.remove)(s))}}async function u1(e){let t=await(0,h1.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}function xd(){}async function p1(e,t){console.log(`Copying database ${e} to ${t}`);let r=st()[e];if(!r)throw new Error(`Source database not found: ${e}`);let n;for(let f in r){let m=r[f];m.primaryStore.put=xd,m.primaryStore.remove=xd;for(let h in m.indices){let p=m.indices[h];p.put=xd,p.remove=xd}m.auditStore&&(m.auditStore.put=xd,m.auditStore.remove=xd),n=m.primaryStore.rootStore}if(!n)throw new Error(`Source database does not have any tables: ${e}`);let s=n.dbisDb,i=n.auditStore,a=(0,d1.open)(new f1.default(t)),c=a.openDB(FS.INTERNAL_DBIS_NAME),l,u=0,d=s.useReadTransaction();try{for(let{key:m,value:h}of s.getRange({transaction:d})){let p=h.is_hash_attribute||h.isPrimaryKey,_,g;if(p&&(_=h.compression,g=HS(),g?h.compression=g:delete h.compression,_?.dictionary?.toString()===g?.dictionary?.toString()&&(_=null,g=null)),c.put(m,h),!(p||h.indexed))continue;let y=new m1.default(!p,p);y.encoding="binary",y.compression=_;let T=n.openDB(m,y);T.decoder=null,T.decoderCopies=!1,T.encoding="binary",y.compression=g;let R=a.openDB(m,y);R.encoder=null,console.log("copying",m,"from",e,"to",t),await f(T,R,p,d)}if(i){let m=n.openDB(FS.AUDIT_STORE_NAME,Kh);console.log("copying audit log for",e,"to",t),f(i,m,!1,d)}async function f(m,h,p,_){let g=0,y=0,T=0,R=1e7,N=null;for(;R-- >0;)try{for(let O of m.getKeys({start:N,transaction:_}))try{N=O;let{value:F,version:Z}=m.getEntry(O,{transaction:_});if(F?.length<14&&p){T++;continue}l=h.put(O,F,p?Z:void 0),g++,_.openTimer&&(_.openTimer=0),y+=(O?.length||10)+F.length,u++>5e3&&(await l,console.log("copied",g,"entries",T,"delete records,",y,"bytes"),u=0)}catch(F){console.error("Error copying record",typeof O=="symbol"?"symbol":O,"from",e,"to",t,F)}console.log("finish copying, copied",g,"entries",T,"delete records,",y,"bytes");return}catch{if(typeof N=="string"){if(N==="z")return console.error("Reached end of dbi",N,"for",e,"to",t);N=N.slice(0,-2)+"z"}else if(typeof N=="number")N++;else return console.error("Unknown key type",N,"for",e,"to",t)}}o(f,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{d.done(),a.close()}}var d1,BS,Ul,wO,f1,m1,FS,h1,OO,rc,PO=ue(()=>{De();d1=require("lmdb"),BS=require("path"),Ul=require("fs-extra"),wO=w(oe()),f1=w(hm()),m1=w(mm()),FS=w(qt());k();Mi();h1=w(Ca()),OO=w(bt()),rc=w(Q());o(Xfe,"compactOnStart");o(u1,"getTotalDBRecordCount");o(xd,"noop");o(p1,"copyDb")});var Hd=M((oUe,y1)=>{"use strict";var Zfe=require("minimist"),{isMainThread:DO,parentPort:Wh,threadId:nUe}=require("worker_threads"),ft=(k(),v(W)),Xi=Q(),MO=ie(),GS=DS(),kS=mr(),sUe=It(),S1=bt(),gi=Vh(),E1=Ad(),{compactOnStart:eme}=(PO(),v(CO)),tme=Uc(),{restartWorkers:qS,onMessageByType:rme}=nt(),{handleHDBError:nme,hdbErrors:sme}=ge(),{HTTP_STATUS_CODES:ime}=sme,zh=oe(),{sendOperationToNode:_1,getThisNodeName:ome,monitorNodeCAs:ame}=(rs(),v(Uo)),{getHDBNodeTable:iUe}=(El(),v(qN));zh.initSync();var Yh=`Restarting HarperDB. This may take up to ${ft.RESTART_TIMEOUT_MS/1e3} seconds.`,cme="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",g1="Clustering is not enabled so cannot be restarted",lme="Invalid service",Fd,Ls;y1.exports={restart:T1,restartService:vO};DO&&rme(ft.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await vO({service:e.workerType}):T1({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function T1(e){Ls=Object.keys(e).length===0,Fd=await gi.isServiceRegistered(ft.PROCESS_DESCRIPTORS.HDB);let t=Zfe(process.argv);if(t.service){await vO(t);return}if(Ls&&!Fd){console.error(cme);return}if(Ls&&console.log(Yh),Fd){gi.enterPM2Mode(),Xi.notify(Yh);let r=tme(Object.keys(ft.CONFIG_PARAM_MAP),!0);return MO.isEmptyOrZeroLength(Object.keys(r))||S1.updateConfigValue(void 0,void 0,r,!0,!0),ume(),Yh}return DO?(Xi.notify(Yh),zh.get(ft.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await eme(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{qS()},50)):Wh.postMessage({type:ft.ITC_EVENT_TYPES.RESTART}),Yh}o(T1,"restart");async function vO(e){let{service:t}=e;if(ft.HDB_PROCESS_SERVICES[t]===void 0)throw nme(new Error,lme,ime.BAD_REQUEST,void 0,void 0,!0);if(gi.expectedRestartOfChildren(),Fd=await gi.isServiceRegistered(ft.PROCESS_DESCRIPTORS.HDB),!DO){e.replicated&&ame(),Wh.postMessage({type:ft.ITC_EVENT_TYPES.RESTART,workerType:t}),Wh.ref(),await new Promise(s=>{Wh.on("message",i=>{i.type==="restart-complete"&&(s(),Wh.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===ome())continue;let i;try{({job_id:i}=await _1(s,e))}catch(a){n.push({node:s.name,message:a.message});continue}n.push(await new Promise((a,c)=>{let u=2400,d=setInterval(async()=>{if(u--<=0){clearInterval(d);let h=new Error("Timed out waiting for restart job to complete");h.replicated=n,c(h)}let m=(await _1(s,{operation:"get_job",id:i})).results[0];if(m.status==="COMPLETE"&&(clearInterval(d),a({node:s.name,message:m.message})),m.status==="ERROR"){clearInterval(d);let h=new Error(m.message);h.replicated=n,c(h)}},250)}))}return{replicated:n}}return}let r;switch(t){case ft.HDB_PROCESS_SERVICES.clustering:if(!zh.get(ft.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=g1;break}Ls&&console.log("Restarting clustering"),Xi.notify("Restarting clustering"),await R1();break;case ft.HDB_PROCESS_SERVICES.clustering_config:case ft.HDB_PROCESS_SERVICES["clustering config"]:if(!zh.get(ft.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=g1;break}Ls&&console.log("Restarting clusteringConfig"),Xi.notify("Restarting clustering_config"),await gi.reloadClustering();break;case"custom_functions":case"custom functions":case ft.HDB_PROCESS_SERVICES.harperdb:case ft.HDB_PROCESS_SERVICES.http_workers:case ft.HDB_PROCESS_SERVICES.http:if(Ls&&!Fd){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}Ls&&console.log("Restarting httpWorkers"),Xi.notify("Restarting http_workers"),Ls?await gi.restart(ft.PROCESS_DESCRIPTORS.HDB):await qS("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Xi.error(r),Ls&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}o(vO,"restartService");async function ume(){await R1(),await gi.restart(ft.PROCESS_DESCRIPTORS.HDB),await MO.asyncSetTimeout(2e3),zh.get(ft.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await LO(),Ls&&(await kS.closeConnection(),process.exit(0))}o(ume,"restartPM2Mode");async function R1(){if(!S1.getConfigFromFile(ft.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await E1.getHDBProcessInfo()).clustering.length===0)Xi.trace("Clustering not running, restart will start clustering services"),await GS.generateNatsConfig(!0),await gi.startClusteringProcesses(),await gi.startClusteringThreads(),await LO(),Ls&&await kS.closeConnection();else{await GS.generateNatsConfig(!0),Fd?(Xi.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await gi.restart(ft.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await gi.restart(ft.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await E1.getHDBProcessInfo()).clustering.forEach(s=>{Xi.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await MO.asyncSetTimeout(3e3),await LO(),await kS.updateLocalStreams(),Ls&&await kS.closeConnection(),Xi.trace("Restart clustering restarting ingest and reply service threads");let t=qS(ft.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=qS(ft.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}o(R1,"restartClustering");async function LO(){await GS.removeNatsConfig(ft.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await GS.removeNatsConfig(ft.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}o(LO,"removeNatsConfig")});var M1=M((lUe,D1)=>{"use strict";var cUe=require("lodash"),Un=(k(),v(W)),{handleHDBError:A1,hdbErrors:dme}=ge(),{HDB_ERROR_MSGS:fme,HTTP_STATUS_CODES:mme}=dme,UO=Q();D1.exports={getRolePermissions:pme};var xl=Object.create(null),hme=o(e=>({key:e,perms:{}}),"permsTemplateObj"),w1=o((e=!1)=>({describe:e,tables:{}}),"schemaPermsTemplate"),O1=o((e=!1,t=!1,r=!1,n=!1)=>({[Un.PERMS_CRUD_ENUM.READ]:e,[Un.PERMS_CRUD_ENUM.INSERT]:t,[Un.PERMS_CRUD_ENUM.UPDATE]:r,[Un.PERMS_CRUD_ENUM.DELETE]:n}),"permissionsTemplate"),xO=o((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...O1(t,r,n,s)}),"tablePermsTemplate"),b1=o((e,t=O1())=>({attribute_name:e,describe:L1(t),[jh]:t[jh],[BO]:t[BO],[FO]:t[FO]}),"attrPermsTemplate"),I1=o((e,t=!1)=>({attribute_name:e,describe:t,[jh]:t}),"timestampAttrPermsTemplate"),{READ:jh,INSERT:BO,UPDATE:FO}=Un.PERMS_CRUD_ENUM,C1=Object.values(Un.PERMS_CRUD_ENUM),P1=[jh,BO,FO];function pme(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[Un.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(xl[t]&&xl[t].key===n)return xl[t].perms;let s=Eme(e,r);return xl[t]?xl[t].key=n:xl[t]=hme(n),xl[t].perms=s,s}catch(r){if(!e[Un.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[Un.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<Un.PERMS_UPDATE_RELEASE_TIMESTAMP){let n=`Role permissions for role '${role_name}' must be updated to align with new structure from the 2.2.0 release.`;throw UO.error(n),UO.debug(r),A1(new Error,fme.OUTDATED_PERMS_TRANSLATION_ERROR,mme.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
22
22
  ${r.stack}`;throw UO.error(n),A1(new Error)}}}o(pme,"getRolePermissions");function Eme(e,t){let r=Object.create(null);r.super_user=!1;let n=e.permission;r[Un.SYSTEM_SCHEMA_NAME]=n[Un.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]=_me(t[i]);return}r[i]=w1(),n[i]?(n[i].describe&&(r[i].describe=!0),Object.keys(t[i]).forEach(a=>{if(n[i].tables[a]){let c=n[i].tables[a],l=t[i][a],u=gme(c,l);r[i].describe||C1.forEach(d=>{u[d]&&(r[i].describe=!0)}),r[i].tables[a]=u}else r[i].tables[a]=xO()})):Object.keys(t[i]).forEach(a=>{r[i].tables[a]=xO()})}),r}o(Eme,"translateRolePermissions");function _me(e){let t=w1(!0);return Object.keys(e).forEach(r=>{t.tables[r]=xO(!0,!0,!0,!0,!0)}),t}o(_me,"createStructureUserPermissions");function gme(e,t){let{attribute_permissions:r}=e;if(r?.length>0){let s={...e};s.attribute_permissions=[];let i=r.reduce((u,d)=>{let{attribute_name:f}=d,m=d;return Un.TIME_STAMP_NAMES.includes(f)&&(m=I1(f,d[jh])),u[f]=m,u},{}),a=t.primaryKey||t.hash_attribute,c=!!i[a],l=b1(a);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let d=i[u];d.describe=L1(d),s.attribute_permissions.push(d),c||Sme(d,l)}else if(u!==a){let d;Un.TIME_STAMP_NAMES.includes(u)?d=I1(u):d=b1(u),s.attribute_permissions.push(d)}}),c||s.attribute_permissions.push(l),s.describe=N1(s),s}else return e.describe=N1(e),e}o(gme,"getTableAttrPerms");function N1(e){return C1.filter(t=>e[t]).length>0}o(N1,"getSchemaTableDescribePerm");function L1(e){return P1.filter(t=>e[t]).length>0}o(L1,"getAttributeDescribePerm");function Sme(e,t){P1.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}o(Sme,"checkForHashPerms")});var Qh={};Oe(Qh,{authentication:()=>G1,bypassAuth:()=>Ome,login:()=>GO,logout:()=>qO,start:()=>Cme});function Ome(){k1=!0}async function G1(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,a=[];try{if(i){let h=e.isOperationsServer?bme?Ame:[]:yme?Rme:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let p=En.get(U.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",_=new Ns([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",p],["Access-Control-Allow-Origin",i]]);return $S&&_.set("Access-Control-Allow-Credentials","true"),{status:200,headers:_}}a.push("Access-Control-Allow-Origin",i),$S&&a.push("Access-Control-Allow-Credentials","true")}}let l,u;if($S){i||(i=r.host);let h=(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session=",p=s?.split(/;\s+/)||[];for(let _ of p)if(_.startsWith(h)){let g=_.indexOf(";");l=_.slice(h.length,g===-1?_.length:g),u=await v1.get(l);break}e.session=u||(u={})}let d=o((h,p,_)=>{let g=new VS.AuthAuditLog(h,p,ya.AUTHENTICATION,r["x-forwarded-for"]??e.ip,e.method,e.pathname);g.auth_strategy=_,l&&(g.session_id=l),r.referer&&(g.referer=r.referer),r.origin&&(g.origin=r.origin),p===Xs.SUCCESS?HO.notify(g):HO.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&HO.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 Le.getUser(h,null,e),d(h,Xs.SUCCESS,"mTLS")):Tme("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let f;if(!e.user)if(n){if(f=Bl.get(n),!f){let h=n.indexOf(" "),p=n.slice(0,h),_=n.slice(h+1),g,y;try{switch(p){case"Basic":let T=atob(_),R=T.indexOf(":");g=T.slice(0,R),y=T.slice(R+1),f=g||y?await Le.getUser(g,y,e):null;break;case"Bearer":try{f=await pN(_)}catch(N){if(N.message==="invalid token")try{return await Tg(_),c({status:-1})}catch{throw N}}break}}catch(T){return Nme&&(Bl.get(_)||(Bl.set(_,_),d(g,Xs.FAILURE,p))),c({status:401,body:Na({error:T.message},e)})}Bl.set(n,f),Ime&&d(f.username,Xs.SUCCESS,p)}e.user=f}else u?.user?e.user=await Le.getUser(u.user,null,e):(k1&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,x1.getSuperUser)());$S&&(e.session.update=function(h){let p=En.get(U.AUTHENTICATION_COOKIE_EXPIRES),_=e.protocol==="https"||r.host?.startsWith("localhost:")||r.host?.startsWith("127.0.0.1:")||r.host?.startsWith("::1");if(!l){l=(0,B1.v4)();let g=En.get(U.AUTHENTICATION_COOKIE_DOMAINS),y=p?new Date(Date.now()+(0,kO.convertToMS)(p)).toUTCString():wme,T=g?.find(O=>r.host?.endsWith(O)),N=`${(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session="}${l}; Path=/; Expires=${y}; HttpOnly`;T&&(N+=`; Domain=${T}`),_&&(N+="; SameSite=None; Secure"),a?a.push("Set-Cookie",N):m?.headers?.set&&m.headers.set("Set-Cookie",N)}return _&&(a?(i&&a.push("Access-Control-Expose-Headers","X-Hdb-Session"),a.push("X-Hdb-Session","Secure")):m?.headers?.set&&(i&&m.headers.set("Access-Control-Expose-Headers","X-Hdb-Session"),m.headers.set("X-Hdb-Session","Secure"))),h.id=l,v1.put(h,{expiresAt:p?Date.now()+(0,kO.convertToMS)(p):void 0})},e.login=async function(h,p){let _=e.user=await Le.authenticateUser(h,p,e);e.session.update({user:_&&(_.getId?.()??_.username)})});let m=await t(e);return m&&(m.status===401&&(r["user-agent"]?.startsWith("Mozilla")&&r.accept?.startsWith("text/html")&&ys.loginPath?(m.status=302,m.headers.set("Location",ys.loginPath(e))):m.headers.set("WWW-Authenticate","Basic")),c(m))}catch(l){throw c(l)}function c(l){let u=a.length;if(u>0){let d=l.headers;d||(l.headers=d=new Ns);for(let f=0;f<u;){let m=a[f++];d.set(m,a[f++])}}return a=null,l}o(c,"applyResponseHeaders")}function Cme({server:e,port:t,securePort:r}){e.http(G1,t||r?{port:t,securePort:r}:{port:"all"}),U1||(U1=!0,setInterval(()=>{Bl=new Map},En.get(U.AUTHENTICATION_CACHETTL)).unref(),F1.user.addListener(()=>{Bl=new Map}))}async function GO(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 qO(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var x1,B1,En,VS,F1,kO,H1,Tme,HO,Rme,yme,Ame,bme,v1,$S,k1,Ime,Nme,wme,Bl,U1,KS=ue(()=>{x1=w(Xn());Mr();wu();Zu();De();B1=require("uuid"),En=w(oe());k();VS=w(Q()),F1=w(Dm());th();kO=w(ie());To();H1=(0,VS.forComponent)("authentication"),{debug:Tme}=H1,HO=H1.withTag("auth-event");En.initSync();Rme=En.get(U.HTTP_CORSACCESSLIST),yme=En.get(U.HTTP_CORS),Ame=En.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),bme=En.get(U.OPERATIONSAPI_NETWORK_CORS),v1=ze({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),$S=En.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,k1=process.env.AUTHENTICATION_AUTHORIZELOCAL??En.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,Ime=En.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,Nme=En.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,wme="Tue, 01 Oct 8307 19:33:20 GMT",Bl=new Map;Le.onInvalidatedUser(()=>{Bl=new Map});o(Ome,"bypassAuth");o(G1,"authentication");o(Cme,"start");o(GO,"login");o(qO,"logout")});var z1=M((SUe,W1)=>{"use strict";var we=require("joi"),q1=require("fs-extra"),$1=require("path"),cs=lt(),V1=oe(),K1=(k(),v(W)),Y1=Q(),{hdbErrors:Pme}=ge(),{HDB_ERROR_MSGS:_n}=Pme,Yo=/^[a-zA-Z0-9-_]+$/,Lme=/^[a-zA-Z0-9-_]+$/;W1.exports={getDropCustomFunctionValidator:Mme,setCustomFunctionValidator:vme,addComponentValidator:Fme,dropCustomFunctionProjectValidator:Hme,packageComponentValidator:kme,deployComponentValidator:Gme,setComponentFileValidator:Ume,getComponentFileValidator:Bme,dropComponentFileValidator:xme,addSSHKeyValidator:qme,updateSSHKeyValidator:$me,deleteSSHKeyValidator:Vme,setSSHKnownHostsValidator:Kme};function YS(e,t,r){try{let n=V1.get(K1.CONFIG_PARAMS.COMPONENTSROOT),s=$1.join(n,t);return q1.existsSync(s)?e?t:r.message(_n.PROJECT_EXISTS):e?r.message(_n.NO_PROJECT):t}catch(n){return Y1.error(n),r.message(_n.VALIDATION_ERR)}}o(YS,"checkProjectExists");function Jh(e,t){return e.includes("..")?t.message("Invalid file path"):e}o(Jh,"checkFilePath");function Dme(e,t,r,n){try{let s=V1.get(K1.CONFIG_PARAMS.COMPONENTSROOT),i=$1.join(s,e,t,r+".js");return q1.existsSync(i)?r:n.message(_n.NO_FILE)}catch(s){return Y1.error(s),n.message(_n.VALIDATION_ERR)}}o(Dme,"checkFileExists");function Mme(e){let t=we.object({project:we.string().pattern(Yo).custom(YS.bind(null,!0)).required().messages({"string.pattern.base":_n.BAD_PROJECT_NAME}),type:we.string().valid("helpers","routes").required(),file:we.string().pattern(Yo).custom(Dme.bind(null,e.project,e.type)).custom(Jh).required().messages({"string.pattern.base":_n.BAD_FILE_NAME})});return cs.validateBySchema(e,t)}o(Mme,"getDropCustomFunctionValidator");function vme(e){let t=we.object({project:we.string().pattern(Yo).custom(YS.bind(null,!0)).required().messages({"string.pattern.base":_n.BAD_PROJECT_NAME}),type:we.string().valid("helpers","routes").required(),file:we.string().custom(Jh).required(),function_content:we.string().required()});return cs.validateBySchema(e,t)}o(vme,"setCustomFunctionValidator");function Ume(e){let t=we.object({project:we.string().pattern(Yo).required().messages({"string.pattern.base":_n.BAD_PROJECT_NAME}),file:we.string().custom(Jh).required(),payload:we.string().allow("").optional(),encoding:we.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return cs.validateBySchema(e,t)}o(Ume,"setComponentFileValidator");function xme(e){let t=we.object({project:we.string().pattern(Yo).required().messages({"string.pattern.base":_n.BAD_PROJECT_NAME}),file:we.string().custom(Jh).optional()});return cs.validateBySchema(e,t)}o(xme,"dropComponentFileValidator");function Bme(e){let t=we.object({project:we.string().required(),file:we.string().custom(Jh).required(),encoding:we.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return cs.validateBySchema(e,t)}o(Bme,"getComponentFileValidator");function Fme(e){let t=we.object({project:we.string().pattern(Yo).custom(YS.bind(null,!1)).required().messages({"string.pattern.base":_n.BAD_PROJECT_NAME})});return cs.validateBySchema(e,t)}o(Fme,"addComponentValidator");function Hme(e){let t=we.object({project:we.string().pattern(Yo).custom(YS.bind(null,!0)).required().messages({"string.pattern.base":_n.BAD_PROJECT_NAME})});return cs.validateBySchema(e,t)}o(Hme,"dropCustomFunctionProjectValidator");function kme(e){let t=we.object({project:we.string().pattern(Yo).required().messages({"string.pattern.base":_n.BAD_PROJECT_NAME}),skip_node_modules:we.boolean(),skip_symlinks:we.boolean()});return cs.validateBySchema(e,t)}o(kme,"packageComponentValidator");function Gme(e){let t=we.object({project:we.string().pattern(Yo).required().messages({"string.pattern.base":_n.BAD_PROJECT_NAME}),package:we.string().optional(),restart:we.alternatives().try(we.boolean(),we.string().valid("rolling")).optional()});return cs.validateBySchema(e,t)}o(Gme,"deployComponentValidator");function qme(e){let t=we.object({name:we.string().pattern(Lme).required().messages({"string.pattern.base":_n.BAD_SSH_KEY_NAME}),key:we.string().required(),host:we.string().required(),hostname:we.string().required(),known_hosts:we.string().optional()});return cs.validateBySchema(e,t)}o(qme,"addSSHKeyValidator");function $me(e){let t=we.object({name:we.string().required(),key:we.string().required()});return cs.validateBySchema(e,t)}o($me,"updateSSHKeyValidator");function Vme(e){let t=we.object({name:we.string().required()});return cs.validateBySchema(e,t)}o(Vme,"deleteSSHKeyValidator");function Kme(e){let t=we.object({known_hosts:we.string().required()});return cs.validateBySchema(e,t)}o(Kme,"setSSHKnownHostsValidator")});var ep=M((RUe,Z1)=>{"use strict";var WS=require("joi"),nc=require("path"),kd=require("fs-extra"),{exec:Yme,spawn:Wme}=require("child_process"),zme=require("util"),jme=zme.promisify(Yme),Gd=(k(),v(W)),{PACKAGE_ROOT:Qme}=Rt(),{handleHDBError:Xh,hdbErrors:Jme}=ge(),{HTTP_STATUS_CODES:Zh}=Jme,Fl=oe(),Xme=lt(),sc=Q(),{once:Zme}=require("events");Fl.initSync();var $O=Fl.get(Gd.CONFIG_PARAMS.COMPONENTSROOT),j1="npm install --force --omit=dev --json",ehe=`${j1} --dry-run`,the=Fl.get(Gd.CONFIG_PARAMS.ROOTPATH),zS=nc.join(the,"ssh");Z1.exports={installModules:ihe,auditModules:ohe,installAllRootModules:rhe,uninstallRootModule:nhe,linkHarperdb:she,runCommand:qd};async function rhe(e=!1,t=Fl.get(Gd.CONFIG_PARAMS.ROOTPATH)){await jS();let r=!1,n=process.env;kd.pathExistsSync(zS)&&kd.readdirSync(zS).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+nc.join(zS,"config")+" -o UserKnownHostsFile="+nc.join(zS,"known_hosts"),...process.env},r=!0)});try{let s=Fl.get(Gd.CONFIG_PARAMS.ROOTPATH),i=nc.join(s,"node_modules","harperdb");kd.lstatSync(i).isSymbolicLink()&&kd.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&sc.error("Error removing symlink:",s)}await qd(e?"npm install --force --ignore-scripts":"npm install --force",t,n)}o(rhe,"installAllRootModules");async function nhe(e){await qd(`npm uninstall ${e}`,Fl.get(Gd.CONFIG_PARAMS.ROOTPATH))}o(nhe,"uninstallRootModule");async function she(){await jS(),await qd(`npm link ${Qme}`,Fl.get(Gd.CONFIG_PARAMS.ROOTPATH))}o(she,"linkHarperdb");async function qd(e,t=void 0,r=process.env){sc.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=Wme(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();sc.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();sc.error({tagName:"npm_run_command:stderr"},l),i+=l});let[a]=await Zme(n,"close");if(a!==0)throw new Error(`Command \`${e}\` exited with code ${a}.${i===""?"":` Error: ${i}`}`);return s||void 0}o(qd,"runCommand");async function ihe(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";sc.warn(t,e.projects);let r=X1(e);if(r)throw Xh(r,r.message,Zh.BAD_REQUEST);let{projects:n,dryRun:s}=e,i=s===!0?ehe:j1;await jS(),await J1(n);let a={};for(let c=0,l=n.length;c<l;c++){let u=n[c];a[u]={npm_output:null,npm_error:null};let d=nc.join($O,u),f,m=null;try{let{stdout:h,stderr:p}=await jme(i,{cwd:d});f=h?h.replace(`
23
23
  `,""):null,m=p?p.replace(`
24
24
  `,""):null}catch(h){h.stderr?a[u].npm_error=Q1(h.stderr):a[u].npm_error=h.message;continue}try{a[u].npm_output=JSON.parse(f)}catch{a[u].npm_output=f}try{a[u].npm_error=JSON.parse(m)}catch{a[u].npm_error=m}}return sc.info(`finished installModules with response ${a}`),a.warning=t,a}o(ihe,"installModules");function Q1(e){let t='"error": {',r=e.indexOf('"error": {'),n=e.indexOf(`}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "files": {
3
3
  "main.css": "/static/css/main.a46e2bd8.css",
4
- "main.js": "/static/js/main.7a55c447.js",
4
+ "main.js": "/static/js/main.f935ef10.js",
5
5
  "online-app.js": "/static/js/online-app.060fd872.chunk.js",
6
6
  "offline-app.js": "/static/js/offline-app.54fd7408.chunk.js",
7
7
  "topnav.js": "/static/js/topnav.dc554a18.chunk.js",
@@ -50,6 +50,6 @@
50
50
  },
51
51
  "entrypoints": [
52
52
  "static/css/main.a46e2bd8.css",
53
- "static/js/main.7a55c447.js"
53
+ "static/js/main.f935ef10.js"
54
54
  ]
55
55
  }