harperdb 4.6.24 → 4.6.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/lite.js CHANGED
@@ -35,7 +35,7 @@ Host ${s}
35
35
  IdentitiesOnly yes`;await Ie.pathExists(l)?await Ie.appendFile(l,`
36
36
  `+u):await Ie.outputFile(l,u);let d="";if(await Ie.pathExists(Zo)||(await Ie.writeFile(Zo,""),await Ie.chmod(Zo,"0600")),i=="github.com"&&!(await Ie.readFile(Zo,"utf8")).includes("github.com"))try{let _=(await(await fetch("https://api.github.com/meta")).json()).ssh_keys;for(let g of _)Ie.appendFile(Zo,"github.com "+g+`
37
37
  `)}catch{d=". Unable to get known hosts from github.com. Set your known hosts manually using set_ssh_known_hosts."}a&&await Ie.appendFile(Zo,a);let f=await Ti(e);return f.message=`Added ssh key: ${r}${d}`,f}o(A_e,"addSSHKey");async function b_e(e){let t=Hn.updateSSHKeyValidator(e);if(t)throw Qt(t,t.message,Jt.BAD_REQUEST);let{name:r,key:n}=e;jt.trace("updating ssh key",r);let s=Oe.join(fc,r+".key");if(!await Ie.pathExists(s))throw new Error("Key does not exist. Use add_ssh_key");await Ie.outputFile(s,n);let i=await Ti(e);return i.message=`Updated ssh key: ${r}`,i}o(b_e,"updateSSHKey");async function I_e(e){let t=Hn.deleteSSHKeyValidator(e);if(t)throw Qt(t,t.message,Jt.BAD_REQUEST);let{name:r}=e;jt.trace("deleting ssh key",r);let n=Oe.join(fc,r+".key"),s=Oe.join(fc,"config");if(!await Ie.pathExists(n))throw new Error("Key does not exist");let i=await Ie.readFile(s,"utf8"),a=new RegExp(`#${r}[\\S\\s]*?IdentitiesOnly yes`,"g");i=i.replace(a,""),await Ie.outputFile(s,i),Ie.removeSync(n);let c=await Ti(e);return c.message=`Deleted ssh key: ${r}`,c}o(I_e,"deleteSSHKey");async function N_e(e){let t=[];return await Ie.pathExists(fc)&&(await Ie.readdir(fc)).forEach(r=>{r!="known_hosts"&&r!="config"&&t.push({name:r.split(".")[0]})}),t}o(N_e,"listSSHKeys");async function w_e(e){let t=Hn.setSSHKnownHostsValidator(e);if(t)throw Qt(t,t.message,Jt.BAD_REQUEST);let{known_hosts:r}=e;await Ie.outputFile(Zo,r);let n=await Ti(e);return n.message="Known hosts successfully set",n}o(w_e,"setSSHKnownHosts");async function O_e(e){return await Ie.pathExists(Zo)?{known_hosts:await Ie.readFile(Zo,"utf8")}:{known_hosts:null}}o(O_e,"getSSHKnownHosts");ir.customFunctionsStatus=l_e;ir.getCustomFunctions=u_e;ir.getCustomFunction=d_e;ir.setCustomFunction=f_e;ir.dropCustomFunction=m_e;ir.addComponent=h_e;ir.dropCustomFunctionProject=p_e;ir.packageComponent=E_e;ir.deployComponent=__e;ir.getComponents=S_e;ir.getComponentFile=T_e;ir.setComponentFile=R_e;ir.dropComponent=y_e;ir.addSSHKey=A_e;ir.updateSSHKey=b_e;ir.deleteSSHKey=I_e;ir.listSSHKeys=N_e;ir.setSSHKnownHosts=w_e;ir.getSSHKnownHosts=O_e});var VC=M((j0e,aW)=>{"use strict";var Bs=require("joi"),oW=ut();aW.exports={readTransactionLogValidator:C_e,deleteTransactionLogsBeforeValidator:P_e};function C_e(e){let t=Bs.object({schema:Bs.string(),database:Bs.string(),table:Bs.string().required(),from:Bs.date().timestamp(),to:Bs.date().timestamp(),limit:Bs.number().min(1)});return oW.validateBySchema(e,t)}o(C_e,"readTransactionLogValidator");function P_e(e){let t=Bs.object({schema:Bs.string(),database:Bs.string(),table:Bs.string().required(),timestamp:Bs.date().timestamp().required()});return oW.validateBySchema(e,t)}o(P_e,"deleteTransactionLogsBeforeValidator")});var QT=M((J0e,mW)=>{"use strict";var KC=(k(),v(W)),Lp=mr(),cW=ie(),lW=oe(),uW=$i(),dW=Q(),{handleHDBError:zT,hdbErrors:L_e}=ge(),{HTTP_STATUS_CODES:jT}=L_e,{readTransactionLogValidator:D_e,deleteTransactionLogsBeforeValidator:M_e}=VC(),fW=Jn(),v_e="Logs successfully deleted from transaction log.",U_e="All logs successfully deleted from transaction log.";mW.exports={readTransactionLog:x_e,deleteTransactionLogsBefore:F_e};async function x_e(e){let t=D_e(e);if(t)throw zT(t,t.message,jT.BAD_REQUEST,void 0,void 0,!0);e.database=e.database??e.schema??"data";let r=cW.checkSchemaTableExist(e.database,e.table);if(r)throw zT(new Error,r,jT.NOT_FOUND,void 0,void 0,!0);return lW.get(KC.CONFIG_PARAMS.CLUSTERING_ENABLED)?await B_e(e):(dW.info("Reading HarperDB logs used by Plexus"),(e.from||e.to)&&(e.search_type="timestamp",e.search_values=[e.from??0],e.to&&(e.search_values[1]=e.to)),fW.readAuditLog(e))}o(x_e,"readTransactionLog");async function*B_e(e){let t=uW.createNatsTableStreamName(e.database,e.table),r=await Lp.viewStreamIterator(t,parseInt(e.from),e.limit);for await(let n of r){let s=Math.floor(n?.nats_timestamp/1e6);if(e.to&&s>e.to)break;let i={operation:n?.entry?.operation,user:n?.entry?.__origin?.user,timestamp:s,records:n?.entry?.records,attributes:n?.entry?.attributes};n?.entry?.operation===KC.OPERATIONS_ENUM.DELETE&&(i.hash_values=n?.entry?.hash_values),yield i}}o(B_e,"readTransactionLogNats");async function F_e(e){let t=M_e(e);if(t)throw zT(t,t.message,jT.BAD_REQUEST,void 0,void 0,!0);if(e.database=e.database??e.schema??"data",!lW.get(KC.CONFIG_PARAMS.CLUSTERING_ENABLED))return dW.info("Delete transaction logs called for Plexus"),fW.deleteAuditLogsBefore(e);let{database:r,table:n,timestamp:s}=e,i=cW.checkSchemaTableExist(r,n);if(i)throw zT(new Error,i,jT.NOT_FOUND,void 0,void 0,!0);let a=uW.createNatsTableStreamName(r,n),{jsm:c}=await Lp.getNATSReferences(),l=await Lp.getStreamInfo(a),u=new Date(l.state.first_ts).getTime();if(s<=u)return`No transactions exist before: ${s}`;let d=v_e,f,m=new Date(l.state.last_ts).getTime();return s>m?(f=l.state.last_seq+1,d=U_e):f=(await Lp.viewStream(a,parseInt(s),1))[0].nats_sequence,await Lp.purgeTableStream(r,n,{seq:f}),d}o(F_e,"deleteTransactionLogsBefore")});var jC={};we(jC,{describeMetric:()=>SW,describeMetricOp:()=>zC,get:()=>_W,getOp:()=>YC,listMetrics:()=>gW,listMetricsOp:()=>WC});async function k_e(e){return(await yg().get(e)).hostname}function hW(e,t){return e.length===0||e.includes(t)}function YC(e){return Dp.trace?.("get_analytics request:",e),_W(e.metric,e.get_attributes,e.start_time,e.end_time,e.conditions)}function EW(e){return"conditions"in e?{...e,conditions:e.conditions.map(EW)}:{attribute:e.search_attribute??e.attribute,comparator:e.search_type??e.comparator,value:e.search_value??e.value}}async function _W(e,t,r,n,s){let i=[{attribute:"metric",comparator:"equals",value:e}];s&&i.push(...s.map(EW));let a=t??[];hW(a,"id")||a.push("id"),r&&i.push({attribute:"id",comparator:"greater_than_equal",value:r}),n&&i.push({attribute:"id",comparator:"less_than",value:n});let c={conditions:i,allowConditionsOnDynamicAttributes:!0};return a.length>0&&(c.select=a),Dp.trace?.("get_analytics hdb_analytics.search request:",JSON.stringify(c)),(await databases.system.hdb_analytics.search(c)).map(async u=>{let d=u.id[1];return u.id=u.id[0],hW(a,"node")&&(Dp.trace?.(`get_analytics lookup hostname for nodeId: ${d}`),u.node=await k_e(d)),Dp.trace?.("get_analytics result:",JSON.stringify(u)),u})}function WC(e){return gW(e.metric_types,e.custom_metrics_window)}async function gW(e=["builtin"],t=H_e){let r=[],n=Object.values(vo);if(e.includes("builtin")&&(r=n),e.includes("custom")){let i=[{attribute:"id",comparator:"greater_than",value:Date.now()-t}],a=n.map(d=>({attribute:"metric",comparator:"not_equal",value:d}));i.push(...a);let c={select:["metric"],conditions:i},l=new Set,u=await databases.system.hdb_analytics.search(c);for await(let d of u)l.add(d.metric);r.push(...Array.from(l.values()))}return r}function zC(e){return SW(e.metric)}async function SW(e){let t={conditions:[{attribute:"metric",comparator:"equals",value:e}],sort:{attribute:"id",descending:!0},limit:1},r=databases.system.hdb_analytics.search(t),n=[{name:"node",type:"string"}];for await(let s of r){for(let a in s)n.push({name:a,type:typeof s[a]});let i={attributes:n};return Dp.trace?.("describe_metric result:",JSON.stringify(i)),i}return{}}var pW,H_e,Dp,QC=ce(()=>{pW=w(Q());cN();lN();H_e=1e3*60*60*24*7,Dp=(0,pW.forComponent)("analytics").conditional;o(k_e,"lookupHostname");o(hW,"isSelected");o(YC,"getOp");o(EW,"conformCondition");o(_W,"get");o(WC,"listMetricsOp");o(gW,"listMetrics");o(zC,"describeMetricOp");o(SW,"describeMetric")});var JT,XT,Mp,ZT=ce(()=>{JT={primary:{allowedValues:null},maintenance:{allowedValues:null},availability:{allowedValues:["Available","Unavailable"]}},XT=Object.keys(JT),Mp="primary"});function RW(e){return TW.validateBySchema(e,V_e)}var vp,TW,G_e,q_e,$_e,V_e,yW=ce(()=>{vp=w(require("joi")),TW=w(ut());ZT();G_e=XT,q_e=Object.entries(JT).reduce((e,[t,r])=>(r.allowedValues&&(e[t]=`Status "${t}" only accepts these values: ${r.allowedValues.join(", ")}`),e),{}),$_e=o(()=>{let e=vp.default.string().min(1).max(512);return Object.entries(JT).forEach(([t,r])=>{r.allowedValues&&(e=e.when("id",{is:t,then:vp.default.string().valid(...r.allowedValues).messages({"any.only":q_e[t]})}))}),e.required()},"createStatusValidationSchema"),V_e=vp.default.object({id:vp.default.string().valid(...G_e).required(),status:$_e()});o(RW,"validateStatus")});var tP={};we(tP,{DEFAULT_STATUS_ID:()=>Mp,STATUS_IDS:()=>XT,Status:()=>ea,clear:()=>XC,get:()=>ZC,set:()=>eP});function xp(){return JC||(JC=ze({database:"system",table:"hdb_status",replicate:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"status"},{name:"__createdtime__"},{name:"__updatedtime__"}]})),JC}function XC({id:e}){return Up.debug?.("clearStatus",e),xp().delete(e)}function Y_e(){return Up.debug?.("getAllStatus"),xp().get({})}function ZC({id:e}){return e?(Up.debug?.("getStatus",e),xp().get(e)):(Up.debug?.("getStatus","all"),Y_e())}function eP({status:e,id:t=Mp}){let r=RW({status:e,id:t});if(r)throw(0,eR.handleHDBError)(r,r.message,K_e.BAD_REQUEST);return Up.debug?.("setStatus",t,e),xp().put(t,{status:e})}var eR,AW,K_e,JC,ea,Up,Bp=ce(()=>{Me();eR=w(ge()),AW=w(ei());yW();ZT();ZT();({HTTP_STATUS_CODES:K_e}=eR.hdbErrors);o(xp,"getStatusTable");ea={get primaryStore(){return xp().primaryStore}},Up=(0,AW.loggerWithTag)("status");o(XC,"clearStatus");o(Y_e,"getAllStatus");o(ZC,"getStatus");o(eP,"setStatus")});var IW=M((pxe,bW)=>{"use strict";var rP=class{static{o(this,"PermissionTableResponseObject")}constructor(t,r,n=[],s=[]){this.schema=t,this.table=r,this.required_table_permissions=n,this.required_attribute_permissions=s}};bW.exports=rP});var wW=M((_xe,NW)=>{"use strict";var nP=class{static{o(this,"PermissionAttributeResponseObject")}constructor(t,r=[]){this.attribute_name=t,this.required_permissions=r}};NW.exports=nP});var iP=M((Sxe,CW)=>{"use strict";var OW=IW(),W_e=wW(),{HDB_ERROR_MSGS:z_e}=tn(),sP=class{static{o(this,"PermissionResponseObject")}constructor(){this.error=z_e.OP_AUTH_PERMS_ERROR,this.unauthorized_access={},this.invalid_schema_items=[]}handleUnauthorizedItem(t){return this.invalid_schema_items=[],this.unauthorized_access=[t],this}handleInvalidItem(t){return this.invalid_schema_items=[t],this.unauthorized_access=[],this}addInvalidItem(t,r,n){if(r&&n){let s=`${r}_${n}`;if(this.unauthorized_access[s])return}this.invalid_schema_items.push(t)}addUnauthorizedTable(t,r,n){let s=new OW(t,r,n),i=`${t}_${r}`;this.unauthorized_access[i]=s}addUnauthorizedAttributes(t,r,n,s){let i=[];t.forEach(c=>{let l=new W_e(c,s[c]);i.push(l)});let a=`${r}_${n}`;if(this.unauthorized_access[a])this.unauthorized_access[a].required_attribute_permissions=i;else{let c=new OW(r,n,[],i);this.unauthorized_access[a]=c}}getPermsResponse(){let t=Object.values(this.unauthorized_access);return t.length>0||this.invalid_schema_items.length>0?(this.unauthorized_access=t,this):null}};CW.exports=sP});var sR=M((Rxe,YW)=>{"use strict";var oP=Dn(),tR=sn(),Fs=ep(),kp=Ua(),aP=El(),j_e=uO(),Q_e=MV(),Gp=ts(),rR=Oh(),Nr=Q(),J_e=pO(),X_e=pT(),Z_e=qO(),ege=_T(),tge=KO(),rge=YO(),nge=jO(),sge=JO(),cP=yT(),ta=ie(),ige=dK(),lP=uC(),DW=sf(),gn=(k(),v(W)),MW=IY(),oge=$d(),vW=(Td(),v(vh)),UW=(qT(),v(Ap)),xW=wt(),Er=GC(),age=require("alasql"),BW=QT(),FW=wp(),uf=as(),HW=(Kd(),v(Vd)),uP=(QC(),v(jC)),dP=(Bp(),v(tP)),kW=iP(),{handleHDBError:kn,hdbErrors:GW}=ge(),{HDB_ERROR_MSGS:Jr,HTTP_STATUS_CODES:Fp}=GW,{cleanupOrphanBlobs:cge}=ep(),X=new Map,qW="delete",mc="insert",Hs="read",Jl="update",Hp="describe",PW=kp.describeSchema.name,LW=kp.describeTable.name,$W={delete:!0,deleteRecord:!0,update:!0,updateData:!0,dropAttribute:!0,dropTable:!0,dropSchema:!0,upsert:!0,upsertData:!0},lge={insert:!0,delete:!0,deleteRecord:!0,update:!0,updateData:!0,upsert:!0,upsertData:!0},uge="catchup",dge="handleGetJob",fge="handleGetJobsByStartDate",nR={CSV_DATA_LOAD:"csvDataLoad",CSV_URL_LOAD:"csvURLLoad",CSV_FILE_LOAD:"csvFileLoad",IMPORT_FROM_S3:"importFromS3"},mge=[Fs.createTable.name,Fs.createAttribute.name,Fs.dropTable.name,Fs.dropAttribute.name],VW={EXPORT_TO_S3:"export_to_s3",EXPORT_LOCAL:"export_local"},te=class{static{o(this,"permission")}constructor(t,r){this.requires_su=t,this.perms=r}};X.set(oP.insert.name,new te(!1,[mc]));X.set(oP.update.name,new te(!1,[Jl]));X.set(oP.upsert.name,new te(!1,[mc,Jl]));X.set(tR.searchByConditions.name,new te(!1,[Hs]));X.set(tR.searchByHash.name,new te(!1,[Hs]));X.set(tR.searchByValue.name,new te(!1,[Hs]));X.set(tR.search.name,new te(!1,[Hs]));X.set(Fs.createSchema.name,new te(!0,[]));X.set(Fs.createTable.name,new te(!0,[]));X.set(Fs.createAttribute.name,new te(!1,[mc]));X.set(Fs.dropSchema.name,new te(!0,[]));X.set(Fs.dropTable.name,new te(!0,[]));X.set(Fs.dropAttribute.name,new te(!0,[]));X.set(kp.describeSchema.name,new te(!1,[Hs]));X.set(kp.describeTable.name,new te(!1,[Hs]));X.set(aP.deleteRecord.name,new te(!1,[qW]));X.set(Gp.addUser.name,new te(!0,[]));X.set(Gp.alterUser.name,new te(!0,[]));X.set(Gp.dropUser.name,new te(!0,[]));X.set(Gp.listUsersExternal.name,new te(!0,[]));X.set(rR.listRoles.name,new te(!0,[]));X.set(rR.addRole.name,new te(!0,[]));X.set(rR.alterRole.name,new te(!0,[]));X.set(rR.dropRole.name,new te(!0,[]));X.set(J_e.name,new te(!0,[]));X.set(X_e.name,new te(!0,[]));X.set(Z_e.name,new te(!0,[]));X.set(ege.name,new te(!0,[]));X.set(tge.name,new te(!0,[]));X.set(rge.name,new te(!0,[]));X.set(cP.setRoutes.name,new te(!0,[]));X.set(cP.getRoutes.name,new te(!0,[]));X.set(cP.deleteRoutes.name,new te(!0,[]));X.set(xW.setConfiguration.name,new te(!0,[]));X.set(nge.clusterStatus.name,new te(!0,[]));X.set(sge.name,new te(!0,[]));X.set(lP.getFingerprint.name,new te(!0,[]));X.set(lP.setLicense.name,new te(!0,[]));X.set(aP.deleteFilesBefore.name,new te(!0,[]));X.set(aP.deleteAuditLogsBefore.name,new te(!0,[]));X.set(DW.restart.name,new te(!0,[]));X.set(DW.restartService.name,new te(!0,[]));X.set(j_e.name,new te(!0,[]));X.set(Q_e.name,new te(!0,[Hs]));X.set(cge.name,new te(!0,[]));X.set(oge.systemInformation.name,new te(!0,[]));X.set(xW.getConfiguration.name,new te(!0,[]));X.set(BW.readTransactionLog.name,new te(!0,[]));X.set(BW.deleteTransactionLogsBefore.name,new te(!0,[]));X.set(FW.installModules.name,new te(!0,[]));X.set(FW.auditModules.name,new te(!0,[]));X.set(uf.createCsr.name,new te(!0,[]));X.set(uf.signCertificate.name,new te(!0,[]));X.set(uf.listCertificates.name,new te(!0,[]));X.set(uf.addCertificate.name,new te(!0,[]));X.set(uf.removeCertificate.name,new te(!0,[]));X.set(uf.getKey.name,new te(!0,[]));X.set(HW.addNodeBack.name,new te(!0,[]));X.set(HW.removeNodeBack.name,new te(!0,[]));X.set(uP.getOp.name,new te(!1,[Hs]));X.set(uP.listMetricsOp.name,new te(!1,[Hs]));X.set(uP.describeMetricOp.name,new te(!1,[Hs]));X.set(dP.clear.name,new te(!0,[]));X.set(dP.get.name,new te(!0,[]));X.set(dP.set.name,new te(!0,[]));X.set(vW.createTokens.name,new te(!1,[]));X.set(vW.refreshOperationToken.name,new te(!1,[]));X.set(UW.login.name,new te(!1,[]));X.set(UW.logout.name,new te(!1,[]));X.set(Er.customFunctionsStatus.name,new te(!0,[]));X.set(Er.getCustomFunctions.name,new te(!0,[]));X.set(Er.getComponents.name,new te(!0,[]));X.set(Er.getComponentFile.name,new te(!0,[]));X.set(Er.setComponentFile.name,new te(!0,[]));X.set(Er.dropComponent.name,new te(!0,[]));X.set(Er.getCustomFunction.name,new te(!0,[]));X.set(Er.setCustomFunction.name,new te(!0,[]));X.set(Er.dropCustomFunction.name,new te(!0,[]));X.set(Er.addComponent.name,new te(!0,[]));X.set(Er.dropCustomFunctionProject.name,new te(!0,[]));X.set(Er.packageComponent.name,new te(!0,[]));X.set(Er.deployComponent.name,new te(!0,[]));X.set(Er.addSSHKey.name,new te(!0,[]));X.set(Er.updateSSHKey.name,new te(!0,[]));X.set(Er.deleteSSHKey.name,new te(!0,[]));X.set(Er.listSSHKeys.name,new te(!0,[]));X.set(Er.setSSHKnownHosts.name,new te(!0,[]));X.set(Er.getSSHKnownHosts.name,new te(!0,[]));X.set(lP.getRegistrationInfo.name,new te(!1,[]));X.set(Gp.userInfo.name,new te(!1,[]));X.set(kp.describeAll.name,new te(!1,[]));X.set(dge,new te(!1,[]));X.set(fge,new te(!0,[]));X.set(uge,new te(!0,[]));X.set(nR.CSV_DATA_LOAD,new te(!1,[mc,Jl]));X.set(nR.CSV_URL_LOAD,new te(!1,[mc,Jl]));X.set(nR.CSV_FILE_LOAD,new te(!1,[mc,Jl]));X.set(nR.IMPORT_FROM_S3,new te(!1,[mc,Jl]));X.set(VW.EXPORT_TO_S3,new te(!0,[]));X.set(VW.EXPORT_LOCAL,new te(!0,[]));X.set(gn.VALID_SQL_OPS_ENUM.DELETE,new te(!1,[qW]));X.set(gn.VALID_SQL_OPS_ENUM.SELECT,new te(!1,[Hs]));X.set(gn.VALID_SQL_OPS_ENUM.INSERT,new te(!1,[mc]));X.set(gn.VALID_SQL_OPS_ENUM.UPDATE,new te(!1,[Jl]));YW.exports={verifyPerms:pge,verifyPermsAst:hge,verifyBulkLoadAttributePerms:_ge};function hge(e,t,r){if(ta.isEmptyOrZeroLength(e))throw Nr.info("verify_perms_ast has an empty user parameter"),kn(new Error);if(ta.isEmptyOrZeroLength(t))throw Nr.info("verify_perms_ast has an empty user parameter"),kn(new Error);if(ta.isEmptyOrZeroLength(r))throw Nr.info("verify_perms_ast has a null operation parameter"),kn(new Error);try{let n=new kW,s=new ige(e),i=s.getSchemas(),a=new Map;if((!i||i.length===0)&&s.affected_attributes&&s.affected_attributes.size>0)throw Nr.info("No schemas defined in verifyPermsAst(), will not continue."),kn(new Error);let c=!!t.role.permission.super_user,l=i.includes("system");if(l&&$W[r])throw kn(new Error,Jr.DROP_SYSTEM,Fp.FORBIDDEN);if(c&&!l)return null;let u=MW.getRolePermissions(t.role);t.role.permission=u,!c&&e instanceof age.yy.Select&&(e=s.updateAttributeWildcardsForRolePerms(u));for(let f=0;f<i.length;f++){let m=s.getTablesBySchemaName(i[f]);m&&a.set(i[f],m)}let d=KW(t,r,a,n);return d||(a.forEach((f,m)=>{for(let h=0;h<f.length;h++){let p=s.getAttributesBySchemaTableName(m,f[h]),_=mP(t.role.permission,m,f[h]);fP(p,_,r,f[h],m,n)}}),n.getPermsResponse())}catch(n){throw kn(n)}}o(hge,"verifyPermsAst");function pge(e,t){if(e===null||t===null||e.hdb_user===void 0||e.hdb_user===null)throw Nr.info("null required parameter in verifyPerms"),kn(new Error,Jr.DEFAULT_INVALID_REQUEST,Fp.BAD_REQUEST);let r;t instanceof Function?r=t.name:r=t;let n=e.action,s=e.schema??e.database,i=e.table,a=new Map;s&&i&&a.set(s,[i]);let c=new kW;if(ta.isEmptyOrZeroLength(e.hdb_user?.role)||ta.isEmptyOrZeroLength(e.hdb_user?.role?.permission))return Nr.info(`User ${e.hdb_user?.username} has no role or permissions. Please assign the user a valid role.`),c.handleUnauthorizedItem(Jr.USER_HAS_NO_PERMS(e.hdb_user?.username));let l=!!e.hdb_user?.role?.permission?.super_user,u=e.hdb_user?.role?.permission?.structure_user,d=a.has(gn.SYSTEM_SCHEMA_NAME)||s===gn.SYSTEM_SCHEMA_NAME;if(l&&d&&lge[e.operation]&&(i===gn.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME||i===gn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||i===gn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME))return null;if(d&&$W[r])throw kn(new Error,Jr.DROP_SYSTEM,Fp.FORBIDDEN);if(l&&!d||u===!0&&(r===Fs.createSchema.name||r===Fs.dropSchema.name))return null;if(mge.indexOf(r)>=0&&(u===!0||Array.isArray(u)))return u===!0||u.indexOf(s)>=0?null:c.handleUnauthorizedItem(`User does not have access to perform '${e.operation}' against schema '${s}'`);let f=MW.getRolePermissions(e.hdb_user?.role);if(e.hdb_user?.role&&(e.hdb_user.role.permission=f),(r===PW||r===LW)&&!f.super_user){if(s===gn.SYSTEM_SCHEMA_NAME)return c.handleUnauthorizedItem(Jr.SCHEMA_PERM_ERROR(s));if(r===PW&&(!f[s]||!f[s][Hp]))return c.handleInvalidItem(Jr.SCHEMA_NOT_FOUND(s));if(r===LW&&(!f[s]||!f[s].tables[i]||!f[s].tables[i][Hp]))return c.handleInvalidItem(Jr.TABLE_NOT_FOUND(s,i))}let m=KW(e.hdb_user,r,a,c,n);if(m)return m;if(X.get(r)&&X.get(r).perms.length===0)return null;if(!l&&e.get_attributes&&gn.SEARCH_WILDCARDS.includes(e.get_attributes[0])){let _=[],g=f[s].tables[i];g[gn.PERMS_CRUD_ENUM.READ]&&(g.attribute_permissions.length>0?g.attribute_permissions.filter(T=>T[gn.PERMS_CRUD_ENUM.READ]).forEach(T=>{_.push(T.attribute_name)}):_=global.hdb_schema[s][i].attributes.map(R=>R.attribute),e.get_attributes=_)}let h=Ege(e),p=mP(e.hdb_user?.role?.permission,s,i);return fP(h,p,r,i,s,c,n),c.getPermsResponse()}o(pge,"verifyPerms");function KW(e,t,r,n,s){if(ta.arrayHasEmptyValues([e,t,r]))throw Nr.info("hasPermissions has an invalid parameter"),kn(new Error);let i=r.has("system"),a=e.role.permission;if(a.super_user&&(!i||X.get(t).requires_su))return null;if(!X.get(t))throw Nr.info(`operation ${t} not found.`),kn(new Error,Jr.OP_NOT_FOUND(t),Fp.BAD_REQUEST);if(X.get(t)&&X.get(t).requires_su)return Nr.info(`operation ${t} requires SU permissions.`),n.handleUnauthorizedItem(Jr.OP_IS_SU_ONLY(t));let c=r.keys();for(let l of c){try{if(l&&!a[l]||a[l][Hp]===!1){n.addInvalidItem(Jr.SCHEMA_NOT_FOUND(l));continue}}catch{n.addInvalidItem(Jr.SCHEMA_NOT_FOUND(l));continue}let u=r.get(l);for(let d of u){let f=a[l].tables[d];if(!f||f[Hp]===!1)n.addInvalidItem(Jr.TABLE_NOT_FOUND(l,d));else try{let m=[],h=X.get(t).perms;!ta.isEmpty(s)&&h.includes(s)&&(h=[s]);for(let p=0;p<h.length;p++){let _=h[p],g=f[_];(g==null||g===!1)&&(Nr.info(`Required ${_} permission not found for ${t} ${s?`${s} `:""}operation in role ${e.role.id}`),m.push(_))}m.length>0&&n.addUnauthorizedTable(l,d,m)}catch(m){let h=Jr.UNKNOWN_OP_AUTH_ERROR(t,l,d);throw Nr.error(h),Nr.error(m),kn(GW.CHECK_LOGS_WRAPPER(h))}}}return r.size<2?n.getPermsResponse():null}o(KW,"hasPermissions");function fP(e,t,r,n,s,i,a){if(!e||!t)throw Nr.info("no attributes specified in checkAttributePerms."),kn(new Error);let c=X.get(r).perms;if(!c||c==="")throw Nr.info(`no permissions found for ${r} in checkAttributePerms().`),kn(new Error);if(ta.isEmptyOrZeroLength(t))return Nr.info("No role permissions set (this is OK)."),null;a&&c.includes(a)&&(c=[a]);let l={};for(let d of e){let f=t.get(d);if(f){if(f[Hp]===!1){i.addInvalidItem(Jr.ATTR_NOT_FOUND(s,n,d),s,n);continue}if(c)for(let m of c){if(gn.TIME_STAMP_NAMES.includes(f.attribute_name)&&m!==Hs)throw kn(new Error,Jr.SYSTEM_TIMESTAMP_PERMS_ERR,Fp.FORBIDDEN);f[m]===!1&&(l[f.attribute_name]?l[f.attribute_name].push(m):l[f.attribute_name]=[m])}}else i.addInvalidItem(Jr.ATTR_NOT_FOUND(s,n,d),s,n)}let u=Object.keys(l);u.length>0&&i.addUnauthorizedAttributes(u,s,n,l)}o(fP,"checkAttributePerms");function Ege(e){let t=new Set;try{if(e.action)return t;if(e.operation===gn.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS&&e.conditions.forEach(r=>{t.add(r.search_attribute)}),e&&e.search_attribute&&t.add(e.search_attribute),!e.records||e.records.length===0){if(!e.get_attributes||!e.get_attributes.length===0)return t;for(let r=0;r<e.get_attributes.length;r++)t.add(e.get_attributes[r])}else for(let r=0;r<e.records.length;r++){let n=Object.keys(e.records[r]);for(let s=0;s<n.length;s++)t.add(n[s])}}catch(r){Nr.info(r)}return t}o(Ege,"getRecordAttributes");function mP(e,t,r){let n=new Map;if(ta.isEmpty(e))return Nr.info("no hdb_user specified in getAttributePermissions"),n;if(e.super_user||!t||!r)return n;try{e[t].tables[r].attribute_permissions.forEach(s=>{n.has(s.attribute_name)||n.set(s.attribute_name,s)})}catch{Nr.info(`No attribute permissions found for schema ${t} and table ${r}.`)}return n}o(mP,"getAttributePermissions");function _ge(e,t,r,n,s,i,a){let c=new Set(i),l=mP(e,n,s);fP(c,l,t,s,n,a,r)}o(_ge,"verifyBulkLoadAttributePerms")});var oR=M((Axe,JW)=>{"use strict";JW.exports={evaluateSQL:Pge,processAST:QW,convertSQLToAST:jW,checkASTPermissions:zW};var gge=Dn(),WW=require("util"),Sge=WW.callbackify(gge.insert),Tge=sn().search,Rge=bq().update,yge=WW.callbackify(Rge),Age=Nq().convertDelete,hc=require("alasql"),bge=sR(),iR=Q(),Ige=rg(),Nge=ie(),qp=(k(),v(W)),{hdbErrors:wge,handleHDBError:hP}=ge(),{HTTP_STATUS_CODES:pP}=wge;Ige(hc);var Oge=403,Cge="There was a problem performing this insert. Please check the logs and try again.",EP=class{static{o(this,"ParsedSQLObject")}constructor(){this.ast=void 0,this.variant=void 0,this.permissions_checked=!1}};function Pge(e,t){let r=e.parsed_sql_object;if(!r){r=jW(e.sql);let n,s=r.ast.statements[0];if(s instanceof hc.yy.Insert?n=s.into.databaseid:s instanceof hc.yy.Select?n=s.from?s.from[0].databaseid:null:s instanceof hc.yy.Update||s instanceof hc.yy.Delete?n=s.table.databaseid:iR.error("AST in evaluateSQL is not a valid SQL type."),!(s instanceof hc.yy.Select)&&Nge.isEmptyOrZeroLength(n))return t("No schema specified",null)}QW(e,r,(n,s)=>{if(n)return t(n);t(null,s)})}o(Pge,"evaluateSQL");function zW(e,t){let r;try{r=bge.verifyPermsAst(t.ast.statements[0],e.hdb_user,t.variant),t.permissions_checked=!0}catch(n){throw n}return r||null}o(zW,"checkASTPermissions");function jW(e){let t=new EP;if(!e)throw hP(new Error,"The 'sql' parameter is missing from the request body",pP.BAD_REQUEST);try{let r=e.trim(),n=hc.parse(r),s=r.split(" ")[0].toLowerCase();t.ast=n,t.variant=s}catch(r){let n=r.message.split(`
38
- `);throw n[1]?hP(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,pP.BAD_REQUEST):hP(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",pP.BAD_REQUEST)}return t}o(jW,"convertSQLToAST");function QW(e,t,r){try{let n=Lge;if(!e.bypass_auth&&!t.permissions_checked){let i=zW(e,t);if(i&&i.length>0)return r(Oge,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case qp.VALID_SQL_OPS_ENUM.SELECT:n=Tge,s=t.ast.statements[0];break;case qp.VALID_SQL_OPS_ENUM.INSERT:n=Dge;break;case qp.VALID_SQL_OPS_ENUM.UPDATE:n=yge;break;case qp.VALID_SQL_OPS_ENUM.DELETE:n=Age;break;default:throw new Error(`unsupported SQL type ${t.variant} in SQL: ${e}`)}n(s,(i,a)=>{if(i){r(i);return}r(null,a)})}catch(n){return r(n)}}o(QW,"processAST");function Lge(e,t){iR.info(e),t("unknown sql statement")}o(Lge,"nullFunction");function Dge({statement:e,hdb_user:t},r){let n=e.into,s={schema:n.databaseid,table:n.tableid,operation:"insert",hdb_user:t},i=e.columns.map(a=>a.columnid);try{s.records=Mge(i,e.values)}catch(a){return r(a)}Sge(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){iR.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(Dge,"convertInsert");function Mge(e,t){try{return t.map(r=>{if(e.length!==r.length)throw"number of values do not match number of columns in insert";let n={};return r.forEach((s,i)=>{if(s.columnid)throw"cannot use a column in insert value";"value"in s?n[e[i]]=s.value:n[e[i]]=hc.compile(`SELECT ${s.toString()} AS [${qp.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw iR.error(r),new Error(Cge)}}o(Mge,"createDataObjects")});var yP=M((wxe,tz)=>{var uR=require("clone"),dR=ut(),vge=ie(),cR=(k(),v(W)),Ixe=Q(),_P=require("fs"),SP=require("joi"),{string:lR}=SP.types(),{hdbErrors:Uge,handleHDBError:aR}=ge(),{HDB_ERROR_MSGS:Nxe,HTTP_STATUS_CODES:gP}=Uge,{commonValidators:df}=Hi(),XW=" is required",xge=["insert","update","upsert"],TP={database:{presence:!1,format:df.schema_format,length:df.schema_length},schema:{presence:!1,format:df.schema_format,length:df.schema_length},table:{presence:!0,format:df.schema_format,length:df.schema_length},action:{inclusion:{within:xge,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},Bge={schema:lR.required(),table:lR.required(),action:lR.valid("insert","update","upsert")},{AWS_ACCESS_KEY:Fge,AWS_SECRET:Hge,AWS_BUCKET:kge,AWS_FILE_KEY:Gge,REGION:qge}=cR.S3_BUCKET_AUTH_KEYS,$ge={s3:{presence:!0},[`s3.${Fge}`]:{presence:!0,type:"String"},[`s3.${Hge}`]:{presence:!0,type:"String"},[`s3.${kge}`]:{presence:!0,type:"String"},[`s3.${Gge}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${qge}`]:{presence:!0,type:"String"}},ZW=uR(TP);ZW.data.presence={message:XW};var ez=uR(TP);ez.file_path.presence={message:XW};var Vge=Object.assign(uR(TP),$ge),RP=uR(Bge);RP.csv_url=lR.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();RP.passthrough_headers=SP.object();function Kge(e){let t=dR.validateObject(e,ZW);return fR(e,t)}o(Kge,"dataObject");function Yge(e){let t=dR.validateBySchema(e,SP.object(RP));return fR(e,t)}o(Yge,"urlObject");function Wge(e){let t=dR.validateObject(e,ez);return fR(e,t)}o(Wge,"fileObject");function zge(e){let t=dR.validateObject(e,Vge);return fR(e,t)}o(zge,"s3FileObject");function fR(e,t){if(!t){let r=vge.checkGlobalSchemaTable(e.schema,e.table);if(r)return aR(new Error,r,gP.BAD_REQUEST);if(e.operation===cR.OPERATIONS_ENUM.CSV_FILE_LOAD)try{_P.accessSync(e.file_path,_P.constants.R_OK|_P.constants.F_OK)}catch(n){return n.code===cR.NODE_ERROR_CODES.ENOENT?aR(n,`No such file or directory ${n.path}`,gP.BAD_REQUEST):n.code===cR.NODE_ERROR_CODES.EACCES?aR(n,`Permission denied ${n.path}`,gP.BAD_REQUEST):aR(n)}}return t}o(fR,"postValidateChecks");tz.exports={dataObject:Kge,urlObject:Yge,fileObject:Wge,s3FileObject:zge}});var AP=M((Cxe,rz)=>{"use strict";var $p=Q(),mR=(k(),v(W));async function jge(e,t,r,n=void 0){if(!e||typeof e!="function")throw new Error("Invalid function parameter");let s;try{return s=await e(t),r&&await r(t,s,n),t.operation===mR.OPERATIONS_ENUM.INSERT||t.operation===mR.OPERATIONS_ENUM.UPDATE||t.operation===mR.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===mR.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?($p.info(i.message),i):i.http_resp_msg?($p.error(`Error calling operation: ${e.name}`),$p.error(i.http_resp_msg),i):($p.error(`Error calling operation: ${e.name}`),$p.error(i),i)}}o(jge,"callOperationFunctionAsAwait");rz.exports={callOperationFunctionAsAwait:jge}});var bP=M((Lxe,sz)=>{"use strict";var{S3:Qge,GetObjectCommand:Jge}=require("@aws-sdk/client-s3");sz.exports={getFileStreamFromS3:Xge,getS3AuthObj:nz};async function Xge(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await nz(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new Jge(r))).Body}o(Xge,"getFileStreamFromS3");function nz(e,t,r){return new Qge({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(nz,"getS3AuthObj")});var oz=M((Mxe,iz)=>{"use strict";var IP=class{static{o(this,"BulkLoadFileObject")}constructor(t,r,n,s,i,a,c=null){this.op=t,this.action=r,this.schema=n,this.table=s,this.file_path=i,this.file_type=a,this.role_perms=c}},NP=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};iz.exports={BulkLoadFileObject:IP,BulkLoadDataObject:NP}});var OP=M((Uxe,az)=>{"use strict";var wP=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};az.exports=wP});var vP=M((Gxe,bz)=>{"use strict";var hR=Dn(),ER=yP(),Zge=require("needle"),Ri=(k(),v(W)),Bxe=Ot(),ff=ie(),{handleHDBError:Xt,hdbErrors:Ez}=ge(),{HTTP_STATUS_CODES:Xr,HDB_ERROR_MSGS:wr,CHECK_LOGS_WRAPPER:Zl}=Ez,mf=Q(),CP=require("papaparse");ff.promisifyPapaParse();var yi=require("fs-extra"),eSe=require("path"),{chain:cz}=require("stream-chain"),lz=require("stream-json/streamers/StreamArray"),uz=require("stream-json/utils/Batch"),dz=require("stream-chain/utils/comp"),{finished:fz}=require("stream"),tSe=oe(),_z=AP(),rSe=bP(),{BulkLoadFileObject:LP,BulkLoadDataObject:nSe}=oz(),DP=iP(),{verifyBulkLoadAttributePerms:gz}=sR(),Fxe=OP(),Hxe=mr(),kxe=$i(),{databases:sSe}=(Me(),v(Et)),{coerceType:iSe}=(w_(),v(uk)),mz="No records parsed from csv file.",Xl=`${tSe.get("HDB_ROOT")}/tmp`,{schemaRegex:oSe}=Hi(),hz=1024*1024*2,pz=5e3,aSe={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};bz.exports={csvDataLoad:cSe,csvURLLoad:lSe,csvFileLoad:uSe,importFromS3:dSe};async function cSe(e,t){let r=ER.dataObject(e);if(r)throw Xt(r,r.message,Xr.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=Rz(e.schema,e.table),i=CP.parse(e.data,{header:!0,skipEmptyLines:!0,transform:PP.bind(null,s),dynamicTyping:!1}),a=new DP;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&gz(e.hdb_user?.role?.permission,this.job_operation_function.name,e.action,e.schema,e.table,i.meta.fields,a);let c=a.getPermsResponse();if(c)throw Xt(new Error,c,Xr.BAD_REQUEST,void 0,void 0,!0);let l=new nSe(e.action,e.schema,e.table,i.data);return n=await _z.callOperationFunctionAsAwait(yz,l,null),n.message===mz?mz:Az(n.records,n.number_written)}catch(s){throw eu(s)}}o(cSe,"csvDataLoad");async function lSe(e){let t=ER.urlObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${Xl}/${r}`;try{await fSe(e,r)}catch(s){throw mf.error(wr.DOWNLOAD_FILE_ERR(r)+" - "+s),Xt(s,Zl(wr.DOWNLOAD_FILE_ERR(r)))}try{let s=new LP(this.job_operation_function.name,e.action,e.schema,e.table,n,Ri.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await MP(s);return await pR(n),i}catch(s){throw await pR(n),eu(s)}}o(lSe,"csvURLLoad");async function uSe(e){let t=ER.fileObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=new LP(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Ri.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await MP(r)}catch(n){throw eu(n)}}o(uSe,"csvFileLoad");async function dSe(e){let t=ER.s3FileObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=eSe.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${Xl}/${s}`;let i=new LP(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await mSe(s,e);let a=await MP(i);return await pR(r),a}catch(n){throw await pR(r),eu(n)}}o(dSe,"importFromS3");async function fSe(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await Zge("get",e.csv_url,n)}catch(n){let s=`Error downloading CSV file from ${e.csv_url}, status code: ${n.statusCode}. Check the log for more information.`;throw Xt(n,s,n.statusCode,Ri.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}pSe(r,e.csv_url),await hSe(t,r.raw)}o(fSe,"downloadCSVFile");async function mSe(e,t){try{let r=`${Xl}/${e}`;await yi.mkdirp(Xl),await yi.writeFile(`${Xl}/${e}`,"",{flag:"a+"});let n=await yi.createWriteStream(r),s=await rSe.getFileStreamFromS3(t);await new Promise((i,a)=>{s.on("error",function(c){a(c)}),s.pipe(n).on("error",function(c){a(c)}).on("close",function(){mf.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw mf.error(wr.S3_DOWNLOAD_ERR+" - "+r),Xt(r,Zl(wr.S3_DOWNLOAD_ERR))}}o(mSe,"downloadFileFromS3");async function hSe(e,t){try{await yi.mkdirp(Xl),await yi.writeFile(`${Xl}/${e}`,t)}catch(r){throw mf.error(wr.WRITE_TEMP_FILE_ERR),Xt(r,Zl(wr.DEFAULT_BULK_LOAD_ERR))}}o(hSe,"writeFileToTempFolder");async function pR(e){if(e)try{await yi.access(e),await yi.unlink(e)}catch{mf.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(pR,"deleteTempFile");function pSe(e,t){if(e.statusCode!==Ez.HTTP_STATUS_CODES.OK)throw Xt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,Xr.BAD_REQUEST);if(!aSe[e.headers["content-type"]])throw Xt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,Xr.BAD_REQUEST);if(!e.raw)throw Xt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,Xr.BAD_REQUEST)}o(pSe,"validateURLResponse");async function MP(e){try{let t;switch(e.file_type){case Ri.VALID_S3_FILE_TYPES.CSV:t=await ESe(e);break;case Ri.VALID_S3_FILE_TYPES.JSON:t=await _Se(e);break;default:throw Xt(new Error,wr.DEFAULT_BULK_LOAD_ERR,Xr.BAD_REQUEST,Ri.LOG_LEVELS.ERROR,wr.INVALID_FILE_EXT_ERR(e))}return Az(t.records,t.number_written)}catch(t){throw eu(t)}}o(MP,"fileLoad");async function Sz(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;s&&s.pause();let a={operation:e.action,schema:e.schema,table:e.table,records:i};try{let{attributes:c}=await hR.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&gz(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=Xt(c);r(l)}}o(Sz,"validateChunk");async function Tz(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;ff.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!ff.isEmpty(c)&&!ff.isEmpty(c.__parsed_extra)&&delete c.__parsed_extra});else{let c=new Set;i.forEach(l=>{Object.keys(l).forEach(u=>c.add(u))}),a=[...c]}try{let c={schema:e.schema,table:e.table,action:e.action,data:i},l=await _z.callOperationFunctionAsAwait(yz,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=Xt(c,Zl(wr.INSERT_CSV_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,wr.INSERT_CSV_ERR+" - "+c);r(l)}}o(Tz,"insertChunk");async function ESe(e){let t={records:0,number_written:0},r=Rz(e.schema,e.table);try{let n=new DP,s=yi.createReadStream(e.file_path,{highWaterMark:hz});s.setEncoding("utf8"),await CP.parsePromise(s,Sz.bind(null,e,n),PP.bind(null,r));let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Xr.BAD_REQUEST);return s=yi.createReadStream(e.file_path,{highWaterMark:hz}),s.setEncoding("utf8"),await CP.parsePromise(s,Tz.bind(null,e,t),PP.bind(null,r)),s.destroy(),t}catch(n){throw Xt(n,Zl(wr.PAPA_PARSE_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,wr.PAPA_PARSE_ERR+n)}}o(ESe,"callPapaParse");function Rz(e,t){let r=sSe[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>iSe(i,s));return n}o(Rz,"createTransformMap");function PP(e,t,r){let n=e.get(r);return n?n(t):ff.autoCast(t)}o(PP,"typeFunction");async function _Se(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new DP,s=cz([yi.createReadStream(e.file_path,{encoding:"utf-8"}),lz.withParser(),c=>c.value,new uz({batchSize:pz}),dz(async c=>{await Sz(e,n,r,c)})]);await new Promise((c,l)=>{fz(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Xr.BAD_REQUEST);let a=cz([yi.createReadStream(e.file_path,{encoding:"utf-8"}),lz.withParser(),c=>c.value,new uz({batchSize:pz}),dz(async c=>{await Tz(e,t,r,c)})]);return await new Promise((c,l)=>{fz(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw Xt(n,Zl(wr.INSERT_JSON_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,wr.INSERT_JSON_ERR+n)}}o(_Se,"insertJson");async function yz(e){let t={};try{e.data&&e.data.length>0&&gSe(e.data[0])?t=await SSe(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",mf.info(t.message))}catch(r){throw eu(r)}return t}o(yz,"callBulkFileLoad");function gSe(e){let t=Object.keys(e);for(let r of t)if(!oSe.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(gSe,"validateColumnNames");async function SSe(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=hR.insert;break;case"update":i=hR.update;break;case"upsert":i=hR.upsert;break;default:throw Xt(new Error,wr.INVALID_ACTION_PARAM_ERR(n),Xr.BAD_REQUEST,Ri.LOG_LEVELS.ERROR,wr.INVALID_ACTION_PARAM_ERR(n))}try{let a=await i(s),c;switch(n){case"insert":c=a.inserted_hashes;break;case"update":c=a.update_hashes;break;case"upsert":c=a.upserted_hashes;break;default:break}if(Array.isArray(a.skipped_hashes)&&a.skipped_hashes.length>0){let d=global.hdb_schema[t][r].hash_attribute,f=e.length;for(;f--;)a.skipped_hashes.indexOf(e[f][d])>=0&&e.splice(f,1)}let l=ff.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw eu(a)}}o(SSe,"bulkFileLoad");function Az(e,t){return`successfully loaded ${t} of ${e} records`}o(Az,"buildResponseMsg");function eu(e){return Xt(e,Zl(wr.DEFAULT_BULK_LOAD_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,wr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(eu,"buildTopLevelErrMsg")});var BP=M(($xe,Dz)=>{"use strict";var xP=sn(),TSe=bP(),{AsyncParser:RSe}=require("json2csv"),_R=require("stream"),fs=ie(),UP=require("fs-extra"),ySe=require("path"),ks=Q(),{promisify:wz}=require("util"),Vp=ie(),{handleHDBError:_r,hdbErrors:ASe}=ge(),{HDB_ERROR_MSGS:Gn,HTTP_STATUS_CODES:gr}=ASe,{streamAsJSON:bSe}=(EA(),v(fv)),{Upload:ISe}=require("@aws-sdk/lib-storage"),{toCsvStream:NSe}=(Ro(),v(yv)),Iz=["search_by_value","search_by_hash","sql","search_by_conditions"],Nz=["json","csv"],Oz="json",Cz="csv",wSe="Successfully exported JSON locally.",OSe="Successfully exported CSV locally.",CSe=1e3,PSe=xP.searchByHash,LSe=xP.searchByValue,DSe=wz(_R.finished);Dz.exports={export_to_s3:xSe,export_local:MSe};async function MSe(e){ks.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=Pz(e);if(!fs.isEmpty(t))throw ks.error(t),_r(new Error,t,gr.BAD_REQUEST,void 0,void 0,!0);if(fs.isEmpty(e.path))throw ks.error(Gn.MISSING_VALUE("path")),_r(new Error,Gn.MISSING_VALUE("path"),gr.BAD_REQUEST,void 0,void 0,!0);let r=(fs.isEmpty(e.filename)?new Date().getTime():e.filename)+"."+e.format;e.path.endsWith(ySe.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=fs.buildFolderPath(e.path,r);await vSe(e.path);let s=await Lz(e);return await USe(n,e.format,s)}o(MSe,"export_local");async function vSe(e){if(ks.trace("in confirmPath"),fs.isEmptyOrZeroLength(e))throw _r(new Error,`Invalid path: ${e}`,gr.BAD_REQUEST,void 0,void 0,!0);let t;try{t=await UP.stat(e)}catch(r){let n;throw r.code==="ENOENT"?n=`path '${e}' does not exist`:r.code==="EACCES"?n=`access to path '${e}' is denied`:n=r.message,ks.error(n),_r(new Error,n,gr.BAD_REQUEST,void 0,void 0,!0)}if(!t.isDirectory()){let r=`path '${e}' is not a directory, please supply a valid folder path`;throw ks.error(r),_r(new Error,r,gr.BAD_REQUEST,void 0,void 0,!0)}return!0}o(vSe,"confirmPath");async function USe(e,t,r){if(ks.trace("in saveToLocal"),Vp.isEmptyOrZeroLength(e))throw _r(new Error,Gn.INVALID_VALUE("file_path"),gr.BAD_REQUEST,void 0,void 0,!0);if(Vp.isEmptyOrZeroLength(t))throw _r(new Error,Gn.INVALID_VALUE("Source format"),gr.BAD_REQUEST,void 0,void 0,!0);if(Vp.isEmpty(r))throw _r(new Error,Gn.NOT_FOUND("Data"),gr.BAD_REQUEST,void 0,void 0,!0);if(t===Oz){let n=UP.createWriteStream(e);return bSe(r).pipe(n),await DSe(n),{message:wSe,path:e}}else if(t===Cz){let n=UP.createWriteStream(e),s=_R.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new RSe(i,c).fromInput(s).toOutput(n).promise(!1),{message:OSe,path:e}}throw _r(new Error,Gn.INVALID_VALUE("format"),gr.BAD_REQUEST)}o(USe,"saveToLocal");async function xSe(e){if(!e.s3||Object.keys(e.s3).length===0)throw _r(new Error,Gn.MISSING_VALUE("S3 object"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.aws_access_key_id))throw _r(new Error,Gn.MISSING_VALUE("aws_access_key_id"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.aws_secret_access_key))throw _r(new Error,Gn.MISSING_VALUE("aws_secret_access_key"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.bucket))throw _r(new Error,Gn.MISSING_VALUE("bucket"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.key))throw _r(new Error,Gn.MISSING_VALUE("key"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.region))throw _r(new Error,Gn.MISSING_VALUE("region"),gr.BAD_REQUEST);let t=Pz(e);if(!fs.isEmpty(t))throw _r(new Error,t,gr.BAD_REQUEST);ks.trace(`called export_to_s3 to bucket: ${e.s3.bucket} and query ${e.search_operation.sql}`);let r;try{r=await Lz(e)}catch(l){throw ks.error(l),l}let n,s=await TSe.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new _R.PassThrough;if(e.format===Cz){i=e.s3.key+".csv";let l=NSe(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===Oz){i=e.s3.key+".json";let l=new _R.Readable;l.pipe(a),l.on("error",f=>{throw f}),l.push("[");let u=r.length,d="";for(let[f,m]of r.entries()){let h=f===u-1?JSON.stringify(m):JSON.stringify(m)+",";d+=h,f!==0&&f%CSe===0&&(l.push(d),d="")}d.length!==0&&l.push(d),l.push("]"),l.push(null)}else throw _r(new Error,Gn.INVALID_VALUE("format"),gr.BAD_REQUEST);return new ISe({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(xSe,"export_to_s3");function Pz(e){if(ks.trace("in exportCoreValidation"),fs.isEmpty(e.format))return"format missing";if(Nz.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${Nz.join(", ")}`;let t=e.search_operation.operation;if(fs.isEmpty(t))return"search_operation.operation missing";if(Iz.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${Iz.join(", ")}`}o(Pz,"exportCoreValidation");async function Lz(e){ks.trace("in getRecords");let t,r;if(Vp.isEmpty(e.search_operation)||Vp.isEmptyOrZeroLength(e.search_operation.operation))throw _r(new Error,Gn.INVALID_VALUE("Search operation"),gr.BAD_REQUEST);switch(e.search_operation.operation){case"search_by_value":t=LSe;break;case"search_by_hash":t=PSe;break;case"search_by_conditions":t=xP.searchByConditions;break;case"sql":{let n=oR();t=wz(n.evaluateSQL);break}default:throw r=`Operation ${e.search_operation.operation} is not support by export.`,ks.error(r),_r(new Error,r,gr.BAD_REQUEST)}return e.search_operation.hdb_user=e.hdb_user,t(e.search_operation)}o(Lz,"getRecords")});var vz=M((Kxe,Mz)=>{"use strict";var FP=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};Mz.exports=FP});var Bz=M((Wxe,xz)=>{"use strict";var BSe=(k(),v(W)),Uz=require("moment"),FSe=require("uuid").v4,HP=class{static{o(this,"JobObject")}constructor(){this.id=FSe(),this.type=void 0,this.start_datetime=Uz().valueOf(),this.created_datetime=Uz().valueOf(),this.end_datetime=void 0,this.status=BSe.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};xz.exports=HP});var kP=M((jxe,Kz)=>{"use strict";var HSe=require("uuid").v4,qz=Dn(),$z=sn(),kSe=ai(),GSe=Ku(),qSe=vz(),Mt=(k(),v(W)),$Se=Bz(),VSe=dS(),Ai=Q(),KSe=Zf(),hf=ie(),{promisify:YSe}=require("util"),tu=require("moment"),WSe=oR(),gR=yP(),Fz=OI(),{deleteTransactionLogsBeforeValidator:zSe}=VC(),{handleHDBError:Hz,hdbErrors:jSe,ClientError:QSe}=ge(),{HTTP_STATUS_CODES:kz}=jSe,Gz=$z.searchByValue,JSe=$z.searchByHash,XSe=qz.insert,ZSe=YSe(WSe.evaluateSQL),eTe=qz.update;Kz.exports={addJob:nTe,updateJob:iTe,handleGetJob:tTe,handleGetJobsByStartDate:rTe,getJobById:Vz};async function tTe(e){if(e.id===void 0)throw new QSe("'id' is required");let t=await Vz(e.id);return hf.isEmptyOrZeroLength(t)||(t[0]={...t[0]},t[0].request!==void 0&&delete t[0].request,delete t[0].__createdtime__,delete t[0].__updatedtime__),t}o(tTe,"handleGetJob");async function rTe(e){try{let t=await sTe(e);if(Ai.trace(`Searching for jobs from ${e.from_date} to ${e.to_date}`),t&&t.length>0)for(let r of t)r.start_datetime&&(r.start_datetime_converted=tu(r.start_datetime)),r.end_datetime&&(r.end_datetime_converted=tu(r.end_datetime)),r.request!==void 0&&delete r.request,delete r.__createdtime__,delete r.__updatedtime__;return t}catch(t){let r=`There was an error searching jobs by date: ${t}`;throw Ai.error(r),new Error(r)}}o(rTe,"handleGetJobsByStartDate");async function nTe(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||hf.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return Ai.info(d),t.error=d,t}if(!Mt.JOB_TYPE_ENUM[e.operation])return Ai.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Mt.OPERATIONS_ENUM.CSV_FILE_LOAD:n=gR.fileObject(e);break;case Mt.OPERATIONS_ENUM.CSV_URL_LOAD:n=gR.urlObject(e);break;case Mt.OPERATIONS_ENUM.CSV_DATA_LOAD:n=gR.dataObject(e);break;case Mt.OPERATIONS_ENUM.IMPORT_FROM_S3:n=gR.s3FileObject(e);break;case Mt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Mt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=Fz(e,"date");break;case Mt.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=Fz(e,"timestamp");break;case Mt.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=zSe(e);break;case Mt.OPERATIONS_ENUM.RESTART_SERVICE:if(Mt.HDB_PROCESS_SERVICES[e.service]===void 0)throw Hz(new Error,"Invalid service",kz.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw Hz(n,n.message,kz.BAD_REQUEST,void 0,void 0,!0);let s=new $Se;s.type=e.operation===Mt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE?Mt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:e.operation,s.type=e.operation,s.user=e.hdb_user?.username;let i=new kSe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await Gz(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return Ai.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=HSe();try{a=await Gz(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return Ai.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return Ai.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new KSe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await XSe(l)}catch(d){return Ai.error(`There was an error inserting a job for job type: ${e.operation} -- ${d}`),t.success=!1,t}if(u.inserted_hashes.length===0)t.message=`Had a problem creating a job with type ${s.operation} and id ${s.id}`;else{let d=`Created a job with type ${s.type} and id ${s.id}`;t.message=d,t.createdJob=s,t.success=!0,Ai.trace(d)}return t}o(nTe,"addJob");async function sTe(e){let t=tu(e.from_date,tu.ISO_8601),r=tu(e.to_date,tu.ISO_8601);if(!t.isValid())throw new Error("Invalid 'from' date, must be in ISO-8601 format (YYYY-MM-DD).");if(!r.isValid())throw new Error("Invalid 'to' date, must be in ISO-8601 format (YYYY-MM-DD)");let n=`select * from system.hdb_job where start_datetime > '${t.valueOf()}' and start_datetime < '${r.valueOf()}'`,s=new qSe(n,e.hdb_user);try{return await ZSe(s)}catch(i){throw Ai.error(`there was a problem searching for jobs from date ${e.from_date} to date ${e.to_date} ${i}`),new Error("there was an error searching for jobs. Please check the log for details.")}}o(sTe,"getJobsInDateRange");async function Vz(e){if(hf.isEmptyOrZeroLength(e))return hf.errorizeMessage("Invalid job ID specified.");let t=new GSe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await JSe(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return Ai.error(n),hf.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(Vz,"getJobById");async function iTe(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(hf.isEmptyOrZeroLength(e.id))throw new Error("invalid ID passed to updateJob");(e.status===Mt.JOB_STATUS_ENUM.COMPLETE||e.status===Mt.JOB_STATUS_ENUM.ERROR)&&(e.end_datetime=tu().valueOf());let t=new VSe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await eTe(t),r}o(iTe,"updateJob")});var Zz=M((Jxe,Xz)=>{"use strict";var Yz=ie(),Or=(k(),v(W)),oTe=require("moment"),SR=vP(),Kp=Q(),Wz=kP(),zz=BP(),jz=El(),Qz=nt(),aTe=QT(),cTe=sf(),{parentPort:lTe,isMainThread:Jz}=require("worker_threads"),{onMessageByType:uTe}=nt(),GP=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function dTe(e){if(!e||Object.keys(e).length===0)throw new Error("Empty runner passed to parseMessage");if(!e.json||Object.keys(e.json).length===0)throw new Error("Empty JSON passed to parseMessage");if(!e.job||Object.keys(e.job).length===0)throw new Error("Empty job passed to parseMessage");if(Yz.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(Yz.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case Or.JOB_TYPE_ENUM.csv_file_load:await so(e,SR.csvFileLoad);break;case Or.JOB_TYPE_ENUM.csv_url_load:await so(e,SR.csvURLLoad);break;case Or.JOB_TYPE_ENUM.csv_data_load:await so(e,SR.csvDataLoad);break;case Or.JOB_TYPE_ENUM.import_from_s3:await so(e,SR.importFromS3);break;case Or.JOB_TYPE_ENUM.empty_trash:break;case Or.JOB_TYPE_ENUM.export_local:await so(e,zz.export_local);break;case Or.JOB_TYPE_ENUM.export_to_s3:await so(e,zz.export_to_s3);break;case Or.JOB_TYPE_ENUM.delete_files_before:case Or.JOB_TYPE_ENUM.delete_records_before:await so(e,jz.deleteFilesBefore);break;case Or.JOB_TYPE_ENUM.delete_audit_logs_before:await so(e,jz.deleteAuditLogsBefore);break;case Or.JOB_TYPE_ENUM.delete_transaction_logs_before:await so(e,aTe.deleteTransactionLogsBefore);break;case Or.JOB_TYPE_ENUM.restart_service:return await so(e,cTe.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(dTe,"parseMessage");async function so(e,t){try{e.job.status=Or.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=oTe().valueOf(),await Wz.updateJob(e.job),await fTe(e.job.id)}catch(r){let n=r.message!==void 0?r.message:r;typeof n=="string"?(n=`There was an error running ${t.name} job with id ${e.job.id} - ${n}`,r.message=n):Kp.error(`There was an error running ${t.name} job with id ${e.job.id}`),Kp.error(n),e.job.message=n,e.job.status=Or.JOB_STATUS_ENUM.ERROR;try{await Wz.updateJob(e.job)}catch(s){throw Kp.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(so,"runJob");async function fTe(e){Kp.trace("launching job thread:",e),Jz?Qz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):lTe.postMessage({type:Or.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(fTe,"launchJobThread");Jz&&uTe(Or.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{Qz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){Kp.error(r)}});Xz.exports={parseMessage:dTe,RunnerMessage:GP}});var tj=M((Zxe,ej)=>{"use strict";var mTe=ie(),qP=oe(),pc=(k(),v(W)),hTe=Ot(),pTe=mr(),io=Q(),ETe=OP(),_Te=$i();qP.initSync();ej.exports={postOperationHandler:STe,sendOperationTransaction:Yp};async function Yp(e,t,r,n){if(e.schema===pc.SYSTEM_SCHEMA_NAME)return;let s=gTe(e,t,r);s&&(io.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await pTe.publishToStream(`${hTe.SUBJECT_PREFIXES.TXN}.${e.schema}`,_Te.createNatsTableStreamName(e.schema,e.table),n,s))}o(Yp,"sendOperationTransaction");function gTe(e,t,r){if(mTe.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===pc.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(gTe,"convertCRUDOperationToTransaction");async function STe(e,t,r){if(!qP.get(pc.CONFIG_PARAMS.CLUSTERING_ENABLED))return;io.trace(`postOperationHandler called for operation ${e.operation} on schema.table: ${e.schema}.${e.table}`);let n=e.hdb_user?.username,s=qP.get(pc.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new ETe(t.txn_time,n,s);switch(e.operation){case pc.OPERATIONS_ENUM.INSERT:try{await Yp(e,t.inserted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for insert."),io.error(a)}break;case pc.OPERATIONS_ENUM.DELETE:try{await Yp(e,t.deleted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for delete."),io.error(a)}break;case pc.OPERATIONS_ENUM.UPDATE:try{await Yp(e,t.update_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for update."),io.error(a)}break;case pc.OPERATIONS_ENUM.UPSERT:try{await Yp(e,t.upserted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for upsert."),io.error(a)}break;default:break}return t}o(STe,"postOperationHandler")});var J,rj=ce(()=>{J=class{static{o(this,"OperationFunctionObject")}operation_function;job_operation_function;constructor(t,r=void 0){this.operation_function=t,this.job_operation_function=r}}});var qC={};we(qC,{chooseOperation:()=>Rj,executeJob:()=>Gs,getOperationFunction:()=>yj,operation:()=>JP,processLocalTransaction:()=>Tj});async function Tj(e,t){try{if(e.body.operation!=="read_log"&&(Qp.default.log_level===Vf.INFO||Qp.default.log_level===Vf.DEBUG||Qp.default.log_level===Vf.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;Sn.info(c)}}catch(n){Sn.error(n)}let r=await gj.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return yTe[e.body.operation]&&hj.default.setSchemaDataToGlobal(n=>{n&&Sn.error(n)}),r}function Rj(e){let t;try{t=yj(e)}catch(s){throw Sn.error(`Error when selecting operation function - ${s}`),s}let{operation_function:r,job_operation_function:n}=t;try{if(e.operation==="sql"||e.search_operation&&e.search_operation.operation==="sql"){let s=e.operation==="sql"?e.sql:e.search_operation.sql,i=yR.default.convertSQLToAST(s);if(e.parsed_sql_object=i,!e.bypass_auth){let a=yR.default.checkASTPermissions(e,i);if(a)throw Sn.error(`${nj.FORBIDDEN} from operation ${e.operation}`),Sn.warn(`User '${e.hdb_user?.username}' is not permitted to ${e.operation}`),(0,qs.handleHDBError)(new Error,a,qs.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,void 0,!0)}}else if(!e.bypass_auth&&e.operation!==q.CREATE_AUTHENTICATION_TOKENS&&e.operation!==q.LOGIN&&e.operation!==q.LOGOUT){let s=n===void 0?r:n,i=e.search_operation?e.search_operation:e;i.hdb_user||(i.hdb_user=e.hdb_user);let a=mj.default.verifyPerms(i,s);if(a)throw Sn.error(`${nj.FORBIDDEN} from operation ${e.operation}`),Sn.warn(`User '${i.hdb_user?.username}' is not permitted to ${i.operation}`),(0,qs.handleHDBError)(new Error,a,qs.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,!1,!0)}}catch(s){throw(0,qs.handleHDBError)(s,"There was an error when trying to choose an operation path")}return r}function yj(e){if(Sn.trace(`getOperationFunction with operation: ${e.operation}`),sj.has(e.operation))return sj.get(e.operation);throw(0,qs.handleHDBError)(new Error,qs.hdbErrors.HDB_ERROR_MSGS.OP_NOT_FOUND(e.operation),qs.hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}function JP(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=Rj(e);return Tj({body:e},n)}async function ATe(e){Sn.trace("In serverUtils.catchup");let t=e.transaction,r=t.channel.split(":"),n=r[0],s=r[1];for(let i of t.transactions)try{i.schema=n,i.table=s,i[Jy]=!0;let a;switch(i.operation){case q.INSERT:a=await nu.default.insert(i);break;case q.UPDATE:a=await nu.default.update(i);break;case q.UPSERT:a=await nu.default.upsert(i);break;case q.DELETE:a=await _f.default.deleteRecord(i);break;default:Sn.warn("invalid operation in catchup");break}await Sj.transactToClusteringUtils.postOperationHandler(i,a,e)}catch(a){Sn.info("Invalid operation in transaction"),Sn.error(a)}}async function Gs(e){(0,_j.transformReq)(e);let t,r;try{if(r=await AR.default.addJob(e),r){t=r.createdJob,Sn.info("addJob result",r);let n=new YP.default.RunnerMessage(t,e);return{message:await YP.default.parseMessage(n)??`Starting job with id ${t.id}`,job_id:t.id}}}catch(n){let s=n instanceof Error?n:null,i=`There was an error executing job: ${s&&"http_resp_msg"in s?s.http_resp_msg:n}`;throw Sn.error(i),(0,qs.handleHDBError)(n,i)}}function bTe(){let e=new Map;return e.set(q.INSERT,new J(nu.default.insert)),e.set(q.UPDATE,new J(nu.default.update)),e.set(q.UPSERT,new J(nu.default.upsert)),e.set(q.SEARCH_BY_CONDITIONS,new J(Ef.default.searchByConditions)),e.set(q.SEARCH_BY_HASH,new J(Ef.default.searchByHash)),e.set(q.SEARCH_BY_ID,new J(Ef.default.searchByHash)),e.set(q.SEARCH_BY_VALUE,new J(Ef.default.searchByValue)),e.set(q.SEARCH,new J(TTe)),e.set(q.SQL,new J(RTe)),e.set(q.CSV_DATA_LOAD,new J(Gs,Wp.default.csvDataLoad)),e.set(q.CSV_FILE_LOAD,new J(Gs,Wp.default.csvFileLoad)),e.set(q.CSV_URL_LOAD,new J(Gs,Wp.default.csvURLLoad)),e.set(q.IMPORT_FROM_S3,new J(Gs,Wp.default.importFromS3)),e.set(q.CREATE_SCHEMA,new J(bi.default.createSchema)),e.set(q.CREATE_DATABASE,new J(bi.default.createSchema)),e.set(q.CREATE_TABLE,new J(bi.default.createTable)),e.set(q.CREATE_ATTRIBUTE,new J(bi.default.createAttribute)),e.set(q.DROP_SCHEMA,new J(bi.default.dropSchema)),e.set(q.DROP_DATABASE,new J(bi.default.dropSchema)),e.set(q.DROP_TABLE,new J(bi.default.dropTable)),e.set(q.DROP_ATTRIBUTE,new J(bi.default.dropAttribute)),e.set(q.DESCRIBE_SCHEMA,new J(zp.default.describeSchema)),e.set(q.DESCRIBE_DATABASE,new J(zp.default.describeSchema)),e.set(q.DESCRIBE_TABLE,new J(zp.default.describeTable)),e.set(q.DESCRIBE_ALL,new J(zp.default.describeAll)),e.set(q.DELETE,new J(_f.default.deleteRecord)),e.set(q.ADD_USER,new J(pf.default.addUser)),e.set(q.ALTER_USER,new J(pf.default.alterUser)),e.set(q.DROP_USER,new J(pf.default.dropUser)),e.set(q.LIST_USERS,new J(pf.default.listUsersExternal)),e.set(q.LIST_ROLES,new J(jp.default.listRoles)),e.set(q.ADD_ROLE,new J(jp.default.addRole)),e.set(q.ALTER_ROLE,new J(jp.default.alterRole)),e.set(q.DROP_ROLE,new J(jp.default.dropRole)),e.set(q.USER_INFO,new J(pf.default.userInfo)),e.set(q.READ_LOG,new J(oj.default)),e.set(q.ADD_NODE,new J(aj.default)),e.set(q.UPDATE_NODE,new J($P.default)),e.set(q.SET_NODE_REPLICATION,new J($P.default)),e.set(q.REMOVE_NODE,new J(cj.default)),e.set(q.CONFIGURE_CLUSTER,new J(lj.default)),e.set(q.PURGE_STREAM,new J(uj.default)),e.set(q.SET_CONFIGURATION,new J(WP.default.setConfiguration)),e.set(q.CLUSTER_STATUS,new J(dj.default.clusterStatus)),e.set(q.CLUSTER_NETWORK,new J(fj.default)),e.set(q.CLUSTER_SET_ROUTES,new J(TR.default.setRoutes)),e.set(q.CLUSTER_GET_ROUTES,new J(TR.default.getRoutes)),e.set(q.CLUSTER_DELETE_ROUTES,new J(TR.default.deleteRoutes)),e.set(q.EXPORT_TO_S3,new J(Gs,VP.default.export_to_s3)),e.set(q.CREATE_CSR,new J(ru.default.createCsr)),e.set(q.SIGN_CERTIFICATE,new J(ru.default.signCertificate)),e.set(q.LIST_CERTIFICATES,new J(ru.default.listCertificates)),e.set(q.ADD_CERTIFICATES,new J(ru.default.addCertificate)),e.set(q.REMOVE_CERTIFICATE,new J(ru.default.removeCertificate)),e.set(q.GET_KEY,new J(ru.default.getKey)),e.set(q.ADD_NODE_BACK,new J(xO)),e.set(q.REMOVE_NODE_BACK,new J(BO)),e.set(q.DELETE_FILES_BEFORE,new J(Gs,_f.default.deleteFilesBefore)),e.set(q.DELETE_RECORDS_BEFORE,new J(Gs,_f.default.deleteFilesBefore)),e.set(q.EXPORT_LOCAL,new J(Gs,VP.default.export_local)),e.set(q.SEARCH_JOBS_BY_START_DATE,new J(AR.default.handleGetJobsByStartDate)),e.set(q.GET_JOB,new J(AR.default.handleGetJob)),e.set(q.GET_FINGERPRINT,new J(RR.default.getFingerprint)),e.set(q.SET_LICENSE,new J(RR.default.setLicense)),e.set(q.GET_REGISTRATION_INFO,new J(RR.default.getRegistrationInfo)),e.set(q.RESTART,new J(KP.default.restart)),e.set(q.RESTART_SERVICE,new J(Gs,KP.default.restartService)),e.set(q.CATCHUP,new J(ATe)),e.set(q.SYSTEM_INFORMATION,new J(pj.default.systemInformation)),e.set(q.DELETE_AUDIT_LOGS_BEFORE,new J(Gs,_f.default.deleteAuditLogsBefore)),e.set(q.READ_AUDIT_LOG,new J(ij.default)),e.set(q.CREATE_AUTHENTICATION_TOKENS,new J(mw)),e.set(q.REFRESH_OPERATION_TOKEN,new J(hw)),e.set(q.LOGIN,new J(vC)),e.set(q.LOGOUT,new J(UC)),e.set(q.GET_CONFIGURATION,new J(WP.default.getConfiguration)),e.set(q.CUSTOM_FUNCTIONS_STATUS,new J(vt.default.customFunctionsStatus)),e.set(q.GET_CUSTOM_FUNCTIONS,new J(vt.default.getCustomFunctions)),e.set(q.GET_COMPONENT_FILE,new J(vt.default.getComponentFile)),e.set(q.GET_COMPONENTS,new J(vt.default.getComponents)),e.set(q.SET_COMPONENT_FILE,new J(vt.default.setComponentFile)),e.set(q.DROP_COMPONENT,new J(vt.default.dropComponent)),e.set(q.GET_CUSTOM_FUNCTION,new J(vt.default.getCustomFunction)),e.set(q.SET_CUSTOM_FUNCTION,new J(vt.default.setCustomFunction)),e.set(q.DROP_CUSTOM_FUNCTION,new J(vt.default.dropCustomFunction)),e.set(q.ADD_CUSTOM_FUNCTION_PROJECT,new J(vt.default.addComponent)),e.set(q.ADD_COMPONENT,new J(vt.default.addComponent)),e.set(q.DROP_CUSTOM_FUNCTION_PROJECT,new J(vt.default.dropCustomFunctionProject)),e.set(q.PACKAGE_CUSTOM_FUNCTION_PROJECT,new J(vt.default.packageComponent)),e.set(q.PACKAGE_COMPONENT,new J(vt.default.packageComponent)),e.set(q.DEPLOY_CUSTOM_FUNCTION_PROJECT,new J(vt.default.deployComponent)),e.set(q.DEPLOY_COMPONENT,new J(vt.default.deployComponent)),e.set(q.READ_TRANSACTION_LOG,new J(zP.default.readTransactionLog)),e.set(q.DELETE_TRANSACTION_LOGS_BEFORE,new J(Gs,zP.default.deleteTransactionLogsBefore)),e.set(q.INSTALL_NODE_MODULES,new J(jP.default.installModules)),e.set(q.AUDIT_NODE_MODULES,new J(jP.default.auditModules)),e.set(q.GET_BACKUP,new J(bi.default.getBackup)),e.set(q.CLEANUP_ORPHAN_BLOBS,new J(bi.default.cleanupOrphanBlobs)),e.set(q.ADD_SSH_KEY,new J(vt.default.addSSHKey)),e.set(q.UPDATE_SSH_KEY,new J(vt.default.updateSSHKey)),e.set(q.DELETE_SSH_KEY,new J(vt.default.deleteSSHKey)),e.set(q.LIST_SSH_KEYS,new J(vt.default.listSSHKeys)),e.set(q.SET_SSH_KNOWN_HOSTS,new J(vt.default.setSSHKnownHosts)),e.set(q.GET_SSH_KNOWN_HOSTS,new J(vt.default.getSSHKnownHosts)),e.set(q.GET_ANALYTICS,new J(YC)),e.set(q.LIST_METRICS,new J(WC)),e.set(q.DESCRIBE_METRIC,new J(zC)),e.set(q.GET_STATUS,new J(ZC)),e.set(q.SET_STATUS,new J(eP)),e.set(q.CLEAR_STATUS,new J(XC)),e}var Ef,yR,Wp,bi,zp,_f,ij,pf,jp,vt,Qp,oj,aj,$P,cj,lj,uj,dj,fj,TR,VP,mj,AR,qs,RR,KP,QP,nu,hj,pj,YP,WP,zP,jP,Ej,_j,ru,gj,Sj,nj,Sn,TTe,RTe,yTe,sj,$C=ce(()=>{Ef=w(sn()),yR=w(oR()),Wp=w(vP()),bi=w(ep()),zp=w(Ua()),_f=w(El()),ij=w(uO()),pf=w(ts()),jp=w(Oh()),vt=w(GC()),Qp=w(Q()),oj=w(pO()),aj=w(pT()),$P=w(qO()),cj=w(_T()),lj=w(KO()),uj=w(YO()),dj=w(jO()),fj=w(JO()),TR=w(yT()),VP=w(BP()),mj=w(sR()),AR=w(kP());k();qs=w(ge()),RR=w(uC()),KP=w(sf()),QP=w(require("util")),nu=w(Dn()),hj=w(ii()),pj=w($d()),YP=w(Zz());Td();qT();WP=w(wt()),zP=w(QT()),jP=w(wp()),Ej=w(Xs()),_j=w(ie());Dr();ru=w(as());Kd();QC();gj=w(AP()),Sj=w(tj());Bp();rj();({HTTP_STATUS_CODES:nj}=qs.hdbErrors),Sn=Qp.default.loggerWithTag("operation"),TTe=QP.promisify(Ef.default.search),RTe=QP.promisify(yR.default.evaluateSQL),yTe={[q.CREATE_ATTRIBUTE]:!0,[q.CREATE_TABLE]:!0,[q.CREATE_SCHEMA]:!0,[q.DROP_ATTRIBUTE]:!0,[q.DROP_TABLE]:!0,[q.DROP_SCHEMA]:!0};o(Tj,"processLocalTransaction");sj=bTe();Le.operation=JP;o(Rj,"chooseOperation");o(yj,"getOperationFunction");(0,Ej._assignPackageExport)("operation",JP);o(JP,"operation");o(ATe,"catchup");o(Gs,"executeJob");o(bTe,"initializeOperationFunctionMap")});var NR=M((oBe,Ij)=>{"use strict";var bR=(k(),v(W)),ITe=ie(),Jp=Q(),{handleHDBError:XP,hdbErrors:IR}=ge(),{isMainThread:NTe}=require("worker_threads"),{Readable:wTe}=require("stream"),Aj=require("os"),OTe=require("util"),CTe=Ew(),PTe=OTe.promisify(CTe.authorize),bj=($C(),v(qC)),{createGzip:LTe,constants:DTe}=require("zlib"),MTe=[bR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,bR.OPERATIONS_ENUM.LOGIN,bR.OPERATIONS_ENUM.LOGOUT];function vTe(e){let t=`Found an uncaught exception with message: ${e.message}. ${Aj.EOL}Stack: ${e.stack} ${Aj.EOL}Terminating ${NTe?"HDB":"thread"}.`;console.error(t),Jp.fatal(t),process.exit(1)}o(vTe,"handleServerUncaughtException");function UTe(e,t,r){if(Jp[e.logLevel||"error"](e),e.statusCode)return typeof e.http_resp_msg!="object"?r.code(e.statusCode).send({error:e.http_resp_msg||e.message}):r.code(e.statusCode).send(e.http_resp_msg);let n=e.statusCode?e.statusCode:IR.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR;return typeof e=="string"?r.code(n).send({error:e}):r.code(n).send(e.message?{error:e.message}:e)}o(UTe,"serverErrorHandler");function xTe(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=XP(new Error,"Invalid JSON.",IR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(ITe.isEmpty(e.body.operation)){let n=XP(new Error,"Request body must include an 'operation' property.",IR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(xTe,"reqBodyValidationHandler");function BTe(e,t,r){let n;!MTe.includes(e.body.operation)||e.body.operation===bR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?PTe(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{Jp.warn(i),Jp.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(XP(i,a,IR.HTTP_STATUS_CODES.UNAUTHORIZED),null)}):(e.body.hdb_user=null,e.body.baseRequest=e.raw?.baseRequest,e.body.baseResponse=t.raw?.baseResponse,e.body.fastifyResponse=t,r())}o(BTe,"authHandler");async function FTe(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=bj.chooseOperation(e.body);let s=await bj.processLocalTransaction(e,n);if(s instanceof wTe&&s.headers){for(let[i,a]of s.headers)t.header(i,a);e.headers["accept-encoding"]?.includes("gzip")&&(t.header("content-encoding","gzip"),s=s.pipe(LTe({level:DTe.Z_BEST_SPEED})))}return s}catch(s){throw Jp.error(s),s}}o(FTe,"handlePostRequest");Ij.exports={authHandler:BTe,handlePostRequest:FTe,handleServerUncaughtException:vTe,serverErrorHandler:UTe,reqBodyValidationHandler:xTe}});var Cj=M((cBe,Oj)=>{"use strict";var HTe=require("fastify-plugin"),{handlePostRequest:Nj,authHandler:kTe,reqBodyValidationHandler:GTe}=NR();async function qTe(e){e.decorate("hdbCore",{preValidation:[GTe,kTe],request:o((t,r)=>wj(Nj(t,r)),"request"),requestWithoutAuthentication:o((t,r)=>wj(Nj(t,r,!0)),"requestWithoutAuthentication")})}o(qTe,"hdbCore");async function wj(e){if(e=await e,e?.[Symbol.asyncIterator]&&!e[Symbol.iterator]){let t=[];for await(let r of e)t.push(r);return t}return e}o(wj,"convertAsyncIterators");Oj.exports=HTe(qTe)});var Lj=M((dBe,Pj)=>{"use strict";var uBe=require("fs"),wR=oe();wR.initSync();var{CONFIG_PARAMS:ZP}=(k(),v(W)),$Te=1024*1024*1024;function VTe(e){let t=wR.get(ZP.HTTP_TIMEOUT),r=wR.get(ZP.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:$Te,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:wR.get(ZP.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(VTe,"getServerOptions");Pj.exports=VTe});var vj=M((mBe,Mj)=>{"use strict";var eL=oe();eL.initSync();var{CONFIG_PARAMS:Dj}=(k(),v(W));function KTe(){let e=eL.get(Dj.HTTP_CORSACCESSLIST),t=eL.get(Dj.HTTP_CORS),r;return t&&(r={origin:!0,allowedHeaders:["Content-Type","Authorization","Accept"],credentials:!1},e&&e.length>0&&e[0]!==null&&e[0]!=="*"&&(r.origin=(n,s)=>s(null,e.indexOf(n)!==-1))),r}o(KTe,"getCORSOptions");Mj.exports=KTe});var Bj=M((pBe,xj)=>{"use strict";var Uj=oe();Uj.initSync();var YTe=(k(),v(W));function WTe(){return Uj.get(YTe.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(WTe,"getHeaderTimeoutConfig");xj.exports=WTe});var rL={};we(rL,{customFunctionsServer:()=>QTe,ready:()=>Jj,start:()=>jTe});function jTe(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){ra||(ra=Qj(t),Le.http((await ra).server));let a=await ra,c=(0,tL.dirname)(s),l=(0,tL.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!Fj.has(c)){Fj.add(c);try{a.register(XTe(c,l))}catch(u){if(u.message==="Root plugin has already booted")yt.warn(`Could not load root fastify route for ${s}, this may require a restart to install properly`);else throw u}}},ready:Jj}}async function QTe(){try{yt.info("In Custom Functions Fastify server"+process.cwd()),yt.info(`Custom Functions Running with NODE_ENV set as: ${process.env.NODE_ENV}`),yt.debug(`Custom Functions server process ${process.pid} starting up.`),await JTe();let e=Vj.get(U.HTTP_SECUREPORT)>0,t;try{t=ra=await Qj(e)}catch(r){throw yt.error(`Custom Functions buildServer error: ${r}`),r}try{await t.ready()}catch(r){throw yt.error(`Custom Functions server.ready() error: ${r}`),r}t.server.cantCleanupProperly=!0}catch(e){yt.error(`Custom Functions ${process.pid} Error: ${e}`),yt.error(e),process.exit(1)}}async function JTe(){try{yt.info("Custom Functions starting configuration."),await Kj.setUsersWithRolesCache(),yt.info("Custom Functions completed configuration.")}catch(e){yt.error(e)}}function XTe(e,t){return async function(r){try{yt.info("Custom Functions starting buildRoutes"),yt.trace("Loading fastify routes folder "+e),(0,Hj.existsSync)(e)&&r.register($j.default,s=>({dir:e,dirNameRoutePrefix:!1,options:{hdbCore:s.hdbCore,logger:yt.loggerWithTag("custom-function"),prefix:`/${t}`}})).after((s,i,a)=>{s?.message?yt.error(s.message):s&&yt.error(s),a()})}catch(n){yt.error(`Custom Functions errored buildRoutes: ${n}`)}}}async function Qj(e){yt.info("Custom Functions starting buildServer.");let t=(0,Yj.default)(e),r=(0,kj.default)(t);r.server.headersTimeout=(0,zj.default)(),r.setErrorHandler(jj.serverErrorHandler);let n=(0,Wj.default)();return n&&r.register(Gj.default,n),r.register(function(s,i,a){s.setNotFoundHandler(function(c,l){r.server.emit("unhandled",c.raw,l.raw)}),a()}),r.register(qj.default),await r.register(zTe),await r.after(),am(r),yt.info("Custom Functions completed buildServer."),r}function Jj(){if(ra)return ra.then?ra.then(e=>e.ready()):ra.ready()}var tL,Hj,kj,Gj,qj,$j,Vj,yt,zTe,Kj,Yj,Wj,zj,jj,ra,Fj,Xj=ce(()=>{tL=require("path"),Hj=require("fs"),kj=w(require("fastify")),Gj=w(require("@fastify/cors")),qj=w(lw()),$j=w(require("@fastify/autoload")),Vj=w(oe());k();yt=w(Q()),zTe=w(Cj()),Kj=w(ts()),Yj=w(Lj()),Wj=w(vj()),zj=w(Bj()),jj=w(NR());Ro();Dr();Fj=new Set;o(jTe,"start");o(QTe,"customFunctionsServer");o(JTe,"setUp");o(XTe,"buildRouteFolder");o(Qj,"buildServer");o(Jj,"ready")});var nL={};we(nL,{start:()=>ZTe});function ZTe(e){return{handleDirectory(t,r){if(t==="/"){let n=(0,n2.default)(r,e);return e.server.http(async(s,i)=>{if(!s.isWebSocket)return new Promise(a=>n(s._nodeRequest,s._nodeResponse,()=>{a(i(s))}))}),!0}},handleFile(t,r,n){e2||(e2=!0,e.server.http(async(s,i)=>{if(!s.isWebSocket){let a=Zj.get(s.pathname);if(a)return{handlesHeaders:!0,body:(0,t2.default)(s,(0,r2.realpathSync)(a))}}return i(s)},{runFirst:!0})),Zj.set(r,n)}}}var t2,r2,n2,Zj,e2,s2=ce(()=>{t2=w(require("send")),r2=require("fs"),n2=w(require("serve-static")),Zj=new Map;o(ZTe,"start")});var sL={};we(sL,{start:()=>eRe});function eRe({override:e}){return{handleFile:o((t,r,n)=>{OR.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,i2.parse)(t))){if(process.env[s]!==void 0)if(OR.default.warn(`Environment variable conflict: ${s} from ${n} is already set on process.env`),e)OR.default.debug(`override option enabled. overriding environment variable: ${s}`);else continue;process.env[s]=i}},"handleFile")}}var i2,OR,o2=ce(()=>{i2=require("dotenv"),OR=w(Q());o(eRe,"start")});var aL={};we(aL,{DataLoaderError:()=>ms,DataLoaderResult:()=>gf,EmptyFileError:()=>DR,FileParseError:()=>LR,InvalidPropertyTypeError:()=>MR,MissingRequiredPropertyError:()=>Xp,RecordProcessingError:()=>Zp,SystemDatabaseError:()=>vR,UnsupportedFileExtensionError:()=>PR,computeRecordHash:()=>oL,handleApplication:()=>nRe,loadDataFile:()=>h2,suppressHandleApplicationWarning:()=>rRe});function oL(e){let t=Object.keys(e).sort(),r={};for(let s of t)r[s]=e[s];let n=JSON.stringify(r);return(0,c2.createHash)("sha256").update(n).digest("hex")}function m2(e){return e.system&&e.system[iL]?e.system[iL]:CR||(CR=ze({database:"system",table:iL,attributes:[{name:"id",type:"string",isPrimaryKey:!0},{name:"hash",type:"string"}]}),CR)}async function tRe(e,t,r,n){try{let s=m2(n),i=e?`${e}:${t}:${r}`:`${t}:${r}`;return(await s.get(i))?.hash||null}catch(s){return $s.error?.(`Failed to get stored hash: ${s.message}`),null}}async function a2(e,t,r,n,s){try{let i=m2(s),a=e?`${e}:${t}:${r}`:`${t}:${r}`;await i.put({id:a,hash:n})}catch(i){$s.error?.(`Failed to store hash: ${i.message}`)}}function nRe(e){if((0,u2.getWorkerIndex)()!==0){$s.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||h2(t,ln,He).then(r=>{$s.debug?.("Data loader processed file: %s: %s",(0,na.basename)(t.absolutePath),r.message)})})}async function h2({contents:e,absolutePath:t,stats:r},n,s){let i=(0,na.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,l2.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new PR(t,i)}catch(f){throw f instanceof ms?f:new LR(t,f)}if(!a)throw new DR(t);let{database:c,table:l,records:u}=a;if(!l)throw new Xp(t,"table");if(!u)throw new Xp(t,"records");if(!Array.isArray(u))throw new MR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new vR(c,l);try{let f;if(c&&s[c]&&s[c][l])$s.debug?.(`Using existing table ${d} from database tables`),f=s[c][l];else if(n&&n[l])$s.debug?.(`Using existing table ${d} from global tables`),f=n[l];else{$s.debug?.(`Table ${d} not found, creating new table`);let R=[];if(u.length>0){let T=u[0];Object.keys(T).map(y=>{let N={name:y,type:typeof T[y]};return y==="id"&&(N.isPrimaryKey=!0),N}).forEach(y=>{R.push(y)})}f=await ze({database:c,table:l,attributes:R})}let m=u.length,h=0,p=0,_=0,g=100;for(let R=0;R<u.length;R+=g){let T=u.slice(R,R+g),y=[];for(let N of T)y.push(async()=>{try{let O=null,F=N.id;F!==void 0&&(O=await f.get(F));let Z=oL(N);if(!O){h++;let $=await f.put(N);return await a2(c,l,F,Z,s),$}let G=await tRe(c,l,F,s);if(!G)return _++,Promise.resolve({inserted:0,updated:0});let Y={};for(let $ of Object.keys(N))$ in O&&(Y[$]=O[$]);return oL(Y)!==G?(_++,Promise.resolve({inserted:0,updated:0})):Z!==G?(p++,await f.patch(F,N),await a2(c,l,F,Z,s),{updated:1}):(_++,Promise.resolve({inserted:0,updated:0}))}catch(O){if(O instanceof ms)$s.error?.(`Record processing error: ${O.message}`);else{let F=new Zp(d,O);$s.error?.(`Record processing error: ${F.message}`)}return Promise.resolve({inserted:0,updated:0,error:O.message})}});await Promise.all(y.map(N=>N()))}if(h>0||p>0){let R=`Loaded ${h} new and updated ${p} records in ${d}`;return _>0&&(R+=` (${_} records skipped)`),$s.info?.(R),new gf(t,c,l,"success",h+p,R)}else if(_>0){let R=`All ${_} records in ${d} already up-to-date`;return $s.info?.(R),new gf(t,c,l,"skipped",m,R)}else{let R=`No records to process in ${d}`;return $s.info?.(R),new gf(t,c,l,"success",0,R)}}catch(f){throw f instanceof ms?f:new Zp(d,f)}}var na,c2,l2,u2,sa,d2,f2,$s,iL,CR,rRe,ms,PR,LR,DR,Xp,MR,vR,Zp,gf,p2=ce(()=>{na=require("node:path"),c2=require("node:crypto"),l2=require("yaml");Me();u2=w(nt()),sa=w(tn()),d2=w(ge()),f2=w(Q()),$s=f2.default.forComponent("dataLoader"),iL="hdb_dataloader_hash";o(oL,"computeRecordHash");o(m2,"getHashTrackingTable");o(tRe,"getStoredHash");o(a2,"storeHash");rRe=!0;o(nRe,"handleApplication");o(h2,"loadDataFile");ms=class extends d2.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=sa.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},PR=class extends ms{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,na.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,sa.HTTP_STATUS_CODES.BAD_REQUEST),this.name="UnsupportedFileExtensionError"}},LR=class extends ms{static{o(this,"FileParseError")}constructor(t,r){super(`Failed to parse data file ${(0,na.basename)(t)}: ${r.message}`,sa.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},DR=class extends ms{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,na.basename)(t)} is empty or invalid`,sa.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},Xp=class extends ms{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,na.basename)(t)} is missing required "${r}" property`,sa.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},MR=class extends ms{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,na.basename)(t)} has invalid "${r}" property, expected ${n}`,sa.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},vR=class extends ms{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,sa.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},Zp=class extends ms{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,sa.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},gf=class{static{o(this,"DataLoaderResult")}#e;#t;#r;#n;#s;#i;constructor(t,r,n,s,i,a){this.#e=t,this.#t=r||"unknown",this.#r=n||"unknown",this.#n=s,this.#s=i,this.#i=a}get filePath(){return this.#e}get database(){return this.#t}get table(){return this.#r}get status(){return this.#n}get count(){return this.#s}get message(){return this.#i}toJSON(){return{filePath:this.#e,database:this.#t,table:this.#r,status:this.#n,count:this.#s,message:this.#i}}}});var cL={};we(cL,{hdbServer:()=>aRe,start:()=>aRe});async function aRe(e){try{oo.default.debug("In Fastify server"+process.cwd()),oo.default.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),oo.default.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=E2.default.isMaster,await cRe();let t=e.securePort>0;Sf=lRe(t),await Sf.ready(),e||(e={}),e.isOperationsServer=!0;try{Le.http(Sf.server,e),Sf.server.closeIdleConnections||await Sf.listen({port:0,host:"::"})}catch(r){throw Sf.close(),oo.default.error(r),oo.default.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),oo.default.fatal(t),process.exit(1)}}async function cRe(){oo.default.trace("Configuring HarperDB process."),b2.default.setSchemaDataToGlobal(),await N2.default.setUsersWithRolesCache(),await w2.default.getLicense()}function lRe(e){oo.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=uRe(e),r=(0,_2.default)(t);r.server.headersTimeout=fRe(),r.setErrorHandler(_c.serverErrorHandler);let n=dRe();n&&r.register(g2.default,n),r.register(function(i,a,c){i.setNotFoundHandler(function(l,u){r.server.emit("unhandled",l.raw,u.raw)}),c()}),r.register(R2.default),r.register(S2.default),r.register(T2.default,{root:y2.default.join(A2.PACKAGE_ROOT,"studio/build-local")}),am(r);let s=Ec.default.get(jy.LOCAL_STUDIO_ON);return r.get("/",function(i,a){return!I2.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?a.sendFile("index.html"):a.sendFile("running.html")}),r.post("/",{preValidation:[_c.reqBodyValidationHandler,_c.authHandler],config:{isOperation:!0}},async function(i,a){return i.body?.operation?.startsWith("restart")&&a.header("Connection","close"),(0,_c.handlePostRequest)(i,a)}),r.get("/health",()=>"HarperDB is running."),oo.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}function uRe(e){let t=Ec.default.get(eE.OPERATIONSAPI_NETWORK_TIMEOUT),r=Ec.default.get(eE.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:iRe,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}function dRe(){let e=Ec.default.get(eE.OPERATIONSAPI_NETWORK_CORS),t=Ec.default.get(eE.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===oRe)&&(r={origin:!0,allowedHeaders:["Content-Type","Authorization","Accept"],credentials:!1},t&&t.length>0&&t[0]!==null&&t[0]!=="*"&&(r.origin=(n,s)=>s(null,t.indexOf(n)!==-1))),r}function fRe(){return Ec.default.get(eE.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??sRe}var E2,Ec,oo,_2,g2,S2,T2,R2,y2,A2,b2,I2,N2,w2,_c,sRe,iRe,oRe,eE,Sf,O2=ce(()=>{E2=w(require("cluster")),Ec=w(oe());k();oo=w(Q()),_2=w(require("fastify")),g2=w(require("@fastify/cors")),S2=w(require("@fastify/compress")),T2=w(require("@fastify/static")),R2=w(lw()),y2=w(require("path")),A2=w(bt()),b2=w(ii()),I2=w(ie()),N2=w(ts()),w2=w(Jd());Dr();_c=w(NR());Ro();Ec.default.initSync();sRe=6e4,iRe=1024*1024*1024,oRe="TRUE",{CONFIG_PARAMS:eE}=W;o(aRe,"operationsServer");o(cRe,"setUp");o(lRe,"buildServer");o(uRe,"getServerOptions");o(dRe,"getCORSOpts");o(fRe,"getHeaderTimeoutConfig")});var hL={};we(hL,{disableNATS:()=>hRe,publishToStream:()=>BR,setNATSReplicator:()=>lL,setPublishToStream:()=>pRe,setSubscription:()=>mL,start:()=>mRe});function mRe(){tE.default.get(U.CLUSTERING_ENABLED)&&_Re()}function hRe(e=!0){M2=e}function pRe(e,t){BR=e,mL=t}function _Re(){if(M2||process.env._DISABLE_NATS)return;let e=st(),t=Object.keys(e);t.push("system");for(let r of t){let n=e[r];for(let s in n){let i=n[s];lL(s,r,i)}}Il((r,n)=>{lL(r.tableName,r.databaseName,r),n&&U2(r)}),!C2&&(C2=!0)}function lL(e,t,r){if(t==="system"&&gRe.includes(e))return;if(!r)return console.error(`Attempt to replicate non-existent table ${e} from database ${t}`);if(r.sources.some(s=>s?.isNATSReplicator))return;r.sourcedFrom(class extends Ur{static{o(this,"NATSReplicator")}put(i){return n(this.getContext()).addWrite(t,{operation:"put",table:e,id:this.getId(),record:i})}delete(){return n(this.getContext()).addWrite(t,{operation:"delete",table:e,id:this.getId()})}publish(i){return n(this.getContext()).addWrite(t,{operation:"publish",table:e,id:this.getId(),record:i})}patch(i){return n(this.getContext()).addWrite(t,{operation:"patch",table:e,id:this.getId(),record:i})}invalidate(){n(this.getContext()).addWrite(t,{operation:"invalidate",table:e,id:this.getId()})}static defineSchema(i){U2(i)}static subscribe(){let i=new Vn;return mL(t,e,i),i}static subscribeOnThisThread(i){return i<(tE.default.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??ERe)}static isEqual(i){return i.isNATSReplicator}static isNATSReplicator=!0;static shouldReceiveInvalidations=!0},{intermediateSource:!0});function n(s){let i=s?.transaction?.nats;if(!i)if(s?.transaction){s.transaction.nats=i=new UR(s.transaction,s);let a=s.transaction;for(;a.next;)a=a.next;a.next=s.transaction.nats,i.user=s.user,i.context=s}else i=v2;return i}o(n,"getNATSTransaction")}function U2(e){let t=tE.default.get(U.CLUSTERING_NODENAME);BR(`${dL.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,fL.createNatsTableStreamName)(e.databaseName,e.tableName),void 0,{operation:"define_schema",schema:e.databaseName,table:e.tableName,attributes:e.attributes,__origin:{timestamp:Date.now(),node_name:t}})}var P2,dL,fL,L2,D2,tE,xR,M2,BR,mL,ERe,v2,C2,gRe,UR,uL,x2=ce(()=>{Me();Pa();P2=w(mr()),dL=w(Ot()),fL=w($i());Ru();L2=w(Iw()),D2=w(yn()),tE=w(oe());k();xR=w(Q());o(mRe,"start");o(hRe,"disableNATS");BR=P2.publishToStream,mL=L2.setSubscription;o(pRe,"setPublishToStream");ERe=2;o(_Re,"assignReplicationSource");gRe=["hdb_job","hdb_raw_analytics","hdb_info","hdb_license"];o(lL,"setNATSReplicator");o(U2,"publishSchema");UR=class{constructor(t,r){this.transaction=t;this.options=r}static{o(this,"NATSTransaction")}user;writesByDb=new Map;addWrite(t,r){r.expiresAt=this.context?.expiresAt;let n=this.writesByDb.get(t);n||this.writesByDb.set(t,n=[]),n.push(r)}commit({timestamp:t}){let r=tE.default.get(U.CLUSTERING_NODENAME),n=[];for(let[s,i]of this.writesByDb){let a=[],c=[],l,u;for(let d of i){let f=d.table,m=d.operation=="put"?"upsert":d.operation;l||(xR.trace(`Sending transaction event ${m}`),u=l={operation:m,schema:s,table:f,__origin:{user:this.user?.username,timestamp:t,node_name:r}},l.hash_values=c,m!=="delete"&&m!=="invalidate"&&(l.records=a)),l.table===f&&l.operation===m?(a.push(d.record),c.push(d.id)):u=u.next={operation:m,table:f,id:d.id,record:d.record},d.expiresAt&&(u.expiresAt=d.expiresAt)}l&&n.push(BR(`${dL.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,fL.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw xR.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},uL=class extends UR{static{o(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,D2.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};v2=new uL});var EL=M((xBe,B2)=>{"use strict";var rE=oe();rE.initSync();var Tf=require("fs-extra"),pL=require("path"),Rf=(k(),v(W)),SRe=require("crypto"),TRe=require("uuid").v4;B2.exports=RRe;function RRe(){if(rE.getHdbBasePath()!==void 0){let e=pL.join(rE.getHdbBasePath(),Rf.LICENSE_KEY_DIR_NAME,Rf.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=pL.join(rE.getHdbBasePath(),Rf.LICENSE_KEY_DIR_NAME,Rf.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=pL.join(rE.getHdbBasePath(),Rf.LICENSE_KEY_DIR_NAME,Rf.JWT_ENUM.JWT_PASSPHRASE_NAME);try{Tf.accessSync(r),Tf.accessSync(e),Tf.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=TRe(),i=SRe.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});Tf.writeFileSync(r,s),Tf.writeFileSync(e,i.privateKey),Tf.writeFileSync(t,i.publicKey)}else throw n}}}o(RRe,"checkJWTTokenExist")});var H2=M((FBe,F2)=>{"use strict";var _L=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};F2.exports={HdbInfoInsertObject:_L}});var q2=M((kBe,G2)=>{"use strict";var k2=(k(),v(W)),gL=class{static{o(this,"UpgradeObject")}constructor(t,r){this[k2.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[k2.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};G2.exports={UpgradeObject:gL}});var FR=M((qBe,V2)=>{"use strict";var Vs=require("prompt"),yf=require("chalk"),$2=Q(),Ii=require("os"),SL=xc(),TL=["yes","y"];async function yRe(e){let t=`${Ii.EOL}`+yf.bold.green("Your current HarperDB version requires that we complete an update process.")+`${Ii.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ii.EOL}${Ii.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${Ii.EOL}`;Vs.override=SL(["CONFIRM_UPGRADE"]),Vs.start(),Vs.message=t;let r={properties:{CONFIRM_UPGRADE:{description:yf.magenta(`${Ii.EOL}[CONFIRM_UPGRADE] Do you want to upgrade your HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n;try{n=await Vs.get([r])}catch(s){return $2.error("There was an error when prompting user about an upgrade."),$2.error(s),!1}return TL.includes(n.CONFIRM_UPGRADE)}o(yRe,"forceUpdatePrompt");async function ARe(e){let t=`${Ii.EOL}`+yf.bold.green(`Your installed HarperDB version is older than the version used to create your data. Downgrading is not recommended as it is not tested and guaranteed to work. However, if you need to downgrade, and a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ii.EOL}`);Vs.override=SL(["CONFIRM_DOWNGRADE"]),Vs.start(),Vs.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:yf.magenta(`${Ii.EOL}[CONFIRM_DOWNGRADE] Do you want to proceed with using your downgraded HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n=await Vs.get([r]);return TL.includes(n.CONFIRM_DOWNGRADE)}o(ARe,"forceDowngradePrompt");async function bRe(){let e=`${Ii.EOL}`+yf.bold.green("We now require a Certifacte Authority certificate. HarperDB can generate all new certificates for you (your existing certificates will be backed up) or you can keep any existing certificates and add your own CA certificate. To add your own CA certificate set the <certificateAuthority> parameter in harperdb-config.yaml");Vs.override=SL(["GENERATE_CERTS"]),Vs.start(),Vs.message=e;let t={properties:{GENERATE_CERTS:{description:yf.magenta(`${Ii.EOL}[GENERATE_CERTS] Do you want HarperDB to generate all new certificates? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"yes",required:!0}}},r=await Vs.get([t]);return TL.includes(r.GENERATE_CERTS)}o(bRe,"upgradeCertsPrompt");V2.exports={forceUpdatePrompt:yRe,forceDowngradePrompt:ARe,upgradeCertsPrompt:bRe}});var yL=M((VBe,K2)=>{"use strict";var RL=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};K2.exports=RL});var W2=M((QBe,Y2)=>{"use strict";var IRe=ie(),NRe=wt(),YBe=Q(),WBe=require("path"),zBe=require("fs"),jBe=(k(),v(W));Y2.exports={getOldPropsValue:wRe};function wRe(e,t,r=!1){let n=t.getRaw(e);return IRe.isNotEmptyAndHasValue(n)?n:r?NRe.getDefaultConfig(e):""}o(wRe,"getOldPropsValue")});var J2=M((XBe,Q2)=>{"use strict";var gc=require("path"),Sc=require("fs-extra"),ORe=require("properties-reader"),CRe=yL(),Sr=Q(),{getOldPropsValue:At}=W2(),{HDB_SETTINGS_NAMES:ye,CONFIG_PARAMS:su}=(k(),v(W)),iu=wt(),HR=oe(),z2=ie(),ao=(k(),v(W)),AL=new CRe("3.1.0"),j2=[];function PRe(){let e=ORe(HR.get(ye.SETTINGS_PATH_KEY)),t="Updating settings file for version 3.1.0";console.log(t),Sr.info(t);let r=` ;Settings for the HarperDB process.
38
+ `);throw n[1]?hP(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,pP.BAD_REQUEST):hP(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",pP.BAD_REQUEST)}return t}o(jW,"convertSQLToAST");function QW(e,t,r){try{let n=Lge;if(!e.bypass_auth&&!t.permissions_checked){let i=zW(e,t);if(i&&i.length>0)return r(Oge,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case qp.VALID_SQL_OPS_ENUM.SELECT:n=Tge,s=t.ast.statements[0];break;case qp.VALID_SQL_OPS_ENUM.INSERT:n=Dge;break;case qp.VALID_SQL_OPS_ENUM.UPDATE:n=yge;break;case qp.VALID_SQL_OPS_ENUM.DELETE:n=Age;break;default:throw new Error(`unsupported SQL type ${t.variant} in SQL: ${e}`)}n(s,(i,a)=>{if(i){r(i);return}r(null,a)})}catch(n){return r(n)}}o(QW,"processAST");function Lge(e,t){iR.info(e),t("unknown sql statement")}o(Lge,"nullFunction");function Dge({statement:e,hdb_user:t},r){let n=e.into,s={schema:n.databaseid,table:n.tableid,operation:"insert",hdb_user:t},i=e.columns.map(a=>a.columnid);try{s.records=Mge(i,e.values)}catch(a){return r(a)}Sge(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){iR.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(Dge,"convertInsert");function Mge(e,t){try{return t.map(r=>{if(e.length!==r.length)throw"number of values do not match number of columns in insert";let n={};return r.forEach((s,i)=>{if(s.columnid)throw"cannot use a column in insert value";"value"in s?n[e[i]]=s.value:n[e[i]]=hc.compile(`SELECT ${s.toString()} AS [${qp.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw iR.error(r),new Error(Cge)}}o(Mge,"createDataObjects")});var yP=M((wxe,tz)=>{var uR=require("clone"),dR=ut(),vge=ie(),cR=(k(),v(W)),Ixe=Q(),_P=require("fs"),SP=require("joi"),{string:lR}=SP.types(),{hdbErrors:Uge,handleHDBError:aR}=ge(),{HDB_ERROR_MSGS:Nxe,HTTP_STATUS_CODES:gP}=Uge,{commonValidators:df}=Hi(),XW=" is required",xge=["insert","update","upsert"],TP={database:{presence:!1,format:df.schema_format,length:df.schema_length},schema:{presence:!1,format:df.schema_format,length:df.schema_length},table:{presence:!0,format:df.schema_format,length:df.schema_length},action:{inclusion:{within:xge,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},Bge={schema:lR.required(),table:lR.required(),action:lR.valid("insert","update","upsert")},{AWS_ACCESS_KEY:Fge,AWS_SECRET:Hge,AWS_BUCKET:kge,AWS_FILE_KEY:Gge,REGION:qge}=cR.S3_BUCKET_AUTH_KEYS,$ge={s3:{presence:!0},[`s3.${Fge}`]:{presence:!0,type:"String"},[`s3.${Hge}`]:{presence:!0,type:"String"},[`s3.${kge}`]:{presence:!0,type:"String"},[`s3.${Gge}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${qge}`]:{presence:!0,type:"String"}},ZW=uR(TP);ZW.data.presence={message:XW};var ez=uR(TP);ez.file_path.presence={message:XW};var Vge=Object.assign(uR(TP),$ge),RP=uR(Bge);RP.csv_url=lR.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();RP.passthrough_headers=SP.object();function Kge(e){let t=dR.validateObject(e,ZW);return fR(e,t)}o(Kge,"dataObject");function Yge(e){let t=dR.validateBySchema(e,SP.object(RP));return fR(e,t)}o(Yge,"urlObject");function Wge(e){let t=dR.validateObject(e,ez);return fR(e,t)}o(Wge,"fileObject");function zge(e){let t=dR.validateObject(e,Vge);return fR(e,t)}o(zge,"s3FileObject");function fR(e,t){if(!t){let r=vge.checkGlobalSchemaTable(e.schema,e.table);if(r)return aR(new Error,r,gP.BAD_REQUEST);if(e.operation===cR.OPERATIONS_ENUM.CSV_FILE_LOAD)try{_P.accessSync(e.file_path,_P.constants.R_OK|_P.constants.F_OK)}catch(n){return n.code===cR.NODE_ERROR_CODES.ENOENT?aR(n,`No such file or directory ${n.path}`,gP.BAD_REQUEST):n.code===cR.NODE_ERROR_CODES.EACCES?aR(n,`Permission denied ${n.path}`,gP.BAD_REQUEST):aR(n)}}return t}o(fR,"postValidateChecks");tz.exports={dataObject:Kge,urlObject:Yge,fileObject:Wge,s3FileObject:zge}});var AP=M((Cxe,rz)=>{"use strict";var $p=Q(),mR=(k(),v(W));async function jge(e,t,r,n=void 0){if(!e||typeof e!="function")throw new Error("Invalid function parameter");let s;try{return s=await e(t),r&&await r(t,s,n),t.operation===mR.OPERATIONS_ENUM.INSERT||t.operation===mR.OPERATIONS_ENUM.UPDATE||t.operation===mR.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===mR.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?($p.info(i.message),i):i.http_resp_msg?($p.error(`Error calling operation: ${e.name}`),$p.error(i.http_resp_msg),i):($p.error(`Error calling operation: ${e.name}`),$p.error(i),i)}}o(jge,"callOperationFunctionAsAwait");rz.exports={callOperationFunctionAsAwait:jge}});var bP=M((Lxe,sz)=>{"use strict";var{S3:Qge,GetObjectCommand:Jge}=require("@aws-sdk/client-s3");sz.exports={getFileStreamFromS3:Xge,getS3AuthObj:nz};async function Xge(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await nz(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new Jge(r))).Body}o(Xge,"getFileStreamFromS3");function nz(e,t,r){return new Qge({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(nz,"getS3AuthObj")});var oz=M((Mxe,iz)=>{"use strict";var IP=class{static{o(this,"BulkLoadFileObject")}constructor(t,r,n,s,i,a,c=null){this.op=t,this.action=r,this.schema=n,this.table=s,this.file_path=i,this.file_type=a,this.role_perms=c}},NP=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};iz.exports={BulkLoadFileObject:IP,BulkLoadDataObject:NP}});var OP=M((Uxe,az)=>{"use strict";var wP=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};az.exports=wP});var vP=M((Gxe,bz)=>{"use strict";var hR=Dn(),ER=yP(),Zge=require("needle"),Ri=(k(),v(W)),Bxe=Ot(),ff=ie(),{handleHDBError:Xt,hdbErrors:Ez}=ge(),{HTTP_STATUS_CODES:Xr,HDB_ERROR_MSGS:wr,CHECK_LOGS_WRAPPER:Zl}=Ez,mf=Q(),CP=require("papaparse");ff.promisifyPapaParse();var yi=require("fs-extra"),eSe=require("path"),{chain:cz}=require("stream-chain"),lz=require("stream-json/streamers/StreamArray"),uz=require("stream-json/utils/Batch"),dz=require("stream-chain/utils/comp"),{finished:fz}=require("stream"),tSe=oe(),_z=AP(),rSe=bP(),{BulkLoadFileObject:LP,BulkLoadDataObject:nSe}=oz(),DP=iP(),{verifyBulkLoadAttributePerms:gz}=sR(),Fxe=OP(),Hxe=mr(),kxe=$i(),{databases:sSe}=(Me(),v(Et)),{coerceType:iSe}=(w_(),v(uk)),mz="No records parsed from csv file.",Xl=`${tSe.get("HDB_ROOT")}/tmp`,{schemaRegex:oSe}=Hi(),hz=1024*1024*2,pz=5e3,aSe={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};bz.exports={csvDataLoad:cSe,csvURLLoad:lSe,csvFileLoad:uSe,importFromS3:dSe};async function cSe(e,t){let r=ER.dataObject(e);if(r)throw Xt(r,r.message,Xr.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=Rz(e.schema,e.table),i=CP.parse(e.data,{header:!0,skipEmptyLines:!0,transform:PP.bind(null,s),dynamicTyping:!1}),a=new DP;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&gz(e.hdb_user?.role?.permission,this.job_operation_function.name,e.action,e.schema,e.table,i.meta.fields,a);let c=a.getPermsResponse();if(c)throw Xt(new Error,c,Xr.BAD_REQUEST,void 0,void 0,!0);let l=new nSe(e.action,e.schema,e.table,i.data);return n=await _z.callOperationFunctionAsAwait(yz,l,null),n.message===mz?mz:Az(n.records,n.number_written)}catch(s){throw eu(s)}}o(cSe,"csvDataLoad");async function lSe(e){let t=ER.urlObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${Xl}/${r}`;try{await fSe(e,r)}catch(s){throw mf.error(wr.DOWNLOAD_FILE_ERR(r)+" - "+s),Xt(s,Zl(wr.DOWNLOAD_FILE_ERR(r)))}try{let s=new LP(this.job_operation_function.name,e.action,e.schema,e.table,n,Ri.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await MP(s);return await pR(n),i}catch(s){throw await pR(n),eu(s)}}o(lSe,"csvURLLoad");async function uSe(e){let t=ER.fileObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=new LP(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Ri.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await MP(r)}catch(n){throw eu(n)}}o(uSe,"csvFileLoad");async function dSe(e){let t=ER.s3FileObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=eSe.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${Xl}/${s}`;let i=new LP(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await mSe(s,e);let a=await MP(i);return await pR(r),a}catch(n){throw await pR(r),eu(n)}}o(dSe,"importFromS3");async function fSe(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await Zge("get",e.csv_url,n)}catch(n){let s=`Error downloading CSV file from ${e.csv_url}, status code: ${n.statusCode}. Check the log for more information.`;throw Xt(n,s,n.statusCode,Ri.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}pSe(r,e.csv_url),await hSe(t,r.raw)}o(fSe,"downloadCSVFile");async function mSe(e,t){try{let r=`${Xl}/${e}`;await yi.mkdirp(Xl),await yi.writeFile(`${Xl}/${e}`,"",{flag:"a+"});let n=await yi.createWriteStream(r),s=await rSe.getFileStreamFromS3(t);await new Promise((i,a)=>{s.on("error",function(c){a(c)}),s.pipe(n).on("error",function(c){a(c)}).on("close",function(){mf.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw mf.error(wr.S3_DOWNLOAD_ERR+" - "+r),Xt(r,Zl(wr.S3_DOWNLOAD_ERR))}}o(mSe,"downloadFileFromS3");async function hSe(e,t){try{await yi.mkdirp(Xl),await yi.writeFile(`${Xl}/${e}`,t)}catch(r){throw mf.error(wr.WRITE_TEMP_FILE_ERR),Xt(r,Zl(wr.DEFAULT_BULK_LOAD_ERR))}}o(hSe,"writeFileToTempFolder");async function pR(e){if(e)try{await yi.access(e),await yi.unlink(e)}catch{mf.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(pR,"deleteTempFile");function pSe(e,t){if(e.statusCode!==Ez.HTTP_STATUS_CODES.OK)throw Xt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,Xr.BAD_REQUEST);if(!aSe[e.headers["content-type"]])throw Xt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,Xr.BAD_REQUEST);if(!e.raw)throw Xt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,Xr.BAD_REQUEST)}o(pSe,"validateURLResponse");async function MP(e){try{let t;switch(e.file_type){case Ri.VALID_S3_FILE_TYPES.CSV:t=await ESe(e);break;case Ri.VALID_S3_FILE_TYPES.JSON:t=await _Se(e);break;default:throw Xt(new Error,wr.DEFAULT_BULK_LOAD_ERR,Xr.BAD_REQUEST,Ri.LOG_LEVELS.ERROR,wr.INVALID_FILE_EXT_ERR(e))}return Az(t.records,t.number_written)}catch(t){throw eu(t)}}o(MP,"fileLoad");async function Sz(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;s&&s.pause();let a={operation:e.action,schema:e.schema,table:e.table,records:i};try{let{attributes:c}=await hR.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&gz(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=Xt(c);r(l)}}o(Sz,"validateChunk");async function Tz(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;ff.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!ff.isEmpty(c)&&!ff.isEmpty(c.__parsed_extra)&&delete c.__parsed_extra});else{let c=new Set;i.forEach(l=>{Object.keys(l).forEach(u=>c.add(u))}),a=[...c]}try{let c={schema:e.schema,table:e.table,action:e.action,data:i},l=await _z.callOperationFunctionAsAwait(yz,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=Xt(c,Zl(wr.INSERT_CSV_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,wr.INSERT_CSV_ERR+" - "+c);r(l)}}o(Tz,"insertChunk");async function ESe(e){let t={records:0,number_written:0},r=Rz(e.schema,e.table);try{let n=new DP,s=yi.createReadStream(e.file_path,{highWaterMark:hz});s.setEncoding("utf8"),await CP.parsePromise(s,Sz.bind(null,e,n),PP.bind(null,r));let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Xr.BAD_REQUEST);return s=yi.createReadStream(e.file_path,{highWaterMark:hz}),s.setEncoding("utf8"),await CP.parsePromise(s,Tz.bind(null,e,t),PP.bind(null,r)),s.destroy(),t}catch(n){throw Xt(n,Zl(wr.PAPA_PARSE_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,wr.PAPA_PARSE_ERR+n)}}o(ESe,"callPapaParse");function Rz(e,t){let r=sSe[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>iSe(i,s));return n}o(Rz,"createTransformMap");function PP(e,t,r){let n=e.get(r);return n?n(t):ff.autoCast(t)}o(PP,"typeFunction");async function _Se(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new DP,s=cz([yi.createReadStream(e.file_path,{encoding:"utf-8"}),lz.withParser(),c=>c.value,new uz({batchSize:pz}),dz(async c=>{await Sz(e,n,r,c)})]);await new Promise((c,l)=>{fz(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Xr.BAD_REQUEST);let a=cz([yi.createReadStream(e.file_path,{encoding:"utf-8"}),lz.withParser(),c=>c.value,new uz({batchSize:pz}),dz(async c=>{await Tz(e,t,r,c)})]);return await new Promise((c,l)=>{fz(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw Xt(n,Zl(wr.INSERT_JSON_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,wr.INSERT_JSON_ERR+n)}}o(_Se,"insertJson");async function yz(e){let t={};try{e.data&&e.data.length>0&&gSe(e.data[0])?t=await SSe(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",mf.info(t.message))}catch(r){throw eu(r)}return t}o(yz,"callBulkFileLoad");function gSe(e){let t=Object.keys(e);for(let r of t)if(!oSe.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(gSe,"validateColumnNames");async function SSe(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=hR.insert;break;case"update":i=hR.update;break;case"upsert":i=hR.upsert;break;default:throw Xt(new Error,wr.INVALID_ACTION_PARAM_ERR(n),Xr.BAD_REQUEST,Ri.LOG_LEVELS.ERROR,wr.INVALID_ACTION_PARAM_ERR(n))}try{let a=await i(s),c;switch(n){case"insert":c=a.inserted_hashes;break;case"update":c=a.update_hashes;break;case"upsert":c=a.upserted_hashes;break;default:break}if(Array.isArray(a.skipped_hashes)&&a.skipped_hashes.length>0){let d=global.hdb_schema[t][r].hash_attribute,f=e.length;for(;f--;)a.skipped_hashes.indexOf(e[f][d])>=0&&e.splice(f,1)}let l=ff.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw eu(a)}}o(SSe,"bulkFileLoad");function Az(e,t){return`successfully loaded ${t} of ${e} records`}o(Az,"buildResponseMsg");function eu(e){return Xt(e,Zl(wr.DEFAULT_BULK_LOAD_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,wr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(eu,"buildTopLevelErrMsg")});var BP=M(($xe,Dz)=>{"use strict";var xP=sn(),TSe=bP(),{AsyncParser:RSe}=require("json2csv"),_R=require("stream"),fs=ie(),UP=require("fs-extra"),ySe=require("path"),ks=Q(),{promisify:wz}=require("util"),Vp=ie(),{handleHDBError:_r,hdbErrors:ASe}=ge(),{HDB_ERROR_MSGS:Gn,HTTP_STATUS_CODES:gr}=ASe,{streamAsJSON:bSe}=(EA(),v(fv)),{Upload:ISe}=require("@aws-sdk/lib-storage"),{toCsvStream:NSe}=(Ro(),v(yv)),Iz=["search_by_value","search_by_hash","sql","search_by_conditions"],Nz=["json","csv"],Oz="json",Cz="csv",wSe="Successfully exported JSON locally.",OSe="Successfully exported CSV locally.",CSe=1e3,PSe=xP.searchByHash,LSe=xP.searchByValue,DSe=wz(_R.finished);Dz.exports={export_to_s3:xSe,export_local:MSe};async function MSe(e){ks.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=Pz(e);if(!fs.isEmpty(t))throw ks.error(t),_r(new Error,t,gr.BAD_REQUEST,void 0,void 0,!0);if(fs.isEmpty(e.path))throw ks.error(Gn.MISSING_VALUE("path")),_r(new Error,Gn.MISSING_VALUE("path"),gr.BAD_REQUEST,void 0,void 0,!0);let r=(fs.isEmpty(e.filename)?new Date().getTime():e.filename)+"."+e.format;e.path.endsWith(ySe.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=fs.buildFolderPath(e.path,r);await vSe(e.path);let s=await Lz(e);return await USe(n,e.format,s)}o(MSe,"export_local");async function vSe(e){if(ks.trace("in confirmPath"),fs.isEmptyOrZeroLength(e))throw _r(new Error,`Invalid path: ${e}`,gr.BAD_REQUEST,void 0,void 0,!0);let t;try{t=await UP.stat(e)}catch(r){let n;throw r.code==="ENOENT"?n=`path '${e}' does not exist`:r.code==="EACCES"?n=`access to path '${e}' is denied`:n=r.message,ks.error(n),_r(new Error,n,gr.BAD_REQUEST,void 0,void 0,!0)}if(!t.isDirectory()){let r=`path '${e}' is not a directory, please supply a valid folder path`;throw ks.error(r),_r(new Error,r,gr.BAD_REQUEST,void 0,void 0,!0)}return!0}o(vSe,"confirmPath");async function USe(e,t,r){if(ks.trace("in saveToLocal"),Vp.isEmptyOrZeroLength(e))throw _r(new Error,Gn.INVALID_VALUE("file_path"),gr.BAD_REQUEST,void 0,void 0,!0);if(Vp.isEmptyOrZeroLength(t))throw _r(new Error,Gn.INVALID_VALUE("Source format"),gr.BAD_REQUEST,void 0,void 0,!0);if(Vp.isEmpty(r))throw _r(new Error,Gn.NOT_FOUND("Data"),gr.BAD_REQUEST,void 0,void 0,!0);if(t===Oz){let n=UP.createWriteStream(e);return bSe(r).pipe(n),await DSe(n),{message:wSe,path:e}}else if(t===Cz){let n=UP.createWriteStream(e),s=_R.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new RSe(i,c).fromInput(s).toOutput(n).promise(!1),{message:OSe,path:e}}throw _r(new Error,Gn.INVALID_VALUE("format"),gr.BAD_REQUEST)}o(USe,"saveToLocal");async function xSe(e){if(!e.s3||Object.keys(e.s3).length===0)throw _r(new Error,Gn.MISSING_VALUE("S3 object"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.aws_access_key_id))throw _r(new Error,Gn.MISSING_VALUE("aws_access_key_id"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.aws_secret_access_key))throw _r(new Error,Gn.MISSING_VALUE("aws_secret_access_key"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.bucket))throw _r(new Error,Gn.MISSING_VALUE("bucket"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.key))throw _r(new Error,Gn.MISSING_VALUE("key"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.region))throw _r(new Error,Gn.MISSING_VALUE("region"),gr.BAD_REQUEST);let t=Pz(e);if(!fs.isEmpty(t))throw _r(new Error,t,gr.BAD_REQUEST);ks.trace(`called export_to_s3 to bucket: ${e.s3.bucket} and query ${e.search_operation.sql}`);let r;try{r=await Lz(e)}catch(l){throw ks.error(l),l}let n,s=await TSe.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new _R.PassThrough;if(e.format===Cz){i=e.s3.key+".csv";let l=NSe(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===Oz){i=e.s3.key+".json";let l=new _R.Readable;l.pipe(a),l.on("error",f=>{throw f}),l.push("[");let u=r.length,d="";for(let[f,m]of r.entries()){let h=f===u-1?JSON.stringify(m):JSON.stringify(m)+",";d+=h,f!==0&&f%CSe===0&&(l.push(d),d="")}d.length!==0&&l.push(d),l.push("]"),l.push(null)}else throw _r(new Error,Gn.INVALID_VALUE("format"),gr.BAD_REQUEST);return new ISe({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(xSe,"export_to_s3");function Pz(e){if(ks.trace("in exportCoreValidation"),fs.isEmpty(e.format))return"format missing";if(Nz.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${Nz.join(", ")}`;let t=e.search_operation.operation;if(fs.isEmpty(t))return"search_operation.operation missing";if(Iz.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${Iz.join(", ")}`}o(Pz,"exportCoreValidation");async function Lz(e){ks.trace("in getRecords");let t,r;if(Vp.isEmpty(e.search_operation)||Vp.isEmptyOrZeroLength(e.search_operation.operation))throw _r(new Error,Gn.INVALID_VALUE("Search operation"),gr.BAD_REQUEST);switch(e.search_operation.operation){case"search_by_value":t=LSe;break;case"search_by_hash":t=PSe;break;case"search_by_conditions":t=xP.searchByConditions;break;case"sql":{let n=oR();t=wz(n.evaluateSQL);break}default:throw r=`Operation ${e.search_operation.operation} is not support by export.`,ks.error(r),_r(new Error,r,gr.BAD_REQUEST)}return e.search_operation.hdb_user=e.hdb_user,t(e.search_operation)}o(Lz,"getRecords")});var vz=M((Kxe,Mz)=>{"use strict";var FP=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};Mz.exports=FP});var Bz=M((Wxe,xz)=>{"use strict";var BSe=(k(),v(W)),Uz=require("moment"),FSe=require("uuid").v4,HP=class{static{o(this,"JobObject")}constructor(){this.id=FSe(),this.type=void 0,this.start_datetime=Uz().valueOf(),this.created_datetime=Uz().valueOf(),this.end_datetime=void 0,this.status=BSe.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};xz.exports=HP});var kP=M((jxe,Kz)=>{"use strict";var HSe=require("uuid").v4,qz=Dn(),$z=sn(),kSe=ai(),GSe=Ku(),qSe=vz(),Mt=(k(),v(W)),$Se=Bz(),VSe=dS(),Ai=Q(),KSe=Zf(),hf=ie(),{promisify:YSe}=require("util"),tu=require("moment"),WSe=oR(),gR=yP(),Fz=OI(),{deleteTransactionLogsBeforeValidator:zSe}=VC(),{handleHDBError:Hz,hdbErrors:jSe,ClientError:QSe}=ge(),{HTTP_STATUS_CODES:kz}=jSe,Gz=$z.searchByValue,JSe=$z.searchByHash,XSe=qz.insert,ZSe=YSe(WSe.evaluateSQL),eTe=qz.update;Kz.exports={addJob:nTe,updateJob:iTe,handleGetJob:tTe,handleGetJobsByStartDate:rTe,getJobById:Vz};async function tTe(e){if(e.id===void 0)throw new QSe("'id' is required");let t=await Vz(e.id);return hf.isEmptyOrZeroLength(t)||(t[0]={...t[0]},t[0].request!==void 0&&delete t[0].request,delete t[0].__createdtime__,delete t[0].__updatedtime__),t}o(tTe,"handleGetJob");async function rTe(e){try{let t=await sTe(e);if(Ai.trace(`Searching for jobs from ${e.from_date} to ${e.to_date}`),t&&t.length>0)for(let r of t)r.start_datetime&&(r.start_datetime_converted=tu(r.start_datetime)),r.end_datetime&&(r.end_datetime_converted=tu(r.end_datetime)),r.request!==void 0&&delete r.request,delete r.__createdtime__,delete r.__updatedtime__;return t}catch(t){let r=`There was an error searching jobs by date: ${t}`;throw Ai.error(r),new Error(r)}}o(rTe,"handleGetJobsByStartDate");async function nTe(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||hf.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return Ai.info(d),t.error=d,t}if(!Mt.JOB_TYPE_ENUM[e.operation])return Ai.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Mt.OPERATIONS_ENUM.CSV_FILE_LOAD:n=gR.fileObject(e);break;case Mt.OPERATIONS_ENUM.CSV_URL_LOAD:n=gR.urlObject(e);break;case Mt.OPERATIONS_ENUM.CSV_DATA_LOAD:n=gR.dataObject(e);break;case Mt.OPERATIONS_ENUM.IMPORT_FROM_S3:n=gR.s3FileObject(e);break;case Mt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Mt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=Fz(e,"date");break;case Mt.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=Fz(e,"timestamp");break;case Mt.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=zSe(e);break;case Mt.OPERATIONS_ENUM.RESTART_SERVICE:if(Mt.HDB_PROCESS_SERVICES[e.service]===void 0)throw Hz(new Error,"Invalid service",kz.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw Hz(n,n.message,kz.BAD_REQUEST,void 0,void 0,!0);let s=new $Se;s.type=e.operation===Mt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE?Mt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:e.operation,s.type=e.operation,s.user=e.hdb_user?.username;let i=new kSe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await Gz(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return Ai.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=HSe();try{a=await Gz(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return Ai.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return Ai.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new KSe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await XSe(l)}catch(d){return Ai.error(`There was an error inserting a job for job type: ${e.operation} -- ${d}`),t.success=!1,t}if(u.inserted_hashes.length===0)t.message=`Had a problem creating a job with type ${s.operation} and id ${s.id}`;else{let d=`Created a job with type ${s.type} and id ${s.id}`;t.message=d,t.createdJob=s,t.success=!0,Ai.trace(d)}return t}o(nTe,"addJob");async function sTe(e){let t=tu(e.from_date,tu.ISO_8601),r=tu(e.to_date,tu.ISO_8601);if(!t.isValid())throw new Error("Invalid 'from' date, must be in ISO-8601 format (YYYY-MM-DD).");if(!r.isValid())throw new Error("Invalid 'to' date, must be in ISO-8601 format (YYYY-MM-DD)");let n=`select * from system.hdb_job where start_datetime > '${t.valueOf()}' and start_datetime < '${r.valueOf()}'`,s=new qSe(n,e.hdb_user);try{return await ZSe(s)}catch(i){throw Ai.error(`there was a problem searching for jobs from date ${e.from_date} to date ${e.to_date} ${i}`),new Error("there was an error searching for jobs. Please check the log for details.")}}o(sTe,"getJobsInDateRange");async function Vz(e){if(hf.isEmptyOrZeroLength(e))return hf.errorizeMessage("Invalid job ID specified.");let t=new GSe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await JSe(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return Ai.error(n),hf.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(Vz,"getJobById");async function iTe(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(hf.isEmptyOrZeroLength(e.id))throw new Error("invalid ID passed to updateJob");(e.status===Mt.JOB_STATUS_ENUM.COMPLETE||e.status===Mt.JOB_STATUS_ENUM.ERROR)&&(e.end_datetime=tu().valueOf());let t=new VSe(Mt.SYSTEM_SCHEMA_NAME,Mt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await eTe(t),r}o(iTe,"updateJob")});var Zz=M((Jxe,Xz)=>{"use strict";var Yz=ie(),Or=(k(),v(W)),oTe=require("moment"),SR=vP(),Kp=Q(),Wz=kP(),zz=BP(),jz=El(),Qz=nt(),aTe=QT(),cTe=sf(),{parentPort:lTe,isMainThread:Jz}=require("worker_threads"),{onMessageByType:uTe}=nt(),GP=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function dTe(e){if(!e||Object.keys(e).length===0)throw new Error("Empty runner passed to parseMessage");if(!e.json||Object.keys(e.json).length===0)throw new Error("Empty JSON passed to parseMessage");if(!e.job||Object.keys(e.job).length===0)throw new Error("Empty job passed to parseMessage");if(Yz.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(Yz.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case Or.JOB_TYPE_ENUM.csv_file_load:await so(e,SR.csvFileLoad);break;case Or.JOB_TYPE_ENUM.csv_url_load:await so(e,SR.csvURLLoad);break;case Or.JOB_TYPE_ENUM.csv_data_load:await so(e,SR.csvDataLoad);break;case Or.JOB_TYPE_ENUM.import_from_s3:await so(e,SR.importFromS3);break;case Or.JOB_TYPE_ENUM.empty_trash:break;case Or.JOB_TYPE_ENUM.export_local:await so(e,zz.export_local);break;case Or.JOB_TYPE_ENUM.export_to_s3:await so(e,zz.export_to_s3);break;case Or.JOB_TYPE_ENUM.delete_files_before:case Or.JOB_TYPE_ENUM.delete_records_before:await so(e,jz.deleteFilesBefore);break;case Or.JOB_TYPE_ENUM.delete_audit_logs_before:await so(e,jz.deleteAuditLogsBefore);break;case Or.JOB_TYPE_ENUM.delete_transaction_logs_before:await so(e,aTe.deleteTransactionLogsBefore);break;case Or.JOB_TYPE_ENUM.restart_service:return await so(e,cTe.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(dTe,"parseMessage");async function so(e,t){try{e.job.status=Or.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=oTe().valueOf(),await Wz.updateJob(e.job),await fTe(e.job.id)}catch(r){let n=r.message!==void 0?r.message:r;typeof n=="string"?(n=`There was an error running ${t.name} job with id ${e.job.id} - ${n}`,r.message=n):Kp.error(`There was an error running ${t.name} job with id ${e.job.id}`),Kp.error(n),e.job.message=n,e.job.status=Or.JOB_STATUS_ENUM.ERROR;try{await Wz.updateJob(e.job)}catch(s){throw Kp.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(so,"runJob");async function fTe(e){Kp.trace("launching job thread:",e),Jz?Qz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):lTe.postMessage({type:Or.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(fTe,"launchJobThread");Jz&&uTe(Or.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{Qz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){Kp.error(r)}});Xz.exports={parseMessage:dTe,RunnerMessage:GP}});var tj=M((Zxe,ej)=>{"use strict";var mTe=ie(),qP=oe(),pc=(k(),v(W)),hTe=Ot(),pTe=mr(),io=Q(),ETe=OP(),_Te=$i();qP.initSync();ej.exports={postOperationHandler:STe,sendOperationTransaction:Yp};async function Yp(e,t,r,n){if(e.schema===pc.SYSTEM_SCHEMA_NAME)return;let s=gTe(e,t,r);s&&(io.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await pTe.publishToStream(`${hTe.SUBJECT_PREFIXES.TXN}.${e.schema}`,_Te.createNatsTableStreamName(e.schema,e.table),n,s))}o(Yp,"sendOperationTransaction");function gTe(e,t,r){if(mTe.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===pc.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(gTe,"convertCRUDOperationToTransaction");async function STe(e,t,r){if(!qP.get(pc.CONFIG_PARAMS.CLUSTERING_ENABLED))return;io.trace(`postOperationHandler called for operation ${e.operation} on schema.table: ${e.schema}.${e.table}`);let n=e.hdb_user?.username,s=qP.get(pc.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new ETe(t.txn_time,n,s);switch(e.operation){case pc.OPERATIONS_ENUM.INSERT:try{await Yp(e,t.inserted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for insert."),io.error(a)}break;case pc.OPERATIONS_ENUM.DELETE:try{await Yp(e,t.deleted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for delete."),io.error(a)}break;case pc.OPERATIONS_ENUM.UPDATE:try{await Yp(e,t.update_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for update."),io.error(a)}break;case pc.OPERATIONS_ENUM.UPSERT:try{await Yp(e,t.upserted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for upsert."),io.error(a)}break;default:break}return t}o(STe,"postOperationHandler")});var J,rj=ce(()=>{J=class{static{o(this,"OperationFunctionObject")}operation_function;job_operation_function;constructor(t,r=void 0){this.operation_function=t,this.job_operation_function=r}}});var qC={};we(qC,{chooseOperation:()=>Rj,executeJob:()=>Gs,getOperationFunction:()=>yj,operation:()=>JP,processLocalTransaction:()=>Tj});async function Tj(e,t){try{if(e.body.operation!=="read_log"&&(Qp.default.log_level===Vf.INFO||Qp.default.log_level===Vf.DEBUG||Qp.default.log_level===Vf.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;Sn.info(c)}}catch(n){Sn.error(n)}let r=await gj.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return yTe[e.body.operation]&&hj.default.setSchemaDataToGlobal(n=>{n&&Sn.error(n)}),r}function Rj(e){let t;try{t=yj(e)}catch(s){throw Sn.error(`Error when selecting operation function - ${s}`),s}let{operation_function:r,job_operation_function:n}=t;try{if(e.operation==="sql"||e.search_operation&&e.search_operation.operation==="sql"){let s=e.operation==="sql"?e.sql:e.search_operation.sql,i=yR.default.convertSQLToAST(s);if(e.parsed_sql_object=i,!e.bypass_auth){let a=yR.default.checkASTPermissions(e,i);if(a)throw Sn.error(`${nj.FORBIDDEN} from operation ${e.operation}`),Sn.warn(`User '${e.hdb_user?.username}' is not permitted to ${e.operation}`),(0,qs.handleHDBError)(new Error,a,qs.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,void 0,!0)}}else if(!e.bypass_auth&&e.operation!==q.CREATE_AUTHENTICATION_TOKENS&&e.operation!==q.LOGIN&&e.operation!==q.LOGOUT){let s=n===void 0?r:n,i=e.search_operation?e.search_operation:e;i.hdb_user||(i.hdb_user=e.hdb_user);let a=mj.default.verifyPerms(i,s);if(a)throw Sn.error(`${nj.FORBIDDEN} from operation ${e.operation}`),Sn.warn(`User '${i.hdb_user?.username}' is not permitted to ${i.operation}`),(0,qs.handleHDBError)(new Error,a,qs.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,!1,!0)}}catch(s){throw(0,qs.handleHDBError)(s,"There was an error when trying to choose an operation path")}return r}function yj(e){if(Sn.trace(`getOperationFunction with operation: ${e.operation}`),sj.has(e.operation))return sj.get(e.operation);throw(0,qs.handleHDBError)(new Error,qs.hdbErrors.HDB_ERROR_MSGS.OP_NOT_FOUND(e.operation),qs.hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}function JP(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=Rj(e);return Tj({body:e},n)}async function ATe(e){Sn.trace("In serverUtils.catchup");let t=e.transaction,r=t.channel.split(":"),n=r[0],s=r[1];for(let i of t.transactions)try{i.schema=n,i.table=s,i[Jy]=!0;let a;switch(i.operation){case q.INSERT:a=await nu.default.insert(i);break;case q.UPDATE:a=await nu.default.update(i);break;case q.UPSERT:a=await nu.default.upsert(i);break;case q.DELETE:a=await _f.default.deleteRecord(i);break;default:Sn.warn("invalid operation in catchup");break}await Sj.transactToClusteringUtils.postOperationHandler(i,a,e)}catch(a){Sn.info("Invalid operation in transaction"),Sn.error(a)}}async function Gs(e){(0,_j.transformReq)(e);let t,r;try{if(r=await AR.default.addJob(e),r){t=r.createdJob,Sn.info("addJob result",r);let n=new YP.default.RunnerMessage(t,e);return{message:await YP.default.parseMessage(n)??`Starting job with id ${t.id}`,job_id:t.id}}}catch(n){let s=n instanceof Error?n:null,i=`There was an error executing job: ${s&&"http_resp_msg"in s?s.http_resp_msg:n}`;throw Sn.error(i),(0,qs.handleHDBError)(n,i)}}function bTe(){let e=new Map;return e.set(q.INSERT,new J(nu.default.insert)),e.set(q.UPDATE,new J(nu.default.update)),e.set(q.UPSERT,new J(nu.default.upsert)),e.set(q.SEARCH_BY_CONDITIONS,new J(Ef.default.searchByConditions)),e.set(q.SEARCH_BY_HASH,new J(Ef.default.searchByHash)),e.set(q.SEARCH_BY_ID,new J(Ef.default.searchByHash)),e.set(q.SEARCH_BY_VALUE,new J(Ef.default.searchByValue)),e.set(q.SEARCH,new J(TTe)),e.set(q.SQL,new J(RTe)),e.set(q.CSV_DATA_LOAD,new J(Gs,Wp.default.csvDataLoad)),e.set(q.CSV_FILE_LOAD,new J(Gs,Wp.default.csvFileLoad)),e.set(q.CSV_URL_LOAD,new J(Gs,Wp.default.csvURLLoad)),e.set(q.IMPORT_FROM_S3,new J(Gs,Wp.default.importFromS3)),e.set(q.CREATE_SCHEMA,new J(bi.default.createSchema)),e.set(q.CREATE_DATABASE,new J(bi.default.createSchema)),e.set(q.CREATE_TABLE,new J(bi.default.createTable)),e.set(q.CREATE_ATTRIBUTE,new J(bi.default.createAttribute)),e.set(q.DROP_SCHEMA,new J(bi.default.dropSchema)),e.set(q.DROP_DATABASE,new J(bi.default.dropSchema)),e.set(q.DROP_TABLE,new J(bi.default.dropTable)),e.set(q.DROP_ATTRIBUTE,new J(bi.default.dropAttribute)),e.set(q.DESCRIBE_SCHEMA,new J(zp.default.describeSchema)),e.set(q.DESCRIBE_DATABASE,new J(zp.default.describeSchema)),e.set(q.DESCRIBE_TABLE,new J(zp.default.describeTable)),e.set(q.DESCRIBE_ALL,new J(zp.default.describeAll)),e.set(q.DELETE,new J(_f.default.deleteRecord)),e.set(q.ADD_USER,new J(pf.default.addUser)),e.set(q.ALTER_USER,new J(pf.default.alterUser)),e.set(q.DROP_USER,new J(pf.default.dropUser)),e.set(q.LIST_USERS,new J(pf.default.listUsersExternal)),e.set(q.LIST_ROLES,new J(jp.default.listRoles)),e.set(q.ADD_ROLE,new J(jp.default.addRole)),e.set(q.ALTER_ROLE,new J(jp.default.alterRole)),e.set(q.DROP_ROLE,new J(jp.default.dropRole)),e.set(q.USER_INFO,new J(pf.default.userInfo)),e.set(q.READ_LOG,new J(oj.default)),e.set(q.ADD_NODE,new J(aj.default)),e.set(q.UPDATE_NODE,new J($P.default)),e.set(q.SET_NODE_REPLICATION,new J($P.default)),e.set(q.REMOVE_NODE,new J(cj.default)),e.set(q.CONFIGURE_CLUSTER,new J(lj.default)),e.set(q.PURGE_STREAM,new J(uj.default)),e.set(q.SET_CONFIGURATION,new J(WP.default.setConfiguration)),e.set(q.CLUSTER_STATUS,new J(dj.default.clusterStatus)),e.set(q.CLUSTER_NETWORK,new J(fj.default)),e.set(q.CLUSTER_SET_ROUTES,new J(TR.default.setRoutes)),e.set(q.CLUSTER_GET_ROUTES,new J(TR.default.getRoutes)),e.set(q.CLUSTER_DELETE_ROUTES,new J(TR.default.deleteRoutes)),e.set(q.EXPORT_TO_S3,new J(Gs,VP.default.export_to_s3)),e.set(q.CREATE_CSR,new J(ru.default.createCsr)),e.set(q.SIGN_CERTIFICATE,new J(ru.default.signCertificate)),e.set(q.LIST_CERTIFICATES,new J(ru.default.listCertificates)),e.set(q.ADD_CERTIFICATES,new J(ru.default.addCertificate)),e.set(q.REMOVE_CERTIFICATE,new J(ru.default.removeCertificate)),e.set(q.GET_KEY,new J(ru.default.getKey)),e.set(q.ADD_NODE_BACK,new J(xO)),e.set(q.REMOVE_NODE_BACK,new J(BO)),e.set(q.DELETE_FILES_BEFORE,new J(Gs,_f.default.deleteFilesBefore)),e.set(q.DELETE_RECORDS_BEFORE,new J(Gs,_f.default.deleteFilesBefore)),e.set(q.EXPORT_LOCAL,new J(Gs,VP.default.export_local)),e.set(q.SEARCH_JOBS_BY_START_DATE,new J(AR.default.handleGetJobsByStartDate)),e.set(q.GET_JOB,new J(AR.default.handleGetJob)),e.set(q.GET_FINGERPRINT,new J(RR.default.getFingerprint)),e.set(q.SET_LICENSE,new J(RR.default.setLicense)),e.set(q.GET_REGISTRATION_INFO,new J(RR.default.getRegistrationInfo)),e.set(q.RESTART,new J(KP.default.restart)),e.set(q.RESTART_SERVICE,new J(Gs,KP.default.restartService)),e.set(q.CATCHUP,new J(ATe)),e.set(q.SYSTEM_INFORMATION,new J(pj.default.systemInformation)),e.set(q.DELETE_AUDIT_LOGS_BEFORE,new J(Gs,_f.default.deleteAuditLogsBefore)),e.set(q.READ_AUDIT_LOG,new J(ij.default)),e.set(q.CREATE_AUTHENTICATION_TOKENS,new J(mw)),e.set(q.REFRESH_OPERATION_TOKEN,new J(hw)),e.set(q.LOGIN,new J(vC)),e.set(q.LOGOUT,new J(UC)),e.set(q.GET_CONFIGURATION,new J(WP.default.getConfiguration)),e.set(q.CUSTOM_FUNCTIONS_STATUS,new J(vt.default.customFunctionsStatus)),e.set(q.GET_CUSTOM_FUNCTIONS,new J(vt.default.getCustomFunctions)),e.set(q.GET_COMPONENT_FILE,new J(vt.default.getComponentFile)),e.set(q.GET_COMPONENTS,new J(vt.default.getComponents)),e.set(q.SET_COMPONENT_FILE,new J(vt.default.setComponentFile)),e.set(q.DROP_COMPONENT,new J(vt.default.dropComponent)),e.set(q.GET_CUSTOM_FUNCTION,new J(vt.default.getCustomFunction)),e.set(q.SET_CUSTOM_FUNCTION,new J(vt.default.setCustomFunction)),e.set(q.DROP_CUSTOM_FUNCTION,new J(vt.default.dropCustomFunction)),e.set(q.ADD_CUSTOM_FUNCTION_PROJECT,new J(vt.default.addComponent)),e.set(q.ADD_COMPONENT,new J(vt.default.addComponent)),e.set(q.DROP_CUSTOM_FUNCTION_PROJECT,new J(vt.default.dropCustomFunctionProject)),e.set(q.PACKAGE_CUSTOM_FUNCTION_PROJECT,new J(vt.default.packageComponent)),e.set(q.PACKAGE_COMPONENT,new J(vt.default.packageComponent)),e.set(q.DEPLOY_CUSTOM_FUNCTION_PROJECT,new J(vt.default.deployComponent)),e.set(q.DEPLOY_COMPONENT,new J(vt.default.deployComponent)),e.set(q.READ_TRANSACTION_LOG,new J(zP.default.readTransactionLog)),e.set(q.DELETE_TRANSACTION_LOGS_BEFORE,new J(Gs,zP.default.deleteTransactionLogsBefore)),e.set(q.INSTALL_NODE_MODULES,new J(jP.default.installModules)),e.set(q.AUDIT_NODE_MODULES,new J(jP.default.auditModules)),e.set(q.GET_BACKUP,new J(bi.default.getBackup)),e.set(q.CLEANUP_ORPHAN_BLOBS,new J(bi.default.cleanupOrphanBlobs)),e.set(q.ADD_SSH_KEY,new J(vt.default.addSSHKey)),e.set(q.UPDATE_SSH_KEY,new J(vt.default.updateSSHKey)),e.set(q.DELETE_SSH_KEY,new J(vt.default.deleteSSHKey)),e.set(q.LIST_SSH_KEYS,new J(vt.default.listSSHKeys)),e.set(q.SET_SSH_KNOWN_HOSTS,new J(vt.default.setSSHKnownHosts)),e.set(q.GET_SSH_KNOWN_HOSTS,new J(vt.default.getSSHKnownHosts)),e.set(q.GET_ANALYTICS,new J(YC)),e.set(q.LIST_METRICS,new J(WC)),e.set(q.DESCRIBE_METRIC,new J(zC)),e.set(q.GET_STATUS,new J(ZC)),e.set(q.SET_STATUS,new J(eP)),e.set(q.CLEAR_STATUS,new J(XC)),e}var Ef,yR,Wp,bi,zp,_f,ij,pf,jp,vt,Qp,oj,aj,$P,cj,lj,uj,dj,fj,TR,VP,mj,AR,qs,RR,KP,QP,nu,hj,pj,YP,WP,zP,jP,Ej,_j,ru,gj,Sj,nj,Sn,TTe,RTe,yTe,sj,$C=ce(()=>{Ef=w(sn()),yR=w(oR()),Wp=w(vP()),bi=w(ep()),zp=w(Ua()),_f=w(El()),ij=w(uO()),pf=w(ts()),jp=w(Oh()),vt=w(GC()),Qp=w(Q()),oj=w(pO()),aj=w(pT()),$P=w(qO()),cj=w(_T()),lj=w(KO()),uj=w(YO()),dj=w(jO()),fj=w(JO()),TR=w(yT()),VP=w(BP()),mj=w(sR()),AR=w(kP());k();qs=w(ge()),RR=w(uC()),KP=w(sf()),QP=w(require("util")),nu=w(Dn()),hj=w(ii()),pj=w($d()),YP=w(Zz());Td();qT();WP=w(wt()),zP=w(QT()),jP=w(wp()),Ej=w(Xs()),_j=w(ie());Dr();ru=w(as());Kd();QC();gj=w(AP()),Sj=w(tj());Bp();rj();({HTTP_STATUS_CODES:nj}=qs.hdbErrors),Sn=Qp.default.loggerWithTag("operation"),TTe=QP.promisify(Ef.default.search),RTe=QP.promisify(yR.default.evaluateSQL),yTe={[q.CREATE_ATTRIBUTE]:!0,[q.CREATE_TABLE]:!0,[q.CREATE_SCHEMA]:!0,[q.DROP_ATTRIBUTE]:!0,[q.DROP_TABLE]:!0,[q.DROP_SCHEMA]:!0};o(Tj,"processLocalTransaction");sj=bTe();Le.operation=JP;o(Rj,"chooseOperation");o(yj,"getOperationFunction");(0,Ej._assignPackageExport)("operation",JP);o(JP,"operation");o(ATe,"catchup");o(Gs,"executeJob");o(bTe,"initializeOperationFunctionMap")});var NR=M((oBe,Ij)=>{"use strict";var bR=(k(),v(W)),ITe=ie(),Jp=Q(),{handleHDBError:XP,hdbErrors:IR}=ge(),{isMainThread:NTe}=require("worker_threads"),{Readable:wTe}=require("stream"),Aj=require("os"),OTe=require("util"),CTe=Ew(),PTe=OTe.promisify(CTe.authorize),bj=($C(),v(qC)),{createGzip:LTe,constants:DTe}=require("zlib"),MTe=[bR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,bR.OPERATIONS_ENUM.LOGIN,bR.OPERATIONS_ENUM.LOGOUT];function vTe(e){let t=`Found an uncaught exception with message: ${e.message}. ${Aj.EOL}Stack: ${e.stack} ${Aj.EOL}Terminating ${NTe?"HDB":"thread"}.`;console.error(t),Jp.fatal(t),process.exit(1)}o(vTe,"handleServerUncaughtException");function UTe(e,t,r){if(Jp[e.logLevel||"error"](e),e.statusCode)return typeof e.http_resp_msg!="object"?r.code(e.statusCode).send({error:e.http_resp_msg||e.message}):r.code(e.statusCode).send(e.http_resp_msg);let n=e.statusCode?e.statusCode:IR.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR;return typeof e=="string"?r.code(n).send({error:e}):r.code(n).send(e.message?{error:e.message}:e)}o(UTe,"serverErrorHandler");function xTe(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=XP(new Error,"Invalid JSON.",IR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(ITe.isEmpty(e.body.operation)){let n=XP(new Error,"Request body must include an 'operation' property.",IR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(xTe,"reqBodyValidationHandler");function BTe(e,t,r){let n;!MTe.includes(e.body.operation)||e.body.operation===bR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?PTe(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{Jp.warn(i),Jp.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(XP(i,a,IR.HTTP_STATUS_CODES.UNAUTHORIZED),null)}):(e.body.hdb_user=null,e.body.baseRequest=e.raw?.baseRequest,e.body.baseResponse=t.raw?.baseResponse,e.body.fastifyResponse=t,r())}o(BTe,"authHandler");async function FTe(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=bj.chooseOperation(e.body);let s=await bj.processLocalTransaction(e,n);if(s instanceof wTe&&s.headers){for(let[i,a]of s.headers)t.header(i,a);e.headers["accept-encoding"]?.includes("gzip")&&(t.header("content-encoding","gzip"),s=s.pipe(LTe({level:DTe.Z_BEST_SPEED})))}return s}catch(s){throw Jp.error(s),s}}o(FTe,"handlePostRequest");Ij.exports={authHandler:BTe,handlePostRequest:FTe,handleServerUncaughtException:vTe,serverErrorHandler:UTe,reqBodyValidationHandler:xTe}});var Cj=M((cBe,Oj)=>{"use strict";var HTe=require("fastify-plugin"),{handlePostRequest:Nj,authHandler:kTe,reqBodyValidationHandler:GTe}=NR();async function qTe(e){e.decorate("hdbCore",{preValidation:[GTe,kTe],request:o((t,r)=>wj(Nj(t,r)),"request"),requestWithoutAuthentication:o((t,r)=>wj(Nj(t,r,!0)),"requestWithoutAuthentication")})}o(qTe,"hdbCore");async function wj(e){if(e=await e,e?.[Symbol.asyncIterator]&&!e[Symbol.iterator]){let t=[];for await(let r of e)t.push(r);return t}return e}o(wj,"convertAsyncIterators");Oj.exports=HTe(qTe)});var Lj=M((dBe,Pj)=>{"use strict";var uBe=require("fs"),wR=oe();wR.initSync();var{CONFIG_PARAMS:ZP}=(k(),v(W)),$Te=1024*1024*1024;function VTe(e){let t=wR.get(ZP.HTTP_TIMEOUT),r=wR.get(ZP.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:$Te,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:wR.get(ZP.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(VTe,"getServerOptions");Pj.exports=VTe});var vj=M((mBe,Mj)=>{"use strict";var eL=oe();eL.initSync();var{CONFIG_PARAMS:Dj}=(k(),v(W));function KTe(){let e=eL.get(Dj.HTTP_CORSACCESSLIST),t=eL.get(Dj.HTTP_CORS),r;return t&&(r={origin:!0,allowedHeaders:["Content-Type","Authorization","Accept"],credentials:!1},e&&e.length>0&&e[0]!==null&&e[0]!=="*"&&(r.origin=(n,s)=>s(null,e.indexOf(n)!==-1))),r}o(KTe,"getCORSOptions");Mj.exports=KTe});var Bj=M((pBe,xj)=>{"use strict";var Uj=oe();Uj.initSync();var YTe=(k(),v(W));function WTe(){return Uj.get(YTe.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(WTe,"getHeaderTimeoutConfig");xj.exports=WTe});var rL={};we(rL,{customFunctionsServer:()=>QTe,ready:()=>Jj,start:()=>jTe});function jTe(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){ra||(ra=Qj(t),Le.http((await ra).server));let a=await ra,c=(0,tL.dirname)(s),l=(0,tL.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!Fj.has(c)){Fj.add(c);try{a.register(XTe(c,l))}catch(u){if(u.message==="Root plugin has already booted")yt.warn(`Could not load root fastify route for ${s}, this may require a restart to install properly`);else throw u}}},ready:Jj}}async function QTe(){try{yt.info("In Custom Functions Fastify server"+process.cwd()),yt.info(`Custom Functions Running with NODE_ENV set as: ${process.env.NODE_ENV}`),yt.debug(`Custom Functions server process ${process.pid} starting up.`),await JTe();let e=Vj.get(U.HTTP_SECUREPORT)>0,t;try{t=ra=await Qj(e)}catch(r){throw yt.error(`Custom Functions buildServer error: ${r}`),r}try{await t.ready()}catch(r){throw yt.error(`Custom Functions server.ready() error: ${r}`),r}t.server.cantCleanupProperly=!0}catch(e){yt.error(`Custom Functions ${process.pid} Error: ${e}`),yt.error(e),process.exit(1)}}async function JTe(){try{yt.info("Custom Functions starting configuration."),await Kj.setUsersWithRolesCache(),yt.info("Custom Functions completed configuration.")}catch(e){yt.error(e)}}function XTe(e,t){return async function(r){try{yt.info("Custom Functions starting buildRoutes"),yt.trace("Loading fastify routes folder "+e),(0,Hj.existsSync)(e)&&r.register($j.default,s=>({dir:e,dirNameRoutePrefix:!1,options:{hdbCore:s.hdbCore,logger:yt.loggerWithTag("custom-function"),prefix:`/${t}`}})).after((s,i,a)=>{s?.message?yt.error(s.message):s&&yt.error(s),a()})}catch(n){yt.error(`Custom Functions errored buildRoutes: ${n}`)}}}async function Qj(e){yt.info("Custom Functions starting buildServer.");let t=(0,Yj.default)(e),r=(0,kj.default)(t);r.server.headersTimeout=(0,zj.default)(),r.setErrorHandler(jj.serverErrorHandler);let n=(0,Wj.default)();return n&&r.register(Gj.default,n),r.register(function(s,i,a){s.setNotFoundHandler(function(c,l){l.sent||l.raw.headersSent||l.raw.writableEnded||r.server.emit("unhandled",c.raw,l.raw)}),a()}),r.register(qj.default),await r.register(zTe),await r.after(),am(r),yt.info("Custom Functions completed buildServer."),r}function Jj(){if(ra)return ra.then?ra.then(e=>e.ready()):ra.ready()}var tL,Hj,kj,Gj,qj,$j,Vj,yt,zTe,Kj,Yj,Wj,zj,jj,ra,Fj,Xj=ce(()=>{tL=require("path"),Hj=require("fs"),kj=w(require("fastify")),Gj=w(require("@fastify/cors")),qj=w(lw()),$j=w(require("@fastify/autoload")),Vj=w(oe());k();yt=w(Q()),zTe=w(Cj()),Kj=w(ts()),Yj=w(Lj()),Wj=w(vj()),zj=w(Bj()),jj=w(NR());Ro();Dr();Fj=new Set;o(jTe,"start");o(QTe,"customFunctionsServer");o(JTe,"setUp");o(XTe,"buildRouteFolder");o(Qj,"buildServer");o(Jj,"ready")});var nL={};we(nL,{start:()=>ZTe});function ZTe(e){return{handleDirectory(t,r){if(t==="/"){let n=(0,n2.default)(r,e);return e.server.http(async(s,i)=>{if(!s.isWebSocket)return new Promise(a=>n(s._nodeRequest,s._nodeResponse,()=>{a(i(s))}))}),!0}},handleFile(t,r,n){e2||(e2=!0,e.server.http(async(s,i)=>{if(!s.isWebSocket){let a=Zj.get(s.pathname);if(a)return{handlesHeaders:!0,body:(0,t2.default)(s,(0,r2.realpathSync)(a))}}return i(s)},{runFirst:!0})),Zj.set(r,n)}}}var t2,r2,n2,Zj,e2,s2=ce(()=>{t2=w(require("send")),r2=require("fs"),n2=w(require("serve-static")),Zj=new Map;o(ZTe,"start")});var sL={};we(sL,{start:()=>eRe});function eRe({override:e}){return{handleFile:o((t,r,n)=>{OR.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,i2.parse)(t))){if(process.env[s]!==void 0)if(OR.default.warn(`Environment variable conflict: ${s} from ${n} is already set on process.env`),e)OR.default.debug(`override option enabled. overriding environment variable: ${s}`);else continue;process.env[s]=i}},"handleFile")}}var i2,OR,o2=ce(()=>{i2=require("dotenv"),OR=w(Q());o(eRe,"start")});var aL={};we(aL,{DataLoaderError:()=>ms,DataLoaderResult:()=>gf,EmptyFileError:()=>DR,FileParseError:()=>LR,InvalidPropertyTypeError:()=>MR,MissingRequiredPropertyError:()=>Xp,RecordProcessingError:()=>Zp,SystemDatabaseError:()=>vR,UnsupportedFileExtensionError:()=>PR,computeRecordHash:()=>oL,handleApplication:()=>nRe,loadDataFile:()=>h2,suppressHandleApplicationWarning:()=>rRe});function oL(e){let t=Object.keys(e).sort(),r={};for(let s of t)r[s]=e[s];let n=JSON.stringify(r);return(0,c2.createHash)("sha256").update(n).digest("hex")}function m2(e){return e.system&&e.system[iL]?e.system[iL]:CR||(CR=ze({database:"system",table:iL,attributes:[{name:"id",type:"string",isPrimaryKey:!0},{name:"hash",type:"string"}]}),CR)}async function tRe(e,t,r,n){try{let s=m2(n),i=e?`${e}:${t}:${r}`:`${t}:${r}`;return(await s.get(i))?.hash||null}catch(s){return $s.error?.(`Failed to get stored hash: ${s.message}`),null}}async function a2(e,t,r,n,s){try{let i=m2(s),a=e?`${e}:${t}:${r}`:`${t}:${r}`;await i.put({id:a,hash:n})}catch(i){$s.error?.(`Failed to store hash: ${i.message}`)}}function nRe(e){if((0,u2.getWorkerIndex)()!==0){$s.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||h2(t,ln,He).then(r=>{$s.debug?.("Data loader processed file: %s: %s",(0,na.basename)(t.absolutePath),r.message)})})}async function h2({contents:e,absolutePath:t,stats:r},n,s){let i=(0,na.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,l2.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new PR(t,i)}catch(f){throw f instanceof ms?f:new LR(t,f)}if(!a)throw new DR(t);let{database:c,table:l,records:u}=a;if(!l)throw new Xp(t,"table");if(!u)throw new Xp(t,"records");if(!Array.isArray(u))throw new MR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new vR(c,l);try{let f;if(c&&s[c]&&s[c][l])$s.debug?.(`Using existing table ${d} from database tables`),f=s[c][l];else if(n&&n[l])$s.debug?.(`Using existing table ${d} from global tables`),f=n[l];else{$s.debug?.(`Table ${d} not found, creating new table`);let R=[];if(u.length>0){let T=u[0];Object.keys(T).map(y=>{let N={name:y,type:typeof T[y]};return y==="id"&&(N.isPrimaryKey=!0),N}).forEach(y=>{R.push(y)})}f=await ze({database:c,table:l,attributes:R})}let m=u.length,h=0,p=0,_=0,g=100;for(let R=0;R<u.length;R+=g){let T=u.slice(R,R+g),y=[];for(let N of T)y.push(async()=>{try{let O=null,F=N.id;F!==void 0&&(O=await f.get(F));let Z=oL(N);if(!O){h++;let $=await f.put(N);return await a2(c,l,F,Z,s),$}let G=await tRe(c,l,F,s);if(!G)return _++,Promise.resolve({inserted:0,updated:0});let Y={};for(let $ of Object.keys(N))$ in O&&(Y[$]=O[$]);return oL(Y)!==G?(_++,Promise.resolve({inserted:0,updated:0})):Z!==G?(p++,await f.patch(F,N),await a2(c,l,F,Z,s),{updated:1}):(_++,Promise.resolve({inserted:0,updated:0}))}catch(O){if(O instanceof ms)$s.error?.(`Record processing error: ${O.message}`);else{let F=new Zp(d,O);$s.error?.(`Record processing error: ${F.message}`)}return Promise.resolve({inserted:0,updated:0,error:O.message})}});await Promise.all(y.map(N=>N()))}if(h>0||p>0){let R=`Loaded ${h} new and updated ${p} records in ${d}`;return _>0&&(R+=` (${_} records skipped)`),$s.info?.(R),new gf(t,c,l,"success",h+p,R)}else if(_>0){let R=`All ${_} records in ${d} already up-to-date`;return $s.info?.(R),new gf(t,c,l,"skipped",m,R)}else{let R=`No records to process in ${d}`;return $s.info?.(R),new gf(t,c,l,"success",0,R)}}catch(f){throw f instanceof ms?f:new Zp(d,f)}}var na,c2,l2,u2,sa,d2,f2,$s,iL,CR,rRe,ms,PR,LR,DR,Xp,MR,vR,Zp,gf,p2=ce(()=>{na=require("node:path"),c2=require("node:crypto"),l2=require("yaml");Me();u2=w(nt()),sa=w(tn()),d2=w(ge()),f2=w(Q()),$s=f2.default.forComponent("dataLoader"),iL="hdb_dataloader_hash";o(oL,"computeRecordHash");o(m2,"getHashTrackingTable");o(tRe,"getStoredHash");o(a2,"storeHash");rRe=!0;o(nRe,"handleApplication");o(h2,"loadDataFile");ms=class extends d2.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=sa.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},PR=class extends ms{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,na.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,sa.HTTP_STATUS_CODES.BAD_REQUEST),this.name="UnsupportedFileExtensionError"}},LR=class extends ms{static{o(this,"FileParseError")}constructor(t,r){super(`Failed to parse data file ${(0,na.basename)(t)}: ${r.message}`,sa.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},DR=class extends ms{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,na.basename)(t)} is empty or invalid`,sa.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},Xp=class extends ms{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,na.basename)(t)} is missing required "${r}" property`,sa.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},MR=class extends ms{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,na.basename)(t)} has invalid "${r}" property, expected ${n}`,sa.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},vR=class extends ms{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,sa.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},Zp=class extends ms{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,sa.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},gf=class{static{o(this,"DataLoaderResult")}#e;#t;#r;#n;#s;#i;constructor(t,r,n,s,i,a){this.#e=t,this.#t=r||"unknown",this.#r=n||"unknown",this.#n=s,this.#s=i,this.#i=a}get filePath(){return this.#e}get database(){return this.#t}get table(){return this.#r}get status(){return this.#n}get count(){return this.#s}get message(){return this.#i}toJSON(){return{filePath:this.#e,database:this.#t,table:this.#r,status:this.#n,count:this.#s,message:this.#i}}}});var cL={};we(cL,{hdbServer:()=>aRe,start:()=>aRe});async function aRe(e){try{oo.default.debug("In Fastify server"+process.cwd()),oo.default.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),oo.default.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=E2.default.isMaster,await cRe();let t=e.securePort>0;Sf=lRe(t),await Sf.ready(),e||(e={}),e.isOperationsServer=!0;try{Le.http(Sf.server,e),Sf.server.closeIdleConnections||await Sf.listen({port:0,host:"::"})}catch(r){throw Sf.close(),oo.default.error(r),oo.default.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),oo.default.fatal(t),process.exit(1)}}async function cRe(){oo.default.trace("Configuring HarperDB process."),b2.default.setSchemaDataToGlobal(),await N2.default.setUsersWithRolesCache(),await w2.default.getLicense()}function lRe(e){oo.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=uRe(e),r=(0,_2.default)(t);r.server.headersTimeout=fRe(),r.setErrorHandler(_c.serverErrorHandler);let n=dRe();n&&r.register(g2.default,n),r.register(function(i,a,c){i.setNotFoundHandler(function(l,u){u.sent||u.raw.headersSent||u.raw.writableEnded||r.server.emit("unhandled",l.raw,u.raw)}),c()}),r.register(R2.default),r.register(S2.default),r.register(T2.default,{root:y2.default.join(A2.PACKAGE_ROOT,"studio/build-local")}),am(r);let s=Ec.default.get(jy.LOCAL_STUDIO_ON);return r.get("/",function(i,a){return!I2.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?a.sendFile("index.html"):a.sendFile("running.html")}),r.post("/",{preValidation:[_c.reqBodyValidationHandler,_c.authHandler],config:{isOperation:!0}},async function(i,a){return i.body?.operation?.startsWith("restart")&&a.header("Connection","close"),(0,_c.handlePostRequest)(i,a)}),r.get("/health",()=>"HarperDB is running."),oo.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}function uRe(e){let t=Ec.default.get(eE.OPERATIONSAPI_NETWORK_TIMEOUT),r=Ec.default.get(eE.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:iRe,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}function dRe(){let e=Ec.default.get(eE.OPERATIONSAPI_NETWORK_CORS),t=Ec.default.get(eE.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===oRe)&&(r={origin:!0,allowedHeaders:["Content-Type","Authorization","Accept"],credentials:!1},t&&t.length>0&&t[0]!==null&&t[0]!=="*"&&(r.origin=(n,s)=>s(null,t.indexOf(n)!==-1))),r}function fRe(){return Ec.default.get(eE.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??sRe}var E2,Ec,oo,_2,g2,S2,T2,R2,y2,A2,b2,I2,N2,w2,_c,sRe,iRe,oRe,eE,Sf,O2=ce(()=>{E2=w(require("cluster")),Ec=w(oe());k();oo=w(Q()),_2=w(require("fastify")),g2=w(require("@fastify/cors")),S2=w(require("@fastify/compress")),T2=w(require("@fastify/static")),R2=w(lw()),y2=w(require("path")),A2=w(bt()),b2=w(ii()),I2=w(ie()),N2=w(ts()),w2=w(Jd());Dr();_c=w(NR());Ro();Ec.default.initSync();sRe=6e4,iRe=1024*1024*1024,oRe="TRUE",{CONFIG_PARAMS:eE}=W;o(aRe,"operationsServer");o(cRe,"setUp");o(lRe,"buildServer");o(uRe,"getServerOptions");o(dRe,"getCORSOpts");o(fRe,"getHeaderTimeoutConfig")});var hL={};we(hL,{disableNATS:()=>hRe,publishToStream:()=>BR,setNATSReplicator:()=>lL,setPublishToStream:()=>pRe,setSubscription:()=>mL,start:()=>mRe});function mRe(){tE.default.get(U.CLUSTERING_ENABLED)&&_Re()}function hRe(e=!0){M2=e}function pRe(e,t){BR=e,mL=t}function _Re(){if(M2||process.env._DISABLE_NATS)return;let e=st(),t=Object.keys(e);t.push("system");for(let r of t){let n=e[r];for(let s in n){let i=n[s];lL(s,r,i)}}Il((r,n)=>{lL(r.tableName,r.databaseName,r),n&&U2(r)}),!C2&&(C2=!0)}function lL(e,t,r){if(t==="system"&&gRe.includes(e))return;if(!r)return console.error(`Attempt to replicate non-existent table ${e} from database ${t}`);if(r.sources.some(s=>s?.isNATSReplicator))return;r.sourcedFrom(class extends Ur{static{o(this,"NATSReplicator")}put(i){return n(this.getContext()).addWrite(t,{operation:"put",table:e,id:this.getId(),record:i})}delete(){return n(this.getContext()).addWrite(t,{operation:"delete",table:e,id:this.getId()})}publish(i){return n(this.getContext()).addWrite(t,{operation:"publish",table:e,id:this.getId(),record:i})}patch(i){return n(this.getContext()).addWrite(t,{operation:"patch",table:e,id:this.getId(),record:i})}invalidate(){n(this.getContext()).addWrite(t,{operation:"invalidate",table:e,id:this.getId()})}static defineSchema(i){U2(i)}static subscribe(){let i=new Vn;return mL(t,e,i),i}static subscribeOnThisThread(i){return i<(tE.default.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??ERe)}static isEqual(i){return i.isNATSReplicator}static isNATSReplicator=!0;static shouldReceiveInvalidations=!0},{intermediateSource:!0});function n(s){let i=s?.transaction?.nats;if(!i)if(s?.transaction){s.transaction.nats=i=new UR(s.transaction,s);let a=s.transaction;for(;a.next;)a=a.next;a.next=s.transaction.nats,i.user=s.user,i.context=s}else i=v2;return i}o(n,"getNATSTransaction")}function U2(e){let t=tE.default.get(U.CLUSTERING_NODENAME);BR(`${dL.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,fL.createNatsTableStreamName)(e.databaseName,e.tableName),void 0,{operation:"define_schema",schema:e.databaseName,table:e.tableName,attributes:e.attributes,__origin:{timestamp:Date.now(),node_name:t}})}var P2,dL,fL,L2,D2,tE,xR,M2,BR,mL,ERe,v2,C2,gRe,UR,uL,x2=ce(()=>{Me();Pa();P2=w(mr()),dL=w(Ot()),fL=w($i());Ru();L2=w(Iw()),D2=w(yn()),tE=w(oe());k();xR=w(Q());o(mRe,"start");o(hRe,"disableNATS");BR=P2.publishToStream,mL=L2.setSubscription;o(pRe,"setPublishToStream");ERe=2;o(_Re,"assignReplicationSource");gRe=["hdb_job","hdb_raw_analytics","hdb_info","hdb_license"];o(lL,"setNATSReplicator");o(U2,"publishSchema");UR=class{constructor(t,r){this.transaction=t;this.options=r}static{o(this,"NATSTransaction")}user;writesByDb=new Map;addWrite(t,r){r.expiresAt=this.context?.expiresAt;let n=this.writesByDb.get(t);n||this.writesByDb.set(t,n=[]),n.push(r)}commit({timestamp:t}){let r=tE.default.get(U.CLUSTERING_NODENAME),n=[];for(let[s,i]of this.writesByDb){let a=[],c=[],l,u;for(let d of i){let f=d.table,m=d.operation=="put"?"upsert":d.operation;l||(xR.trace(`Sending transaction event ${m}`),u=l={operation:m,schema:s,table:f,__origin:{user:this.user?.username,timestamp:t,node_name:r}},l.hash_values=c,m!=="delete"&&m!=="invalidate"&&(l.records=a)),l.table===f&&l.operation===m?(a.push(d.record),c.push(d.id)):u=u.next={operation:m,table:f,id:d.id,record:d.record},d.expiresAt&&(u.expiresAt=d.expiresAt)}l&&n.push(BR(`${dL.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,fL.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw xR.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},uL=class extends UR{static{o(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,D2.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};v2=new uL});var EL=M((xBe,B2)=>{"use strict";var rE=oe();rE.initSync();var Tf=require("fs-extra"),pL=require("path"),Rf=(k(),v(W)),SRe=require("crypto"),TRe=require("uuid").v4;B2.exports=RRe;function RRe(){if(rE.getHdbBasePath()!==void 0){let e=pL.join(rE.getHdbBasePath(),Rf.LICENSE_KEY_DIR_NAME,Rf.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=pL.join(rE.getHdbBasePath(),Rf.LICENSE_KEY_DIR_NAME,Rf.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=pL.join(rE.getHdbBasePath(),Rf.LICENSE_KEY_DIR_NAME,Rf.JWT_ENUM.JWT_PASSPHRASE_NAME);try{Tf.accessSync(r),Tf.accessSync(e),Tf.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=TRe(),i=SRe.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});Tf.writeFileSync(r,s),Tf.writeFileSync(e,i.privateKey),Tf.writeFileSync(t,i.publicKey)}else throw n}}}o(RRe,"checkJWTTokenExist")});var H2=M((FBe,F2)=>{"use strict";var _L=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};F2.exports={HdbInfoInsertObject:_L}});var q2=M((kBe,G2)=>{"use strict";var k2=(k(),v(W)),gL=class{static{o(this,"UpgradeObject")}constructor(t,r){this[k2.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[k2.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};G2.exports={UpgradeObject:gL}});var FR=M((qBe,V2)=>{"use strict";var Vs=require("prompt"),yf=require("chalk"),$2=Q(),Ii=require("os"),SL=xc(),TL=["yes","y"];async function yRe(e){let t=`${Ii.EOL}`+yf.bold.green("Your current HarperDB version requires that we complete an update process.")+`${Ii.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ii.EOL}${Ii.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${Ii.EOL}`;Vs.override=SL(["CONFIRM_UPGRADE"]),Vs.start(),Vs.message=t;let r={properties:{CONFIRM_UPGRADE:{description:yf.magenta(`${Ii.EOL}[CONFIRM_UPGRADE] Do you want to upgrade your HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n;try{n=await Vs.get([r])}catch(s){return $2.error("There was an error when prompting user about an upgrade."),$2.error(s),!1}return TL.includes(n.CONFIRM_UPGRADE)}o(yRe,"forceUpdatePrompt");async function ARe(e){let t=`${Ii.EOL}`+yf.bold.green(`Your installed HarperDB version is older than the version used to create your data. Downgrading is not recommended as it is not tested and guaranteed to work. However, if you need to downgrade, and a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ii.EOL}`);Vs.override=SL(["CONFIRM_DOWNGRADE"]),Vs.start(),Vs.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:yf.magenta(`${Ii.EOL}[CONFIRM_DOWNGRADE] Do you want to proceed with using your downgraded HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n=await Vs.get([r]);return TL.includes(n.CONFIRM_DOWNGRADE)}o(ARe,"forceDowngradePrompt");async function bRe(){let e=`${Ii.EOL}`+yf.bold.green("We now require a Certifacte Authority certificate. HarperDB can generate all new certificates for you (your existing certificates will be backed up) or you can keep any existing certificates and add your own CA certificate. To add your own CA certificate set the <certificateAuthority> parameter in harperdb-config.yaml");Vs.override=SL(["GENERATE_CERTS"]),Vs.start(),Vs.message=e;let t={properties:{GENERATE_CERTS:{description:yf.magenta(`${Ii.EOL}[GENERATE_CERTS] Do you want HarperDB to generate all new certificates? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"yes",required:!0}}},r=await Vs.get([t]);return TL.includes(r.GENERATE_CERTS)}o(bRe,"upgradeCertsPrompt");V2.exports={forceUpdatePrompt:yRe,forceDowngradePrompt:ARe,upgradeCertsPrompt:bRe}});var yL=M((VBe,K2)=>{"use strict";var RL=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};K2.exports=RL});var W2=M((QBe,Y2)=>{"use strict";var IRe=ie(),NRe=wt(),YBe=Q(),WBe=require("path"),zBe=require("fs"),jBe=(k(),v(W));Y2.exports={getOldPropsValue:wRe};function wRe(e,t,r=!1){let n=t.getRaw(e);return IRe.isNotEmptyAndHasValue(n)?n:r?NRe.getDefaultConfig(e):""}o(wRe,"getOldPropsValue")});var J2=M((XBe,Q2)=>{"use strict";var gc=require("path"),Sc=require("fs-extra"),ORe=require("properties-reader"),CRe=yL(),Sr=Q(),{getOldPropsValue:At}=W2(),{HDB_SETTINGS_NAMES:ye,CONFIG_PARAMS:su}=(k(),v(W)),iu=wt(),HR=oe(),z2=ie(),ao=(k(),v(W)),AL=new CRe("3.1.0"),j2=[];function PRe(){let e=ORe(HR.get(ye.SETTINGS_PATH_KEY)),t="Updating settings file for version 3.1.0";console.log(t),Sr.info(t);let r=` ;Settings for the HarperDB process.
39
39
 
40
40
  ;The directory selected during install where the database files reside.
41
41
  ${ye.HDB_ROOT_KEY} = ${At(ye.HDB_ROOT_KEY,e)}
@@ -124,8 +124,8 @@ Reindexing upgrade started for transaction logs`),ia.notify("Reindexing upgrade
124
124
  `;let l=[],u=$L.getConfigObj();for(let h in u)u[h].package&&l.push(h);let d={},f=`${r("REST:")}`;for(let[h,p]of e)for(let _ of p){let g=_.name;g==="rest"&&(f+=`${_.protocol_name}: ${h}, `),l.includes(g)&&(d[g]?d[g]+=`${_.protocol_name}: ${h}, `:d[g]=`${_.protocol_name}: ${h}, `)}f.length>21&&(f=f.slice(0,-2),n+=`${f}
125
125
  `);let m=Ae.get(Ue.HTTP_PORT)?`HTTP: ${Ae.get(Ue.HTTP_PORT)}, `:"";m+=Ae.get(Ue.HTTP_SECUREPORT)?`HTTPS: ${Ae.get(Ue.HTTP_SECUREPORT)}, `:"",m.length>21&&(m=m.slice(0,-2));for(let h of l)d[h]?n+=`${r(h+": ")}${d[h].slice(0,-2)}
126
126
  `:n+=`${r(h+": ")}${m}
127
- `;console.log(n),Ae.get(Ue.LOGGING_STDSTREAMS)&&_s.logsAtLevel("info")&&_s.suppressLogging(()=>{console.log(`Note that log messages are being sent to the console (stdout and stderr) in addition to the log file ${s}. This can be disabled by setting logging.stdStreams to false, and the log file can be directly monitored/tailed.`)})}o(ZAe,"startupLog");function ebe(e){try{return Number.parseInt(da.readFileSync(e,"utf8"),10)}catch{return null}}o(ebe,"readPidFile");function tbe(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(tbe,"isProcessRunning")});var eJ={};we(eJ,{SERVERS:()=>If,portServer:()=>KL,setPortServerMap:()=>ZR});function ZR(e,t){let r=KL.get(e)??[];KL.set(e,[...r,t])}var If,KL,YL=ce(()=>{If={},KL=new Map;o(ZR,"setPortServerMap")});var iy={};we(iy,{deliverSocket:()=>mJ,getHttpOptions:()=>ibe,getRequestId:()=>_J,handleApplication:()=>sbe,httpServer:()=>eD,logRequest:()=>pE,proxyRequest:()=>obe,registerServer:()=>XL,suppressHandleApplicationWarning:()=>nbe});function sbe(e){EE=e.options.getAll(),e.options.on("change",t=>{EE=e.options.getAll()})}function ibe(){return EE}function mJ(e,t,r){let n=e?.read?e:new iJ.Socket({fd:e,readable:!0,writable:!0,allowHalfOpen:!0}),s=If[t];if(s.isSecure&&(n.startTime=performance.now()),s)typeof s=="function"?s(n):s.emit("connection",n),r&&n.emit("data",r);else{let i=o(a=>{setTimeout(()=>{let c=If[t];c?(typeof c=="function"?c(n):c.emit("connection",n),r&&n.emit("data",r)):a<5?i(a+1):(ha.default.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}function obe(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=tJ.get(s),r){case"connection":i=mJ(void 0,t),tJ.set(s,i),i.write=(c,l,u)=>(ty.parentPort.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(ty.parentPort.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let a=i.destroy;i.destroy=()=>{a.call(i),ty.parentPort.postMessage({requestId:s,event:"destroy"})};break;case"data":i._readableState.destroyed||i.emit("data",Buffer.from(n,"latin1"));break;case"drain":i._readableState.destroyed||i.emit("drain",{});break;case"end":i._readableState.destroyed||i.emit("end",{});break;case"error":i._readableState.destroyed||i.emit("error",{});break}}function XL(e,t,r=!0){t||(t=Cr.default.get(U.HTTP_PORT));let n=If[t];if(n){let s=n.lastServer||n;if(s===e)throw new Error(`Can not register the same server twice for the same port ${t}`);if(r&&!!s.sessionIdContext!=!!e.sessionIdContext&&+t)throw new Error(`Can not mix secure HTTPS and insecure HTTP on the same port ${t}`);s.off("unhandled",sJ),s.on("unhandled",(i,a)=>{e.cantCleanupProperly&&(n.cantCleanupProperly=!0),e.emit("request",i,a)}),n.lastServer=e}else If[t]=e;e.on("unhandled",sJ)}function ZL(e){let t=[],r=e?.securePort;return r&&t.push({port:r,secure:!0}),r=e?.port,r&&t.push({port:r,secure:!1}),t.length===0&&(t=[],Cr.default.get(U.HTTP_PORT)!=null&&t.push({port:Cr.default.get(U.HTTP_PORT),secure:Cr.default.get(U.CUSTOMFUNCTIONS_NETWORK_HTTPS)}),Cr.default.get(U.HTTP_SECUREPORT)!=null&&t.push({port:Cr.default.get(U.HTTP_SECUREPORT),secure:!0})),e?.isOperationsServer&&Cr.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&t.push({port:(0,oJ.resolvePath)(Cr.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}function eD(e,t){let r=[];for(let{port:n,secure:s}of ZL(t))r.push(hJ(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?QL[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,XL(e,n,!1)),ry[n]=ny(QL,n);return r}function hJ(e,t,r,n){if(ZR(e,{protocol_name:t?"HTTPS":"HTTP",name:oy()}),!ey[e]){let s=r?"operationsApi_network":"http",i=Cr.default.get(s+"_keepAliveTimeout"),a=Cr.default.get(s+"_timeout"),c=Cr.default.get(s+"_headersTimeout"),l={keepAliveTimeout:i,headersTimeout:c,requestTimeout:a,highWaterMark:128*1024,noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600,maxHeaderSize:Cr.default.get(U.HTTP_MAXHEADERSIZE)},u=Cr.default.get(s+"_mtls"),d=Cr.default.get(s+"_mtls_required"),f;if(t){let g=Cr.default.get("tls");f=Cr.default.get(s+"_http2"),Object.assign(l,{allowHTTP1:!0,rejectUnauthorized:!!d,requestCert:!!(u||n),ticketKeys:(0,aJ.getTicketKeys)(),SNICallback:(0,cJ.createTLSSelector)(r?"operations-api":"server",u),ciphers:g.ciphers??g[0]?.ciphers})}let m=(0,lJ.checkMemoryLimit)(),h=o(async(g,R)=>{let T=performance.now(),y=0;try{let O=new Ya(g,R);r&&(O.isOperationsServer=!0),EE.logging?.id&&(O.requestId=y=_J());let F=await ry[e](O);if(!F){if(O._nodeResponse.statusCode){pE(g,O._nodeResponse.statusCode,y,performance.now()-T);return}F=pJ(O)}if(F.headers?.set||(F.headers=new Os(F.headers)),m?F.headers?.set?.("Server","Unlicensed HarperDB, this should only be used for educational and development purposes"):F.headers?.set?.("Server","HarperDB"),F.status===-1){for(let me of F.headers||[])R.setHeader(me[0],me[1]);return g.baseRequest=O,R.baseResponse=F,ey[e].emit("unhandled",g,R)}let Z=F.status||200,G=performance.now(),Y=G-T,K=F.body,$,le=!1;if(!F.handlesHeaders){let me=F.headers||new Os;K?K.length>=0?(typeof K=="string"?me.set("Content-Length",Buffer.byteLength(K)):me.set("Content-Length",K.length),$=!0):K instanceof Rs&&(K.size?me.set("Content-Length",K.size):K.on&&(le=!0,K.on("size",De=>{R.headersSent||R.setHeader("Content-Length",De)})),K=K.stream()):(me.set("Content-Length","0"),$=!0);let Pe=`hdb;dur=${Y.toFixed(2)}`;if(F.wasCacheMiss&&(Pe+=", miss"),lh(me,"Server-Timing",Pe,!0),!R.headersSent)if(le){if(R.statusCode=Z,me)if(me[Symbol.iterator])for(let[De,dt]of me)R.setHeader(De,dt);else for(let De in me)R.setHeader(De,me[De])}else R.writeHead(Z,me&&(me[Symbol.iterator]?Array.from(me):me));$&&R.end(K)}let ue=O.handlerPath,se=O.method;if(it(Y,"duration",ue,se,F.wasCacheMiss==null?void 0:F.wasCacheMiss?"cache-miss":"cache-hit"),Wr(Z<400,"success",ue,se),Wr(1,"response_"+Z,ue,se),pE(g,Z,y,Y),!$)if(K instanceof ReadableStream&&(K=jL.Readable.fromWeb(K)),(K[Symbol.iterator]||K[Symbol.asyncIterator])&&(K=jL.Readable.from(K)),K?.pipe){K.pipe(R),K.destroy&&R.on("close",()=>{K.destroy()});let me=0;K.on("data",Pe=>{me+=Pe.length}),K.on("end",()=>{it(performance.now()-G,"transfer",ue,se),it(me,"bytes-sent",ue,se)})}else K?.then?K.then(me=>{R.end(me)},N):R.end(K)}catch(O){N(O)}function N(O){let F=O.headers,Z=O.statusCode||500;R.writeHead(Z,F&&(F[Symbol.iterator]?Array.from(F):F)),R.end(rbe(O)),pE(g,Z,y,performance.now()-T),O.statusCode?O.statusCode===500?ha.default.warn(O):ha.default.info(O):ha.default.error(O)}o(N,"onError")},"requestHandler"),p=Og(h,(g,R)=>{R.statusCode=503,R.end("Service unavailable, exceeded request queue limit"),it(!0,"service-unavailable",e)},Cr.default.get(s+"_requestQueueLimit")),_=ey[e]=(t?f?uJ.createSecureServer:dJ.createServer:sy.createServer)(l,(g,R)=>{let T=g.method;T==="GET"||T==="OPTIONS"||T==="HEAD"?h(g,R):p(g,R)});i>=0&&(_.keepAliveTimeout=i),c>=0&&(_.headersTimeout=c),t&&(_.ports||(_.ports=[]),_.ports.push(e),l.SNICallback.initialize(_),u&&(_.mtlsConfig=u),_.on("secureConnection",g=>{g._parent.startTime&&it(performance.now()-g._parent.startTime,"tls-handshake",e),it(g.isSessionReused(),"tls-reused",e)}),_.isSecure=!0),XL(_,e)}return ey[e]}function ny(e,t){let r=pJ;for(let n=e.length;n>0;){let{listener:s,port:i}=e[--n];if(i===t||i==="all"){let a=r;r=o((...c)=>s(...c,a),"nextCallback")}}return r}function pJ(e){return e.user&&(e._nodeRequest.user=e.user),{status:-1,body:"Not found",headers:new Os}}function abe(e,t){eD(e,{requestOnly:!0,...t})}function EJ(e,t){for(let{port:r}of ZL(t))rJ[t?.runFirst?"unshift":"push"]({listener:e,port:r}),JL[r]=ny(rJ,r)}function cbe(e,t){let r=[];for(let{port:n,secure:s}of ZL(t)){ZR(n,{protocol_name:s?"WSS":"WS",name:oy()});let i=hJ(n,s,t?.isOperationsServer,t?.mtls);mE[n]||(mE[n]=new fJ.WebSocketServer({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),mE[n].on("connection",(a,c)=>{try{let l=new Ya(c);l.isWebSocket=!0;let u=ry[n](l);ha.default.debug("Received WS connection, calling listeners",WL),nJ[n](a,l,u)}catch(l){ha.default.warn("Error in handling WS connection",l)}}),EJ((a,c,l,u)=>a.__harperdbRequestUpgraded?u(a,c,l):mE[n].handleUpgrade(a,c,l,d=>{a.__harperdbRequestUpgraded=!0,u(a,c,l),mE[n].emit("connection",d,a)}),{port:n}),i.on("upgrade",(a,c,l)=>{JL[n]&&JL[n](a,c,l)})),r.push(i),WL[t?.runFirst?"unshift":"push"]({listener:e,port:n}),nJ[n]=ny(WL,n),ry[n]=ny(QL,n)}return r}function sJ(e,t){t.writeHead(404),t.end(`Not found
128
- `),pE(e,404,0,e.requestId)}function pE(e,t,r,n){let s=EE.logging;if(s){zL||(zL=ha.default.forComponent("http"));let i=t<400?"info":t===500?"error":"warn";zL[i]?.(`${e.method} ${e.url} ${e.socket.encrypted?"HTTPS":"HTTP"}/${e.httpVersion}${s.headers?" "+lbe(e.headers):""} ${t}${s.timing&&n?" "+n.toFixed(2)+"ms":""}${r?" id: "+r:""}`)}}function lbe(e){let t=[];for(let r in e)t.push(`${r}: ${e[r]}`);return t.join(", ")}function _J(){return hE||(hE=new BigInt64Array([1n]),hE=new BigInt64Array(databases.system.hdb_analytics.primaryStore.getUserSharedBuffer("next-request-id",hE.buffer))),Number(Atomics.add(hE,0,1n))}var iJ,ha,ty,Cr,oJ,aJ,cJ,lJ,uJ,dJ,sy,jL,fJ,rbe,mE,ey,ry,QL,EE,nbe,tJ,rJ,JL,WL,nJ,zL,hE,tD=ce(()=>{iJ=require("node:net"),ha=w(Q()),ty=require("node:worker_threads"),Cr=w(oe());k();oJ=w(wt()),aJ=w(nt()),cJ=w(as()),lJ=w(Jd()),uJ=require("node:http2"),dJ=require("node:https"),sy=require("node:http");Ph();uh();Kn();Wi();jL=require("node:stream");Dr();YL();lf();EN();fJ=require("ws"),{errorToString:rbe}=ha.default;Le.http=eD;Le.request=abe;Le.ws=cbe;Le.upgrade=EJ;mE={},ey={},ry={},QL=[],EE={},nbe=!0;o(sbe,"handleApplication");o(ibe,"getHttpOptions");o(mJ,"deliverSocket");tJ=new Map;o(obe,"proxyRequest");o(XL,"registerServer");o(ZL,"getPorts");o(eD,"httpServer");o(hJ,"getHTTPServer");o(ny,"makeCallbackChain");o(pJ,"unhandled");o(abe,"onRequest");Object.defineProperty(sy.IncomingMessage.prototype,"upgrade",{get(){return"connection"in this.headers&&"upgrade"in this.headers&&this.headers.connection.toLowerCase().includes("upgrade")&&this.headers.upgrade.toLowerCase()=="websocket"},set(e){}});rJ=[],JL={};o(EJ,"onUpgrade");WL=[],nJ={};o(cbe,"onWebSocket");o(sJ,"defaultNotFound");o(pE,"logRequest");o(lbe,"headersToString");o(_J,"getRequestId")});var nD=M(gE=>{"use strict";LE();var{isMainThread:rD,parentPort:gJ,threadId:ay,workerData:ube}=require("node:worker_threads"),{createServer:dbe}=require("node:net"),{unlinkSync:RJ,existsSync:fbe}=require("fs"),yJ;gE.whenComponentsLoaded=new Promise(e=>{yJ=e});var wi=Q(),Ws=oe(),gs=(k(),v(W)),{server:mbe}=(Dr(),v($f)),{createServer:hbe}=require("node:tls"),{restartNumber:pbe,getWorkerIndex:Nf}=nt(),{createReuseportFd:_E}=(Ph(),v(eq)),{createTLSSelector:Ebe}=as(),{resolvePath:_be}=wt(),{startupLog:gbe}=ZQ(),{SERVERS:wf,setPortServerMap:SJ,portServer:Sbe}=(YL(),v(eJ)),TJ=(tD(),v(iy)),Tbe=Xs(),AJ=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG),Rbe=Ws.get(gs.CONFIG_PARAMS.HTTP_SESSIONAFFINITY);mbe.socket=ybe;if(AJ){let e;if(rD)e=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_PORT)??9229,process.on(["SIGINT","SIGTERM","SIGQUIT","exit"],()=>{try{require("inspector").close()}catch(t){wi.info("Could not close debugger",t)}});else{let t=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_STARTINGPORT);t&&Nf()>=0&&(e=t+Nf())}if(e){let t=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_HOST),r=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_WAITFORDEBUGGER);try{require("inspector").open(e,t,r)}catch(n){wi.trace(`Could not start debugging on port ${e}, you may already be debugging:`,n.message)}}}else if(process.env.DEV_MODE&&rD)try{require("inspector").open(9229)}catch(e){pbe<=1&&wi.trace("Could not start debugging on port 9229, you may already be debugging:",e.message)}process.on("uncaughtException",e=>{e.isHandled||e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&wi.error("uncaughtException",e)});var{HDB_SETTINGS_NAMES:BFe,CONFIG_PARAMS:FFe}=gs;Ws.initSync();gE.globals=Tbe;gE.listenOnPorts=IJ;gE.startServers=bJ;function bJ(){let e=Ws.get(gs.CONFIG_PARAMS.ROOTPATH);if(e)try{process.chdir(e)}catch{}let t=cy().loadRootComponents(!0).then(()=>{gJ?.on("message",n=>{let{port:s,fd:i,data:a}=n;if(i)TJ.deliverSocket(i,s,a);else if(n.requestId)TJ.proxyRequest(n);else if(n.type===gs.ITC_EVENT_TYPES.SHUTDOWN){wi.trace("received shutdown request",ay);for(let c in wf){let l=wf[c],u;if(l.closeIdleConnections){let f=Object.getOwnPropertySymbols(l).find(p=>p.description.includes("connections")),m=0,h=setInterval(()=>{m++;let p=m>=100;if(!l[f]){p&&l.closeAllConnections?.(),clearInterval(h);return}let _=l[f][p?"all":"idle"]?.()||[];if(_.length===0){p&&clearInterval(h);return}m===1?wi.info(`Closing ${_.length} idle connections`):p&&wi.warn(`Forcefully closing ${_.length} active connections`);for(let g=0,R=_.length;g<R;g++){let T=_[g].socket;T._httpMessage&&!T._httpMessage.finished&&!p||(p?T.destroySoon():T.end(`HTTP/1.1 408 Request Timeout\r
127
+ `;console.log(n),Ae.get(Ue.LOGGING_STDSTREAMS)&&_s.logsAtLevel("info")&&_s.suppressLogging(()=>{console.log(`Note that log messages are being sent to the console (stdout and stderr) in addition to the log file ${s}. This can be disabled by setting logging.stdStreams to false, and the log file can be directly monitored/tailed.`)})}o(ZAe,"startupLog");function ebe(e){try{return Number.parseInt(da.readFileSync(e,"utf8"),10)}catch{return null}}o(ebe,"readPidFile");function tbe(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(tbe,"isProcessRunning")});var eJ={};we(eJ,{SERVERS:()=>If,portServer:()=>KL,setPortServerMap:()=>ZR});function ZR(e,t){let r=KL.get(e)??[];KL.set(e,[...r,t])}var If,KL,YL=ce(()=>{If={},KL=new Map;o(ZR,"setPortServerMap")});var iy={};we(iy,{deliverSocket:()=>mJ,getHttpOptions:()=>ibe,getRequestId:()=>_J,handleApplication:()=>sbe,httpServer:()=>eD,logRequest:()=>pE,proxyRequest:()=>obe,registerServer:()=>XL,suppressHandleApplicationWarning:()=>nbe});function sbe(e){EE=e.options.getAll(),e.options.on("change",t=>{EE=e.options.getAll()})}function ibe(){return EE}function mJ(e,t,r){let n=e?.read?e:new iJ.Socket({fd:e,readable:!0,writable:!0,allowHalfOpen:!0}),s=If[t];if(s.isSecure&&(n.startTime=performance.now()),s)typeof s=="function"?s(n):s.emit("connection",n),r&&n.emit("data",r);else{let i=o(a=>{setTimeout(()=>{let c=If[t];c?(typeof c=="function"?c(n):c.emit("connection",n),r&&n.emit("data",r)):a<5?i(a+1):(ha.default.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}function obe(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=tJ.get(s),r){case"connection":i=mJ(void 0,t),tJ.set(s,i),i.write=(c,l,u)=>(ty.parentPort.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(ty.parentPort.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let a=i.destroy;i.destroy=()=>{a.call(i),ty.parentPort.postMessage({requestId:s,event:"destroy"})};break;case"data":i._readableState.destroyed||i.emit("data",Buffer.from(n,"latin1"));break;case"drain":i._readableState.destroyed||i.emit("drain",{});break;case"end":i._readableState.destroyed||i.emit("end",{});break;case"error":i._readableState.destroyed||i.emit("error",{});break}}function XL(e,t,r=!0){t||(t=Cr.default.get(U.HTTP_PORT));let n=If[t];if(n){let s=n.lastServer||n;if(s===e)throw new Error(`Can not register the same server twice for the same port ${t}`);if(r&&!!s.sessionIdContext!=!!e.sessionIdContext&&+t)throw new Error(`Can not mix secure HTTPS and insecure HTTP on the same port ${t}`);s.off("unhandled",sJ),s.on("unhandled",(i,a)=>{e.cantCleanupProperly&&(n.cantCleanupProperly=!0),e.emit("request",i,a)}),n.lastServer=e}else If[t]=e;e.on("unhandled",sJ)}function ZL(e){let t=[],r=e?.securePort;return r&&t.push({port:r,secure:!0}),r=e?.port,r&&t.push({port:r,secure:!1}),t.length===0&&(t=[],Cr.default.get(U.HTTP_PORT)!=null&&t.push({port:Cr.default.get(U.HTTP_PORT),secure:Cr.default.get(U.CUSTOMFUNCTIONS_NETWORK_HTTPS)}),Cr.default.get(U.HTTP_SECUREPORT)!=null&&t.push({port:Cr.default.get(U.HTTP_SECUREPORT),secure:!0})),e?.isOperationsServer&&Cr.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&t.push({port:(0,oJ.resolvePath)(Cr.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}function eD(e,t){let r=[];for(let{port:n,secure:s}of ZL(t))r.push(hJ(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?QL[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,XL(e,n,!1)),ry[n]=ny(QL,n);return r}function hJ(e,t,r,n){if(ZR(e,{protocol_name:t?"HTTPS":"HTTP",name:oy()}),!ey[e]){let s=r?"operationsApi_network":"http",i=Cr.default.get(s+"_keepAliveTimeout"),a=Cr.default.get(s+"_timeout"),c=Cr.default.get(s+"_headersTimeout"),l={keepAliveTimeout:i,headersTimeout:c,requestTimeout:a,highWaterMark:128*1024,noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600,maxHeaderSize:Cr.default.get(U.HTTP_MAXHEADERSIZE)},u=Cr.default.get(s+"_mtls"),d=Cr.default.get(s+"_mtls_required"),f;if(t){let g=Cr.default.get("tls");f=Cr.default.get(s+"_http2"),Object.assign(l,{allowHTTP1:!0,rejectUnauthorized:!!d,requestCert:!!(u||n),ticketKeys:(0,aJ.getTicketKeys)(),SNICallback:(0,cJ.createTLSSelector)(r?"operations-api":"server",u),ciphers:g.ciphers??g[0]?.ciphers})}let m=(0,lJ.checkMemoryLimit)(),h=o(async(g,R)=>{let T=performance.now(),y=0;try{let O=new Ya(g,R);r&&(O.isOperationsServer=!0),EE.logging?.id&&(O.requestId=y=_J());let F=await ry[e](O);if(!F){if(O._nodeResponse.statusCode){pE(g,O._nodeResponse.statusCode,y,performance.now()-T);return}F=pJ(O)}if(F.headers?.set||(F.headers=new Os(F.headers)),m?F.headers?.set?.("Server","Unlicensed HarperDB, this should only be used for educational and development purposes"):F.headers?.set?.("Server","HarperDB"),F.status===-1){for(let me of F.headers||[])R.setHeader(me[0],me[1]);return g.baseRequest=O,R.baseResponse=F,ey[e].emit("unhandled",g,R)}let Z=F.status||200,G=performance.now(),Y=G-T,K=F.body,$,le=!1;if(!F.handlesHeaders){let me=F.headers||new Os;K?K.length>=0?(typeof K=="string"?me.set("Content-Length",Buffer.byteLength(K)):me.set("Content-Length",K.length),$=!0):K instanceof Rs&&(K.size?me.set("Content-Length",K.size):K.on&&(le=!0,K.on("size",De=>{R.headersSent||R.setHeader("Content-Length",De)})),K=K.stream()):(me.set("Content-Length","0"),$=!0);let Pe=`hdb;dur=${Y.toFixed(2)}`;if(F.wasCacheMiss&&(Pe+=", miss"),lh(me,"Server-Timing",Pe,!0),!R.headersSent)if(le){if(R.statusCode=Z,me)if(me[Symbol.iterator])for(let[De,dt]of me)R.setHeader(De,dt);else for(let De in me)R.setHeader(De,me[De])}else R.writeHead(Z,me&&(me[Symbol.iterator]?Array.from(me):me));$&&R.end(K)}let ue=O.handlerPath,se=O.method;if(it(Y,"duration",ue,se,F.wasCacheMiss==null?void 0:F.wasCacheMiss?"cache-miss":"cache-hit"),Wr(Z<400,"success",ue,se),Wr(1,"response_"+Z,ue,se),pE(g,Z,y,Y),!$)if(K instanceof ReadableStream&&(K=jL.Readable.fromWeb(K)),(K[Symbol.iterator]||K[Symbol.asyncIterator])&&(K=jL.Readable.from(K)),K?.pipe){K.pipe(R),K.destroy&&R.on("close",()=>{K.destroy()});let me=0;K.on("data",Pe=>{me+=Pe.length}),K.on("end",()=>{it(performance.now()-G,"transfer",ue,se),it(me,"bytes-sent",ue,se)})}else K?.then?K.then(me=>{R.end(me)},N):R.end(K)}catch(O){N(O)}function N(O){let F=O.headers,Z=O.statusCode||500;R.writeHead(Z,F&&(F[Symbol.iterator]?Array.from(F):F)),R.end(rbe(O)),pE(g,Z,y,performance.now()-T),O.statusCode?O.statusCode===500?ha.default.warn(O):ha.default.info(O):ha.default.error(O)}o(N,"onError")},"requestHandler"),p=Og(h,(g,R)=>{R.statusCode=503,R.end("Service unavailable, exceeded request queue limit"),it(!0,"service-unavailable",e)},Cr.default.get(s+"_requestQueueLimit")),_=ey[e]=(t?f?uJ.createSecureServer:dJ.createServer:sy.createServer)(l,(g,R)=>{let T=g.method;T==="GET"||T==="OPTIONS"||T==="HEAD"?h(g,R):p(g,R)});i>=0&&(_.keepAliveTimeout=i),c>=0&&(_.headersTimeout=c),t&&(_.ports||(_.ports=[]),_.ports.push(e),l.SNICallback.initialize(_),u&&(_.mtlsConfig=u),_.on("secureConnection",g=>{g._parent.startTime&&it(performance.now()-g._parent.startTime,"tls-handshake",e),it(g.isSessionReused(),"tls-reused",e)}),_.isSecure=!0),XL(_,e)}return ey[e]}function ny(e,t){let r=pJ;for(let n=e.length;n>0;){let{listener:s,port:i}=e[--n];if(i===t||i==="all"){let a=r;r=o((...c)=>s(...c,a),"nextCallback")}}return r}function pJ(e){return e.user&&(e._nodeRequest.user=e.user),{status:-1,body:"Not found",headers:new Os}}function abe(e,t){eD(e,{requestOnly:!0,...t})}function EJ(e,t){for(let{port:r}of ZL(t))rJ[t?.runFirst?"unshift":"push"]({listener:e,port:r}),JL[r]=ny(rJ,r)}function cbe(e,t){let r=[];for(let{port:n,secure:s}of ZL(t)){ZR(n,{protocol_name:s?"WSS":"WS",name:oy()});let i=hJ(n,s,t?.isOperationsServer,t?.mtls);mE[n]||(mE[n]=new fJ.WebSocketServer({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),mE[n].on("connection",(a,c)=>{try{let l=new Ya(c);l.isWebSocket=!0;let u=ry[n](l);ha.default.debug("Received WS connection, calling listeners",WL),nJ[n](a,l,u)}catch(l){ha.default.warn("Error in handling WS connection",l)}}),EJ((a,c,l,u)=>a.__harperdbRequestUpgraded?u(a,c,l):mE[n].handleUpgrade(a,c,l,d=>{a.__harperdbRequestUpgraded=!0,u(a,c,l),mE[n].emit("connection",d,a)}),{port:n}),i.on("upgrade",(a,c,l)=>{JL[n]&&JL[n](a,c,l)})),r.push(i),WL[t?.runFirst?"unshift":"push"]({listener:e,port:n}),nJ[n]=ny(WL,n),ry[n]=ny(QL,n)}return r}function sJ(e,t){t.headersSent||t.writableEnded||(t.writeHead(404),t.end(`Not found
128
+ `),pE(e,404,0,e.requestId))}function pE(e,t,r,n){let s=EE.logging;if(s){zL||(zL=ha.default.forComponent("http"));let i=t<400?"info":t===500?"error":"warn";zL[i]?.(`${e.method} ${e.url} ${e.socket.encrypted?"HTTPS":"HTTP"}/${e.httpVersion}${s.headers?" "+lbe(e.headers):""} ${t}${s.timing&&n?" "+n.toFixed(2)+"ms":""}${r?" id: "+r:""}`)}}function lbe(e){let t=[];for(let r in e)t.push(`${r}: ${e[r]}`);return t.join(", ")}function _J(){return hE||(hE=new BigInt64Array([1n]),hE=new BigInt64Array(databases.system.hdb_analytics.primaryStore.getUserSharedBuffer("next-request-id",hE.buffer))),Number(Atomics.add(hE,0,1n))}var iJ,ha,ty,Cr,oJ,aJ,cJ,lJ,uJ,dJ,sy,jL,fJ,rbe,mE,ey,ry,QL,EE,nbe,tJ,rJ,JL,WL,nJ,zL,hE,tD=ce(()=>{iJ=require("node:net"),ha=w(Q()),ty=require("node:worker_threads"),Cr=w(oe());k();oJ=w(wt()),aJ=w(nt()),cJ=w(as()),lJ=w(Jd()),uJ=require("node:http2"),dJ=require("node:https"),sy=require("node:http");Ph();uh();Kn();Wi();jL=require("node:stream");Dr();YL();lf();EN();fJ=require("ws"),{errorToString:rbe}=ha.default;Le.http=eD;Le.request=abe;Le.ws=cbe;Le.upgrade=EJ;mE={},ey={},ry={},QL=[],EE={},nbe=!0;o(sbe,"handleApplication");o(ibe,"getHttpOptions");o(mJ,"deliverSocket");tJ=new Map;o(obe,"proxyRequest");o(XL,"registerServer");o(ZL,"getPorts");o(eD,"httpServer");o(hJ,"getHTTPServer");o(ny,"makeCallbackChain");o(pJ,"unhandled");o(abe,"onRequest");Object.defineProperty(sy.IncomingMessage.prototype,"upgrade",{get(){return"connection"in this.headers&&"upgrade"in this.headers&&this.headers.connection.toLowerCase().includes("upgrade")&&this.headers.upgrade.toLowerCase()=="websocket"},set(e){}});rJ=[],JL={};o(EJ,"onUpgrade");WL=[],nJ={};o(cbe,"onWebSocket");o(sJ,"defaultNotFound");o(pE,"logRequest");o(lbe,"headersToString");o(_J,"getRequestId")});var nD=M(gE=>{"use strict";LE();var{isMainThread:rD,parentPort:gJ,threadId:ay,workerData:ube}=require("node:worker_threads"),{createServer:dbe}=require("node:net"),{unlinkSync:RJ,existsSync:fbe}=require("fs"),yJ;gE.whenComponentsLoaded=new Promise(e=>{yJ=e});var wi=Q(),Ws=oe(),gs=(k(),v(W)),{server:mbe}=(Dr(),v($f)),{createServer:hbe}=require("node:tls"),{restartNumber:pbe,getWorkerIndex:Nf}=nt(),{createReuseportFd:_E}=(Ph(),v(eq)),{createTLSSelector:Ebe}=as(),{resolvePath:_be}=wt(),{startupLog:gbe}=ZQ(),{SERVERS:wf,setPortServerMap:SJ,portServer:Sbe}=(YL(),v(eJ)),TJ=(tD(),v(iy)),Tbe=Xs(),AJ=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG),Rbe=Ws.get(gs.CONFIG_PARAMS.HTTP_SESSIONAFFINITY);mbe.socket=ybe;if(AJ){let e;if(rD)e=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_PORT)??9229,process.on(["SIGINT","SIGTERM","SIGQUIT","exit"],()=>{try{require("inspector").close()}catch(t){wi.info("Could not close debugger",t)}});else{let t=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_STARTINGPORT);t&&Nf()>=0&&(e=t+Nf())}if(e){let t=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_HOST),r=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_WAITFORDEBUGGER);try{require("inspector").open(e,t,r)}catch(n){wi.trace(`Could not start debugging on port ${e}, you may already be debugging:`,n.message)}}}else if(process.env.DEV_MODE&&rD)try{require("inspector").open(9229)}catch(e){pbe<=1&&wi.trace("Could not start debugging on port 9229, you may already be debugging:",e.message)}process.on("uncaughtException",e=>{e.isHandled||e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&wi.error("uncaughtException",e)});var{HDB_SETTINGS_NAMES:BFe,CONFIG_PARAMS:FFe}=gs;Ws.initSync();gE.globals=Tbe;gE.listenOnPorts=IJ;gE.startServers=bJ;function bJ(){let e=Ws.get(gs.CONFIG_PARAMS.ROOTPATH);if(e)try{process.chdir(e)}catch{}let t=cy().loadRootComponents(!0).then(()=>{gJ?.on("message",n=>{let{port:s,fd:i,data:a}=n;if(i)TJ.deliverSocket(i,s,a);else if(n.requestId)TJ.proxyRequest(n);else if(n.type===gs.ITC_EVENT_TYPES.SHUTDOWN){wi.trace("received shutdown request",ay);for(let c in wf){let l=wf[c],u;if(l.closeIdleConnections){let f=Object.getOwnPropertySymbols(l).find(p=>p.description.includes("connections")),m=0,h=setInterval(()=>{m++;let p=m>=100;if(!l[f]){p&&l.closeAllConnections?.(),clearInterval(h);return}let _=l[f][p?"all":"idle"]?.()||[];if(_.length===0){p&&clearInterval(h);return}m===1?wi.info(`Closing ${_.length} idle connections`):p&&wi.warn(`Forcefully closing ${_.length} active connections`);for(let g=0,R=_.length;g<R;g++){let T=_[g].socket;T._httpMessage&&!T._httpMessage.finished&&!p||(p?T.destroySoon():T.end(`HTTP/1.1 408 Request Timeout\r
129
129
  Connection: close\r
130
130
  \r
131
131
  `))}},25).unref()}l.close?.(()=>{if(Ws.get(gs.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&Nf()==0)try{RJ(_be(Ws.get(gs.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)))}catch{}clearInterval(u),setTimeout(()=>{console.log("forced close server",c,ay),l.cantCleanupProperly||wi.warn("Had to forcefully exit the thread",ay),process.exit(0)},5e3).unref()})}if(AJ||process.env.DEV_MODE)try{require("inspector").close()}catch(c){wi.info("Could not close debugger",c)}}}).ref();let r;_E&&!Rbe&&(r=IJ()),Promise.resolve(r).then(()=>{if(Nf()===0)try{gbe(Sbe)}catch(n){console.error("Error displaying start-up log",n)}gJ?.postMessage({type:gs.ITC_EVENT_TYPES.CHILD_STARTED})})});return yJ(t),t}o(bJ,"startServers");function IJ(){let e=[];for(let t in wf){let r=wf[t];if(t.includes?.("/")&&Nf()==0){fbe(t)&&RJ(t),e.push(new Promise((a,c)=>{r.listen({path:t},()=>{a({port:t,name:r.name,protocol_name:r.protocol_name}),wi.info("Domain socket listening on "+t)}).on("error",c)}));continue}let n,s=Ws.get(gs.CONFIG_PARAMS.HTTP_THREADRANGE);if(s){let a=typeof s=="string"?s.split("-"):s,c=Nf();if(c<a[0]||c>a[1])continue}let i;try{let a=t.lastIndexOf(":");a>0?_E?n={fd:_E(+t.slice(a+1).replace(/[\[\]]/g,""),t.slice(0,a))}:n={host:+t.slice(a+1).replace(/[\[\]]/g,""),port:t.slice(0,a)}:_E?n={fd:_E(+t,"::")}:n={port:t}}catch(a){console.error(`Unable to bind to port ${t}`,a);continue}e.push(new Promise((a,c)=>{r.listen(n,()=>{a({port:t,name:r.name,protocol_name:r.protocol_name}),wi.trace("Listening on port "+t,ay)}).on("error",c)}))}return Promise.all(e)}o(IJ,"listenOnPorts");!rD&&!ube?.noServerStart&&bJ();function ybe(e,t){let r=(lf(),v(Pp)).getComponentName,n;if(t.securePort){SJ(t.securePort,{protocol_name:"TLS",name:r()});let s=Ebe("server",t.mtls),i=Ws.get("tls");n=hbe({rejectUnauthorized:!!t.mtls?.required,requestCert:!!t.mtls,noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600,ciphers:i.ciphers??i[0]?.ciphers,SNICallback:s},e),s.initialize(n),wf[t.securePort]=n}return t.port&&(SJ(t.port,{protocol_name:"TCP",name:r()}),n=dbe(e,{noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600}),wf[t.port]=n),n}o(ybe,"onSocket")});async function PJ({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let a=await sD.get(e,{returnNonexistent:!0});i=new aD(e,t,a),a&&(i.sessionWasPresent=!0)}else{if(e){let a=await sD.get(e);a&&a.delete()}i=new uy(e,t)}return n&&(n.id=e,n.user={username:t?.username},SE.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function iD(){return ly++,ly>65500&&(ly=1),ly}function oD(e,t,r){let{topic:n,retain:s}=e;e.data=t,e.async=!0,r.authorize=!0;let i=bs.getMatch(n,"mqtt");if(!i)throw new Error(`Can not publish to topic ${n} as it does not exist, no resource has been defined to handle this topic`);e.url=i.relativeURL;let a=new ri(i.relativeURL);a.checkPermission=r.user?.role?.permission??{};let c=i.Resource;return Ft(r,()=>s?t===void 0?c.delete(a,r):c.put(a,e.data,r):c.publish(a,e.data,r))}var wJ,Nc,OJ,CJ,NJ,sD,SE,ly,uy,aD,LJ=ce(()=>{Me();Fu();wJ=w(yn()),Nc=w(Q());Bc();OJ=w(nt()),CJ=w(nD());Dr();O_();NJ=100,sD=ze({database:"system",table:"hdb_durable_session",attributes:[{name:"id",isPrimaryKey:!0},{name:"subscriptions",type:"array",elements:{attributes:[{name:"topic"},{name:"qos"},{name:"startTime"},{name:"acks"}]}}]}),SE=ze({database:"system",table:"hdb_session_will",attributes:[{name:"id",isPrimaryKey:!0},{name:"topic",type:"string"},{name:"data"},{name:"qos",type:"number"},{name:"retain",type:"boolean"},{name:"user",type:"any"}]});(0,OJ.getWorkerIndex)()===0&&(async()=>{await CJ.whenComponentsLoaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of SE.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await Le.getUser(r.user.username));try{await oD(r,t,r)}catch{(0,Nc.warn)("Failed to publish will",t)}SE.delete(e.id)}})();o(PJ,"getSession");ly=1;o(iD,"getNextMessageId");uy=class{static{o(this,"SubscriptionsSession")}listener;sessionId;user;request;socket;subscriptions=[];awaitingAcks;sessionWasPresent;keepalive;keepaliveTimer;constructor(t,r){this.sessionId=t,this.user=r}async addSubscription(t,r,n){let{topic:s,rh:i,startTime:a}=t,c=s.indexOf("?"),l,u;if(c>-1?(l=s.slice(c),u=s.slice(0,c)):u=s,!u)throw new Error("No topic provided");if(u.indexOf(".")>-1)throw new Error("Dots are not allowed in topic names");let d=this.subscriptions.find(T=>T.topic===s),f;d?(f=i>0,d.end(),this.subscriptions.splice(this.subscriptions.indexOf(d),1)):f=i===2;let m={search:l,async:!0,user:this.user,startTime:a,omitCurrent:f,target:"",checkPermission:this.user?.role?.permission??{}};a&&(0,Nc.trace)("Resuming subscription from",s,"from",a);let h=bs.getMatch(u,"mqtt");if(!h){let T=new Error(`The topic ${s} does not exist, no resource has been defined to handle this topic`);throw T.statusCode=404,T}m.url=h.relativeURL;let p;if(m.url.indexOf("+")>-1||(p=m.url.indexOf("#"))>-1){let T=m.url.slice(1);if(p--,p>-1&&p!==T.length-1)throw new Error("Multi-level wildcards can only be used at the end of a topic");if(m.isCollection=!0,T.indexOf("+")===T.length-1)m.onlyChildren=!0,m.url="/"+T.slice(0,T.length-1);else{let y=T.split("/"),N;for(let Z=0;Z<y.length;Z++)if(y[Z].indexOf("+")>-1)if(y[Z]==="+")N=!0;else throw new Error("Single-level wildcards can only be used as a topic level (between or after slashes)");if(n&&N)throw new Error("Filters can not be combined");let O=!0;y[y.length-1]==="#"&&(y.length--,O=!1),N&&(n=o(Z=>{let G=Z.id;if(!Array.isArray(G))if(G?.indexOf?.("/")>-1)G=G.split("/");else return!1;if(O&&G.length!==y.length)return!1;for(let Y=0;Y<y.length;Y++)if(y[Y]!=="+"&&y[Y]!==G[Y])return!1;return!0},"filter"));let F=y.indexOf("+");m.url="/"+(F>-1?y.slice(0,F):y).concat("").join("/")}}else m.isCollection=!1;let _=h.path,g=h.Resource,R=await Ft(m,async()=>{let T=this.createContext();T.topic=s,T.retainHandling=i,T.isCollection=m.isCollection;let y=await g.subscribe(m,T);if(!y)return;if(!y[Symbol.asyncIterator])throw new Error(`Subscription is not (async) iterable for topic ${s}`);let N=(async()=>{for await(let O of y)try{let F;if(O.type&&O.type!=="put"&&O.type!=="delete"&&O.type!=="message"&&O.type!=="patch"||n&&!n(O))continue;r?(O.topic=s,F=this.needsAcknowledge(O)):(O.acknowledge?.(),F=iD());let Z=O.id;if(Array.isArray(Z)&&(Z=Bu(Z)),Z==null&&(Z=""),await this.listener(_+"/"+Z,O.value,F,t)===!1)break;this.awaitingAcks?.size>NJ?await new Promise(Y=>setTimeout(Y,this.awaitingAcks.size-NJ)):await new Promise(setImmediate)}catch(F){(0,Nc.warn)(F)}})();return y});if(R)return R.topic=s,R.qos=t.qos,this.subscriptions.push(R),R}resume(){}needsAcknowledge(t){let r=iD();return t.acknowledge&&(this.awaitingAcks||(this.awaitingAcks=new Map),this.awaitingAcks.set(r,{acknowledge:t.acknowledge})),r}acknowledge(t){let r=this.awaitingAcks?.get(t);r&&(this.awaitingAcks.delete(t),r.acknowledge())}async removeSubscription(t){let r=this.subscriptions.find(n=>n.topic===t);if(r)return r.end(),this.subscriptions.splice(this.subscriptions.indexOf(r),1),!0}async publish(t,r){return oD(t,r,this.createContext())}createContext(){let t={session:this,socket:this.socket,user:this.user,authorize:!0};return this.request&&(t.request=this.request,t.url=this.request.url,t.headers=this.request.headers),t}setListener(t){this.listener=t}disconnect(t){this.keepaliveTimer&&clearTimeout(this.keepaliveTimer);let r=this.createContext();Ft(r,async()=>{try{if(!t){let n=await SE.get(this.sessionId);n?.doesExist()&&await oD(n,n.data,r)}}finally{await SE.delete(this.sessionId)}}).catch(n=>{(0,Nc.warn)(`Error publishing MQTT will for ${this.sessionId}`,n)});for(let n of this.subscriptions)n.end();this.subscriptions=[]}receivedPacket(){this.keepalive&&(clearTimeout(this.keepaliveTimer),this.keepaliveTimer=setTimeout(()=>{this.socket?.destroy?this.socket.destroy(new Error("Keepalive timeout")):this.socket?.terminate()},this.keepalive*1500))}};o(oD,"publish");aD=class extends uy{static{o(this,"DurableSubscriptionsSession")}sessionRecord;constructor(t,r,n){super(t,r),this.sessionRecord=n||{id:t,subscriptions:[]}}async resume(){for(let t of this.sessionRecord.subscriptions||[])await this.resumeSubscription({omitCurrent:!0,topic:t.topic,qos:t.qos,startTime:t.startTime},!0,t.acks?r=>!t.acks.includes(r.localTime):null)}resumeSubscription(t,r,n){return super.addSubscription(t,r,n)}needsAcknowledge(t){this.awaitingAcks||(this.awaitingAcks=new Map);let r=iD(),n={topic:t.topic,timestamp:t.localTime};return t.acknowledge&&(n.acknowledge=t.acknowledge),this.awaitingAcks.set(r,n),r}acknowledge(t){let r=this.awaitingAcks?.get(t);if(!r)return;this.awaitingAcks?.delete(t),r.acknowledge?.();let n=r.topic;for(let[,s]of this.awaitingAcks)if(s.topic===n&&s.timestamp<r.timestamp){for(let i of this.sessionRecord.subscriptions)if(i.topic===n){i.acks||(i.acks=[]),i.acks.push(r.timestamp),(0,Nc.trace)("Received ack",n,r.timestamp),this.sessionRecord.update();return}}for(let s of this.sessionRecord.subscriptions)s.topic===n&&(s.startTime=r.timestamp);this.sessionRecord.update()}async addSubscription(t,r){await this.resumeSubscription(t,r);let{qos:n,startTime:s}=t;return n>0&&!s&&this.saveSubscriptions(),t.qos}removeSubscription(t){let r=this.subscriptions.find(s=>s.topic===t),n=super.removeSubscription(t);return r.qos>0&&this.saveSubscriptions(),n}saveSubscriptions(){this.sessionRecord.subscriptions=this.subscriptions.map(t=>{let r=t.startTime;return r||(r=t.startTime=(0,wJ.getNextMonotonicTime)()),(0,Nc.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),sD.put(this.sessionRecord)}}});var cD={};we(cD,{bypassAuth:()=>Abe,start:()=>Ibe});function Abe(){FJ=!0}function Ibe({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new BJ.EventEmitter},e.mqtt.events.on("error",()=>{}));let a=e.mqtt,c=[],l=r?.mtls;return n&&(c=e.ws((u,d,f,m)=>{if(d.headers.get("sec-websocket-protocol")!=="mqtt")return m(u,d,f);a.events.emit("connection",u),ar.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:h,onClose:p}=MJ(u,_=>{u.send(_)},d,Promise.resolve(f).then(()=>d?.user),a);u.on("message",h),u.on("close",p),u.on("error",_=>{ar.info?.("WebSocket error",_)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(a.events.emit("connection",u),ar.debug?.(`Received ${u.getCertificate?"SSL":"TCP"} connection for MQTT from ${u.remoteAddress}`),l){if(u.authorized)try{let h=l.user;if(h!==null){(h===void 0||h==="Common Name"||h==="CN")&&(h=u.getPeerCertificate().subject.CN);try{d=await e.getUser(h,null,null),(0,Of.get)(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&fy.notify?.({username:d?.username,status:Zs.SUCCESS,type:ya.AUTHENTICATION,authStrategy:"MQTT mTLS",remoteAddress:u.remoteAddress})}catch(p){throw(0,Of.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&fy.error?.({username:h,status:Zs.FAILURE,type:ya.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:u.remoteAddress}),p}}else ar.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(h){a.events.emit("error",h,u),ar.error?.(h)}else if(l.required)return ar.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&bbe(u.remoteAddress)&&(d=await(0,vJ.getSuperUser)(),ar.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:f,onClose:m}=MJ(u,h=>u.write(h),null,d,a);u.on("data",f),u.on("close",m),u.on("error",h=>{ar.info?.("Socket error",h)})},{port:t,securePort:s,mtls:l})),c}function MJ(e,t,r,n,s){DJ||(DJ=!0,ch(f=>{dy>0&&f.push({metric:"mqtt-connections",connections:dy,byThread:!0})}));let i;dy++;let a,c={protocolVersion:4},l=(0,my.parser)({protocolVersion:5});function u(f){l.parse(f)}o(u,"onMessage");function d(){dy--,i||(i=!0,a?.disconnect?.(),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!1,"connection","mqtt","disconnect"),ar.debug?.("MQTT connection was closed",e.remoteAddress))}return o(d,"onClose"),l.on("packet",async f=>{try{n?.then&&(n=await n)}catch(y){e.close?.(1008,"Unauthorized"),ar.info?.(y);return}let m=f.cmd;if(a)a.then&&await a;else if(m!=="connect"){ar.info?.("Received packet before connection was established, closing connection"),e?.destroy?e.destroy():e?.terminate();return}let h=f.topic,p=h?.indexOf("/",1),_=p>0?h.slice(0,p):h;it(f.length,"bytes-received",_,R(f),"mqtt");try{switch(a?.receivedPacket?.(),m){case"connect":if(c.protocolVersion=f.protocolVersion,f.username)try{n=await Le.getUser(f.username,f.password.toString(),r),(0,Of.get)(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&fy.notify?.({username:n?.username,status:Zs.SUCCESS,type:ya.AUTHENTICATION,authStrategy:"MQTT",remoteAddress:e.remoteAddress})}catch(K){return(0,Of.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&fy.error?.({username:f.username,status:Zs.FAILURE,type:ya.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:e.remoteAddress}),s.events.emit("auth-failed",f,e,K),Wr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:4,returnCode:134})}if(!n&&s.requireAuthentication)return s.events.emit("auth-failed",f,e),Wr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:4,returnCode:134});try{if(s.authorizeClient?.(f,n),f.will){let K=e.deserialize||(e.deserialize=To(r?.headers.get?.("content-type")));f.will.data=f.will.payload?.length>0?K(f.will.payload):void 0,delete f.will.payload}a=PJ({user:n,...f}),a=await a,a.socket=e,r&&(a.request=r),s.sessions.add(a)}catch(K){return ar.error?.(K),s.events.emit("auth-failed",f,e,K),Wr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:K.code||5,returnCode:K.code||128})}s.events.emit("connected",a,e),Wr(!0,"connection","mqtt","connect"),g({cmd:"connack",sessionPresent:a.sessionWasPresent,reasonCode:0,returnCode:0});let y=o(async(K,$,le,ue)=>{try{if(i)throw new Error("Session disconnected while trying to send message to",K);let se=K.indexOf("/",1),me=se>0?K.slice(0,se):K;g({cmd:"publish",topic:K,payload:await T($),messageId:le||Math.floor(Math.random()*1e8),qos:ue.qos},me);let Pe=e._socket??e;return Pe.writableNeedDrain?new Promise(De=>Pe.once("drain",De)):!Pe.closed}catch(se){return ar.error?.(se),a?.disconnect(),s.sessions.delete(a),!1}},"listener");a.setListener(y),a.sessionWasPresent&&await a.resume();break;case"subscribe":let N=[];for(let K of f.subscriptions){let $;try{let le=await a.addSubscription(K,K.qos>=1);$=le?le.qos||0:c.protocolVersion<5?128:143}catch(le){s.events.emit("error",le,e,K,a),le.statusCode?le.statusCode===500?ar.warn?.(le):ar.info?.(le):ar.error?.(le),$=c.protocolVersion<5?128:le.statusCode===403?135:le.statusCode===404?143:128}N.push($)}await a.committed,g({cmd:"suback",granted:N,messageId:f.messageId});break;case"unsubscribe":{let K=[];for(let $ of f.unsubscriptions)K.push(a.removeSubscription($)?0:17);g({cmd:"unsuback",granted:K,messageId:f.messageId});break}case"pubrel":g({cmd:"pubcomp",messageId:f.messageId,reasonCode:0});return;case"publish":let O=f.qos===2?"pubrec":"puback",F=e.deserialize||(e.deserialize=To(r?.headers.get?.("content-type"))),G=(f.payload?.length||0)>0?F(f.payload):void 0,Y;try{Y=await a.publish(f,G)}catch(K){s.events.emit("error",K,e,f,a),ar.warn?.(K),f.qos>0&&g({cmd:O,messageId:f.messageId,reasonCode:128},f.topic);break}f.qos>0&&g({cmd:O,messageId:f.messageId,reasonCode:Y===!1?144:0},f.topic);break;case"pubrec":g({cmd:"pubrel",messageId:f.messageId,reasonCode:0});break;case"pubcomp":case"puback":a.acknowledge(f.messageId);break;case"pingreq":g({cmd:"pingresp"});break;case"disconnect":i=!0,a?.disconnect(!0),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!0,"connection","mqtt","disconnect"),ar.debug?.("Received disconnect command, closing MQTT session",e.remoteAddress),e.close?e.close():e.end();break}}catch(y){s.events.emit("error",y,e,f,a),ar.error?.(y),g({cmd:"disconnect"})}function g(y,N){let O=(0,my.generate)(y,c);t(O),it(O.length,"bytes-sent",N,R(y),"mqtt")}o(g,"sendPacket");function R(y){return y.qos>0?y.cmd+",qos="+y.qos:y.cmd}o(R,"packetMethodName");function T(y){return ba(y,r)}o(T,"serialize")}),l.on("error",f=>{ar.warn("MQTT parsing error, closing connection:",f.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var my,vJ,Of,UJ,xJ,BJ,fy,ar,FJ,bbe,DJ,dy,HJ=ce(()=>{my=require("mqtt-packet");LJ();vJ=w(ts());Ro();Wi();Dr();Of=w(oe());k();UJ=w(ei()),xJ=w(Q()),BJ=require("events"),fy=(0,UJ.loggerWithTag)("auth-event"),ar=(0,xJ.forComponent)("mqtt"),FJ=(0,Of.get)(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;o(Abe,"bypassAuth");bbe=o(e=>FJ&&(e.includes("127.0.0.")||e==="::1"),"authorizeLocal");o(Ibe,"start");dy=0;o(MJ,"onSocket")});function hy(e,t){if(t?.includes(".."))throw new lD(t);let r=t||"/";return(r==="."||r.startsWith("./"))&&(r=`/${e}${r.slice(1)}`),r.startsWith("/")||(r=`/${r}`),r.endsWith("/")||(r=`${r}/`),r}var lD,uD=ce(()=>{lD=class extends Error{static{o(this,"InvalidBaseURLPathError")}constructor(t){super(`urlPath must not contain '..'. Received: '${t}'`)}};o(hy,"resolveBaseURLPath")});function kJ(e){if(e.length===0)return".";if(e.length===1)return e[0];let t=e.map(s=>s.split("/")),r=Math.min(...t.map(s=>s.length)),n=[];for(let s=0;s<r;s++){let i=t[0][s];if(t.every(a=>a[s]===i))n.push(i);else break}return n.length===0?".":n.join("/")}var GJ=ce(()=>{o(kJ,"deriveCommonPatternBase")});function py(e){let t={source:[],onlyFiles:!1,onlyDirectories:!1,ignore:[]},r=o((n,s)=>{typeof s=="string"?n.push(s):Array.isArray(s)&&n.push(...s)},"addToArray");return typeof e=="string"||Array.isArray(e)?r(t.source,e):(r(t.source,e.source),r(t.ignore,e.ignore),t.onlyFiles=e.only==="files",t.onlyDirectories=e.only==="directories"),t}var dD=ce(()=>{o(py,"deriveGlobOptions")});var qJ,fD,TE,$J=ce(()=>{uD();GJ();dD();qJ=require("micromatch"),fD=class extends Error{static{o(this,"ComponentInvalidPatternError")}constructor(t){super(`Config 'files' option glob pattern must not contain '..' or start with '/'. Received: '${t}'`),this.name="ComponentInvalidPatternError"}},TE=class{static{o(this,"Component")}globOptions;baseURLPath;patternBases;directory;name;config;commonPatternBase;constructor(t,r,n){this.name=t,this.directory=r,this.config=n,this.baseURLPath=hy(this.name,this.config.urlPath),this.globOptions=py(this.config.files),this.globOptions.source=this.globOptions.source.map(s=>{if(s.includes("..")||s.startsWith("/"))throw new fD(s);return s==="."||s==="./"?"**/*":s}),this.patternBases=this.globOptions.source.map(s=>(0,qJ.scan)(s).base),this.commonPatternBase=kJ(this.patternBases)}}});function VJ(e,t){return new RegExp(`^${e}(/|$)`).test(t)}function fu(e,t,r){t.startsWith("./")&&(t=t.slice(2));for(let n of e.patternBases)if(n.startsWith("./")&&(n=n.slice(2)),n!==""){if(r==="file"){if(t===n){let s=t.split("/");t=s[s.length-1];break}else if(VJ(n,t)){t=t.slice(n.length+1);break}}if(r==="directory"){if(t===n){t="";break}else if(VJ(n,t)){t=t.slice(n.length+1);break}}}return(0,KJ.join)(e.baseURLPath,t)}var KJ,mD=ce(()=>{KJ=require("node:path");o(VJ,"pathStartsWithBase");o(fu,"deriveURLPath")});function YJ(e){return typeof e=="string"||Array.isArray(e)||!("files"in e)?{files:e}:e}var _y,WJ,zJ,hD,jJ,QJ,Ey,JJ=ce(()=>{_y=require("node:events");$J();WJ=w(Q()),zJ=w(require("chokidar")),hD=require("node:path"),jJ=require("node:fs/promises");mD();QJ=require("micromatch"),Ey=class extends _y.EventEmitter{static{o(this,"EntryHandler")}#e;#t;#r;ready;constructor(t,r,n,s){super(),this.#e=new TE(t,r,YJ(n)),this.#r=s||WJ.default.loggerWithTag(t),this.ready=(0,_y.once)(this,"ready"),this.#a()}get name(){return this.#e.name}get directory(){return this.#e.directory}#n(...[t,r,n]){if(r===""&&(r="/"),!(0,QJ.isMatch)(r,this.#e.globOptions.source,{ignore:this.#e.globOptions.ignore}))return;let s=(0,hD.join)(this.directory,r);switch(t){case"add":case"change":{let i=fu(this.#e,r,"file");(0,jJ.readFile)(s).then(a=>{let c={eventType:t,entryType:"file",contents:a,stats:n,absolutePath:s,urlPath:i};this.emit("all",c),this.emit(t,c)});break}case"unlink":{let i=fu(this.#e,r,"file"),a={eventType:t,entryType:"file",stats:n,absolutePath:s,urlPath:i};this.emit("all",a),this.emit(t,a);break}case"addDir":case"unlinkDir":{let i=fu(this.#e,r,"directory"),a={eventType:t,entryType:"directory",stats:n,absolutePath:s,urlPath:i};this.emit("all",a),this.emit(t,a);break}}}#s(t){this.emit("error",t)}#i(){this.emit("ready")}async#a(){await this.#t?.close(),this.#t=void 0;let t=this.#e.patternBases.map(r=>(0,hD.join)(this.#e.directory,r));return this.#t=zJ.default.watch(this.#e.commonPatternBase,{cwd:this.#e.directory,persistent:!1,ignored:o(r=>{let n=r.replace(/\\/g,"/"),s=t.map(i=>i.replace(/\\/g,"/"));return n!==this.#e.directory.replace(/\\/g,"/")&&s.every(i=>!n.startsWith(i))},"ignored")}).on("all",this.#n.bind(this)).on("error",this.#s.bind(this)).on("ready",this.#i.bind(this)),this.ready}close(){return this.#t?.close(),this.#t=void 0,this.emit("close"),this.removeAllListeners(),this}update(t){return this.#e=new TE(this.name,this.directory,YJ(t)),this.#a()}};o(YJ,"castConfig")});var gy,pD=ce(()=>{gy={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js"},static:{files:"web/**"}}});var Ty,XJ,ZJ,e4,t4,r4,ED,_D,gD,SD,TD,Sy,n4=ce(()=>{Ty=require("events"),XJ=w(require("yaml")),ZJ=w(require("chokidar")),e4=require("node:fs/promises"),t4=require("util"),r4=w(Q());pD();ED=class extends Error{static{o(this,"OptionsWatcherConfigFileError")}constructor(t,r){super(`Error watching config file ${t}: ${typeof r=="object"&&r!==null&&"message"in r?r.message:r}`),this.name="OptionsWatcherConfigFileError"}},_D=class extends Error{static{o(this,"InvariantUninitializedOptionsWatcherError")}constructor(){super("Invariant: OptionsWatcher has not been initialized yet. This should never happen."),this.name="InvariantUninitializedOptionsWatcherError"}},gD=class extends Error{static{o(this,"InvalidValueTypeError")}constructor(t,r){super(`Invalid value type for key ${t.join(".")}. Expected object, string, array, number, boolean, or undefined. Received ${typeof r}.`),this.name="InvalidValueTypeError"}},SD=class extends Error{static{o(this,"KeyDoesNotExistError")}constructor(t,r){super(`Cannot set property ${t.join(".")} as ${r} does not exist.`),this.name="KeyDoesNotExistError"}},TD=class extends Error{static{o(this,"CannotSetPropertyError")}constructor(t){super(`Cannot set property ${t.join(".")} as parent is not an object.`),this.name="CannotSetPropertyError"}},Sy=class extends Ty.EventEmitter{static{o(this,"OptionsWatcher")}#e;#t;#r;#n;#s;#i;ready;constructor(t,r,n){super(),this.#s=t,this.#e=r,this.#i=n||r4.default.loggerWithTag(t),this.ready=(0,Ty.once)(this,"ready"),this.#t=ZJ.default.watch(r,{persistent:!1}).on("add",this.#a.bind(this)).on("change",this.#a.bind(this)).on("error",this.#d.bind(this)).on("unlink",this.#c.bind(this)).on("ready",this.#a.bind(this))}#a(){(0,e4.readFile)(this.#e,"utf-8").then(t=>{this.#n=XJ.default.parse(t),this.#n&&this.#s in this.#n?this.#r?this.#f(this.#n[this.#s],this.#r):(this.#r=this.#n[this.#s],this.emit("ready",this.#r)):this.#r&&(this.#r=void 0,this.emit("remove"))}).catch(t=>{if(t instanceof Error&&"code"in t&&t.code==="ENOENT"){this.#n?(this.#o(),this.emit("remove")):(this.#o(),this.emit("ready"));return}this.emit("error",t)})}#d(t){this.emit("error",new ED(this.#e,t))}#c(t){this.#i.warn(`Configuration file ${t} was deleted. Reverting to default configuration. Recreate it to restore the options watcher.`),this.#o(),this.emit("remove")}#o(){this.#n=gy,this.#r=this.#n[this.#s]}#f(t,r,n=[]){if(!this.#l(r)||!this.#l(t)){this.#u(n,t);return}for(let s of Object.keys(r))s in t||this.#u(n.concat(s),void 0);for(let[s,i]of Object.entries(t)){let a=n.concat(s),c=this.#m(a);if(typeof i!=typeof c||Array.isArray(i)&&!Array.isArray(c)||!Array.isArray(i)&&Array.isArray(c)){this.#u(a,i);continue}if(!Array.isArray(i)&&typeof i=="object"&&i!==null){this.#l(c)?this.#f(i,c,a):this.#u(a,i);continue}(0,t4.isDeepStrictEqual)(i,c)||this.#u(a,i)}}#l(t){return typeof t=="object"&&t!==null&&t!==void 0&&!Array.isArray(t)}#m(t){let r=this.#r;for(let n of t){if(r==null||typeof r!="object"||!(n in r))return;r=r[n]}return structuredClone(r)}#u(t,r){if(!this.#r)throw new _D;if(!["object","string","array","number","boolean","undefined"].includes(typeof r))throw new gD(t,r);let n=this.#r;for(let s of t.slice(0,-1)){if(n==null||typeof n!="object"||!(s in n))throw new SD(t,s);n=n[s]}if(n==null||typeof n!="object")throw new TD(t);n[t[t.length-1]]=r,this.emit("change",t,r,this.#r)}close(){return this.#t.close(),this.emit("close"),this.removeAllListeners(),this}get(t){return this.#r?this.#m(t):void 0}getAll(){return structuredClone(this.#r)}getRoot(){return this.#n}}});function s4(){wbe[0]=1}var Nbe,wbe,i4=ce(()=>{Bp();Nbe=ea.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),wbe=new Uint8Array(Nbe);o(s4,"requestRestart")});var Ay,o4,Ry,yy,a4=ce(()=>{Ay=require("node:events");JJ();n4();o4=w(Q());i4();Ry=class extends Error{static{o(this,"MissingDefaultFilesOptionError")}constructor(){super("No default files option exists. Ensure `files` is specified in config.yaml"),this.name="MissingDefaultFilesOptionError"}},yy=class extends Ay.EventEmitter{static{o(this,"Scope")}#e;#t;#r;#n;#s;#i;options;resources;server;ready;constructor(t,r,n,s,i){super(),this.#r=t,this.#t=r,this.#e=n,this.#i=o4.default.forComponent(this.#r),this.resources=s,this.server=i,this.#s=[],this.ready=(0,Ay.once)(this,"ready"),this.options=new Sy(t,n,this.#i).on("error",this.#d.bind(this)).on("change",this.#f.bind(this)()).on("ready",this.#a.bind(this))}get logger(){return this.#i}get name(){return this.#r}get directory(){return this.#t}#a(){this.emit("ready")}#d(t){this.emit("error",t)}close(){for(let t of this.#s)t.close();return this.options.close(),this.emit("close"),this.removeAllListeners(),this}#c(t){let r=new Ey(this.#r,this.#t,t,this.#i).on("error",this.#d.bind(this)).on("add",this.#o("add")).on("change",this.#o("change")).on("unlink",this.#o("unlink")).on("addDir",this.#o("addDir")).on("unlinkDir",this.#o("unlinkDir"));return this.#s.push(r),r}#o(t){let r=this;return function(){this.listenerCount("all")>0||this.listenerCount(t)>1||r.requestRestart()}}#f(){let t=this;return o(function(...[n,s,i]){if(n[0]==="files"||n[0]==="urlPath"){if(!t.#n){t.#n=t.#c(i);return}t.#n.update(i);return}this.listenerCount("change")>1||(t.#i.debug(`Options changed: ${n.join(".")}, requesting restart`),t.requestRestart())},"handleOptionsWatcherChange")}#l(){let t=this.options.getAll();if(t&&typeof t=="object"&&t!==null&&!Array.isArray(t)&&"files"in t)return{files:t.files,urlPath:t.urlPath}}handleEntry(t,r){if(t===void 0){if(this.#n)return this.#n;let s=this.#l();if(s)return this.#n=this.#c(s),this.#n;this.emit("error",new Ry);return}if(typeof t=="function"){if(this.#n)return this.#n.on("all",t);let s=this.#l();if(s)return this.#n=this.#c(s),this.#n.on("all",t);this.emit("error",new Ry);return}let n=this.#c(t);return r?n.on("all",r):n}requestRestart(){this.#i.debug(`Restart requested from ${this.name} scope for ${this.directory}`),s4()}}});function mu(e){return typeof e=="string"&&e.trim()!==""}function RD(e){return Array.isArray(e)&&e.length!==0&&e.every(t=>mu(t))}function d4(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Obe(e){e.config.root&&RE.default.warn("Resource extension 'root' option is deprecated. Due to backwards compatibility reasons it does not act as assumed. The glob pattern will always be evaluated from the component directory root. The option is only used for the initial root directory handling. Please remove and modify the 'files' glob pattern instead.");let t=[];if(e.config.root&&typeof e.config.files!="string")throw new OD(e);let r=e.config.root;r&&(r.startsWith("/")&&(r=r.slice(1)),r.endsWith("/")||(r+="/"));let n=e.config.files;if(typeof n=="string"&&!n.includes("**/*")&&(n.indexOf("/*")>-1?r=n.slice(0,n.indexOf("/*")+1):n.indexOf("/")>-1&&(r=n.slice(0,n.lastIndexOf("/")+1))),r&&t.push(r),t.length===0){if(d4(e.config.files)&&e.config.files.only==="files")return!1;t=e.patternBases}let s=!1;for(let i of t){let a=(0,yE.join)(e.directory,i);by.isMainThread&&e.module.setupDirectory&&(s=await e.module.setupDirectory(e.baseURLPath,a,e.resources)),e.resources.isWorker&&e.module.handleDirectory&&(s=await e.module.handleDirectory(e.baseURLPath,a,e.resources))}return s}async function f4(e){let t=!1;if(t=await Obe(e),t)return t;let r=await(0,c4.default)(e.globOptions.source,{cwd:e.directory,objectMode:!0,onlyFiles:e.globOptions.onlyFiles,onlyDirectories:e.globOptions.onlyDirectories,ignore:e.globOptions.ignore});for(let n of r){let s=(0,yE.join)(e.directory,n.path);if(n.dirent.isDirectory()){let i=fu(e,n.path,"directory");by.isMainThread&&e.module.setupDirectory&&(await e.module.setupDirectory(i,s,e.resources),t=!0),e.resources.isWorker&&e.module.handleDirectory&&(await e.module.handleDirectory(i,s,e.resources),t=!0)}else if(n.dirent.isFile()){let i=fu(e,n.path,"file"),a=await(0,l4.readFile)(s);by.isMainThread&&e.module.setupFile?(await e.module.setupFile(a,i,s,e.resources),t=!0):e.resources.isWorker&&e.module.handleFile&&(await e.module.handleFile(a,i,s,e.resources),t=!0)}else RE.default.error(`Entry received from glob pattern match for component ${e.name} is neither a file nor a directory:`,n)}return t}var by,c4,RE,yE,l4,u4,Iy,Oi,yD,AD,bD,ID,ND,wD,OD,CD,PD,m4=ce(()=>{by=require("node:worker_threads"),c4=w(require("fast-glob")),RE=w(Q());uD();dD();yE=require("node:path"),l4=require("node:fs/promises");mD();u4=require("micromatch"),Iy=class{static{o(this,"ComponentV1")}config;name;directory;module;resources;globOptions;patternBases;baseURLPath;constructor(t){if(this.config=t.config,this.name=t.name,this.directory=t.directory,this.module=t.module,this.resources=t.resources,!mu(this.config.files)&&!RD(this.config.files)&&!d4(this.config.files))throw new yD(this);if(typeof this.config.files=="object"&&!Array.isArray(this.config.files)){if(this.config.files.source===void 0||!RD(this.config.files.source)&&!mu(this.config.files.source))throw new AD(this);if(this.config.files.only!==void 0&&(typeof this.config.files.only!="string"||!["all","files","directories"].includes(this.config.files.only)))throw new bD(this);if(this.config.files.ignore!==void 0&&!RD(this.config.files.ignore)&&!mu(this.config.files.ignore))throw new ID(this)}if(this.config.root!==void 0&&!mu(this.config.root))throw new wD(this);if(this.config.path!==void 0&&!mu(this.config.path))throw new CD(this);if(this.config.path&&(RE.default.warn("Resource extension 'path' option is deprecated. Please replace with 'urlPath'."),this.config.urlPath=this.config.path),this.config.urlPath!==void 0&&(!mu(this.config.urlPath)||typeof this.config.urlPath=="string"&&this.config.urlPath.includes("..")))throw new PD(this);this.globOptions=py(this.config.files),this.globOptions.source=this.globOptions.source.map(r=>{if(r.includes(".."))throw new ND(this,r);return r.startsWith("/")&&(RE.default.warn("Leading '/' in 'files' glob pattern is deprecated. For backwards compatibility purposes, it is currently transformed to the relative path of the component, but in the future will result in an error. Paths are automatically derived from the root of the component directory. Please remove (e.g. '/web/*' -> 'web/*')."),r=r==="/"?".":r.slice(1)),r}),this.patternBases=this.globOptions.source.map(r=>(0,u4.scan)(r).base),this.baseURLPath=hy(this.name,this.config.urlPath)}},Oi=class extends Error{static{o(this,"ComponentV1ProcessingError")}constructor(t,r){super(`Component ${r.name} (from ${(0,yE.basename)(r.directory)}) ${t}`)}},yD=class extends Oi{static{o(this,"InvalidFilesOptionError")}constructor(t){super("'files' option must be a non-empty string, an array of non-empty strings, or an object.",t)}},AD=class extends Oi{static{o(this,"InvalidFilesSourceOptionError")}constructor(t){super("'files' object must have a non-empty 'source' property.",t)}},bD=class extends Oi{static{o(this,"InvalidFilesOnlyOptionError")}constructor(t){super("'files.only' option must be one of 'all', 'files', or 'directories'.",t)}},ID=class extends Oi{static{o(this,"InvalidFileIgnoreOptionError")}constructor(t){super("'files.ignore' option must be a non-empty string or an array of non-empty strings.",t)}},ND=class extends Oi{static{o(this,"InvalidGlobPattern")}constructor(t,r){super(`'files' glob pattern must not contain '..'. Received: '${r}'`,t)}},wD=class extends Oi{static{o(this,"InvalidRootOptionError")}constructor(t){super("deprecated 'root' option must be a non-empty string. Consider removing and updating 'files' glob pattern instead.",t)}},OD=class extends Oi{static{o(this,"InvalidRootOptionUseError")}constructor(t){super("the 'root' option is deprecated and only supported if 'files' is a singular, non-empty string. Please remove the 'root' option and modify the 'files' glob pattern instead.",t)}},CD=class extends Oi{static{o(this,"InvalidPathOptionError")}constructor(t){super("deprecated 'path' option must be a non-empty string. Consider replacing with 'urlPath'.",t)}},PD=class extends Oi{static{o(this,"InvalidURLPathOptionError")}constructor(t){super("'urlPath' option must be a non-empty string that must not contain '..'.",t)}};o(mu,"isNonEmptyString");o(RD,"isArrayOfNonEmptyStrings");o(d4,"isObject");o(Obe,"handleRoots");o(f4,"processResourceExtensionComponent")});var Pp={};we(Pp,{componentErrors:()=>AE,getComponentName:()=>oy,loadComponent:()=>Cy,loadComponentDirectories:()=>E4,setErrorReporter:()=>Pbe});function E4(e,t){t&&(DD=t),e&&(xD=e);let r=[];if((0,Ut.existsSync)(LD)){let s=(0,Ut.readdirSync)(LD,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let a=i.name,c=(0,Gr.join)(LD,a);r.push(Cy(c,DD,Ky,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(Cy(n,DD,n,!1,void 0,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{p4=!0})}function Pbe(e){wy=e}function Lbe(e,t){return new Promise((r,n)=>{let s=setTimeout(()=>{ea.primaryStore.unlock(e,0),n(new Error("symlinking harperdb module timed out"))},1e4);if(ea.primaryStore.attemptLock(e,0,()=>{clearTimeout(s),r()}))try{(0,Ut.rmSync)(t,{recursive:!0,force:!0}),(0,Ut.existsSync)((0,Gr.join)(e,"node_modules"))||(0,Ut.mkdirSync)((0,Gr.join)(e,"node_modules")),(0,Ut.symlinkSync)(FD.PACKAGE_ROOT,t,"dir"),r()}finally{ea.primaryStore.unlock(e,0)}})}function _4(e,t){return e.ready.then(()=>{let r=e.options.get(["timeout"])||t.defaultTimeout||3e4;if(typeof r!="number")throw new Error(`Invalid timeout value for ${e.name}. Expected a number, received: ${typeof r}`);let n,s;if(!ea.primaryStore.attemptLock(e.name,0,()=>{clearTimeout(s),n(_4(e,t))}))return new Promise((a,c)=>{n=a,s=setTimeout(()=>{c(new Error(`Timeout waiting for lock on ${e.name}`))},r+5e3)});let i;return Promise.race([t.handleApplication(e),new Promise((a,c)=>i=setTimeout(()=>c(new Error(`handleApplication timed out after ${r}ms for ${e.name}`)),r))]).finally(()=>{ea.primaryStore.unlock(e.name,0),clearTimeout(i)})})}async function Cy(e,t,r,n,s,i){let a=(0,Ut.realpathSync)(e);if(Ny.has(a))return Ny.get(a);Ny.set(a,!0),s&&(xD=s);try{let c;n&&(AE=new Map);let l=(0,Gr.join)(e,"harperdb-config.yaml");(0,Ut.existsSync)(l)?c=n?(0,Py.getConfigObj)():(0,vD.parseDocument)((0,Ut.readFileSync)(l,"utf8")).toJSON():!n&&(0,Ut.existsSync)(l=(0,Gr.join)(e,"config.yaml"))?c=(0,vD.parseDocument)((0,Ut.readFileSync)(l,"utf8")).toJSON():c=gy;try{let m=(0,Gr.join)(e,"node_modules","harperdb");(n||((0,Ut.existsSync)(m)||!e.startsWith((0,UD.getHdbBasePath)()))&&(!(0,Ut.existsSync)(m)||(0,Ut.realpathSync)(FD.PACKAGE_ROOT)!==(0,Ut.realpathSync)(m)))&&await Lbe(e,m)}catch(m){pa.default.error("Error symlinking harperdb module",m),m.code=="EPERM"&&process.platform==="win32"&&pa.default.error('You may need to enable developer mode in "Settings" / "System" (or "Update & Security") / "For developers", in order to enable symlinks so components can use `import from "harperdb"`')}let u=Oy,d={};for(let m in c){Oy=m;let h=c[m];if(AE.set(n?m:(0,Gr.basename)(e),!1),!h)continue;let p,_=h.package;try{if(_){let N=e,O;for(;!(0,Ut.existsSync)(O=(0,Gr.join)(N,"node_modules",m));)if(N=(0,Gr.dirname)(N),N.length<(0,UD.getHdbBasePath)().length){O=null;break}if(O)p=await Cy(O,t,r,!1),d[m]=!0;else throw new Error(`Unable to find package ${m}:${_}`)}else p=Cbe[m];if(!p)continue;let g=o(N=>(N.origin=r,ze(N)),"ensureTable"),R=h.network||(h.port||h.securePort)&&h,T=R?.securePort||R?.https&&R.port,y=!R?.https&&R?.port;if("handleApplication"in p&&("start"in p||"startOnMainThread"in p||"handleFile"in p||"handleDirectory"in p||"setupFile"in p||"setupDirectory"in p))throw new Error(`Component ${m} has both 'handleComponent' and 'start' or 'startOnMainThread' methods. Please use only one of them.`);if(t.isWorker&&p.handleApplication){p.suppressHandleApplicationWarning!==!0&&pa.default.warn(`Plugin ${m} is using the experimental handleApplication API`);let N=new yy(m,e,l,t,Le);await _4(N,p);continue}if(MD.isMainThread&&(p=await p.startOnMainThread?.({server:Le,ensureTable:g,port:y,securePort:T,resources:t,...h})||p,n&&R))for(let N of[y,T])try{if(+N&&!h4.includes(N)){let O=BD.get(U.HTTP_SESSIONAFFINITY);O&&pa.default.warn("Session affinity is not recommended and may cause memory leaks"),(O||!aS)&&(h4.push(N),HD(N,O))}}catch(O){console.error("Error listening on socket",N,O,m)}if(t.isWorker&&(p=await p.start?.({server:Le,ensureTable:g,port:y,securePort:T,resources:t,...h})||p),xD.set(p,!0),(p.handleFile||p.handleDirectory||p.setupFile||p.setupDirectory)&&h.files!=null){let N=new Iy({config:h,name:m,directory:e,module:p,resources:t});d[m]=await f4(N)}}catch(g){g.message=`Could not load component '${m}' for application '${(0,Gr.basename)(e)}' due to: ${g.message}`,wy?.(g),((0,bE.getWorkerIndex)()===0?console:pa.default).error(g),t.set(h.path||"/",new el(g),null,!0),AE.set(n?m:(0,Gr.basename)(e),g.message)}}if(Oy=u,MD.isMainThread&&!p4&&i&&(0,bE.watchDir)(e,async()=>E4()),c.extensionModule||c.pluginModule){let m=await oS((0,Gr.join)(e,c.extensionModule||c.pluginModule));return Ny.set(a,m),m}let f=Object.values(d);if(f.length>0&&f.every(m=>!m)&&t.isWorker){let m=`${e} did not load any modules, resources, or files, is this a valid component?`;wy?.(new Error(m)),((0,bE.getWorkerIndex)()===0?console:pa.default).error(m),AE.set((0,Gr.basename)(e),m)}for(let[m,h]of Object.entries(d))h||pa.default.warn(`Component ${m} from (${(0,Gr.basename)(e)}) did not load any functionality.`)}catch(c){console.error(`Could not load application directory ${e}`,c),c.message=`Could not load application due to ${c.message}`,wy?.(c),t.set("",new el(c))}}var Ut,Gr,MD,vD,BD,FD,pa,bE,UD,Py,LD,xD,p4,DD,AE,Cbe,h4,Ny,wy,Oy,oy,lf=ce(()=>{Ut=require("node:fs"),Gr=require("node:path"),MD=require("node:worker_threads"),vD=require("yaml"),BD=w(oe()),FD=w(bt());k();hG();bG();FG();KG();YG();iq();Xj();s2();o2();pa=w(Q());p2();bE=w(nt());jN();Dr();Me();XR();UD=w(oe());O2();qT();x2();is();HJ();Py=w(wt());Ph();JA();a4();m4();tD();Bp();pD();LD=(0,Py.resolvePath)(BD.get(U.COMPONENTSROOT)),xD=new Map,AE=new Map;o(E4,"loadComponentDirectories");Cbe={REST:lS,rest:lS,graphql:GN,graphqlSchema:HN,roles:zN,jsResource:QN,fastifyRoutes:rL,login:XN,static:nL,operationsApi:cL,customFunctions:{},http:iy,clustering:hL,replication:Go,authentication:Ap,mqtt:cD,loadEnv:sL,logging:pa.default,dataLoader:aL},h4=[],Ny=new Map;o(Pbe,"setErrorReporter");oy=o(()=>Oy,"getComponentName");o(Lbe,"symlinkHarperModule");o(_4,"sequentiallyHandleApplication");o(Cy,"loadComponent")});var cy=M((ske,S4)=>{var{isMainThread:g4}=require("worker_threads"),{getTables:Dbe,getDatabases:rke,table:nke}=(Me(),v(Et)),{loadComponentDirectories:Mbe,loadComponent:vbe}=(lf(),v(Pp)),{resetResources:Ube}=(Fu(),v(hU)),xbe=FC(),Bbe=wt(),{dirname:Fbe}=require("path"),{getConnection:Hbe}=mr(),kbe=oe(),{CONFIG_PARAMS:Gbe}=(k(),v(W)),{loadCertificates:qbe}=as(),kD=new Map;async function $be(e=!1){!g4&&kbe.get(Gbe.CLUSTERING_ENABLED)&&Hbe();try{g4&&await xbe()}catch(n){console.error(n)}let t=Ube();Dbe(),t.isWorker=e,await qbe(),await vbe(Fbe(Bbe.getConfigFilePath()),t,"hdb",!0,kD),await Mbe(kD,t);let r=[];for(let[n]of kD)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}o($be,"loadRootComponents");S4.exports.loadRootComponents=$be});var nt=M((oke,Pi)=>{"use strict";LE();var{Worker:Vbe,MessageChannel:Kbe,parentPort:mo,isMainThread:KD,threadId:Ybe,workerData:ho}=require("worker_threads"),{PACKAGE_ROOT:Wbe}=bt(),{join:A4,isAbsolute:zbe,extname:jbe}=require("path"),{server:b4}=(Dr(),v($f)),{watch:Qbe,readdir:Jbe}=require("fs/promises"),{totalmem:T4}=require("os"),{setHeapSnapshotNearHeapLimit:Xbe}=require("v8"),wc=(k(),v(W)),My=oe(),Ci=Q(),{randomBytes:Zbe}=require("crypto"),{_assignPackageExport:eIe}=Xs(),R4=1024*1024,Oc=[],zs=[],tIe=50,YD=1e4,rIe="restart",I4="request_thread_info",N4="resource_report",w4="thread_info",O4="added-port",nIe="ack",GD;eIe("threads",zs);Pi.exports={startWorker:qD,restartWorkers:zD,shutdownWorkers:cIe,workers:Oc,setMonitorListener:EIe,onMessageFromWorkers:lIe,onMessageByType:U4,broadcast:dIe,broadcastWithAcknowledgement:mIe,setChildListenerByType:aIe,getWorkerIndex:C4,getWorkerCount:P4,getTicketKeys:D4,setMainIsWorker:iIe,setTerminateTimeout:sIe,restartNumber:ho?.restartNumber||1};zs.onMessageByType=U4;zs.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=zs.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};Pi.exports.whenThreadsStarted=new Promise(e=>{Pi.exports.threadsHaveStarted=e});My.get(wc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&Xbe(1);var WD;function sIe(e){YD=e}o(sIe,"setTerminateTimeout");function C4(){return ho?ho.workerIndex:WD?0:void 0}o(C4,"getWorkerIndex");function P4(){return ho?ho.workerCount:WD?1:void 0}o(P4,"getWorkerCount");function iIe(e){WD=e,Pi.exports.threadsHaveStarted()}o(iIe,"setMainIsWorker");var L4=1,Ly;function D4(){return Ly||(Ly=KD?Zbe(48):ho.ticketKeys,Ly)}o(D4,"getTicketKeys");Object.defineProperty(b4,"workerIndex",{get(){return C4()}});Object.defineProperty(b4,"workerCount",{get(){return P4()}});var M4={[I4](e,t){hIe(t)},[N4](e,t){pIe(t,e)}};function qD(e,t={}){let r=process.constrainedMemory?.()||T4();r=Math.min(r,T4(),2e4*R4);let n=My.get(wc.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/R4/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],a=[];for(let u of zs){let d=new Kbe;d.existingPort=u,i.push(d),a.push(d.port2)}jbe(e)||(e+=".js");let c=["--enable-source-maps","--expose-internals"];My.get(wc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&c.push("--heapsnapshot-near-heap-limit=1");let l=new Vbe(zbe(e)?e:A4(Wbe,e),{resourceLimits:{maxOldGenerationSizeMb:n,maxYoungGenerationSizeMb:s},execArgv:c,argv:process.argv.slice(2),workerData:{addPorts:a,addThreadIds:i.map(u=>u.existingPort.threadId),workerIndex:t.workerIndex,workerCount:L4=t.threadCount,name:t.name,restartNumber:Pi.exports.restartNumber,ticketKeys:D4()},transferList:a,...t});for(let{port1:u,existingPort:d}of i)d.postMessage({type:O4,port:u,threadId:l.threadId},[u]);return vy(l,!0),l.unexpectedRestarts=t.unexpectedRestarts||0,l.startCopy=()=>qD(e,t),l.on("error",u=>{Ci.error(`Worker index ${t.workerIndex} error:`,u)}),l.on("exit",u=>{Oc.splice(Oc.indexOf(l),1),!l.wasShutdown&&t.autoRestart!==!1&&(l.unexpectedRestarts<tIe?(t.unexpectedRestarts=l.unexpectedRestarts+1,qD(e,t)):Ci.error(`Thread has been restarted ${l.restarts} times and will not be restarted`))}),l.on("message",u=>{M4[u.type]?.(u,l)}),Oc.push(l),gIe(),t.onStarted&&t.onStarted(l),l.name=t.name,l}o(qD,"startWorker");var oIe=[wc.THREAD_TYPES.HTTP];async function zD(e=null,t=Math.max(L4>3,1),r=!0){if(KD){try{process.chdir(process.cwd())}catch(a){Ci.error("Unable to reestablish current working directory",a)}if(r){let{loadRootComponents:a}=cy();await a()}Pi.exports.restartNumber++,t<1&&(t=t*Oc.length);let n=[],s=[];for(let a of Oc.slice(0)){if(e&&a.name!==e||a.wasShutdown)continue;Ci.trace("sending shutdown request to ",a.threadId),a.postMessage({restartNumber:Pi.exports.restartNumber,type:wc.ITC_EVENT_TYPES.SHUTDOWN}),a.wasShutdown=!0,a.emit("shutdown",{});let c=oIe.indexOf(a.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{Ci.warn("Thread did not voluntarily terminate, terminating from the outside",a.threadId),a.terminate()},YD*2).unref();a.on("exit",()=>{clearTimeout(d),n.splice(n.indexOf(l)),!c&&r&&a.startCopy(),u()})});if(n.push(l),c&&r){let u=a.startCopy(),d=new Promise(f=>{let m=o(h=>{h.type===wc.ITC_EVENT_TYPES.CHILD_STARTED&&(Ci.trace("Worker has started",u.threadId),f(),s.splice(s.indexOf(d)),u.off("message",m))},"startListener");Ci.trace("Waiting for worker to start",u.threadId),u.on("message",m)});s.push(d),n.length>=t&&await Promise.race(n),s.length>=t&&await Promise.race(s)}}await Promise.all(n),await Promise.all(s);let{restartService:i}=sf();r&&(e==="http"||!e)&&My.get(wc.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else mo.postMessage({type:rIe,workerType:e})}o(zD,"restartWorkers");function aIe(e,t){M4[e]=t}o(aIe,"setChildListenerByType");function cIe(e){return zD(e,1/0,!1)}o(cIe,"shutdownWorkers");var v4=[];function lIe(e){v4.push(e)}o(lIe,"onMessageFromWorkers");var $D=new Map;function U4(e,t){let r=$D.get(e);r||$D.set(e,r=[]),r.push(t)}o(U4,"onMessageByType");var uIe=10;async function dIe(e,t){let r=0;for(let n of zs)try{n.postMessage(e),r++>uIe&&(r=0,await new Promise(setImmediate))}catch(s){Ci.error("Unable to send message to worker",s)}t&&B4(e,null)}o(dIe,"broadcast");var Dy=new Map,fIe=1;function mIe(e){return new Promise(t=>{let r=0;for(let n of zs)try{let s=fIe++,i=o(()=>{Dy.delete(s),--r===0&&t(),n!==mo&&--n.refCount===0&&n.unref()},"ackHandler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,Dy.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,a]of Dy)a.port===n&&a()})),n.postMessage(e),r++}catch(s){Ci.error("Unable to send message to worker",s)}r===0&&t()})}o(mIe,"broadcastWithAcknowledgement");function hIe(e){e.postMessage({type:w4,workers:x4()})}o(hIe,"sendThreadInfo");function x4(){let e=Date.now();return Oc.map(t=>({threadId:t.threadId,name:t.name,heapTotal:t.resources?.heapTotal,heapUsed:t.resources?.heapUsed,externalMemory:t.resources?.external,arrayBuffers:t.resources?.arrayBuffers,sinceLastUpdate:e-t.resources?.updated,...t.recentELU}))}o(x4,"getChildWorkerInfo");function pIe(e,t){e.resources=t,e.resources.updated=Date.now()}o(pIe,"recordResourceReport");var VD;function EIe(e){VD=e}o(EIe,"setMonitorListener");var _Ie=1e3,y4=!1;function gIe(){y4||(y4=!0,setInterval(()=>{for(let e of Oc){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}VD&&VD()},_Ie).unref())}o(gIe,"startMonitoring");var SIe=1e3;if(mo&&ho?.addPorts){vy(mo);for(let e=0,t=ho.addPorts.length;e<t;e++){let r=ho.addPorts[e];r.threadId=ho.addThreadIds[e],vy(r)}setInterval(()=>{let e=process.memoryUsage();mo.postMessage({type:N4,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},SIe).unref(),GD=o(()=>new Promise((e,t)=>{mo.on("message",r),mo.postMessage({type:I4});function r(n){n.type===w4&&(mo.off("message",r),e(n.workers))}o(r,"receiveThreadInfo")}),"getThreadInfo")}else GD=x4;Pi.exports.getThreadInfo=GD;function vy(e,t){zs.push(e),e.on("message",r=>{if(r.type===O4)r.port.threadId=r.threadId,vy(r.port);else if(r.type===nIe){let n=Dy.get(r.id);n&&n()}else B4(r,e)}).on("close",()=>{zs.splice(zs.indexOf(e),1)}).on("exit",()=>{zs.splice(zs.indexOf(e),1)}),t?e.refCount=100:e.unref()}o(vy,"addPort");function B4(e,t){for(let n of v4)n(e,t);let r=$D.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){Ci.error(s)}}o(B4,"notifyMessageListeners");if(KD){let e,t,r=new Set,n=o(async(s,i)=>{i&&(e=i);for(let a of await Jbe(s,{withFileTypes:!0}))a.isDirectory()&&a.name!=="node_modules"&&n(A4(s,a.name));try{for await(let{filename:a}of Qbe(s,{persistent:!1}))r.add(a),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await zD(),console.log("Reloaded HarperDB components, changed files:",Array.from(r)),r.clear()},100)}catch(a){console.warn("Error trying to watch component directory",s,a)}},"watchDir");Pi.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else mo.on("message",async e=>{let{type:t}=e;t===wc.ITC_EVENT_TYPES.SHUTDOWN&&(Pi.exports.restartNumber=e.restartNumber,mo.unref(),setTimeout(()=>{Ci.warn("Thread did not voluntarily terminate",Ybe),process.exit(0)},YD).unref())})});var VL={};we(VL,{startHTTPThreads:()=>RIe,startSocketServer:()=>HD,updateWorkerIdleness:()=>Y4});async function RIe(e=2,t){fN().catch(r=>Mf.error?.("Error recording hostname for analytics:",r));try{if(t)JD(0,1,!0);else{let{loadRootComponents:r}=cy();if(e===0)return(0,js.setMainIsWorker)(!0),await nD().startServers(),Promise.resolve([]);await r()}K4();for(let r=0;r<e;r++)JD(r,e);return Promise.all(V4)}finally{(0,js.threadsHaveStarted)()}}function K4(){let e=(0,G4.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),QD=setInterval(()=>{Mf.notify(e)},TIe).unref())}function JD(e,t=1,r){if(jD++,(0,js.startWorker)("server/threads/threadServer.js",{name:eA.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((a,c)=>{function l(u){u.type===Qy.CHILD_STARTED&&(n.removeListener("message",l),a(n))}o(l,"onMessage"),n.on("message",l),n.on("error",c)});V4.push(s),await s,Cf.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",a=>{if(a.requestId){let c=xy.get(a.requestId);c&&c(a)}}),n.on("exit",i),n.on("shutdown",i);function i(){let a=Cf.indexOf(n);a>-1&&Cf.splice(a,1)}if(o(i,"removeWorker"),Pf){let a=Pf;Pf=[];for(let c of a)$4[c.localPort](null,c)}}}),r){let n=setInterval(()=>{XD?XD=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,js.shutdownWorkers)(),jD=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function HD(e=0,t){if(typeof e=="string")try{(0,By.existsSync)(e)&&(0,By.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=yIe:r=AIe(t):r=ZD;let n=(0,Lf.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);return n._handle&&(n._handle.onconnection=$4[e]=function(s,i){r.readsData||(i.reading=!1,i.readStop()),XD=!0,r(i,(a,c)=>{if(!a){if(F4){let u=i._socket||new Lf.Socket({handle:i,writable:!0,readable:!0});F4.deliverSocket(u,e,c),u.resume()}else jD>0?(Pf.length===0&&setTimeout(()=>{Pf.length>0&&console.warn("Incoming sockets/requests have been queued for workers to start, and no workers have handled them. Check to make sure an error is not preventing workers from starting")},1e4).unref(),i.localPort=e,Pf.push(i)):(console.log("start up a dynamic thread to handle request"),JD(0));it(!1,"socket-routed");return}a.requests++;let l=i.fd;if(l>=0)a.postMessage({port:e,fd:l,data:c});else{let u=i._socket||new Lf.Socket({handle:i,writable:!0,readable:!0});NIe(u,a,e)}it(!0,"socket-routed")})},Mf.info(`HarperDB ${q4.packageJson.version} Server running on port ${e}`)),n.on("error",s=>{console.error("Error in socket server",s)}),process.env._UNREF_SERVER&&n.unref(),n}function ZD(e,t){let r,n=0;for(let s of Cf){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=Uy)return Uy=i,t(r);n=i}Uy=0,t(r)}function yIe(e,t){let r={};e.getpeername(r);let n=r.address,s=Df.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);ZD(e,a=>{Df.set(n,{worker:a,lastUsed:i}),t(a)})}function AIe(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new Lf.Socket({handle:n,readable:!0,writable:!0});n._socket=i,i.on("data",a=>{n.readStop();let l=a.toString("latin1").match(t)?.[1],u=Df.get(l),d=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=d,s(u.worker);ZD(n,f=>{Df.set(l,{worker:f,lastUsed:d}),s(f,a)})})}o(r,"findByHeaderAffinity")}function Y4(){Uy=0;for(let e of Cf)e.expectedIdle=e.recentELU.idle+bIe,e.requests=1;Cf.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function NIe(e,t,r){let n=IIe++;t.postMessage({port:r,requestId:n,event:"connection"}),e.on("data",s=>{let i=s.toString("latin1");t.postMessage({port:r,requestId:n,data:i,event:"data"})}).on("close",s=>{t.postMessage({port:r,requestId:n,event:"close",hadError:s})}).on("error",s=>{t.postMessage({port:r,requestId:n,event:"error",error:s})}).on("drain",s=>{t.postMessage({port:r,requestId:n,event:"drain",error:s})}).on("end",()=>{t.postMessage({port:r,requestId:n,event:"end"})}).resume(),xy.set(n,s=>{s.event=="data"&&e.write(Buffer.from(s.data,"latin1")),s.event=="end"&&(e.end(s.data&&Buffer.from(s.data,"latin1")),xy.delete(n)),s.event=="destroy"&&(e.destroy(),xy.delete(n))})}var js,Lf,Mf,By,k4,G4,q4,Cf,Pf,$4,F4,jD,V4,QD,TIe,XD,Uy,H4,Df,bIe,xy,IIe,XR=ce(()=>{js=w(nt()),Lf=require("net");k();Mf=w(Q()),By=require("fs");Wi();k4=require("worker_threads"),G4=w(Jd()),q4=w(bt()),Cf=[],Pf=[],$4=[],jD=0,V4=[];k4.isMainThread&&(process.on("uncaughtException",e=>{e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,js.onMessageFromWorkers)(e=>{e.type===Zy.RESTART&&QD&&(clearInterval(QD),K4())}));TIe=6e5;o(RIe,"startHTTPThreads");o(K4,"licenseWarning");o(JD,"startHTTPWorker");o(HD,"startSocketServer");Uy=0;o(ZD,"findMostIdleWorker");H4=36e5,Df=new Map;o(yIe,"findByRemoteAddressAffinity");o(AIe,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of Df)r.lastUsed+H4<e&&Df.delete(t)},H4).unref();bIe=1e3;o(Y4,"updateWorkerIdleness");(0,js.setMonitorListener)(Y4);xy=new Map,IIe=1;o(NIe,"proxySocket")});LE();var{startHTTPThreads:wIe,startSocketServer:W4}=(XR(),v(VL));wIe(0,!0);W4(9925);W4(9926);