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