harperdb 4.5.8 → 4.5.9

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.
Files changed (78) hide show
  1. package/README.md +1 -1
  2. package/bin/harperdb.js +1 -1
  3. package/bin/lite.js +1 -1
  4. package/launchServiceScripts/launchNatsIngestService.js +1 -1
  5. package/launchServiceScripts/launchNatsReplyService.js +1 -1
  6. package/launchServiceScripts/launchUpdateNodes4-0-0.js +1 -1
  7. package/npm-shrinkwrap.json +116 -124
  8. package/package.json +1 -1
  9. package/server/jobs/jobProcess.js +1 -1
  10. package/server/threads/threadServer.js +1 -1
  11. package/studio/build-local/asset-manifest.json +34 -34
  12. package/studio/build-local/index.html +1 -1
  13. package/studio/build-local/static/js/164.a89f3fc2.chunk.js +1 -0
  14. package/studio/build-local/static/js/{101.de926db6.chunk.js → 504.6e6ee908.chunk.js} +2 -2
  15. package/studio/build-local/static/js/833.e460eaf4.chunk.js +1 -0
  16. package/studio/build-local/static/js/browse-csvupload.84fd1ae9.chunk.js +1 -0
  17. package/studio/build-local/static/js/browse-datatable.21e650e1.chunk.js +1 -0
  18. package/studio/build-local/static/js/browse-entitymanager.4547c0d8.chunk.js +1 -0
  19. package/studio/build-local/static/js/browse-jsonviewer.71355c20.chunk.js +1 -0
  20. package/studio/build-local/static/js/custom-functions.31d65bca.chunk.js +1 -0
  21. package/studio/build-local/static/js/instance-cluster.031dcced.chunk.js +1 -0
  22. package/studio/build-local/static/js/instance-config.9a23d6ae.chunk.js +1 -0
  23. package/studio/build-local/static/js/instance-logs.fdaf96ec.chunk.js +1 -0
  24. package/studio/build-local/static/js/instance-roles.984ced56.chunk.js +1 -0
  25. package/studio/build-local/static/js/{instance-status.2f3aaaf7.chunk.js → instance-status.192a5e2f.chunk.js} +1 -1
  26. package/studio/build-local/static/js/instance-users-datatable.40846e47.chunk.js +1 -0
  27. package/studio/build-local/static/js/instance-users-edit.f10344c8.chunk.js +1 -0
  28. package/studio/build-local/static/js/instance-users.adc43a74.chunk.js +1 -0
  29. package/studio/build-local/static/js/instance.9689d62b.chunk.js +1 -0
  30. package/studio/build-local/static/js/instances.f28e5ce7.chunk.js +1 -0
  31. package/studio/build-local/static/js/{main.44262b30.js → main.491129ee.js} +2 -2
  32. package/studio/build-local/static/js/offline-app.5bc1159b.chunk.js +1 -0
  33. package/studio/build-local/static/js/online-app.22102869.chunk.js +1 -0
  34. package/studio/build-local/static/js/organization-billing.56e7e051.chunk.js +1 -0
  35. package/studio/build-local/static/js/organization-users.b46b9e8f.chunk.js +1 -0
  36. package/studio/build-local/static/js/organization.eab64d57.chunk.js +1 -0
  37. package/studio/build-local/static/js/organizations.4567ae59.chunk.js +1 -0
  38. package/studio/build-local/static/js/profile.d45cd6b3.chunk.js +1 -0
  39. package/studio/build-local/static/js/resetPassword.812fc880.chunk.js +1 -0
  40. package/studio/build-local/static/js/roles-jsonviewer.73c8bb9d.chunk.js +1 -0
  41. package/studio/build-local/static/js/signIn.32766fa9.chunk.js +1 -0
  42. package/studio/build-local/static/js/signUp.07fd6662.chunk.js +1 -0
  43. package/studio/build-local/static/js/structure-reloader.ce2b39d2.chunk.js +1 -0
  44. package/studio/build-local/static/js/topnav.e661156c.chunk.js +1 -0
  45. package/studio/build-local/static/js/updatePassword.dcac970c.chunk.js +1 -0
  46. package/utility/scripts/restartHdb.js +1 -1
  47. package/studio/build-local/static/js/164.13a1ca36.chunk.js +0 -1
  48. package/studio/build-local/static/js/833.475ee615.chunk.js +0 -1
  49. package/studio/build-local/static/js/browse-csvupload.cfcf1c79.chunk.js +0 -1
  50. package/studio/build-local/static/js/browse-datatable.85de5169.chunk.js +0 -1
  51. package/studio/build-local/static/js/browse-entitymanager.dddb5da8.chunk.js +0 -1
  52. package/studio/build-local/static/js/browse-jsonviewer.059b4189.chunk.js +0 -1
  53. package/studio/build-local/static/js/custom-functions.2c2e634c.chunk.js +0 -1
  54. package/studio/build-local/static/js/instance-cluster.daef89d8.chunk.js +0 -1
  55. package/studio/build-local/static/js/instance-config.ba645bea.chunk.js +0 -1
  56. package/studio/build-local/static/js/instance-logs.33ace406.chunk.js +0 -1
  57. package/studio/build-local/static/js/instance-roles.0276d83f.chunk.js +0 -1
  58. package/studio/build-local/static/js/instance-users-datatable.f75cf637.chunk.js +0 -1
  59. package/studio/build-local/static/js/instance-users-edit.3a3bc76f.chunk.js +0 -1
  60. package/studio/build-local/static/js/instance-users.70ee5db2.chunk.js +0 -1
  61. package/studio/build-local/static/js/instance.0bbb9d0e.chunk.js +0 -1
  62. package/studio/build-local/static/js/instances.e86d288b.chunk.js +0 -1
  63. package/studio/build-local/static/js/offline-app.edb4be85.chunk.js +0 -1
  64. package/studio/build-local/static/js/online-app.45440c0e.chunk.js +0 -1
  65. package/studio/build-local/static/js/organization-billing.3ff0b995.chunk.js +0 -1
  66. package/studio/build-local/static/js/organization-users.710f96e7.chunk.js +0 -1
  67. package/studio/build-local/static/js/organization.1aa3da8e.chunk.js +0 -1
  68. package/studio/build-local/static/js/organizations.259e09d3.chunk.js +0 -1
  69. package/studio/build-local/static/js/profile.c1840496.chunk.js +0 -1
  70. package/studio/build-local/static/js/resetPassword.37769fbe.chunk.js +0 -1
  71. package/studio/build-local/static/js/roles-jsonviewer.b8cc0628.chunk.js +0 -1
  72. package/studio/build-local/static/js/signIn.061b438e.chunk.js +0 -1
  73. package/studio/build-local/static/js/signUp.cabe1d80.chunk.js +0 -1
  74. package/studio/build-local/static/js/structure-reloader.fd360bad.chunk.js +0 -1
  75. package/studio/build-local/static/js/topnav.1fce7836.chunk.js +0 -1
  76. package/studio/build-local/static/js/updatePassword.dc41627a.chunk.js +0 -1
  77. /package/studio/build-local/static/js/{101.de926db6.chunk.js.LICENSE.txt → 504.6e6ee908.chunk.js.LICENSE.txt} +0 -0
  78. /package/studio/build-local/static/js/{main.44262b30.js.LICENSE.txt → main.491129ee.js.LICENSE.txt} +0 -0
@@ -24,7 +24,7 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
24
24
  `)}catch(r){r.code==="ENOENT"?Xr.debug("no license file found"):Xr.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(ace.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=ZG(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){Xr.error("There was an error parsing the license string."),Xr.error(s),e.ram_allocation=il.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return ON=e,e}a(CN,"licenseSearch");async function gce(){return ON||await CN(),ON}a(gce,"getLicense");function Sce(){let e=CN().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(Sce,"checkMemoryLimit")});var LN=P((aPe,sq)=>{var Hg=Zu(),tq=require("chalk"),zn=Q(),rq=require("prompt"),{promisify:Tce}=require("util"),PN=(H(),D($)),Ace=require("fs-extra"),Rce=require("path"),yce=oe(),{packageJson:bce}=mt(),nq=ue();nq.initSync();var Oce=require("moment"),Nce=Tce(rq.get),wce=Rce.join(nq.getHdbBasePath(),PN.LICENSE_KEY_DIR_NAME,PN.LICENSE_FILE_NAME,PN.LICENSE_FILE_NAME);sq.exports={getFingerprint:Cce,setLicense:Ice,parseLicense:DN,register:Pce,getRegistrationInfo:Lce};async function Ice(e){if(e&&e.key&&e.company){try{zn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await DN(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(Ice,"setLicense");async function Cce(){let e={};try{e=await Hg.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw zn.error(r),zn.error(t),new Error(r)}return e}a(Cce,"getFingerprint");async function DN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");zn.info("Validating license input...");let r=Hg.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 Ace.writeFile(wce,JSON.stringify({license_key:e,company:t}))}catch(n){throw zn.error("Failed to write License"),n}return"Registration successful."}a(DN,"parseLicense");async function Pce(){let e=await Dce();return DN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Pce,"register");async function Dce(){let e=await Hg.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:tq.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:tq.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{rq.start()}catch(n){zn.error(n)}let r;try{r=await Nce(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(Dce,"promptForRegistration");async function Lce(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await Hg.getLicense()}catch(r){throw zn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(yce.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=bce.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=Oce.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(Lce,"getRegistrationInfo")});var oq=P((lPe,iq)=>{"use strict";var Mce=It(),MN=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d,_,h,p){this.port=t,o===null&&(o=void 0),this.server_name=r+Mce.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:p}},this.system_account="SYS"}};iq.exports=MN});var lq=P((dPe,cq)=>{"use strict";var aq=It(),vN=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+aq.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+aq.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"}};cq.exports=vN});var dq=P((_Pe,uq)=>{"use strict";var UN=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};uq.exports=UN});var _q=P((pPe,fq)=>{"use strict";var vce=It(),xN=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+vce.SERVER_SUFFIX.ADMIN,this.password=r}};fq.exports=xN});var qg=P((EPe,mq)=>{"use strict";var ol=require("path"),al=require("fs-extra"),Uce=oq(),xce=lq(),Bce=dq(),Hce=_q(),BN=Gn(),td=oe(),yn=Ot(),Fg=(H(),D($)),ah=It(),{CONFIG_PARAMS:Yt}=Fg,rd=Q(),ch=ue(),hq=ao(),HN=Er(),kce=Qs(),ed="clustering",Fce=1e4,pq=50;mq.exports={generateNatsConfig:qce,removeNatsConfig:$ce,getHubConfigPath:Gce};function Gce(){let e=ch.get(Yt.ROOTPATH);return ol.join(e,ed,ah.NATS_CONFIG_FILES.HUB_SERVER)}a(Gce,"getHubConfigPath");async function qce(e=!1,t=void 0){let r=ch.get(Yt.ROOTPATH);al.ensureDirSync(ol.join(r,"clustering","leaf")),ch.initSync();let n=yn.getConfigFromFile(Yt.CLUSTERING_TLS_CERT_AUTH),s=yn.getConfigFromFile(Yt.CLUSTERING_TLS_PRIVATEKEY),i=yn.getConfigFromFile(Yt.CLUSTERING_TLS_CERTIFICATE);!await al.exists(i)&&!await al.exists(!n)&&await kce.createNatsCerts();let o=ol.join(r,ed,ah.PID_FILES.HUB),c=ol.join(r,ed,ah.PID_FILES.LEAF),l=yn.getConfigFromFile(Yt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=ol.join(r,ed,ah.NATS_CONFIG_FILES.HUB_SERVER),f=ol.join(r,ed,ah.NATS_CONFIG_FILES.LEAF_SERVER),d=yn.getConfigFromFile(Yt.CLUSTERING_TLS_INSECURE),_=yn.getConfigFromFile(Yt.CLUSTERING_TLS_VERIFY),h=yn.getConfigFromFile(Yt.CLUSTERING_NODENAME),p=yn.getConfigFromFile(Yt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await HN.checkNATSServerInstalled()||Gg("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await BN.listUsers(),g=yn.getConfigFromFile(Yt.CLUSTERING_USER),R=await BN.getClusterUser();(td.isEmpty(R)||R.active!==!0)&&Gg(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await kg(Yt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await kg(Yt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await kg(Yt.CLUSTERING_HUBSERVER_NETWORK_PORT),await kg(Yt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[ie,W]of S.entries())W.role?.role===Fg.ROLE_TYPES_ENUM.CLUSTER_USER&&W.active&&(E.push(new Hce(W.username,hq.decrypt(W.hash))),T.push(new Bce(W.username,hq.decrypt(W.hash))));let N=[],{hub_routes:v}=yn.getClusteringRoutes();if(!td.isEmptyOrZeroLength(v))for(let ie of v)N.push(`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@${ie.host}:${ie.port}`);let k=new Uce(yn.getConfigFromFile(Yt.CLUSTERING_HUBSERVER_NETWORK_PORT),h,o,i,s,n,d,_,p,yn.getConfigFromFile(Yt.CLUSTERING_HUBSERVER_CLUSTER_NAME),yn.getConfigFromFile(Yt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete k.tls.ca_file,delete k.leafnodes.tls.ca_file),t=td.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===Fg.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await al.writeJson(u,k),rd.trace(`Hub server config written to ${u}`));let G=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${p}`,Y=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${p}`,X=new xce(yn.getConfigFromFile(Yt.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[G],[Y],E,T,i,s,n,d);n==null&&delete X.tls.ca_file,(t===void 0||t===Fg.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await al.writeJson(f,X),rd.trace(`Leaf server config written to ${f}`))}a(qce,"generateNatsConfig");async function kg(e){let t=ch.get(e);return td.isEmpty(t)&&Gg(`port undefined for '${e}'`),await td.isPortTaken(t)&&Gg(`'${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(kg,"isPortAvailable");function Gg(e){let t=`Error generating clustering config: ${e}`;rd.error(t),console.error(t),process.exit(1)}a(Gg,"generateNatsConfigError");async function $ce(e){let{port:t,config_file:r}=HN.getServerConfig(e),{username:n,decrypt_hash:s}=await BN.getClusterUser(),i=0,o=2e3;for(;i<pq;){try{let f=await HN.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){rd.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=pq)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&&rd.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await td.async_set_timeout(u)}let c="0".repeat(Fce),l=ol.join(ch.get(Yt.ROOTPATH),ed,r);await al.writeFile(l,c),await al.remove(l),rd.notify(e,"started.")}a($ce,"removeNatsConfig")});var Rq=P((SPe,Aq)=>{"use strict";var Qn=ue(),Vce=Zu(),Ge=(H(),D($)),lh=It(),Ro=require("path"),{PACKAGE_ROOT:Vg}=mt(),Eq=ue(),$g=oe(),nd="/dev/null",Kce=Ro.join(Vg,"launchServiceScripts"),gq=Ro.join(Vg,"utility/scripts"),Yce=Ro.join(gq,Ge.HDB_RESTART_SCRIPT),Sq=Ro.resolve(Vg,"dependencies",`${process.platform}-${process.arch}`,lh.NATS_BINARY_NAME);function Tq(){let t=Vce.licenseSearch().ram_allocation||Ge.RAM_ALLOCATION_ENUM.DEFAULT,r=Ge.MEM_SETTING_KEY+t,n={[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return $g.noBootFile()&&(n[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=$g.getEnvCliRootPath()),{name:Ge.PROCESS_DESCRIPTORS.HDB,script:Ge.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:Vg}}a(Tq,"generateMainServerConfig");var Wce=9930;function zce(){Qn.initSync(!0);let e=Qn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=Ro.join(e,"clustering",lh.NATS_CONFIG_FILES.HUB_SERVER),r=Ro.join(Qn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=Eq.get(Ge.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=lh.LOG_LEVEL_FLAGS[Qn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Wce?"-"+n:""),script:Sq,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return Qn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=nd,i.error_file=nd),i}a(zce,"generateNatsHubServerConfig");var Qce=9940;function jce(){Qn.initSync(!0);let e=Qn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=Ro.join(e,"clustering",lh.NATS_CONFIG_FILES.LEAF_SERVER),r=Ro.join(Qn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=Eq.get(Ge.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=lh.LOG_LEVEL_FLAGS[Qn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Qce?"-"+n:""),script:Sq,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return Qn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=nd,i.error_file=nd),i}a(jce,"generateNatsLeafServerConfig");function Jce(){Qn.initSync();let e=Ro.join(Qn.get(Ge.CONFIG_PARAMS.LOGGING_ROOT),Ge.LOG_NAMES.HDB),t={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ge.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:Kce,autorestart:!1};return Qn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=nd,t.error_file=nd),t}a(Jce,"generateClusteringUpgradeV4ServiceConfig");function Xce(){let e={[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.RESTART_HDB};return $g.noBootFile()&&(e[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=$g.getEnvCliRootPath()),{...{name:Ge.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:gq},script:Yce}}a(Xce,"generateRestart");function Zce(){return{apps:[Tq()]}}a(Zce,"generateAllServiceConfigs");Aq.exports={generateAllServiceConfigs:Zce,generateMainServerConfig:Tq,generateRestart:Xce,generateNatsHubServerConfig:zce,generateNatsLeafServerConfig:jce,generateClusteringUpgradeV4ServiceConfig:Jce}});var sd=P((RPe,xq)=>{"use strict";var et=(H(),D($)),ele=oe(),bo=qg(),Kg=Er(),yo=It(),wa=Rq(),Yg=ue(),cl=Q(),tle=Di(),{startWorker:yq,onMessageFromWorkers:rle}=rt(),nle=Wu(),APe=require("util"),sle=require("child_process"),ile=require("fs"),{execFile:ole}=sle,We;xq.exports={enterPM2Mode:ale,start:Ia,stop:kN,reload:Oq,restart:Nq,list:FN,describe:Cq,connect:Oo,kill:fle,startAllServices:_le,startService:GN,getUniqueServicesList:Pq,restartAllServices:hle,isServiceRegistered:Dq,reloadStopStart:Lq,restartHdb:Iq,deleteProcess:ule,startClusteringProcesses:vq,startClusteringThreads:Uq,isHdbRestartRunning:dle,isClusteringRunning:mle,stopClustering:ple,reloadClustering:Ele,expectedRestartOfChildren:wq};var uh=!1;rle(e=>{e.type==="restart"&&Yg.initSync(!0)});function ale(){uh=!0}a(ale,"enterPM2Mode");function Oo(){return We||(We=require("pm2")),new Promise((e,t)=>{We.connect((r,n)=>{r&&t(r),e(n)})})}a(Oo,"connect");var Zr,cle=10,bq;function Ia(e,t=!1){if(uh)return lle(e);let r=ole(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=Zr.indexOf(r);o>-1&&Zr.splice(o,1),!bq&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<cle&&(ile.existsSync(bo.getHubConfigPath())?Ia(e):(await bo.generateNatsConfig(!0),Ia(e),await new Promise(c=>setTimeout(c,3e3)),await bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=Yg.get(et.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&yo.LOG_LEVEL_HIERARCHY[o]>=yo.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===yo.LOG_LEVELS.ERR||f===yo.LOG_LEVELS.WRN?cl.OUTPUTS.STDERR:cl.OUTPUTS.STDOUT;cl.logCustomLevel(f||"info",h,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=yo.LOG_LEVELS[_]}if(yo.LOG_LEVEL_HIERARCHY[o]>=yo.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===yo.LOG_LEVELS.ERR||f===yo.LOG_LEVELS.WRN?cl.OUTPUTS.STDERR:cl.OUTPUTS.STDOUT;cl.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(),!Zr&&(Zr=[],!t)){let i=a(()=>{bq=!0,Zr&&(Zr.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)}Zr.push(r)}a(Ia,"start");function lle(e){return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.start(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}a(lle,"startWithPM2");function kN(e){if(!uh){for(let t of Zr||[])t.name===e&&(Zr.splice(Zr.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.stop(e,async(n,s)=>{n&&(We.disconnect(),r(n)),We.delete(e,(i,o)=>{i&&(We.disconnect(),r(n)),We.disconnect(),t(o)})})})}a(kN,"stop");function Oq(e){return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.reload(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}a(Oq,"reload");function Nq(e){if(!uh){wq();for(let t of Zr||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.restart(e,(n,s)=>{We.disconnect(),t(s)})})}a(Nq,"restart");function wq(){for(let e of Zr||[])e.config&&(e.config.restarts=0)}a(wq,"expectedRestartOfChildren");function ule(e){return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.delete(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}a(ule,"deleteProcess");async function Iq(){await Ia(wa.generateRestart())}a(Iq,"restartHdb");async function dle(){let e=await FN();for(let t in e)if(e[t].name===et.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(dle,"isHdbRestartRunning");function FN(){return new Promise(async(e,t)=>{try{await Oo()}catch(r){t(r)}We.list((r,n)=>{r&&(We.disconnect(),t(r)),We.disconnect(),e(n)})})}a(FN,"list");function Cq(e){return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.describe(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}a(Cq,"describe");function fle(){if(!uh){for(let e of Zr||[])e.kill();Zr=[];return}return new Promise(async(e,t)=>{try{await Oo()}catch(r){t(r)}We.killDaemon((r,n)=>{r&&(We.disconnect(),t(r)),We.disconnect(),e(n)})})}a(fle,"kill");async function _le(){try{await vq(),await Uq(),await Ia(wa.generateAllServiceConfigs())}catch(e){throw We?.disconnect(),e}}a(_le,"startAllServices");async function GN(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case et.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=wa.generateMainServerConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=wa.generateNatsIngestServiceConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=wa.generateNatsReplyServiceConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=wa.generateNatsHubServerConfig(),await Ia(r,t),await bo.removeNatsConfig(e);return;case et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=wa.generateNatsLeafServerConfig(),await Ia(r,t),await bo.removeNatsConfig(e);return;case et.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=wa.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await Ia(r)}catch(r){throw We?.disconnect(),r}}a(GN,"startService");async function Pq(){try{let e=await FN(),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 We?.disconnect(),e}}a(Pq,"getUniqueServicesList");async function hle(e=[]){try{let t=!1,r=await Pq();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===et.PROCESS_DESCRIPTORS.HDB?t=!0:await Nq(o))}t&&await Lq(et.PROCESS_DESCRIPTORS.HDB)}catch(t){throw We?.disconnect(),t}}a(hle,"restartAllServices");async function Dq(e){if(Zr?.find(r=>r.name===e))return!0;let t=await nle.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(Dq,"isServiceRegistered");async function Lq(e){let t=Yg.get(et.CONFIG_PARAMS.THREADS_COUNT)??Yg.get(et.CONFIG_PARAMS.THREADS),r=await Cq(e),n=ele.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await kN(e),await GN(e)):e===et.PROCESS_DESCRIPTORS.HDB?await Iq():await Oq(e)}a(Lq,"reloadStopStart");var Mq;async function vq(e=!1){for(let t in et.CLUSTERING_PROCESSES){let r=et.CLUSTERING_PROCESSES[t];await GN(r,e)}}a(vq,"startClusteringProcesses");async function Uq(){Mq=yq(et.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:et.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await Kg.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await Kg.updateLocalStreams();let e=await tle.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===et.PRE_4_0_0_VERSION){cl.info("Starting clustering upgrade 4.0.0 process"),yq(et.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(Uq,"startClusteringThreads");async function ple(){for(let e in et.CLUSTERING_PROCESSES)if(e!==et.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===et.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await Mq.terminate();else{let t=et.CLUSTERING_PROCESSES[e];await kN(t)}}a(ple,"stopClustering");async function mle(){for(let e in et.CLUSTERING_PROCESSES){let t=et.CLUSTERING_PROCESSES[e];if(await Dq(t)===!1)return!1}return!0}a(mle,"isClusteringRunning");async function Ele(){await bo.generateNatsConfig(!0),await Kg.reloadNATSHub(),await Kg.reloadNATSLeaf(),await bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(Ele,"reloadClustering")});var VN={};Ue(VN,{compactOnStart:()=>gle,copyDb:()=>qq});async function gle(){Ca.notify("Running compact on start"),console.log("Running compact on start");let e=(0,qN.get)(U.ROOTPATH),t=new Map,r=Xe();(0,$N.updateConfigValue)(U.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,Wg.join)(e,"backup",n+".mdb"),o=(0,Wg.join)(e,rc,n+"-copy.mdb"),c=0;try{c=await Bq(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){Ca.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 qq(n,o),console.log("Backing up",n,"to",i),await(0,ll.move)(s,i,{overwrite:!0})}try{id()}catch(n){Ca.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,ll.move)(i,s,{overwrite:!0}),await(0,ll.remove)((0,Wg.join)(e,rc,`${n}-copy.mdb-lock`));try{id()}catch(n){Ca.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){Ca.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,$N.updateConfigValue)(U.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,ll.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw id(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await Bq(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
25
  Total record count before compaction: ${i}, total after: ${c}.
26
26
  Database backup has not been removed and can be found here: ${s}`;Ca.error(l),console.error(l)}(0,qN.get)(U.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||o===!1||(console.log("Removing backup",s),await(0,ll.remove)(s))}}async function Bq(e){let t=await(0,Gq.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}async function qq(e,t){console.log("copyDb start");let r=Xe()[e],n;for(let d in r){n=r[d].primaryStore.rootStore;break}let s=n.dbisDb,i=n.auditStore,o=(0,Hq.open)(new kq.default(t)),c=o.openDB(zg.INTERNAL_DBIS_NAME),l,u=0,f=s.useReadTransaction();try{for(let{key:_,value:h}of s.getRange({transaction:f})){let p=h.is_hash_attribute||h.isPrimaryKey,S,g;if(p&&(S=h.compression,g=Qg(),g?h.compression=g:delete h.compression,S?.dictionary?.toString()===g?.dictionary?.toString()&&(S=null,g=null)),c.put(_,h),!(p||h.indexed))continue;let R=new Fq.default(!p,p);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,p,f)}if(i){let _=n.openDB(zg.AUDIT_STORE_NAME,dh);console.log("copying audit log for",e,"to",t),d(i,_,!1,f)}async function d(_,h,p,S){let g=0,R=0,E=1e7,T=null;for(;E-- >0;)try{for(let N of _.getKeys({start:T,transaction:S}))try{T=N;let{value:v,version:k}=_.getEntry(N,{transaction:S});l=h.put(N,v,p?k:void 0),g++,S.openTimer&&(S.openTimer=0),R+=(N?.length||10)+v.length,u++>5e3&&(await l,console.log("copied",g,"entries",R,"bytes"),u=0)}catch(v){console.error("Error copying record",typeof N=="symbol"?"symbol":N,"from",e,"to",t,v)}console.log("finish copying, copied",g,"entries",R,"bytes");return}catch{if(typeof T=="string"){if(T==="z")return console.error("Reached end of dbi",T,"for",e,"to",t);T=T.slice(0,-2)+"z"}else if(typeof T=="number")T++;else return console.error("Unknown key type",T,"for",e,"to",t)}}a(d,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{f.done(),o.close()}}var Hq,Wg,ll,qN,kq,Fq,zg,Gq,$N,Ca,KN=ye(()=>{Me();Hq=require("lmdb"),Wg=require("path"),ll=require("fs-extra"),qN=M(ue()),kq=M(Mf()),Fq=M(Lf()),zg=M(Ut());H();ro();Gq=M(co()),$N=M(Ot()),Ca=M(Q());a(gle,"compactOnStart");a(Bq,"getTotalDBRecordCount");a(qq,"copyDb")});var ad=P((DPe,Qq)=>{"use strict";var Sle=require("minimist"),{isMainThread:WN,parentPort:_h,threadId:IPe}=require("worker_threads"),nt=(H(),D($)),Li=Q(),zN=oe(),Jg=qg(),jg=Er(),CPe=It(),Yq=Ot(),Js=sd(),$q=Wu(),{compactOnStart:Tle}=(KN(),D(VN)),Ale=nc(),{restartWorkers:Xg,onMessageByType:Rle}=rt(),{handleHDBError:yle,hdb_errors:ble}=pe(),{HTTP_STATUS_CODES:Ole}=ble,hh=ue(),{sendOperationToNode:Vq,getThisNodeName:Nle,monitorNodeCAs:wle}=(fs(),D(ga)),{getHDBNodeTable:PPe}=(Yc(),D(oO));hh.initSync();var fh=`Restarting HarperDB. This may take up to ${nt.RESTART_TIMEOUT_MS/1e3} seconds.`,Ile="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",Kq="Clustering is not enabled so cannot be restarted",Cle="Invalid service",od,gs;Qq.exports={restart:Wq,restartService:QN};WN&&Rle(nt.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await QN({service:e.workerType}):Wq({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function Wq(e){gs=Object.keys(e).length===0,od=await Js.isServiceRegistered(nt.PROCESS_DESCRIPTORS.HDB);let t=Sle(process.argv);if(t.service){await QN(t);return}if(gs&&!od){console.error(Ile);return}if(gs&&console.log(fh),od){Js.enterPM2Mode(),Li.notify(fh);let r=Ale(Object.keys(nt.CONFIG_PARAM_MAP),!0);return zN.isEmptyOrZeroLength(Object.keys(r))||Yq.updateConfigValue(void 0,void 0,r,!0,!0),Ple(),fh}return WN?(Li.notify(fh),hh.get(nt.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await Tle(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{Xg()},50)):_h.postMessage({type:nt.ITC_EVENT_TYPES.RESTART}),fh}a(Wq,"restart");async function QN(e){let{service:t}=e;if(nt.HDB_PROCESS_SERVICES[t]===void 0)throw yle(new Error,Cle,Ole.BAD_REQUEST,void 0,void 0,!0);if(Js.expectedRestartOfChildren(),od=await Js.isServiceRegistered(nt.PROCESS_DESCRIPTORS.HDB),!WN){e.replicated&&wle(),_h.postMessage({type:nt.ITC_EVENT_TYPES.RESTART,workerType:t}),_h.ref(),await new Promise(s=>{_h.on("message",i=>{i.type==="restart-complete"&&(s(),_h.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===Nle())continue;let i;try{({job_id:i}=await Vq(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 Vq(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 nt.HDB_PROCESS_SERVICES.clustering:if(!hh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Kq;break}gs&&console.log("Restarting clustering"),Li.notify("Restarting clustering"),await zq();break;case nt.HDB_PROCESS_SERVICES.clustering_config:case nt.HDB_PROCESS_SERVICES["clustering config"]:if(!hh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=Kq;break}gs&&console.log("Restarting clustering_config"),Li.notify("Restarting clustering_config"),await Js.reloadClustering();break;case"custom_functions":case"custom functions":case nt.HDB_PROCESS_SERVICES.harperdb:case nt.HDB_PROCESS_SERVICES.http_workers:case nt.HDB_PROCESS_SERVICES.http:if(gs&&!od){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}gs&&console.log("Restarting http_workers"),Li.notify("Restarting http_workers"),gs?await Js.restart(nt.PROCESS_DESCRIPTORS.HDB):await Xg("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Li.error(r),gs&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(QN,"restartService");async function Ple(){await zq(),await Js.restart(nt.PROCESS_DESCRIPTORS.HDB),await zN.async_set_timeout(2e3),hh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await YN(),gs&&(await jg.closeConnection(),process.exit(0))}a(Ple,"restartPM2Mode");async function zq(){if(!Yq.getConfigFromFile(nt.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await $q.getHDBProcessInfo()).clustering.length===0)Li.trace("Clustering not running, restart will start clustering services"),await Jg.generateNatsConfig(!0),await Js.startClusteringProcesses(),await Js.startClusteringThreads(),await YN(),gs&&await jg.closeConnection();else{await Jg.generateNatsConfig(!0),od?(Li.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await Js.restart(nt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Js.restart(nt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await $q.getHDBProcessInfo()).clustering.forEach(s=>{Li.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await zN.async_set_timeout(3e3),await YN(),await jg.updateLocalStreams(),gs&&await jg.closeConnection(),Li.trace("Restart clustering restarting ingest and reply service threads");let t=Xg(nt.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=Xg(nt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(zq,"restartClustering");async function YN(){await Jg.removeNatsConfig(nt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Jg.removeNatsConfig(nt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(YN,"removeNatsConfig")});var o$=P((vPe,i$)=>{"use strict";var MPe=require("lodash"),bn=(H(),D($)),{handleHDBError:jq,hdb_errors:Dle}=pe(),{HDB_ERROR_MSGS:Lle,HTTP_STATUS_CODES:Mle}=Dle,jN=Q();i$.exports={getRolePermissions:Ule};var ul=Object.create(null),vle=a(e=>({key:e,perms:{}}),"perms_template_obj"),e$=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),t$=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"),JN=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...t$(t,r,n,s)}),"table_perms_template"),Jq=a((e,t=t$())=>({attribute_name:e,describe:s$(t),[ph]:t[ph],[XN]:t[XN],[ZN]:t[ZN]}),"attr_perms_template"),Xq=a((e,t=!1)=>({attribute_name:e,describe:t,[ph]:t}),"timestamp_attr_perms_template"),{READ:ph,INSERT:XN,UPDATE:ZN}=bn.PERMS_CRUD_ENUM,r$=Object.values(bn.PERMS_CRUD_ENUM),n$=[ph,XN,ZN];function Ule(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(ul[t]&&ul[t].key===n)return ul[t].perms;let s=xle(e,r);return ul[t]?ul[t].key=n:ul[t]=vle(n),ul[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 jN.error(n),jN.debug(r),jq(new Error,Lle.OUTDATED_PERMS_TRANSLATION_ERROR,Mle.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
27
- ${r.stack}`;throw jN.error(n),jq(new Error)}}}a(Ule,"getRolePermissions");function xle(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]=Ble(t[i]);return}r[i]=e$(),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=Hle(c,l);r[i].describe||r$.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=JN()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=JN()})}),r}a(xle,"translateRolePermissions");function Ble(e){let t=e$(!0);return Object.keys(e).forEach(r=>{t.tables[r]=JN(!0,!0,!0,!0,!0)}),t}a(Ble,"createStructureUserPermissions");function Hle(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)&&(_=Xq(d,f[ph])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=Jq(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=s$(f),s.attribute_permissions.push(f),c||kle(f,l)}else if(u!==o){let f;bn.TIME_STAMP_NAMES.includes(u)?f=Xq(u):f=Jq(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=Zq(s),s}else return e.describe=Zq(e),e}a(Hle,"getTableAttrPerms");function Zq(e){return r$.filter(t=>e[t]).length>0}a(Zq,"getSchemaTableDescribePerm");function s$(e){return n$.filter(t=>e[t]).length>0}a(s$,"getAttributeDescribePerm");function kle(e,t){n$.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(kle,"checkForHashPerms")});var mh={};Ue(mh,{authentication:()=>_$,bypassAuth:()=>Wle,login:()=>Qle,logout:()=>jle,start:()=>zle});function Wle(){f$=!0}async function _$(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let h=e.isOperationsServer?$le?qle:[]:Gle?Fle:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let p=en.get(U.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",S=new ho([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",p],["Access-Control-Allow-Origin",i]]);return Zg&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),Zg&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(Zg){i||(i=r.host);let h=(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session=",p=s?.split(/;\s+/)||[];for(let S of p)if(S.startsWith(h)){let g=S.indexOf(";");l=S.slice(h.length,g===-1?S.length:g),u=await a$.get(l);break}e.session=u||(u={})}let f=a((h,p,S)=>{let g=new cd.AuthAuditLog(h,p,Vo.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),p===Ls.SUCCESS?ew.notify(g):ew.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&ew.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 ze.getUser(h,null,e),f(h,Ls.SUCCESS,"mTLS")):(0,cd.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let d;if(!e.user)if(n){if(d=dl.get(n),!d){let h=n.indexOf(" "),p=n.slice(0,h),S=n.slice(h+1),g,R;try{switch(p){case"Basic":let E=atob(S),T=E.indexOf(":");g=E.slice(0,T),R=E.slice(T+1),d=g||R?await ze.getUser(g,R,e):null;break;case"Bearer":try{d=await Bb(S)}catch(N){if(N.message==="invalid token")try{return await vE(S),c({status:-1})}catch{throw N}}break}}catch(E){return Kle&&(dl.get(S)||(dl.set(S,S),f(g,Ls.FAILURE,p))),c({status:401,body:na({error:E.message},e)})}dl.set(n,d),Vle&&f(d.username,Ls.SUCCESS,p)}e.user=d}else u?.user?e.user=await ze.getUser(u.user,null,e):(f$&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,l$.getSuperUser)());Zg&&(e.session.update=function(h){let p=en.get(U.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,u$.v4)();let S=en.get(U.AUTHENTICATION_COOKIE_DOMAINS),g=p?new Date(Date.now()+(0,tw.convertToMS)(p)).toUTCString():Yle,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,a$.put(h,{expiresAt:p?Date.now()+(0,tw.convertToMS)(p):void 0})},e.login=async function(h,p){let S=e.user=await ze.authenticateUser(h,p,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")&&_i.loginPath?(_.status=302,_.headers.set("Location",_i.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 ho);for(let d=0;d<u;){let _=o[d++];f.set(_,o[d++])}}return o=null,l}a(c,"applyResponseHeaders")}function zle({server:e,port:t,securePort:r}){e.http(_$,t||r?{port:t,securePort:r}:{port:"all"}),c$||(c$=!0,setInterval(()=>{dl=new Map},en.get(U.AUTHENTICATION_CACHETTL)).unref(),d$.user.addListener(()=>{dl=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 jle(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var l$,u$,en,cd,d$,tw,ew,Fle,Gle,qle,$le,a$,Zg,f$,Vle,Kle,Yle,dl,c$,eS=ye(()=>{l$=M(Gn());qr();Jl();bu();Me();u$=require("uuid"),en=M(ue());H();cd=M(Q()),d$=M(jf());T_();tw=M(oe());Xi();ew=(0,cd.loggerWithTag)("auth-event");en.initSync();Fle=en.get(U.HTTP_CORSACCESSLIST),Gle=en.get(U.HTTP_CORS),qle=en.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),$le=en.get(U.OPERATIONSAPI_NETWORK_CORS),a$=ut({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),Zg=en.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,f$=process.env.AUTHENTICATION_AUTHORIZELOCAL??en.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,Vle=en.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,Kle=en.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,Yle="Tue, 01 Oct 8307 19:33:20 GMT",dl=new Map;ze.onInvalidatedUser(()=>{dl=new Map});a(Wle,"bypassAuth");a(_$,"authentication");a(zle,"start");a(Qle,"login");a(jle,"logout")});var T$=P((VPe,S$)=>{"use strict";var Ne=require("joi"),h$=require("fs-extra"),p$=require("path"),jn=tt(),m$=ue(),E$=(H(),D($)),g$=Q(),{hdb_errors:Jle}=pe(),{HDB_ERROR_MSGS:tn}=Jle,No=/^[a-zA-Z0-9-_]+$/,Xle=/^[a-zA-Z0-9-_]+$/;S$.exports={getDropCustomFunctionValidator:eue,setCustomFunctionValidator:tue,addComponentValidator:iue,dropCustomFunctionProjectValidator:oue,packageComponentValidator:aue,deployComponentValidator:cue,setComponentFileValidator:rue,getComponentFileValidator:sue,dropComponentFileValidator:nue,addSSHKeyValidator:lue,updateSSHKeyValidator:uue,deleteSSHKeyValidator:due,setSSHKnownHostsValidator:fue};function tS(e,t,r){try{let n=m$.get(E$.CONFIG_PARAMS.COMPONENTSROOT),s=p$.join(n,t);return h$.existsSync(s)?e?t:r.message(tn.PROJECT_EXISTS):e?r.message(tn.NO_PROJECT):t}catch(n){return g$.error(n),r.message(tn.VALIDATION_ERR)}}a(tS,"checkProjectExists");function Eh(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(Eh,"checkFilePath");function Zle(e,t,r,n){try{let s=m$.get(E$.CONFIG_PARAMS.COMPONENTSROOT),i=p$.join(s,e,t,r+".js");return h$.existsSync(i)?r:n.message(tn.NO_FILE)}catch(s){return g$.error(s),n.message(tn.VALIDATION_ERR)}}a(Zle,"checkFileExists");function eue(e){let t=Ne.object({project:Ne.string().pattern(No).custom(tS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(No).custom(Zle.bind(null,e.project,e.type)).custom(Eh).required().messages({"string.pattern.base":tn.BAD_FILE_NAME})});return jn.validateBySchema(e,t)}a(eue,"getDropCustomFunctionValidator");function tue(e){let t=Ne.object({project:Ne.string().pattern(No).custom(tS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(Eh).required(),function_content:Ne.string().required()});return jn.validateBySchema(e,t)}a(tue,"setCustomFunctionValidator");function rue(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),file:Ne.string().custom(Eh).required(),payload:Ne.string().allow("").optional(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return jn.validateBySchema(e,t)}a(rue,"setComponentFileValidator");function nue(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),file:Ne.string().custom(Eh).optional()});return jn.validateBySchema(e,t)}a(nue,"dropComponentFileValidator");function sue(e){let t=Ne.object({project:Ne.string().required(),file:Ne.string().custom(Eh).required(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return jn.validateBySchema(e,t)}a(sue,"getComponentFileValidator");function iue(e){let t=Ne.object({project:Ne.string().pattern(No).custom(tS.bind(null,!1)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME})});return jn.validateBySchema(e,t)}a(iue,"addComponentValidator");function oue(e){let t=Ne.object({project:Ne.string().pattern(No).custom(tS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME})});return jn.validateBySchema(e,t)}a(oue,"dropCustomFunctionProjectValidator");function aue(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return jn.validateBySchema(e,t)}a(aue,"packageComponentValidator");function cue(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),package:Ne.string().optional(),restart:Ne.alternatives().try(Ne.boolean(),Ne.string().valid("rolling")).optional()});return jn.validateBySchema(e,t)}a(cue,"deployComponentValidator");function lue(e){let t=Ne.object({name:Ne.string().pattern(Xle).required().messages({"string.pattern.base":tn.BAD_SSH_KEY_NAME}),key:Ne.string().required(),host:Ne.string().required(),hostname:Ne.string().required(),known_hosts:Ne.string().optional()});return jn.validateBySchema(e,t)}a(lue,"addSSHKeyValidator");function uue(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return jn.validateBySchema(e,t)}a(uue,"updateSSHKeyValidator");function due(e){let t=Ne.object({name:Ne.string().required()});return jn.validateBySchema(e,t)}a(due,"deleteSSHKeyValidator");function fue(e){let t=Ne.object({known_hosts:Ne.string().required()});return jn.validateBySchema(e,t)}a(fue,"setSSHKnownHostsValidator")});var Th=P((YPe,O$)=>{"use strict";var rS=require("joi"),Pa=require("path"),ld=require("fs-extra"),{exec:_ue,spawn:hue}=require("child_process"),pue=require("util"),mue=pue.promisify(_ue),ud=(H(),D($)),{PACKAGE_ROOT:Eue}=mt(),{handleHDBError:gh,hdb_errors:gue}=pe(),{HTTP_STATUS_CODES:Sh}=gue,fl=ue(),Sue=tt(),Da=Q(),{once:Tue}=require("events");fl.initSync();var rw=fl.get(ud.CONFIG_PARAMS.COMPONENTSROOT),A$="npm install --force --omit=dev --json",Aue=`${A$} --dry-run`,Rue=fl.get(ud.CONFIG_PARAMS.ROOTPATH),nS=Pa.join(Rue,"ssh");O$.exports={installModules:Nue,auditModules:wue,installAllRootModules:yue,uninstallRootModule:bue,linkHarperdb:Oue,runCommand:dd};async function yue(e=!1,t=fl.get(ud.CONFIG_PARAMS.ROOTPATH)){await sS();let r=!1,n=process.env;ld.pathExistsSync(nS)&&ld.readdirSync(nS).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+Pa.join(nS,"config")+" -o UserKnownHostsFile="+Pa.join(nS,"known_hosts"),...process.env},r=!0)});try{let s=fl.get(ud.CONFIG_PARAMS.ROOTPATH),i=Pa.join(s,"node_modules","harperdb");ld.lstatSync(i).isSymbolicLink()&&ld.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&Da.error("Error removing symlink:",s)}await dd(e?"npm install --force --ignore-scripts --no-bin-links":"npm install --force --no-bin-links",t,n)}a(yue,"installAllRootModules");async function bue(e){await dd(`npm uninstall ${e}`,fl.get(ud.CONFIG_PARAMS.ROOTPATH))}a(bue,"uninstallRootModule");async function Oue(){await sS(),await dd(`npm link ${Eue}`,fl.get(ud.CONFIG_PARAMS.ROOTPATH))}a(Oue,"linkHarperdb");async function dd(e,t=void 0,r=process.env){Da.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=hue(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();Da.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();Da.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await Tue(n,"close");if(o!==0)throw new Error(`Command \`${e}\` exited with code ${o}.${i===""?"":` Error: ${i}`}`);return s||void 0}a(dd,"runCommand");async function Nue(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";Da.warn(t,e.projects);let r=b$(e);if(r)throw gh(r,r.message,Sh.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?Aue:A$;await sS(),await y$(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=Pa.join(rw,u),d,_=null;try{let{stdout:h,stderr:p}=await mue(i,{cwd:f});d=h?h.replace(`
27
+ ${r.stack}`;throw jN.error(n),jq(new Error)}}}a(Ule,"getRolePermissions");function xle(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]=Ble(t[i]);return}r[i]=e$(),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=Hle(c,l);r[i].describe||r$.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=JN()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=JN()})}),r}a(xle,"translateRolePermissions");function Ble(e){let t=e$(!0);return Object.keys(e).forEach(r=>{t.tables[r]=JN(!0,!0,!0,!0,!0)}),t}a(Ble,"createStructureUserPermissions");function Hle(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)&&(_=Xq(d,f[ph])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=Jq(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=s$(f),s.attribute_permissions.push(f),c||kle(f,l)}else if(u!==o){let f;bn.TIME_STAMP_NAMES.includes(u)?f=Xq(u):f=Jq(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=Zq(s),s}else return e.describe=Zq(e),e}a(Hle,"getTableAttrPerms");function Zq(e){return r$.filter(t=>e[t]).length>0}a(Zq,"getSchemaTableDescribePerm");function s$(e){return n$.filter(t=>e[t]).length>0}a(s$,"getAttributeDescribePerm");function kle(e,t){n$.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(kle,"checkForHashPerms")});var mh={};Ue(mh,{authentication:()=>_$,bypassAuth:()=>Wle,login:()=>Qle,logout:()=>jle,start:()=>zle});function Wle(){f$=!0}async function _$(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let h=e.isOperationsServer?$le?qle:[]:Gle?Fle:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let p=en.get(U.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",S=new ho([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",p],["Access-Control-Allow-Origin",i]]);return Zg&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),Zg&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(Zg){i||(i=r.host);let h=(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session=",p=s?.split(/;\s+/)||[];for(let S of p)if(S.startsWith(h)){let g=S.indexOf(";");l=S.slice(h.length,g===-1?S.length:g),u=await a$.get(l);break}e.session=u||(u={})}let f=a((h,p,S)=>{let g=new cd.AuthAuditLog(h,p,Vo.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),p===Ls.SUCCESS?ew.notify(g):ew.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&ew.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 ze.getUser(h,null,e),f(h,Ls.SUCCESS,"mTLS")):(0,cd.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let d;if(!e.user)if(n){if(d=dl.get(n),!d){let h=n.indexOf(" "),p=n.slice(0,h),S=n.slice(h+1),g,R;try{switch(p){case"Basic":let E=atob(S),T=E.indexOf(":");g=E.slice(0,T),R=E.slice(T+1),d=g||R?await ze.getUser(g,R,e):null;break;case"Bearer":try{d=await Bb(S)}catch(N){if(N.message==="invalid token")try{return await vE(S),c({status:-1})}catch{throw N}}break}}catch(E){return Kle&&(dl.get(S)||(dl.set(S,S),f(g,Ls.FAILURE,p))),c({status:401,body:na({error:E.message},e)})}dl.set(n,d),Vle&&f(d.username,Ls.SUCCESS,p)}e.user=d}else u?.user?e.user=await ze.getUser(u.user,null,e):(f$&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,l$.getSuperUser)());Zg&&(e.session.update=function(h){let p=en.get(U.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,u$.v4)();let S=en.get(U.AUTHENTICATION_COOKIE_DOMAINS),g=p?new Date(Date.now()+(0,tw.convertToMS)(p)).toUTCString():Yle,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,a$.put(h,{expiresAt:p?Date.now()+(0,tw.convertToMS)(p):void 0})},e.login=async function(h,p){let S=e.user=await ze.authenticateUser(h,p,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")&&_i.loginPath?(_.status=302,_.headers.set("Location",_i.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 ho);for(let d=0;d<u;){let _=o[d++];f.set(_,o[d++])}}return o=null,l}a(c,"applyResponseHeaders")}function zle({server:e,port:t,securePort:r}){e.http(_$,t||r?{port:t,securePort:r}:{port:"all"}),c$||(c$=!0,setInterval(()=>{dl=new Map},en.get(U.AUTHENTICATION_CACHETTL)).unref(),d$.user.addListener(()=>{dl=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 jle(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var l$,u$,en,cd,d$,tw,ew,Fle,Gle,qle,$le,a$,Zg,f$,Vle,Kle,Yle,dl,c$,eS=ye(()=>{l$=M(Gn());qr();Jl();bu();Me();u$=require("uuid"),en=M(ue());H();cd=M(Q()),d$=M(jf());T_();tw=M(oe());Xi();ew=(0,cd.loggerWithTag)("auth-event");en.initSync();Fle=en.get(U.HTTP_CORSACCESSLIST),Gle=en.get(U.HTTP_CORS),qle=en.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),$le=en.get(U.OPERATIONSAPI_NETWORK_CORS),a$=ut({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),Zg=en.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,f$=process.env.AUTHENTICATION_AUTHORIZELOCAL??en.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,Vle=en.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,Kle=en.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,Yle="Tue, 01 Oct 8307 19:33:20 GMT",dl=new Map;ze.onInvalidatedUser(()=>{dl=new Map});a(Wle,"bypassAuth");a(_$,"authentication");a(zle,"start");a(Qle,"login");a(jle,"logout")});var T$=P((VPe,S$)=>{"use strict";var Ne=require("joi"),h$=require("fs-extra"),p$=require("path"),jn=tt(),m$=ue(),E$=(H(),D($)),g$=Q(),{hdb_errors:Jle}=pe(),{HDB_ERROR_MSGS:tn}=Jle,No=/^[a-zA-Z0-9-_]+$/,Xle=/^[a-zA-Z0-9-_]+$/;S$.exports={getDropCustomFunctionValidator:eue,setCustomFunctionValidator:tue,addComponentValidator:iue,dropCustomFunctionProjectValidator:oue,packageComponentValidator:aue,deployComponentValidator:cue,setComponentFileValidator:rue,getComponentFileValidator:sue,dropComponentFileValidator:nue,addSSHKeyValidator:lue,updateSSHKeyValidator:uue,deleteSSHKeyValidator:due,setSSHKnownHostsValidator:fue};function tS(e,t,r){try{let n=m$.get(E$.CONFIG_PARAMS.COMPONENTSROOT),s=p$.join(n,t);return h$.existsSync(s)?e?t:r.message(tn.PROJECT_EXISTS):e?r.message(tn.NO_PROJECT):t}catch(n){return g$.error(n),r.message(tn.VALIDATION_ERR)}}a(tS,"checkProjectExists");function Eh(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(Eh,"checkFilePath");function Zle(e,t,r,n){try{let s=m$.get(E$.CONFIG_PARAMS.COMPONENTSROOT),i=p$.join(s,e,t,r+".js");return h$.existsSync(i)?r:n.message(tn.NO_FILE)}catch(s){return g$.error(s),n.message(tn.VALIDATION_ERR)}}a(Zle,"checkFileExists");function eue(e){let t=Ne.object({project:Ne.string().pattern(No).custom(tS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(No).custom(Zle.bind(null,e.project,e.type)).custom(Eh).required().messages({"string.pattern.base":tn.BAD_FILE_NAME})});return jn.validateBySchema(e,t)}a(eue,"getDropCustomFunctionValidator");function tue(e){let t=Ne.object({project:Ne.string().pattern(No).custom(tS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(Eh).required(),function_content:Ne.string().required()});return jn.validateBySchema(e,t)}a(tue,"setCustomFunctionValidator");function rue(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),file:Ne.string().custom(Eh).required(),payload:Ne.string().allow("").optional(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return jn.validateBySchema(e,t)}a(rue,"setComponentFileValidator");function nue(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),file:Ne.string().custom(Eh).optional()});return jn.validateBySchema(e,t)}a(nue,"dropComponentFileValidator");function sue(e){let t=Ne.object({project:Ne.string().required(),file:Ne.string().custom(Eh).required(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return jn.validateBySchema(e,t)}a(sue,"getComponentFileValidator");function iue(e){let t=Ne.object({project:Ne.string().pattern(No).custom(tS.bind(null,!1)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME})});return jn.validateBySchema(e,t)}a(iue,"addComponentValidator");function oue(e){let t=Ne.object({project:Ne.string().pattern(No).custom(tS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME})});return jn.validateBySchema(e,t)}a(oue,"dropCustomFunctionProjectValidator");function aue(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return jn.validateBySchema(e,t)}a(aue,"packageComponentValidator");function cue(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),package:Ne.string().optional(),restart:Ne.alternatives().try(Ne.boolean(),Ne.string().valid("rolling")).optional()});return jn.validateBySchema(e,t)}a(cue,"deployComponentValidator");function lue(e){let t=Ne.object({name:Ne.string().pattern(Xle).required().messages({"string.pattern.base":tn.BAD_SSH_KEY_NAME}),key:Ne.string().required(),host:Ne.string().required(),hostname:Ne.string().required(),known_hosts:Ne.string().optional()});return jn.validateBySchema(e,t)}a(lue,"addSSHKeyValidator");function uue(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return jn.validateBySchema(e,t)}a(uue,"updateSSHKeyValidator");function due(e){let t=Ne.object({name:Ne.string().required()});return jn.validateBySchema(e,t)}a(due,"deleteSSHKeyValidator");function fue(e){let t=Ne.object({known_hosts:Ne.string().required()});return jn.validateBySchema(e,t)}a(fue,"setSSHKnownHostsValidator")});var Th=P((YPe,O$)=>{"use strict";var rS=require("joi"),Pa=require("path"),ld=require("fs-extra"),{exec:_ue,spawn:hue}=require("child_process"),pue=require("util"),mue=pue.promisify(_ue),ud=(H(),D($)),{PACKAGE_ROOT:Eue}=mt(),{handleHDBError:gh,hdb_errors:gue}=pe(),{HTTP_STATUS_CODES:Sh}=gue,fl=ue(),Sue=tt(),Da=Q(),{once:Tue}=require("events");fl.initSync();var rw=fl.get(ud.CONFIG_PARAMS.COMPONENTSROOT),A$="npm install --force --omit=dev --json",Aue=`${A$} --dry-run`,Rue=fl.get(ud.CONFIG_PARAMS.ROOTPATH),nS=Pa.join(Rue,"ssh");O$.exports={installModules:Nue,auditModules:wue,installAllRootModules:yue,uninstallRootModule:bue,linkHarperdb:Oue,runCommand:dd};async function yue(e=!1,t=fl.get(ud.CONFIG_PARAMS.ROOTPATH)){await sS();let r=!1,n=process.env;ld.pathExistsSync(nS)&&ld.readdirSync(nS).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+Pa.join(nS,"config")+" -o UserKnownHostsFile="+Pa.join(nS,"known_hosts"),...process.env},r=!0)});try{let s=fl.get(ud.CONFIG_PARAMS.ROOTPATH),i=Pa.join(s,"node_modules","harperdb");ld.lstatSync(i).isSymbolicLink()&&ld.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&Da.error("Error removing symlink:",s)}await dd(e?"npm install --force --ignore-scripts":"npm install --force",t,n)}a(yue,"installAllRootModules");async function bue(e){await dd(`npm uninstall ${e}`,fl.get(ud.CONFIG_PARAMS.ROOTPATH))}a(bue,"uninstallRootModule");async function Oue(){await sS(),await dd(`npm link ${Eue}`,fl.get(ud.CONFIG_PARAMS.ROOTPATH))}a(Oue,"linkHarperdb");async function dd(e,t=void 0,r=process.env){Da.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=hue(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();Da.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();Da.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await Tue(n,"close");if(o!==0)throw new Error(`Command \`${e}\` exited with code ${o}.${i===""?"":` Error: ${i}`}`);return s||void 0}a(dd,"runCommand");async function Nue(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";Da.warn(t,e.projects);let r=b$(e);if(r)throw gh(r,r.message,Sh.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?Aue:A$;await sS(),await y$(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=Pa.join(rw,u),d,_=null;try{let{stdout:h,stderr:p}=await mue(i,{cwd:f});d=h?h.replace(`
28
28
  `,""):null,_=p?p.replace(`
29
29
  `,""):null}catch(h){h.stderr?o[u].npm_error=R$(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 Da.info(`finished installModules with response ${o}`),o.warning=t,o}a(Nue,"installModules");function R$(e){let t='"error": {',r=e.indexOf('"error": {'),n=e.indexOf(`}
30
30
  `);return r>-1&&n>-1?JSON.parse(e.substring(r+t.length-1,n+1)):e}a(R$,"parseNPMStdErr");async function wue(e){Da.info(`starting auditModules for request: ${e}`);let t=b$(e);if(t)throw gh(t,t.message,Sh.BAD_REQUEST);let{projects:r}=e;await sS(),await y$(r);let n={};for(let s=0,i=r.length;s<i;s++){let o=r[s],c=Pa.join(rw,o);n[o]={npm_output:null,npm_error:null};try{let l=await dd("npm audit --json",c);n[o].npm_output=JSON.parse(l)}catch(l){n[o].npm_error=R$(l.stderr)}}return Da.info(`finished auditModules with response ${n}`),n}a(wue,"auditModules");async function sS(){return await dd("npm -v"),!0}a(sS,"checkNPMInstalled");async function y$(e){if(!Array.isArray(e)||e.length===0)throw gh(new Error,"projects argument must be an array with at least 1 element",Sh.BAD_REQUEST,void 0,void 0,!0);let t=[],r=[];for(let n=0,s=e.length;n<s;n++){let i=e[n],o=Pa.join(rw,i.toString());if(!await ld.pathExists(o)){t.push(i);continue}let l=Pa.join(o,"package.json");await ld.pathExists(l)||r.push(i)}if(t.length>0)throw gh(new Error,`Unable to install project dependencies: custom function projects '${t.join(",")}' does not exist.`,Sh.BAD_REQUEST,void 0,void 0,!0);if(r.length>0)throw gh(new Error,`Unable to install project dependencies: custom function projects '${r.join(",")}' do not have a package.json file.`,Sh.BAD_REQUEST,void 0,void 0,!0)}a(y$,"checkProjectPaths");function b$(e){let t=rS.object({projects:rS.array().min(1).items(rS.string()).required(),dry_run:rS.boolean().default(!1)});return Sue.validateBySchema(e,t)}a(b$,"modulesValidator")});var sw=P((zPe,D$)=>{"use strict";var Ss=require("fs-extra"),Rh=require("path"),Ah=Q(),N$=oe(),{PACKAGE_ROOT:Iue}=mt(),nw=(H(),D($)),P$=ue(),Cue=Ot();D$.exports=Pue;async function Pue(){let e=Due(),t=P$.get(nw.CONFIG_PARAMS.ROOTPATH),r=Rh.join(t,"package.json"),n={dependencies:{harperdb:"file:"+Iue}},s=Rh.join(t,"node_modules");Ss.ensureDirSync(s);let i,o=!0,c=!1;try{i=Ss.readJsonSync(r)}catch(l){if(N$.isEmptyOrZeroLength(e))return;if(l.code!==nw.NODE_ERROR_CODES.ENOENT)throw l;o=!1}if(!N$.isEmptyOrZeroLength(e)){for(let{name:l,package:u}of e){let f=I$(u);n.dependencies[l]=f+u}if(!o){Ah.notify("Installing components"),await C$(r,n,null),await w$(t,e);return}for(let{name:l,package:u}of e){let f=i.dependencies[l],d=I$(u);if(f===void 0||f!==d+u){c=!0;break}if(u.startsWith("file:"))try{if(Ss.statSync(new URL(u+"/package.json")).mtimeMs>Ss.statSync(r).mtimeMs){c=!0;break}}catch(_){Ah.info(`Error checking ${u}/package.json modification time`,_);break}}}for(let l in i.dependencies)n.dependencies[l]===void 0&&(Ah.notify("Removing component",l),c=!0);c&&(Ah.notify("Updating components."),await C$(r,n,i),await w$(t,e))}a(Pue,"installComponents");function w$(e,t){return Promise.all(t.map(({name:r})=>{let n=Rh.join(e,"node_modules",r),s=Rh.join(e,"components",r);if(Ss.existsSync(n)&&Ss.lstatSync(n).isDirectory())return Ss.move(n,s,{overwrite:!0}).then(()=>{Ss.symlink(s,n)})}))}a(w$,"moveModuleToComponents");function Due(){let e=Cue.getConfiguration(),t=[];for(let r in e)e[r]?.package&&t.push(Object.assign(e[r],{name:r}));return t}a(Due,"getComponentsConfig");function I$(e){return e.includes(":")?"":e.startsWith("@")||!e.startsWith("@")&&!e.includes("/")?"npm:":Rh.extname(e)||Ss.existsSync(e)?"file:":"github:"}a(I$,"getPkgPrefix");async function C$(e,t,r){Ah.trace("npm installing components package.json",t),Ss.writeFileSync(e,JSON.stringify(t,null," "));try{await Th().installAllRootModules(P$.get(nw.CONFIG_PARAMS.IGNORE_SCRIPTS)===!0)}catch(n){throw r?Ss.writeFileSync(e,JSON.stringify(r,null," ")):Ss.unlinkSync(e),n}}a(C$,"installPackages")});var U$={};Ue(U$,{packageDirectory:()=>Lue});function Lue(e,t={skip_node_modules:!1,skip_symlinks:!1}){return new Promise((r,n)=>{let s=[];M$.default.pack(e,{dereference:!t.skip_symlinks,ignore:t.skip_node_modules?i=>i.includes("node_modules")||i.includes((0,L$.join)("cache","webpack")):void 0}).pipe((0,v$.createGzip)()).on("data",i=>s.push(i)).on("end",()=>{r(Buffer.concat(s))}).on("error",n)})}var L$,M$,v$,x$=ye(()=>{L$=require("path"),M$=M(require("tar-fs")),v$=require("node:zlib");a(Lue,"packageDirectory")});var aw=P(F$=>{"use strict";var be=require("fs-extra"),iw=require("fast-glob"),Ie=require("path"),Mue=require("tar-fs"),vue=require("gunzip-maybe"),ow=require("normalize-path"),On=T$(),xt=Q(),ot=(H(),D($)),Wt=ue(),iS=Ot(),Uue=oe(),{PACKAGE_ROOT:xue}=mt(),{handleHDBError:Bt,hdb_errors:Bue}=pe(),{basename:Hue}=require("path"),kue=sw(),H$=ue(),{Readable:Fue}=require("stream"),{isMainThread:Gue}=require("worker_threads"),{HDB_ERROR_MSGS:_l,HTTP_STATUS_CODES:Ht}=Bue,k$=rt(),{replicateOperation:Xs}=(fs(),D(ga)),{packageDirectory:que}=(x$(),D(U$)),B$=Th(),$ue=Ie.join(xue,"application-template"),Vue=Wt.get(ot.CONFIG_PARAMS.ROOTPATH),La=Ie.join(Vue,"ssh"),wo=Ie.join(La,"known_hosts");function Kue(){xt.trace("getting custom api status");let e={};try{e={port:Wt.get(ot.CONFIG_PARAMS.HTTP_PORT),directory:Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),is_enabled:!0}}catch(t){throw Bt(new Error,_l.FUNCTION_STATUS,Ht.INTERNAL_SERVER_ERROR,xt.ERR,t)}return e}a(Kue,"customFunctionsStatus");function Yue(){xt.trace("getting custom api endpoints");let e={},t=Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT);try{iw.sync(ow(`${t}/*`),{onlyDirectories:!0}).forEach(n=>{let s=n.split("/").pop();e[s]={routes:iw.sync(ow(`${n}/routes/*.js`)).map(i=>i.split("/").pop().split(".js")[0]),helpers:iw.sync(ow(`${n}/helpers/*.js`)).map(i=>i.split("/").pop().split(".js")[0])}})}catch(r){throw Bt(new Error,_l.GET_FUNCTIONS,Ht.INTERNAL_SERVER_ERROR,xt.ERR,r)}return e}a(Yue,"getCustomFunctions");function Wue(e){e.project&&(e.project=Ie.parse(e.project).name),e.file&&(e.file=Ie.parse(e.file).name);let t=On.getDropCustomFunctionValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);xt.trace("getting custom api endpoint file content");let r=Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n,type:s,file:i}=e,o=Ie.join(r,n,s,i+".js");try{return be.readFileSync(o,{encoding:"utf8"})}catch(c){throw Bt(new Error,_l.GET_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,c)}}a(Wue,"getCustomFunction");async function zue(e){e.project&&(e.project=Ie.parse(e.project).name),e.file&&(e.file=Ie.parse(e.file).name);let t=On.setCustomFunctionValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);xt.trace("setting custom function file content");let r=Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n,type:s,file:i,function_content:o}=e;try{be.outputFileSync(Ie.join(r,n,s,i+".js"),o);let c=await Xs(e);return c.message=`Successfully updated custom function: ${i}.js`,c}catch(c){throw Bt(new Error,_l.SET_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,c)}}a(zue,"setCustomFunction");async function Que(e){e.project&&(e.project=Ie.parse(e.project).name),e.file&&(e.file=Ie.parse(e.file).name);let t=On.getDropCustomFunctionValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);xt.trace("dropping custom function file");let r=Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n,type:s,file:i}=e;try{be.unlinkSync(Ie.join(r,n,s,i+".js"));let o=await Xs(e);return o.message=`Successfully deleted custom function: ${i}.js`,o}catch(o){throw Bt(new Error,_l.DROP_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,o)}}a(Que,"dropCustomFunction");async function jue(e){e.project&&(e.project=Ie.parse(e.project).name);let t=On.addComponentValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);xt.trace("adding component");let r=Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n}=e;try{let s=Ie.join(r,n);be.mkdirSync(s,{recursive:!0}),be.copySync($ue,s);let i=await Xs(e);return i.message=`Successfully added project: ${n}`,i}catch(s){throw Bt(new Error,_l.ADD_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,s)}}a(jue,"addComponent");async function Jue(e){e.project&&(e.project=Ie.parse(e.project).name);let t=On.dropCustomFunctionProjectValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);xt.trace("dropping custom function project");let r=Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n}=e,s=Wt.get(ot.CONFIG_PARAMS.APPS);if(!Uue.isEmptyOrZeroLength(s)){let i=!1;for(let[o,c]of s.entries())if(c.name===n){s.splice(o,1),i=!0;break}if(i)return iS.updateConfigValue(ot.CONFIG_PARAMS.APPS,s),`Successfully deleted project: ${n}`}try{let i=Ie.join(r,n);be.rmSync(i,{recursive:!0});let o=await Xs(e);return o.message=`Successfully deleted project: ${n}`,o}catch(i){throw Bt(new Error,_l.DROP_FUNCTION_PROJECT,Ht.INTERNAL_SERVER_ERROR,xt.ERR,i)}}a(Jue,"dropCustomFunctionProject");async function Xue(e){e.project&&(e.project=Ie.parse(e.project).name);let t=On.packageComponentValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let r=Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n}=e;xt.trace("packaging component",n);let s;try{s=await be.realpath(Ie.join(r,n))}catch(o){if(o.code!==ot.NODE_ERROR_CODES.ENOENT)throw o;try{s=await be.realpath(Ie.join(Wt.get(ot.CONFIG_PARAMS.ROOTPATH),"node_modules",n))}catch(c){if(c.code===ot.NODE_ERROR_CODES.ENOENT)throw new Error(`Unable to locate project '${n}'`)}}let i=(await que(s,e)).toString("base64");return{project:n,payload:i}}a(Xue,"packageComponent");async function Zue(e){e.project?e.project=Ie.parse(e.project).name:e.package&&(e.project=ede(e.package));let t=On.deployComponentValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let r=Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n,payload:s,package:i,install_command:o}=e;if(xt.trace("deploying component",n),!s&&!i)throw new Error("'payload' or 'package' must be provided");let c;if(s){c=Ie.join(r,n),i="file:"+c,await be.emptyDir(c);let S=Fue.from(s instanceof Buffer?s:Buffer.from(s,"base64"));await new Promise((E,T)=>{S.pipe(vue()).pipe(Mue.extract(c,{finish:E})).on("error",T)});let g=await be.readdir(c);g.length===1&&g[0]==="package"&&(await be.copy(Ie.join(c,"package"),c),await be.remove(Ie.join(c,"package")));let R=Ie.join(c,"node_modules");o?await B$.runCommand(o,c):be.existsSync(R)||await B$.installAllRootModules(!1,c)}else{await iS.addConfig(n,{package:i}),await kue();let S=H$.get(ot.CONFIG_PARAMS.ROOTPATH);c=Ie.join(S,"node_modules",n)}if(Gue)return;let l=new Map;l.isWorker=!0;let u=(bh(),D(yh)),f;u.setErrorReporter(S=>f=S);let d=Hue(c),_=u.component_errors.get(d);try{await u.loadComponent(c,l)}finally{u.component_errors.set(d,_)}if(f)throw f;xt.info("Installed component");let h=e.restart==="rolling";e.restart=h?!1:e.restart;let p=await Xs(e);if(e.restart===!0)k$.restartWorkers("http"),p.message=`Successfully deployed: ${n}, restarting HarperDB`;else if(h){let g=await cw().executeJob({operation:"restart_service",service:"http",replicated:!0});p.restartJobId=g.job_id,p.message=`Successfully deployed: ${n}, restarting HarperDB`}else p.message=`Successfully deployed: ${n}`;return p}a(Zue,"deployComponent");function ede(e){if(e.startsWith("git+ssh://"))return Ie.basename(e.split("#")[0].replace(/\.git$/,""));if(e.startsWith("http://")||e.startsWith("https://"))return Ie.basename(new URL(e.replace(/\.git$/,"")).pathname);if(e.startsWith("file://"))try{let{name:t}=JSON.parse(be.readFileSync(Ie.join(e,"package.json"),"utf8"));return Ie.basename(t)}catch{}return Ie.basename(e)}a(ede,"getProjectNameFromPackage");async function tde(){let e=a(async(s,i)=>{try{let o=await be.readdir(s,{withFileTypes:!0});for(let c of o){let l=c.name;if(l.startsWith(".")||l==="node_modules")continue;let u=Ie.join(s,l);if(c.isDirectory()||c.isSymbolicLink()){let f={name:l,entries:[]};i.entries.push(f),await e(u,f)}else{let f=await be.stat(u),d={name:Ie.basename(l),mtime:f.mtime,size:f.size};i.entries.push(d)}}return i}catch(o){return xt.warn("Error loading package",o),{error:o.toString(),entries:[]}}},"walkDir"),t=await e(Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{name:Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT).split(Ie.sep).slice(-1).pop(),entries:[]}),n=(bh(),D(yh)).component_errors;for(let s of t.entries){let i=n.get(s.name);i?s.error=n.get(s.name):i===void 0&&(s.error="The component has not been loaded yet (may need a restart)")}return t}a(tde,"getComponents");async function rde(e){let t=On.getComponentFileValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let n=iS.getConfigObj()[e.project]||e.project==="harperdb"?Ie.join(H$.get(ot.CONFIG_PARAMS.ROOTPATH),"node_modules"):Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),s=e.encoding?{encoding:e.encoding}:{encoding:"utf8"};try{let i=await be.stat(Ie.join(n,e.project,e.file));return{message:await be.readFile(Ie.join(n,e.project,e.file),s),size:i.size,birthtime:i.birthtime,mtime:i.mtime}}catch(i){throw i.code===ot.NODE_ERROR_CODES.ENOENT?new Error(`Component file not found '${Ie.join(e.project,e.file)}'`):i}}a(rde,"getComponentFile");async function nde(e){let t=On.setComponentFileValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let r=e.encoding?{encoding:e.encoding}:{encoding:"utf8"},n=Ie.join(Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),e.project,e.file);e.payload!==void 0?(await be.ensureFile(n),await be.outputFile(n,e.payload,r)):await be.ensureDir(n);let s=await Xs(e);return s.message="Successfully set component: "+e.file,s}a(nde,"setComponentFile");async function sde(e){let t=On.dropComponentFileValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let{project:r,file:n}=e,s=e.file?Ie.join(r,n):r,i=Ie.join(Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),s),o=Ie.join(Wt.get(ot.CONFIG_PARAMS.ROOTPATH),"node_modules",r);await be.pathExists(o)&&await be.unlink(o),await be.pathExists(i)&&await be.remove(i);let c=Ie.join(Wt.get(ot.CONFIG_PARAMS.ROOTPATH),"package.json");if(await be.pathExists(c)){let u=JSON.parse(await be.readFile(c,"utf8"));u?.dependencies?.[r]&&delete u.dependencies[r],await be.writeFile(c,JSON.stringify(u,null,2),"utf8")}iS.deleteConfigFromFile([r]);let l=await Xs(e);return e.restart===!0?(k$.restartWorkers("http"),l.message=`Successfully dropped: ${s}, restarting HarperDB`):l.message=`Successfully dropped: ${s}`,l}a(sde,"dropComponent");async function ide(e){let t=On.addSSHKeyValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let{name:r,key:n,host:s,hostname:i,known_hosts:o}=e;xt.trace("adding ssh key",r);let c=Ie.join(La,r+".key"),l=Ie.join(La,"config");if(await be.pathExists(c))throw new Error("Key already exists. Use update_ssh_key or delete_ssh_key and then add_ssh_key");await be.outputFile(c,n),await be.chmod(c,"0600");let u=`#${r}