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
@@ -22,7 +22,7 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
22
22
  `)}catch(r){r.code==="ENOENT"?jr.debug("no license file found"):jr.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(Foe.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=pG(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){jr.error("There was an error parsing the license string."),jr.error(s),e.ram_allocation=Zc.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return lN=e,e}a(_N,"licenseSearch");async function Joe(){return lN||await _N(),lN}a(Joe,"getLicense");function Xoe(){let e=_N().ram_allocation,t=process.constrainedMemory?.()||fG();if(t=Math.round(Math.min(t,fG())/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(Xoe,"checkMemoryLimit")});var pN=P((MCe,AG)=>{var Og=Qu(),gG=require("chalk"),zn=j(),SG=require("prompt"),{promisify:Zoe}=require("util"),hN=(H(),D($)),eae=require("fs-extra"),tae=require("path"),rae=oe(),{packageJson:nae}=pt(),TG=ue();TG.initSync();var sae=require("moment"),iae=Zoe(SG.get),oae=tae.join(TG.getHdbBasePath(),hN.LICENSE_KEY_DIR_NAME,hN.LICENSE_FILE_NAME,hN.LICENSE_FILE_NAME);AG.exports={getFingerprint:cae,setLicense:aae,parseLicense:mN,register:lae,getRegistrationInfo:dae};async function aae(e){if(e&&e.key&&e.company){try{zn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await mN(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(aae,"setLicense");async function cae(){let e={};try{e=await Og.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw zn.error(r),zn.error(t),new Error(r)}return e}a(cae,"getFingerprint");async function mN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");zn.info("Validating license input...");let r=Og.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 eae.writeFile(oae,JSON.stringify({license_key:e,company:t}))}catch(n){throw zn.error("Failed to write License"),n}return"Registration successful."}a(mN,"parseLicense");async function lae(){let e=await uae();return mN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(lae,"register");async function uae(){let e=await Og.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:gG.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:gG.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{SG.start()}catch(n){zn.error(n)}let r;try{r=await iae(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(uae,"promptForRegistration");async function dae(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await Og.getLicense()}catch(r){throw zn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(rae.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=nae.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=sae.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(dae,"getRegistrationInfo")});var yG=P((UCe,RG)=>{"use strict";var fae=Nt(),EN=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+fae.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"}};RG.exports=EN});var NG=P((BCe,OG)=>{"use strict";var bG=Nt(),gN=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+bG.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+bG.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"}};OG.exports=gN});var IG=P((kCe,wG)=>{"use strict";var SN=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};wG.exports=SN});var PG=P((GCe,CG)=>{"use strict";var _ae=Nt(),TN=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+_ae.SERVER_SUFFIX.ADMIN,this.password=r}};CG.exports=TN});var Cg=P(($Ce,MG)=>{"use strict";var el=require("path"),tl=require("fs-extra"),hae=yG(),mae=NG(),pae=IG(),Eae=PG(),AN=Gn(),Ju=oe(),yn=It(),wg=(H(),D($)),Q_=Nt(),{CONFIG_PARAMS:Yt}=wg,Xu=j(),j_=ue(),DG=so(),RN=Er(),gae=zs(),ju="clustering",Sae=1e4,LG=50;MG.exports={generateNatsConfig:Aae,removeNatsConfig:Rae,getHubConfigPath:Tae};function Tae(){let e=j_.get(Yt.ROOTPATH);return el.join(e,ju,Q_.NATS_CONFIG_FILES.HUB_SERVER)}a(Tae,"getHubConfigPath");async function Aae(e=!1,t=void 0){let r=j_.get(Yt.ROOTPATH);tl.ensureDirSync(el.join(r,"clustering","leaf")),j_.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 tl.exists(i)&&!await tl.exists(!n)&&await gae.createNatsCerts();let o=el.join(r,ju,Q_.PID_FILES.HUB),c=el.join(r,ju,Q_.PID_FILES.LEAF),l=yn.getConfigFromFile(Yt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=el.join(r,ju,Q_.NATS_CONFIG_FILES.HUB_SERVER),f=el.join(r,ju,Q_.NATS_CONFIG_FILES.LEAF_SERVER),d=yn.getConfigFromFile(Yt.CLUSTERING_TLS_INSECURE),_=yn.getConfigFromFile(Yt.CLUSTERING_TLS_VERIFY),h=yn.getConfigFromFile(Yt.CLUSTERING_NODENAME),m=yn.getConfigFromFile(Yt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await RN.checkNATSServerInstalled()||Ig("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await AN.listUsers(),g=yn.getConfigFromFile(Yt.CLUSTERING_USER),R=await AN.getClusterUser();(Ju.isEmpty(R)||R.active!==!0)&&Ig(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await Ng(Yt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await Ng(Yt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await Ng(Yt.CLUSTERING_HUBSERVER_NETWORK_PORT),await Ng(Yt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[ie,W]of S.entries())W.role?.role===wg.ROLE_TYPES_ENUM.CLUSTER_USER&&W.active&&(E.push(new Eae(W.username,DG.decrypt(W.hash))),T.push(new pae(W.username,DG.decrypt(W.hash))));let N=[],{hub_routes:v}=yn.getClusteringRoutes();if(!Ju.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 hae(yn.getConfigFromFile(Yt.CLUSTERING_HUBSERVER_NETWORK_PORT),h,o,i,s,n,d,_,m,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=Ju.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===wg.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await tl.writeJson(u,k),Xu.trace(`Hub server config written to ${u}`));let G=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,Y=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${m}`,X=new mae(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===wg.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await tl.writeJson(f,X),Xu.trace(`Leaf server config written to ${f}`))}a(Aae,"generateNatsConfig");async function Ng(e){let t=j_.get(e);return Ju.isEmpty(t)&&Ig(`port undefined for '${e}'`),await Ju.isPortTaken(t)&&Ig(`'${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(Ng,"isPortAvailable");function Ig(e){let t=`Error generating clustering config: ${e}`;Xu.error(t),console.error(t),process.exit(1)}a(Ig,"generateNatsConfigError");async function Rae(e){let{port:t,config_file:r}=RN.getServerConfig(e),{username:n,decrypt_hash:s}=await AN.getClusterUser(),i=0,o=2e3;for(;i<LG;){try{let f=await RN.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){Xu.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=LG)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&&Xu.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await Ju.async_set_timeout(u)}let c="0".repeat(Sae),l=el.join(j_.get(Yt.ROOTPATH),ju,r);await tl.writeFile(l,c),await tl.remove(l),Xu.notify(e,"started.")}a(Rae,"removeNatsConfig")});var kG=P((KCe,HG)=>{"use strict";var Qn=ue(),yae=Qu(),Ge=(H(),D($)),J_=Nt(),To=require("path"),{PACKAGE_ROOT:Dg}=pt(),vG=ue(),Pg=oe(),Zu="/dev/null",bae=To.join(Dg,"launchServiceScripts"),UG=To.join(Dg,"utility/scripts"),Oae=To.join(UG,Ge.HDB_RESTART_SCRIPT),xG=To.resolve(Dg,"dependencies",`${process.platform}-${process.arch}`,J_.NATS_BINARY_NAME);function BG(){let t=yae.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 Pg.noBootFile()&&(n[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Pg.getEnvCliRootPath()),{name:Ge.PROCESS_DESCRIPTORS.HDB,script:Ge.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:Dg}}a(BG,"generateMainServerConfig");var Nae=9930;function wae(){Qn.initSync(!0);let e=Qn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=To.join(e,"clustering",J_.NATS_CONFIG_FILES.HUB_SERVER),r=To.join(Qn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=vG.get(Ge.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=J_.LOG_LEVEL_FLAGS[Qn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Nae?"-"+n:""),script:xG,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=Zu,i.error_file=Zu),i}a(wae,"generateNatsHubServerConfig");var Iae=9940;function Cae(){Qn.initSync(!0);let e=Qn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=To.join(e,"clustering",J_.NATS_CONFIG_FILES.LEAF_SERVER),r=To.join(Qn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=vG.get(Ge.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=J_.LOG_LEVEL_FLAGS[Qn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Iae?"-"+n:""),script:xG,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=Zu,i.error_file=Zu),i}a(Cae,"generateNatsLeafServerConfig");function Pae(){Qn.initSync();let e=To.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:bae,autorestart:!1};return Qn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=Zu,t.error_file=Zu),t}a(Pae,"generateClusteringUpgradeV4ServiceConfig");function Dae(){let e={[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.RESTART_HDB};return Pg.noBootFile()&&(e[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Pg.getEnvCliRootPath()),{...{name:Ge.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:UG},script:Oae}}a(Dae,"generateRestart");function Lae(){return{apps:[BG()]}}a(Lae,"generateAllServiceConfigs");HG.exports={generateAllServiceConfigs:Lae,generateMainServerConfig:BG,generateRestart:Dae,generateNatsHubServerConfig:wae,generateNatsLeafServerConfig:Cae,generateClusteringUpgradeV4ServiceConfig:Pae}});var Z_=P((zCe,ZG)=>{"use strict";var et=(H(),D($)),Mae=oe(),Ro=Cg(),Lg=Er(),Ao=Nt(),Na=kG(),Mg=ue(),rl=j(),vae=Eo(),{startWorker:FG,onMessageFromWorkers:Uae}=tt(),xae=$u(),WCe=require("util"),Bae=require("child_process"),Hae=require("fs"),{execFile:kae}=Bae,Ke;ZG.exports={enterPM2Mode:Fae,start:wa,stop:yN,reload:qG,restart:$G,list:bN,describe:YG,connect:yo,kill:Kae,startAllServices:Yae,startService:ON,getUniqueServicesList:WG,restartAllServices:Wae,isServiceRegistered:zG,reloadStopStart:QG,restartHdb:KG,deleteProcess:$ae,startClusteringProcesses:JG,startClusteringThreads:XG,isHdbRestartRunning:Vae,isClusteringRunning:Qae,stopClustering:zae,reloadClustering:jae,expectedRestartOfChildren:VG};var X_=!1;Uae(e=>{e.type==="restart"&&Mg.initSync(!0)});function Fae(){X_=!0}a(Fae,"enterPM2Mode");function yo(){return Ke||(Ke=require("pm2")),new Promise((e,t)=>{Ke.connect((r,n)=>{r&&t(r),e(n)})})}a(yo,"connect");var Jr,Gae=10,GG;function wa(e,t=!1){if(X_)return qae(e);let r=kae(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=Jr.indexOf(r);o>-1&&Jr.splice(o,1),!GG&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<Gae&&(Hae.existsSync(Ro.getHubConfigPath())?wa(e):(await Ro.generateNatsConfig(!0),wa(e),await new Promise(c=>setTimeout(c,3e3)),await Ro.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Ro.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=Mg.get(et.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&Ao.LOG_LEVEL_HIERARCHY[o]>=Ao.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===Ao.LOG_LEVELS.ERR||f===Ao.LOG_LEVELS.WRN?rl.OUTPUTS.STDERR:rl.OUTPUTS.STDOUT;rl.logCustomLevel(f||"info",h,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=Ao.LOG_LEVELS[_]}if(Ao.LOG_LEVEL_HIERARCHY[o]>=Ao.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===Ao.LOG_LEVELS.ERR||f===Ao.LOG_LEVELS.WRN?rl.OUTPUTS.STDERR:rl.OUTPUTS.STDOUT;rl.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(),!Jr&&(Jr=[],!t)){let i=a(()=>{GG=!0,Jr&&(Jr.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)}Jr.push(r)}a(wa,"start");function qae(e){return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ke.start(e,(n,s)=>{n&&(Ke.disconnect(),r(n)),Ke.disconnect(),t(s)})})}a(qae,"startWithPM2");function yN(e){if(!X_){for(let t of Jr||[])t.name===e&&(Jr.splice(Jr.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ke.stop(e,async(n,s)=>{n&&(Ke.disconnect(),r(n)),Ke.delete(e,(i,o)=>{i&&(Ke.disconnect(),r(n)),Ke.disconnect(),t(o)})})})}a(yN,"stop");function qG(e){return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ke.reload(e,(n,s)=>{n&&(Ke.disconnect(),r(n)),Ke.disconnect(),t(s)})})}a(qG,"reload");function $G(e){if(!X_){VG();for(let t of Jr||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ke.restart(e,(n,s)=>{Ke.disconnect(),t(s)})})}a($G,"restart");function VG(){for(let e of Jr||[])e.config&&(e.config.restarts=0)}a(VG,"expectedRestartOfChildren");function $ae(e){return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ke.delete(e,(n,s)=>{n&&(Ke.disconnect(),r(n)),Ke.disconnect(),t(s)})})}a($ae,"deleteProcess");async function KG(){await wa(Na.generateRestart())}a(KG,"restartHdb");async function Vae(){let e=await bN();for(let t in e)if(e[t].name===et.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(Vae,"isHdbRestartRunning");function bN(){return new Promise(async(e,t)=>{try{await yo()}catch(r){t(r)}Ke.list((r,n)=>{r&&(Ke.disconnect(),t(r)),Ke.disconnect(),e(n)})})}a(bN,"list");function YG(e){return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ke.describe(e,(n,s)=>{n&&(Ke.disconnect(),r(n)),Ke.disconnect(),t(s)})})}a(YG,"describe");function Kae(){if(!X_){for(let e of Jr||[])e.kill();Jr=[];return}return new Promise(async(e,t)=>{try{await yo()}catch(r){t(r)}Ke.killDaemon((r,n)=>{r&&(Ke.disconnect(),t(r)),Ke.disconnect(),e(n)})})}a(Kae,"kill");async function Yae(){try{await JG(),await XG(),await wa(Na.generateAllServiceConfigs())}catch(e){throw Ke?.disconnect(),e}}a(Yae,"startAllServices");async function ON(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case et.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Na.generateMainServerConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Na.generateNatsIngestServiceConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Na.generateNatsReplyServiceConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Na.generateNatsHubServerConfig(),await wa(r,t),await Ro.removeNatsConfig(e);return;case et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Na.generateNatsLeafServerConfig(),await wa(r,t),await Ro.removeNatsConfig(e);return;case et.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Na.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await wa(r)}catch(r){throw Ke?.disconnect(),r}}a(ON,"startService");async function WG(){try{let e=await bN(),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 Ke?.disconnect(),e}}a(WG,"getUniqueServicesList");async function Wae(e=[]){try{let t=!1,r=await WG();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 $G(o))}t&&await QG(et.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Ke?.disconnect(),t}}a(Wae,"restartAllServices");async function zG(e){if(Jr?.find(r=>r.name===e))return!0;let t=await xae.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(zG,"isServiceRegistered");async function QG(e){let t=Mg.get(et.CONFIG_PARAMS.THREADS_COUNT)??Mg.get(et.CONFIG_PARAMS.THREADS),r=await YG(e),n=Mae.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await yN(e),await ON(e)):e===et.PROCESS_DESCRIPTORS.HDB?await KG():await qG(e)}a(QG,"reloadStopStart");var jG;async function JG(e=!1){for(let t in et.CLUSTERING_PROCESSES){let r=et.CLUSTERING_PROCESSES[t];await ON(r,e)}}a(JG,"startClusteringProcesses");async function XG(){jG=FG(et.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:et.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await Lg.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await Lg.updateLocalStreams();let e=await vae.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===et.PRE_4_0_0_VERSION){rl.info("Starting clustering upgrade 4.0.0 process"),FG(et.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(XG,"startClusteringThreads");async function zae(){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 jG.terminate();else{let t=et.CLUSTERING_PROCESSES[e];await yN(t)}}a(zae,"stopClustering");async function Qae(){for(let e in et.CLUSTERING_PROCESSES){let t=et.CLUSTERING_PROCESSES[e];if(await zG(t)===!1)return!1}return!0}a(Qae,"isClusteringRunning");async function jae(){await Ro.generateNatsConfig(!0),await Lg.reloadNATSHub(),await Lg.reloadNATSLeaf(),await Ro.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Ro.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(jae,"reloadClustering")});var IN={};Ue(IN,{compactOnStart:()=>Jae,copyDb:()=>iq});async function Jae(){Ia.notify("Running compact on start"),console.log("Running compact on start");let e=(0,NN.get)(U.ROOTPATH),t=new Map,r=Xe();(0,wN.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,vg.join)(e,"backup",n+".mdb"),o=(0,vg.join)(e,tc,n+"-copy.mdb"),c=0;try{c=await eq(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){Ia.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 iq(n,o),console.log("Backing up",n,"to",i),await(0,nl.move)(s,i,{overwrite:!0})}try{ed()}catch(n){Ia.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,nl.move)(i,s,{overwrite:!0}),await(0,nl.remove)((0,vg.join)(e,tc,`${n}-copy.mdb-lock`));try{ed()}catch(n){Ia.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){Ia.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,wN.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,nl.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw ed(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await eq(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}.
23
23
  Total record count before compaction: ${i}, total after: ${c}.
24
24
  Database backup has not been removed and can be found here: ${s}`;Ia.error(l),console.error(l)}(0,NN.get)(U.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||o===!1||(console.log("Removing backup",s),await(0,nl.remove)(s))}}async function eq(e){let t=await(0,sq.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}async function iq(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,tq.open)(new rq.default(t)),c=o.openDB(Ug.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=xg(),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 nq.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(Ug.AUDIT_STORE_NAME,eh);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=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,m?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 tq,vg,nl,NN,rq,nq,Ug,sq,wN,Ia,CN=ye(()=>{Me();tq=require("lmdb"),vg=require("path"),nl=require("fs-extra"),NN=M(ue()),rq=M(wf()),nq=M(Nf()),Ug=M(Ut());H();Zi();sq=M(io()),wN=M(It()),Ia=M(j());a(Jae,"compactOnStart");a(eq,"getTotalDBRecordCount");a(iq,"copyDb")});var rd=P((nPe,fq)=>{"use strict";var Xae=require("minimist"),{isMainThread:DN,parentPort:rh,threadId:ePe}=require("worker_threads"),nt=(H(),D($)),Ci=j(),LN=oe(),Hg=Cg(),Bg=Er(),tPe=Nt(),lq=It(),js=Z_(),oq=$u(),{compactOnStart:Zae}=(CN(),D(IN)),ece=rc(),{restartWorkers:kg,onMessageByType:tce}=tt(),{handleHDBError:rce,hdb_errors:nce}=me(),{HTTP_STATUS_CODES:sce}=nce,nh=ue(),{sendOperationToNode:aq,getThisNodeName:ice,monitorNodeCAs:oce}=(ds(),D(Ea)),{getHDBNodeTable:rPe}=(Fc(),D($b));nh.initSync();var th=`Restarting HarperDB. This may take up to ${nt.RESTART_TIMEOUT_MS/1e3} seconds.`,ace="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",cq="Clustering is not enabled so cannot be restarted",cce="Invalid service",td,Es;fq.exports={restart:uq,restartService:MN};DN&&tce(nt.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await MN({service:e.workerType}):uq({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function uq(e){Es=Object.keys(e).length===0,td=await js.isServiceRegistered(nt.PROCESS_DESCRIPTORS.HDB);let t=Xae(process.argv);if(t.service){await MN(t);return}if(Es&&!td){console.error(ace);return}if(Es&&console.log(th),td){js.enterPM2Mode(),Ci.notify(th);let r=ece(Object.keys(nt.CONFIG_PARAM_MAP),!0);return LN.isEmptyOrZeroLength(Object.keys(r))||lq.updateConfigValue(void 0,void 0,r,!0,!0),lce(),th}return DN?(Ci.notify(th),nh.get(nt.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await Zae(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{kg()},50)):rh.postMessage({type:nt.ITC_EVENT_TYPES.RESTART}),th}a(uq,"restart");async function MN(e){let{service:t}=e;if(nt.HDB_PROCESS_SERVICES[t]===void 0)throw rce(new Error,cce,sce.BAD_REQUEST,void 0,void 0,!0);if(js.expectedRestartOfChildren(),td=await js.isServiceRegistered(nt.PROCESS_DESCRIPTORS.HDB),!DN){e.replicated&&oce(),rh.postMessage({type:nt.ITC_EVENT_TYPES.RESTART,workerType:t}),rh.ref(),await new Promise(s=>{rh.on("message",i=>{i.type==="restart-complete"&&(s(),rh.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===ice())continue;let i;try{({job_id:i}=await aq(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 aq(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(!nh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=cq;break}Es&&console.log("Restarting clustering"),Ci.notify("Restarting clustering"),await dq();break;case nt.HDB_PROCESS_SERVICES.clustering_config:case nt.HDB_PROCESS_SERVICES["clustering config"]:if(!nh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=cq;break}Es&&console.log("Restarting clustering_config"),Ci.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(Es&&!td){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}Es&&console.log("Restarting http_workers"),Ci.notify("Restarting http_workers"),Es?await js.restart(nt.PROCESS_DESCRIPTORS.HDB):await kg("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Ci.error(r),Es&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(MN,"restartService");async function lce(){await dq(),await js.restart(nt.PROCESS_DESCRIPTORS.HDB),await LN.async_set_timeout(2e3),nh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await PN(),Es&&(await Bg.closeConnection(),process.exit(0))}a(lce,"restartPM2Mode");async function dq(){if(!lq.getConfigFromFile(nt.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await oq.getHDBProcessInfo()).clustering.length===0)Ci.trace("Clustering not running, restart will start clustering services"),await Hg.generateNatsConfig(!0),await js.startClusteringProcesses(),await js.startClusteringThreads(),await PN(),Es&&await Bg.closeConnection();else{await Hg.generateNatsConfig(!0),td?(Ci.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 oq.getHDBProcessInfo()).clustering.forEach(s=>{Ci.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await LN.async_set_timeout(3e3),await PN(),await Bg.updateLocalStreams(),Es&&await Bg.closeConnection(),Ci.trace("Restart clustering restarting ingest and reply service threads");let t=kg(nt.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=kg(nt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(dq,"restartClustering");async function PN(){await Hg.removeNatsConfig(nt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Hg.removeNatsConfig(nt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(PN,"removeNatsConfig")});var yq=P((oPe,Rq)=>{"use strict";var iPe=require("lodash"),bn=(H(),D($)),{handleHDBError:_q,hdb_errors:uce}=me(),{HDB_ERROR_MSGS:dce,HTTP_STATUS_CODES:fce}=uce,vN=j();Rq.exports={getRolePermissions:hce};var sl=Object.create(null),_ce=a(e=>({key:e,perms:{}}),"perms_template_obj"),Eq=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),gq=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"),UN=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...gq(t,r,n,s)}),"table_perms_template"),hq=a((e,t=gq())=>({attribute_name:e,describe:Aq(t),[sh]:t[sh],[xN]:t[xN],[BN]:t[BN]}),"attr_perms_template"),mq=a((e,t=!1)=>({attribute_name:e,describe:t,[sh]:t}),"timestamp_attr_perms_template"),{READ:sh,INSERT:xN,UPDATE:BN}=bn.PERMS_CRUD_ENUM,Sq=Object.values(bn.PERMS_CRUD_ENUM),Tq=[sh,xN,BN];function hce(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(sl[t]&&sl[t].key===n)return sl[t].perms;let s=mce(e,r);return sl[t]?sl[t].key=n:sl[t]=_ce(n),sl[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 vN.error(n),vN.debug(r),_q(new Error,dce.OUTDATED_PERMS_TRANSLATION_ERROR,fce.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
25
- ${r.stack}`;throw vN.error(n),_q(new Error)}}}a(hce,"getRolePermissions");function mce(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]=pce(t[i]);return}r[i]=Eq(),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=Ece(c,l);r[i].describe||Sq.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=UN()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=UN()})}),r}a(mce,"translateRolePermissions");function pce(e){let t=Eq(!0);return Object.keys(e).forEach(r=>{t.tables[r]=UN(!0,!0,!0,!0,!0)}),t}a(pce,"createStructureUserPermissions");function Ece(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)&&(_=mq(d,f[sh])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=hq(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=Aq(f),s.attribute_permissions.push(f),c||gce(f,l)}else if(u!==o){let f;bn.TIME_STAMP_NAMES.includes(u)?f=mq(u):f=hq(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=pq(s),s}else return e.describe=pq(e),e}a(Ece,"getTableAttrPerms");function pq(e){return Sq.filter(t=>e[t]).length>0}a(pq,"getSchemaTableDescribePerm");function Aq(e){return Tq.filter(t=>e[t]).length>0}a(Aq,"getAttributeDescribePerm");function gce(e,t){Tq.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(gce,"checkForHashPerms")});var ih={};Ue(ih,{authentication:()=>Pq,bypassAuth:()=>Nce,login:()=>Ice,logout:()=>Cce,start:()=>wce});function Nce(){Cq=!0}async function Pq(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let h=e.isOperationsServer?Rce?Ace:[]:Tce?Sce:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let m=Xr.get(U.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",S=new uo([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",m],["Access-Control-Allow-Origin",i]]);return Fg&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),Fg&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(Fg){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 bq.get(l);break}e.session=u||(u={})}let f=a((h,m,S)=>{let g=new nd.AuthAuditLog(h,m,$o.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===Ds.SUCCESS?HN.notify(g):HN.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&HN.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,Ds.SUCCESS,"mTLS")):(0,nd.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let d;if(!e.user)if(n){if(d=il.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 ze.getUser(g,R,e):null;break;case"Bearer":try{d=await Ub(S)}catch(N){if(N.message==="invalid token")try{return await CE(S),c({status:-1})}catch{throw N}}break}}catch(E){return bce&&(il.get(S)||(il.set(S,S),f(g,Ds.FAILURE,m))),c({status:401,body:ea({error:E.message},e)})}il.set(n,d),yce&&f(d.username,Ds.SUCCESS,m)}e.user=d}else u?.user?e.user=await ze.getUser(u.user,null,e):(Cq&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,Nq.getSuperUser)());Fg&&(e.session.update=function(h){let m=Xr.get(U.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,wq.v4)();let S=Xr.get(U.AUTHENTICATION_COOKIE_DOMAINS),g=m?new Date(Date.now()+(0,kN.convertToMS)(m)).toUTCString():Oce,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,bq.put(h,{expiresAt:m?Date.now()+(0,kN.convertToMS)(m):void 0})},e.login=async function(h,m){let S=e.user=await ze.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")&&di.loginPath?(_.status=302,_.headers.set("Location",di.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 uo);for(let d=0;d<u;){let _=o[d++];f.set(_,o[d++])}}return o=null,l}a(c,"applyResponseHeaders")}function wce({server:e,port:t,securePort:r}){e.http(Pq,t||r?{port:t,securePort:r}:{port:"all"}),Oq||(Oq=!0,setInterval(()=>{il=new Map},Xr.get(U.AUTHENTICATION_CACHETTL)).unref(),Iq.user.addListener(()=>{il=new Map}))}async function Ice(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 Cce(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var Nq,wq,Xr,nd,Iq,kN,HN,Sce,Tce,Ace,Rce,bq,Fg,Cq,yce,bce,Oce,il,Oq,Gg=ye(()=>{Nq=M(Gn());$r();Wl();yu();Me();wq=require("uuid"),Xr=M(ue());H();nd=M(j()),Iq=M(Yf());p_();kN=M(oe());Qi();HN=(0,nd.loggerWithTag)("auth-event");Xr.initSync();Sce=Xr.get(U.HTTP_CORSACCESSLIST),Tce=Xr.get(U.HTTP_CORS),Ace=Xr.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),Rce=Xr.get(U.OPERATIONSAPI_NETWORK_CORS),bq=lt({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),Fg=Xr.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,Cq=process.env.AUTHENTICATION_AUTHORIZELOCAL??Xr.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,yce=Xr.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,bce=Xr.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,Oce="Tue, 01 Oct 8307 19:33:20 GMT",il=new Map;ze.onInvalidatedUser(()=>{il=new Map});a(Nce,"bypassAuth");a(Pq,"authentication");a(wce,"start");a(Ice,"login");a(Cce,"logout")});var Bq=P((pPe,xq)=>{"use strict";var Ne=require("joi"),Dq=require("fs-extra"),Lq=require("path"),jn=rt(),Mq=ue(),vq=(H(),D($)),Uq=j(),{hdb_errors:Pce}=me(),{HDB_ERROR_MSGS:Zr}=Pce,bo=/^[a-zA-Z0-9-_]+$/,Dce=/^[a-zA-Z0-9-_]+$/;xq.exports={getDropCustomFunctionValidator:Mce,setCustomFunctionValidator:vce,addComponentValidator:Hce,dropCustomFunctionProjectValidator:kce,packageComponentValidator:Fce,deployComponentValidator:Gce,setComponentFileValidator:Uce,getComponentFileValidator:Bce,dropComponentFileValidator:xce,addSSHKeyValidator:qce,updateSSHKeyValidator:$ce,deleteSSHKeyValidator:Vce,setSSHKnownHostsValidator:Kce};function qg(e,t,r){try{let n=Mq.get(vq.CONFIG_PARAMS.COMPONENTSROOT),s=Lq.join(n,t);return Dq.existsSync(s)?e?t:r.message(Zr.PROJECT_EXISTS):e?r.message(Zr.NO_PROJECT):t}catch(n){return Uq.error(n),r.message(Zr.VALIDATION_ERR)}}a(qg,"checkProjectExists");function oh(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(oh,"checkFilePath");function Lce(e,t,r,n){try{let s=Mq.get(vq.CONFIG_PARAMS.COMPONENTSROOT),i=Lq.join(s,e,t,r+".js");return Dq.existsSync(i)?r:n.message(Zr.NO_FILE)}catch(s){return Uq.error(s),n.message(Zr.VALIDATION_ERR)}}a(Lce,"checkFileExists");function Mce(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(qg.bind(null,!0)).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(bo).custom(Lce.bind(null,e.project,e.type)).custom(oh).required().messages({"string.pattern.base":Zr.BAD_FILE_NAME})});return jn.validateBySchema(e,t)}a(Mce,"getDropCustomFunctionValidator");function vce(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(qg.bind(null,!0)).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(oh).required(),function_content:Ne.string().required()});return jn.validateBySchema(e,t)}a(vce,"setCustomFunctionValidator");function Uce(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":Zr.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 jn.validateBySchema(e,t)}a(Uce,"setComponentFileValidator");function xce(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME}),file:Ne.string().custom(oh).optional()});return jn.validateBySchema(e,t)}a(xce,"dropComponentFileValidator");function Bce(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 jn.validateBySchema(e,t)}a(Bce,"getComponentFileValidator");function Hce(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(qg.bind(null,!1)).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME})});return jn.validateBySchema(e,t)}a(Hce,"addComponentValidator");function kce(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(qg.bind(null,!0)).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME})});return jn.validateBySchema(e,t)}a(kce,"dropCustomFunctionProjectValidator");function Fce(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return jn.validateBySchema(e,t)}a(Fce,"packageComponentValidator");function Gce(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME}),package:Ne.string().optional(),restart:Ne.alternatives().try(Ne.boolean(),Ne.string().valid("rolling")).optional()});return jn.validateBySchema(e,t)}a(Gce,"deployComponentValidator");function qce(e){let t=Ne.object({name:Ne.string().pattern(Dce).required().messages({"string.pattern.base":Zr.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(qce,"addSSHKeyValidator");function $ce(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return jn.validateBySchema(e,t)}a($ce,"updateSSHKeyValidator");function Vce(e){let t=Ne.object({name:Ne.string().required()});return jn.validateBySchema(e,t)}a(Vce,"deleteSSHKeyValidator");function Kce(e){let t=Ne.object({known_hosts:Ne.string().required()});return jn.validateBySchema(e,t)}a(Kce,"setSSHKnownHostsValidator")});var lh=P((gPe,qq)=>{"use strict";var $g=require("joi"),Ca=require("path"),sd=require("fs-extra"),{exec:Yce,spawn:Wce}=require("child_process"),zce=require("util"),Qce=zce.promisify(Yce),id=(H(),D($)),{PACKAGE_ROOT:jce}=pt(),{handleHDBError:ah,hdb_errors:Jce}=me(),{HTTP_STATUS_CODES:ch}=Jce,ol=ue(),Xce=rt(),Pa=j(),{once:Zce}=require("events");ol.initSync();var FN=ol.get(id.CONFIG_PARAMS.COMPONENTSROOT),Hq="npm install --force --omit=dev --json",ele=`${Hq} --dry-run`,tle=ol.get(id.CONFIG_PARAMS.ROOTPATH),Vg=Ca.join(tle,"ssh");qq.exports={installModules:ile,auditModules:ole,installAllRootModules:rle,uninstallRootModule:nle,linkHarperdb:sle,runCommand:od};async function rle(e=!1,t=ol.get(id.CONFIG_PARAMS.ROOTPATH)){await Kg();let r=!1,n=process.env;sd.pathExistsSync(Vg)&&sd.readdirSync(Vg).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+Ca.join(Vg,"config")+" -o UserKnownHostsFile="+Ca.join(Vg,"known_hosts"),...process.env},r=!0)});try{let s=ol.get(id.CONFIG_PARAMS.ROOTPATH),i=Ca.join(s,"node_modules","harperdb");sd.lstatSync(i).isSymbolicLink()&&sd.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&Pa.error("Error removing symlink:",s)}await od(e?"npm install --force --ignore-scripts --no-bin-links":"npm install --force --no-bin-links",t,n)}a(rle,"installAllRootModules");async function nle(e){await od(`npm uninstall ${e}`,ol.get(id.CONFIG_PARAMS.ROOTPATH))}a(nle,"uninstallRootModule");async function sle(){await Kg(),await od(`npm link ${jce}`,ol.get(id.CONFIG_PARAMS.ROOTPATH))}a(sle,"linkHarperdb");async function od(e,t=void 0,r=process.env){Pa.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=Wce(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();Pa.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();Pa.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await Zce(n,"close");if(o!==0)throw new Error(`Command \`${e}\` exited with code ${o}.${i===""?"":` Error: ${i}`}`);return s||void 0}a(od,"runCommand");async function ile(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";Pa.warn(t,e.projects);let r=Gq(e);if(r)throw ah(r,r.message,ch.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?ele:Hq;await Kg(),await Fq(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=Ca.join(FN,u),d,_=null;try{let{stdout:h,stderr:m}=await Qce(i,{cwd:f});d=h?h.replace(`
25
+ ${r.stack}`;throw vN.error(n),_q(new Error)}}}a(hce,"getRolePermissions");function mce(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]=pce(t[i]);return}r[i]=Eq(),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=Ece(c,l);r[i].describe||Sq.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=UN()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=UN()})}),r}a(mce,"translateRolePermissions");function pce(e){let t=Eq(!0);return Object.keys(e).forEach(r=>{t.tables[r]=UN(!0,!0,!0,!0,!0)}),t}a(pce,"createStructureUserPermissions");function Ece(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)&&(_=mq(d,f[sh])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=hq(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=Aq(f),s.attribute_permissions.push(f),c||gce(f,l)}else if(u!==o){let f;bn.TIME_STAMP_NAMES.includes(u)?f=mq(u):f=hq(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=pq(s),s}else return e.describe=pq(e),e}a(Ece,"getTableAttrPerms");function pq(e){return Sq.filter(t=>e[t]).length>0}a(pq,"getSchemaTableDescribePerm");function Aq(e){return Tq.filter(t=>e[t]).length>0}a(Aq,"getAttributeDescribePerm");function gce(e,t){Tq.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(gce,"checkForHashPerms")});var ih={};Ue(ih,{authentication:()=>Pq,bypassAuth:()=>Nce,login:()=>Ice,logout:()=>Cce,start:()=>wce});function Nce(){Cq=!0}async function Pq(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let h=e.isOperationsServer?Rce?Ace:[]:Tce?Sce:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let m=Xr.get(U.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",S=new uo([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",m],["Access-Control-Allow-Origin",i]]);return Fg&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),Fg&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(Fg){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 bq.get(l);break}e.session=u||(u={})}let f=a((h,m,S)=>{let g=new nd.AuthAuditLog(h,m,$o.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===Ds.SUCCESS?HN.notify(g):HN.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&HN.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,Ds.SUCCESS,"mTLS")):(0,nd.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let d;if(!e.user)if(n){if(d=il.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 ze.getUser(g,R,e):null;break;case"Bearer":try{d=await Ub(S)}catch(N){if(N.message==="invalid token")try{return await CE(S),c({status:-1})}catch{throw N}}break}}catch(E){return bce&&(il.get(S)||(il.set(S,S),f(g,Ds.FAILURE,m))),c({status:401,body:ea({error:E.message},e)})}il.set(n,d),yce&&f(d.username,Ds.SUCCESS,m)}e.user=d}else u?.user?e.user=await ze.getUser(u.user,null,e):(Cq&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,Nq.getSuperUser)());Fg&&(e.session.update=function(h){let m=Xr.get(U.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,wq.v4)();let S=Xr.get(U.AUTHENTICATION_COOKIE_DOMAINS),g=m?new Date(Date.now()+(0,kN.convertToMS)(m)).toUTCString():Oce,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,bq.put(h,{expiresAt:m?Date.now()+(0,kN.convertToMS)(m):void 0})},e.login=async function(h,m){let S=e.user=await ze.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")&&di.loginPath?(_.status=302,_.headers.set("Location",di.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 uo);for(let d=0;d<u;){let _=o[d++];f.set(_,o[d++])}}return o=null,l}a(c,"applyResponseHeaders")}function wce({server:e,port:t,securePort:r}){e.http(Pq,t||r?{port:t,securePort:r}:{port:"all"}),Oq||(Oq=!0,setInterval(()=>{il=new Map},Xr.get(U.AUTHENTICATION_CACHETTL)).unref(),Iq.user.addListener(()=>{il=new Map}))}async function Ice(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 Cce(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var Nq,wq,Xr,nd,Iq,kN,HN,Sce,Tce,Ace,Rce,bq,Fg,Cq,yce,bce,Oce,il,Oq,Gg=ye(()=>{Nq=M(Gn());$r();Wl();yu();Me();wq=require("uuid"),Xr=M(ue());H();nd=M(j()),Iq=M(Yf());p_();kN=M(oe());Qi();HN=(0,nd.loggerWithTag)("auth-event");Xr.initSync();Sce=Xr.get(U.HTTP_CORSACCESSLIST),Tce=Xr.get(U.HTTP_CORS),Ace=Xr.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),Rce=Xr.get(U.OPERATIONSAPI_NETWORK_CORS),bq=lt({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),Fg=Xr.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,Cq=process.env.AUTHENTICATION_AUTHORIZELOCAL??Xr.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,yce=Xr.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,bce=Xr.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,Oce="Tue, 01 Oct 8307 19:33:20 GMT",il=new Map;ze.onInvalidatedUser(()=>{il=new Map});a(Nce,"bypassAuth");a(Pq,"authentication");a(wce,"start");a(Ice,"login");a(Cce,"logout")});var Bq=P((pPe,xq)=>{"use strict";var Ne=require("joi"),Dq=require("fs-extra"),Lq=require("path"),jn=rt(),Mq=ue(),vq=(H(),D($)),Uq=j(),{hdb_errors:Pce}=me(),{HDB_ERROR_MSGS:Zr}=Pce,bo=/^[a-zA-Z0-9-_]+$/,Dce=/^[a-zA-Z0-9-_]+$/;xq.exports={getDropCustomFunctionValidator:Mce,setCustomFunctionValidator:vce,addComponentValidator:Hce,dropCustomFunctionProjectValidator:kce,packageComponentValidator:Fce,deployComponentValidator:Gce,setComponentFileValidator:Uce,getComponentFileValidator:Bce,dropComponentFileValidator:xce,addSSHKeyValidator:qce,updateSSHKeyValidator:$ce,deleteSSHKeyValidator:Vce,setSSHKnownHostsValidator:Kce};function qg(e,t,r){try{let n=Mq.get(vq.CONFIG_PARAMS.COMPONENTSROOT),s=Lq.join(n,t);return Dq.existsSync(s)?e?t:r.message(Zr.PROJECT_EXISTS):e?r.message(Zr.NO_PROJECT):t}catch(n){return Uq.error(n),r.message(Zr.VALIDATION_ERR)}}a(qg,"checkProjectExists");function oh(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(oh,"checkFilePath");function Lce(e,t,r,n){try{let s=Mq.get(vq.CONFIG_PARAMS.COMPONENTSROOT),i=Lq.join(s,e,t,r+".js");return Dq.existsSync(i)?r:n.message(Zr.NO_FILE)}catch(s){return Uq.error(s),n.message(Zr.VALIDATION_ERR)}}a(Lce,"checkFileExists");function Mce(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(qg.bind(null,!0)).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(bo).custom(Lce.bind(null,e.project,e.type)).custom(oh).required().messages({"string.pattern.base":Zr.BAD_FILE_NAME})});return jn.validateBySchema(e,t)}a(Mce,"getDropCustomFunctionValidator");function vce(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(qg.bind(null,!0)).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(oh).required(),function_content:Ne.string().required()});return jn.validateBySchema(e,t)}a(vce,"setCustomFunctionValidator");function Uce(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":Zr.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 jn.validateBySchema(e,t)}a(Uce,"setComponentFileValidator");function xce(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME}),file:Ne.string().custom(oh).optional()});return jn.validateBySchema(e,t)}a(xce,"dropComponentFileValidator");function Bce(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 jn.validateBySchema(e,t)}a(Bce,"getComponentFileValidator");function Hce(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(qg.bind(null,!1)).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME})});return jn.validateBySchema(e,t)}a(Hce,"addComponentValidator");function kce(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(qg.bind(null,!0)).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME})});return jn.validateBySchema(e,t)}a(kce,"dropCustomFunctionProjectValidator");function Fce(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return jn.validateBySchema(e,t)}a(Fce,"packageComponentValidator");function Gce(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":Zr.BAD_PROJECT_NAME}),package:Ne.string().optional(),restart:Ne.alternatives().try(Ne.boolean(),Ne.string().valid("rolling")).optional()});return jn.validateBySchema(e,t)}a(Gce,"deployComponentValidator");function qce(e){let t=Ne.object({name:Ne.string().pattern(Dce).required().messages({"string.pattern.base":Zr.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(qce,"addSSHKeyValidator");function $ce(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return jn.validateBySchema(e,t)}a($ce,"updateSSHKeyValidator");function Vce(e){let t=Ne.object({name:Ne.string().required()});return jn.validateBySchema(e,t)}a(Vce,"deleteSSHKeyValidator");function Kce(e){let t=Ne.object({known_hosts:Ne.string().required()});return jn.validateBySchema(e,t)}a(Kce,"setSSHKnownHostsValidator")});var lh=P((gPe,qq)=>{"use strict";var $g=require("joi"),Ca=require("path"),sd=require("fs-extra"),{exec:Yce,spawn:Wce}=require("child_process"),zce=require("util"),Qce=zce.promisify(Yce),id=(H(),D($)),{PACKAGE_ROOT:jce}=pt(),{handleHDBError:ah,hdb_errors:Jce}=me(),{HTTP_STATUS_CODES:ch}=Jce,ol=ue(),Xce=rt(),Pa=j(),{once:Zce}=require("events");ol.initSync();var FN=ol.get(id.CONFIG_PARAMS.COMPONENTSROOT),Hq="npm install --force --omit=dev --json",ele=`${Hq} --dry-run`,tle=ol.get(id.CONFIG_PARAMS.ROOTPATH),Vg=Ca.join(tle,"ssh");qq.exports={installModules:ile,auditModules:ole,installAllRootModules:rle,uninstallRootModule:nle,linkHarperdb:sle,runCommand:od};async function rle(e=!1,t=ol.get(id.CONFIG_PARAMS.ROOTPATH)){await Kg();let r=!1,n=process.env;sd.pathExistsSync(Vg)&&sd.readdirSync(Vg).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+Ca.join(Vg,"config")+" -o UserKnownHostsFile="+Ca.join(Vg,"known_hosts"),...process.env},r=!0)});try{let s=ol.get(id.CONFIG_PARAMS.ROOTPATH),i=Ca.join(s,"node_modules","harperdb");sd.lstatSync(i).isSymbolicLink()&&sd.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&Pa.error("Error removing symlink:",s)}await od(e?"npm install --force --ignore-scripts":"npm install --force",t,n)}a(rle,"installAllRootModules");async function nle(e){await od(`npm uninstall ${e}`,ol.get(id.CONFIG_PARAMS.ROOTPATH))}a(nle,"uninstallRootModule");async function sle(){await Kg(),await od(`npm link ${jce}`,ol.get(id.CONFIG_PARAMS.ROOTPATH))}a(sle,"linkHarperdb");async function od(e,t=void 0,r=process.env){Pa.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=Wce(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();Pa.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();Pa.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await Zce(n,"close");if(o!==0)throw new Error(`Command \`${e}\` exited with code ${o}.${i===""?"":` Error: ${i}`}`);return s||void 0}a(od,"runCommand");async function ile(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";Pa.warn(t,e.projects);let r=Gq(e);if(r)throw ah(r,r.message,ch.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?ele:Hq;await Kg(),await Fq(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=Ca.join(FN,u),d,_=null;try{let{stdout:h,stderr:m}=await Qce(i,{cwd:f});d=h?h.replace(`
26
26
  `,""):null,_=m?m.replace(`
27
27
  `,""):null}catch(h){h.stderr?o[u].npm_error=kq(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 Pa.info(`finished installModules with response ${o}`),o.warning=t,o}a(ile,"installModules");function kq(e){let t='"error": {',r=e.indexOf('"error": {'),n=e.indexOf(`}
28
28
  `);return r>-1&&n>-1?JSON.parse(e.substring(r+t.length-1,n+1)):e}a(kq,"parseNPMStdErr");async function ole(e){Pa.info(`starting auditModules for request: ${e}`);let t=Gq(e);if(t)throw ah(t,t.message,ch.BAD_REQUEST);let{projects:r}=e;await Kg(),await Fq(r);let n={};for(let s=0,i=r.length;s<i;s++){let o=r[s],c=Ca.join(FN,o);n[o]={npm_output:null,npm_error:null};try{let l=await od("npm audit --json",c);n[o].npm_output=JSON.parse(l)}catch(l){n[o].npm_error=kq(l.stderr)}}return Pa.info(`finished auditModules with response ${n}`),n}a(ole,"auditModules");async function Kg(){return await od("npm -v"),!0}a(Kg,"checkNPMInstalled");async function Fq(e){if(!Array.isArray(e)||e.length===0)throw ah(new Error,"projects argument must be an array with at least 1 element",ch.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=Ca.join(FN,i.toString());if(!await sd.pathExists(o)){t.push(i);continue}let l=Ca.join(o,"package.json");await sd.pathExists(l)||r.push(i)}if(t.length>0)throw ah(new Error,`Unable to install project dependencies: custom function projects '${t.join(",")}' does not exist.`,ch.BAD_REQUEST,void 0,void 0,!0);if(r.length>0)throw ah(new Error,`Unable to install project dependencies: custom function projects '${r.join(",")}' do not have a package.json file.`,ch.BAD_REQUEST,void 0,void 0,!0)}a(Fq,"checkProjectPaths");function Gq(e){let t=$g.object({projects:$g.array().min(1).items($g.string()).required(),dry_run:$g.boolean().default(!1)});return Xce.validateBySchema(e,t)}a(Gq,"modulesValidator")});var qN=P((TPe,zq)=>{"use strict";var gs=require("fs-extra"),dh=require("path"),uh=j(),$q=oe(),{PACKAGE_ROOT:ale}=pt(),GN=(H(),D($)),Wq=ue(),cle=It();zq.exports=lle;async function lle(){let e=ule(),t=Wq.get(GN.CONFIG_PARAMS.ROOTPATH),r=dh.join(t,"package.json"),n={dependencies:{harperdb:"file:"+ale}},s=dh.join(t,"node_modules");gs.ensureDirSync(s);let i,o=!0,c=!1;try{i=gs.readJsonSync(r)}catch(l){if($q.isEmptyOrZeroLength(e))return;if(l.code!==GN.NODE_ERROR_CODES.ENOENT)throw l;o=!1}if(!$q.isEmptyOrZeroLength(e)){for(let{name:l,package:u}of e){let f=Kq(u);n.dependencies[l]=f+u}if(!o){uh.notify("Installing components"),await Yq(r,n,null),await Vq(t,e);return}for(let{name:l,package:u}of e){let f=i.dependencies[l],d=Kq(u);if(f===void 0||f!==d+u){c=!0;break}if(u.startsWith("file:"))try{if(gs.statSync(new URL(u+"/package.json")).mtimeMs>gs.statSync(r).mtimeMs){c=!0;break}}catch(_){uh.info(`Error checking ${u}/package.json modification time`,_);break}}}for(let l in i.dependencies)n.dependencies[l]===void 0&&(uh.notify("Removing component",l),c=!0);c&&(uh.notify("Updating components."),await Yq(r,n,i),await Vq(t,e))}a(lle,"installComponents");function Vq(e,t){return Promise.all(t.map(({name:r})=>{let n=dh.join(e,"node_modules",r),s=dh.join(e,"components",r);if(gs.existsSync(n)&&gs.lstatSync(n).isDirectory())return gs.move(n,s,{overwrite:!0}).then(()=>{gs.symlink(s,n)})}))}a(Vq,"moveModuleToComponents");function ule(){let e=cle.getConfiguration(),t=[];for(let r in e)e[r]?.package&&t.push(Object.assign(e[r],{name:r}));return t}a(ule,"getComponentsConfig");function Kq(e){return e.includes(":")?"":e.startsWith("@")||!e.startsWith("@")&&!e.includes("/")?"npm:":dh.extname(e)||gs.existsSync(e)?"file:":"github:"}a(Kq,"getPkgPrefix");async function Yq(e,t,r){uh.trace("npm installing components package.json",t),gs.writeFileSync(e,JSON.stringify(t,null," "));try{await lh().installAllRootModules(Wq.get(GN.CONFIG_PARAMS.IGNORE_SCRIPTS)===!0)}catch(n){throw r?gs.writeFileSync(e,JSON.stringify(r,null," ")):gs.unlinkSync(e),n}}a(Yq,"installPackages")});var Xq={};Ue(Xq,{packageDirectory:()=>dle});function dle(e,t={skip_node_modules:!1,skip_symlinks:!1}){return new Promise((r,n)=>{let s=[];jq.default.pack(e,{dereference:!t.skip_symlinks,ignore:t.skip_node_modules?i=>i.includes("node_modules")||i.includes((0,Qq.join)("cache","webpack")):void 0}).pipe((0,Jq.createGzip)()).on("data",i=>s.push(i)).on("end",()=>{r(Buffer.concat(s))}).on("error",n)})}var Qq,jq,Jq,Zq=ye(()=>{Qq=require("path"),jq=M(require("tar-fs")),Jq=require("node:zlib");a(dle,"packageDirectory")});var KN=P(n$=>{"use strict";var be=require("fs-extra"),$N=require("fast-glob"),Ie=require("path"),fle=require("tar-fs"),_le=require("gunzip-maybe"),VN=require("normalize-path"),On=Bq(),xt=j(),ot=(H(),D($)),Wt=ue(),Yg=It(),hle=oe(),{PACKAGE_ROOT:mle}=pt(),{handleHDBError:Bt,hdb_errors:ple}=me(),{basename:Ele}=require("path"),gle=qN(),t$=ue(),{Readable:Sle}=require("stream"),{isMainThread:Tle}=require("worker_threads"),{HDB_ERROR_MSGS:al,HTTP_STATUS_CODES:Ht}=ple,r$=tt(),{replicateOperation:Js}=(ds(),D(Ea)),{packageDirectory:Ale}=(Zq(),D(Xq)),e$=lh(),Rle=Ie.join(mle,"application-template"),yle=Wt.get(ot.CONFIG_PARAMS.ROOTPATH),Da=Ie.join(yle,"ssh"),Oo=Ie.join(Da,"known_hosts");function ble(){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,al.FUNCTION_STATUS,Ht.INTERNAL_SERVER_ERROR,xt.ERR,t)}return e}a(ble,"customFunctionsStatus");function Ole(){xt.trace("getting custom api endpoints");let e={},t=Wt.get(ot.CONFIG_PARAMS.COMPONENTSROOT);try{$N.sync(VN(`${t}/*`),{onlyDirectories:!0}).forEach(n=>{let s=n.split("/").pop();e[s]={routes:$N.sync(VN(`${n}/routes/*.js`)).map(i=>i.split("/").pop().split(".js")[0]),helpers:$N.sync(VN(`${n}/helpers/*.js`)).map(i=>i.split("/").pop().split(".js")[0])}})}catch(r){throw Bt(new Error,al.GET_FUNCTIONS,Ht.INTERNAL_SERVER_ERROR,xt.ERR,r)}return e}a(Ole,"getCustomFunctions");function Nle(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,al.GET_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,c)}}a(Nle,"getCustomFunction");async function wle(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 Js(e);return c.message=`Successfully updated custom function: ${i}.js`,c}catch(c){throw Bt(new Error,al.SET_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,c)}}a(wle,"setCustomFunction");async function Ile(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 Js(e);return o.message=`Successfully deleted custom function: ${i}.js`,o}catch(o){throw Bt(new Error,al.DROP_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,o)}}a(Ile,"dropCustomFunction");async function Cle(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(Rle,s);let i=await Js(e);return i.message=`Successfully added project: ${n}`,i}catch(s){throw Bt(new Error,al.ADD_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,s)}}a(Cle,"addComponent");async function Ple(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(!hle.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 Yg.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 Js(e);return o.message=`Successfully deleted project: ${n}`,o}catch(i){throw Bt(new Error,al.DROP_FUNCTION_PROJECT,Ht.INTERNAL_SERVER_ERROR,xt.ERR,i)}}a(Ple,"dropCustomFunctionProject");async function Dle(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 Ale(s,e)).toString("base64");return{project:n,payload:i}}a(Dle,"packageComponent");async function Lle(e){e.project?e.project=Ie.parse(e.project).name:e.package&&(e.project=Mle(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=Sle.from(s instanceof Buffer?s:Buffer.from(s,"base64"));await new Promise((E,T)=>{S.pipe(_le()).pipe(fle.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 e$.runCommand(o,c):be.existsSync(R)||await e$.installAllRootModules(!1,c)}else{await Yg.addConfig(n,{package:i}),await gle();let S=t$.get(ot.CONFIG_PARAMS.ROOTPATH);c=Ie.join(S,"node_modules",n)}if(Tle)return;let l=new Map;l.isWorker=!0;let u=(_h(),D(fh)),f;u.setErrorReporter(S=>f=S);let d=Ele(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 m=await Js(e);if(e.restart===!0)r$.restartWorkers("http"),m.message=`Successfully deployed: ${n}, restarting HarperDB`;else if(h){let g=await YN().executeJob({operation:"restart_service",service:"http",replicated:!0});m.restartJobId=g.job_id,m.message=`Successfully deployed: ${n}, restarting HarperDB`}else m.message=`Successfully deployed: ${n}`;return m}a(Lle,"deployComponent");function Mle(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(Mle,"getProjectNameFromPackage");async function vle(){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=(_h(),D(fh)).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(vle,"getComponents");async function Ule(e){let t=On.getComponentFileValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let n=Yg.getConfigObj()[e.project]||e.project==="harperdb"?Ie.join(t$.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(Ule,"getComponentFile");async function xle(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 Js(e);return s.message="Successfully set component: "+e.file,s}a(xle,"setComponentFile");async function Ble(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")}Yg.deleteConfigFromFile([r]);let l=await Js(e);return e.restart===!0?(r$.restartWorkers("http"),l.message=`Successfully dropped: ${s}, restarting HarperDB`):l.message=`Successfully dropped: ${s}`,l}a(Ble,"dropComponent");async function Hle(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(Da,r+".key"),l=Ie.join(Da,"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}
@@ -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"?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(kce.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=dG(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=il.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return vN=e,e}a(HN,"licenseSearch");async function Qce(){return vN||await HN(),vN}a(Qce,"getLicense");function Jce(){let e=HN().ram_allocation,t=process.constrainedMemory?.()||aG();if(t=Math.round(Math.min(t,aG())/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(Jce,"checkMemoryLimit")});var qN=P((IDe,pG)=>{var qg=rd(),_G=require("chalk"),zn=z(),hG=require("prompt"),{promisify:Xce}=require("util"),kN=(B(),D(G)),Zce=require("fs-extra"),ele=require("path"),tle=oe(),{packageJson:rle}=Et(),mG=le();mG.initSync();var nle=require("moment"),sle=Xce(hG.get),ile=ele.join(mG.getHdbBasePath(),kN.LICENSE_KEY_DIR_NAME,kN.LICENSE_FILE_NAME,kN.LICENSE_FILE_NAME);pG.exports={getFingerprint:ale,setLicense:ole,parseLicense:FN,register:cle,getRegistrationInfo:ule};async function ole(e){if(e&&e.key&&e.company){try{zn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await FN(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(ole,"setLicense");async function ale(){let e={};try{e=await qg.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw zn.error(r),zn.error(t),new Error(r)}return e}a(ale,"getFingerprint");async function FN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");zn.info("Validating license input...");let r=qg.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 Zce.writeFile(ile,JSON.stringify({license_key:e,company:t}))}catch(n){throw zn.error("Failed to write License"),n}return"Registration successful."}a(FN,"parseLicense");async function cle(){let e=await lle();return FN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(cle,"register");async function lle(){let e=await qg.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:_G.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:_G.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{hG.start()}catch(n){zn.error(n)}let r;try{r=await sle(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(lle,"promptForRegistration");async function ule(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await qg.getLicense()}catch(r){throw zn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(tle.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=rle.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=nle.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(ule,"getRegistrationInfo")});var gG=P((PDe,EG)=>{"use strict";var dle=it(),GN=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+dle.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"}};EG.exports=GN});var AG=P((LDe,TG)=>{"use strict";var SG=it(),$N=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+SG.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+SG.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"}};TG.exports=$N});var yG=P((vDe,RG)=>{"use strict";var VN=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};RG.exports=VN});var OG=P((xDe,bG)=>{"use strict";var fle=it(),KN=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+fle.SERVER_SUFFIX.ADMIN,this.password=r}};bG.exports=KN});var Kg=P((HDe,IG)=>{"use strict";var ol=require("path"),al=require("fs-extra"),_le=gG(),hle=AG(),mle=yG(),ple=OG(),YN=qn(),sd=oe(),yn=It(),$g=(B(),D(G)),oh=it(),{CONFIG_PARAMS:Wt}=$g,id=z(),ah=le(),NG=oo(),WN=xt(),Ele=Qs(),nd="clustering",gle=1e4,wG=50;IG.exports={generateNatsConfig:Tle,removeNatsConfig:Ale,getHubConfigPath:Sle};function Sle(){let e=ah.get(Wt.ROOTPATH);return ol.join(e,nd,oh.NATS_CONFIG_FILES.HUB_SERVER)}a(Sle,"getHubConfigPath");async function Tle(e=!1,t=void 0){let r=ah.get(Wt.ROOTPATH);al.ensureDirSync(ol.join(r,"clustering","leaf")),ah.initSync();let n=yn.getConfigFromFile(Wt.CLUSTERING_TLS_CERT_AUTH),s=yn.getConfigFromFile(Wt.CLUSTERING_TLS_PRIVATEKEY),i=yn.getConfigFromFile(Wt.CLUSTERING_TLS_CERTIFICATE);!await al.exists(i)&&!await al.exists(!n)&&await Ele.createNatsCerts();let o=ol.join(r,nd,oh.PID_FILES.HUB),c=ol.join(r,nd,oh.PID_FILES.LEAF),l=yn.getConfigFromFile(Wt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=ol.join(r,nd,oh.NATS_CONFIG_FILES.HUB_SERVER),f=ol.join(r,nd,oh.NATS_CONFIG_FILES.LEAF_SERVER),d=yn.getConfigFromFile(Wt.CLUSTERING_TLS_INSECURE),_=yn.getConfigFromFile(Wt.CLUSTERING_TLS_VERIFY),h=yn.getConfigFromFile(Wt.CLUSTERING_NODENAME),m=yn.getConfigFromFile(Wt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await WN.checkNATSServerInstalled()||Vg("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await YN.listUsers(),g=yn.getConfigFromFile(Wt.CLUSTERING_USER),A=await YN.getClusterUser();(sd.isEmpty(A)||A.active!==!0)&&Vg(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await Gg(Wt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await Gg(Wt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await Gg(Wt.CLUSTERING_HUBSERVER_NETWORK_PORT),await Gg(Wt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[ie,W]of S.entries())W.role?.role===$g.ROLE_TYPES_ENUM.CLUSTER_USER&&W.active&&(E.push(new ple(W.username,NG.decrypt(W.hash))),T.push(new mle(W.username,NG.decrypt(W.hash))));let N=[],{hub_routes:v}=yn.getClusteringRoutes();if(!sd.isEmptyOrZeroLength(v))for(let ie of v)N.push(`tls://${A.sys_name_encoded}:${A.uri_encoded_d_hash}@${ie.host}:${ie.port}`);let k=new _le(yn.getConfigFromFile(Wt.CLUSTERING_HUBSERVER_NETWORK_PORT),h,o,i,s,n,d,_,m,yn.getConfigFromFile(Wt.CLUSTERING_HUBSERVER_CLUSTER_NAME),yn.getConfigFromFile(Wt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete k.tls.ca_file,delete k.leafnodes.tls.ca_file),t=sd.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===$g.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await al.writeJson(u,k),id.trace(`Hub server config written to ${u}`));let q=`tls://${A.sys_name_encoded}:${A.uri_encoded_d_hash}@0.0.0.0:${m}`,Y=`tls://${A.uri_encoded_name}:${A.uri_encoded_d_hash}@0.0.0.0:${m}`,X=new hle(yn.getConfigFromFile(Wt.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[q],[Y],E,T,i,s,n,d);n==null&&delete X.tls.ca_file,(t===void 0||t===$g.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await al.writeJson(f,X),id.trace(`Leaf server config written to ${f}`))}a(Tle,"generateNatsConfig");async function Gg(e){let t=ah.get(e);return sd.isEmpty(t)&&Vg(`port undefined for '${e}'`),await sd.isPortTaken(t)&&Vg(`'${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(Gg,"isPortAvailable");function Vg(e){let t=`Error generating clustering config: ${e}`;id.error(t),console.error(t),process.exit(1)}a(Vg,"generateNatsConfigError");async function Ale(e){let{port:t,config_file:r}=WN.getServerConfig(e),{username:n,decrypt_hash:s}=await YN.getClusterUser(),i=0,o=2e3;for(;i<wG;){try{let f=await WN.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){id.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=wG)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&&id.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await sd.async_set_timeout(u)}let c="0".repeat(gle),l=ol.join(ah.get(Wt.ROOTPATH),nd,r);await al.writeFile(l,c),await al.remove(l),id.notify(e,"started.")}a(Ale,"removeNatsConfig")});var vG=P((FDe,MG)=>{"use strict";var jn=le(),Rle=rd(),qe=(B(),D(G)),ch=it(),To=require("path"),{PACKAGE_ROOT:Wg}=Et(),CG=le(),Yg=oe(),od="/dev/null",yle=To.join(Wg,"launchServiceScripts"),PG=To.join(Wg,"utility/scripts"),ble=To.join(PG,qe.HDB_RESTART_SCRIPT),DG=To.resolve(Wg,"dependencies",`${process.platform}-${process.arch}`,ch.NATS_BINARY_NAME);function LG(){let t=Rle.licenseSearch().ram_allocation||qe.RAM_ALLOCATION_ENUM.DEFAULT,r=qe.MEM_SETTING_KEY+t,n={[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return Yg.noBootFile()&&(n[qe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Yg.getEnvCliRootPath()),{name:qe.PROCESS_DESCRIPTORS.HDB,script:qe.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:Wg}}a(LG,"generateMainServerConfig");var Ole=9930;function Nle(){jn.initSync(!0);let e=jn.get(qe.CONFIG_PARAMS.ROOTPATH),t=To.join(e,"clustering",ch.NATS_CONFIG_FILES.HUB_SERVER),r=To.join(jn.get(qe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),qe.LOG_NAMES.HDB),n=CG.get(qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=ch.LOG_LEVEL_FLAGS[jn.get(qe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Ole?"-"+n:""),script:DG,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return jn.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=od,i.error_file=od),i}a(Nle,"generateNatsHubServerConfig");var wle=9940;function Ile(){jn.initSync(!0);let e=jn.get(qe.CONFIG_PARAMS.ROOTPATH),t=To.join(e,"clustering",ch.NATS_CONFIG_FILES.LEAF_SERVER),r=To.join(jn.get(qe.HDB_SETTINGS_NAMES.LOG_PATH_KEY),qe.LOG_NAMES.HDB),n=CG.get(qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=ch.LOG_LEVEL_FLAGS[jn.get(qe.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==wle?"-"+n:""),script:DG,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return jn.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=od,i.error_file=od),i}a(Ile,"generateNatsLeafServerConfig");function Cle(){jn.initSync();let e=To.join(jn.get(qe.CONFIG_PARAMS.LOGGING_ROOT),qe.LOG_NAMES.HDB),t={name:qe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:qe.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:yle,autorestart:!1};return jn.get(qe.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=od,t.error_file=od),t}a(Cle,"generateClusteringUpgradeV4ServiceConfig");function Ple(){let e={[qe.PROCESS_NAME_ENV_PROP]:qe.PROCESS_DESCRIPTORS.RESTART_HDB};return Yg.noBootFile()&&(e[qe.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=Yg.getEnvCliRootPath()),{...{name:qe.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:PG},script:ble}}a(Ple,"generateRestart");function Dle(){return{apps:[LG()]}}a(Dle,"generateAllServiceConfigs");MG.exports={generateAllServiceConfigs:Dle,generateMainServerConfig:LG,generateRestart:Ple,generateNatsHubServerConfig:Nle,generateNatsLeafServerConfig:Ile,generateClusteringUpgradeV4ServiceConfig:Cle}});var uh=P(($De,zG)=>{"use strict";var rt=(B(),D(G)),Lle=oe(),Ro=Kg(),zg=xt(),Ao=it(),Ca=vG(),jg=le(),cl=z(),Mle=ps(),{startWorker:UG,onMessageFromWorkers:vle}=Je(),Ule=Qu(),GDe=require("util"),xle=require("child_process"),Ble=require("fs"),{execFile:Hle}=xle,Ye;zG.exports={enterPM2Mode:kle,start:Pa,stop:zN,reload:BG,restart:HG,list:jN,describe:qG,connect:yo,kill:Vle,startAllServices:Kle,startService:QN,getUniqueServicesList:GG,restartAllServices:Yle,isServiceRegistered:$G,reloadStopStart:VG,restartHdb:FG,deleteProcess:Gle,startClusteringProcesses:YG,startClusteringThreads:WG,isHdbRestartRunning:$le,isClusteringRunning:zle,stopClustering:Wle,reloadClustering:jle,expectedRestartOfChildren:kG};var lh=!1;vle(e=>{e.type==="restart"&&jg.initSync(!0)});function kle(){lh=!0}a(kle,"enterPM2Mode");function yo(){return Ye||(Ye=require("pm2")),new Promise((e,t)=>{Ye.connect((r,n)=>{r&&t(r),e(n)})})}a(yo,"connect");var en,Fle=10,xG;function Pa(e,t=!1){if(lh)return qle(e);let r=Hle(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),!xG&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<Fle&&(Ble.existsSync(Ro.getHubConfigPath())?Pa(e):(await Ro.generateNatsConfig(!0),Pa(e),await new Promise(c=>setTimeout(c,3e3)),await Ro.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Ro.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=jg.get(rt.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&Ao.LOG_LEVEL_HIERARCHY[o]>=Ao.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===Ao.LOG_LEVELS.ERR||f===Ao.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=Ao.LOG_LEVELS[_]}if(Ao.LOG_LEVEL_HIERARCHY[o]>=Ao.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===Ao.LOG_LEVELS.ERR||f===Ao.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(),!en&&(en=[],!t)){let i=a(()=>{xG=!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(Pa,"start");function qle(e){return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ye.start(e,(n,s)=>{n&&(Ye.disconnect(),r(n)),Ye.disconnect(),t(s)})})}a(qle,"startWithPM2");function zN(e){if(!lh){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 yo()}catch(n){r(n)}Ye.stop(e,async(n,s)=>{n&&(Ye.disconnect(),r(n)),Ye.delete(e,(i,o)=>{i&&(Ye.disconnect(),r(n)),Ye.disconnect(),t(o)})})})}a(zN,"stop");function BG(e){return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ye.reload(e,(n,s)=>{n&&(Ye.disconnect(),r(n)),Ye.disconnect(),t(s)})})}a(BG,"reload");function HG(e){if(!lh){kG();for(let t of en||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ye.restart(e,(n,s)=>{Ye.disconnect(),t(s)})})}a(HG,"restart");function kG(){for(let e of en||[])e.config&&(e.config.restarts=0)}a(kG,"expectedRestartOfChildren");function Gle(e){return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ye.delete(e,(n,s)=>{n&&(Ye.disconnect(),r(n)),Ye.disconnect(),t(s)})})}a(Gle,"deleteProcess");async function FG(){await Pa(Ca.generateRestart())}a(FG,"restartHdb");async function $le(){let e=await jN();for(let t in e)if(e[t].name===rt.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a($le,"isHdbRestartRunning");function jN(){return new Promise(async(e,t)=>{try{await yo()}catch(r){t(r)}Ye.list((r,n)=>{r&&(Ye.disconnect(),t(r)),Ye.disconnect(),e(n)})})}a(jN,"list");function qG(e){return new Promise(async(t,r)=>{try{await yo()}catch(n){r(n)}Ye.describe(e,(n,s)=>{n&&(Ye.disconnect(),r(n)),Ye.disconnect(),t(s)})})}a(qG,"describe");function Vle(){if(!lh){for(let e of en||[])e.kill();en=[];return}return new Promise(async(e,t)=>{try{await yo()}catch(r){t(r)}Ye.killDaemon((r,n)=>{r&&(Ye.disconnect(),t(r)),Ye.disconnect(),e(n)})})}a(Vle,"kill");async function Kle(){try{await YG(),await WG(),await Pa(Ca.generateAllServiceConfigs())}catch(e){throw Ye?.disconnect(),e}}a(Kle,"startAllServices");async function QN(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case rt.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Ca.generateMainServerConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Ca.generateNatsIngestServiceConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Ca.generateNatsReplyServiceConfig();break;case rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Ca.generateNatsHubServerConfig(),await Pa(r,t),await Ro.removeNatsConfig(e);return;case rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Ca.generateNatsLeafServerConfig(),await Pa(r,t),await Ro.removeNatsConfig(e);return;case rt.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Ca.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await Pa(r)}catch(r){throw Ye?.disconnect(),r}}a(QN,"startService");async function GG(){try{let e=await jN(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw Ye?.disconnect(),e}}a(GG,"getUniqueServicesList");async function Yle(e=[]){try{let t=!1,r=await GG();for(let n=0,s=Object.values(r).length;n<s;n++){let o=Object.values(r)[n].name;e.includes(o)||(o===rt.PROCESS_DESCRIPTORS.HDB?t=!0:await HG(o))}t&&await VG(rt.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Ye?.disconnect(),t}}a(Yle,"restartAllServices");async function $G(e){if(en?.find(r=>r.name===e))return!0;let t=await Ule.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a($G,"isServiceRegistered");async function VG(e){let t=jg.get(rt.CONFIG_PARAMS.THREADS_COUNT)??jg.get(rt.CONFIG_PARAMS.THREADS),r=await qG(e),n=Lle.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await zN(e),await QN(e)):e===rt.PROCESS_DESCRIPTORS.HDB?await FG():await BG(e)}a(VG,"reloadStopStart");var KG;async function YG(e=!1){for(let t in rt.CLUSTERING_PROCESSES){let r=rt.CLUSTERING_PROCESSES[t];await QN(r,e)}}a(YG,"startClusteringProcesses");async function WG(){KG=UG(rt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:rt.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await zg.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await zg.updateLocalStreams();let e=await Mle.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===rt.PRE_4_0_0_VERSION){cl.info("Starting clustering upgrade 4.0.0 process"),UG(rt.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(WG,"startClusteringThreads");async function Wle(){for(let e in rt.CLUSTERING_PROCESSES)if(e!==rt.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===rt.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await KG.terminate();else{let t=rt.CLUSTERING_PROCESSES[e];await zN(t)}}a(Wle,"stopClustering");async function zle(){for(let e in rt.CLUSTERING_PROCESSES){let t=rt.CLUSTERING_PROCESSES[e];if(await $G(t)===!1)return!1}return!0}a(zle,"isClusteringRunning");async function jle(){await Ro.generateNatsConfig(!0),await zg.reloadNATSHub(),await zg.reloadNATSLeaf(),await Ro.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await Ro.removeNatsConfig(rt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(jle,"reloadClustering")});var ZN={};Ue(ZN,{compactOnStart:()=>Qle,copyDb:()=>e$});async function Qle(){Da.notify("Running compact on start"),console.log("Running compact on start");let e=(0,JN.get)(U.ROOTPATH),t=new Map,r=et();(0,XN.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,Qg.join)(e,"backup",n+".mdb"),o=(0,Qg.join)(e,sc,n+"-copy.mdb"),c=0;try{c=await jG(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){Da.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 e$(n,o),console.log("Backing up",n,"to",i),await(0,ll.move)(s,i,{overwrite:!0})}try{ad()}catch(n){Da.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,Qg.join)(e,sc,`${n}-copy.mdb-lock`));try{ad()}catch(n){Da.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){Da.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,XN.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 ad(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await jG(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}`;Da.error(l),console.error(l)}(0,JN.get)(U.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||o===!1||(console.log("Removing backup",s),await(0,ll.remove)(s))}}async function jG(e){let t=await(0,ZG.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}async function e$(e,t){console.log("copyDb start");let r=et()[e],n;for(let d in r){n=r[d].primaryStore.rootStore;break}let s=n.dbisDb,i=n.auditStore,o=(0,QG.open)(new JG.default(t)),c=o.openDB(Jg.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=Xg(),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 A=new XG.default(!m,m);A.encoding="binary",A.compression=S;let E=n.openDB(_,A);E.decoder=null,E.decoderCopies=!1,E.encoding="binary",A.compression=g;let T=o.openDB(_,A);T.encoder=null,console.log("copying",_,"from",e,"to",t),await d(E,T,m,f)}if(i){let _=n.openDB(Jg.AUDIT_STORE_NAME,dh);console.log("copying audit log for",e,"to",t),d(i,_,!1,f)}async function d(_,h,m,S){let g=0,A=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,m?k:void 0),g++,S.openTimer&&(S.openTimer=0),A+=(N?.length||10)+v.length,u++>5e3&&(await l,console.log("copied",g,"entries",A,"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",A,"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 QG,Qg,ll,JN,JG,XG,Jg,ZG,XN,Da,ew=ye(()=>{Me();QG=require("lmdb"),Qg=require("path"),ll=require("fs-extra"),JN=M(le()),JG=M(Lf()),XG=M(Df()),Jg=M(Ut());B();to();ZG=M(Ai()),XN=M(It()),Da=M(z());a(Qle,"compactOnStart");a(jG,"getTotalDBRecordCount");a(e$,"copyDb")});var ld=P((XDe,a$)=>{"use strict";var Jle=require("minimist"),{isMainThread:rw,parentPort:_h,threadId:jDe}=require("worker_threads"),nt=(B(),D(G)),Li=z(),nw=oe(),eS=Kg(),Zg=xt(),QDe=it(),s$=It(),Xs=uh(),t$=Qu(),{compactOnStart:Xle}=(ew(),D(ZN)),Zle=ic(),{restartWorkers:tS,onMessageByType:eue}=Je(),{handleHDBError:tue,hdb_errors:rue}=me(),{HTTP_STATUS_CODES:nue}=rue,hh=le(),{sendOperationToNode:r$,getThisNodeName:sue,monitorNodeCAs:iue}=(fs(),D(Sa)),{getHDBNodeTable:JDe}=(Yc(),D(hO));hh.initSync();var fh=`Restarting HarperDB. This may take up to ${nt.RESTART_TIMEOUT_MS/1e3} seconds.`,oue="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",n$="Clustering is not enabled so cannot be restarted",aue="Invalid service",cd,Ss;a$.exports={restart:i$,restartService:sw};rw&&eue(nt.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await sw({service:e.workerType}):i$({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function i$(e){Ss=Object.keys(e).length===0,cd=await Xs.isServiceRegistered(nt.PROCESS_DESCRIPTORS.HDB);let t=Jle(process.argv);if(t.service){await sw(t);return}if(Ss&&!cd){console.error(oue);return}if(Ss&&console.log(fh),cd){Xs.enterPM2Mode(),Li.notify(fh);let r=Zle(Object.keys(nt.CONFIG_PARAM_MAP),!0);return nw.isEmptyOrZeroLength(Object.keys(r))||s$.updateConfigValue(void 0,void 0,r,!0,!0),cue(),fh}return rw?(Li.notify(fh),hh.get(nt.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await Xle(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{tS()},50)):_h.postMessage({type:nt.ITC_EVENT_TYPES.RESTART}),fh}a(i$,"restart");async function sw(e){let{service:t}=e;if(nt.HDB_PROCESS_SERVICES[t]===void 0)throw tue(new Error,aue,nue.BAD_REQUEST,void 0,void 0,!0);if(Xs.expectedRestartOfChildren(),cd=await Xs.isServiceRegistered(nt.PROCESS_DESCRIPTORS.HDB),!rw){e.replicated&&iue(),_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===sue())continue;let i;try{({job_id:i}=await r$(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 r$(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=n$;break}Ss&&console.log("Restarting clustering"),Li.notify("Restarting clustering"),await o$();break;case nt.HDB_PROCESS_SERVICES.clustering_config:case nt.HDB_PROCESS_SERVICES["clustering config"]:if(!hh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=n$;break}Ss&&console.log("Restarting clustering_config"),Li.notify("Restarting clustering_config"),await Xs.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(Ss&&!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}Ss&&console.log("Restarting http_workers"),Li.notify("Restarting http_workers"),Ss?await Xs.restart(nt.PROCESS_DESCRIPTORS.HDB):await tS("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Li.error(r),Ss&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(sw,"restartService");async function cue(){await o$(),await Xs.restart(nt.PROCESS_DESCRIPTORS.HDB),await nw.async_set_timeout(2e3),hh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await tw(),Ss&&(await Zg.closeConnection(),process.exit(0))}a(cue,"restartPM2Mode");async function o$(){if(!s$.getConfigFromFile(nt.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await t$.getHDBProcessInfo()).clustering.length===0)Li.trace("Clustering not running, restart will start clustering services"),await eS.generateNatsConfig(!0),await Xs.startClusteringProcesses(),await Xs.startClusteringThreads(),await tw(),Ss&&await Zg.closeConnection();else{await eS.generateNatsConfig(!0),cd?(Li.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await Xs.restart(nt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Xs.restart(nt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await t$.getHDBProcessInfo()).clustering.forEach(s=>{Li.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await nw.async_set_timeout(3e3),await tw(),await Zg.updateLocalStreams(),Ss&&await Zg.closeConnection(),Li.trace("Restart clustering restarting ingest and reply service threads");let t=tS(nt.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=tS(nt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(o$,"restartClustering");async function tw(){await eS.removeNatsConfig(nt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await eS.removeNatsConfig(nt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(tw,"removeNatsConfig")});var g$=P((tLe,E$)=>{"use strict";var eLe=require("lodash"),bn=(B(),D(G)),{handleHDBError:c$,hdb_errors:lue}=me(),{HDB_ERROR_MSGS:uue,HTTP_STATUS_CODES:due}=lue,iw=z();E$.exports={getRolePermissions:_ue};var ul=Object.create(null),fue=a(e=>({key:e,perms:{}}),"perms_template_obj"),f$=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),_$=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"),ow=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,..._$(t,r,n,s)}),"table_perms_template"),l$=a((e,t=_$())=>({attribute_name:e,describe:p$(t),[mh]:t[mh],[aw]:t[aw],[cw]:t[cw]}),"attr_perms_template"),u$=a((e,t=!1)=>({attribute_name:e,describe:t,[mh]:t}),"timestamp_attr_perms_template"),{READ:mh,INSERT:aw,UPDATE:cw}=bn.PERMS_CRUD_ENUM,h$=Object.values(bn.PERMS_CRUD_ENUM),m$=[mh,aw,cw];function _ue(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=hue(e,r);return ul[t]?ul[t].key=n:ul[t]=fue(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 iw.error(n),iw.debug(r),c$(new Error,uue.OUTDATED_PERMS_TRANSLATION_ERROR,due.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
27
- ${r.stack}`;throw iw.error(n),c$(new Error)}}}a(_ue,"getRolePermissions");function hue(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]=mue(t[i]);return}r[i]=f$(),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=pue(c,l);r[i].describe||h$.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=ow()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=ow()})}),r}a(hue,"translateRolePermissions");function mue(e){let t=f$(!0);return Object.keys(e).forEach(r=>{t.tables[r]=ow(!0,!0,!0,!0,!0)}),t}a(mue,"createStructureUserPermissions");function pue(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)&&(_=u$(d,f[mh])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=l$(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=p$(f),s.attribute_permissions.push(f),c||Eue(f,l)}else if(u!==o){let f;bn.TIME_STAMP_NAMES.includes(u)?f=u$(u):f=l$(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=d$(s),s}else return e.describe=d$(e),e}a(pue,"getTableAttrPerms");function d$(e){return h$.filter(t=>e[t]).length>0}a(d$,"getSchemaTableDescribePerm");function p$(e){return m$.filter(t=>e[t]).length>0}a(p$,"getAttributeDescribePerm");function Eue(e,t){m$.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(Eue,"checkForHashPerms")});var ph={};Ue(ph,{authentication:()=>O$,bypassAuth:()=>Oue,login:()=>wue,logout:()=>Iue,start:()=>Nue});function Oue(){b$=!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?Aue?Tue:[]:Sue?gue:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let m=tn.get(U.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",S=new fo([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",m],["Access-Control-Allow-Origin",i]]);return rS&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),rS&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(rS){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 S$.get(l);break}e.session=u||(u={})}let f=a((h,m,S)=>{let g=new ud.AuthAuditLog(h,m,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),m===Ms.SUCCESS?lw.notify(g):lw.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&lw.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,Ms.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=dl.get(n),!d){let h=n.indexOf(" "),m=n.slice(0,h),S=n.slice(h+1),g,A;try{switch(m){case"Basic":let E=atob(S),T=E.indexOf(":");g=E.slice(0,T),A=E.slice(T+1),d=g||A?await ze.getUser(g,A,e):null;break;case"Bearer":try{d=await Kb(S)}catch(N){if(N.message==="invalid token")try{return await BE(S),c({status:-1})}catch{throw N}}break}}catch(E){return yue&&(dl.get(S)||(dl.set(S,S),f(g,Ms.FAILURE,m))),c({status:401,body:ta({error:E.message},e)})}dl.set(n,d),Rue&&f(d.username,Ms.SUCCESS,m)}e.user=d}else u?.user?e.user=await ze.getUser(u.user,null,e):(b$&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,A$.getSuperUser)());rS&&(e.session.update=function(h){let m=tn.get(U.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,R$.v4)();let S=tn.get(U.AUTHENTICATION_COOKIE_DOMAINS),g=m?new Date(Date.now()+(0,uw.convertToMS)(m)).toUTCString():bue,A=S?.find(N=>r.host?.endsWith(N)),T=`${(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session="}${l}; Path=/; Expires=${g}; ${A?"Domain="+A+"; ":""}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,S$.put(h,{expiresAt:m?Date.now()+(0,uw.convertToMS)(m):void 0})},e.login=async function(h,m){let S=e.user=await ze.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")&&fi.loginPath?(_.status=302,_.headers.set("Location",fi.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 fo);for(let d=0;d<u;){let _=o[d++];f.set(_,o[d++])}}return o=null,l}a(c,"applyResponseHeaders")}function Nue({server:e,port:t,securePort:r}){e.http(O$,t||r?{port:t,securePort:r}:{port:"all"}),T$||(T$=!0,setInterval(()=>{dl=new Map},tn.get(U.AUTHENTICATION_CACHETTL)).unref(),y$.user.addListener(()=>{dl=new Map}))}async function wue(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 Iue(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var A$,R$,tn,ud,y$,uw,lw,gue,Sue,Tue,Aue,S$,rS,b$,Rue,yue,bue,dl,T$,nS=ye(()=>{A$=M(qn());$r();Ql();Iu();Me();R$=require("uuid"),tn=M(le());B();ud=M(z()),y$=M(Jf());S_();uw=M(oe());Ji();lw=(0,ud.loggerWithTag)("auth-event");tn.initSync();gue=tn.get(U.HTTP_CORSACCESSLIST),Sue=tn.get(U.HTTP_CORS),Tue=tn.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),Aue=tn.get(U.OPERATIONSAPI_NETWORK_CORS),S$=ut({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),rS=tn.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,b$=process.env.AUTHENTICATION_AUTHORIZELOCAL??tn.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,Rue=tn.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,yue=tn.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,bue="Tue, 01 Oct 8307 19:33:20 GMT",dl=new Map;ze.onInvalidatedUser(()=>{dl=new Map});a(Oue,"bypassAuth");a(O$,"authentication");a(Nue,"start");a(wue,"login");a(Iue,"logout")});var L$=P((dLe,D$)=>{"use strict";var Ne=require("joi"),N$=require("fs-extra"),w$=require("path"),Qn=Ze(),I$=le(),C$=(B(),D(G)),P$=z(),{hdb_errors:Cue}=me(),{HDB_ERROR_MSGS:rn}=Cue,bo=/^[a-zA-Z0-9-_]+$/,Pue=/^[a-zA-Z0-9-_]+$/;D$.exports={getDropCustomFunctionValidator:Lue,setCustomFunctionValidator:Mue,addComponentValidator:Bue,dropCustomFunctionProjectValidator:Hue,packageComponentValidator:kue,deployComponentValidator:Fue,setComponentFileValidator:vue,getComponentFileValidator:xue,dropComponentFileValidator:Uue,addSSHKeyValidator:que,updateSSHKeyValidator:Gue,deleteSSHKeyValidator:$ue,setSSHKnownHostsValidator:Vue};function sS(e,t,r){try{let n=I$.get(C$.CONFIG_PARAMS.COMPONENTSROOT),s=w$.join(n,t);return N$.existsSync(s)?e?t:r.message(rn.PROJECT_EXISTS):e?r.message(rn.NO_PROJECT):t}catch(n){return P$.error(n),r.message(rn.VALIDATION_ERR)}}a(sS,"checkProjectExists");function Eh(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(Eh,"checkFilePath");function Due(e,t,r,n){try{let s=I$.get(C$.CONFIG_PARAMS.COMPONENTSROOT),i=w$.join(s,e,t,r+".js");return N$.existsSync(i)?r:n.message(rn.NO_FILE)}catch(s){return P$.error(s),n.message(rn.VALIDATION_ERR)}}a(Due,"checkFileExists");function Lue(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(sS.bind(null,!0)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(bo).custom(Due.bind(null,e.project,e.type)).custom(Eh).required().messages({"string.pattern.base":rn.BAD_FILE_NAME})});return Qn.validateBySchema(e,t)}a(Lue,"getDropCustomFunctionValidator");function Mue(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(sS.bind(null,!0)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(Eh).required(),function_content:Ne.string().required()});return Qn.validateBySchema(e,t)}a(Mue,"setCustomFunctionValidator");function vue(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":rn.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 Qn.validateBySchema(e,t)}a(vue,"setComponentFileValidator");function Uue(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),file:Ne.string().custom(Eh).optional()});return Qn.validateBySchema(e,t)}a(Uue,"dropComponentFileValidator");function xue(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 Qn.validateBySchema(e,t)}a(xue,"getComponentFileValidator");function Bue(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(sS.bind(null,!1)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME})});return Qn.validateBySchema(e,t)}a(Bue,"addComponentValidator");function Hue(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(sS.bind(null,!0)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME})});return Qn.validateBySchema(e,t)}a(Hue,"dropCustomFunctionProjectValidator");function kue(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return Qn.validateBySchema(e,t)}a(kue,"packageComponentValidator");function Fue(e){let t=Ne.object({project:Ne.string().pattern(bo).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 Qn.validateBySchema(e,t)}a(Fue,"deployComponentValidator");function que(e){let t=Ne.object({name:Ne.string().pattern(Pue).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 Qn.validateBySchema(e,t)}a(que,"addSSHKeyValidator");function Gue(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return Qn.validateBySchema(e,t)}a(Gue,"updateSSHKeyValidator");function $ue(e){let t=Ne.object({name:Ne.string().required()});return Qn.validateBySchema(e,t)}a($ue,"deleteSSHKeyValidator");function Vue(e){let t=Ne.object({known_hosts:Ne.string().required()});return Qn.validateBySchema(e,t)}a(Vue,"setSSHKnownHostsValidator")});var Th=P((_Le,B$)=>{"use strict";var iS=require("joi"),La=require("path"),dd=require("fs-extra"),{exec:Kue,spawn:Yue}=require("child_process"),Wue=require("util"),zue=Wue.promisify(Kue),fd=(B(),D(G)),{PACKAGE_ROOT:jue}=Et(),{handleHDBError:gh,hdb_errors:Que}=me(),{HTTP_STATUS_CODES:Sh}=Que,fl=le(),Jue=Ze(),Ma=z(),{once:Xue}=require("events");fl.initSync();var dw=fl.get(fd.CONFIG_PARAMS.COMPONENTSROOT),M$="npm install --force --omit=dev --json",Zue=`${M$} --dry-run`,ede=fl.get(fd.CONFIG_PARAMS.ROOTPATH),oS=La.join(ede,"ssh");B$.exports={installModules:sde,auditModules:ide,installAllRootModules:tde,uninstallRootModule:rde,linkHarperdb:nde,runCommand:_d};async function tde(e=!1,t=fl.get(fd.CONFIG_PARAMS.ROOTPATH)){await aS();let r=!1,n=process.env;dd.pathExistsSync(oS)&&dd.readdirSync(oS).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+La.join(oS,"config")+" -o UserKnownHostsFile="+La.join(oS,"known_hosts"),...process.env},r=!0)});try{let s=fl.get(fd.CONFIG_PARAMS.ROOTPATH),i=La.join(s,"node_modules","harperdb");dd.lstatSync(i).isSymbolicLink()&&dd.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&Ma.error("Error removing symlink:",s)}await _d(e?"npm install --force --ignore-scripts --no-bin-links":"npm install --force --no-bin-links",t,n)}a(tde,"installAllRootModules");async function rde(e){await _d(`npm uninstall ${e}`,fl.get(fd.CONFIG_PARAMS.ROOTPATH))}a(rde,"uninstallRootModule");async function nde(){await aS(),await _d(`npm link ${jue}`,fl.get(fd.CONFIG_PARAMS.ROOTPATH))}a(nde,"linkHarperdb");async function _d(e,t=void 0,r=process.env){Ma.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=Yue(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();Ma.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();Ma.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await Xue(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 sde(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";Ma.warn(t,e.projects);let r=x$(e);if(r)throw gh(r,r.message,Sh.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?Zue:M$;await aS(),await U$(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=La.join(dw,u),d,_=null;try{let{stdout:h,stderr:m}=await zue(i,{cwd:f});d=h?h.replace(`
27
+ ${r.stack}`;throw iw.error(n),c$(new Error)}}}a(_ue,"getRolePermissions");function hue(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]=mue(t[i]);return}r[i]=f$(),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=pue(c,l);r[i].describe||h$.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=ow()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=ow()})}),r}a(hue,"translateRolePermissions");function mue(e){let t=f$(!0);return Object.keys(e).forEach(r=>{t.tables[r]=ow(!0,!0,!0,!0,!0)}),t}a(mue,"createStructureUserPermissions");function pue(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)&&(_=u$(d,f[mh])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=l$(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=p$(f),s.attribute_permissions.push(f),c||Eue(f,l)}else if(u!==o){let f;bn.TIME_STAMP_NAMES.includes(u)?f=u$(u):f=l$(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=d$(s),s}else return e.describe=d$(e),e}a(pue,"getTableAttrPerms");function d$(e){return h$.filter(t=>e[t]).length>0}a(d$,"getSchemaTableDescribePerm");function p$(e){return m$.filter(t=>e[t]).length>0}a(p$,"getAttributeDescribePerm");function Eue(e,t){m$.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(Eue,"checkForHashPerms")});var ph={};Ue(ph,{authentication:()=>O$,bypassAuth:()=>Oue,login:()=>wue,logout:()=>Iue,start:()=>Nue});function Oue(){b$=!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?Aue?Tue:[]:Sue?gue:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let m=tn.get(U.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",S=new fo([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",m],["Access-Control-Allow-Origin",i]]);return rS&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),rS&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(rS){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 S$.get(l);break}e.session=u||(u={})}let f=a((h,m,S)=>{let g=new ud.AuthAuditLog(h,m,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),m===Ms.SUCCESS?lw.notify(g):lw.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&lw.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,Ms.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=dl.get(n),!d){let h=n.indexOf(" "),m=n.slice(0,h),S=n.slice(h+1),g,A;try{switch(m){case"Basic":let E=atob(S),T=E.indexOf(":");g=E.slice(0,T),A=E.slice(T+1),d=g||A?await ze.getUser(g,A,e):null;break;case"Bearer":try{d=await Kb(S)}catch(N){if(N.message==="invalid token")try{return await BE(S),c({status:-1})}catch{throw N}}break}}catch(E){return yue&&(dl.get(S)||(dl.set(S,S),f(g,Ms.FAILURE,m))),c({status:401,body:ta({error:E.message},e)})}dl.set(n,d),Rue&&f(d.username,Ms.SUCCESS,m)}e.user=d}else u?.user?e.user=await ze.getUser(u.user,null,e):(b$&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,A$.getSuperUser)());rS&&(e.session.update=function(h){let m=tn.get(U.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,R$.v4)();let S=tn.get(U.AUTHENTICATION_COOKIE_DOMAINS),g=m?new Date(Date.now()+(0,uw.convertToMS)(m)).toUTCString():bue,A=S?.find(N=>r.host?.endsWith(N)),T=`${(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session="}${l}; Path=/; Expires=${g}; ${A?"Domain="+A+"; ":""}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,S$.put(h,{expiresAt:m?Date.now()+(0,uw.convertToMS)(m):void 0})},e.login=async function(h,m){let S=e.user=await ze.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")&&fi.loginPath?(_.status=302,_.headers.set("Location",fi.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 fo);for(let d=0;d<u;){let _=o[d++];f.set(_,o[d++])}}return o=null,l}a(c,"applyResponseHeaders")}function Nue({server:e,port:t,securePort:r}){e.http(O$,t||r?{port:t,securePort:r}:{port:"all"}),T$||(T$=!0,setInterval(()=>{dl=new Map},tn.get(U.AUTHENTICATION_CACHETTL)).unref(),y$.user.addListener(()=>{dl=new Map}))}async function wue(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 Iue(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var A$,R$,tn,ud,y$,uw,lw,gue,Sue,Tue,Aue,S$,rS,b$,Rue,yue,bue,dl,T$,nS=ye(()=>{A$=M(qn());$r();Ql();Iu();Me();R$=require("uuid"),tn=M(le());B();ud=M(z()),y$=M(Jf());S_();uw=M(oe());Ji();lw=(0,ud.loggerWithTag)("auth-event");tn.initSync();gue=tn.get(U.HTTP_CORSACCESSLIST),Sue=tn.get(U.HTTP_CORS),Tue=tn.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),Aue=tn.get(U.OPERATIONSAPI_NETWORK_CORS),S$=ut({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),rS=tn.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,b$=process.env.AUTHENTICATION_AUTHORIZELOCAL??tn.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,Rue=tn.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,yue=tn.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,bue="Tue, 01 Oct 8307 19:33:20 GMT",dl=new Map;ze.onInvalidatedUser(()=>{dl=new Map});a(Oue,"bypassAuth");a(O$,"authentication");a(Nue,"start");a(wue,"login");a(Iue,"logout")});var L$=P((dLe,D$)=>{"use strict";var Ne=require("joi"),N$=require("fs-extra"),w$=require("path"),Qn=Ze(),I$=le(),C$=(B(),D(G)),P$=z(),{hdb_errors:Cue}=me(),{HDB_ERROR_MSGS:rn}=Cue,bo=/^[a-zA-Z0-9-_]+$/,Pue=/^[a-zA-Z0-9-_]+$/;D$.exports={getDropCustomFunctionValidator:Lue,setCustomFunctionValidator:Mue,addComponentValidator:Bue,dropCustomFunctionProjectValidator:Hue,packageComponentValidator:kue,deployComponentValidator:Fue,setComponentFileValidator:vue,getComponentFileValidator:xue,dropComponentFileValidator:Uue,addSSHKeyValidator:que,updateSSHKeyValidator:Gue,deleteSSHKeyValidator:$ue,setSSHKnownHostsValidator:Vue};function sS(e,t,r){try{let n=I$.get(C$.CONFIG_PARAMS.COMPONENTSROOT),s=w$.join(n,t);return N$.existsSync(s)?e?t:r.message(rn.PROJECT_EXISTS):e?r.message(rn.NO_PROJECT):t}catch(n){return P$.error(n),r.message(rn.VALIDATION_ERR)}}a(sS,"checkProjectExists");function Eh(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(Eh,"checkFilePath");function Due(e,t,r,n){try{let s=I$.get(C$.CONFIG_PARAMS.COMPONENTSROOT),i=w$.join(s,e,t,r+".js");return N$.existsSync(i)?r:n.message(rn.NO_FILE)}catch(s){return P$.error(s),n.message(rn.VALIDATION_ERR)}}a(Due,"checkFileExists");function Lue(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(sS.bind(null,!0)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(bo).custom(Due.bind(null,e.project,e.type)).custom(Eh).required().messages({"string.pattern.base":rn.BAD_FILE_NAME})});return Qn.validateBySchema(e,t)}a(Lue,"getDropCustomFunctionValidator");function Mue(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(sS.bind(null,!0)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(Eh).required(),function_content:Ne.string().required()});return Qn.validateBySchema(e,t)}a(Mue,"setCustomFunctionValidator");function vue(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":rn.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 Qn.validateBySchema(e,t)}a(vue,"setComponentFileValidator");function Uue(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),file:Ne.string().custom(Eh).optional()});return Qn.validateBySchema(e,t)}a(Uue,"dropComponentFileValidator");function xue(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 Qn.validateBySchema(e,t)}a(xue,"getComponentFileValidator");function Bue(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(sS.bind(null,!1)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME})});return Qn.validateBySchema(e,t)}a(Bue,"addComponentValidator");function Hue(e){let t=Ne.object({project:Ne.string().pattern(bo).custom(sS.bind(null,!0)).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME})});return Qn.validateBySchema(e,t)}a(Hue,"dropCustomFunctionProjectValidator");function kue(e){let t=Ne.object({project:Ne.string().pattern(bo).required().messages({"string.pattern.base":rn.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return Qn.validateBySchema(e,t)}a(kue,"packageComponentValidator");function Fue(e){let t=Ne.object({project:Ne.string().pattern(bo).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 Qn.validateBySchema(e,t)}a(Fue,"deployComponentValidator");function que(e){let t=Ne.object({name:Ne.string().pattern(Pue).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 Qn.validateBySchema(e,t)}a(que,"addSSHKeyValidator");function Gue(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return Qn.validateBySchema(e,t)}a(Gue,"updateSSHKeyValidator");function $ue(e){let t=Ne.object({name:Ne.string().required()});return Qn.validateBySchema(e,t)}a($ue,"deleteSSHKeyValidator");function Vue(e){let t=Ne.object({known_hosts:Ne.string().required()});return Qn.validateBySchema(e,t)}a(Vue,"setSSHKnownHostsValidator")});var Th=P((_Le,B$)=>{"use strict";var iS=require("joi"),La=require("path"),dd=require("fs-extra"),{exec:Kue,spawn:Yue}=require("child_process"),Wue=require("util"),zue=Wue.promisify(Kue),fd=(B(),D(G)),{PACKAGE_ROOT:jue}=Et(),{handleHDBError:gh,hdb_errors:Que}=me(),{HTTP_STATUS_CODES:Sh}=Que,fl=le(),Jue=Ze(),Ma=z(),{once:Xue}=require("events");fl.initSync();var dw=fl.get(fd.CONFIG_PARAMS.COMPONENTSROOT),M$="npm install --force --omit=dev --json",Zue=`${M$} --dry-run`,ede=fl.get(fd.CONFIG_PARAMS.ROOTPATH),oS=La.join(ede,"ssh");B$.exports={installModules:sde,auditModules:ide,installAllRootModules:tde,uninstallRootModule:rde,linkHarperdb:nde,runCommand:_d};async function tde(e=!1,t=fl.get(fd.CONFIG_PARAMS.ROOTPATH)){await aS();let r=!1,n=process.env;dd.pathExistsSync(oS)&&dd.readdirSync(oS).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+La.join(oS,"config")+" -o UserKnownHostsFile="+La.join(oS,"known_hosts"),...process.env},r=!0)});try{let s=fl.get(fd.CONFIG_PARAMS.ROOTPATH),i=La.join(s,"node_modules","harperdb");dd.lstatSync(i).isSymbolicLink()&&dd.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&Ma.error("Error removing symlink:",s)}await _d(e?"npm install --force --ignore-scripts":"npm install --force",t,n)}a(tde,"installAllRootModules");async function rde(e){await _d(`npm uninstall ${e}`,fl.get(fd.CONFIG_PARAMS.ROOTPATH))}a(rde,"uninstallRootModule");async function nde(){await aS(),await _d(`npm link ${jue}`,fl.get(fd.CONFIG_PARAMS.ROOTPATH))}a(nde,"linkHarperdb");async function _d(e,t=void 0,r=process.env){Ma.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=Yue(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();Ma.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();Ma.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await Xue(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 sde(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";Ma.warn(t,e.projects);let r=x$(e);if(r)throw gh(r,r.message,Sh.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?Zue:M$;await aS(),await U$(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=La.join(dw,u),d,_=null;try{let{stdout:h,stderr:m}=await zue(i,{cwd:f});d=h?h.replace(`
28
28
  `,""):null,_=m?m.replace(`
29
29
  `,""):null}catch(h){h.stderr?o[u].npm_error=v$(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 Ma.info(`finished installModules with response ${o}`),o.warning=t,o}a(sde,"installModules");function v$(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(v$,"parseNPMStdErr");async function ide(e){Ma.info(`starting auditModules for request: ${e}`);let t=x$(e);if(t)throw gh(t,t.message,Sh.BAD_REQUEST);let{projects:r}=e;await aS(),await U$(r);let n={};for(let s=0,i=r.length;s<i;s++){let o=r[s],c=La.join(dw,o);n[o]={npm_output:null,npm_error:null};try{let l=await _d("npm audit --json",c);n[o].npm_output=JSON.parse(l)}catch(l){n[o].npm_error=v$(l.stderr)}}return Ma.info(`finished auditModules with response ${n}`),n}a(ide,"auditModules");async function aS(){return await _d("npm -v"),!0}a(aS,"checkNPMInstalled");async function U$(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=La.join(dw,i.toString());if(!await dd.pathExists(o)){t.push(i);continue}let l=La.join(o,"package.json");await dd.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(U$,"checkProjectPaths");function x$(e){let t=iS.object({projects:iS.array().min(1).items(iS.string()).required(),dry_run:iS.boolean().default(!1)});return Jue.validateBySchema(e,t)}a(x$,"modulesValidator")});var _w=P((mLe,$$)=>{"use strict";var Ts=require("fs-extra"),Rh=require("path"),Ah=z(),H$=oe(),{PACKAGE_ROOT:ode}=Et(),fw=(B(),D(G)),G$=le(),ade=It();$$.exports=cde;async function cde(){let e=lde(),t=G$.get(fw.CONFIG_PARAMS.ROOTPATH),r=Rh.join(t,"package.json"),n={dependencies:{harperdb:"file:"+ode}},s=Rh.join(t,"node_modules");Ts.ensureDirSync(s);let i,o=!0,c=!1;try{i=Ts.readJsonSync(r)}catch(l){if(H$.isEmptyOrZeroLength(e))return;if(l.code!==fw.NODE_ERROR_CODES.ENOENT)throw l;o=!1}if(!H$.isEmptyOrZeroLength(e)){for(let{name:l,package:u}of e){let f=F$(u);n.dependencies[l]=f+u}if(!o){Ah.notify("Installing components"),await q$(r,n,null),await k$(t,e);return}for(let{name:l,package:u}of e){let f=i.dependencies[l],d=F$(u);if(f===void 0||f!==d+u){c=!0;break}if(u.startsWith("file:"))try{if(Ts.statSync(new URL(u+"/package.json")).mtimeMs>Ts.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 q$(r,n,i),await k$(t,e))}a(cde,"installComponents");function k$(e,t){return Promise.all(t.map(({name:r})=>{let n=Rh.join(e,"node_modules",r),s=Rh.join(e,"components",r);if(Ts.existsSync(n)&&Ts.lstatSync(n).isDirectory())return Ts.move(n,s,{overwrite:!0}).then(()=>{Ts.symlink(s,n)})}))}a(k$,"moveModuleToComponents");function lde(){let e=ade.getConfiguration(),t=[];for(let r in e)e[r]?.package&&t.push(Object.assign(e[r],{name:r}));return t}a(lde,"getComponentsConfig");function F$(e){return e.includes(":")?"":e.startsWith("@")||!e.startsWith("@")&&!e.includes("/")?"npm:":Rh.extname(e)||Ts.existsSync(e)?"file:":"github:"}a(F$,"getPkgPrefix");async function q$(e,t,r){Ah.trace("npm installing components package.json",t),Ts.writeFileSync(e,JSON.stringify(t,null," "));try{await Th().installAllRootModules(G$.get(fw.CONFIG_PARAMS.IGNORE_SCRIPTS)===!0)}catch(n){throw r?Ts.writeFileSync(e,JSON.stringify(r,null," ")):Ts.unlinkSync(e),n}}a(q$,"installPackages")});var W$={};Ue(W$,{packageDirectory:()=>ude});function ude(e,t={skip_node_modules:!1,skip_symlinks:!1}){return new Promise((r,n)=>{let s=[];K$.default.pack(e,{dereference:!t.skip_symlinks,ignore:t.skip_node_modules?i=>i.includes("node_modules")||i.includes((0,V$.join)("cache","webpack")):void 0}).pipe((0,Y$.createGzip)()).on("data",i=>s.push(i)).on("end",()=>{r(Buffer.concat(s))}).on("error",n)})}var V$,K$,Y$,z$=ye(()=>{V$=require("path"),K$=M(require("tar-fs")),Y$=require("node:zlib");a(ude,"packageDirectory")});var pw=P(X$=>{"use strict";var be=require("fs-extra"),hw=require("fast-glob"),Ie=require("path"),dde=require("tar-fs"),fde=require("gunzip-maybe"),mw=require("normalize-path"),On=L$(),Bt=z(),at=(B(),D(G)),zt=le(),cS=It(),_de=oe(),{PACKAGE_ROOT:hde}=Et(),{handleHDBError:Ht,hdb_errors:mde}=me(),{basename:pde}=require("path"),Ede=_w(),Q$=le(),{Readable:gde}=require("stream"),{isMainThread:Sde}=require("worker_threads"),{HDB_ERROR_MSGS:_l,HTTP_STATUS_CODES:kt}=mde,J$=Je(),{replicateOperation:Zs}=(fs(),D(Sa)),{packageDirectory:Tde}=(z$(),D(W$)),j$=Th(),Ade=Ie.join(hde,"application-template"),Rde=zt.get(at.CONFIG_PARAMS.ROOTPATH),va=Ie.join(Rde,"ssh"),Oo=Ie.join(va,"known_hosts");function yde(){Bt.trace("getting custom api status");let e={};try{e={port:zt.get(at.CONFIG_PARAMS.HTTP_PORT),directory:zt.get(at.CONFIG_PARAMS.COMPONENTSROOT),is_enabled:!0}}catch(t){throw Ht(new Error,_l.FUNCTION_STATUS,kt.INTERNAL_SERVER_ERROR,Bt.ERR,t)}return e}a(yde,"customFunctionsStatus");function bde(){Bt.trace("getting custom api endpoints");let e={},t=zt.get(at.CONFIG_PARAMS.COMPONENTSROOT);try{hw.sync(mw(`${t}/*`),{onlyDirectories:!0}).forEach(n=>{let s=n.split("/").pop();e[s]={routes:hw.sync(mw(`${n}/routes/*.js`)).map(i=>i.split("/").pop().split(".js")[0]),helpers:hw.sync(mw(`${n}/helpers/*.js`)).map(i=>i.split("/").pop().split(".js")[0])}})}catch(r){throw Ht(new Error,_l.GET_FUNCTIONS,kt.INTERNAL_SERVER_ERROR,Bt.ERR,r)}return e}a(bde,"getCustomFunctions");function Ode(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 Ht(t,t.message,kt.BAD_REQUEST);Bt.trace("getting custom api endpoint file content");let r=zt.get(at.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 Ht(new Error,_l.GET_FUNCTION,kt.INTERNAL_SERVER_ERROR,Bt.ERR,c)}}a(Ode,"getCustomFunction");async function Nde(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 Ht(t,t.message,kt.BAD_REQUEST);Bt.trace("setting custom function file content");let r=zt.get(at.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 Zs(e);return c.message=`Successfully updated custom function: ${i}.js`,c}catch(c){throw Ht(new Error,_l.SET_FUNCTION,kt.INTERNAL_SERVER_ERROR,Bt.ERR,c)}}a(Nde,"setCustomFunction");async function wde(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 Ht(t,t.message,kt.BAD_REQUEST);Bt.trace("dropping custom function file");let r=zt.get(at.CONFIG_PARAMS.COMPONENTSROOT),{project:n,type:s,file:i}=e;try{be.unlinkSync(Ie.join(r,n,s,i+".js"));let o=await Zs(e);return o.message=`Successfully deleted custom function: ${i}.js`,o}catch(o){throw Ht(new Error,_l.DROP_FUNCTION,kt.INTERNAL_SERVER_ERROR,Bt.ERR,o)}}a(wde,"dropCustomFunction");async function Ide(e){e.project&&(e.project=Ie.parse(e.project).name);let t=On.addComponentValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);Bt.trace("adding component");let r=zt.get(at.CONFIG_PARAMS.COMPONENTSROOT),{project:n}=e;try{let s=Ie.join(r,n);be.mkdirSync(s,{recursive:!0}),be.copySync(Ade,s);let i=await Zs(e);return i.message=`Successfully added project: ${n}`,i}catch(s){throw Ht(new Error,_l.ADD_FUNCTION,kt.INTERNAL_SERVER_ERROR,Bt.ERR,s)}}a(Ide,"addComponent");async function Cde(e){e.project&&(e.project=Ie.parse(e.project).name);let t=On.dropCustomFunctionProjectValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);Bt.trace("dropping custom function project");let r=zt.get(at.CONFIG_PARAMS.COMPONENTSROOT),{project:n}=e,s=zt.get(at.CONFIG_PARAMS.APPS);if(!_de.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 cS.updateConfigValue(at.CONFIG_PARAMS.APPS,s),`Successfully deleted project: ${n}`}try{let i=Ie.join(r,n);be.rmSync(i,{recursive:!0});let o=await Zs(e);return o.message=`Successfully deleted project: ${n}`,o}catch(i){throw Ht(new Error,_l.DROP_FUNCTION_PROJECT,kt.INTERNAL_SERVER_ERROR,Bt.ERR,i)}}a(Cde,"dropCustomFunctionProject");async function Pde(e){e.project&&(e.project=Ie.parse(e.project).name);let t=On.packageComponentValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);let r=zt.get(at.CONFIG_PARAMS.COMPONENTSROOT),{project:n}=e;Bt.trace("packaging component",n);let s;try{s=await be.realpath(Ie.join(r,n))}catch(o){if(o.code!==at.NODE_ERROR_CODES.ENOENT)throw o;try{s=await be.realpath(Ie.join(zt.get(at.CONFIG_PARAMS.ROOTPATH),"node_modules",n))}catch(c){if(c.code===at.NODE_ERROR_CODES.ENOENT)throw new Error(`Unable to locate project '${n}'`)}}let i=(await Tde(s,e)).toString("base64");return{project:n,payload:i}}a(Pde,"packageComponent");async function Dde(e){e.project?e.project=Ie.parse(e.project).name:e.package&&(e.project=Lde(e.package));let t=On.deployComponentValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);let r=zt.get(at.CONFIG_PARAMS.COMPONENTSROOT),{project:n,payload:s,package:i,install_command:o}=e;if(Bt.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=gde.from(s instanceof Buffer?s:Buffer.from(s,"base64"));await new Promise((E,T)=>{S.pipe(fde()).pipe(dde.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 A=Ie.join(c,"node_modules");o?await j$.runCommand(o,c):be.existsSync(A)||await j$.installAllRootModules(!1,c)}else{await cS.addConfig(n,{package:i}),await Ede();let S=Q$.get(at.CONFIG_PARAMS.ROOTPATH);c=Ie.join(S,"node_modules",n)}if(Sde)return;let l=new Map;l.isWorker=!0;let u=(bh(),D(yh)),f;u.setErrorReporter(S=>f=S);let d=pde(c),_=u.component_errors.get(d);try{await u.loadComponent(c,l)}finally{u.component_errors.set(d,_)}if(f)throw f;Bt.info("Installed component");let h=e.restart==="rolling";e.restart=h?!1:e.restart;let m=await Zs(e);if(e.restart===!0)J$.restartWorkers("http"),m.message=`Successfully deployed: ${n}, restarting HarperDB`;else if(h){let g=await Ew().executeJob({operation:"restart_service",service:"http",replicated:!0});m.restartJobId=g.job_id,m.message=`Successfully deployed: ${n}, restarting HarperDB`}else m.message=`Successfully deployed: ${n}`;return m}a(Dde,"deployComponent");function Lde(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(Lde,"getProjectNameFromPackage");async function Mde(){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 Bt.warn("Error loading package",o),{error:o.toString(),entries:[]}}},"walkDir"),t=await e(zt.get(at.CONFIG_PARAMS.COMPONENTSROOT),{name:zt.get(at.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(Mde,"getComponents");async function vde(e){let t=On.getComponentFileValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);let n=cS.getConfigObj()[e.project]||e.project==="harperdb"?Ie.join(Q$.get(at.CONFIG_PARAMS.ROOTPATH),"node_modules"):zt.get(at.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===at.NODE_ERROR_CODES.ENOENT?new Error(`Component file not found '${Ie.join(e.project,e.file)}'`):i}}a(vde,"getComponentFile");async function Ude(e){let t=On.setComponentFileValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);let r=e.encoding?{encoding:e.encoding}:{encoding:"utf8"},n=Ie.join(zt.get(at.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 Zs(e);return s.message="Successfully set component: "+e.file,s}a(Ude,"setComponentFile");async function xde(e){let t=On.dropComponentFileValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);let{project:r,file:n}=e,s=e.file?Ie.join(r,n):r,i=Ie.join(zt.get(at.CONFIG_PARAMS.COMPONENTSROOT),s),o=Ie.join(zt.get(at.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(zt.get(at.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")}cS.deleteConfigFromFile([r]);let l=await Zs(e);return e.restart===!0?(J$.restartWorkers("http"),l.message=`Successfully dropped: ${s}, restarting HarperDB`):l.message=`Successfully dropped: ${s}`,l}a(xde,"dropComponent");async function Bde(e){let t=On.addSSHKeyValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);let{name:r,key:n,host:s,hostname:i,known_hosts:o}=e;Bt.trace("adding ssh key",r);let c=Ie.join(va,r+".key"),l=Ie.join(va,"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}