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
package/README.md CHANGED
@@ -66,4 +66,4 @@ harperdb
66
66
  Harper will prompt you for configuration options during install, and then automatically start after install.
67
67
 
68
68
  ---
69
- 68286c0097e9b25c53cc82002b940628d92141d5
69
+ 0cb5dbf3500f59efb0c7c7e2ecb27c9103a89031
package/bin/harperdb.js CHANGED
@@ -25,7 +25,7 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
25
25
  `)}catch(r){r.code==="ENOENT"?tn.debug("no license file found"):tn.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(qle.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=t$(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){tn.error("There was an error parsing the license string."),tn.error(s),e.ram_allocation=Nl.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return gw=e,e}a(Rw,"licenseSearch");async function Zle(){return gw||await Rw(),gw}a(Zle,"getLicense");function eue(){let e=Rw().ram_allocation,t=process.constrainedMemory?.()||Qq();if(t=Math.round(Math.min(t,Qq())/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(eue,"checkMemoryLimit")});var TS=P((WLe,o$)=>{var SS=Od(),n$=require("chalk"),ns=W(),s$=require("prompt"),{promisify:tue}=require("util"),yw=(H(),D($)),rue=require("fs-extra"),nue=require("path"),sue=oe(),{packageJson:iue}=nt(),i$=le();i$.initSync();var oue=require("moment"),aue=tue(s$.get),cue=nue.join(i$.getHdbBasePath(),yw.LICENSE_KEY_DIR_NAME,yw.LICENSE_FILE_NAME,yw.LICENSE_FILE_NAME);o$.exports={getFingerprint:uue,setLicense:lue,parseLicense:bw,register:due,getRegistrationInfo:_ue};async function lue(e){if(e&&e.key&&e.company){try{ns.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await bw(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw ns.error(r),ns.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(lue,"setLicense");async function uue(){let e={};try{e=await SS.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw ns.error(r),ns.error(t),new Error(r)}return e}a(uue,"getFingerprint");async function bw(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");ns.info("Validating license input...");let r=SS.validateLicense(e,t);if(ns.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(ns.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(ns.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{ns.info("writing license to disk"),await rue.writeFile(cue,JSON.stringify({license_key:e,company:t}))}catch(n){throw ns.error("Failed to write License"),n}return"Registration successful."}a(bw,"parseLicense");async function due(){let e=await fue();return bw(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(due,"register");async function fue(){let e=await SS.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:n$.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:n$.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{s$.start()}catch(n){ns.error(n)}let r;try{r=await aue(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(fue,"promptForRegistration");async function _ue(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await SS.getLicense()}catch(r){throw ns.error(`There was an error when searching licenses due to: ${r.message}`),r}if(sue.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=iue.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=oue.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(_ue,"getRegistrationInfo")});var c$=P((jLe,a$)=>{"use strict";var pue=St(),Ow=class{static{a(this,"HubConfigObject")}constructor(t,r,n,s,i,o,c,l,u,f,d,_,p,h){this.port=t,o===null&&(o=void 0),this.server_name=r+pue.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:p},HDB:{users:h}},this.system_account="SYS"}};a$.exports=Ow});var d$=P((QLe,u$)=>{"use strict";var l$=St(),Nw=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+l$.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+l$.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"}};u$.exports=Nw});var _$=P((ZLe,f$)=>{"use strict";var ww=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};f$.exports=ww});var h$=P((tMe,p$)=>{"use strict";var hue=St(),Iw=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+hue.SERVER_SUFFIX.ADMIN,this.password=r}};p$.exports=Iw});var bS=P((nMe,g$)=>{"use strict";var wl=require("path"),Il=require("fs-extra"),mue=c$(),Eue=d$(),gue=_$(),Sue=h$(),Cw=On(),wd=oe(),Pn=At(),RS=(H(),D($)),Lp=St(),{CONFIG_PARAMS:zt}=RS,Id=W(),Mp=le(),m$=To(),Pw=sr(),Tue=ts(),Nd="clustering",Aue=1e4,E$=50;g$.exports={generateNatsConfig:yue,removeNatsConfig:bue,getHubConfigPath:Rue};function Rue(){let e=Mp.get(zt.ROOTPATH);return wl.join(e,Nd,Lp.NATS_CONFIG_FILES.HUB_SERVER)}a(Rue,"getHubConfigPath");async function yue(e=!1,t=void 0){let r=Mp.get(zt.ROOTPATH);Il.ensureDirSync(wl.join(r,"clustering","leaf")),Mp.initSync();let n=Pn.getConfigFromFile(zt.CLUSTERING_TLS_CERT_AUTH),s=Pn.getConfigFromFile(zt.CLUSTERING_TLS_PRIVATEKEY),i=Pn.getConfigFromFile(zt.CLUSTERING_TLS_CERTIFICATE);!await Il.exists(i)&&!await Il.exists(!n)&&await Tue.createNatsCerts();let o=wl.join(r,Nd,Lp.PID_FILES.HUB),c=wl.join(r,Nd,Lp.PID_FILES.LEAF),l=Pn.getConfigFromFile(zt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=wl.join(r,Nd,Lp.NATS_CONFIG_FILES.HUB_SERVER),f=wl.join(r,Nd,Lp.NATS_CONFIG_FILES.LEAF_SERVER),d=Pn.getConfigFromFile(zt.CLUSTERING_TLS_INSECURE),_=Pn.getConfigFromFile(zt.CLUSTERING_TLS_VERIFY),p=Pn.getConfigFromFile(zt.CLUSTERING_NODENAME),h=Pn.getConfigFromFile(zt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await Pw.checkNATSServerInstalled()||yS("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await Cw.listUsers(),g=Pn.getConfigFromFile(zt.CLUSTERING_USER),R=await Cw.getClusterUser();(wd.isEmpty(R)||R.active!==!0)&&yS(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await AS(zt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await AS(zt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await AS(zt.CLUSTERING_HUBSERVER_NETWORK_PORT),await AS(zt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[ie,z]of S.entries())z.role?.role===RS.ROLE_TYPES_ENUM.CLUSTER_USER&&z.active&&(E.push(new Sue(z.username,m$.decrypt(z.hash))),T.push(new gue(z.username,m$.decrypt(z.hash))));let N=[],{hub_routes:v}=Pn.getClusteringRoutes();if(!wd.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 mue(Pn.getConfigFromFile(zt.CLUSTERING_HUBSERVER_NETWORK_PORT),p,o,i,s,n,d,_,h,Pn.getConfigFromFile(zt.CLUSTERING_HUBSERVER_CLUSTER_NAME),Pn.getConfigFromFile(zt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete k.tls.ca_file,delete k.leafnodes.tls.ca_file),t=wd.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===RS.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Il.writeJson(u,k),Id.trace(`Hub server config written to ${u}`));let G=`tls://${R.sys_name_encoded}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,Y=`tls://${R.uri_encoded_name}:${R.uri_encoded_d_hash}@0.0.0.0:${h}`,X=new Eue(Pn.getConfigFromFile(zt.CLUSTERING_LEAFSERVER_NETWORK_PORT),p,c,l,[G],[Y],E,T,i,s,n,d);n==null&&delete X.tls.ca_file,(t===void 0||t===RS.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Il.writeJson(f,X),Id.trace(`Leaf server config written to ${f}`))}a(yue,"generateNatsConfig");async function AS(e){let t=Mp.get(e);return wd.isEmpty(t)&&yS(`port undefined for '${e}'`),await wd.isPortTaken(t)&&yS(`'${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(AS,"isPortAvailable");function yS(e){let t=`Error generating clustering config: ${e}`;Id.error(t),console.error(t),process.exit(1)}a(yS,"generateNatsConfigError");async function bue(e){let{port:t,config_file:r}=Pw.getServerConfig(e),{username:n,decrypt_hash:s}=await Cw.getClusterUser(),i=0,o=2e3;for(;i<E$;){try{let f=await Pw.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>=E$)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 wd.async_set_timeout(u)}let c="0".repeat(Aue),l=wl.join(Mp.get(zt.ROOTPATH),Nd,r);await Il.writeFile(l,c),await Il.remove(l),Id.notify(e,"started.")}a(bue,"removeNatsConfig")});var b$=P((iMe,y$)=>{"use strict";var ss=le(),Oue=Od(),Ge=(H(),D($)),vp=St(),Bo=require("path"),{PACKAGE_ROOT:NS}=nt(),S$=le(),OS=oe(),Cd="/dev/null",Nue=Bo.join(NS,"launchServiceScripts"),T$=Bo.join(NS,"utility/scripts"),wue=Bo.join(T$,Ge.HDB_RESTART_SCRIPT),A$=Bo.resolve(NS,"dependencies",`${process.platform}-${process.arch}`,vp.NATS_BINARY_NAME);function R$(){let t=Oue.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 OS.noBootFile()&&(n[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=OS.getEnvCliRootPath()),{name:Ge.PROCESS_DESCRIPTORS.HDB,script:Ge.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:NS}}a(R$,"generateMainServerConfig");var Iue=9930;function Cue(){ss.initSync(!0);let e=ss.get(Ge.CONFIG_PARAMS.ROOTPATH),t=Bo.join(e,"clustering",vp.NATS_CONFIG_FILES.HUB_SERVER),r=Bo.join(ss.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=S$.get(Ge.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=vp.LOG_LEVEL_FLAGS[ss.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==Iue?"-"+n:""),script:A$,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 ss.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Cd,i.error_file=Cd),i}a(Cue,"generateNatsHubServerConfig");var Pue=9940;function Due(){ss.initSync(!0);let e=ss.get(Ge.CONFIG_PARAMS.ROOTPATH),t=Bo.join(e,"clustering",vp.NATS_CONFIG_FILES.LEAF_SERVER),r=Bo.join(ss.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=S$.get(Ge.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=vp.LOG_LEVEL_FLAGS[ss.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Pue?"-"+n:""),script:A$,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 ss.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Cd,i.error_file=Cd),i}a(Due,"generateNatsLeafServerConfig");function Lue(){ss.initSync();let e=Bo.join(ss.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:Nue,autorestart:!1};return ss.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=Cd,t.error_file=Cd),t}a(Lue,"generateClusteringUpgradeV4ServiceConfig");function Mue(){let e={[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.RESTART_HDB};return OS.noBootFile()&&(e[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=OS.getEnvCliRootPath()),{...{name:Ge.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:T$},script:wue}}a(Mue,"generateRestart");function vue(){return{apps:[R$()]}}a(vue,"generateAllServiceConfigs");y$.exports={generateAllServiceConfigs:vue,generateMainServerConfig:R$,generateRestart:Mue,generateNatsHubServerConfig:Cue,generateNatsLeafServerConfig:Due,generateClusteringUpgradeV4ServiceConfig:Lue}});var Pd=P((cMe,H$)=>{"use strict";var et=(H(),D($)),Uue=oe(),ko=bS(),wS=sr(),Ho=St(),Ya=b$(),IS=le(),Cl=W(),xue=vo(),{startWorker:O$,onMessageFromWorkers:Bue}=tt(),Hue=Mo(),aMe=require("util"),kue=require("child_process"),Fue=require("fs"),{execFile:Gue}=kue,Ye;H$.exports={enterPM2Mode:que,start:Wa,stop:Dw,reload:w$,restart:I$,list:Lw,describe:D$,connect:Fo,kill:Wue,startAllServices:zue,startService:Mw,getUniqueServicesList:L$,restartAllServices:jue,isServiceRegistered:M$,reloadStopStart:v$,restartHdb:P$,deleteProcess:Kue,startClusteringProcesses:x$,startClusteringThreads:B$,isHdbRestartRunning:Yue,isClusteringRunning:Que,stopClustering:Jue,reloadClustering:Xue,expectedRestartOfChildren:C$};var Up=!1;Bue(e=>{e.type==="restart"&&IS.initSync(!0)});function que(){Up=!0}a(que,"enterPM2Mode");function Fo(){return Ye||(Ye=require("pm2")),new Promise((e,t)=>{Ye.connect((r,n)=>{r&&t(r),e(n)})})}a(Fo,"connect");var rn,$ue=10,N$;function Wa(e,t=!1){if(Up)return Vue(e);let r=Gue(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=rn.indexOf(r);o>-1&&rn.splice(o,1),!N$&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<$ue&&(Fue.existsSync(ko.getHubConfigPath())?Wa(e):(await ko.generateNatsConfig(!0),Wa(e),await new Promise(c=>setTimeout(c,3e3)),await ko.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await ko.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=IS.get(et.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&Ho.LOG_LEVEL_HIERARCHY[o]>=Ho.LOG_LEVEL_HIERARCHY[f||"info"]){let p=f===Ho.LOG_LEVELS.ERR||f===Ho.LOG_LEVELS.WRN?Cl.OUTPUTS.STDERR:Cl.OUTPUTS.STDOUT;Cl.logCustomLevel(f||"info",p,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=Ho.LOG_LEVELS[_]}if(Ho.LOG_LEVEL_HIERARCHY[o]>=Ho.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===Ho.LOG_LEVELS.ERR||f===Ho.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(),!rn&&(rn=[],!t)){let i=a(()=>{N$=!0,rn&&(rn.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)}rn.push(r)}a(Wa,"start");function Vue(e){return new Promise(async(t,r)=>{try{await Fo()}catch(n){r(n)}Ye.start(e,(n,s)=>{n&&(Ye.disconnect(),r(n)),Ye.disconnect(),t(s)})})}a(Vue,"startWithPM2");function Dw(e){if(!Up){for(let t of rn||[])t.name===e&&(rn.splice(rn.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Fo()}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(Dw,"stop");function w$(e){return new Promise(async(t,r)=>{try{await Fo()}catch(n){r(n)}Ye.reload(e,(n,s)=>{n&&(Ye.disconnect(),r(n)),Ye.disconnect(),t(s)})})}a(w$,"reload");function I$(e){if(!Up){C$();for(let t of rn||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Fo()}catch(n){r(n)}Ye.restart(e,(n,s)=>{Ye.disconnect(),t(s)})})}a(I$,"restart");function C$(){for(let e of rn||[])e.config&&(e.config.restarts=0)}a(C$,"expectedRestartOfChildren");function Kue(e){return new Promise(async(t,r)=>{try{await Fo()}catch(n){r(n)}Ye.delete(e,(n,s)=>{n&&(Ye.disconnect(),r(n)),Ye.disconnect(),t(s)})})}a(Kue,"deleteProcess");async function P$(){await Wa(Ya.generateRestart())}a(P$,"restartHdb");async function Yue(){let e=await Lw();for(let t in e)if(e[t].name===et.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(Yue,"isHdbRestartRunning");function Lw(){return new Promise(async(e,t)=>{try{await Fo()}catch(r){t(r)}Ye.list((r,n)=>{r&&(Ye.disconnect(),t(r)),Ye.disconnect(),e(n)})})}a(Lw,"list");function D$(e){return new Promise(async(t,r)=>{try{await Fo()}catch(n){r(n)}Ye.describe(e,(n,s)=>{n&&(Ye.disconnect(),r(n)),Ye.disconnect(),t(s)})})}a(D$,"describe");function Wue(){if(!Up){for(let e of rn||[])e.kill();rn=[];return}return new Promise(async(e,t)=>{try{await Fo()}catch(r){t(r)}Ye.killDaemon((r,n)=>{r&&(Ye.disconnect(),t(r)),Ye.disconnect(),e(n)})})}a(Wue,"kill");async function zue(){try{await x$(),await B$(),await Wa(Ya.generateAllServiceConfigs())}catch(e){throw Ye?.disconnect(),e}}a(zue,"startAllServices");async function Mw(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case et.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Ya.generateMainServerConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Ya.generateNatsIngestServiceConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Ya.generateNatsReplyServiceConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Ya.generateNatsHubServerConfig(),await Wa(r,t),await ko.removeNatsConfig(e);return;case et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Ya.generateNatsLeafServerConfig(),await Wa(r,t),await ko.removeNatsConfig(e);return;case et.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Ya.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await Wa(r)}catch(r){throw Ye?.disconnect(),r}}a(Mw,"startService");async function L$(){try{let e=await Lw(),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(L$,"getUniqueServicesList");async function jue(e=[]){try{let t=!1,r=await L$();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 I$(o))}t&&await v$(et.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Ye?.disconnect(),t}}a(jue,"restartAllServices");async function M$(e){if(rn?.find(r=>r.name===e))return!0;let t=await Hue.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(M$,"isServiceRegistered");async function v$(e){let t=IS.get(et.CONFIG_PARAMS.THREADS_COUNT)??IS.get(et.CONFIG_PARAMS.THREADS),r=await D$(e),n=Uue.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await Dw(e),await Mw(e)):e===et.PROCESS_DESCRIPTORS.HDB?await P$():await w$(e)}a(v$,"reloadStopStart");var U$;async function x$(e=!1){for(let t in et.CLUSTERING_PROCESSES){let r=et.CLUSTERING_PROCESSES[t];await Mw(r,e)}}a(x$,"startClusteringProcesses");async function B$(){U$=O$(et.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:et.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await wS.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await wS.updateLocalStreams();let e=await xue.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===et.PRE_4_0_0_VERSION){Cl.info("Starting clustering upgrade 4.0.0 process"),O$(et.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(B$,"startClusteringThreads");async function Jue(){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 U$.terminate();else{let t=et.CLUSTERING_PROCESSES[e];await Dw(t)}}a(Jue,"stopClustering");async function Que(){for(let e in et.CLUSTERING_PROCESSES){let t=et.CLUSTERING_PROCESSES[e];if(await M$(t)===!1)return!1}return!0}a(Que,"isClusteringRunning");async function Xue(){await ko.generateNatsConfig(!0),await wS.reloadNATSHub(),await wS.reloadNATSLeaf(),await ko.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await ko.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(Xue,"reloadClustering")});var DS={};Ue(DS,{compactOnStart:()=>Zue,copyDb:()=>V$});async function Zue(){za.notify("Running compact on start"),console.log("Running compact on start");let e=(0,vw.get)(U.ROOTPATH),t=new Map,r=Xe();(0,Uw.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,CS.join)(e,"backup",n+".mdb"),o=(0,CS.join)(e,Oc,n+"-copy.mdb"),c=0;try{c=await k$(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){za.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 V$(n,o),console.log("Backing up",n,"to",i),await(0,Pl.move)(s,i,{overwrite:!0})}try{Dd()}catch(n){za.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,Pl.move)(i,s,{overwrite:!0}),await(0,Pl.remove)((0,CS.join)(e,Oc,`${n}-copy.mdb-lock`));try{Dd()}catch(n){za.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){za.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,Uw.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,Pl.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw Dd(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await k$(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}.
26
26
  Total record count before compaction: ${i}, total after: ${c}.
27
27
  Database backup has not been removed and can be found here: ${s}`;za.error(l),console.error(l)}(0,vw.get)(U.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||o===!1||(console.log("Removing backup",s),await(0,Pl.remove)(s))}}async function k$(e){let t=await(0,$$.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}async function V$(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,F$.open)(new G$.default(t)),c=o.openDB(PS.INTERNAL_DBIS_NAME),l,u=0,f=s.useReadTransaction();try{for(let{key:_,value:p}of s.getRange({transaction:f})){let h=p.is_hash_attribute||p.isPrimaryKey,S,g;if(h&&(S=p.compression,g=MS(),g?p.compression=g:delete p.compression,S?.dictionary?.toString()===g?.dictionary?.toString()&&(S=null,g=null)),c.put(_,p),!(h||p.indexed))continue;let R=new q$.default(!h,h);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,h,f)}if(i){let _=n.openDB(PS.AUDIT_STORE_NAME,xp);console.log("copying audit log for",e,"to",t),d(i,_,!1,f)}async function d(_,p,h,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=p.put(N,v,h?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 F$,CS,Pl,vw,G$,q$,PS,$$,Uw,za,LS=ye(()=>{De();F$=require("lmdb"),CS=require("path"),Pl=require("fs-extra"),vw=M(le()),G$=M(s_()),q$=M(n_()),PS=M(xt());H();ho();$$=M(Ao()),Uw=M(At()),za=M(W());a(Zue,"compactOnStart");a(k$,"getTotalDBRecordCount");a(V$,"copyDb")});var ja=P((EMe,Q$)=>{"use strict";var ede=require("minimist"),{isMainThread:Bw,parentPort:Hp,threadId:pMe}=require("worker_threads"),it=(H(),D($)),Vi=W(),Hw=oe(),US=bS(),vS=sr(),hMe=St(),z$=At(),di=Pd(),K$=Mo(),{compactOnStart:tde}=(LS(),D(DS)),rde=ua(),{restartWorkers:xS,onMessageByType:nde}=tt(),{handleHDBError:sde,hdb_errors:ide}=he(),{HTTP_STATUS_CODES:ode}=ide,kp=le(),{sendOperationToNode:Y$,getThisNodeName:ade,monitorNodeCAs:cde}=(es(),D(Po)),{getHDBNodeTable:mMe}=(_l(),D(eN));kp.initSync();var Bp=`Restarting HarperDB. This may take up to ${it.RESTART_TIMEOUT_MS/1e3} seconds.`,lde="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",W$="Clustering is not enabled so cannot be restarted",ude="Invalid service",Ld,Cs;Q$.exports={restart:j$,restartService:kw};Bw&&nde(it.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await kw({service:e.workerType}):j$({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function j$(e){Cs=Object.keys(e).length===0,Ld=await di.isServiceRegistered(it.PROCESS_DESCRIPTORS.HDB);let t=ede(process.argv);if(t.service){await kw(t);return}if(Cs&&!Ld){console.error(lde);return}if(Cs&&console.log(Bp),Ld){di.enterPM2Mode(),Vi.notify(Bp);let r=rde(Object.keys(it.CONFIG_PARAM_MAP),!0);return Hw.isEmptyOrZeroLength(Object.keys(r))||z$.updateConfigValue(void 0,void 0,r,!0,!0),dde(),Bp}return Bw?(Vi.notify(Bp),kp.get(it.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await tde(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{xS()},50)):Hp.postMessage({type:it.ITC_EVENT_TYPES.RESTART}),Bp}a(j$,"restart");async function kw(e){let{service:t}=e;if(it.HDB_PROCESS_SERVICES[t]===void 0)throw sde(new Error,ude,ode.BAD_REQUEST,void 0,void 0,!0);if(di.expectedRestartOfChildren(),Ld=await di.isServiceRegistered(it.PROCESS_DESCRIPTORS.HDB),!Bw){e.replicated&&cde(),Hp.postMessage({type:it.ITC_EVENT_TYPES.RESTART,workerType:t}),Hp.ref(),await new Promise(s=>{Hp.on("message",i=>{i.type==="restart-complete"&&(s(),Hp.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===ade())continue;let i;try{({job_id:i}=await Y$(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 p=new Error("Timed out waiting for restart job to complete");p.replicated=n,c(p)}let _=(await Y$(s,{operation:"get_job",id:i})).results[0];if(_.status==="COMPLETE"&&(clearInterval(f),o({node:s.name,message:_.message})),_.status==="ERROR"){clearInterval(f);let p=new Error(_.message);p.replicated=n,c(p)}},250)}))}return{replicated:n}}return}let r;switch(t){case it.HDB_PROCESS_SERVICES.clustering:if(!kp.get(it.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=W$;break}Cs&&console.log("Restarting clustering"),Vi.notify("Restarting clustering"),await J$();break;case it.HDB_PROCESS_SERVICES.clustering_config:case it.HDB_PROCESS_SERVICES["clustering config"]:if(!kp.get(it.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=W$;break}Cs&&console.log("Restarting clustering_config"),Vi.notify("Restarting clustering_config"),await di.reloadClustering();break;case"custom_functions":case"custom functions":case it.HDB_PROCESS_SERVICES.harperdb:case it.HDB_PROCESS_SERVICES.http_workers:case it.HDB_PROCESS_SERVICES.http:if(Cs&&!Ld){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}Cs&&console.log("Restarting http_workers"),Vi.notify("Restarting http_workers"),Cs?await di.restart(it.PROCESS_DESCRIPTORS.HDB):await xS("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Vi.error(r),Cs&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(kw,"restartService");async function dde(){await J$(),await di.restart(it.PROCESS_DESCRIPTORS.HDB),await Hw.async_set_timeout(2e3),kp.get(it.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await xw(),Cs&&(await vS.closeConnection(),process.exit(0))}a(dde,"restartPM2Mode");async function J$(){if(!z$.getConfigFromFile(it.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await K$.getHDBProcessInfo()).clustering.length===0)Vi.trace("Clustering not running, restart will start clustering services"),await US.generateNatsConfig(!0),await di.startClusteringProcesses(),await di.startClusteringThreads(),await xw(),Cs&&await vS.closeConnection();else{await US.generateNatsConfig(!0),Ld?(Vi.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await di.restart(it.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await di.restart(it.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await K$.getHDBProcessInfo()).clustering.forEach(s=>{Vi.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await Hw.async_set_timeout(3e3),await xw(),await vS.updateLocalStreams(),Cs&&await vS.closeConnection(),Vi.trace("Restart clustering restarting ingest and reply service threads");let t=xS(it.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=xS(it.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a(J$,"restartClustering");async function xw(){await US.removeNatsConfig(it.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await US.removeNatsConfig(it.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(xw,"removeNatsConfig")});var cV=P((TMe,aV)=>{"use strict";var SMe=require("lodash"),Dn=(H(),D($)),{handleHDBError:X$,hdb_errors:fde}=he(),{HDB_ERROR_MSGS:_de,HTTP_STATUS_CODES:pde}=fde,Fw=W();aV.exports={getRolePermissions:mde};var Dl=Object.create(null),hde=a(e=>({key:e,perms:{}}),"perms_template_obj"),rV=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),nV=a((e=!1,t=!1,r=!1,n=!1)=>({[Dn.PERMS_CRUD_ENUM.READ]:e,[Dn.PERMS_CRUD_ENUM.INSERT]:t,[Dn.PERMS_CRUD_ENUM.UPDATE]:r,[Dn.PERMS_CRUD_ENUM.DELETE]:n}),"permissions_template"),Gw=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...nV(t,r,n,s)}),"table_perms_template"),Z$=a((e,t=nV())=>({attribute_name:e,describe:oV(t),[Fp]:t[Fp],[qw]:t[qw],[$w]:t[$w]}),"attr_perms_template"),eV=a((e,t=!1)=>({attribute_name:e,describe:t,[Fp]:t}),"timestamp_attr_perms_template"),{READ:Fp,INSERT:qw,UPDATE:$w}=Dn.PERMS_CRUD_ENUM,sV=Object.values(Dn.PERMS_CRUD_ENUM),iV=[Fp,qw,$w];function mde(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[Dn.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(Dl[t]&&Dl[t].key===n)return Dl[t].perms;let s=Ede(e,r);return Dl[t]?Dl[t].key=n:Dl[t]=hde(n),Dl[t].perms=s,s}catch(r){if(!e[Dn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[Dn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<Dn.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 Fw.error(n),Fw.debug(r),X$(new Error,_de.OUTDATED_PERMS_TRANSLATION_ERROR,pde.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
28
- ${r.stack}`;throw Fw.error(n),X$(new Error)}}}a(mde,"getRolePermissions");function Ede(e,t){let r=Object.create(null);r.super_user=!1;let n=e.permission;r[Dn.SYSTEM_SCHEMA_NAME]=n[Dn.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]=gde(t[i]);return}r[i]=rV(),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=Sde(c,l);r[i].describe||sV.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=Gw()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=Gw()})}),r}a(Ede,"translateRolePermissions");function gde(e){let t=rV(!0);return Object.keys(e).forEach(r=>{t.tables[r]=Gw(!0,!0,!0,!0,!0)}),t}a(gde,"createStructureUserPermissions");function Sde(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 Dn.TIME_STAMP_NAMES.includes(d)&&(_=eV(d,f[Fp])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=Z$(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=oV(f),s.attribute_permissions.push(f),c||Tde(f,l)}else if(u!==o){let f;Dn.TIME_STAMP_NAMES.includes(u)?f=eV(u):f=Z$(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=tV(s),s}else return e.describe=tV(e),e}a(Sde,"getTableAttrPerms");function tV(e){return sV.filter(t=>e[t]).length>0}a(tV,"getSchemaTableDescribePerm");function oV(e){return iV.filter(t=>e[t]).length>0}a(oV,"getAttributeDescribePerm");function Tde(e,t){iV.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(Tde,"checkForHashPerms")});var Gp={};Ue(Gp,{authentication:()=>hV,bypassAuth:()=>Ide,login:()=>Pde,logout:()=>Dde,start:()=>Cde});function Ide(){pV=!0}async function hV(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let p=e.isOperationsServer?bde?yde:[]:Rde?Ade:[];if(p.includes(i)||p.includes("*")){if(e.method==="OPTIONS"){let h=nn.get(U.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",S=new No([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",h],["Access-Control-Allow-Origin",i]]);return BS&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),BS&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(BS){i||(i=r.host);let p=(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session=",h=s?.split(/;\s+/)||[];for(let S of h)if(S.startsWith(p)){let g=S.indexOf(";");l=S.slice(p.length,g===-1?S.length:g),u=await lV.get(l);break}e.session=u||(u={})}let f=a((p,h,S)=>{let g=new Md.AuthAuditLog(p,h,la.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),h===Ws.SUCCESS?Vw.notify(g):Vw.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&Vw.error("Authorization error:",e._nodeRequest.socket.authorizationError),e.mtlsConfig&&e.authorized&&e.peerCertificate.subject){let p=e.mtlsConfig.user;p!==null?((p===void 0||p==="Common Name"||p==="CN")&&(p=e.peerCertificate.subject.CN),e.user=await ze.getUser(p,null,e),f(p,Ws.SUCCESS,"mTLS")):(0,Md.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let d;if(!e.user)if(n){if(d=Ll.get(n),!d){let p=n.indexOf(" "),h=n.slice(0,p),S=n.slice(p+1),g,R;try{switch(h){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 DO(S)}catch(N){if(N.message==="invalid token")try{return await _g(S),c({status:-1})}catch{throw N}}break}}catch(E){return Nde&&(Ll.get(S)||(Ll.set(S,S),f(g,Ws.FAILURE,h))),c({status:401,body:Aa({error:E.message},e)})}Ll.set(n,d),Ode&&f(d.username,Ws.SUCCESS,h)}e.user=d}else u?.user?e.user=await ze.getUser(u.user,null,e):(pV&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,dV.getSuperUser)());BS&&(e.session.update=function(p){let h=nn.get(U.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,fV.v4)();let S=nn.get(U.AUTHENTICATION_COOKIE_DOMAINS),g=h?new Date(Date.now()+(0,Kw.convertToMS)(h)).toUTCString():wde,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"))),p.id=l,lV.put(p,{expiresAt:h?Date.now()+(0,Kw.convertToMS)(h):void 0})},e.login=async function(p,h){let S=e.user=await ze.authenticateUser(p,h,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")&&Oi.loginPath?(_.status=302,_.headers.set("Location",Oi.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 No);for(let d=0;d<u;){let _=o[d++];f.set(_,o[d++])}}return o=null,l}a(c,"applyResponseHeaders")}function Cde({server:e,port:t,securePort:r}){e.http(hV,t||r?{port:t,securePort:r}:{port:"all"}),uV||(uV=!0,setInterval(()=>{Ll=new Map},nn.get(U.AUTHENTICATION_CACHETTL)).unref(),_V.user.addListener(()=>{Ll=new Map}))}async function Pde(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 Dde(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var dV,fV,nn,Md,_V,Kw,Vw,Ade,Rde,yde,bde,lV,BS,pV,Ode,Nde,wde,Ll,uV,HS=ye(()=>{dV=M(On());Yr();Tu();Ju();De();fV=require("uuid"),nn=M(le());H();Md=M(W()),_V=M(y_());W_();Kw=M(oe());uo();Vw=(0,Md.loggerWithTag)("auth-event");nn.initSync();Ade=nn.get(U.HTTP_CORSACCESSLIST),Rde=nn.get(U.HTTP_CORS),yde=nn.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),bde=nn.get(U.OPERATIONSAPI_NETWORK_CORS),lV=ut({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),BS=nn.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,pV=process.env.AUTHENTICATION_AUTHORIZELOCAL??nn.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,Ode=nn.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,Nde=nn.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,wde="Tue, 01 Oct 8307 19:33:20 GMT",Ll=new Map;ze.onInvalidatedUser(()=>{Ll=new Map});a(Ide,"bypassAuth");a(hV,"authentication");a(Cde,"start");a(Pde,"login");a(Dde,"logout")});var RV=P((PMe,AV)=>{"use strict";var Ne=require("joi"),mV=require("fs-extra"),EV=require("path"),is=st(),gV=le(),SV=(H(),D($)),TV=W(),{hdb_errors:Lde}=he(),{HDB_ERROR_MSGS:sn}=Lde,Go=/^[a-zA-Z0-9-_]+$/,Mde=/^[a-zA-Z0-9-_]+$/;AV.exports={getDropCustomFunctionValidator:Ude,setCustomFunctionValidator:xde,addComponentValidator:Fde,dropCustomFunctionProjectValidator:Gde,packageComponentValidator:qde,deployComponentValidator:$de,setComponentFileValidator:Bde,getComponentFileValidator:kde,dropComponentFileValidator:Hde,addSSHKeyValidator:Vde,updateSSHKeyValidator:Kde,deleteSSHKeyValidator:Yde,setSSHKnownHostsValidator:Wde};function kS(e,t,r){try{let n=gV.get(SV.CONFIG_PARAMS.COMPONENTSROOT),s=EV.join(n,t);return mV.existsSync(s)?e?t:r.message(sn.PROJECT_EXISTS):e?r.message(sn.NO_PROJECT):t}catch(n){return TV.error(n),r.message(sn.VALIDATION_ERR)}}a(kS,"checkProjectExists");function qp(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(qp,"checkFilePath");function vde(e,t,r,n){try{let s=gV.get(SV.CONFIG_PARAMS.COMPONENTSROOT),i=EV.join(s,e,t,r+".js");return mV.existsSync(i)?r:n.message(sn.NO_FILE)}catch(s){return TV.error(s),n.message(sn.VALIDATION_ERR)}}a(vde,"checkFileExists");function Ude(e){let t=Ne.object({project:Ne.string().pattern(Go).custom(kS.bind(null,!0)).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(Go).custom(vde.bind(null,e.project,e.type)).custom(qp).required().messages({"string.pattern.base":sn.BAD_FILE_NAME})});return is.validateBySchema(e,t)}a(Ude,"getDropCustomFunctionValidator");function xde(e){let t=Ne.object({project:Ne.string().pattern(Go).custom(kS.bind(null,!0)).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(qp).required(),function_content:Ne.string().required()});return is.validateBySchema(e,t)}a(xde,"setCustomFunctionValidator");function Bde(e){let t=Ne.object({project:Ne.string().pattern(Go).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),file:Ne.string().custom(qp).required(),payload:Ne.string().allow("").optional(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return is.validateBySchema(e,t)}a(Bde,"setComponentFileValidator");function Hde(e){let t=Ne.object({project:Ne.string().pattern(Go).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),file:Ne.string().custom(qp).optional()});return is.validateBySchema(e,t)}a(Hde,"dropComponentFileValidator");function kde(e){let t=Ne.object({project:Ne.string().required(),file:Ne.string().custom(qp).required(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return is.validateBySchema(e,t)}a(kde,"getComponentFileValidator");function Fde(e){let t=Ne.object({project:Ne.string().pattern(Go).custom(kS.bind(null,!1)).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME})});return is.validateBySchema(e,t)}a(Fde,"addComponentValidator");function Gde(e){let t=Ne.object({project:Ne.string().pattern(Go).custom(kS.bind(null,!0)).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME})});return is.validateBySchema(e,t)}a(Gde,"dropCustomFunctionProjectValidator");function qde(e){let t=Ne.object({project:Ne.string().pattern(Go).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return is.validateBySchema(e,t)}a(qde,"packageComponentValidator");function $de(e){let t=Ne.object({project:Ne.string().pattern(Go).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),package:Ne.string().optional(),restart:Ne.alternatives().try(Ne.boolean(),Ne.string().valid("rolling")).optional()});return is.validateBySchema(e,t)}a($de,"deployComponentValidator");function Vde(e){let t=Ne.object({name:Ne.string().pattern(Mde).required().messages({"string.pattern.base":sn.BAD_SSH_KEY_NAME}),key:Ne.string().required(),host:Ne.string().required(),hostname:Ne.string().required(),known_hosts:Ne.string().optional()});return is.validateBySchema(e,t)}a(Vde,"addSSHKeyValidator");function Kde(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return is.validateBySchema(e,t)}a(Kde,"updateSSHKeyValidator");function Yde(e){let t=Ne.object({name:Ne.string().required()});return is.validateBySchema(e,t)}a(Yde,"deleteSSHKeyValidator");function Wde(e){let t=Ne.object({known_hosts:Ne.string().required()});return is.validateBySchema(e,t)}a(Wde,"setSSHKnownHostsValidator")});var Kp=P((LMe,wV)=>{"use strict";var FS=require("joi"),Ja=require("path"),vd=require("fs-extra"),{exec:zde,spawn:jde}=require("child_process"),Jde=require("util"),Qde=Jde.promisify(zde),Ud=(H(),D($)),{PACKAGE_ROOT:Xde}=nt(),{handleHDBError:$p,hdb_errors:Zde}=he(),{HTTP_STATUS_CODES:Vp}=Zde,Ml=le(),efe=st(),Qa=W(),{once:tfe}=require("events");Ml.initSync();var Yw=Ml.get(Ud.CONFIG_PARAMS.COMPONENTSROOT),yV="npm install --force --omit=dev --json",rfe=`${yV} --dry-run`,nfe=Ml.get(Ud.CONFIG_PARAMS.ROOTPATH),GS=Ja.join(nfe,"ssh");wV.exports={installModules:afe,auditModules:cfe,installAllRootModules:sfe,uninstallRootModule:ife,linkHarperdb:ofe,runCommand:xd};async function sfe(e=!1,t=Ml.get(Ud.CONFIG_PARAMS.ROOTPATH)){await qS();let r=!1,n=process.env;vd.pathExistsSync(GS)&&vd.readdirSync(GS).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+Ja.join(GS,"config")+" -o UserKnownHostsFile="+Ja.join(GS,"known_hosts"),...process.env},r=!0)});try{let s=Ml.get(Ud.CONFIG_PARAMS.ROOTPATH),i=Ja.join(s,"node_modules","harperdb");vd.lstatSync(i).isSymbolicLink()&&vd.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&Qa.error("Error removing symlink:",s)}await xd(e?"npm install --force --ignore-scripts --no-bin-links":"npm install --force --no-bin-links",t,n)}a(sfe,"installAllRootModules");async function ife(e){await xd(`npm uninstall ${e}`,Ml.get(Ud.CONFIG_PARAMS.ROOTPATH))}a(ife,"uninstallRootModule");async function ofe(){await qS(),await xd(`npm link ${Xde}`,Ml.get(Ud.CONFIG_PARAMS.ROOTPATH))}a(ofe,"linkHarperdb");async function xd(e,t=void 0,r=process.env){Qa.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=jde(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();Qa.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();Qa.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await tfe(n,"close");if(o!==0)throw new Error(`Command \`${e}\` exited with code ${o}.${i===""?"":` Error: ${i}`}`);return s||void 0}a(xd,"runCommand");async function afe(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";Qa.warn(t,e.projects);let r=NV(e);if(r)throw $p(r,r.message,Vp.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?rfe:yV;await qS(),await OV(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=Ja.join(Yw,u),d,_=null;try{let{stdout:p,stderr:h}=await Qde(i,{cwd:f});d=p?p.replace(`
28
+ ${r.stack}`;throw Fw.error(n),X$(new Error)}}}a(mde,"getRolePermissions");function Ede(e,t){let r=Object.create(null);r.super_user=!1;let n=e.permission;r[Dn.SYSTEM_SCHEMA_NAME]=n[Dn.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]=gde(t[i]);return}r[i]=rV(),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=Sde(c,l);r[i].describe||sV.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=Gw()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=Gw()})}),r}a(Ede,"translateRolePermissions");function gde(e){let t=rV(!0);return Object.keys(e).forEach(r=>{t.tables[r]=Gw(!0,!0,!0,!0,!0)}),t}a(gde,"createStructureUserPermissions");function Sde(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 Dn.TIME_STAMP_NAMES.includes(d)&&(_=eV(d,f[Fp])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=Z$(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=oV(f),s.attribute_permissions.push(f),c||Tde(f,l)}else if(u!==o){let f;Dn.TIME_STAMP_NAMES.includes(u)?f=eV(u):f=Z$(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=tV(s),s}else return e.describe=tV(e),e}a(Sde,"getTableAttrPerms");function tV(e){return sV.filter(t=>e[t]).length>0}a(tV,"getSchemaTableDescribePerm");function oV(e){return iV.filter(t=>e[t]).length>0}a(oV,"getAttributeDescribePerm");function Tde(e,t){iV.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(Tde,"checkForHashPerms")});var Gp={};Ue(Gp,{authentication:()=>hV,bypassAuth:()=>Ide,login:()=>Pde,logout:()=>Dde,start:()=>Cde});function Ide(){pV=!0}async function hV(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let p=e.isOperationsServer?bde?yde:[]:Rde?Ade:[];if(p.includes(i)||p.includes("*")){if(e.method==="OPTIONS"){let h=nn.get(U.HTTP_CORSACCESSCONTROLALLOWHEADERS)??"Accept, Content-Type, Authorization",S=new No([["Access-Control-Allow-Methods","POST, GET, PUT, DELETE, PATCH, OPTIONS"],["Access-Control-Allow-Headers",h],["Access-Control-Allow-Origin",i]]);return BS&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),BS&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(BS){i||(i=r.host);let p=(i?i.replace(/^https?:\/\//,"").replace(/\W/,"_")+"-":"")+"hdb-session=",h=s?.split(/;\s+/)||[];for(let S of h)if(S.startsWith(p)){let g=S.indexOf(";");l=S.slice(p.length,g===-1?S.length:g),u=await lV.get(l);break}e.session=u||(u={})}let f=a((p,h,S)=>{let g=new Md.AuthAuditLog(p,h,la.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),h===Ws.SUCCESS?Vw.notify(g):Vw.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&Vw.error("Authorization error:",e._nodeRequest.socket.authorizationError),e.mtlsConfig&&e.authorized&&e.peerCertificate.subject){let p=e.mtlsConfig.user;p!==null?((p===void 0||p==="Common Name"||p==="CN")&&(p=e.peerCertificate.subject.CN),e.user=await ze.getUser(p,null,e),f(p,Ws.SUCCESS,"mTLS")):(0,Md.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let d;if(!e.user)if(n){if(d=Ll.get(n),!d){let p=n.indexOf(" "),h=n.slice(0,p),S=n.slice(p+1),g,R;try{switch(h){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 DO(S)}catch(N){if(N.message==="invalid token")try{return await _g(S),c({status:-1})}catch{throw N}}break}}catch(E){return Nde&&(Ll.get(S)||(Ll.set(S,S),f(g,Ws.FAILURE,h))),c({status:401,body:Aa({error:E.message},e)})}Ll.set(n,d),Ode&&f(d.username,Ws.SUCCESS,h)}e.user=d}else u?.user?e.user=await ze.getUser(u.user,null,e):(pV&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,dV.getSuperUser)());BS&&(e.session.update=function(p){let h=nn.get(U.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,fV.v4)();let S=nn.get(U.AUTHENTICATION_COOKIE_DOMAINS),g=h?new Date(Date.now()+(0,Kw.convertToMS)(h)).toUTCString():wde,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"))),p.id=l,lV.put(p,{expiresAt:h?Date.now()+(0,Kw.convertToMS)(h):void 0})},e.login=async function(p,h){let S=e.user=await ze.authenticateUser(p,h,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")&&Oi.loginPath?(_.status=302,_.headers.set("Location",Oi.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 No);for(let d=0;d<u;){let _=o[d++];f.set(_,o[d++])}}return o=null,l}a(c,"applyResponseHeaders")}function Cde({server:e,port:t,securePort:r}){e.http(hV,t||r?{port:t,securePort:r}:{port:"all"}),uV||(uV=!0,setInterval(()=>{Ll=new Map},nn.get(U.AUTHENTICATION_CACHETTL)).unref(),_V.user.addListener(()=>{Ll=new Map}))}async function Pde(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 Dde(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var dV,fV,nn,Md,_V,Kw,Vw,Ade,Rde,yde,bde,lV,BS,pV,Ode,Nde,wde,Ll,uV,HS=ye(()=>{dV=M(On());Yr();Tu();Ju();De();fV=require("uuid"),nn=M(le());H();Md=M(W()),_V=M(y_());W_();Kw=M(oe());uo();Vw=(0,Md.loggerWithTag)("auth-event");nn.initSync();Ade=nn.get(U.HTTP_CORSACCESSLIST),Rde=nn.get(U.HTTP_CORS),yde=nn.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),bde=nn.get(U.OPERATIONSAPI_NETWORK_CORS),lV=ut({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),BS=nn.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,pV=process.env.AUTHENTICATION_AUTHORIZELOCAL??nn.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,Ode=nn.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,Nde=nn.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,wde="Tue, 01 Oct 8307 19:33:20 GMT",Ll=new Map;ze.onInvalidatedUser(()=>{Ll=new Map});a(Ide,"bypassAuth");a(hV,"authentication");a(Cde,"start");a(Pde,"login");a(Dde,"logout")});var RV=P((PMe,AV)=>{"use strict";var Ne=require("joi"),mV=require("fs-extra"),EV=require("path"),is=st(),gV=le(),SV=(H(),D($)),TV=W(),{hdb_errors:Lde}=he(),{HDB_ERROR_MSGS:sn}=Lde,Go=/^[a-zA-Z0-9-_]+$/,Mde=/^[a-zA-Z0-9-_]+$/;AV.exports={getDropCustomFunctionValidator:Ude,setCustomFunctionValidator:xde,addComponentValidator:Fde,dropCustomFunctionProjectValidator:Gde,packageComponentValidator:qde,deployComponentValidator:$de,setComponentFileValidator:Bde,getComponentFileValidator:kde,dropComponentFileValidator:Hde,addSSHKeyValidator:Vde,updateSSHKeyValidator:Kde,deleteSSHKeyValidator:Yde,setSSHKnownHostsValidator:Wde};function kS(e,t,r){try{let n=gV.get(SV.CONFIG_PARAMS.COMPONENTSROOT),s=EV.join(n,t);return mV.existsSync(s)?e?t:r.message(sn.PROJECT_EXISTS):e?r.message(sn.NO_PROJECT):t}catch(n){return TV.error(n),r.message(sn.VALIDATION_ERR)}}a(kS,"checkProjectExists");function qp(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(qp,"checkFilePath");function vde(e,t,r,n){try{let s=gV.get(SV.CONFIG_PARAMS.COMPONENTSROOT),i=EV.join(s,e,t,r+".js");return mV.existsSync(i)?r:n.message(sn.NO_FILE)}catch(s){return TV.error(s),n.message(sn.VALIDATION_ERR)}}a(vde,"checkFileExists");function Ude(e){let t=Ne.object({project:Ne.string().pattern(Go).custom(kS.bind(null,!0)).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(Go).custom(vde.bind(null,e.project,e.type)).custom(qp).required().messages({"string.pattern.base":sn.BAD_FILE_NAME})});return is.validateBySchema(e,t)}a(Ude,"getDropCustomFunctionValidator");function xde(e){let t=Ne.object({project:Ne.string().pattern(Go).custom(kS.bind(null,!0)).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(qp).required(),function_content:Ne.string().required()});return is.validateBySchema(e,t)}a(xde,"setCustomFunctionValidator");function Bde(e){let t=Ne.object({project:Ne.string().pattern(Go).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),file:Ne.string().custom(qp).required(),payload:Ne.string().allow("").optional(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return is.validateBySchema(e,t)}a(Bde,"setComponentFileValidator");function Hde(e){let t=Ne.object({project:Ne.string().pattern(Go).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),file:Ne.string().custom(qp).optional()});return is.validateBySchema(e,t)}a(Hde,"dropComponentFileValidator");function kde(e){let t=Ne.object({project:Ne.string().required(),file:Ne.string().custom(qp).required(),encoding:Ne.string().valid("utf8","ASCII","binary","hex","base64","utf16le","latin1","ucs2").optional()});return is.validateBySchema(e,t)}a(kde,"getComponentFileValidator");function Fde(e){let t=Ne.object({project:Ne.string().pattern(Go).custom(kS.bind(null,!1)).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME})});return is.validateBySchema(e,t)}a(Fde,"addComponentValidator");function Gde(e){let t=Ne.object({project:Ne.string().pattern(Go).custom(kS.bind(null,!0)).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME})});return is.validateBySchema(e,t)}a(Gde,"dropCustomFunctionProjectValidator");function qde(e){let t=Ne.object({project:Ne.string().pattern(Go).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return is.validateBySchema(e,t)}a(qde,"packageComponentValidator");function $de(e){let t=Ne.object({project:Ne.string().pattern(Go).required().messages({"string.pattern.base":sn.BAD_PROJECT_NAME}),package:Ne.string().optional(),restart:Ne.alternatives().try(Ne.boolean(),Ne.string().valid("rolling")).optional()});return is.validateBySchema(e,t)}a($de,"deployComponentValidator");function Vde(e){let t=Ne.object({name:Ne.string().pattern(Mde).required().messages({"string.pattern.base":sn.BAD_SSH_KEY_NAME}),key:Ne.string().required(),host:Ne.string().required(),hostname:Ne.string().required(),known_hosts:Ne.string().optional()});return is.validateBySchema(e,t)}a(Vde,"addSSHKeyValidator");function Kde(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return is.validateBySchema(e,t)}a(Kde,"updateSSHKeyValidator");function Yde(e){let t=Ne.object({name:Ne.string().required()});return is.validateBySchema(e,t)}a(Yde,"deleteSSHKeyValidator");function Wde(e){let t=Ne.object({known_hosts:Ne.string().required()});return is.validateBySchema(e,t)}a(Wde,"setSSHKnownHostsValidator")});var Kp=P((LMe,wV)=>{"use strict";var FS=require("joi"),Ja=require("path"),vd=require("fs-extra"),{exec:zde,spawn:jde}=require("child_process"),Jde=require("util"),Qde=Jde.promisify(zde),Ud=(H(),D($)),{PACKAGE_ROOT:Xde}=nt(),{handleHDBError:$p,hdb_errors:Zde}=he(),{HTTP_STATUS_CODES:Vp}=Zde,Ml=le(),efe=st(),Qa=W(),{once:tfe}=require("events");Ml.initSync();var Yw=Ml.get(Ud.CONFIG_PARAMS.COMPONENTSROOT),yV="npm install --force --omit=dev --json",rfe=`${yV} --dry-run`,nfe=Ml.get(Ud.CONFIG_PARAMS.ROOTPATH),GS=Ja.join(nfe,"ssh");wV.exports={installModules:afe,auditModules:cfe,installAllRootModules:sfe,uninstallRootModule:ife,linkHarperdb:ofe,runCommand:xd};async function sfe(e=!1,t=Ml.get(Ud.CONFIG_PARAMS.ROOTPATH)){await qS();let r=!1,n=process.env;vd.pathExistsSync(GS)&&vd.readdirSync(GS).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+Ja.join(GS,"config")+" -o UserKnownHostsFile="+Ja.join(GS,"known_hosts"),...process.env},r=!0)});try{let s=Ml.get(Ud.CONFIG_PARAMS.ROOTPATH),i=Ja.join(s,"node_modules","harperdb");vd.lstatSync(i).isSymbolicLink()&&vd.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&Qa.error("Error removing symlink:",s)}await xd(e?"npm install --force --ignore-scripts":"npm install --force",t,n)}a(sfe,"installAllRootModules");async function ife(e){await xd(`npm uninstall ${e}`,Ml.get(Ud.CONFIG_PARAMS.ROOTPATH))}a(ife,"uninstallRootModule");async function ofe(){await qS(),await xd(`npm link ${Xde}`,Ml.get(Ud.CONFIG_PARAMS.ROOTPATH))}a(ofe,"linkHarperdb");async function xd(e,t=void 0,r=process.env){Qa.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=jde(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();Qa.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();Qa.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await tfe(n,"close");if(o!==0)throw new Error(`Command \`${e}\` exited with code ${o}.${i===""?"":` Error: ${i}`}`);return s||void 0}a(xd,"runCommand");async function afe(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";Qa.warn(t,e.projects);let r=NV(e);if(r)throw $p(r,r.message,Vp.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?rfe:yV;await qS(),await OV(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=Ja.join(Yw,u),d,_=null;try{let{stdout:p,stderr:h}=await Qde(i,{cwd:f});d=p?p.replace(`
29
29
  `,""):null,_=h?h.replace(`
30
30
  `,""):null}catch(p){p.stderr?o[u].npm_error=bV(p.stderr):o[u].npm_error=p.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 Qa.info(`finished installModules with response ${o}`),o.warning=t,o}a(afe,"installModules");function bV(e){let t='"error": {',r=e.indexOf('"error": {'),n=e.indexOf(`}
31
31
  `);return r>-1&&n>-1?JSON.parse(e.substring(r+t.length-1,n+1)):e}a(bV,"parseNPMStdErr");async function cfe(e){Qa.info(`starting auditModules for request: ${e}`);let t=NV(e);if(t)throw $p(t,t.message,Vp.BAD_REQUEST);let{projects:r}=e;await qS(),await OV(r);let n={};for(let s=0,i=r.length;s<i;s++){let o=r[s],c=Ja.join(Yw,o);n[o]={npm_output:null,npm_error:null};try{let l=await xd("npm audit --json",c);n[o].npm_output=JSON.parse(l)}catch(l){n[o].npm_error=bV(l.stderr)}}return Qa.info(`finished auditModules with response ${n}`),n}a(cfe,"auditModules");async function qS(){return await xd("npm -v"),!0}a(qS,"checkNPMInstalled");async function OV(e){if(!Array.isArray(e)||e.length===0)throw $p(new Error,"projects argument must be an array with at least 1 element",Vp.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=Ja.join(Yw,i.toString());if(!await vd.pathExists(o)){t.push(i);continue}let l=Ja.join(o,"package.json");await vd.pathExists(l)||r.push(i)}if(t.length>0)throw $p(new Error,`Unable to install project dependencies: custom function projects '${t.join(",")}' does not exist.`,Vp.BAD_REQUEST,void 0,void 0,!0);if(r.length>0)throw $p(new Error,`Unable to install project dependencies: custom function projects '${r.join(",")}' do not have a package.json file.`,Vp.BAD_REQUEST,void 0,void 0,!0)}a(OV,"checkProjectPaths");function NV(e){let t=FS.object({projects:FS.array().min(1).items(FS.string()).required(),dry_run:FS.boolean().default(!1)});return efe.validateBySchema(e,t)}a(NV,"modulesValidator")});var zw=P((vMe,MV)=>{"use strict";var Ps=require("fs-extra"),Wp=require("path"),Yp=W(),IV=oe(),{PACKAGE_ROOT:lfe}=nt(),Ww=(H(),D($)),LV=le(),ufe=At();MV.exports=dfe;async function dfe(){let e=ffe(),t=LV.get(Ww.CONFIG_PARAMS.ROOTPATH),r=Wp.join(t,"package.json"),n={dependencies:{harperdb:"file:"+lfe}},s=Wp.join(t,"node_modules");Ps.ensureDirSync(s);let i,o=!0,c=!1;try{i=Ps.readJsonSync(r)}catch(l){if(IV.isEmptyOrZeroLength(e))return;if(l.code!==Ww.NODE_ERROR_CODES.ENOENT)throw l;o=!1}if(!IV.isEmptyOrZeroLength(e)){for(let{name:l,package:u}of e){let f=PV(u);n.dependencies[l]=f+u}if(!o){Yp.notify("Installing components"),await DV(r,n,null),await CV(t,e);return}for(let{name:l,package:u}of e){let f=i.dependencies[l],d=PV(u);if(f===void 0||f!==d+u){c=!0;break}if(u.startsWith("file:"))try{if(Ps.statSync(new URL(u+"/package.json")).mtimeMs>Ps.statSync(r).mtimeMs){c=!0;break}}catch(_){Yp.info(`Error checking ${u}/package.json modification time`,_);break}}}for(let l in i.dependencies)n.dependencies[l]===void 0&&(Yp.notify("Removing component",l),c=!0);c&&(Yp.notify("Updating components."),await DV(r,n,i),await CV(t,e))}a(dfe,"installComponents");function CV(e,t){return Promise.all(t.map(({name:r})=>{let n=Wp.join(e,"node_modules",r),s=Wp.join(e,"components",r);if(Ps.existsSync(n)&&Ps.lstatSync(n).isDirectory())return Ps.move(n,s,{overwrite:!0}).then(()=>{Ps.symlink(s,n)})}))}a(CV,"moveModuleToComponents");function ffe(){let e=ufe.getConfiguration(),t=[];for(let r in e)e[r]?.package&&t.push(Object.assign(e[r],{name:r}));return t}a(ffe,"getComponentsConfig");function PV(e){return e.includes(":")?"":e.startsWith("@")||!e.startsWith("@")&&!e.includes("/")?"npm:":Wp.extname(e)||Ps.existsSync(e)?"file:":"github:"}a(PV,"getPkgPrefix");async function DV(e,t,r){Yp.trace("npm installing components package.json",t),Ps.writeFileSync(e,JSON.stringify(t,null," "));try{await Kp().installAllRootModules(LV.get(Ww.CONFIG_PARAMS.IGNORE_SCRIPTS)===!0)}catch(n){throw r?Ps.writeFileSync(e,JSON.stringify(r,null," ")):Ps.unlinkSync(e),n}}a(DV,"installPackages")});var jw={};Ue(jw,{packageDirectory:()=>_fe});function _fe(e,t={skip_node_modules:!1,skip_symlinks:!1}){return new Promise((r,n)=>{let s=[];UV.default.pack(e,{dereference:!t.skip_symlinks,ignore:t.skip_node_modules?i=>i.includes("node_modules")||i.includes((0,vV.join)("cache","webpack")):void 0}).pipe((0,xV.createGzip)()).on("data",i=>s.push(i)).on("end",()=>{r(Buffer.concat(s))}).on("error",n)})}var vV,UV,xV,Jw=ye(()=>{vV=require("path"),UV=M(require("tar-fs")),xV=require("node:zlib");a(_fe,"packageDirectory")});var Zw=P(FV=>{"use strict";var be=require("fs-extra"),Qw=require("fast-glob"),Ie=require("path"),pfe=require("tar-fs"),hfe=require("gunzip-maybe"),Xw=require("normalize-path"),Ln=RV(),Bt=W(),at=(H(),D($)),jt=le(),$S=At(),mfe=oe(),{PACKAGE_ROOT:Efe}=nt(),{handleHDBError:Ht,hdb_errors:gfe}=he(),{basename:Sfe}=require("path"),Tfe=zw(),HV=le(),{Readable:Afe}=require("stream"),{isMainThread:Rfe}=require("worker_threads"),{HDB_ERROR_MSGS:vl,HTTP_STATUS_CODES:kt}=gfe,kV=tt(),{replicateOperation:fi}=(es(),D(Po)),{packageDirectory:yfe}=(Jw(),D(jw)),BV=Kp(),bfe=Ie.join(Efe,"application-template"),Ofe=jt.get(at.CONFIG_PARAMS.ROOTPATH),Xa=Ie.join(Ofe,"ssh"),qo=Ie.join(Xa,"known_hosts");function Nfe(){Bt.trace("getting custom api status");let e={};try{e={port:jt.get(at.CONFIG_PARAMS.HTTP_PORT),directory:jt.get(at.CONFIG_PARAMS.COMPONENTSROOT),is_enabled:!0}}catch(t){throw Ht(new Error,vl.FUNCTION_STATUS,kt.INTERNAL_SERVER_ERROR,Bt.ERR,t)}return e}a(Nfe,"customFunctionsStatus");function wfe(){Bt.trace("getting custom api endpoints");let e={},t=jt.get(at.CONFIG_PARAMS.COMPONENTSROOT);try{Qw.sync(Xw(`${t}/*`),{onlyDirectories:!0}).forEach(n=>{let s=n.split("/").pop();e[s]={routes:Qw.sync(Xw(`${n}/routes/*.js`)).map(i=>i.split("/").pop().split(".js")[0]),helpers:Qw.sync(Xw(`${n}/helpers/*.js`)).map(i=>i.split("/").pop().split(".js")[0])}})}catch(r){throw Ht(new Error,vl.GET_FUNCTIONS,kt.INTERNAL_SERVER_ERROR,Bt.ERR,r)}return e}a(wfe,"getCustomFunctions");function Ife(e){e.project&&(e.project=Ie.parse(e.project).name),e.file&&(e.file=Ie.parse(e.file).name);let t=Ln.getDropCustomFunctionValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);Bt.trace("getting custom api endpoint file content");let r=jt.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,vl.GET_FUNCTION,kt.INTERNAL_SERVER_ERROR,Bt.ERR,c)}}a(Ife,"getCustomFunction");async function Cfe(e){e.project&&(e.project=Ie.parse(e.project).name),e.file&&(e.file=Ie.parse(e.file).name);let t=Ln.setCustomFunctionValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);Bt.trace("setting custom function file content");let r=jt.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 fi(e);return c.message=`Successfully updated custom function: ${i}.js`,c}catch(c){throw Ht(new Error,vl.SET_FUNCTION,kt.INTERNAL_SERVER_ERROR,Bt.ERR,c)}}a(Cfe,"setCustomFunction");async function Pfe(e){e.project&&(e.project=Ie.parse(e.project).name),e.file&&(e.file=Ie.parse(e.file).name);let t=Ln.getDropCustomFunctionValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);Bt.trace("dropping custom function file");let r=jt.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 fi(e);return o.message=`Successfully deleted custom function: ${i}.js`,o}catch(o){throw Ht(new Error,vl.DROP_FUNCTION,kt.INTERNAL_SERVER_ERROR,Bt.ERR,o)}}a(Pfe,"dropCustomFunction");async function Dfe(e){e.project&&(e.project=Ie.parse(e.project).name);let t=Ln.addComponentValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);Bt.trace("adding component");let r=jt.get(at.CONFIG_PARAMS.COMPONENTSROOT),{project:n}=e;try{let s=Ie.join(r,n);be.mkdirSync(s,{recursive:!0}),be.copySync(bfe,s);let i=await fi(e);return i.message=`Successfully added project: ${n}`,i}catch(s){throw Ht(new Error,vl.ADD_FUNCTION,kt.INTERNAL_SERVER_ERROR,Bt.ERR,s)}}a(Dfe,"addComponent");async function Lfe(e){e.project&&(e.project=Ie.parse(e.project).name);let t=Ln.dropCustomFunctionProjectValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);Bt.trace("dropping custom function project");let r=jt.get(at.CONFIG_PARAMS.COMPONENTSROOT),{project:n}=e,s=jt.get(at.CONFIG_PARAMS.APPS);if(!mfe.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 $S.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 fi(e);return o.message=`Successfully deleted project: ${n}`,o}catch(i){throw Ht(new Error,vl.DROP_FUNCTION_PROJECT,kt.INTERNAL_SERVER_ERROR,Bt.ERR,i)}}a(Lfe,"dropCustomFunctionProject");async function Mfe(e){e.project&&(e.project=Ie.parse(e.project).name);let t=Ln.packageComponentValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);let r=jt.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(jt.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 yfe(s,e)).toString("base64");return{project:n,payload:i}}a(Mfe,"packageComponent");async function vfe(e){e.project?e.project=Ie.parse(e.project).name:e.package&&(e.project=Ufe(e.package));let t=Ln.deployComponentValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);let r=jt.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=Afe.from(s instanceof Buffer?s:Buffer.from(s,"base64"));await new Promise((E,T)=>{S.pipe(hfe()).pipe(pfe.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 BV.runCommand(o,c):be.existsSync(R)||await BV.installAllRootModules(!1,c)}else{await $S.addConfig(n,{package:i}),await Tfe();let S=HV.get(at.CONFIG_PARAMS.ROOTPATH);c=Ie.join(S,"node_modules",n)}if(Rfe)return;let l=new Map;l.isWorker=!0;let u=(jp(),D(zp)),f;u.setErrorReporter(S=>f=S);let d=Sfe(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 p=e.restart==="rolling";e.restart=p?!1:e.restart;let h=await fi(e);if(e.restart===!0)kV.restartWorkers("http"),h.message=`Successfully deployed: ${n}, restarting HarperDB`;else if(p){let g=await eI().executeJob({operation:"restart_service",service:"http",replicated:!0});h.restartJobId=g.job_id,h.message=`Successfully deployed: ${n}, restarting HarperDB`}else h.message=`Successfully deployed: ${n}`;return h}a(vfe,"deployComponent");function Ufe(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(Ufe,"getProjectNameFromPackage");async function xfe(){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(jt.get(at.CONFIG_PARAMS.COMPONENTSROOT),{name:jt.get(at.CONFIG_PARAMS.COMPONENTSROOT).split(Ie.sep).slice(-1).pop(),entries:[]}),n=(jp(),D(zp)).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(xfe,"getComponents");async function Bfe(e){let t=Ln.getComponentFileValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);let n=$S.getConfigObj()[e.project]||e.project==="harperdb"?Ie.join(HV.get(at.CONFIG_PARAMS.ROOTPATH),"node_modules"):jt.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(Bfe,"getComponentFile");async function Hfe(e){let t=Ln.setComponentFileValidator(e);if(t)throw Ht(t,t.message,kt.BAD_REQUEST);let r=e.encoding?{encoding:e.encoding}:{encoding:"utf8"},n=Ie.join(jt.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 fi(e);return s.message="Successfully set component: "+e.file,s}a(Hfe,"setComponentFile");async function kfe(e){let t=Ln.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(jt.get(at.CONFIG_PARAMS.COMPONENTSROOT),s),o=Ie.join(jt.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(jt.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")}$S.deleteConfigFromFile([r]);let l=await fi(e);return e.restart===!0?(kV.restartWorkers("http"),l.message=`Successfully dropped: ${s}, restarting HarperDB`):l.message=`Successfully dropped: ${s}`,l}a(kfe,"dropComponent");async function Ffe(e){let t=Ln.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(Xa,r+".key"),l=Ie.join(Xa,"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}
package/bin/lite.js CHANGED
@@ -24,7 +24,7 @@ Caused by:`));else if(typeof u=="object")try{n+=JSON.stringify(u)}catch{n+="Obje
24
24
  `)}catch(r){r.code==="ENOENT"?Xr.debug("no license file found"):Xr.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(ble.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=zq(s.license_key,s.company);i.valid_machine===!0&&i.valid_date===!0&&i.valid_machine===!0&&(e.exp_date=i.exp_date>e.exp_date?i.exp_date:e.exp_date,e.ram_allocation=i.ram_allocation,e.enterprise=!0)}catch(s){Xr.error("There was an error parsing the license string."),Xr.error(s),e.ram_allocation=ll.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return YN=e,e}a(jN,"licenseSearch");async function Ule(){return YN||await jN(),YN}a(Ule,"getLicense");function xle(){let e=jN().ram_allocation,t=process.constrainedMemory?.()||Vq();if(t=Math.round(Math.min(t,Vq())/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(xle,"checkMemoryLimit")});var ZN=P((BPe,Zq)=>{var iS=sd(),jq=require("chalk"),jn=j(),Jq=require("prompt"),{promisify:Ble}=require("util"),JN=(H(),D($)),Hle=require("fs-extra"),kle=require("path"),Fle=oe(),{packageJson:Gle}=pt(),Xq=ue();Xq.initSync();var qle=require("moment"),$le=Ble(Jq.get),Vle=kle.join(Xq.getHdbBasePath(),JN.LICENSE_KEY_DIR_NAME,JN.LICENSE_FILE_NAME,JN.LICENSE_FILE_NAME);Zq.exports={getFingerprint:Yle,setLicense:Kle,parseLicense:XN,register:Wle,getRegistrationInfo:Qle};async function Kle(e){if(e&&e.key&&e.company){try{jn.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await XN(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw jn.error(r),jn.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}a(Kle,"setLicense");async function Yle(){let e={};try{e=await iS.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw jn.error(r),jn.error(t),new Error(r)}return e}a(Yle,"getFingerprint");async function XN(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");jn.info("Validating license input...");let r=iS.validateLicense(e,t);if(jn.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(jn.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(jn.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{jn.info("writing license to disk"),await Hle.writeFile(Vle,JSON.stringify({license_key:e,company:t}))}catch(n){throw jn.error("Failed to write License"),n}return"Registration successful."}a(XN,"parseLicense");async function Wle(){let e=await zle();return XN(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}a(Wle,"register");async function zle(){let e=await iS.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:jq.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:jq.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{Jq.start()}catch(n){jn.error(n)}let r;try{r=await $le(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}a(zle,"promptForRegistration");async function Qle(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await iS.getLicense()}catch(r){throw jn.error(`There was an error when searching licenses due to: ${r.message}`),r}if(Fle.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=Gle.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=qle.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}a(Qle,"getRegistrationInfo")});var t$=P((kPe,e$)=>{"use strict";var jle=Nt(),ew=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+jle.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"}};e$.exports=ew});var s$=P((GPe,n$)=>{"use strict";var r$=Nt(),tw=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+r$.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+r$.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"}};n$.exports=tw});var o$=P(($Pe,i$)=>{"use strict";var rw=class{static{a(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};i$.exports=rw});var c$=P((KPe,a$)=>{"use strict";var Jle=Nt(),nw=class{static{a(this,"SysUserObject")}constructor(t,r){this.user=t+Jle.SERVER_SUFFIX.ADMIN,this.password=r}};a$.exports=nw});var lS=P((WPe,d$)=>{"use strict";var ul=require("path"),dl=require("fs-extra"),Xle=t$(),Zle=s$(),eue=o$(),tue=c$(),sw=$n(),od=oe(),bn=It(),aS=(H(),D($)),mh=Nt(),{CONFIG_PARAMS:Wt}=aS,ad=j(),ph=ue(),l$=ao(),iw=gr(),rue=Qs(),id="clustering",nue=1e4,u$=50;d$.exports={generateNatsConfig:iue,removeNatsConfig:oue,getHubConfigPath:sue};function sue(){let e=ph.get(Wt.ROOTPATH);return ul.join(e,id,mh.NATS_CONFIG_FILES.HUB_SERVER)}a(sue,"getHubConfigPath");async function iue(e=!1,t=void 0){let r=ph.get(Wt.ROOTPATH);dl.ensureDirSync(ul.join(r,"clustering","leaf")),ph.initSync();let n=bn.getConfigFromFile(Wt.CLUSTERING_TLS_CERT_AUTH),s=bn.getConfigFromFile(Wt.CLUSTERING_TLS_PRIVATEKEY),i=bn.getConfigFromFile(Wt.CLUSTERING_TLS_CERTIFICATE);!await dl.exists(i)&&!await dl.exists(!n)&&await rue.createNatsCerts();let o=ul.join(r,id,mh.PID_FILES.HUB),c=ul.join(r,id,mh.PID_FILES.LEAF),l=bn.getConfigFromFile(Wt.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=ul.join(r,id,mh.NATS_CONFIG_FILES.HUB_SERVER),f=ul.join(r,id,mh.NATS_CONFIG_FILES.LEAF_SERVER),d=bn.getConfigFromFile(Wt.CLUSTERING_TLS_INSECURE),_=bn.getConfigFromFile(Wt.CLUSTERING_TLS_VERIFY),h=bn.getConfigFromFile(Wt.CLUSTERING_NODENAME),m=bn.getConfigFromFile(Wt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await iw.checkNATSServerInstalled()||cS("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let S=await sw.listUsers(),g=bn.getConfigFromFile(Wt.CLUSTERING_USER),R=await sw.getClusterUser();(od.isEmpty(R)||R.active!==!0)&&cS(`Invalid cluster user '${g}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await oS(Wt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await oS(Wt.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await oS(Wt.CLUSTERING_HUBSERVER_NETWORK_PORT),await oS(Wt.CLUSTERING_LEAFSERVER_NETWORK_PORT));let E=[],T=[];for(let[ie,W]of S.entries())W.role?.role===aS.ROLE_TYPES_ENUM.CLUSTER_USER&&W.active&&(E.push(new tue(W.username,l$.decrypt(W.hash))),T.push(new eue(W.username,l$.decrypt(W.hash))));let N=[],{hub_routes:v}=bn.getClusteringRoutes();if(!od.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 Xle(bn.getConfigFromFile(Wt.CLUSTERING_HUBSERVER_NETWORK_PORT),h,o,i,s,n,d,_,m,bn.getConfigFromFile(Wt.CLUSTERING_HUBSERVER_CLUSTER_NAME),bn.getConfigFromFile(Wt.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,E,T);n==null&&(delete k.tls.ca_file,delete k.leafnodes.tls.ca_file),t=od.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===aS.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await dl.writeJson(u,k),ad.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 Zle(bn.getConfigFromFile(Wt.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===aS.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await dl.writeJson(f,X),ad.trace(`Leaf server config written to ${f}`))}a(iue,"generateNatsConfig");async function oS(e){let t=ph.get(e);return od.isEmpty(t)&&cS(`port undefined for '${e}'`),await od.isPortTaken(t)&&cS(`'${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(oS,"isPortAvailable");function cS(e){let t=`Error generating clustering config: ${e}`;ad.error(t),console.error(t),process.exit(1)}a(cS,"generateNatsConfigError");async function oue(e){let{port:t,config_file:r}=iw.getServerConfig(e),{username:n,decrypt_hash:s}=await sw.getClusterUser(),i=0,o=2e3;for(;i<u$;){try{let f=await iw.createConnection(t,n,s,!1);if(f.protocol.connected===!0){f.close();break}}catch(f){ad.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${f}`)}if(i++,i>=u$)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&&ad.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await od.async_set_timeout(u)}let c="0".repeat(nue),l=ul.join(ph.get(Wt.ROOTPATH),id,r);await dl.writeFile(l,c),await dl.remove(l),ad.notify(e,"started.")}a(oue,"removeNatsConfig")});var E$=P((QPe,p$)=>{"use strict";var Jn=ue(),aue=sd(),Ge=(H(),D($)),Eh=Nt(),Ro=require("path"),{PACKAGE_ROOT:dS}=pt(),f$=ue(),uS=oe(),cd="/dev/null",cue=Ro.join(dS,"launchServiceScripts"),_$=Ro.join(dS,"utility/scripts"),lue=Ro.join(_$,Ge.HDB_RESTART_SCRIPT),h$=Ro.resolve(dS,"dependencies",`${process.platform}-${process.arch}`,Eh.NATS_BINARY_NAME);function m$(){let t=aue.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 uS.noBootFile()&&(n[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=uS.getEnvCliRootPath()),{name:Ge.PROCESS_DESCRIPTORS.HDB,script:Ge.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:dS}}a(m$,"generateMainServerConfig");var uue=9930;function due(){Jn.initSync(!0);let e=Jn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=Ro.join(e,"clustering",Eh.NATS_CONFIG_FILES.HUB_SERVER),r=Ro.join(Jn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=f$.get(Ge.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=Eh.LOG_LEVEL_FLAGS[Jn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==uue?"-"+n:""),script:h$,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 Jn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=cd,i.error_file=cd),i}a(due,"generateNatsHubServerConfig");var fue=9940;function _ue(){Jn.initSync(!0);let e=Jn.get(Ge.CONFIG_PARAMS.ROOTPATH),t=Ro.join(e,"clustering",Eh.NATS_CONFIG_FILES.LEAF_SERVER),r=Ro.join(Jn.get(Ge.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ge.LOG_NAMES.HDB),n=f$.get(Ge.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=Eh.LOG_LEVEL_FLAGS[Jn.get(Ge.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ge.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==fue?"-"+n:""),script:h$,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 Jn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=cd,i.error_file=cd),i}a(_ue,"generateNatsLeafServerConfig");function hue(){Jn.initSync();let e=Ro.join(Jn.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:cue,autorestart:!1};return Jn.get(Ge.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=cd,t.error_file=cd),t}a(hue,"generateClusteringUpgradeV4ServiceConfig");function mue(){let e={[Ge.PROCESS_NAME_ENV_PROP]:Ge.PROCESS_DESCRIPTORS.RESTART_HDB};return uS.noBootFile()&&(e[Ge.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=uS.getEnvCliRootPath()),{...{name:Ge.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:_$},script:lue}}a(mue,"generateRestart");function pue(){return{apps:[m$()]}}a(pue,"generateAllServiceConfigs");p$.exports={generateAllServiceConfigs:pue,generateMainServerConfig:m$,generateRestart:mue,generateNatsHubServerConfig:due,generateNatsLeafServerConfig:_ue,generateClusteringUpgradeV4ServiceConfig:hue}});var Sh=P((XPe,D$)=>{"use strict";var et=(H(),D($)),Eue=oe(),bo=lS(),fS=gr(),yo=Nt(),Pa=E$(),_S=ue(),fl=j(),gue=So(),{startWorker:g$,onMessageFromWorkers:Sue}=tt(),Tue=Xu(),JPe=require("util"),Aue=require("child_process"),Rue=require("fs"),{execFile:yue}=Aue,We;D$.exports={enterPM2Mode:bue,start:Da,stop:ow,reload:T$,restart:A$,list:aw,describe:b$,connect:Oo,kill:Cue,startAllServices:Pue,startService:cw,getUniqueServicesList:O$,restartAllServices:Due,isServiceRegistered:N$,reloadStopStart:w$,restartHdb:y$,deleteProcess:wue,startClusteringProcesses:C$,startClusteringThreads:P$,isHdbRestartRunning:Iue,isClusteringRunning:Mue,stopClustering:Lue,reloadClustering:vue,expectedRestartOfChildren:R$};var gh=!1;Sue(e=>{e.type==="restart"&&_S.initSync(!0)});function bue(){gh=!0}a(bue,"enterPM2Mode");function Oo(){return We||(We=require("pm2")),new Promise((e,t)=>{We.connect((r,n)=>{r&&t(r),e(n)})})}a(Oo,"connect");var Zr,Oue=10,S$;function Da(e,t=!1){if(gh)return Nue(e);let r=yue(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let o=Zr.indexOf(r);o>-1&&Zr.splice(o,1),!S$&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<Oue&&(Rue.existsSync(bo.getHubConfigPath())?Da(e):(await bo.generateNatsConfig(!0),Da(e),await new Promise(c=>setTimeout(c,3e3)),await bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let o=_S.get(et.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,f;for(;l=c.exec(i);){if(l.index&&yo.LOG_LEVEL_HIERARCHY[o]>=yo.LOG_LEVEL_HIERARCHY[f||"info"]){let h=f===yo.LOG_LEVELS.ERR||f===yo.LOG_LEVELS.WRN?fl.OUTPUTS.STDERR:fl.OUTPUTS.STDOUT;fl.logCustomLevel(f||"info",h,n,i.slice(u,l.index).trim())}let[d,_]=l;u=l.index+d.length,f=yo.LOG_LEVELS[_]}if(yo.LOG_LEVEL_HIERARCHY[o]>=yo.LOG_LEVEL_HIERARCHY[f||"info"]){let d=f===yo.LOG_LEVELS.ERR||f===yo.LOG_LEVELS.WRN?fl.OUTPUTS.STDERR:fl.OUTPUTS.STDOUT;fl.logCustomLevel(f||"info",d,n,i.slice(u).trim())}}if(a(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!Zr&&(Zr=[],!t)){let i=a(()=>{S$=!0,Zr&&(Zr.map(o=>o.kill()),process.exit(0))},"kill_children");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}Zr.push(r)}a(Da,"start");function Nue(e){return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.start(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}a(Nue,"startWithPM2");function ow(e){if(!gh){for(let t of Zr||[])t.name===e&&(Zr.splice(Zr.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.stop(e,async(n,s)=>{n&&(We.disconnect(),r(n)),We.delete(e,(i,o)=>{i&&(We.disconnect(),r(n)),We.disconnect(),t(o)})})})}a(ow,"stop");function T$(e){return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.reload(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}a(T$,"reload");function A$(e){if(!gh){R$();for(let t of Zr||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.restart(e,(n,s)=>{We.disconnect(),t(s)})})}a(A$,"restart");function R$(){for(let e of Zr||[])e.config&&(e.config.restarts=0)}a(R$,"expectedRestartOfChildren");function wue(e){return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.delete(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}a(wue,"deleteProcess");async function y$(){await Da(Pa.generateRestart())}a(y$,"restartHdb");async function Iue(){let e=await aw();for(let t in e)if(e[t].name===et.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}a(Iue,"isHdbRestartRunning");function aw(){return new Promise(async(e,t)=>{try{await Oo()}catch(r){t(r)}We.list((r,n)=>{r&&(We.disconnect(),t(r)),We.disconnect(),e(n)})})}a(aw,"list");function b$(e){return new Promise(async(t,r)=>{try{await Oo()}catch(n){r(n)}We.describe(e,(n,s)=>{n&&(We.disconnect(),r(n)),We.disconnect(),t(s)})})}a(b$,"describe");function Cue(){if(!gh){for(let e of Zr||[])e.kill();Zr=[];return}return new Promise(async(e,t)=>{try{await Oo()}catch(r){t(r)}We.killDaemon((r,n)=>{r&&(We.disconnect(),t(r)),We.disconnect(),e(n)})})}a(Cue,"kill");async function Pue(){try{await C$(),await P$(),await Da(Pa.generateAllServiceConfigs())}catch(e){throw We?.disconnect(),e}}a(Pue,"startAllServices");async function cw(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case et.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=Pa.generateMainServerConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=Pa.generateNatsIngestServiceConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=Pa.generateNatsReplyServiceConfig();break;case et.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=Pa.generateNatsHubServerConfig(),await Da(r,t),await bo.removeNatsConfig(e);return;case et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=Pa.generateNatsLeafServerConfig(),await Da(r,t),await bo.removeNatsConfig(e);return;case et.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=Pa.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await Da(r)}catch(r){throw We?.disconnect(),r}}a(cw,"startService");async function O$(){try{let e=await aw(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw We?.disconnect(),e}}a(O$,"getUniqueServicesList");async function Due(e=[]){try{let t=!1,r=await O$();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 A$(o))}t&&await w$(et.PROCESS_DESCRIPTORS.HDB)}catch(t){throw We?.disconnect(),t}}a(Due,"restartAllServices");async function N$(e){if(Zr?.find(r=>r.name===e))return!0;let t=await Tue.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}a(N$,"isServiceRegistered");async function w$(e){let t=_S.get(et.CONFIG_PARAMS.THREADS_COUNT)??_S.get(et.CONFIG_PARAMS.THREADS),r=await b$(e),n=Eue.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await ow(e),await cw(e)):e===et.PROCESS_DESCRIPTORS.HDB?await y$():await T$(e)}a(w$,"reloadStopStart");var I$;async function C$(e=!1){for(let t in et.CLUSTERING_PROCESSES){let r=et.CLUSTERING_PROCESSES[t];await cw(r,e)}}a(C$,"startClusteringProcesses");async function P$(){I$=g$(et.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:et.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await fS.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await fS.updateLocalStreams();let e=await gue.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===et.PRE_4_0_0_VERSION){fl.info("Starting clustering upgrade 4.0.0 process"),g$(et.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}a(P$,"startClusteringThreads");async function Lue(){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 I$.terminate();else{let t=et.CLUSTERING_PROCESSES[e];await ow(t)}}a(Lue,"stopClustering");async function Mue(){for(let e in et.CLUSTERING_PROCESSES){let t=et.CLUSTERING_PROCESSES[e];if(await N$(t)===!1)return!1}return!0}a(Mue,"isClusteringRunning");async function vue(){await bo.generateNatsConfig(!0),await fS.reloadNATSHub(),await fS.reloadNATSLeaf(),await bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await bo.removeNatsConfig(et.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}a(vue,"reloadClustering")});var dw={};Ue(dw,{compactOnStart:()=>Uue,copyDb:()=>B$});async function Uue(){La.notify("Running compact on start"),console.log("Running compact on start");let e=(0,lw.get)(U.ROOTPATH),t=new Map,r=Xe();(0,uw.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,hS.join)(e,"backup",n+".mdb"),o=(0,hS.join)(e,tc,n+"-copy.mdb"),c=0;try{c=await L$(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){La.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 B$(n,o),console.log("Backing up",n,"to",i),await(0,_l.move)(s,i,{overwrite:!0})}try{Au()}catch(n){La.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,_l.move)(i,s,{overwrite:!0}),await(0,_l.remove)((0,hS.join)(e,tc,`${n}-copy.mdb-lock`));try{Au()}catch(n){La.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){La.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,uw.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,_l.move)(o,i,{overwrite:!0})}catch(c){console.error(c)}}throw Au(),n}for(let[n,{backup_dest:s,record_count:i}]of t){let o=!0,c=await L$(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}`;La.error(l),console.error(l)}(0,lw.get)(U.STORAGE_COMPACTONSTARTKEEPBACKUP)===!0||o===!1||(console.log("Removing backup",s),await(0,_l.remove)(s))}}async function L$(e){let t=await(0,x$.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}async function B$(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,M$.open)(new v$.default(t)),c=o.openDB(mS.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=vE(),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 U$.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(mS.AUDIT_STORE_NAME,Cf);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 M$,hS,_l,lw,v$,U$,mS,x$,uw,La,fw=ye(()=>{Me();M$=require("lmdb"),hS=require("path"),_l=require("fs-extra"),lw=M(ue()),v$=M(Df()),U$=M(Pf()),mS=M(Ut());H();Zi();x$=M(co()),uw=M(It()),La=M(j());a(Uue,"compactOnStart");a(L$,"getTotalDBRecordCount");a(B$,"copyDb")});var ud=P((aDe,V$)=>{"use strict";var xue=require("minimist"),{isMainThread:hw,parentPort:Ah,threadId:sDe}=require("worker_threads"),nt=(H(),D($)),Di=j(),mw=oe(),ES=lS(),pS=gr(),iDe=Nt(),G$=It(),Js=Sh(),H$=Xu(),{compactOnStart:Bue}=(fw(),D(dw)),Hue=rc(),{restartWorkers:gS,onMessageByType:kue}=tt(),{handleHDBError:Fue,hdb_errors:Gue}=me(),{HTTP_STATUS_CODES:que}=Gue,Rh=ue(),{sendOperationToNode:k$,getThisNodeName:$ue,monitorNodeCAs:Vue}=(_s(),D(Aa)),{getHDBNodeTable:oDe}=(Xc(),D(IO));Rh.initSync();var Th=`Restarting HarperDB. This may take up to ${nt.RESTART_TIMEOUT_MS/1e3} seconds.`,Kue="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",F$="Clustering is not enabled so cannot be restarted",Yue="Invalid service",ld,Ss;V$.exports={restart:q$,restartService:pw};hw&&kue(nt.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await pw({service:e.workerType}):q$({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function q$(e){Ss=Object.keys(e).length===0,ld=await Js.isServiceRegistered(nt.PROCESS_DESCRIPTORS.HDB);let t=xue(process.argv);if(t.service){await pw(t);return}if(Ss&&!ld){console.error(Kue);return}if(Ss&&console.log(Th),ld){Js.enterPM2Mode(),Di.notify(Th);let r=Hue(Object.keys(nt.CONFIG_PARAM_MAP),!0);return mw.isEmptyOrZeroLength(Object.keys(r))||G$.updateConfigValue(void 0,void 0,r,!0,!0),Wue(),Th}return hw?(Di.notify(Th),Rh.get(nt.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await Bue(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{gS()},50)):Ah.postMessage({type:nt.ITC_EVENT_TYPES.RESTART}),Th}a(q$,"restart");async function pw(e){let{service:t}=e;if(nt.HDB_PROCESS_SERVICES[t]===void 0)throw Fue(new Error,Yue,que.BAD_REQUEST,void 0,void 0,!0);if(Js.expectedRestartOfChildren(),ld=await Js.isServiceRegistered(nt.PROCESS_DESCRIPTORS.HDB),!hw){e.replicated&&Vue(),Ah.postMessage({type:nt.ITC_EVENT_TYPES.RESTART,workerType:t}),Ah.ref(),await new Promise(s=>{Ah.on("message",i=>{i.type==="restart-complete"&&(s(),Ah.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===$ue())continue;let i;try{({job_id:i}=await k$(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 k$(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(!Rh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=F$;break}Ss&&console.log("Restarting clustering"),Di.notify("Restarting clustering"),await $$();break;case nt.HDB_PROCESS_SERVICES.clustering_config:case nt.HDB_PROCESS_SERVICES["clustering config"]:if(!Rh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=F$;break}Ss&&console.log("Restarting clustering_config"),Di.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(Ss&&!ld){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"),Di.notify("Restarting http_workers"),Ss?await Js.restart(nt.PROCESS_DESCRIPTORS.HDB):await gS("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(Di.error(r),Ss&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}a(pw,"restartService");async function Wue(){await $$(),await Js.restart(nt.PROCESS_DESCRIPTORS.HDB),await mw.async_set_timeout(2e3),Rh.get(nt.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await _w(),Ss&&(await pS.closeConnection(),process.exit(0))}a(Wue,"restartPM2Mode");async function $$(){if(!G$.getConfigFromFile(nt.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await H$.getHDBProcessInfo()).clustering.length===0)Di.trace("Clustering not running, restart will start clustering services"),await ES.generateNatsConfig(!0),await Js.startClusteringProcesses(),await Js.startClusteringThreads(),await _w(),Ss&&await pS.closeConnection();else{await ES.generateNatsConfig(!0),ld?(Di.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 H$.getHDBProcessInfo()).clustering.forEach(s=>{Di.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await mw.async_set_timeout(3e3),await _w(),await pS.updateLocalStreams(),Ss&&await pS.closeConnection(),Di.trace("Restart clustering restarting ingest and reply service threads");let t=gS(nt.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=gS(nt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}a($$,"restartClustering");async function _w(){await ES.removeNatsConfig(nt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await ES.removeNatsConfig(nt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}a(_w,"removeNatsConfig")});var tV=P((uDe,eV)=>{"use strict";var lDe=require("lodash"),On=(H(),D($)),{handleHDBError:K$,hdb_errors:zue}=me(),{HDB_ERROR_MSGS:Que,HTTP_STATUS_CODES:jue}=zue,Ew=j();eV.exports={getRolePermissions:Xue};var hl=Object.create(null),Jue=a(e=>({key:e,perms:{}}),"perms_template_obj"),Q$=a((e=!1)=>({describe:e,tables:{}}),"schema_perms_template"),j$=a((e=!1,t=!1,r=!1,n=!1)=>({[On.PERMS_CRUD_ENUM.READ]:e,[On.PERMS_CRUD_ENUM.INSERT]:t,[On.PERMS_CRUD_ENUM.UPDATE]:r,[On.PERMS_CRUD_ENUM.DELETE]:n}),"permissions_template"),gw=a((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...j$(t,r,n,s)}),"table_perms_template"),Y$=a((e,t=j$())=>({attribute_name:e,describe:Z$(t),[yh]:t[yh],[Sw]:t[Sw],[Tw]:t[Tw]}),"attr_perms_template"),W$=a((e,t=!1)=>({attribute_name:e,describe:t,[yh]:t}),"timestamp_attr_perms_template"),{READ:yh,INSERT:Sw,UPDATE:Tw}=On.PERMS_CRUD_ENUM,J$=Object.values(On.PERMS_CRUD_ENUM),X$=[yh,Sw,Tw];function Xue(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[On.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(hl[t]&&hl[t].key===n)return hl[t].perms;let s=Zue(e,r);return hl[t]?hl[t].key=n:hl[t]=Jue(n),hl[t].perms=s,s}catch(r){if(!e[On.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[On.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<On.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 Ew.error(n),Ew.debug(r),K$(new Error,Que.OUTDATED_PERMS_TRANSLATION_ERROR,jue.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.
27
- ${r.stack}`;throw Ew.error(n),K$(new Error)}}}a(Xue,"getRolePermissions");function Zue(e,t){let r=Object.create(null);r.super_user=!1;let n=e.permission;r[On.SYSTEM_SCHEMA_NAME]=n[On.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]=ede(t[i]);return}r[i]=Q$(),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=tde(c,l);r[i].describe||J$.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=gw()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=gw()})}),r}a(Zue,"translateRolePermissions");function ede(e){let t=Q$(!0);return Object.keys(e).forEach(r=>{t.tables[r]=gw(!0,!0,!0,!0,!0)}),t}a(ede,"createStructureUserPermissions");function tde(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 On.TIME_STAMP_NAMES.includes(d)&&(_=W$(d,f[yh])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=Y$(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=Z$(f),s.attribute_permissions.push(f),c||rde(f,l)}else if(u!==o){let f;On.TIME_STAMP_NAMES.includes(u)?f=W$(u):f=Y$(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=z$(s),s}else return e.describe=z$(e),e}a(tde,"getTableAttrPerms");function z$(e){return J$.filter(t=>e[t]).length>0}a(z$,"getSchemaTableDescribePerm");function Z$(e){return X$.filter(t=>e[t]).length>0}a(Z$,"getAttributeDescribePerm");function rde(e,t){X$.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(rde,"checkForHashPerms")});var bh={};Ue(bh,{authentication:()=>cV,bypassAuth:()=>ude,login:()=>fde,logout:()=>_de,start:()=>dde});function ude(){aV=!0}async function cV(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let h=e.isOperationsServer?ode?ide:[]:sde?nde:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let m=en.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 SS&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),SS&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(SS){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 rV.get(l);break}e.session=u||(u={})}let f=a((h,m,S)=>{let g=new dd.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===Ls.SUCCESS?Aw.notify(g):Aw.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&Aw.error("Authorization error:",e._nodeRequest.socket.authorizationError),e.mtlsConfig&&e.authorized&&e.peerCertificate.subject){let h=e.mtlsConfig.user;h!==null?((h===void 0||h==="Common Name"||h==="CN")&&(h=e.peerCertificate.subject.CN),e.user=await ze.getUser(h,null,e),f(h,Ls.SUCCESS,"mTLS")):(0,dd.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let d;if(!e.user)if(n){if(d=ml.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 iO(S)}catch(N){if(N.message==="invalid token")try{return await tg(S),c({status:-1})}catch{throw N}}break}}catch(E){return cde&&(ml.get(S)||(ml.set(S,S),f(g,Ls.FAILURE,m))),c({status:401,body:Xo({error:E.message},e)})}ml.set(n,d),ade&&f(d.username,Ls.SUCCESS,m)}e.user=d}else u?.user?e.user=await ze.getUser(u.user,null,e):(aV&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,sV.getSuperUser)());SS&&(e.session.update=function(h){let m=en.get(U.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,iV.v4)();let S=en.get(U.AUTHENTICATION_COOKIE_DOMAINS),g=m?new Date(Date.now()+(0,Rw.convertToMS)(m)).toUTCString():lde,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,rV.put(h,{expiresAt:m?Date.now()+(0,Rw.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 dde({server:e,port:t,securePort:r}){e.http(cV,t||r?{port:t,securePort:r}:{port:"all"}),nV||(nV=!0,setInterval(()=>{ml=new Map},en.get(U.AUTHENTICATION_CACHETTL)).unref(),oV.user.addListener(()=>{ml=new Map}))}async function fde(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 _de(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var sV,iV,en,dd,oV,Rw,Aw,nde,sde,ide,ode,rV,SS,aV,ade,cde,lde,ml,nV,TS=ye(()=>{sV=M($n());qr();zl();Cu();Me();iV=require("uuid"),en=M(ue());H();dd=M(j()),oV=M(l_());E_();Rw=M(oe());ji();Aw=(0,dd.loggerWithTag)("auth-event");en.initSync();nde=en.get(U.HTTP_CORSACCESSLIST),sde=en.get(U.HTTP_CORS),ide=en.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),ode=en.get(U.OPERATIONSAPI_NETWORK_CORS),rV=ut({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),SS=en.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,aV=process.env.AUTHENTICATION_AUTHORIZELOCAL??en.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,ade=en.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,cde=en.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,lde="Tue, 01 Oct 8307 19:33:20 GMT",ml=new Map;ze.onInvalidatedUser(()=>{ml=new Map});a(ude,"bypassAuth");a(cV,"authentication");a(dde,"start");a(fde,"login");a(_de,"logout")});var mV=P((TDe,hV)=>{"use strict";var Ne=require("joi"),lV=require("fs-extra"),uV=require("path"),Xn=rt(),dV=ue(),fV=(H(),D($)),_V=j(),{hdb_errors:hde}=me(),{HDB_ERROR_MSGS:tn}=hde,No=/^[a-zA-Z0-9-_]+$/,mde=/^[a-zA-Z0-9-_]+$/;hV.exports={getDropCustomFunctionValidator:Ede,setCustomFunctionValidator:gde,addComponentValidator:Rde,dropCustomFunctionProjectValidator:yde,packageComponentValidator:bde,deployComponentValidator:Ode,setComponentFileValidator:Sde,getComponentFileValidator:Ade,dropComponentFileValidator:Tde,addSSHKeyValidator:Nde,updateSSHKeyValidator:wde,deleteSSHKeyValidator:Ide,setSSHKnownHostsValidator:Cde};function AS(e,t,r){try{let n=dV.get(fV.CONFIG_PARAMS.COMPONENTSROOT),s=uV.join(n,t);return lV.existsSync(s)?e?t:r.message(tn.PROJECT_EXISTS):e?r.message(tn.NO_PROJECT):t}catch(n){return _V.error(n),r.message(tn.VALIDATION_ERR)}}a(AS,"checkProjectExists");function Oh(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(Oh,"checkFilePath");function pde(e,t,r,n){try{let s=dV.get(fV.CONFIG_PARAMS.COMPONENTSROOT),i=uV.join(s,e,t,r+".js");return lV.existsSync(i)?r:n.message(tn.NO_FILE)}catch(s){return _V.error(s),n.message(tn.VALIDATION_ERR)}}a(pde,"checkFileExists");function Ede(e){let t=Ne.object({project:Ne.string().pattern(No).custom(AS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(No).custom(pde.bind(null,e.project,e.type)).custom(Oh).required().messages({"string.pattern.base":tn.BAD_FILE_NAME})});return Xn.validateBySchema(e,t)}a(Ede,"getDropCustomFunctionValidator");function gde(e){let t=Ne.object({project:Ne.string().pattern(No).custom(AS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(Oh).required(),function_content:Ne.string().required()});return Xn.validateBySchema(e,t)}a(gde,"setCustomFunctionValidator");function Sde(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.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 Xn.validateBySchema(e,t)}a(Sde,"setComponentFileValidator");function Tde(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),file:Ne.string().custom(Oh).optional()});return Xn.validateBySchema(e,t)}a(Tde,"dropComponentFileValidator");function Ade(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 Xn.validateBySchema(e,t)}a(Ade,"getComponentFileValidator");function Rde(e){let t=Ne.object({project:Ne.string().pattern(No).custom(AS.bind(null,!1)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME})});return Xn.validateBySchema(e,t)}a(Rde,"addComponentValidator");function yde(e){let t=Ne.object({project:Ne.string().pattern(No).custom(AS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME})});return Xn.validateBySchema(e,t)}a(yde,"dropCustomFunctionProjectValidator");function bde(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return Xn.validateBySchema(e,t)}a(bde,"packageComponentValidator");function Ode(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),package:Ne.string().optional(),restart:Ne.alternatives().try(Ne.boolean(),Ne.string().valid("rolling")).optional()});return Xn.validateBySchema(e,t)}a(Ode,"deployComponentValidator");function Nde(e){let t=Ne.object({name:Ne.string().pattern(mde).required().messages({"string.pattern.base":tn.BAD_SSH_KEY_NAME}),key:Ne.string().required(),host:Ne.string().required(),hostname:Ne.string().required(),known_hosts:Ne.string().optional()});return Xn.validateBySchema(e,t)}a(Nde,"addSSHKeyValidator");function wde(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return Xn.validateBySchema(e,t)}a(wde,"updateSSHKeyValidator");function Ide(e){let t=Ne.object({name:Ne.string().required()});return Xn.validateBySchema(e,t)}a(Ide,"deleteSSHKeyValidator");function Cde(e){let t=Ne.object({known_hosts:Ne.string().required()});return Xn.validateBySchema(e,t)}a(Cde,"setSSHKnownHostsValidator")});var Ih=P((RDe,TV)=>{"use strict";var RS=require("joi"),Ma=require("path"),fd=require("fs-extra"),{exec:Pde,spawn:Dde}=require("child_process"),Lde=require("util"),Mde=Lde.promisify(Pde),_d=(H(),D($)),{PACKAGE_ROOT:vde}=pt(),{handleHDBError:Nh,hdb_errors:Ude}=me(),{HTTP_STATUS_CODES:wh}=Ude,pl=ue(),xde=rt(),va=j(),{once:Bde}=require("events");pl.initSync();var yw=pl.get(_d.CONFIG_PARAMS.COMPONENTSROOT),pV="npm install --force --omit=dev --json",Hde=`${pV} --dry-run`,kde=pl.get(_d.CONFIG_PARAMS.ROOTPATH),yS=Ma.join(kde,"ssh");TV.exports={installModules:$de,auditModules:Vde,installAllRootModules:Fde,uninstallRootModule:Gde,linkHarperdb:qde,runCommand:hd};async function Fde(e=!1,t=pl.get(_d.CONFIG_PARAMS.ROOTPATH)){await bS();let r=!1,n=process.env;fd.pathExistsSync(yS)&&fd.readdirSync(yS).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+Ma.join(yS,"config")+" -o UserKnownHostsFile="+Ma.join(yS,"known_hosts"),...process.env},r=!0)});try{let s=pl.get(_d.CONFIG_PARAMS.ROOTPATH),i=Ma.join(s,"node_modules","harperdb");fd.lstatSync(i).isSymbolicLink()&&fd.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&va.error("Error removing symlink:",s)}await hd(e?"npm install --force --ignore-scripts --no-bin-links":"npm install --force --no-bin-links",t,n)}a(Fde,"installAllRootModules");async function Gde(e){await hd(`npm uninstall ${e}`,pl.get(_d.CONFIG_PARAMS.ROOTPATH))}a(Gde,"uninstallRootModule");async function qde(){await bS(),await hd(`npm link ${vde}`,pl.get(_d.CONFIG_PARAMS.ROOTPATH))}a(qde,"linkHarperdb");async function hd(e,t=void 0,r=process.env){va.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=Dde(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();va.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();va.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await Bde(n,"close");if(o!==0)throw new Error(`Command \`${e}\` exited with code ${o}.${i===""?"":` Error: ${i}`}`);return s||void 0}a(hd,"runCommand");async function $de(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";va.warn(t,e.projects);let r=SV(e);if(r)throw Nh(r,r.message,wh.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?Hde:pV;await bS(),await gV(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=Ma.join(yw,u),d,_=null;try{let{stdout:h,stderr:m}=await Mde(i,{cwd:f});d=h?h.replace(`
27
+ ${r.stack}`;throw Ew.error(n),K$(new Error)}}}a(Xue,"getRolePermissions");function Zue(e,t){let r=Object.create(null);r.super_user=!1;let n=e.permission;r[On.SYSTEM_SCHEMA_NAME]=n[On.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]=ede(t[i]);return}r[i]=Q$(),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=tde(c,l);r[i].describe||J$.forEach(f=>{u[f]&&(r[i].describe=!0)}),r[i].tables[o]=u}else r[i].tables[o]=gw()})):Object.keys(t[i]).forEach(o=>{r[i].tables[o]=gw()})}),r}a(Zue,"translateRolePermissions");function ede(e){let t=Q$(!0);return Object.keys(e).forEach(r=>{t.tables[r]=gw(!0,!0,!0,!0,!0)}),t}a(ede,"createStructureUserPermissions");function tde(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 On.TIME_STAMP_NAMES.includes(d)&&(_=W$(d,f[yh])),u[d]=_,u},{}),o=t.primaryKey||t.hash_attribute,c=!!i[o],l=Y$(o);return t.attributes.forEach(({attribute:u})=>{if(i[u]){let f=i[u];f.describe=Z$(f),s.attribute_permissions.push(f),c||rde(f,l)}else if(u!==o){let f;On.TIME_STAMP_NAMES.includes(u)?f=W$(u):f=Y$(u),s.attribute_permissions.push(f)}}),c||s.attribute_permissions.push(l),s.describe=z$(s),s}else return e.describe=z$(e),e}a(tde,"getTableAttrPerms");function z$(e){return J$.filter(t=>e[t]).length>0}a(z$,"getSchemaTableDescribePerm");function Z$(e){return X$.filter(t=>e[t]).length>0}a(Z$,"getAttributeDescribePerm");function rde(e,t){X$.forEach(r=>{e[r]&&!t[r]&&(t[r]=!0,t.describe=!0)})}a(rde,"checkForHashPerms")});var bh={};Ue(bh,{authentication:()=>cV,bypassAuth:()=>ude,login:()=>fde,logout:()=>_de,start:()=>dde});function ude(){aV=!0}async function cV(e,t){let r=e.headers.asObject,n=r.authorization,s=r.cookie,i=r.origin,o=[];try{if(i){let h=e.isOperationsServer?ode?ide:[]:sde?nde:[];if(h.includes(i)||h.includes("*")){if(e.method==="OPTIONS"){let m=en.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 SS&&S.set("Access-Control-Allow-Credentials","true"),{status:200,headers:S}}o.push("Access-Control-Allow-Origin",i),SS&&o.push("Access-Control-Allow-Credentials","true")}}let l,u;if(SS){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 rV.get(l);break}e.session=u||(u={})}let f=a((h,m,S)=>{let g=new dd.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===Ls.SUCCESS?Aw.notify(g):Aw.error(g)},"authAuditLog");if(!e.authorized&&e.mtlsConfig&&e.peerCertificate.subject&&e?._nodeRequest?.socket?.authorizationError&&Aw.error("Authorization error:",e._nodeRequest.socket.authorizationError),e.mtlsConfig&&e.authorized&&e.peerCertificate.subject){let h=e.mtlsConfig.user;h!==null?((h===void 0||h==="Common Name"||h==="CN")&&(h=e.peerCertificate.subject.CN),e.user=await ze.getUser(h,null,e),f(h,Ls.SUCCESS,"mTLS")):(0,dd.debug)("HTTPS/WSS mTLS authorized connection (mTLS did not authorize a user)","from",e.ip)}let d;if(!e.user)if(n){if(d=ml.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 iO(S)}catch(N){if(N.message==="invalid token")try{return await tg(S),c({status:-1})}catch{throw N}}break}}catch(E){return cde&&(ml.get(S)||(ml.set(S,S),f(g,Ls.FAILURE,m))),c({status:401,body:Xo({error:E.message},e)})}ml.set(n,d),ade&&f(d.username,Ls.SUCCESS,m)}e.user=d}else u?.user?e.user=await ze.getUser(u.user,null,e):(aV&&(e.ip?.includes("127.0.0.")||e.ip=="::1")||e?._nodeRequest?.socket?.server?._pipeName&&e.ip===void 0)&&(e.user=await(0,sV.getSuperUser)());SS&&(e.session.update=function(h){let m=en.get(U.AUTHENTICATION_COOKIE_EXPIRES);if(!l){l=(0,iV.v4)();let S=en.get(U.AUTHENTICATION_COOKIE_DOMAINS),g=m?new Date(Date.now()+(0,Rw.convertToMS)(m)).toUTCString():lde,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,rV.put(h,{expiresAt:m?Date.now()+(0,Rw.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 dde({server:e,port:t,securePort:r}){e.http(cV,t||r?{port:t,securePort:r}:{port:"all"}),nV||(nV=!0,setInterval(()=>{ml=new Map},en.get(U.AUTHENTICATION_CACHETTL)).unref(),oV.user.addListener(()=>{ml=new Map}))}async function fde(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 _de(e){if(!e.baseRequest.session)throw new Error("No session for logout");return await e.baseRequest.session.update({user:null}),"Logout successful"}var sV,iV,en,dd,oV,Rw,Aw,nde,sde,ide,ode,rV,SS,aV,ade,cde,lde,ml,nV,TS=ye(()=>{sV=M($n());qr();zl();Cu();Me();iV=require("uuid"),en=M(ue());H();dd=M(j()),oV=M(l_());E_();Rw=M(oe());ji();Aw=(0,dd.loggerWithTag)("auth-event");en.initSync();nde=en.get(U.HTTP_CORSACCESSLIST),sde=en.get(U.HTTP_CORS),ide=en.get(U.OPERATIONSAPI_NETWORK_CORSACCESSLIST),ode=en.get(U.OPERATIONSAPI_NETWORK_CORS),rV=ut({table:"hdb_session",database:"system",attributes:[{name:"id",isPrimaryKey:!0},{name:"user"}]}),SS=en.get(U.AUTHENTICATION_ENABLESESSIONS)??!0,aV=process.env.AUTHENTICATION_AUTHORIZELOCAL??en.get(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE,ade=en.get(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)??!1,cde=en.get(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)??!1,lde="Tue, 01 Oct 8307 19:33:20 GMT",ml=new Map;ze.onInvalidatedUser(()=>{ml=new Map});a(ude,"bypassAuth");a(cV,"authentication");a(dde,"start");a(fde,"login");a(_de,"logout")});var mV=P((TDe,hV)=>{"use strict";var Ne=require("joi"),lV=require("fs-extra"),uV=require("path"),Xn=rt(),dV=ue(),fV=(H(),D($)),_V=j(),{hdb_errors:hde}=me(),{HDB_ERROR_MSGS:tn}=hde,No=/^[a-zA-Z0-9-_]+$/,mde=/^[a-zA-Z0-9-_]+$/;hV.exports={getDropCustomFunctionValidator:Ede,setCustomFunctionValidator:gde,addComponentValidator:Rde,dropCustomFunctionProjectValidator:yde,packageComponentValidator:bde,deployComponentValidator:Ode,setComponentFileValidator:Sde,getComponentFileValidator:Ade,dropComponentFileValidator:Tde,addSSHKeyValidator:Nde,updateSSHKeyValidator:wde,deleteSSHKeyValidator:Ide,setSSHKnownHostsValidator:Cde};function AS(e,t,r){try{let n=dV.get(fV.CONFIG_PARAMS.COMPONENTSROOT),s=uV.join(n,t);return lV.existsSync(s)?e?t:r.message(tn.PROJECT_EXISTS):e?r.message(tn.NO_PROJECT):t}catch(n){return _V.error(n),r.message(tn.VALIDATION_ERR)}}a(AS,"checkProjectExists");function Oh(e,t){return e.includes("..")?t.message("Invalid file path"):e}a(Oh,"checkFilePath");function pde(e,t,r,n){try{let s=dV.get(fV.CONFIG_PARAMS.COMPONENTSROOT),i=uV.join(s,e,t,r+".js");return lV.existsSync(i)?r:n.message(tn.NO_FILE)}catch(s){return _V.error(s),n.message(tn.VALIDATION_ERR)}}a(pde,"checkFileExists");function Ede(e){let t=Ne.object({project:Ne.string().pattern(No).custom(AS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().pattern(No).custom(pde.bind(null,e.project,e.type)).custom(Oh).required().messages({"string.pattern.base":tn.BAD_FILE_NAME})});return Xn.validateBySchema(e,t)}a(Ede,"getDropCustomFunctionValidator");function gde(e){let t=Ne.object({project:Ne.string().pattern(No).custom(AS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),type:Ne.string().valid("helpers","routes").required(),file:Ne.string().custom(Oh).required(),function_content:Ne.string().required()});return Xn.validateBySchema(e,t)}a(gde,"setCustomFunctionValidator");function Sde(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.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 Xn.validateBySchema(e,t)}a(Sde,"setComponentFileValidator");function Tde(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),file:Ne.string().custom(Oh).optional()});return Xn.validateBySchema(e,t)}a(Tde,"dropComponentFileValidator");function Ade(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 Xn.validateBySchema(e,t)}a(Ade,"getComponentFileValidator");function Rde(e){let t=Ne.object({project:Ne.string().pattern(No).custom(AS.bind(null,!1)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME})});return Xn.validateBySchema(e,t)}a(Rde,"addComponentValidator");function yde(e){let t=Ne.object({project:Ne.string().pattern(No).custom(AS.bind(null,!0)).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME})});return Xn.validateBySchema(e,t)}a(yde,"dropCustomFunctionProjectValidator");function bde(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),skip_node_modules:Ne.boolean(),skip_symlinks:Ne.boolean()});return Xn.validateBySchema(e,t)}a(bde,"packageComponentValidator");function Ode(e){let t=Ne.object({project:Ne.string().pattern(No).required().messages({"string.pattern.base":tn.BAD_PROJECT_NAME}),package:Ne.string().optional(),restart:Ne.alternatives().try(Ne.boolean(),Ne.string().valid("rolling")).optional()});return Xn.validateBySchema(e,t)}a(Ode,"deployComponentValidator");function Nde(e){let t=Ne.object({name:Ne.string().pattern(mde).required().messages({"string.pattern.base":tn.BAD_SSH_KEY_NAME}),key:Ne.string().required(),host:Ne.string().required(),hostname:Ne.string().required(),known_hosts:Ne.string().optional()});return Xn.validateBySchema(e,t)}a(Nde,"addSSHKeyValidator");function wde(e){let t=Ne.object({name:Ne.string().required(),key:Ne.string().required()});return Xn.validateBySchema(e,t)}a(wde,"updateSSHKeyValidator");function Ide(e){let t=Ne.object({name:Ne.string().required()});return Xn.validateBySchema(e,t)}a(Ide,"deleteSSHKeyValidator");function Cde(e){let t=Ne.object({known_hosts:Ne.string().required()});return Xn.validateBySchema(e,t)}a(Cde,"setSSHKnownHostsValidator")});var Ih=P((RDe,TV)=>{"use strict";var RS=require("joi"),Ma=require("path"),fd=require("fs-extra"),{exec:Pde,spawn:Dde}=require("child_process"),Lde=require("util"),Mde=Lde.promisify(Pde),_d=(H(),D($)),{PACKAGE_ROOT:vde}=pt(),{handleHDBError:Nh,hdb_errors:Ude}=me(),{HTTP_STATUS_CODES:wh}=Ude,pl=ue(),xde=rt(),va=j(),{once:Bde}=require("events");pl.initSync();var yw=pl.get(_d.CONFIG_PARAMS.COMPONENTSROOT),pV="npm install --force --omit=dev --json",Hde=`${pV} --dry-run`,kde=pl.get(_d.CONFIG_PARAMS.ROOTPATH),yS=Ma.join(kde,"ssh");TV.exports={installModules:$de,auditModules:Vde,installAllRootModules:Fde,uninstallRootModule:Gde,linkHarperdb:qde,runCommand:hd};async function Fde(e=!1,t=pl.get(_d.CONFIG_PARAMS.ROOTPATH)){await bS();let r=!1,n=process.env;fd.pathExistsSync(yS)&&fd.readdirSync(yS).forEach(s=>{s.includes(".key")&&!r&&(n={GIT_SSH_COMMAND:"ssh -F "+Ma.join(yS,"config")+" -o UserKnownHostsFile="+Ma.join(yS,"known_hosts"),...process.env},r=!0)});try{let s=pl.get(_d.CONFIG_PARAMS.ROOTPATH),i=Ma.join(s,"node_modules","harperdb");fd.lstatSync(i).isSymbolicLink()&&fd.unlinkSync(i)}catch(s){s.code!=="ENOENT"&&va.error("Error removing symlink:",s)}await hd(e?"npm install --force --ignore-scripts":"npm install --force",t,n)}a(Fde,"installAllRootModules");async function Gde(e){await hd(`npm uninstall ${e}`,pl.get(_d.CONFIG_PARAMS.ROOTPATH))}a(Gde,"uninstallRootModule");async function qde(){await bS(),await hd(`npm link ${vde}`,pl.get(_d.CONFIG_PARAMS.ROOTPATH))}a(qde,"linkHarperdb");async function hd(e,t=void 0,r=process.env){va.debug({tagName:"npm_run_command"},`running command: \`${e}\``);let n=Dde(e,{shell:!0,cwd:t,env:r,stdio:["ignore","pipe","pipe"]}),s="",i="";n.stdout.on("data",c=>{let l=c.toString();va.debug({tagName:"npm_run_command:stdout"},l),s+=l}),n.stderr.on("data",c=>{let l=c.toString();va.error({tagName:"npm_run_command:stderr"},l),i+=l});let[o]=await Bde(n,"close");if(o!==0)throw new Error(`Command \`${e}\` exited with code ${o}.${i===""?"":` Error: ${i}`}`);return s||void 0}a(hd,"runCommand");async function $de(e){let t="install_node_modules is deprecated. Dependencies are automatically installed on deploy, and install_node_modules can lead to inconsistent behavior";va.warn(t,e.projects);let r=SV(e);if(r)throw Nh(r,r.message,wh.BAD_REQUEST);let{projects:n,dry_run:s}=e,i=s===!0?Hde:pV;await bS(),await gV(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=Ma.join(yw,u),d,_=null;try{let{stdout:h,stderr:m}=await Mde(i,{cwd:f});d=h?h.replace(`
28
28
  `,""):null,_=m?m.replace(`
29
29
  `,""):null}catch(h){h.stderr?o[u].npm_error=EV(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 va.info(`finished installModules with response ${o}`),o.warning=t,o}a($de,"installModules");function EV(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(EV,"parseNPMStdErr");async function Vde(e){va.info(`starting auditModules for request: ${e}`);let t=SV(e);if(t)throw Nh(t,t.message,wh.BAD_REQUEST);let{projects:r}=e;await bS(),await gV(r);let n={};for(let s=0,i=r.length;s<i;s++){let o=r[s],c=Ma.join(yw,o);n[o]={npm_output:null,npm_error:null};try{let l=await hd("npm audit --json",c);n[o].npm_output=JSON.parse(l)}catch(l){n[o].npm_error=EV(l.stderr)}}return va.info(`finished auditModules with response ${n}`),n}a(Vde,"auditModules");async function bS(){return await hd("npm -v"),!0}a(bS,"checkNPMInstalled");async function gV(e){if(!Array.isArray(e)||e.length===0)throw Nh(new Error,"projects argument must be an array with at least 1 element",wh.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=Ma.join(yw,i.toString());if(!await fd.pathExists(o)){t.push(i);continue}let l=Ma.join(o,"package.json");await fd.pathExists(l)||r.push(i)}if(t.length>0)throw Nh(new Error,`Unable to install project dependencies: custom function projects '${t.join(",")}' does not exist.`,wh.BAD_REQUEST,void 0,void 0,!0);if(r.length>0)throw Nh(new Error,`Unable to install project dependencies: custom function projects '${r.join(",")}' do not have a package.json file.`,wh.BAD_REQUEST,void 0,void 0,!0)}a(gV,"checkProjectPaths");function SV(e){let t=RS.object({projects:RS.array().min(1).items(RS.string()).required(),dry_run:RS.boolean().default(!1)});return xde.validateBySchema(e,t)}a(SV,"modulesValidator")});var Ow=P((bDe,NV)=>{"use strict";var Ts=require("fs-extra"),Ph=require("path"),Ch=j(),AV=oe(),{PACKAGE_ROOT:Kde}=pt(),bw=(H(),D($)),OV=ue(),Yde=It();NV.exports=Wde;async function Wde(){let e=zde(),t=OV.get(bw.CONFIG_PARAMS.ROOTPATH),r=Ph.join(t,"package.json"),n={dependencies:{harperdb:"file:"+Kde}},s=Ph.join(t,"node_modules");Ts.ensureDirSync(s);let i,o=!0,c=!1;try{i=Ts.readJsonSync(r)}catch(l){if(AV.isEmptyOrZeroLength(e))return;if(l.code!==bw.NODE_ERROR_CODES.ENOENT)throw l;o=!1}if(!AV.isEmptyOrZeroLength(e)){for(let{name:l,package:u}of e){let f=yV(u);n.dependencies[l]=f+u}if(!o){Ch.notify("Installing components"),await bV(r,n,null),await RV(t,e);return}for(let{name:l,package:u}of e){let f=i.dependencies[l],d=yV(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(_){Ch.info(`Error checking ${u}/package.json modification time`,_);break}}}for(let l in i.dependencies)n.dependencies[l]===void 0&&(Ch.notify("Removing component",l),c=!0);c&&(Ch.notify("Updating components."),await bV(r,n,i),await RV(t,e))}a(Wde,"installComponents");function RV(e,t){return Promise.all(t.map(({name:r})=>{let n=Ph.join(e,"node_modules",r),s=Ph.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(RV,"moveModuleToComponents");function zde(){let e=Yde.getConfiguration(),t=[];for(let r in e)e[r]?.package&&t.push(Object.assign(e[r],{name:r}));return t}a(zde,"getComponentsConfig");function yV(e){return e.includes(":")?"":e.startsWith("@")||!e.startsWith("@")&&!e.includes("/")?"npm:":Ph.extname(e)||Ts.existsSync(e)?"file:":"github:"}a(yV,"getPkgPrefix");async function bV(e,t,r){Ch.trace("npm installing components package.json",t),Ts.writeFileSync(e,JSON.stringify(t,null," "));try{await Ih().installAllRootModules(OV.get(bw.CONFIG_PARAMS.IGNORE_SCRIPTS)===!0)}catch(n){throw r?Ts.writeFileSync(e,JSON.stringify(r,null," ")):Ts.unlinkSync(e),n}}a(bV,"installPackages")});var PV={};Ue(PV,{packageDirectory:()=>Qde});function Qde(e,t={skip_node_modules:!1,skip_symlinks:!1}){return new Promise((r,n)=>{let s=[];IV.default.pack(e,{dereference:!t.skip_symlinks,ignore:t.skip_node_modules?i=>i.includes("node_modules")||i.includes((0,wV.join)("cache","webpack")):void 0}).pipe((0,CV.createGzip)()).on("data",i=>s.push(i)).on("end",()=>{r(Buffer.concat(s))}).on("error",n)})}var wV,IV,CV,DV=ye(()=>{wV=require("path"),IV=M(require("tar-fs")),CV=require("node:zlib");a(Qde,"packageDirectory")});var Iw=P(UV=>{"use strict";var be=require("fs-extra"),Nw=require("fast-glob"),Ie=require("path"),jde=require("tar-fs"),Jde=require("gunzip-maybe"),ww=require("normalize-path"),Nn=mV(),xt=j(),ot=(H(),D($)),zt=ue(),OS=It(),Xde=oe(),{PACKAGE_ROOT:Zde}=pt(),{handleHDBError:Bt,hdb_errors:efe}=me(),{basename:tfe}=require("path"),rfe=Ow(),MV=ue(),{Readable:nfe}=require("stream"),{isMainThread:sfe}=require("worker_threads"),{HDB_ERROR_MSGS:El,HTTP_STATUS_CODES:Ht}=efe,vV=tt(),{replicateOperation:Xs}=(_s(),D(Aa)),{packageDirectory:ife}=(DV(),D(PV)),LV=Ih(),ofe=Ie.join(Zde,"application-template"),afe=zt.get(ot.CONFIG_PARAMS.ROOTPATH),Ua=Ie.join(afe,"ssh"),wo=Ie.join(Ua,"known_hosts");function cfe(){xt.trace("getting custom api status");let e={};try{e={port:zt.get(ot.CONFIG_PARAMS.HTTP_PORT),directory:zt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),is_enabled:!0}}catch(t){throw Bt(new Error,El.FUNCTION_STATUS,Ht.INTERNAL_SERVER_ERROR,xt.ERR,t)}return e}a(cfe,"customFunctionsStatus");function lfe(){xt.trace("getting custom api endpoints");let e={},t=zt.get(ot.CONFIG_PARAMS.COMPONENTSROOT);try{Nw.sync(ww(`${t}/*`),{onlyDirectories:!0}).forEach(n=>{let s=n.split("/").pop();e[s]={routes:Nw.sync(ww(`${n}/routes/*.js`)).map(i=>i.split("/").pop().split(".js")[0]),helpers:Nw.sync(ww(`${n}/helpers/*.js`)).map(i=>i.split("/").pop().split(".js")[0])}})}catch(r){throw Bt(new Error,El.GET_FUNCTIONS,Ht.INTERNAL_SERVER_ERROR,xt.ERR,r)}return e}a(lfe,"getCustomFunctions");function ufe(e){e.project&&(e.project=Ie.parse(e.project).name),e.file&&(e.file=Ie.parse(e.file).name);let t=Nn.getDropCustomFunctionValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);xt.trace("getting custom api endpoint file content");let r=zt.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,El.GET_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,c)}}a(ufe,"getCustomFunction");async function dfe(e){e.project&&(e.project=Ie.parse(e.project).name),e.file&&(e.file=Ie.parse(e.file).name);let t=Nn.setCustomFunctionValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);xt.trace("setting custom function file content");let r=zt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n,type:s,file:i,function_content:o}=e;try{be.outputFileSync(Ie.join(r,n,s,i+".js"),o);let c=await Xs(e);return c.message=`Successfully updated custom function: ${i}.js`,c}catch(c){throw Bt(new Error,El.SET_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,c)}}a(dfe,"setCustomFunction");async function ffe(e){e.project&&(e.project=Ie.parse(e.project).name),e.file&&(e.file=Ie.parse(e.file).name);let t=Nn.getDropCustomFunctionValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);xt.trace("dropping custom function file");let r=zt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n,type:s,file:i}=e;try{be.unlinkSync(Ie.join(r,n,s,i+".js"));let o=await Xs(e);return o.message=`Successfully deleted custom function: ${i}.js`,o}catch(o){throw Bt(new Error,El.DROP_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,o)}}a(ffe,"dropCustomFunction");async function _fe(e){e.project&&(e.project=Ie.parse(e.project).name);let t=Nn.addComponentValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);xt.trace("adding component");let r=zt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n}=e;try{let s=Ie.join(r,n);be.mkdirSync(s,{recursive:!0}),be.copySync(ofe,s);let i=await Xs(e);return i.message=`Successfully added project: ${n}`,i}catch(s){throw Bt(new Error,El.ADD_FUNCTION,Ht.INTERNAL_SERVER_ERROR,xt.ERR,s)}}a(_fe,"addComponent");async function hfe(e){e.project&&(e.project=Ie.parse(e.project).name);let t=Nn.dropCustomFunctionProjectValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);xt.trace("dropping custom function project");let r=zt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{project:n}=e,s=zt.get(ot.CONFIG_PARAMS.APPS);if(!Xde.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 OS.updateConfigValue(ot.CONFIG_PARAMS.APPS,s),`Successfully deleted project: ${n}`}try{let i=Ie.join(r,n);be.rmSync(i,{recursive:!0});let o=await Xs(e);return o.message=`Successfully deleted project: ${n}`,o}catch(i){throw Bt(new Error,El.DROP_FUNCTION_PROJECT,Ht.INTERNAL_SERVER_ERROR,xt.ERR,i)}}a(hfe,"dropCustomFunctionProject");async function mfe(e){e.project&&(e.project=Ie.parse(e.project).name);let t=Nn.packageComponentValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let r=zt.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(zt.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 ife(s,e)).toString("base64");return{project:n,payload:i}}a(mfe,"packageComponent");async function pfe(e){e.project?e.project=Ie.parse(e.project).name:e.package&&(e.project=Efe(e.package));let t=Nn.deployComponentValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let r=zt.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=nfe.from(s instanceof Buffer?s:Buffer.from(s,"base64"));await new Promise((E,T)=>{S.pipe(Jde()).pipe(jde.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 LV.runCommand(o,c):be.existsSync(R)||await LV.installAllRootModules(!1,c)}else{await OS.addConfig(n,{package:i}),await rfe();let S=MV.get(ot.CONFIG_PARAMS.ROOTPATH);c=Ie.join(S,"node_modules",n)}if(sfe)return;let l=new Map;l.isWorker=!0;let u=(Lh(),D(Dh)),f;u.setErrorReporter(S=>f=S);let d=tfe(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 Xs(e);if(e.restart===!0)vV.restartWorkers("http"),m.message=`Successfully deployed: ${n}, restarting HarperDB`;else if(h){let g=await Cw().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(pfe,"deployComponent");function Efe(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(Efe,"getProjectNameFromPackage");async function gfe(){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(zt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),{name:zt.get(ot.CONFIG_PARAMS.COMPONENTSROOT).split(Ie.sep).slice(-1).pop(),entries:[]}),n=(Lh(),D(Dh)).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(gfe,"getComponents");async function Sfe(e){let t=Nn.getComponentFileValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let n=OS.getConfigObj()[e.project]||e.project==="harperdb"?Ie.join(MV.get(ot.CONFIG_PARAMS.ROOTPATH),"node_modules"):zt.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(Sfe,"getComponentFile");async function Tfe(e){let t=Nn.setComponentFileValidator(e);if(t)throw Bt(t,t.message,Ht.BAD_REQUEST);let r=e.encoding?{encoding:e.encoding}:{encoding:"utf8"},n=Ie.join(zt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),e.project,e.file);e.payload!==void 0?(await be.ensureFile(n),await be.outputFile(n,e.payload,r)):await be.ensureDir(n);let s=await Xs(e);return s.message="Successfully set component: "+e.file,s}a(Tfe,"setComponentFile");async function Afe(e){let t=Nn.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(zt.get(ot.CONFIG_PARAMS.COMPONENTSROOT),s),o=Ie.join(zt.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(zt.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")}OS.deleteConfigFromFile([r]);let l=await Xs(e);return e.restart===!0?(vV.restartWorkers("http"),l.message=`Successfully dropped: ${s}, restarting HarperDB`):l.message=`Successfully dropped: ${s}`,l}a(Afe,"dropComponent");async function Rfe(e){let t=Nn.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(Ua,r+".key"),l=Ie.join(Ua,"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}